valtech-components 2.0.970 → 2.0.972

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.
Files changed (36) hide show
  1. package/esm2022/lib/components/molecules/date-input/date-input.component.mjs +3 -3
  2. package/esm2022/lib/components/molecules/file-input/file-input.component.mjs +3 -3
  3. package/esm2022/lib/components/molecules/hint/hint.component.mjs +3 -3
  4. package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +3 -3
  5. package/esm2022/lib/components/molecules/pin-input/pin-input.component.mjs +3 -3
  6. package/esm2022/lib/components/molecules/text-input/text-input.component.mjs +3 -3
  7. package/esm2022/lib/components/organisms/form/form.component.mjs +54 -12
  8. package/esm2022/lib/components/organisms/preferences-view/preferences-view.component.mjs +263 -0
  9. package/esm2022/lib/components/organisms/preferences-view/preferences-view.i18n.mjs +37 -0
  10. package/esm2022/lib/components/organisms/preferences-view/preferences.routes.mjs +29 -0
  11. package/esm2022/lib/components/organisms/preferences-view/types.mjs +2 -0
  12. package/esm2022/lib/components/organisms/profile-view/profile-view.component.mjs +601 -0
  13. package/esm2022/lib/components/organisms/profile-view/profile-view.i18n.mjs +75 -0
  14. package/esm2022/lib/components/organisms/profile-view/profile.routes.mjs +28 -0
  15. package/esm2022/lib/components/organisms/profile-view/types.mjs +2 -0
  16. package/esm2022/lib/components/types.mjs +1 -1
  17. package/esm2022/lib/version.mjs +2 -2
  18. package/esm2022/public-api.mjs +7 -2
  19. package/fesm2022/valtech-components.mjs +1351 -395
  20. package/fesm2022/valtech-components.mjs.map +1 -1
  21. package/lib/components/organisms/article/article.component.d.ts +4 -1
  22. package/lib/components/organisms/form/form.component.d.ts +23 -0
  23. package/lib/components/organisms/preferences-view/preferences-view.component.d.ts +53 -0
  24. package/lib/components/organisms/preferences-view/preferences-view.i18n.d.ts +12 -0
  25. package/lib/components/organisms/preferences-view/preferences.routes.d.ts +24 -0
  26. package/lib/components/organisms/preferences-view/types.d.ts +35 -0
  27. package/lib/components/organisms/profile-view/profile-view.component.d.ts +84 -0
  28. package/lib/components/organisms/profile-view/profile-view.i18n.d.ts +12 -0
  29. package/lib/components/organisms/profile-view/profile.routes.d.ts +23 -0
  30. package/lib/components/organisms/profile-view/types.d.ts +32 -0
  31. package/lib/components/types.d.ts +14 -0
  32. package/lib/version.d.ts +1 -1
  33. package/package.json +1 -1
  34. package/public-api.d.ts +6 -1
  35. package/esm2022/lib/components/organisms/form/form-footer/form-footer.component.mjs +0 -83
  36. package/lib/components/organisms/form/form-footer/form-footer.component.d.ts +0 -17
@@ -89,7 +89,10 @@ export declare class ArticleComponent implements OnInit {
89
89
  contentFallback?: string;
90
90
  contentInterpolation?: Record<string, string | number>;
91
91
  icon?: import("valtech-components").IconMetada;
92
- shape?: "round";
92
+ shape?: "round"; /**
93
+ * Configuración del artículo
94
+ * @type {ArticleMetadata}
95
+ */
93
96
  size?: "default" | "small" | "large";
94
97
  fill?: "default" | "clear" | "outline" | "solid";
95
98
  type: "reset" | "submit" | "button";
@@ -23,6 +23,18 @@ export declare class FormComponent implements OnInit, OnChanges, DoCheck {
23
23
  WORKING: "WORKING";
24
24
  ERROR: "ERROR";
25
25
  };
26
+ /**
27
+ * Valor actual del form (`form.getRawValue()`), actualizado en cada
28
+ * `valueChanges`. Pensado para el modo `controlled`: el host lo lee vía
29
+ * `@ViewChild(FormComponent)` sin tocar el FormGroup directo. En modo normal
30
+ * también está disponible.
31
+ */
32
+ readonly value: import("@angular/core").WritableSignal<Record<string, any>>;
33
+ /**
34
+ * Estado de validez del form, actualizado en cada `statusChanges`. Para que
35
+ * el host (wizard) habilite/deshabilite su botón "Siguiente".
36
+ */
37
+ readonly valid: import("@angular/core").WritableSignal<boolean>;
26
38
  private subscriptions;
27
39
  private actionsCache;
28
40
  private fieldPropMemo;
@@ -71,6 +83,17 @@ export declare class FormComponent implements OnInit, OnChanges, DoCheck {
71
83
  */
72
84
  getTextareaProp(field: InputMetadata): TextareaInputMetadata;
73
85
  get isAtEndOfForm(): boolean;
86
+ /**
87
+ * Fuerza mostrar los errores de validación (marca todos los controles como
88
+ * touched) y devuelve si el form es válido. Pensado para el modo `controlled`:
89
+ * el host lo invoca en su "Siguiente" para gatear la navegación del wizard.
90
+ */
91
+ validate(): boolean;
92
+ /**
93
+ * Marca todos los controles como touched (muestra errores) sin devolver nada.
94
+ * Alias semántico de la primera mitad de `validate()`.
95
+ */
96
+ markAllTouched(): void;
74
97
  get Form(): FormGroup;
75
98
  get FormState(): {
76
99
  form: FormGroup;
@@ -0,0 +1,53 @@
1
+ import { LanguageSelectorMetadata } from '../../molecules/language-selector/types';
2
+ import { SegmentControlMetadata } from '../../molecules/segment-control/types';
3
+ import { PreferencesViewConfig } from './types';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * `val-preferences-view` — vista de preferencias de UI cross-app (tema +
7
+ * idioma) full-feature autocontenida (organism). Promovida desde `showcase`
8
+ * bajo el proceso de ADR-021.
9
+ *
10
+ * Backend integration 100% en `PreferencesService`:
11
+ * - Read: listener Firestore reactivo (`prefs.theme()` / `prefs.language()`).
12
+ * - Write: `PUT /v2/auth/preferences` (`prefs.setTheme` / `prefs.setLanguage`).
13
+ * El cliente NUNCA escribe Firestore directo.
14
+ *
15
+ * NO renderiza ion-content — vive dentro de val-page-wrapper.
16
+ *
17
+ * Auto-registra sus defaults i18n (es/en) en el constructor si el consumer no
18
+ * proveyó el namespace configurado (default `Settings.General`).
19
+ */
20
+ export declare class PreferencesViewComponent {
21
+ private nav;
22
+ private prefs;
23
+ private i18n;
24
+ private errors;
25
+ private route;
26
+ /**
27
+ * Config vía @Input (object-first). Si no se pasa, se cae al route data
28
+ * `preferencesConfig` (poblado por `provideValtechPreferencesRoutes`).
29
+ * `resolvedConfig` mergea con los defaults.
30
+ */
31
+ config?: PreferencesViewConfig;
32
+ /** Config mergeada con defaults. @Input gana sobre route data. */
33
+ readonly resolvedConfig: import("@angular/core").Signal<Required<Omit<PreferencesViewConfig, "onThemeChanged" | "onLanguageChanged">> & Pick<PreferencesViewConfig, "onThemeChanged" | "onLanguageChanged">>;
34
+ /** Namespace i18n resuelto (capturado para llamadas no-reactivas). */
35
+ private get ns();
36
+ readonly saving: import("@angular/core").WritableSignal<boolean>;
37
+ readonly pageTitle: import("@angular/core").Signal<string>;
38
+ readonly pageDescription: import("@angular/core").Signal<string>;
39
+ readonly themeTitle: import("@angular/core").Signal<string>;
40
+ readonly themeHint: import("@angular/core").Signal<string>;
41
+ readonly langTitle: import("@angular/core").Signal<string>;
42
+ readonly langHint: import("@angular/core").Signal<string>;
43
+ readonly themeProps: import("@angular/core").Signal<Partial<SegmentControlMetadata>>;
44
+ readonly langProps: import("@angular/core").Signal<Partial<LanguageSelectorMetadata>>;
45
+ constructor();
46
+ onThemeChange(value: string): Promise<void>;
47
+ onLanguageChange(value: string): Promise<void>;
48
+ private dispatch;
49
+ /** Lee del namespace configurado. */
50
+ protected t(key: string): string;
51
+ static ɵfac: i0.ɵɵFactoryDeclaration<PreferencesViewComponent, never>;
52
+ static ɵcmp: i0.ɵɵComponentDeclaration<PreferencesViewComponent, "val-preferences-view", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
53
+ }
@@ -0,0 +1,12 @@
1
+ import { LanguagesContent } from '../../../services/i18n/types';
2
+ /**
3
+ * Defaults i18n (es/en) embebidos en `val-preferences-view`. Auto-registrados
4
+ * en el constructor del componente si el consumer no proveyó el namespace
5
+ * (`Settings.General` por default). Garantiza que nunca haya una key faltante
6
+ * evaluada por cada change-detection (ver nota en valtech-components/CLAUDE.md
7
+ * sobre el storm de CD con `val-debug-console`). El consumer puede override
8
+ * registrando el mismo namespace antes de que el componente monte.
9
+ *
10
+ * SOLO incluye las keys que la vista realmente usa.
11
+ */
12
+ export declare const PREFERENCES_VIEW_I18N: LanguagesContent;
@@ -0,0 +1,24 @@
1
+ import { Routes } from '@angular/router';
2
+ import { PreferencesViewConfig } from './types';
3
+ /**
4
+ * Helper para montar la vista de preferencias (`val-preferences-view`) como
5
+ * ruta en una app del factory. El `config` se pasa por route `data`
6
+ * (`preferencesConfig`) y el componente lo lee como fallback de su
7
+ * `@Input() config`.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * // settings.routes.ts
12
+ * export const settingsRoutes: Routes = [
13
+ * ...provideValtechPreferencesRoutes(),
14
+ * { path: 'profile', loadComponent: () => ... },
15
+ * ];
16
+ *
17
+ * // con config acotada:
18
+ * ...provideValtechPreferencesRoutes({ config: { showLanguage: false } }),
19
+ * ```
20
+ */
21
+ export declare function provideValtechPreferencesRoutes(opts?: {
22
+ path?: string;
23
+ config?: PreferencesViewConfig;
24
+ }): Routes;
@@ -0,0 +1,35 @@
1
+ import { PreferencesLanguage, PreferencesTheme } from '../../../services/preferences/preferences.types';
2
+ /**
3
+ * Configuración acotada de `val-preferences-view` (object-first). Ejes
4
+ * permitidos:
5
+ * - **secciones visibles** — gatean el render de cada `<section>` (tema /
6
+ * idioma).
7
+ * - **data/branding** — `supportedLanguages` para el selector de idioma e
8
+ * `i18nNamespace` para resolver los textos (default `'Settings.General'`).
9
+ * El consumer puede registrar ese namespace para override de los defaults
10
+ * embebidos.
11
+ * - **callbacks** — hooks tras un cambio de tema / idioma exitoso (además del
12
+ * efecto interno en `PreferencesService`).
13
+ *
14
+ * NO admite slots arbitrarios ni override del layout: la vista es full-feature
15
+ * y autocontenida.
16
+ */
17
+ export interface PreferencesViewConfig {
18
+ /** Muestra la sección de tema (segment claro/oscuro/auto). Default `true`. */
19
+ showTheme?: boolean;
20
+ /** Muestra la sección de idioma (language selector). Default `true`. */
21
+ showLanguage?: boolean;
22
+ /**
23
+ * Idiomas ofrecidos en el selector. Default `['es', 'en']`.
24
+ */
25
+ supportedLanguages?: PreferencesLanguage[];
26
+ /**
27
+ * Namespace i18n con el que la vista resuelve sus textos.
28
+ * Default `'Settings.General'`.
29
+ */
30
+ i18nNamespace?: string;
31
+ /** Callback tras un cambio de tema exitoso. */
32
+ onThemeChanged?: (theme: PreferencesTheme) => void;
33
+ /** Callback tras un cambio de idioma exitoso. */
34
+ onLanguageChanged?: (lang: PreferencesLanguage) => void;
35
+ }
@@ -0,0 +1,84 @@
1
+ import { AvatarUploadError, AvatarUploadMetadata, AvatarUploadResult } from '../avatar-upload/types';
2
+ import { EmptyStateMetadata } from '../../molecules/empty-state/types';
3
+ import { FormMetadata, FormSubmit } from '../../types';
4
+ import { GetProfileResponse } from '../../../services/auth/types';
5
+ import { ProfileViewConfig } from './types';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * `val-profile-view` — vista Perfil full-feature autocontenida (organism).
9
+ *
10
+ * Edita los campos públicos del usuario en UN solo formulario con UN solo botón
11
+ * "Guardar". Wireup:
12
+ * - Avatar — val-avatar-upload (Firebase Storage + backend sync). Separado del
13
+ * form porque es upload sync independiente.
14
+ * - Handle (@usuario) — InputType.HANDLE (val-username-input con check de
15
+ * disponibilidad async resuelto vía AuthService inyectado).
16
+ * - Nombre — InputType.TEXT.
17
+ * - Teléfono — InputType.PHONE.
18
+ *
19
+ * Submit handler dispatcha:
20
+ * 1. Si handle cambió → updateHandle PRIMERO (uniqueness).
21
+ * 2. Si name o phone cambió → updateProfile con ambos.
22
+ *
23
+ * Lectura del perfil: suscribe al doc Firestore /users/{uid} (mirror que mantiene
24
+ * el backend). Reactivo cross-tab + auto-refresca tras save. Fallback REST
25
+ * (auth.getProfile) si el doc no existe o el listener falla.
26
+ *
27
+ * NO renderiza ion-content — vive dentro de val-page-wrapper.
28
+ *
29
+ * Auto-registra sus defaults i18n (es/en) en el constructor si el consumer no
30
+ * proveyó el namespace configurado (default `Settings.Profile`).
31
+ */
32
+ export declare class ProfileViewComponent {
33
+ private nav;
34
+ private auth;
35
+ private i18n;
36
+ private toast;
37
+ private errors;
38
+ private firebase;
39
+ private collections;
40
+ private route;
41
+ /**
42
+ * Config vía @Input (object-first). Si no se pasa, se cae al route data
43
+ * `profileConfig` (poblado por `provideValtechProfileRoutes`). `resolvedConfig`
44
+ * mergea con los defaults.
45
+ */
46
+ config?: ProfileViewConfig;
47
+ /** Config mergeada con defaults. @Input gana sobre route data. */
48
+ readonly resolvedConfig: import("@angular/core").Signal<Required<Omit<ProfileViewConfig, "onSaved" | "onAvatarUploaded">> & Pick<ProfileViewConfig, "onSaved" | "onAvatarUploaded">>;
49
+ /** Namespace i18n resuelto (capturado una vez para llamadas no-reactivas). */
50
+ private get ns();
51
+ /**
52
+ * Colección global /users/{uid} (skipAppPrefix: true — el doc vive fuera de
53
+ * apps/{appId}/... porque es cross-app, ver firestore.rules).
54
+ */
55
+ private usersCol;
56
+ private formCmp;
57
+ readonly profile: import("@angular/core").WritableSignal<GetProfileResponse>;
58
+ readonly loading: import("@angular/core").WritableSignal<boolean>;
59
+ readonly saving: import("@angular/core").WritableSignal<boolean>;
60
+ readonly loadError: import("@angular/core").WritableSignal<unknown>;
61
+ private readonly _userId;
62
+ readonly errorState: import("@angular/core").Signal<EmptyStateMetadata>;
63
+ readonly avatarProps: import("@angular/core").Signal<AvatarUploadMetadata>;
64
+ formMeta: FormMetadata;
65
+ constructor();
66
+ /** Construcción inicial — UNA vez. Gatea handle/phone según config. */
67
+ private buildFormMeta;
68
+ /** Re-aplica labels/hints/placeholders en cambio de idioma. */
69
+ private applyI18nLabels;
70
+ /**
71
+ * Fallback REST. Capa 4 (UI declarativa): NO toasteamos acá — el
72
+ * val-empty-state ES la UI del error.
73
+ */
74
+ private loadFromApi;
75
+ private mapMirrorToProfile;
76
+ onSubmit(event: FormSubmit): Promise<void>;
77
+ onAvatarUploaded(result: AvatarUploadResult): void;
78
+ onAvatarError(_err: AvatarUploadError): void;
79
+ /** Lee del namespace configurado. */
80
+ protected t(key: string): string;
81
+ private initialsFromName;
82
+ static ɵfac: i0.ɵɵFactoryDeclaration<ProfileViewComponent, never>;
83
+ static ɵcmp: i0.ɵɵComponentDeclaration<ProfileViewComponent, "val-profile-view", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
84
+ }
@@ -0,0 +1,12 @@
1
+ import { LanguagesContent } from '../../../services/i18n/types';
2
+ /**
3
+ * Defaults i18n (es/en) embebidos en `val-profile-view`. Auto-registrados en el
4
+ * constructor del componente si el consumer no proveyó el namespace
5
+ * (`Settings.Profile` por default). Garantiza que nunca haya una key faltante
6
+ * evaluada por cada change-detection (ver nota en valtech-components/CLAUDE.md
7
+ * sobre el storm de CD con `val-debug-console`). El consumer puede override
8
+ * registrando el mismo namespace antes de que el componente monte.
9
+ *
10
+ * SOLO incluye las keys que la vista realmente usa.
11
+ */
12
+ export declare const PROFILE_VIEW_I18N: LanguagesContent;
@@ -0,0 +1,23 @@
1
+ import { Routes } from '@angular/router';
2
+ import { ProfileViewConfig } from './types';
3
+ /**
4
+ * Helper para montar la vista Perfil (`val-profile-view`) como ruta en una app
5
+ * del factory. El `config` se pasa por route `data` (`profileConfig`) y el
6
+ * componente lo lee como fallback de su `@Input() config`.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * // settings.routes.ts
11
+ * export const settingsRoutes: Routes = [
12
+ * ...provideValtechProfileRoutes(),
13
+ * { path: 'preferences', loadComponent: () => ... },
14
+ * ];
15
+ *
16
+ * // con config acotada:
17
+ * ...provideValtechProfileRoutes({ config: { showPhone: false } }),
18
+ * ```
19
+ */
20
+ export declare function provideValtechProfileRoutes(opts?: {
21
+ path?: string;
22
+ config?: ProfileViewConfig;
23
+ }): Routes;
@@ -0,0 +1,32 @@
1
+ import { GetProfileResponse } from '../../../services/auth/types';
2
+ import { AvatarUploadResult } from '../avatar-upload/types';
3
+ /**
4
+ * Configuración acotada de `val-profile-view` (object-first). Ejes permitidos:
5
+ * - **secciones visibles** — gatean el render del avatar y de los campos
6
+ * handle/phone del formulario.
7
+ * - **branding** — `i18nNamespace` para resolver los textos (default
8
+ * `'Settings.Profile'`). El consumer puede registrar ese namespace para
9
+ * override de los defaults embebidos.
10
+ * - **callbacks** — hooks tras un save / avatar exitoso (además de los toasts
11
+ * internos).
12
+ *
13
+ * NO admite slots arbitrarios ni override del layout: la vista es full-feature
14
+ * y autocontenida.
15
+ */
16
+ export interface ProfileViewConfig {
17
+ /** Muestra la sección de avatar (upload + meta). Default `true`. */
18
+ showAvatar?: boolean;
19
+ /** Incluye el campo `handle` (@usuario) en el formulario. Default `true`. */
20
+ showHandle?: boolean;
21
+ /** Incluye el campo `phone` en el formulario. Default `true`. */
22
+ showPhone?: boolean;
23
+ /**
24
+ * Namespace i18n con el que la vista resuelve sus textos.
25
+ * Default `'Settings.Profile'`.
26
+ */
27
+ i18nNamespace?: string;
28
+ /** Callback tras un guardado de perfil exitoso. */
29
+ onSaved?: (profile: GetProfileResponse) => void;
30
+ /** Callback tras subir/actualizar el avatar exitosamente. */
31
+ onAvatarUploaded?: (result: AvatarUploadResult) => void;
32
+ }
@@ -200,6 +200,20 @@ export type FormMetadata = {
200
200
  * densos o más aireados sin tocar CSS del consumer.
201
201
  */
202
202
  fieldSpacing?: number;
203
+ /**
204
+ * Modo embebido: el form NO renderiza su button-group/footer de submit.
205
+ * Solo campos + validación. Para wizards/hosts que controlan la navegación
206
+ * y leen el estado del form vía `@ViewChild(FormComponent)` (signals públicos
207
+ * `value`/`valid` + método `validate()`/`markAllTouched()`).
208
+ * Cuando es `true`, ignora `stickyFooter`.
209
+ */
210
+ controlled?: boolean;
211
+ /**
212
+ * Fija el button-group de submit al fondo (`position: sticky; bottom: 0`)
213
+ * para modales largos con scroll. Solo aplica si NO es `controlled`.
214
+ * Por defecto (sin flags) el submit es inline al final del form.
215
+ */
216
+ stickyFooter?: boolean;
203
217
  };
204
218
  /**
205
219
  * Possible action types for a toolbar.
package/lib/version.d.ts CHANGED
@@ -2,4 +2,4 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export declare const VERSION = "2.0.970";
5
+ export declare const VERSION = "2.0.972";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valtech-components",
3
- "version": "2.0.970",
3
+ "version": "2.0.972",
4
4
  "private": false,
5
5
  "bin": {
6
6
  "valtech-firebase-config": "./src/lib/services/firebase/scripts/generate-sw-config.js"
package/public-api.d.ts CHANGED
@@ -213,7 +213,6 @@ export * from './lib/components/organisms/debug-console/debug-console.component'
213
213
  export * from './lib/components/organisms/debug-console/types';
214
214
  export * from './lib/components/organisms/footer/footer.component';
215
215
  export * from './lib/components/organisms/form/factory';
216
- export * from './lib/components/organisms/form/form-footer/form-footer.component';
217
216
  export * from './lib/components/organisms/form/form.component';
218
217
  export * from './lib/components/organisms/header/header.component';
219
218
  export * from './lib/components/organisms/header/types';
@@ -263,6 +262,12 @@ export * from './lib/components/organisms/bottom-nav/bottom-nav.component';
263
262
  export * from './lib/components/organisms/bottom-nav/types';
264
263
  export * from './lib/components/organisms/avatar-upload/avatar-upload.component';
265
264
  export * from './lib/components/organisms/avatar-upload/types';
265
+ export * from './lib/components/organisms/profile-view/profile-view.component';
266
+ export * from './lib/components/organisms/profile-view/types';
267
+ export * from './lib/components/organisms/profile-view/profile.routes';
268
+ export * from './lib/components/organisms/preferences-view/preferences-view.component';
269
+ export * from './lib/components/organisms/preferences-view/types';
270
+ export * from './lib/components/organisms/preferences-view/preferences.routes';
266
271
  export * from './lib/components/organisms/skeleton-layout/skeleton-layout.component';
267
272
  export * from './lib/components/organisms/skeleton-layout/types';
268
273
  export * from './lib/components/organisms/faq/faq.component';
@@ -1,83 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { ButtonGroupComponent } from '../../../molecules/button-group/button-group.component';
3
- import { ComponentStates } from '../../../types';
4
- import { FooterComponent } from '../../footer/footer.component';
5
- import * as i0 from "@angular/core";
6
- export class FormFooterComponent {
7
- constructor() {
8
- this.onSubmit = new EventEmitter();
9
- }
10
- ngOnInit() { }
11
- async submitHandler(token) {
12
- this.onSubmit.emit({ fields: this.props.form.value, token });
13
- }
14
- get actions() {
15
- if (!this.props.form) {
16
- return [];
17
- }
18
- if (this.props.form.valid) {
19
- this.props.data.actions.state = ComponentStates.ENABLED;
20
- }
21
- if (this.props.data.state === ComponentStates.WORKING) {
22
- this.props.data.actions.state = ComponentStates.WORKING;
23
- }
24
- if (this.props.data.state === ComponentStates.ENABLED) {
25
- this.props.data.actions.state = ComponentStates.ENABLED;
26
- }
27
- if (this.props.data.state === ComponentStates.DISABLED) {
28
- this.props.data.actions.state = ComponentStates.DISABLED;
29
- }
30
- return [this.props.data.actions];
31
- }
32
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FormFooterComponent, isStandalone: true, selector: "val-form-footer", inputs: { props: "props" }, outputs: { onSubmit: "onSubmit" }, ngImport: i0, template: `
34
- <val-footer
35
- [props]="{
36
- bordered: false,
37
- translucent: false,
38
- toolbar: {
39
- title: '',
40
- actions: [],
41
- color: 'background',
42
- withBack: false,
43
- withActions: false,
44
- },
45
- }"
46
- >
47
- <val-button-group
48
- extra
49
- [props]="{ buttons: actions, position: 'center', columned: false }"
50
- (onClick)="submitHandler($event)"
51
- ></val-button-group>
52
- </val-footer>
53
- `, isInline: true, styles: [""], dependencies: [{ kind: "component", type: FooterComponent, selector: "val-footer", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }] }); }
54
- }
55
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormFooterComponent, decorators: [{
56
- type: Component,
57
- args: [{ selector: 'val-form-footer', standalone: true, imports: [FooterComponent, ButtonGroupComponent], template: `
58
- <val-footer
59
- [props]="{
60
- bordered: false,
61
- translucent: false,
62
- toolbar: {
63
- title: '',
64
- actions: [],
65
- color: 'background',
66
- withBack: false,
67
- withActions: false,
68
- },
69
- }"
70
- >
71
- <val-button-group
72
- extra
73
- [props]="{ buttons: actions, position: 'center', columned: false }"
74
- (onClick)="submitHandler($event)"
75
- ></val-button-group>
76
- </val-footer>
77
- ` }]
78
- }], ctorParameters: () => [], propDecorators: { props: [{
79
- type: Input
80
- }], onSubmit: [{
81
- type: Output
82
- }] } });
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1mb290ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9mb3JtL2Zvcm0tZm9vdGVyL2Zvcm0tZm9vdGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzlGLE9BQU8sRUFBa0IsZUFBZSxFQUE0QixNQUFNLGdCQUFnQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7QUE2QmhFLE1BQU0sT0FBTyxtQkFBbUI7SUFPOUI7UUFGQSxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztJQUUzQixDQUFDO0lBRWhCLFFBQVEsS0FBSSxDQUFDO0lBRWIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFjO1FBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztRQUMxRCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztRQUMxRCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztRQUMxRCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUMzRCxDQUFDO1FBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7K0dBckNVLG1CQUFtQjttR0FBbkIsbUJBQW1CLDBJQXZCcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JULDBFQXJCUyxlQUFlLGdHQUFFLG9CQUFvQjs7NEZBd0JwQyxtQkFBbUI7a0JBM0IvQixTQUFTOytCQUNFLGlCQUFpQixjQUNmLElBQUksV0FDUCxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxZQUN0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQlQ7d0RBS0QsS0FBSztzQkFESixLQUFLO2dCQUlOLFFBQVE7c0JBRFAsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJ1dHRvbkdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vbW9sZWN1bGVzL2J1dHRvbi1ncm91cC9idXR0b24tZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IEJ1dHRvbk1ldGFkYXRhLCBDb21wb25lbnRTdGF0ZXMsIEZvcm1NZXRhZGF0YSwgRm9ybVN1Ym1pdCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEZvb3RlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Zvb3Rlci9mb290ZXIuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWZvcm0tZm9vdGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0Zvb3RlckNvbXBvbmVudCwgQnV0dG9uR3JvdXBDb21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDx2YWwtZm9vdGVyXG4gICAgICBbcHJvcHNdPVwie1xuICAgICAgICBib3JkZXJlZDogZmFsc2UsXG4gICAgICAgIHRyYW5zbHVjZW50OiBmYWxzZSxcbiAgICAgICAgdG9vbGJhcjoge1xuICAgICAgICAgIHRpdGxlOiAnJyxcbiAgICAgICAgICBhY3Rpb25zOiBbXSxcbiAgICAgICAgICBjb2xvcjogJ2JhY2tncm91bmQnLFxuICAgICAgICAgIHdpdGhCYWNrOiBmYWxzZSxcbiAgICAgICAgICB3aXRoQWN0aW9uczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9XCJcbiAgICA+XG4gICAgICA8dmFsLWJ1dHRvbi1ncm91cFxuICAgICAgICBleHRyYVxuICAgICAgICBbcHJvcHNdPVwieyBidXR0b25zOiBhY3Rpb25zLCBwb3NpdGlvbjogJ2NlbnRlcicsIGNvbHVtbmVkOiBmYWxzZSB9XCJcbiAgICAgICAgKG9uQ2xpY2spPVwic3VibWl0SGFuZGxlcigkZXZlbnQpXCJcbiAgICAgID48L3ZhbC1idXR0b24tZ3JvdXA+XG4gICAgPC92YWwtZm9vdGVyPlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLWZvb3Rlci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtRm9vdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgcHJvcHM6IHsgZm9ybTogRm9ybUdyb3VwOyBkYXRhOiBGb3JtTWV0YWRhdGEgfTtcblxuICBAT3V0cHV0KClcbiAgb25TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1TdWJtaXQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nT25Jbml0KCkge31cblxuICBhc3luYyBzdWJtaXRIYW5kbGVyKHRva2VuPzogc3RyaW5nKSB7XG4gICAgdGhpcy5vblN1Ym1pdC5lbWl0KHsgZmllbGRzOiB0aGlzLnByb3BzLmZvcm0udmFsdWUsIHRva2VuIH0pO1xuICB9XG5cbiAgZ2V0IGFjdGlvbnMoKTogQnV0dG9uTWV0YWRhdGFbXSB7XG4gICAgaWYgKCF0aGlzLnByb3BzLmZvcm0pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5mb3JtLnZhbGlkKSB7XG4gICAgICB0aGlzLnByb3BzLmRhdGEuYWN0aW9ucy5zdGF0ZSA9IENvbXBvbmVudFN0YXRlcy5FTkFCTEVEO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLmRhdGEuc3RhdGUgPT09IENvbXBvbmVudFN0YXRlcy5XT1JLSU5HKSB7XG4gICAgICB0aGlzLnByb3BzLmRhdGEuYWN0aW9ucy5zdGF0ZSA9IENvbXBvbmVudFN0YXRlcy5XT1JLSU5HO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLmRhdGEuc3RhdGUgPT09IENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKSB7XG4gICAgICB0aGlzLnByb3BzLmRhdGEuYWN0aW9ucy5zdGF0ZSA9IENvbXBvbmVudFN0YXRlcy5FTkFCTEVEO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLmRhdGEuc3RhdGUgPT09IENvbXBvbmVudFN0YXRlcy5ESVNBQkxFRCkge1xuICAgICAgdGhpcy5wcm9wcy5kYXRhLmFjdGlvbnMuc3RhdGUgPSBDb21wb25lbnRTdGF0ZXMuRElTQUJMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIFt0aGlzLnByb3BzLmRhdGEuYWN0aW9uc107XG4gIH1cbn1cbiJdfQ==
@@ -1,17 +0,0 @@
1
- import { EventEmitter, OnInit } from '@angular/core';
2
- import { FormGroup } from '@angular/forms';
3
- import { ButtonMetadata, FormMetadata, FormSubmit } from '../../../types';
4
- import * as i0 from "@angular/core";
5
- export declare class FormFooterComponent implements OnInit {
6
- props: {
7
- form: FormGroup;
8
- data: FormMetadata;
9
- };
10
- onSubmit: EventEmitter<FormSubmit>;
11
- constructor();
12
- ngOnInit(): void;
13
- submitHandler(token?: string): Promise<void>;
14
- get actions(): ButtonMetadata[];
15
- static ɵfac: i0.ɵɵFactoryDeclaration<FormFooterComponent, never>;
16
- static ɵcmp: i0.ɵɵComponentDeclaration<FormFooterComponent, "val-form-footer", never, { "props": { "alias": "props"; "required": false; }; }, { "onSubmit": "onSubmit"; }, never, never, true, never>;
17
- }