valtech-components 2.0.1015 → 2.0.1016

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.
@@ -54,7 +54,7 @@ import 'prismjs/components/prism-json';
54
54
  * Current version of valtech-components.
55
55
  * This is automatically updated during the publish process.
56
56
  */
57
- const VERSION = '2.0.1015';
57
+ const VERSION = '2.0.1016';
58
58
 
59
59
  // Control de estado de refresco (singleton a nivel de módulo)
60
60
  let isRefreshing = false;
@@ -46129,6 +46129,12 @@ class OrgInfoSheetComponent {
46129
46129
  this.body = '';
46130
46130
  /** Label del botón cerrar (resuelto por el consumer). Fallback al namespace propio. */
46131
46131
  this.closeLabel = '';
46132
+ /**
46133
+ * Muestra las 3 feature-cards de organizaciones (colaboración / cambio rápido /
46134
+ * invitaciones). `false` → sheet article-style (solo título + subtítulo + cuerpo),
46135
+ * reusable como explainer genérico (ej. integraciones / API keys). Default `true`.
46136
+ */
46137
+ this.showFeatures = true;
46132
46138
  /** Props del botón cerrar del footer (el consumer puede pasar custom). */
46133
46139
  this.closeProps = {
46134
46140
  text: 'Cerrar',
@@ -46158,7 +46164,7 @@ class OrgInfoSheetComponent {
46158
46164
  return this.i18n.t(key, DEFAULT_NAMESPACE$d);
46159
46165
  }
46160
46166
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrgInfoSheetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
46161
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: OrgInfoSheetComponent, isStandalone: true, selector: "val-org-info-sheet", inputs: { title: "title", subtitle: "subtitle", body: "body", closeLabel: "closeLabel", closeProps: "closeProps", _modalRef: "_modalRef" }, ngImport: i0, template: `
46167
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: OrgInfoSheetComponent, isStandalone: true, selector: "val-org-info-sheet", inputs: { title: "title", subtitle: "subtitle", body: "body", closeLabel: "closeLabel", showFeatures: "showFeatures", closeProps: "closeProps", _modalRef: "_modalRef" }, ngImport: i0, template: `
46162
46168
  <ion-header>
46163
46169
  <ion-toolbar>
46164
46170
  <ion-buttons slot="end">
@@ -46173,29 +46179,31 @@ class OrgInfoSheetComponent {
46173
46179
  <val-display [props]="{ content: resolvedTitle(), size: 'small', color: 'dark' }" />
46174
46180
  <val-title [props]="{ content: resolvedSubtitle(), size: 'large', color: '', bold: false }" />
46175
46181
 
46176
- <div class="info-features">
46177
- <div class="info-feature">
46178
- <ion-icon name="people-outline" class="info-feature__icon" />
46179
- <div>
46180
- <div class="info-feature__title">{{ tt('featureCollabTitle') }}</div>
46181
- <div class="info-feature__desc">{{ tt('featureCollabDesc') }}</div>
46182
+ @if (showFeatures) {
46183
+ <div class="info-features">
46184
+ <div class="info-feature">
46185
+ <ion-icon name="people-outline" class="info-feature__icon" />
46186
+ <div>
46187
+ <div class="info-feature__title">{{ tt('featureCollabTitle') }}</div>
46188
+ <div class="info-feature__desc">{{ tt('featureCollabDesc') }}</div>
46189
+ </div>
46182
46190
  </div>
46183
- </div>
46184
- <div class="info-feature">
46185
- <ion-icon name="swap-horizontal-outline" class="info-feature__icon" />
46186
- <div>
46187
- <div class="info-feature__title">{{ tt('featureSwitchTitle') }}</div>
46188
- <div class="info-feature__desc">{{ tt('featureSwitchDesc') }}</div>
46191
+ <div class="info-feature">
46192
+ <ion-icon name="swap-horizontal-outline" class="info-feature__icon" />
46193
+ <div>
46194
+ <div class="info-feature__title">{{ tt('featureSwitchTitle') }}</div>
46195
+ <div class="info-feature__desc">{{ tt('featureSwitchDesc') }}</div>
46196
+ </div>
46189
46197
  </div>
46190
- </div>
46191
- <div class="info-feature">
46192
- <ion-icon name="mail-outline" class="info-feature__icon" />
46193
- <div>
46194
- <div class="info-feature__title">{{ tt('featureInviteTitle') }}</div>
46195
- <div class="info-feature__desc">{{ tt('featureInviteDesc') }}</div>
46198
+ <div class="info-feature">
46199
+ <ion-icon name="mail-outline" class="info-feature__icon" />
46200
+ <div>
46201
+ <div class="info-feature__title">{{ tt('featureInviteTitle') }}</div>
46202
+ <div class="info-feature__desc">{{ tt('featureInviteDesc') }}</div>
46203
+ </div>
46196
46204
  </div>
46197
46205
  </div>
46198
- </div>
46206
+ }
46199
46207
 
46200
46208
  @for (para of paragraphs(); track $index) {
46201
46209
  <val-text
@@ -46242,29 +46250,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
46242
46250
  <val-display [props]="{ content: resolvedTitle(), size: 'small', color: 'dark' }" />
46243
46251
  <val-title [props]="{ content: resolvedSubtitle(), size: 'large', color: '', bold: false }" />
46244
46252
 
46245
- <div class="info-features">
46246
- <div class="info-feature">
46247
- <ion-icon name="people-outline" class="info-feature__icon" />
46248
- <div>
46249
- <div class="info-feature__title">{{ tt('featureCollabTitle') }}</div>
46250
- <div class="info-feature__desc">{{ tt('featureCollabDesc') }}</div>
46253
+ @if (showFeatures) {
46254
+ <div class="info-features">
46255
+ <div class="info-feature">
46256
+ <ion-icon name="people-outline" class="info-feature__icon" />
46257
+ <div>
46258
+ <div class="info-feature__title">{{ tt('featureCollabTitle') }}</div>
46259
+ <div class="info-feature__desc">{{ tt('featureCollabDesc') }}</div>
46260
+ </div>
46251
46261
  </div>
46252
- </div>
46253
- <div class="info-feature">
46254
- <ion-icon name="swap-horizontal-outline" class="info-feature__icon" />
46255
- <div>
46256
- <div class="info-feature__title">{{ tt('featureSwitchTitle') }}</div>
46257
- <div class="info-feature__desc">{{ tt('featureSwitchDesc') }}</div>
46262
+ <div class="info-feature">
46263
+ <ion-icon name="swap-horizontal-outline" class="info-feature__icon" />
46264
+ <div>
46265
+ <div class="info-feature__title">{{ tt('featureSwitchTitle') }}</div>
46266
+ <div class="info-feature__desc">{{ tt('featureSwitchDesc') }}</div>
46267
+ </div>
46258
46268
  </div>
46259
- </div>
46260
- <div class="info-feature">
46261
- <ion-icon name="mail-outline" class="info-feature__icon" />
46262
- <div>
46263
- <div class="info-feature__title">{{ tt('featureInviteTitle') }}</div>
46264
- <div class="info-feature__desc">{{ tt('featureInviteDesc') }}</div>
46269
+ <div class="info-feature">
46270
+ <ion-icon name="mail-outline" class="info-feature__icon" />
46271
+ <div>
46272
+ <div class="info-feature__title">{{ tt('featureInviteTitle') }}</div>
46273
+ <div class="info-feature__desc">{{ tt('featureInviteDesc') }}</div>
46274
+ </div>
46265
46275
  </div>
46266
46276
  </div>
46267
- </div>
46277
+ }
46268
46278
 
46269
46279
  @for (para of paragraphs(); track $index) {
46270
46280
  <val-text
@@ -46290,6 +46300,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
46290
46300
  type: Input
46291
46301
  }], closeLabel: [{
46292
46302
  type: Input
46303
+ }], showFeatures: [{
46304
+ type: Input
46293
46305
  }], closeProps: [{
46294
46306
  type: Input
46295
46307
  }], _modalRef: [{
@@ -49823,7 +49835,11 @@ const ORGANIZATION_VIEW_I18N = {
49823
49835
  apiKeysSectionTitle: 'Integraciones (API Keys)',
49824
49836
  apiKeysSectionHint: 'También puedes operar tu organización vía API: crea una Client API Key org-scopeada para integraciones máquina-a-máquina (por ejemplo, dar de alta miembros en masa desde tu propio sistema).',
49825
49837
  apiKeysMoreInfo: 'Más información',
49826
- orgsMoreInfo: 'Más información',
49838
+ apiKeysInfoTitle: 'Integraciones por API',
49839
+ apiKeysInfoSubtitle: 'Opera tu organización máquina-a-máquina',
49840
+ apiKeysInfoContent: 'Una API Key te permite operar tu organización desde tus propios sistemas, sin entrar a la app: dar de alta usuarios, asignar roles, leer datos y automatizar flujos.\n\nCada key es org-scopeada y lleva solo los permisos que le asignes — concede el mínimo necesario. Puedes revocarla en cualquier momento.\n\nEl secreto se muestra una sola vez al crearla: guárdalo en un lugar seguro. Si lo pierdes, genera una nueva key y revoca la anterior.',
49841
+ apiKeysInfoClose: 'Entendido',
49842
+ orgsMoreInfo: 'Aprender más sobre organizaciones',
49827
49843
  orgsInfoTitle: '¿Qué son las organizaciones?',
49828
49844
  orgsInfoSubtitle: 'Todo lo que necesitas saber',
49829
49845
  orgsInfoClose: 'Cerrar',
@@ -49902,7 +49918,11 @@ const ORGANIZATION_VIEW_I18N = {
49902
49918
  apiKeysSectionTitle: 'Integrations (API Keys)',
49903
49919
  apiKeysSectionHint: 'You can also operate your organization via API: create an org-scoped Client API Key for machine-to-machine integrations (for example, bulk-provisioning members from your own system).',
49904
49920
  apiKeysMoreInfo: 'More information',
49905
- orgsMoreInfo: 'More information',
49921
+ apiKeysInfoTitle: 'API integrations',
49922
+ apiKeysInfoSubtitle: 'Operate your organization machine-to-machine',
49923
+ apiKeysInfoContent: 'An API Key lets you operate your organization from your own systems, without opening the app: provision users, assign roles, read data, and automate flows.\n\nEach key is org-scoped and carries only the permissions you assign — grant the minimum needed. You can revoke it at any time.\n\nThe secret is shown only once at creation: store it somewhere safe. If you lose it, create a new key and revoke the old one.',
49924
+ apiKeysInfoClose: 'Got it',
49925
+ orgsMoreInfo: 'Learn more about organizations',
49906
49926
  orgsInfoTitle: 'What are organizations?',
49907
49927
  orgsInfoSubtitle: 'Everything you need to know',
49908
49928
  orgsInfoClose: 'Close',
@@ -50291,6 +50311,31 @@ class OrganizationViewComponent {
50291
50311
  backdropDismiss: true,
50292
50312
  });
50293
50313
  }
50314
+ // "Más información" de la sección Integraciones — abre un sheet EXPLICATIVO
50315
+ // (article-style, sin las feature-cards de org), NO el modal de gestión de API
50316
+ // keys. La gestión se abre con el botón "Gestionar" (onOpenApiKeys).
50317
+ onApiKeysInfo() {
50318
+ void this.modalService.open({
50319
+ component: OrgInfoSheetComponent,
50320
+ componentProps: {
50321
+ showFeatures: false,
50322
+ title: this.tt('apiKeysInfoTitle'),
50323
+ subtitle: this.tt('apiKeysInfoSubtitle'),
50324
+ body: this.tt('apiKeysInfoContent'),
50325
+ closeLabel: this.tt('apiKeysInfoClose'),
50326
+ closeProps: {
50327
+ text: this.tt('apiKeysInfoClose'),
50328
+ fill: 'outline',
50329
+ color: 'dark',
50330
+ size: 'default',
50331
+ expand: 'block',
50332
+ type: 'button',
50333
+ },
50334
+ },
50335
+ breakpoints: { breakpoints: [0, 0.85], initialBreakpoint: 0.85, showHandle: true },
50336
+ backdropDismiss: true,
50337
+ });
50338
+ }
50294
50339
  onViewPermissions() {
50295
50340
  this.nav.navigateByUrl(this.resolvedConfig().viewPermissionsRoute);
50296
50341
  }
@@ -50517,6 +50562,11 @@ class OrganizationViewComponent {
50517
50562
  content: pageDescription(),
50518
50563
  }"
50519
50564
  />
50565
+ <!-- "Aprender más sobre organizaciones" — bajo el título+subtítulo
50566
+ principal de la vista (abre el explainer org-info-sheet). -->
50567
+ <button class="org-more-info-link" type="button" (click)="onOrgInfo()">
50568
+ {{ tt('orgsMoreInfo') }}
50569
+ </button>
50520
50570
  </header>
50521
50571
 
50522
50572
  @if (resolvedConfig().showInfo) {
@@ -50536,12 +50586,6 @@ class OrganizationViewComponent {
50536
50586
  }
50537
50587
  </div>
50538
50588
 
50539
- <!-- "Más información" sobre organizaciones — disponible siempre (todo
50540
- user tiene org por defecto y no ve el empty-state de account). -->
50541
- <button class="org-more-info-link" type="button" (click)="onOrgInfo()">
50542
- {{ tt('orgsMoreInfo') }}
50543
- </button>
50544
-
50545
50589
  <div class="section-body">
50546
50590
  @if (loading()) {
50547
50591
  <val-skeleton-layout [props]="{ preset: 'detail', rows: 4 }" />
@@ -50694,7 +50738,7 @@ class OrganizationViewComponent {
50694
50738
  <div class="invite-cta__text">
50695
50739
  <val-title [props]="{ size: 'medium', color: 'dark', bold: true, content: tt('apiKeysSectionTitle') }" />
50696
50740
  <val-text [props]="{ size: 'medium', color: 'dark', bold: false, content: tt('apiKeysSectionHint') }" />
50697
- <button class="org-more-info-link" type="button" (click)="onOpenApiKeys()">
50741
+ <button class="org-more-info-link" type="button" (click)="onApiKeysInfo()">
50698
50742
  {{ tt('apiKeysMoreInfo') }}
50699
50743
  </button>
50700
50744
  </div>
@@ -50821,6 +50865,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
50821
50865
  content: pageDescription(),
50822
50866
  }"
50823
50867
  />
50868
+ <!-- "Aprender más sobre organizaciones" — bajo el título+subtítulo
50869
+ principal de la vista (abre el explainer org-info-sheet). -->
50870
+ <button class="org-more-info-link" type="button" (click)="onOrgInfo()">
50871
+ {{ tt('orgsMoreInfo') }}
50872
+ </button>
50824
50873
  </header>
50825
50874
 
50826
50875
  @if (resolvedConfig().showInfo) {
@@ -50840,12 +50889,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
50840
50889
  }
50841
50890
  </div>
50842
50891
 
50843
- <!-- "Más información" sobre organizaciones — disponible siempre (todo
50844
- user tiene org por defecto y no ve el empty-state de account). -->
50845
- <button class="org-more-info-link" type="button" (click)="onOrgInfo()">
50846
- {{ tt('orgsMoreInfo') }}
50847
- </button>
50848
-
50849
50892
  <div class="section-body">
50850
50893
  @if (loading()) {
50851
50894
  <val-skeleton-layout [props]="{ preset: 'detail', rows: 4 }" />
@@ -50998,7 +51041,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
50998
51041
  <div class="invite-cta__text">
50999
51042
  <val-title [props]="{ size: 'medium', color: 'dark', bold: true, content: tt('apiKeysSectionTitle') }" />
51000
51043
  <val-text [props]="{ size: 'medium', color: 'dark', bold: false, content: tt('apiKeysSectionHint') }" />
51001
- <button class="org-more-info-link" type="button" (click)="onOpenApiKeys()">
51044
+ <button class="org-more-info-link" type="button" (click)="onApiKeysInfo()">
51002
51045
  {{ tt('apiKeysMoreInfo') }}
51003
51046
  </button>
51004
51047
  </div>
@@ -53913,6 +53956,11 @@ addIcons({
53913
53956
  const DEFAULT_NAMESPACE = 'Settings.About';
53914
53957
  const DEFAULT_BRAND_NAME = 'Valtech';
53915
53958
  const DEFAULT_LOGO_SRC = 'assets/images/main-icon.png';
53959
+ // Por default el HERO usa la CSS var de marca del factory (`--main-logo-mini`),
53960
+ // que cada app define en su `theme/variables.scss` (theme-aware). Si la app no
53961
+ // la define, el `var(...)` cae al `logoSrc` (ver template). El consumer puede
53962
+ // pasar `brand.logoVar: ''` para forzar el `<img src=logoSrc>` clásico.
53963
+ const DEFAULT_LOGO_VAR = '--main-logo-mini';
53916
53964
  const DEFAULT_RATING_ENTITY_ID = 'experience';
53917
53965
  /**
53918
53966
  * `val-about-view` — vista About full-feature autocontenida (organism).
@@ -53961,7 +54009,7 @@ class AboutViewComponent {
53961
54009
  brand: {
53962
54010
  name: merged.brand?.name ?? DEFAULT_BRAND_NAME,
53963
54011
  logoSrc: merged.brand?.logoSrc ?? DEFAULT_LOGO_SRC,
53964
- logoVar: merged.brand?.logoVar ?? '',
54012
+ logoVar: merged.brand?.logoVar ?? DEFAULT_LOGO_VAR,
53965
54013
  },
53966
54014
  version: merged.version ?? '',
53967
54015
  socialLinks: merged.socialLinks ?? [],
@@ -54103,7 +54151,7 @@ class AboutViewComponent {
54103
54151
  class="about-hero__logo about-hero__logo--var"
54104
54152
  role="img"
54105
54153
  [attr.aria-label]="brandName()"
54106
- [style.background-image]="'var(' + logoVar() + ')'"
54154
+ [style.background-image]="'var(' + logoVar() + ', url(' + logoSrc() + '))'"
54107
54155
  ></div>
54108
54156
  } @else {
54109
54157
  <img class="about-hero__logo" [src]="logoSrc()" [alt]="brandName()" />
@@ -54225,7 +54273,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
54225
54273
  class="about-hero__logo about-hero__logo--var"
54226
54274
  role="img"
54227
54275
  [attr.aria-label]="brandName()"
54228
- [style.background-image]="'var(' + logoVar() + ')'"
54276
+ [style.background-image]="'var(' + logoVar() + ', url(' + logoSrc() + '))'"
54229
54277
  ></div>
54230
54278
  } @else {
54231
54279
  <img class="about-hero__logo" [src]="logoSrc()" [alt]="brandName()" />