valtech-components 2.0.284 → 2.0.288
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/README.md +54 -14
- package/esm2022/lib/components/atoms/text/text.component.mjs +46 -10
- package/esm2022/lib/components/atoms/text/types.mjs +1 -1
- package/esm2022/lib/examples/custom-content-demo.component.mjs +291 -0
- package/esm2022/lib/examples/link-processing-example.component.mjs +139 -0
- package/esm2022/lib/services/lang-provider/content.mjs +1 -13
- package/esm2022/lib/services/lang-provider/lang-provider.service.mjs +7 -9
- package/esm2022/lib/services/link-processor.service.mjs +147 -0
- package/esm2022/lib/shared/pipes/process-links.pipe.mjs +69 -0
- package/esm2022/public-api.mjs +5 -4
- package/fesm2022/valtech-components.mjs +418 -935
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/text/text.component.d.ts +5 -1
- package/lib/components/atoms/text/types.d.ts +5 -0
- package/lib/examples/link-processing-example.component.d.ts +22 -0
- package/lib/services/lang-provider/lang-provider.service.d.ts +5 -7
- package/lib/services/link-processor.service.d.ts +92 -0
- package/lib/shared/pipes/process-links.pipe.d.ts +55 -0
- package/package.json +1 -1
- package/public-api.d.ts +4 -3
- package/esm2022/lib/components/_examples/custom-content-demo.component.mjs +0 -265
- package/esm2022/lib/components/_examples/global-content-example-content.mjs +0 -23
- package/esm2022/lib/components/_examples/global-content-example.component.mjs +0 -504
- package/esm2022/lib/components/_examples/reactive-content-example-content.mjs +0 -43
- package/esm2022/lib/components/_examples/reactive-content-example.component.mjs +0 -347
- package/esm2022/lib/services/lang-provider/components/theme-settings.mjs +0 -15
- package/lib/components/_examples/global-content-example-content.d.ts +0 -9
- package/lib/components/_examples/global-content-example.component.d.ts +0 -73
- package/lib/components/_examples/reactive-content-example-content.d.ts +0 -32
- package/lib/components/_examples/reactive-content-example.component.d.ts +0 -47
- package/lib/services/lang-provider/components/theme-settings.d.ts +0 -3
- /package/lib/{components/_examples → examples}/custom-content-demo.component.d.ts +0 -0
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { OnDestroy, OnInit } from '@angular/core';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
3
|
import { ContentService } from '../../../services/content.service';
|
|
4
|
+
import { LinkProcessorService } from '../../../services/link-processor.service';
|
|
4
5
|
import { TextContentConfig, TextMetadata } from './types';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
export declare class TextComponent implements OnInit, OnDestroy {
|
|
7
8
|
private contentService;
|
|
9
|
+
private linkProcessor;
|
|
8
10
|
/**
|
|
9
11
|
* Text configuration object.
|
|
10
12
|
* @type {TextMetadata}
|
|
@@ -22,6 +24,8 @@ export declare class TextComponent implements OnInit, OnDestroy {
|
|
|
22
24
|
* @property color - The text color (Ionic color string)
|
|
23
25
|
* @property size - The text size ('small' | 'medium' | 'large' | 'xlarge')
|
|
24
26
|
* @property bold - Whether the text is bold
|
|
27
|
+
* @property processLinks - Whether to automatically process and convert links in text (default: false)
|
|
28
|
+
* @property linkConfig - Configuration for link processing (colors, target behavior, etc.)
|
|
25
29
|
*/
|
|
26
30
|
props: TextMetadata;
|
|
27
31
|
/**
|
|
@@ -30,7 +34,7 @@ export declare class TextComponent implements OnInit, OnDestroy {
|
|
|
30
34
|
*/
|
|
31
35
|
displayContent$: Observable<string>;
|
|
32
36
|
private subscription;
|
|
33
|
-
constructor(contentService: ContentService);
|
|
37
|
+
constructor(contentService: ContentService, linkProcessor: LinkProcessorService);
|
|
34
38
|
ngOnInit(): void;
|
|
35
39
|
ngOnDestroy(): void;
|
|
36
40
|
/**
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Color } from '@ionic/core';
|
|
2
|
+
import { LinkProcessorConfig } from '../../../services/link-processor.service';
|
|
2
3
|
/**
|
|
3
4
|
* Props for val-text component.
|
|
4
5
|
*
|
|
@@ -13,6 +14,8 @@ import { Color } from '@ionic/core';
|
|
|
13
14
|
* @property color - The text color (Ionic color string)
|
|
14
15
|
* @property size - The text size ('small' | 'medium' | 'large' | 'xlarge')
|
|
15
16
|
* @property bold - Whether the text is bold
|
|
17
|
+
* @property processLinks - Whether to automatically process and convert links in the text (default: false)
|
|
18
|
+
* @property linkConfig - Configuration for link processing (colors, target behavior, etc.)
|
|
16
19
|
*/
|
|
17
20
|
export interface TextMetadata {
|
|
18
21
|
size: 'small' | 'medium' | 'large' | 'xlarge';
|
|
@@ -23,6 +26,8 @@ export interface TextMetadata {
|
|
|
23
26
|
contentClass?: string;
|
|
24
27
|
contentFallback?: string;
|
|
25
28
|
contentInterpolation?: Record<string, string | number>;
|
|
29
|
+
processLinks?: boolean;
|
|
30
|
+
linkConfig?: LinkProcessorConfig;
|
|
26
31
|
}
|
|
27
32
|
/**
|
|
28
33
|
* Configuration for reactive content in val-text component.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { TextMetadata } from '../components/atoms/text/types';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* LinkProcessingExampleComponent - Componente de ejemplo que demuestra el procesamiento automático de enlaces.
|
|
5
|
+
*
|
|
6
|
+
* Este componente muestra diferentes casos de uso para el procesamiento automático de enlaces
|
|
7
|
+
* en el componente val-text, incluyendo enlaces externos, rutas internas y configuraciones personalizadas.
|
|
8
|
+
*
|
|
9
|
+
* @example Uso en template:
|
|
10
|
+
* ```html
|
|
11
|
+
* <val-link-processing-example></val-link-processing-example>
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare class LinkProcessingExampleComponent {
|
|
15
|
+
basicTextProps: TextMetadata;
|
|
16
|
+
basicLinksProps: TextMetadata;
|
|
17
|
+
customLinksProps: TextMetadata;
|
|
18
|
+
mixedLinksProps: TextMetadata;
|
|
19
|
+
sameTabLinksProps: TextMetadata;
|
|
20
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LinkProcessingExampleComponent, never>;
|
|
21
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LinkProcessingExampleComponent, "val-link-processing-example", never, {}, {}, never, never, true, never>;
|
|
22
|
+
}
|
|
@@ -33,7 +33,7 @@ export declare class LangService {
|
|
|
33
33
|
constructor(config: ValtechConfig);
|
|
34
34
|
/**
|
|
35
35
|
* Observable that emits the current language whenever it changes.
|
|
36
|
-
* Use this to
|
|
36
|
+
* Use this to subscribe to language changes in components.
|
|
37
37
|
*/
|
|
38
38
|
get currentLang$(): Observable<LangOption>;
|
|
39
39
|
/**
|
|
@@ -41,22 +41,20 @@ export declare class LangService {
|
|
|
41
41
|
*/
|
|
42
42
|
get currentLang(): LangOption;
|
|
43
43
|
/**
|
|
44
|
-
* Set the current language and persist it to
|
|
45
|
-
* This will trigger updates in all
|
|
44
|
+
* Set the current language and persist it to localStorage.
|
|
45
|
+
* This will trigger updates in all reactive content subscriptions.
|
|
46
46
|
*
|
|
47
47
|
* @param lang - The language to set
|
|
48
48
|
*/
|
|
49
49
|
setLang(lang: LangOption): void;
|
|
50
50
|
/**
|
|
51
|
-
* Get
|
|
51
|
+
* Get content for a component class and key (legacy method).
|
|
52
52
|
*
|
|
53
|
-
* @param className - The component class name
|
|
54
|
-
* @returns The language text object for the current language
|
|
55
53
|
* @deprecated Use getText() or getContent() for better type safety
|
|
56
54
|
*/
|
|
57
55
|
Text(className: string): LanguageText;
|
|
58
56
|
/**
|
|
59
|
-
* Get a
|
|
57
|
+
* Get a single content string synchronously for the current language.
|
|
60
58
|
*
|
|
61
59
|
* @param className - The component class name
|
|
62
60
|
* @param key - The text key
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export interface LinkProcessorConfig {
|
|
4
|
+
/** Whether to open external links in new tab (default: true) */
|
|
5
|
+
openExternalInNewTab?: boolean;
|
|
6
|
+
/** Whether to open internal links in new tab (default: false) */
|
|
7
|
+
openInternalInNewTab?: boolean;
|
|
8
|
+
/** Custom CSS classes for links */
|
|
9
|
+
linkClass?: string;
|
|
10
|
+
/** Custom CSS classes for external links */
|
|
11
|
+
externalLinkClass?: string;
|
|
12
|
+
/** Custom CSS classes for internal links */
|
|
13
|
+
internalLinkClass?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* LinkProcessorService - Service for processing text content to convert URLs and internal routes into clickable links.
|
|
17
|
+
*
|
|
18
|
+
* This service automatically detects external URLs (http/https) and internal routes (starting with /)
|
|
19
|
+
* and converts them into HTML anchor elements with appropriate attributes.
|
|
20
|
+
*
|
|
21
|
+
* @example Basic usage:
|
|
22
|
+
* ```typescript
|
|
23
|
+
* constructor(private linkProcessor: LinkProcessorService) {}
|
|
24
|
+
*
|
|
25
|
+
* processText() {
|
|
26
|
+
* const text = 'Visit https://example.com or go to /profile';
|
|
27
|
+
* const processed = this.linkProcessor.processLinks(text);
|
|
28
|
+
* // Returns SafeHtml with clickable links
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare class LinkProcessorService {
|
|
33
|
+
private sanitizer;
|
|
34
|
+
private readonly urlRegex;
|
|
35
|
+
private readonly internalRouteRegex;
|
|
36
|
+
constructor(sanitizer: DomSanitizer);
|
|
37
|
+
/**
|
|
38
|
+
* Procesa texto para convertir enlaces en elementos <a> clickeables.
|
|
39
|
+
* Detecta automáticamente URLs externas e internas y las convierte en enlaces.
|
|
40
|
+
*
|
|
41
|
+
* @param text - Texto a procesar
|
|
42
|
+
* @param config - Configuración del procesamiento
|
|
43
|
+
* @returns SafeHtml con enlaces procesados o string original
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* const result = this.linkProcessor.processLinks(
|
|
48
|
+
* 'Visit https://example.com or /profile',
|
|
49
|
+
* {
|
|
50
|
+
* openExternalInNewTab: true,
|
|
51
|
+
* openInternalInNewTab: false,
|
|
52
|
+
* linkClass: 'custom-link'
|
|
53
|
+
* }
|
|
54
|
+
* );
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
processLinks(text: string, config?: LinkProcessorConfig): SafeHtml | string;
|
|
58
|
+
/**
|
|
59
|
+
* Detecta si un texto contiene enlaces (URLs o rutas internas).
|
|
60
|
+
*
|
|
61
|
+
* @param text - Texto a analizar
|
|
62
|
+
* @returns true si contiene enlaces
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const hasLinks = this.linkProcessor.hasLinks('Visit https://example.com');
|
|
67
|
+
* // Returns: true
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
hasLinks(text: string): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Extrae todos los enlaces de un texto.
|
|
73
|
+
*
|
|
74
|
+
* @param text - Texto a analizar
|
|
75
|
+
* @returns Array de enlaces encontrados con su tipo
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* const links = this.linkProcessor.extractLinks('Visit https://example.com or /profile');
|
|
80
|
+
* // Returns: [
|
|
81
|
+
* // { url: 'https://example.com', type: 'external' },
|
|
82
|
+
* // { url: '/profile', type: 'internal' }
|
|
83
|
+
* // ]
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
extractLinks(text: string): Array<{
|
|
87
|
+
url: string;
|
|
88
|
+
type: 'external' | 'internal';
|
|
89
|
+
}>;
|
|
90
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LinkProcessorService, never>;
|
|
91
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<LinkProcessorService>;
|
|
92
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { PipeTransform } from '@angular/core';
|
|
2
|
+
import { SafeHtml } from '@angular/platform-browser';
|
|
3
|
+
import { LinkProcessorConfig } from '../../services/link-processor.service';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* ProcessLinksPipe - Pipe para procesar texto y convertir URLs en enlaces clickeables.
|
|
7
|
+
*
|
|
8
|
+
* Este pipe standalone detecta automáticamente URLs externas (http/https) y rutas internas
|
|
9
|
+
* (que empiezan con /) y las convierte en elementos HTML anchor con los atributos apropiados.
|
|
10
|
+
*
|
|
11
|
+
* @example Uso básico:
|
|
12
|
+
* ```html
|
|
13
|
+
* <div [innerHTML]="'Visit https://example.com or go to /profile' | processLinks"></div>
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @example Con configuración personalizada:
|
|
17
|
+
* ```html
|
|
18
|
+
* <div [innerHTML]="text | processLinks:linkConfig"></div>
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @example En TypeScript:
|
|
22
|
+
* ```typescript
|
|
23
|
+
* export class MyComponent {
|
|
24
|
+
* linkConfig: LinkProcessorConfig = {
|
|
25
|
+
* openExternalInNewTab: true,
|
|
26
|
+
* openInternalInNewTab: false,
|
|
27
|
+
* linkClass: 'my-link',
|
|
28
|
+
* externalLinkClass: 'external',
|
|
29
|
+
* internalLinkClass: 'internal'
|
|
30
|
+
* };
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare class ProcessLinksPipe implements PipeTransform {
|
|
35
|
+
private linkProcessor;
|
|
36
|
+
/**
|
|
37
|
+
* Transforma texto procesando URLs y rutas internas para convertirlas en enlaces.
|
|
38
|
+
*
|
|
39
|
+
* @param value - El texto a procesar
|
|
40
|
+
* @param config - Configuración opcional para el procesamiento de enlaces
|
|
41
|
+
* @returns SafeHtml con enlaces procesados o string original si no hay enlaces
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```html
|
|
45
|
+
* <!-- Uso básico -->
|
|
46
|
+
* <p [innerHTML]="'Check out https://angular.io' | processLinks"></p>
|
|
47
|
+
*
|
|
48
|
+
* <!-- Con configuración -->
|
|
49
|
+
* <p [innerHTML]="message | processLinks:{ openExternalInNewTab: false }"></p>
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
transform(value: string, config?: LinkProcessorConfig): SafeHtml | string;
|
|
53
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ProcessLinksPipe, never>;
|
|
54
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<ProcessLinksPipe, "processLinks", true>;
|
|
55
|
+
}
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -79,9 +79,8 @@ export * from './lib/components/organisms/wizard/wizard.component';
|
|
|
79
79
|
export * from './lib/components/templates/layout/layout.component';
|
|
80
80
|
export * from './lib/components/templates/simple/simple.component';
|
|
81
81
|
export * from './lib/components/templates/simple/types';
|
|
82
|
-
export * from './lib/
|
|
83
|
-
export * from './lib/
|
|
84
|
-
export * from './lib/components/_examples/reactive-content-example.component';
|
|
82
|
+
export * from './lib/examples/custom-content-demo.component';
|
|
83
|
+
export * from './lib/examples/link-processing-example.component';
|
|
85
84
|
export * from './lib/services/content.service';
|
|
86
85
|
export * from './lib/services/download.service';
|
|
87
86
|
export * from './lib/services/icons.service';
|
|
@@ -89,12 +88,14 @@ export * from './lib/services/in-app-browser.service';
|
|
|
89
88
|
export * from './lib/services/lang-provider/content';
|
|
90
89
|
export * from './lib/services/lang-provider/lang-provider.service';
|
|
91
90
|
export * from './lib/services/lang-provider/types';
|
|
91
|
+
export * from './lib/services/link-processor.service';
|
|
92
92
|
export * from './lib/services/local-storage.service';
|
|
93
93
|
export * from './lib/services/navigation.service';
|
|
94
94
|
export * from './lib/services/theme.service';
|
|
95
95
|
export * from './lib/services/toast.service';
|
|
96
96
|
export * from './lib/services/types';
|
|
97
97
|
export * from './lib/components/types';
|
|
98
|
+
export * from './lib/shared/pipes/process-links.pipe';
|
|
98
99
|
export * from './lib/shared/utils/content';
|
|
99
100
|
export * from './lib/shared/utils/dom';
|
|
100
101
|
export * from './lib/shared/utils/form-defaults';
|
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, inject } from '@angular/core';
|
|
3
|
-
import { IonButton, IonCard, IonCardContent, IonCardHeader, IonCardTitle, IonItem, IonLabel, } from '@ionic/angular/standalone';
|
|
4
|
-
import { ContentService } from '../../services/content.service';
|
|
5
|
-
import { LangOption } from '../../services/lang-provider/types';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common";
|
|
8
|
-
export class CustomContentDemoComponent {
|
|
9
|
-
constructor() {
|
|
10
|
-
this.content = inject(ContentService);
|
|
11
|
-
this.currentLang = 'es';
|
|
12
|
-
// Contenido global predefinido (sin className)
|
|
13
|
-
this.saveText$ = this.content.fromContent({ key: 'save' });
|
|
14
|
-
this.cancelText$ = this.content.fromContent({ key: 'cancel' });
|
|
15
|
-
this.deleteText$ = this.content.fromContent({ key: 'delete' });
|
|
16
|
-
this.loadingText$ = this.content.fromContent({ key: 'loading' });
|
|
17
|
-
// Tu contenido global personalizado (sin className)
|
|
18
|
-
this.dashboardText$ = this.content.fromContent({ key: 'dashboard' });
|
|
19
|
-
this.profileText$ = this.content.fromContent({ key: 'profile' });
|
|
20
|
-
this.settingsText$ = this.content.fromContent({ key: 'settings' });
|
|
21
|
-
this.welcomeText$ = this.content.fromContent({
|
|
22
|
-
key: 'welcome',
|
|
23
|
-
interpolation: { appName: 'Mi Aplicación' },
|
|
24
|
-
});
|
|
25
|
-
// Contenido específico del componente Language (con className)
|
|
26
|
-
this.spanishText$ = this.content.fromContent({
|
|
27
|
-
className: 'Language',
|
|
28
|
-
key: 'spanish',
|
|
29
|
-
});
|
|
30
|
-
this.englishText$ = this.content.fromContent({
|
|
31
|
-
className: 'Language',
|
|
32
|
-
key: 'english',
|
|
33
|
-
});
|
|
34
|
-
this.descriptionText$ = this.content.fromContent({
|
|
35
|
-
className: 'Language',
|
|
36
|
-
key: 'description',
|
|
37
|
-
});
|
|
38
|
-
// Para debug - texto síncrono
|
|
39
|
-
this.saveTextSync = '';
|
|
40
|
-
this.dashboardTextSync = '';
|
|
41
|
-
this.languageDescSync = '';
|
|
42
|
-
}
|
|
43
|
-
ngOnInit() {
|
|
44
|
-
// Obtener idioma actual
|
|
45
|
-
this.content.currentLang$.subscribe(lang => {
|
|
46
|
-
this.currentLang = lang;
|
|
47
|
-
});
|
|
48
|
-
// Obtener textos síncronos para debug
|
|
49
|
-
this.updateSyncTexts();
|
|
50
|
-
// 🔍 DIAGNÓSTICO: Verificar configuración
|
|
51
|
-
this.diagnoseConfiguration();
|
|
52
|
-
}
|
|
53
|
-
switchLanguage() {
|
|
54
|
-
const newLang = this.currentLang === 'es' ? LangOption.EN : LangOption.ES;
|
|
55
|
-
this.content.setLang(newLang);
|
|
56
|
-
// Actualizar textos síncronos después del cambio
|
|
57
|
-
setTimeout(() => {
|
|
58
|
-
this.updateSyncTexts();
|
|
59
|
-
}, 100);
|
|
60
|
-
}
|
|
61
|
-
updateSyncTexts() {
|
|
62
|
-
// Contenido global predefinido
|
|
63
|
-
this.saveTextSync = this.content.getText('save');
|
|
64
|
-
// Tu contenido global personalizado
|
|
65
|
-
this.dashboardTextSync = this.content.getText('dashboard');
|
|
66
|
-
// Contenido específico del componente
|
|
67
|
-
this.languageDescSync = this.content.getText('Language', 'description');
|
|
68
|
-
}
|
|
69
|
-
diagnoseConfiguration() {
|
|
70
|
-
console.log('=== DIAGNÓSTICO DE CONFIGURACIÓN ===');
|
|
71
|
-
// Verificar acceso directo al servicio
|
|
72
|
-
console.log('ContentService available:', !!this.content);
|
|
73
|
-
console.log('Current language:', this.content.currentLang);
|
|
74
|
-
// 🔍 Diagnóstico detallado del contenido Language
|
|
75
|
-
console.log('\n--- DIAGNÓSTICO DETALLADO LANGUAGE ---');
|
|
76
|
-
try {
|
|
77
|
-
// Acceder directamente al LangService
|
|
78
|
-
const langService = this.content.langService;
|
|
79
|
-
console.log('LangService available:', !!langService);
|
|
80
|
-
// Verificar si existe el contenido Language
|
|
81
|
-
const languageContent = langService.content['Language'];
|
|
82
|
-
console.log('Language content exists:', !!languageContent);
|
|
83
|
-
if (languageContent) {
|
|
84
|
-
console.log('Language content structure:', languageContent);
|
|
85
|
-
console.log('Language content.Content:', languageContent.Content);
|
|
86
|
-
// Verificar contenido en español
|
|
87
|
-
const esContent = languageContent.Content?.es;
|
|
88
|
-
console.log('ES content:', esContent);
|
|
89
|
-
console.log('ES description:', esContent?.description);
|
|
90
|
-
// Verificar contenido en inglés
|
|
91
|
-
const enContent = languageContent.Content?.en;
|
|
92
|
-
console.log('EN content:', enContent);
|
|
93
|
-
console.log('EN description:', enContent?.description);
|
|
94
|
-
}
|
|
95
|
-
// Verificar current lang
|
|
96
|
-
const currentLang = langService.selectedLang?.value;
|
|
97
|
-
console.log('Current selected language:', currentLang);
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
console.log('❌ Error accessing LangService:', error);
|
|
101
|
-
}
|
|
102
|
-
// Intentar acceso síncrono a contenido global predefinido
|
|
103
|
-
try {
|
|
104
|
-
const saveText = this.content.getText('save');
|
|
105
|
-
console.log('✅ Global predefinido (save):', saveText);
|
|
106
|
-
}
|
|
107
|
-
catch (error) {
|
|
108
|
-
console.log('❌ Error global predefinido (save):', error);
|
|
109
|
-
}
|
|
110
|
-
// Intentar acceso síncrono a contenido global personalizado
|
|
111
|
-
try {
|
|
112
|
-
const dashboardText = this.content.getText('dashboard');
|
|
113
|
-
console.log('✅ Global personalizado (dashboard):', dashboardText);
|
|
114
|
-
}
|
|
115
|
-
catch (error) {
|
|
116
|
-
console.log('❌ Error global personalizado (dashboard):', error);
|
|
117
|
-
}
|
|
118
|
-
// Intentar acceso síncrono a contenido de componente
|
|
119
|
-
try {
|
|
120
|
-
const spanishText = this.content.getText('Language', 'spanish');
|
|
121
|
-
console.log('✅ Componente Language (spanish):', spanishText);
|
|
122
|
-
}
|
|
123
|
-
catch (error) {
|
|
124
|
-
console.log('❌ Error componente Language (spanish):', error);
|
|
125
|
-
}
|
|
126
|
-
// Intentar acceso síncrono a contenido de componente
|
|
127
|
-
try {
|
|
128
|
-
const descriptionText = this.content.getText('Language', 'description');
|
|
129
|
-
console.log('✅ Componente Language (description):', descriptionText);
|
|
130
|
-
}
|
|
131
|
-
catch (error) {
|
|
132
|
-
console.log('❌ Error componente Language (description):', error);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomContentDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
136
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CustomContentDemoComponent, isStandalone: true, selector: "app-custom-content-demo", ngImport: i0, template: `
|
|
137
|
-
<ion-card>
|
|
138
|
-
<ion-card-header>
|
|
139
|
-
<ion-card-title>Demo de Contenido Personalizado</ion-card-title>
|
|
140
|
-
</ion-card-header>
|
|
141
|
-
|
|
142
|
-
<ion-card-content>
|
|
143
|
-
<!-- Contenido global predefinido -->
|
|
144
|
-
<div style="margin-bottom: 20px;">
|
|
145
|
-
<h3>Contenido Global Predefinido:</h3>
|
|
146
|
-
<ion-button>{{ saveText$ | async }}</ion-button>
|
|
147
|
-
<ion-button color="medium">{{ cancelText$ | async }}</ion-button>
|
|
148
|
-
<ion-button color="danger">{{ deleteText$ | async }}</ion-button>
|
|
149
|
-
<p><strong>Estado:</strong> {{ loadingText$ | async }}</p>
|
|
150
|
-
</div>
|
|
151
|
-
|
|
152
|
-
<!-- Tu contenido global personalizado -->
|
|
153
|
-
<div style="margin-bottom: 20px;">
|
|
154
|
-
<h3>Tu Contenido Global Personalizado:</h3>
|
|
155
|
-
<p><strong>Sección:</strong> {{ dashboardText$ | async }}</p>
|
|
156
|
-
<p><strong>Usuario:</strong> {{ profileText$ | async }}</p>
|
|
157
|
-
<p><strong>Config:</strong> {{ settingsText$ | async }}</p>
|
|
158
|
-
<p>{{ welcomeText$ | async }}</p>
|
|
159
|
-
</div>
|
|
160
|
-
|
|
161
|
-
<!-- Contenido específico del componente Language -->
|
|
162
|
-
<div style="margin-bottom: 20px;">
|
|
163
|
-
<h3>Contenido del Componente Language:</h3>
|
|
164
|
-
<ion-item>
|
|
165
|
-
<ion-label> <strong>Español:</strong> {{ spanishText$ | async }} </ion-label>
|
|
166
|
-
</ion-item>
|
|
167
|
-
<ion-item>
|
|
168
|
-
<ion-label> <strong>Inglés:</strong> {{ englishText$ | async }} </ion-label>
|
|
169
|
-
</ion-item>
|
|
170
|
-
<p>
|
|
171
|
-
<em>{{ descriptionText$ | async }}</em>
|
|
172
|
-
</p>
|
|
173
|
-
</div>
|
|
174
|
-
|
|
175
|
-
<!-- Botón para cambiar idioma -->
|
|
176
|
-
<div>
|
|
177
|
-
<h3>Control de Idioma:</h3>
|
|
178
|
-
<ion-button (click)="switchLanguage()" color="secondary">
|
|
179
|
-
Cambiar a {{ currentLang === 'es' ? 'English' : 'Español' }}
|
|
180
|
-
</ion-button>
|
|
181
|
-
<p>
|
|
182
|
-
<small>Idioma actual: {{ currentLang }}</small>
|
|
183
|
-
</p>
|
|
184
|
-
</div>
|
|
185
|
-
|
|
186
|
-
<!-- Debug info -->
|
|
187
|
-
<div style="margin-top: 20px; padding: 10px; background: #f5f5f5; border-radius: 4px;">
|
|
188
|
-
<h4>Debug Info:</h4>
|
|
189
|
-
<p><strong>Save (sync):</strong> {{ saveTextSync }}</p>
|
|
190
|
-
<p><strong>Dashboard (sync):</strong> {{ dashboardTextSync }}</p>
|
|
191
|
-
<p><strong>Language Description (sync):</strong> {{ languageDescSync }}</p>
|
|
192
|
-
</div>
|
|
193
|
-
</ion-card-content>
|
|
194
|
-
</ion-card>
|
|
195
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }] }); }
|
|
196
|
-
}
|
|
197
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomContentDemoComponent, decorators: [{
|
|
198
|
-
type: Component,
|
|
199
|
-
args: [{
|
|
200
|
-
selector: 'app-custom-content-demo',
|
|
201
|
-
standalone: true,
|
|
202
|
-
imports: [CommonModule, IonCard, IonCardContent, IonCardHeader, IonCardTitle, IonButton, IonItem, IonLabel],
|
|
203
|
-
template: `
|
|
204
|
-
<ion-card>
|
|
205
|
-
<ion-card-header>
|
|
206
|
-
<ion-card-title>Demo de Contenido Personalizado</ion-card-title>
|
|
207
|
-
</ion-card-header>
|
|
208
|
-
|
|
209
|
-
<ion-card-content>
|
|
210
|
-
<!-- Contenido global predefinido -->
|
|
211
|
-
<div style="margin-bottom: 20px;">
|
|
212
|
-
<h3>Contenido Global Predefinido:</h3>
|
|
213
|
-
<ion-button>{{ saveText$ | async }}</ion-button>
|
|
214
|
-
<ion-button color="medium">{{ cancelText$ | async }}</ion-button>
|
|
215
|
-
<ion-button color="danger">{{ deleteText$ | async }}</ion-button>
|
|
216
|
-
<p><strong>Estado:</strong> {{ loadingText$ | async }}</p>
|
|
217
|
-
</div>
|
|
218
|
-
|
|
219
|
-
<!-- Tu contenido global personalizado -->
|
|
220
|
-
<div style="margin-bottom: 20px;">
|
|
221
|
-
<h3>Tu Contenido Global Personalizado:</h3>
|
|
222
|
-
<p><strong>Sección:</strong> {{ dashboardText$ | async }}</p>
|
|
223
|
-
<p><strong>Usuario:</strong> {{ profileText$ | async }}</p>
|
|
224
|
-
<p><strong>Config:</strong> {{ settingsText$ | async }}</p>
|
|
225
|
-
<p>{{ welcomeText$ | async }}</p>
|
|
226
|
-
</div>
|
|
227
|
-
|
|
228
|
-
<!-- Contenido específico del componente Language -->
|
|
229
|
-
<div style="margin-bottom: 20px;">
|
|
230
|
-
<h3>Contenido del Componente Language:</h3>
|
|
231
|
-
<ion-item>
|
|
232
|
-
<ion-label> <strong>Español:</strong> {{ spanishText$ | async }} </ion-label>
|
|
233
|
-
</ion-item>
|
|
234
|
-
<ion-item>
|
|
235
|
-
<ion-label> <strong>Inglés:</strong> {{ englishText$ | async }} </ion-label>
|
|
236
|
-
</ion-item>
|
|
237
|
-
<p>
|
|
238
|
-
<em>{{ descriptionText$ | async }}</em>
|
|
239
|
-
</p>
|
|
240
|
-
</div>
|
|
241
|
-
|
|
242
|
-
<!-- Botón para cambiar idioma -->
|
|
243
|
-
<div>
|
|
244
|
-
<h3>Control de Idioma:</h3>
|
|
245
|
-
<ion-button (click)="switchLanguage()" color="secondary">
|
|
246
|
-
Cambiar a {{ currentLang === 'es' ? 'English' : 'Español' }}
|
|
247
|
-
</ion-button>
|
|
248
|
-
<p>
|
|
249
|
-
<small>Idioma actual: {{ currentLang }}</small>
|
|
250
|
-
</p>
|
|
251
|
-
</div>
|
|
252
|
-
|
|
253
|
-
<!-- Debug info -->
|
|
254
|
-
<div style="margin-top: 20px; padding: 10px; background: #f5f5f5; border-radius: 4px;">
|
|
255
|
-
<h4>Debug Info:</h4>
|
|
256
|
-
<p><strong>Save (sync):</strong> {{ saveTextSync }}</p>
|
|
257
|
-
<p><strong>Dashboard (sync):</strong> {{ dashboardTextSync }}</p>
|
|
258
|
-
<p><strong>Language Description (sync):</strong> {{ languageDescSync }}</p>
|
|
259
|
-
</div>
|
|
260
|
-
</ion-card-content>
|
|
261
|
-
</ion-card>
|
|
262
|
-
`,
|
|
263
|
-
}]
|
|
264
|
-
}] });
|
|
265
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWNvbnRlbnQtZGVtby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL19leGFtcGxlcy9jdXN0b20tY29udGVudC1kZW1vLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUNMLFNBQVMsRUFDVCxPQUFPLEVBQ1AsY0FBYyxFQUNkLGFBQWEsRUFDYixZQUFZLEVBQ1osT0FBTyxFQUNQLFFBQVEsR0FDVCxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7OztBQW1FaEUsTUFBTSxPQUFPLDBCQUEwQjtJQWpFdkM7UUFrRVUsWUFBTyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV6QyxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVuQiwrQ0FBK0M7UUFDL0MsY0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsZ0JBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFELGdCQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMxRCxpQkFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxD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TyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0NBQXdDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELHFEQUFxRDtRQUNyRCxJQUFJLENBQUM7WUFDSCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDeEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7K0dBaEpVLDBCQUEwQjttR0FBMUIsMEJBQTBCLG1GQTdEM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkRULDJEQTVEUyxZQUFZLG9GQUFFLE9BQU8seUxBQUUsY0FBYywrRUFBRSxhQUFhLHNHQUFFLFlBQVksc0ZBQUUsU0FBUyxvUEFBRSxPQUFPLDBOQUFFLFFBQVE7OzRGQThEL0YsMEJBQTBCO2tCQWpFdEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUseUJBQXlCO29CQUNuQyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQztvQkFDM0csUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJEVDtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBJb25CdXR0b24sXG4gIElvbkNhcmQsXG4gIElvbkNhcmRDb250ZW50LFxuICBJb25DYXJkSGVhZGVyLFxuICBJb25DYXJkVGl0bGUsXG4gIElvbkl0ZW0sXG4gIElvbkxhYmVsLFxufSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IExhbmdPcHRpb24gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWN1c3RvbS1jb250ZW50LWRlbW8nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJb25DYXJkLCBJb25DYXJkQ29udGVudCwgSW9uQ2FyZEhlYWRlciwgSW9uQ2FyZFRpdGxlLCBJb25CdXR0b24sIElvbkl0ZW0sIElvbkxhYmVsXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aW9uLWNhcmQ+XG4gICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICA8aW9uLWNhcmQtdGl0bGU+RGVtbyBkZSBDb250ZW5pZG8gUGVyc29uYWxpemFkbzwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cblxuICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgIDwhLS0gQ29udGVuaWRvIGdsb2JhbCBwcmVkZWZpbmlkbyAtLT5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDIwcHg7XCI+XG4gICAgICAgICAgPGgzPkNvbnRlbmlkbyBHbG9iYWwgUHJlZGVmaW5pZG86PC9oMz5cbiAgICAgICAgICA8aW9uLWJ1dHRvbj57eyBzYXZlVGV4dCQgfCBhc3luYyB9fTwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBjb2xvcj1cIm1lZGl1bVwiPnt7IGNhbmNlbFRleHQkIHwgYXN5bmMgfX08L2lvbi1idXR0b24+XG4gICAgICAgICAgPGlvbi1idXR0b24gY29sb3I9XCJkYW5nZXJcIj57eyBkZWxldGVUZXh0JCB8IGFzeW5jIH19PC9pb24tYnV0dG9uPlxuICAgICAgICAgIDxwPjxzdHJvbmc+RXN0YWRvOjwvc3Ryb25nPiB7eyBsb2FkaW5nVGV4dCQgfCBhc3luYyB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUdSBjb250ZW5pZG8gZ2xvYmFsIHBlcnNvbmFsaXphZG8gLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4O1wiPlxuICAgICAgICAgIDxoMz5UdSBDb250ZW5pZG8gR2xvYmFsIFBlcnNvbmFsaXphZG86PC9oMz5cbiAgICAgICAgICA8cD48c3Ryb25nPlNlY2Npw7NuOjwvc3Ryb25nPiB7eyBkYXNoYm9hcmRUZXh0JCB8IGFzeW5jIH19PC9wPlxuICAgICAgICAgIDxwPjxzdHJvbmc+VXN1YXJpbzo8L3N0cm9uZz4ge3sgcHJvZmlsZVRleHQkIHwgYXN5bmMgfX08L3A+XG4gICAgICAgICAgPHA+PHN0cm9uZz5Db25maWc6PC9zdHJvbmc+IHt7IHNldHRpbmdzVGV4dCQgfCBhc3luYyB9fTwvcD5cbiAgICAgICAgICA8cD57eyB3ZWxjb21lVGV4dCQgfCBhc3luYyB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBDb250ZW5pZG8gZXNwZWPDrWZpY28gZGVsIGNvbXBvbmVudGUgTGFuZ3VhZ2UgLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4O1wiPlxuICAgICAgICAgIDxoMz5Db250ZW5pZG8gZGVsIENvbXBvbmVudGUgTGFuZ3VhZ2U6PC9oMz5cbiAgICAgICAgICA8aW9uLWl0ZW0+XG4gICAgICAgICAgICA8aW9uLWxhYmVsPiA8c3Ryb25nPkVzcGHDsW9sOjwvc3Ryb25nPiB7eyBzcGFuaXNoVGV4dCQgfCBhc3luYyB9fSA8L2lvbi1sYWJlbD5cbiAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgIDxpb24taXRlbT5cbiAgICAgICAgICAgIDxpb24tbGFiZWw+IDxzdHJvbmc+SW5nbMOpczo8L3N0cm9uZz4ge3sgZW5nbGlzaFRleHQkIHwgYXN5bmMgfX0gPC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIDxlbT57eyBkZXNjcmlwdGlvblRleHQkIHwgYXN5bmMgfX08L2VtPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBCb3TDs24gcGFyYSBjYW1iaWFyIGlkaW9tYSAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDM+Q29udHJvbCBkZSBJZGlvbWE6PC9oMz5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwic3dpdGNoTGFuZ3VhZ2UoKVwiIGNvbG9yPVwic2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICBDYW1iaWFyIGEge3sgY3VycmVudExhbmcgPT09ICdlcycgPyAnRW5nbGlzaCcgOiAnRXNwYcOxb2wnIH19XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAgPHNtYWxsPklkaW9tYSBhY3R1YWw6IHt7IGN1cnJlbnRMYW5nIH19PC9zbWFsbD5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRGVidWcgaW5mbyAtLT5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDIwcHg7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6ICNmNWY1ZjU7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5cbiAgICAgICAgICA8aDQ+RGVidWcgSW5mbzo8L2g0PlxuICAgICAgICAgIDxwPjxzdHJvbmc+U2F2ZSAoc3luYyk6PC9zdHJvbmc+IHt7IHNhdmVUZXh0U3luYyB9fTwvcD5cbiAgICAgICAgICA8cD48c3Ryb25nPkRhc2hib2FyZCAoc3luYyk6PC9zdHJvbmc+IHt7IGRhc2hib2FyZFRleHRTeW5jIH19PC9wPlxuICAgICAgICAgIDxwPjxzdHJvbmc+TGFuZ3VhZ2UgRGVzY3JpcHRpb24gKHN5bmMpOjwvc3Ryb25nPiB7eyBsYW5ndWFnZURlc2NTeW5jIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICA8L2lvbi1jYXJkPlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDdXN0b21Db250ZW50RGVtb0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgY29udGVudCA9IGluamVjdChDb250ZW50U2VydmljZSk7XG5cbiAgY3VycmVudExhbmcgPSAnZXMnO1xuXG4gIC8vIENvbnRlbmlkbyBnbG9iYWwgcHJlZGVmaW5pZG8gKHNpbiBjbGFzc05hbWUpXG4gIHNhdmVUZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ3NhdmUnIH0pO1xuICBjYW5jZWxUZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ2NhbmNlbCcgfSk7XG4gIGRlbGV0ZVRleHQkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnZGVsZXRlJyB9KTtcbiAgbG9hZGluZ1RleHQkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnbG9hZGluZycgfSk7XG5cbiAgLy8gVHUgY29udGVuaWRvIGdsb2JhbCBwZXJzb25hbGl6YWRvIChzaW4gY2xhc3NOYW1lKVxuICBkYXNoYm9hcmRUZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ2Rhc2hib2FyZCcgfSk7XG4gIHByb2ZpbGVUZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ3Byb2ZpbGUnIH0pO1xuICBzZXR0aW5nc1RleHQkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnc2V0dGluZ3MnIH0pO1xuICB3ZWxjb21lVGV4dCQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoe1xuICAgIGtleTogJ3dlbGNvbWUnLFxuICAgIGludGVycG9sYXRpb246IHsgYXBwTmFtZTogJ01pIEFwbGljYWNpw7NuJyB9LFxuICB9KTtcblxuICAvLyBDb250ZW5pZG8gZXNwZWPDrWZpY28gZGVsIGNvbXBvbmVudGUgTGFuZ3VhZ2UgKGNvbiBjbGFzc05hbWUpXG4gIHNwYW5pc2hUZXh0JCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7XG4gICAgY2xhc3NOYW1lOiAnTGFuZ3VhZ2UnLFxuICAgIGtleTogJ3NwYW5pc2gnLFxuICB9KTtcbiAgZW5nbGlzaFRleHQkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHtcbiAgICBjbGFzc05hbWU6ICdMYW5ndWFnZScsXG4gICAga2V5OiAnZW5nbGlzaCcsXG4gIH0pO1xuICBkZXNjcmlwdGlvblRleHQkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHtcbiAgICBjbGFzc05hbWU6ICdMYW5ndWFnZScsXG4gICAga2V5OiAnZGVzY3JpcHRpb24nLFxuICB9KTtcblxuICAvLyBQYXJhIGRlYnVnIC0gdGV4dG8gc8OtbmNyb25vXG4gIHNhdmVUZXh0U3luYyA9ICcnO1xuICBkYXNoYm9hcmRUZXh0U3luYyA9ICcnO1xuICBsYW5ndWFnZURlc2NTeW5jID0gJyc7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gT2J0ZW5lciBpZGlvbWEgYWN0dWFsXG4gICAgdGhpcy5jb250ZW50LmN1cnJlbnRMYW5nJC5zdWJzY3JpYmUobGFuZyA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRMYW5nID0gbGFuZztcbiAgICB9KTtcblxuICAgIC8vIE9idGVuZXIgdGV4dG9zIHPDrW5jcm9ub3MgcGFyYSBkZWJ1Z1xuICAgIHRoaXMudXBkYXRlU3luY1RleHRzKCk7XG5cbiAgICAvLyDwn5SNIERJQUdOw5NTVElDTzogVmVyaWZpY2FyIGNvbmZpZ3VyYWNpw7NuXG4gICAgdGhpcy5kaWFnbm9zZUNvbmZpZ3VyYXRpb24oKTtcbiAgfVxuXG4gIHN3aXRjaExhbmd1YWdlKCkge1xuICAgIGNvbnN0IG5ld0xhbmcgPSB0aGlzLmN1cnJlbnRMYW5nID09PSAnZXMnID8gTGFuZ09wdGlvbi5FTiA6IExhbmdPcHRpb24uRVM7XG4gICAgdGhpcy5jb250ZW50LnNldExhbmcobmV3TGFuZyk7XG5cbiAgICAvLyBBY3R1YWxpemFyIHRleHRvcyBzw61uY3Jvbm9zIGRlc3B1w6lzIGRlbCBjYW1iaW9cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlU3luY1RleHRzKCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3luY1RleHRzKCkge1xuICAgIC8vIENvbnRlbmlkbyBnbG9iYWwgcHJlZGVmaW5pZG9cbiAgICB0aGlzLnNhdmVUZXh0U3luYyA9IHRoaXMuY29udGVudC5nZXRUZXh0KCdzYXZlJyk7XG5cbiAgICAvLyBUdSBjb250ZW5pZG8gZ2xvYmFsIHBlcnNvbmFsaXphZG9cbiAgICB0aGlzLmRhc2hib2FyZFRleHRTeW5jID0gdGhpcy5jb250ZW50LmdldFRleHQoJ2Rhc2hib2FyZCcpO1xuXG4gICAgLy8gQ29udGVuaWRvIGVzcGVjw61maWNvIGRlbCBjb21wb25lbnRlXG4gICAgdGhpcy5sYW5ndWFnZURlc2NTeW5jID0gdGhpcy5jb250ZW50LmdldFRleHQoJ0xhbmd1YWdlJywgJ2Rlc2NyaXB0aW9uJyk7XG4gIH1cblxuICBwcml2YXRlIGRpYWdub3NlQ29uZmlndXJhdGlvbigpIHtcbiAgICBjb25zb2xlLmxvZygnPT09IERJQUdOw5NTVElDTyBERSBDT05GSUdVUkFDScOTTiA9PT0nKTtcblxuICAgIC8vIFZlcmlmaWNhciBhY2Nlc28gZGlyZWN0byBhbCBzZXJ2aWNpb1xuICAgIGNvbnNvbGUubG9nKCdDb250ZW50U2VydmljZSBhdmFpbGFibGU6JywgISF0aGlzLmNvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKCdDdXJyZW50IGxhbmd1YWdlOicsIHRoaXMuY29udGVudC5jdXJyZW50TGFuZyk7XG5cbiAgICAvLyDwn5SNIERpYWduw7NzdGljbyBkZXRhbGxhZG8gZGVsIGNvbnRlbmlkbyBMYW5ndWFnZVxuICAgIGNvbnNvbGUubG9nKCdcXG4tLS0gRElBR07Dk1NUSUNPIERFVEFMTEFETyBMQU5HVUFHRSAtLS0nKTtcbiAgICB0cnkge1xuICAgICAgLy8gQWNjZWRlciBkaXJlY3RhbWVudGUgYWwgTGFuZ1NlcnZpY2VcbiAgICAgIGNvbnN0IGxhbmdTZXJ2aWNlID0gKHRoaXMuY29udGVudCBhcyBhbnkpLmxhbmdTZXJ2aWNlO1xuICAgICAgY29uc29sZS5sb2coJ0xhbmdTZXJ2aWNlIGF2YWlsYWJsZTonLCAhIWxhbmdTZXJ2aWNlKTtcblxuICAgICAgLy8gVmVyaWZpY2FyIHNpIGV4aXN0ZSBlbCBjb250ZW5pZG8gTGFuZ3VhZ2VcbiAgICAgIGNvbnN0IGxhbmd1YWdlQ29udGVudCA9IGxhbmdTZXJ2aWNlLmNvbnRlbnRbJ0xhbmd1YWdlJ107XG4gICAgICBjb25zb2xlLmxvZygnTGFuZ3VhZ2UgY29udGVudCBleGlzdHM6JywgISFsYW5ndWFnZUNvbnRlbnQpO1xuXG4gICAgICBpZiAobGFuZ3VhZ2VDb250ZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdMYW5ndWFnZSBjb250ZW50IHN0cnVjdHVyZTonLCBsYW5ndWFnZUNvbnRlbnQpO1xuICAgICAgICBjb25zb2xlLmxvZygnTGFuZ3VhZ2UgY29udGVudC5Db250ZW50OicsIGxhbmd1YWdlQ29udGVudC5Db250ZW50KTtcblxuICAgICAgICAvLyBWZXJpZmljYXIgY29udGVuaWRvIGVuIGVzcGHDsW9sXG4gICAgICAgIGNvbnN0IGVzQ29udGVudCA9IGxhbmd1YWdlQ29udGVudC5Db250ZW50Py5lcztcbiAgICAgICAgY29uc29sZS5sb2coJ0VTIGNvbnRlbnQ6JywgZXNDb250ZW50KTtcbiAgICAgICAgY29uc29sZS5sb2coJ0VTIGRlc2NyaXB0aW9uOicsIGVzQ29udGVudD8uZGVzY3JpcHRpb24pO1xuXG4gICAgICAgIC8vIFZlcmlmaWNhciBjb250ZW5pZG8gZW4gaW5nbMOpc1xuICAgICAgICBjb25zdCBlbkNvbnRlbnQgPSBsYW5ndWFnZUNvbnRlbnQuQ29udGVudD8uZW47XG4gICAgICAgIGNvbnNvbGUubG9nKCdFTiBjb250ZW50OicsIGVuQ29udGVudCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdFTiBkZXNjcmlwdGlvbjonLCBlbkNvbnRlbnQ/LmRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZpY2FyIGN1cnJlbnQgbGFuZ1xuICAgICAgY29uc3QgY3VycmVudExhbmcgPSBsYW5nU2VydmljZS5zZWxlY3RlZExhbmc/LnZhbHVlO1xuICAgICAgY29uc29sZS5sb2coJ0N1cnJlbnQgc2VsZWN0ZWQgbGFuZ3VhZ2U6JywgY3VycmVudExhbmcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZygn4p2MIEVycm9yIGFjY2Vzc2luZyBMYW5nU2VydmljZTonLCBlcnJvcik7XG4gICAgfVxuXG4gICAgLy8gSW50ZW50YXIgYWNjZXNvIHPDrW5jcm9ubyBhIGNvbnRlbmlkbyBnbG9iYWwgcHJlZGVmaW5pZG9cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2F2ZVRleHQgPSB0aGlzLmNvbnRlbnQuZ2V0VGV4dCgnc2F2ZScpO1xuICAgICAgY29uc29sZS5sb2coJ+KchSBHbG9iYWwgcHJlZGVmaW5pZG8gKHNhdmUpOicsIHNhdmVUZXh0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coJ+KdjCBFcnJvciBnbG9iYWwgcHJlZGVmaW5pZG8gKHNhdmUpOicsIGVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBJbnRlbnRhciBhY2Nlc28gc8OtbmNyb25vIGEgY29udGVuaWRvIGdsb2JhbCBwZXJzb25hbGl6YWRvXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhc2hib2FyZFRleHQgPSB0aGlzLmNvbnRlbnQuZ2V0VGV4dCgnZGFzaGJvYXJkJyk7XG4gICAgICBjb25zb2xlLmxvZygn4pyFIEdsb2JhbCBwZXJzb25hbGl6YWRvIChkYXNoYm9hcmQpOicsIGRhc2hib2FyZFRleHQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZygn4p2MIEVycm9yIGdsb2JhbCBwZXJzb25hbGl6YWRvIChkYXNoYm9hcmQpOicsIGVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBJbnRlbnRhciBhY2Nlc28gc8OtbmNyb25vIGEgY29udGVuaWRvIGRlIGNvbXBvbmVudGVcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3BhbmlzaFRleHQgPSB0aGlzLmNvbnRlbnQuZ2V0VGV4dCgnTGFuZ3VhZ2UnLCAnc3BhbmlzaCcpO1xuICAgICAgY29uc29sZS5sb2coJ+KchSBDb21wb25lbnRlIExhbmd1YWdlIChzcGFuaXNoKTonLCBzcGFuaXNoVGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfinYwgRXJyb3IgY29tcG9uZW50ZSBMYW5ndWFnZSAoc3BhbmlzaCk6JywgZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIEludGVudGFyIGFjY2VzbyBzw61uY3Jvbm8gYSBjb250ZW5pZG8gZGUgY29tcG9uZW50ZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvblRleHQgPSB0aGlzLmNvbnRlbnQuZ2V0VGV4dCgnTGFuZ3VhZ2UnLCAnZGVzY3JpcHRpb24nKTtcbiAgICAgIGNvbnNvbGUubG9nKCfinIUgQ29tcG9uZW50ZSBMYW5ndWFnZSAoZGVzY3JpcHRpb24pOicsIGRlc2NyaXB0aW9uVGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfinYwgRXJyb3IgY29tcG9uZW50ZSBMYW5ndWFnZSAoZGVzY3JpcHRpb24pOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Content configuration for the Global Content Example component.
|
|
3
|
-
*
|
|
4
|
-
* This demonstrates component-specific content that works alongside
|
|
5
|
-
* global content to create a comprehensive content management system.
|
|
6
|
-
*/
|
|
7
|
-
import { TextContent } from '../../services/lang-provider/types';
|
|
8
|
-
const globalContentExampleData = {
|
|
9
|
-
title: {
|
|
10
|
-
es: 'Ejemplo de Contenido Global',
|
|
11
|
-
en: 'Global Content Example',
|
|
12
|
-
},
|
|
13
|
-
languageLabel: {
|
|
14
|
-
es: 'Idioma:',
|
|
15
|
-
en: 'Language:',
|
|
16
|
-
},
|
|
17
|
-
description: {
|
|
18
|
-
es: 'Este ejemplo demuestra cómo usar contenido global y específico del componente de manera conjunta.',
|
|
19
|
-
en: 'This example shows how to use global and component-specific content together.',
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
export default new TextContent(globalContentExampleData);
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLWNvbnRlbnQtZXhhbXBsZS1jb250ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGVjaC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9fZXhhbXBsZXMvZ2xvYmFsLWNvbnRlbnQtZXhhbXBsZS1jb250ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFvQixXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRixNQUFNLHdCQUF3QixHQUFxQjtJQUNqRCxLQUFLLEVBQUU7UUFDTCxFQUFFLEVBQUUsNkJBQTZCO1FBQ2pDLEVBQUUsRUFBRSx3QkFBd0I7S0FDN0I7SUFDRCxhQUFhLEVBQUU7UUFDYixFQUFFLEVBQUUsU0FBUztRQUNiLEVBQUUsRUFBRSxXQUFXO0tBQ2hCO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsRUFBRSxFQUFFLG1HQUFtRztRQUN2RyxFQUFFLEVBQUUsK0VBQStFO0tBQ3BGO0NBQ0YsQ0FBQztBQUVGLGVBQWUsSUFBSSxXQUFXLENBQUMsd0JBQXdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29udGVudCBjb25maWd1cmF0aW9uIGZvciB0aGUgR2xvYmFsIENvbnRlbnQgRXhhbXBsZSBjb21wb25lbnQuXG4gKlxuICogVGhpcyBkZW1vbnN0cmF0ZXMgY29tcG9uZW50LXNwZWNpZmljIGNvbnRlbnQgdGhhdCB3b3JrcyBhbG9uZ3NpZGVcbiAqIGdsb2JhbCBjb250ZW50IHRvIGNyZWF0ZSBhIGNvbXByZWhlbnNpdmUgY29udGVudCBtYW5hZ2VtZW50IHN5c3RlbS5cbiAqL1xuXG5pbXBvcnQgeyBMYW5ndWFnZXNDb250ZW50LCBUZXh0Q29udGVudCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xhbmctcHJvdmlkZXIvdHlwZXMnO1xuXG5jb25zdCBnbG9iYWxDb250ZW50RXhhbXBsZURhdGE6IExhbmd1YWdlc0NvbnRlbnQgPSB7XG4gIHRpdGxlOiB7XG4gICAgZXM6ICdFamVtcGxvIGRlIENvbnRlbmlkbyBHbG9iYWwnLFxuICAgIGVuOiAnR2xvYmFsIENvbnRlbnQgRXhhbXBsZScsXG4gIH0sXG4gIGxhbmd1YWdlTGFiZWw6IHtcbiAgICBlczogJ0lkaW9tYTonLFxuICAgIGVuOiAnTGFuZ3VhZ2U6JyxcbiAgfSxcbiAgZGVzY3JpcHRpb246IHtcbiAgICBlczogJ0VzdGUgZWplbXBsbyBkZW11ZXN0cmEgY8OzbW8gdXNhciBjb250ZW5pZG8gZ2xvYmFsIHkgZXNwZWPDrWZpY28gZGVsIGNvbXBvbmVudGUgZGUgbWFuZXJhIGNvbmp1bnRhLicsXG4gICAgZW46ICdUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBnbG9iYWwgYW5kIGNvbXBvbmVudC1zcGVjaWZpYyBjb250ZW50IHRvZ2V0aGVyLicsXG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgVGV4dENvbnRlbnQoZ2xvYmFsQ29udGVudEV4YW1wbGVEYXRhKTtcbiJdfQ==
|