valtech-components 4.0.980 → 4.0.982
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/esm2022/lib/components/atoms/avatar/avatar.component.mjs +3 -3
- package/esm2022/lib/components/atoms/box/box.component.mjs +3 -3
- package/esm2022/lib/components/atoms/button/button.component.mjs +3 -3
- package/esm2022/lib/components/atoms/display/display.component.mjs +3 -3
- package/esm2022/lib/components/atoms/divider/divider.component.mjs +3 -3
- package/esm2022/lib/components/atoms/emoji-rating/emoji-rating.component.mjs +89 -0
- package/esm2022/lib/components/atoms/emoji-rating/types.mjs +11 -0
- package/esm2022/lib/components/atoms/href/href.component.mjs +3 -3
- package/esm2022/lib/components/atoms/icon/icon.component.mjs +3 -3
- package/esm2022/lib/components/atoms/image/image.component.mjs +3 -3
- package/esm2022/lib/components/atoms/progress-bar/progress-bar.component.mjs +3 -3
- package/esm2022/lib/components/atoms/qr-code/qr-code.component.mjs +3 -3
- package/esm2022/lib/components/atoms/text/text.component.mjs +3 -3
- package/esm2022/lib/components/atoms/title/title.component.mjs +3 -3
- package/esm2022/lib/components/molecules/alert-box/alert-box.component.mjs +3 -3
- package/esm2022/lib/components/molecules/button-group/button-group.component.mjs +3 -3
- package/esm2022/lib/components/molecules/card/card.component.mjs +3 -3
- package/esm2022/lib/components/molecules/chip-group/chip-group.component.mjs +3 -3
- package/esm2022/lib/components/molecules/code-display/code-display.component.mjs +3 -3
- package/esm2022/lib/components/molecules/command-display/command-display.component.mjs +3 -3
- package/esm2022/lib/components/molecules/comment/comment.component.mjs +3 -3
- package/esm2022/lib/components/molecules/content-loader/content-loader.component.mjs +3 -3
- package/esm2022/lib/components/molecules/date-input/date-input.component.mjs +3 -3
- package/esm2022/lib/components/molecules/file-input/file-input.component.mjs +3 -3
- package/esm2022/lib/components/molecules/glow-card/glow-card.component.mjs +3 -3
- package/esm2022/lib/components/molecules/hint/hint.component.mjs +3 -3
- package/esm2022/lib/components/molecules/layered-card/layered-card.component.mjs +3 -3
- package/esm2022/lib/components/molecules/link/link.component.mjs +3 -3
- package/esm2022/lib/components/molecules/links-cake/links-cake.component.mjs +3 -3
- package/esm2022/lib/components/molecules/notes-box/notes-box.component.mjs +3 -3
- package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +3 -3
- package/esm2022/lib/components/molecules/pill/pill.component.mjs +3 -3
- package/esm2022/lib/components/molecules/pin-input/pin-input.component.mjs +3 -3
- package/esm2022/lib/components/molecules/popover-selector/popover-selector.component.mjs +3 -3
- package/esm2022/lib/components/molecules/progress-status/progress-status.component.mjs +3 -3
- package/esm2022/lib/components/molecules/prompter/prompter.component.mjs +3 -3
- package/esm2022/lib/components/molecules/rating/rating.component.mjs +3 -3
- package/esm2022/lib/components/molecules/searchbar/searchbar.component.mjs +3 -3
- package/esm2022/lib/components/molecules/select-input/select-input.component.mjs +3 -3
- package/esm2022/lib/components/molecules/stepper/stepper.component.mjs +3 -3
- package/esm2022/lib/components/molecules/text-input/text-input.component.mjs +3 -3
- package/esm2022/lib/components/molecules/title-block/title-block.component.mjs +3 -3
- package/esm2022/lib/components/organisms/article/article.component.mjs +3 -3
- package/esm2022/lib/components/organisms/banner/banner.component.mjs +3 -3
- package/esm2022/lib/components/organisms/code-validator/code-validator.component.mjs +55 -53
- package/esm2022/lib/components/organisms/comment-section/comment-section.component.mjs +3 -3
- package/esm2022/lib/components/organisms/data-table/data-table.component.mjs +3 -3
- package/esm2022/lib/components/organisms/form/form.component.mjs +3 -3
- package/esm2022/lib/components/organisms/header/header.component.mjs +3 -3
- package/esm2022/lib/components/organisms/item-list/item-list.component.mjs +3 -3
- package/esm2022/lib/components/organisms/no-content/no-content.component.mjs +3 -3
- package/esm2022/lib/components/organisms/survey-builder/survey-builder.component.mjs +339 -0
- package/esm2022/lib/components/organisms/survey-builder/survey-builder.i18n.mjs +39 -0
- package/esm2022/lib/components/organisms/survey-builder/types.mjs +2 -0
- package/esm2022/lib/components/organisms/survey-response/survey-response.component.mjs +325 -0
- package/esm2022/lib/components/organisms/survey-response/survey-response.i18n.mjs +39 -0
- package/esm2022/lib/components/organisms/survey-response/types.mjs +2 -0
- package/esm2022/lib/components/organisms/toolbar/toolbar.component.mjs +3 -3
- package/esm2022/lib/components/organisms/wizard/wizard.component.mjs +3 -3
- package/esm2022/lib/components/templates/simple/simple.component.mjs +3 -3
- package/esm2022/lib/services/qr-generator/types.mjs +12 -1
- package/esm2022/lib/services/requests/request.service.mjs +19 -2
- package/esm2022/lib/services/requests/types.mjs +8 -1
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +7 -1
- package/fesm2022/valtech-components.mjs +1228 -386
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/emoji-rating/emoji-rating.component.d.ts +25 -0
- package/lib/components/atoms/emoji-rating/types.d.ts +22 -0
- package/lib/components/organisms/code-validator/code-validator.component.d.ts +8 -1
- package/lib/components/organisms/survey-builder/survey-builder.component.d.ts +43 -0
- package/lib/components/organisms/survey-builder/survey-builder.i18n.d.ts +2 -0
- package/lib/components/organisms/survey-builder/types.d.ts +28 -0
- package/lib/components/organisms/survey-response/survey-response.component.d.ts +68 -0
- package/lib/components/organisms/survey-response/survey-response.i18n.d.ts +2 -0
- package/lib/components/organisms/survey-response/types.d.ts +7 -0
- package/lib/services/qr-generator/types.d.ts +11 -0
- package/lib/services/requests/request.service.d.ts +7 -0
- package/lib/services/requests/types.d.ts +34 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +6 -0
- package/src/lib/components/styles/variables.scss +15 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { EmojiRatingMetadata } from './types';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* val-emoji-rating
|
|
5
|
+
*
|
|
6
|
+
* Escala corta de calificación con emoji (3-5 caras) — el tipo de pregunta
|
|
7
|
+
* `EMOJI_RATING` de `services/forms` (ADR-092). Existe como widget propio
|
|
8
|
+
* porque este tipo NO pasa por el `val-form` genérico: un `FieldSchemaDef`
|
|
9
|
+
* con un `type` que `FormSchemaBuilderService.parseInputType` no reconoce cae
|
|
10
|
+
* a texto plano en silencio, que sería incorrecto para una calificación.
|
|
11
|
+
*
|
|
12
|
+
* Radio-like: una sola cara seleccionada a la vez. El valor que guarda es
|
|
13
|
+
* `face.value` (ej. "1".."5"), no el emoji — es lo que
|
|
14
|
+
* `AggregateResponsesByType` cuenta en el dashboard.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* <val-emoji-rating [props]="{ control: ratingControl, label: '¿Cómo calificarías la experiencia?' }" />
|
|
18
|
+
*/
|
|
19
|
+
export declare class EmojiRatingComponent {
|
|
20
|
+
props: EmojiRatingMetadata;
|
|
21
|
+
get faces(): import("./types").EmojiRatingFace[];
|
|
22
|
+
select(value: string): void;
|
|
23
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EmojiRatingComponent, never>;
|
|
24
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<EmojiRatingComponent, "val-emoji-rating", never, { "props": { "alias": "props"; "required": false; }; }, {}, never, never, true, never>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { FormControl } from '@angular/forms';
|
|
2
|
+
/** Una cara de la escala. `value` es lo que se guarda (y lo que se agrega en
|
|
3
|
+
* el dashboard, `services/request.AggregateResponsesByType` cuenta por este
|
|
4
|
+
* string exacto) — el emoji es solo presentación. */
|
|
5
|
+
export interface EmojiRatingFace {
|
|
6
|
+
value: string;
|
|
7
|
+
emoji: string;
|
|
8
|
+
/** Para lectores de pantalla. Sin esto, un emoji suelto no dice nada. */
|
|
9
|
+
ariaLabel: string;
|
|
10
|
+
}
|
|
11
|
+
/** Escala 1-5 por defecto: de "muy mal" a "muy bien". Los textos van en
|
|
12
|
+
* español porque son el fallback — cualquier consumer con soporte i18n pasa
|
|
13
|
+
* su propio `faces` con `ariaLabel` traducido. */
|
|
14
|
+
export declare const DEFAULT_EMOJI_RATING_FACES: EmojiRatingFace[];
|
|
15
|
+
export interface EmojiRatingMetadata {
|
|
16
|
+
control: FormControl<string | null>;
|
|
17
|
+
/** Texto de la pregunta. El componente no trae i18n propio — texto ya resuelto. */
|
|
18
|
+
label?: string;
|
|
19
|
+
hint?: string;
|
|
20
|
+
faces?: EmojiRatingFace[];
|
|
21
|
+
size?: 'default' | 'small';
|
|
22
|
+
}
|
|
@@ -30,6 +30,13 @@ export declare class CodeValidatorComponent {
|
|
|
30
30
|
* La regla del producto. Sin esto el componente no valida nada: lee y avisa.
|
|
31
31
|
*/
|
|
32
32
|
validate?: ValidateFn;
|
|
33
|
+
/**
|
|
34
|
+
* Se emite apenas se lee un código, ANTES de invocar `validate`. Sirve para
|
|
35
|
+
* lo que no depende del resultado: analítica de intento de escaneo, o que
|
|
36
|
+
* el producto decida su propia estrategia de reintento alrededor de
|
|
37
|
+
* `validate` sin que el componente sepa de HTTP.
|
|
38
|
+
*/
|
|
39
|
+
scanned: EventEmitter<string>;
|
|
33
40
|
validated: EventEmitter<ValidationEntry>;
|
|
34
41
|
closed: EventEmitter<void>;
|
|
35
42
|
/**
|
|
@@ -113,5 +120,5 @@ export declare class CodeValidatorComponent {
|
|
|
113
120
|
private announce;
|
|
114
121
|
private clearTimer;
|
|
115
122
|
static ɵfac: i0.ɵɵFactoryDeclaration<CodeValidatorComponent, never>;
|
|
116
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<CodeValidatorComponent, "val-code-validator", never, { "props": { "alias": "props"; "required": false; }; "validate": { "alias": "validate"; "required": false; }; "_modalRef": { "alias": "_modalRef"; "required": false; }; }, { "validated": "validated"; "closed": "closed"; }, never, never, true, never>;
|
|
123
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<CodeValidatorComponent, "val-code-validator", never, { "props": { "alias": "props"; "required": false; }; "validate": { "alias": "validate"; "required": false; }; "_modalRef": { "alias": "_modalRef"; "required": false; }; }, { "scanned": "scanned"; "validated": "validated"; "closed": "closed"; }, never, never, true, never>;
|
|
117
124
|
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { EventEmitter, OnInit } from '@angular/core';
|
|
2
|
+
import { FormControl } from '@angular/forms';
|
|
3
|
+
import { SurveyBuilderMetadata, SurveyBuilderSaveEvent, SurveyQuestionRow } from './types';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* val-survey-builder
|
|
7
|
+
*
|
|
8
|
+
* Autoría de una encuesta: título, subtítulo, preguntas — arma o actualiza un
|
|
9
|
+
* `RequestTypeConfig` con `Type: "<prefix>:<slug>"` (ADR-092), `skipReview:
|
|
10
|
+
* true` (cada respuesta se agrega, no se revisa una por una) y el `EntityRef`
|
|
11
|
+
* que le pasa el consumer (ej. el evento de bingo dueño de la encuesta).
|
|
12
|
+
*
|
|
13
|
+
* v1 solo ofrece los dos tipos de pregunta que `val-survey-response` sabe
|
|
14
|
+
* renderizar: emoji-rating y texto libre. Reusa `RequestFormBuilderService`
|
|
15
|
+
* (`toToken`/`uniqueFieldName`/`createFieldSchema`) para el nombre de campo —
|
|
16
|
+
* es la misma primitiva que ya arma el formulario dinámico de `request`, no
|
|
17
|
+
* una reimplementación.
|
|
18
|
+
*/
|
|
19
|
+
export declare class SurveyBuilderComponent implements OnInit {
|
|
20
|
+
props: SurveyBuilderMetadata;
|
|
21
|
+
readonly saved: EventEmitter<SurveyBuilderSaveEvent>;
|
|
22
|
+
private readonly i18n;
|
|
23
|
+
private readonly requests;
|
|
24
|
+
private readonly formBuilder;
|
|
25
|
+
private readonly errors;
|
|
26
|
+
readonly emojiType = "EMOJI_RATING";
|
|
27
|
+
readonly titleControl: FormControl<string>;
|
|
28
|
+
readonly subtitleControl: FormControl<string>;
|
|
29
|
+
readonly questions: import("@angular/core").WritableSignal<SurveyQuestionRow[]>;
|
|
30
|
+
readonly saving: import("@angular/core").WritableSignal<boolean>;
|
|
31
|
+
private readonly rowControls;
|
|
32
|
+
constructor();
|
|
33
|
+
ngOnInit(): Promise<void>;
|
|
34
|
+
private rowFromField;
|
|
35
|
+
rowLabelControl(row: SurveyQuestionRow): FormControl<string>;
|
|
36
|
+
addQuestion(): void;
|
|
37
|
+
removeQuestion(row: SurveyQuestionRow): void;
|
|
38
|
+
setType(row: SurveyQuestionRow, type: SurveyQuestionRow['type']): void;
|
|
39
|
+
save(): Promise<void>;
|
|
40
|
+
t(key: string): string;
|
|
41
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SurveyBuilderComponent, never>;
|
|
42
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SurveyBuilderComponent, "val-survey-builder", never, { "props": { "alias": "props"; "required": false; }; }, { "saved": "saved"; }, never, never, true, never>;
|
|
43
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { EntityRef, RequestTypeConfig, RequestVisibility } from '../../../services/requests/types';
|
|
2
|
+
/**
|
|
3
|
+
* Una pregunta en construcción — antes de convertirse en `FieldSchemaDef`.
|
|
4
|
+
* v1 solo soporta estos dos tipos (ADR-092) — el mismo par que sabe
|
|
5
|
+
* renderizar `val-survey-response`. Ampliar acá implica ampliar también el
|
|
6
|
+
* renderer de respuesta, no es un cambio de un solo lado.
|
|
7
|
+
*/
|
|
8
|
+
export interface SurveyQuestionRow {
|
|
9
|
+
/** Id local, solo para `track` en el template — no viaja al backend. */
|
|
10
|
+
id: string;
|
|
11
|
+
label: string;
|
|
12
|
+
type: 'TEXTAREA' | 'EMOJI_RATING';
|
|
13
|
+
required: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface SurveyBuilderMetadata {
|
|
16
|
+
/** Si se pasa, edita ese tipo existente; si no, crea uno nuevo. */
|
|
17
|
+
typeId?: string;
|
|
18
|
+
/** Prefijo del `Type` del RequestTypeConfig — el componente arma `"<prefix>:<slug>"`. */
|
|
19
|
+
typePrefix?: string;
|
|
20
|
+
entityRef?: EntityRef;
|
|
21
|
+
/** Default 'PUBLIC' — el caso más común: link enviado a gente sin cuenta. */
|
|
22
|
+
visibility?: RequestVisibility;
|
|
23
|
+
/** Default true. */
|
|
24
|
+
allowAnonymous?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface SurveyBuilderSaveEvent {
|
|
27
|
+
typeConfig: RequestTypeConfig;
|
|
28
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { EventEmitter, OnInit } from '@angular/core';
|
|
2
|
+
import { FormControl } from '@angular/forms';
|
|
3
|
+
import { RequestTypeConfig } from '../../../services/requests/types';
|
|
4
|
+
import { EmptyStateMetadata } from '../../molecules/empty-state/types';
|
|
5
|
+
import { SurveyResponseMetadata, SurveyResponseSubmitEvent } from './types';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
/**
|
|
8
|
+
* val-survey-response
|
|
9
|
+
*
|
|
10
|
+
* Toma una encuesta (`RequestTypeConfig` con `Type: "survey:<slug>"`, ADR-092)
|
|
11
|
+
* y la presenta como formulario de respuesta — el organism que un visitante
|
|
12
|
+
* ve al abrir el link de una encuesta. Self-contained, igual que
|
|
13
|
+
* `val-content-reaction`/`val-access-request-view`: lee el tipo, arma el
|
|
14
|
+
* formulario, envía la respuesta, sin que el consumer tenga que orquestar
|
|
15
|
+
* nada de eso.
|
|
16
|
+
*
|
|
17
|
+
* Solo lee tipos `visibility: 'PUBLIC'` (vía `getPublicRequestType`, sin
|
|
18
|
+
* auth) — es el caso de uso que describe el ADR (link enviado a compradores,
|
|
19
|
+
* que pueden no tener cuenta). Encuestas AUTHENTICATED/ORG/INTERNAL están
|
|
20
|
+
* fuera de alcance de este componente por ahora.
|
|
21
|
+
*
|
|
22
|
+
* Cada pregunta se renderiza según su `FieldSchemaDef.type`: `EMOJI_RATING`
|
|
23
|
+
* usa `val-emoji-rating` (NUNCA pasa por `val-form`, no lo sabe rutear);
|
|
24
|
+
* cualquier otro tipo (v1: solo `TEXTAREA`) usa `val-textarea-input`. No hay
|
|
25
|
+
* `val-form` de por medio — un FormGroup armado a mano, porque mezclar tipos
|
|
26
|
+
* custom con el form genérico es más complicado que construir el propio.
|
|
27
|
+
*/
|
|
28
|
+
export declare class SurveyResponseComponent implements OnInit {
|
|
29
|
+
props: SurveyResponseMetadata;
|
|
30
|
+
readonly submitted: EventEmitter<SurveyResponseSubmitEvent>;
|
|
31
|
+
private readonly i18n;
|
|
32
|
+
private readonly auth;
|
|
33
|
+
private readonly requests;
|
|
34
|
+
private readonly errors;
|
|
35
|
+
readonly emojiType = "EMOJI_RATING";
|
|
36
|
+
readonly loading: import("@angular/core").WritableSignal<boolean>;
|
|
37
|
+
readonly loadError: import("@angular/core").WritableSignal<boolean>;
|
|
38
|
+
readonly sent: import("@angular/core").WritableSignal<boolean>;
|
|
39
|
+
readonly sending: import("@angular/core").WritableSignal<boolean>;
|
|
40
|
+
readonly typeConfig: import("@angular/core").WritableSignal<RequestTypeConfig>;
|
|
41
|
+
readonly nameControl: FormControl<string>;
|
|
42
|
+
readonly emailControl: FormControl<string>;
|
|
43
|
+
private form;
|
|
44
|
+
constructor();
|
|
45
|
+
ngOnInit(): Promise<void>;
|
|
46
|
+
private buildForm;
|
|
47
|
+
/** Preguntas ordenadas — el template las recorre en este orden. */
|
|
48
|
+
readonly questions: import("@angular/core").Signal<import("valtech-components").FieldSchemaDef[]>;
|
|
49
|
+
questionControl(name: string): FormControl;
|
|
50
|
+
questionLabel(q: {
|
|
51
|
+
label?: string;
|
|
52
|
+
labelKey?: string;
|
|
53
|
+
name: string;
|
|
54
|
+
}): string;
|
|
55
|
+
/** Puede responder sin sesión si el tipo lo permite; si no, hace falta login. */
|
|
56
|
+
readonly canRespond: import("@angular/core").Signal<boolean>;
|
|
57
|
+
/** Pide nombre+correo solo cuando responde sin sesión — el backend exige
|
|
58
|
+
* identidad mínima incluso en el camino anónimo (`CreateAnonymousRequest`). */
|
|
59
|
+
needsIdentity(): boolean;
|
|
60
|
+
readonly submitState: import("@angular/core").Signal<"ENABLED" | "WORKING">;
|
|
61
|
+
submit(): Promise<void>;
|
|
62
|
+
readonly sentState: import("@angular/core").Signal<EmptyStateMetadata>;
|
|
63
|
+
readonly loadErrorState: import("@angular/core").Signal<EmptyStateMetadata>;
|
|
64
|
+
readonly loginRequiredState: import("@angular/core").Signal<EmptyStateMetadata>;
|
|
65
|
+
t(key: string): string;
|
|
66
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SurveyResponseComponent, never>;
|
|
67
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SurveyResponseComponent, "val-survey-response", never, { "props": { "alias": "props"; "required": false; }; }, { "submitted": "submitted"; }, never, never, true, never>;
|
|
68
|
+
}
|
|
@@ -137,5 +137,16 @@ export interface QrPreset {
|
|
|
137
137
|
}
|
|
138
138
|
/**
|
|
139
139
|
* Default presets for quick styling.
|
|
140
|
+
*
|
|
141
|
+
* ⚠️ 'rounded' / 'dots' / 'classy' / 'modern' usan cornersSquareStyle/
|
|
142
|
+
* cornersDotStyle NO cuadrados. Los patrones de posición (las 3 esquinas)
|
|
143
|
+
* necesitan la proporción 1:1:3:1:1 en cuadrado para que un lector los
|
|
144
|
+
* ubique — redondearlos se ve prolijo pero puede romper la detección en un
|
|
145
|
+
* decode estático (foto ya tomada, sin los múltiples frames de una cámara
|
|
146
|
+
* en vivo). Bug real: 'ticket-friendly' tenía este mismo problema hasta el
|
|
147
|
+
* 2026-08-28 (ver su comentario abajo). Si un preset de estos se va a usar
|
|
148
|
+
* para un QR que alguien va a re-escanear desde una foto/descarga (no solo
|
|
149
|
+
* mostrar en pantalla o imprimir grande para escaneo directo), forzar
|
|
150
|
+
* cornersSquareStyle/cornersDotStyle a 'square' — no usarlo tal cual.
|
|
140
151
|
*/
|
|
141
152
|
export declare const QR_PRESETS: Record<string, Partial<QrConfig>>;
|
|
@@ -51,6 +51,13 @@ export declare class RequestService {
|
|
|
51
51
|
watchComments(appId: string, orgId: string, requestId: string): Observable<RequestComment[]>;
|
|
52
52
|
listRequestTypes(): Observable<ListRequestTypesResponse>;
|
|
53
53
|
getRequestType(typeId: string): Observable<RequestTypeConfig>;
|
|
54
|
+
/**
|
|
55
|
+
* Lee un tipo de solicitud SIN requerir sesión — la vía para que un
|
|
56
|
+
* visitante anónimo con un link a una encuesta PUBLIC pueda renderizar el
|
|
57
|
+
* formulario antes de responder. El backend rechaza cualquier tipo que no
|
|
58
|
+
* sea `visibility: 'PUBLIC'` (mismo código que "no existe"). Ver ADR-092.
|
|
59
|
+
*/
|
|
60
|
+
getPublicRequestType(typeId: string): Observable<RequestTypeConfig>;
|
|
54
61
|
createRequestType(payload: CreateRequestTypePayload): Observable<RequestTypeConfig>;
|
|
55
62
|
updateRequestType(typeId: string, payload: UpdateRequestTypePayload): Observable<RequestTypeConfig>;
|
|
56
63
|
deleteRequestType(typeId: string): Observable<void>;
|
|
@@ -19,6 +19,8 @@ export interface AppRequest {
|
|
|
19
19
|
priority?: string;
|
|
20
20
|
submitter: RequestActor;
|
|
21
21
|
assignee?: RequestActor;
|
|
22
|
+
/** Copiado del RequestTypeConfig al crear — no lo manda quien responde. */
|
|
23
|
+
entityRef?: EntityRef;
|
|
22
24
|
dueAt?: string;
|
|
23
25
|
createdAt: string;
|
|
24
26
|
updatedAt: string;
|
|
@@ -33,6 +35,23 @@ export interface RequestComment {
|
|
|
33
35
|
}
|
|
34
36
|
export type FieldOption = FormFieldOption;
|
|
35
37
|
export type FieldSchemaDef = FormFieldSchemaDef;
|
|
38
|
+
/**
|
|
39
|
+
* Tipo de pregunta de escala corta con emoji (3-5 caras). NO es uno de los
|
|
40
|
+
* tipos que `FormSchemaBuilderService.buildForm` sabe rutear a `val-form` —
|
|
41
|
+
* un tipo sin mapeo cae a texto plano ahí. Renderizarlo requiere el widget
|
|
42
|
+
* dedicado `val-emoji-rating`, nunca el form genérico. Ver ADR-092.
|
|
43
|
+
*/
|
|
44
|
+
export declare const FIELD_TYPE_EMOJI_RATING = "EMOJI_RATING";
|
|
45
|
+
/** Identifica la entidad de dominio a la que pertenece un tipo de solicitud
|
|
46
|
+
* (un evento, una adopción, una receta). Opcional — la mayoría de los tipos
|
|
47
|
+
* (tickets de soporte, postulaciones) no la necesitan porque el tipo YA es la
|
|
48
|
+
* entidad. Mismo shape que el `EntityRef` de feedback/chat — no se importa
|
|
49
|
+
* ninguno de esos paquetes para esto: es un struct de 2 campos, replicarlo es
|
|
50
|
+
* más barato que acoplar dominios de negocio por un tipo trivial. */
|
|
51
|
+
export interface EntityRef {
|
|
52
|
+
entityType: string;
|
|
53
|
+
entityId: string;
|
|
54
|
+
}
|
|
36
55
|
/** Quién puede leer un tipo de solicitud (y sus solicitudes públicas). */
|
|
37
56
|
export type RequestVisibility = 'PUBLIC' | 'AUTHENTICATED' | 'ORG' | 'INTERNAL';
|
|
38
57
|
export interface RequestTypeConfig {
|
|
@@ -41,6 +60,15 @@ export interface RequestTypeConfig {
|
|
|
41
60
|
orgId: string;
|
|
42
61
|
/** Nombre del tipo, escrito por la organización: no se traduce. */
|
|
43
62
|
label: string;
|
|
63
|
+
/** Bajada del enunciado (ej. encuestas). Label ya cubre el título. */
|
|
64
|
+
subtitle?: string;
|
|
65
|
+
entityRef?: EntityRef;
|
|
66
|
+
/**
|
|
67
|
+
* true = cada envío se agrega, no se revisa uno por uno (ej. encuestas).
|
|
68
|
+
* false/undefined (default) = comportamiento histórico: se revisa cada
|
|
69
|
+
* solicitud (Chesed adopciones, Okhelia recetas).
|
|
70
|
+
*/
|
|
71
|
+
skipReview?: boolean;
|
|
44
72
|
fieldSchema: FieldSchemaDef[];
|
|
45
73
|
allowAnonymous: boolean;
|
|
46
74
|
/**
|
|
@@ -99,6 +127,9 @@ export interface CreateRequestTypePayload {
|
|
|
99
127
|
typeId?: string;
|
|
100
128
|
/** Nombre del tipo, escrito por la organización: no se traduce. */
|
|
101
129
|
label: string;
|
|
130
|
+
subtitle?: string;
|
|
131
|
+
entityRef?: EntityRef;
|
|
132
|
+
skipReview?: boolean;
|
|
102
133
|
fieldSchema: FieldSchemaDef[];
|
|
103
134
|
allowAnonymous: boolean;
|
|
104
135
|
visibility?: RequestVisibility;
|
|
@@ -106,6 +137,9 @@ export interface CreateRequestTypePayload {
|
|
|
106
137
|
export interface UpdateRequestTypePayload {
|
|
107
138
|
/** Nombre del tipo, escrito por la organización: no se traduce. */
|
|
108
139
|
label: string;
|
|
140
|
+
subtitle?: string;
|
|
141
|
+
entityRef?: EntityRef;
|
|
142
|
+
skipReview?: boolean;
|
|
109
143
|
fieldSchema: FieldSchemaDef[];
|
|
110
144
|
allowAnonymous: boolean;
|
|
111
145
|
visibility?: RequestVisibility;
|
package/lib/version.d.ts
CHANGED
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -20,6 +20,8 @@ export * from './lib/components/atoms/display/display.component';
|
|
|
20
20
|
export * from './lib/components/atoms/display/types';
|
|
21
21
|
export * from './lib/components/atoms/divider/divider.component';
|
|
22
22
|
export * from './lib/components/atoms/divider/types';
|
|
23
|
+
export * from './lib/components/atoms/emoji-rating/emoji-rating.component';
|
|
24
|
+
export * from './lib/components/atoms/emoji-rating/types';
|
|
23
25
|
export * from './lib/components/atoms/href/href.component';
|
|
24
26
|
export * from './lib/components/atoms/href/types';
|
|
25
27
|
export * from './lib/components/atoms/icon/icon.component';
|
|
@@ -236,6 +238,10 @@ export * from './lib/components/molecules/linked-providers/linked-providers.comp
|
|
|
236
238
|
export * from './lib/components/molecules/linked-providers/types';
|
|
237
239
|
export * from './lib/components/organisms/access-request-view/access-request-view.component';
|
|
238
240
|
export * from './lib/components/organisms/access-request-view/access-request-view.i18n';
|
|
241
|
+
export * from './lib/components/organisms/survey-response/survey-response.component';
|
|
242
|
+
export * from './lib/components/organisms/survey-response/types';
|
|
243
|
+
export * from './lib/components/organisms/survey-builder/survey-builder.component';
|
|
244
|
+
export * from './lib/components/organisms/survey-builder/types';
|
|
239
245
|
export * from './lib/components/molecules/empty-state/empty-state.component';
|
|
240
246
|
export * from './lib/components/molecules/empty-state/factory';
|
|
241
247
|
export * from './lib/components/molecules/empty-state/types';
|
|
@@ -104,6 +104,21 @@ $color-default-placeholder: #afbacc;
|
|
|
104
104
|
--val-container-aside: 0px;
|
|
105
105
|
--val-container-padding: 16px;
|
|
106
106
|
|
|
107
|
+
/* RADIO DE BORDE — nueva personalidad de marca (2026-08-28, pedido del CTO):
|
|
108
|
+
* bordes más redondos, más simpleza. Escala pública consumible desde apps
|
|
109
|
+
* y desde cualquier componente nuevo — usar var(--val-radius-*, fallback)
|
|
110
|
+
* en vez de un número suelto. Reemplaza gradualmente a $border-radius-*
|
|
111
|
+
* (SCSS, solo compile-time, casi sin uso real hoy — ver docs/frontend/
|
|
112
|
+
* design-personality.md). No se migró aún ningún componente existente a
|
|
113
|
+
* propósito: este commit solo establece el token.
|
|
114
|
+
*/
|
|
115
|
+
--val-radius-xs: 10px;
|
|
116
|
+
--val-radius-sm: 16px;
|
|
117
|
+
--val-radius-md: 20px;
|
|
118
|
+
--val-radius-lg: 28px;
|
|
119
|
+
--val-radius-xl: 36px;
|
|
120
|
+
--val-radius-full: 999px;
|
|
121
|
+
|
|
107
122
|
--ion-color-primary: #7026df;
|
|
108
123
|
--ion-color-primary-rgb: 112, 38, 223;
|
|
109
124
|
--ion-color-primary-contrast: #ffffff;
|