valtech-components 4.0.216 → 4.0.218

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.
@@ -50105,28 +50105,6 @@ class AccountViewComponent {
50105
50105
  onAccountDeleted: merged.onAccountDeleted,
50106
50106
  };
50107
50107
  });
50108
- this.orgs = signal([]);
50109
- this.orgsLoading = signal(false);
50110
- this.orgsError = signal(null);
50111
- this.orgsErrorState = computed(() => {
50112
- this.i18n.lang();
50113
- const err = this.orgsError();
50114
- if (!err)
50115
- return null;
50116
- return createErrorStateProps(err, {
50117
- title: {
50118
- offline: this.tt('orgsOfflineTitle'),
50119
- error: this.tt('orgsErrorTitle'),
50120
- },
50121
- description: {
50122
- offline: this.tt('orgsOfflineHint'),
50123
- error: this.tt('orgsErrorHint'),
50124
- },
50125
- retryLabel: this.tt('orgsRetry'),
50126
- onRetry: () => this.loadOrgs(),
50127
- retrying: this.orgsLoading(),
50128
- });
50129
- });
50130
50108
  this.createOrgOpen = signal(false);
50131
50109
  this.deleteAccountOpen = signal(false);
50132
50110
  this.activeOrgLogoFailed = signal(false);
@@ -50170,14 +50148,13 @@ class AccountViewComponent {
50170
50148
  this.dangerDeleteHint = computed(() => this.tt('dangerDeleteHint'));
50171
50149
  this.activeOrgId = computed(() => {
50172
50150
  const u = this.auth.user();
50173
- const explicit = u?.activeOrgId ?? u?.activeOrg;
50174
- return explicit || this.orgs()[0]?.id || '';
50151
+ return u?.activeOrgId ?? u?.activeOrg ?? '';
50175
50152
  });
50176
50153
  this.activeOrgRole = computed(() => {
50177
50154
  const roles = this.auth.roles?.() ?? [];
50178
50155
  return roles[0] ?? null;
50179
50156
  });
50180
- this.activeOrg = computed(() => this.orgs().find(o => o.id === this.activeOrgId()) ?? this.orgs()[0] ?? null);
50157
+ this.activeOrg = signal(null);
50181
50158
  this.logoutButtonProps = computed(() => ({
50182
50159
  text: this.tt('logout'),
50183
50160
  color: 'dark',
@@ -50199,11 +50176,23 @@ class AccountViewComponent {
50199
50176
  const ns = this.ns;
50200
50177
  this.i18n.registerDefaults(ns, ACCOUNT_VIEW_I18N);
50201
50178
  this.nav.setBackHeader('pageTitle', ns, { withMenu: true });
50202
- this.loadOrgs();
50203
50179
  this.loadPendingInvites();
50204
- connectPageRefresh(async () => {
50205
- await Promise.all([this.loadOrgs(), this.loadPendingInvites()]);
50180
+ effect(() => {
50181
+ const orgId = this.activeOrgId();
50182
+ if (!orgId) {
50183
+ this.activeOrg.set(null);
50184
+ return;
50185
+ }
50186
+ this.activeOrgLogoFailed.set(false);
50187
+ this.orgService
50188
+ .getOrg(orgId)
50189
+ .pipe(take(1))
50190
+ .subscribe({
50191
+ next: org => this.activeOrg.set(org),
50192
+ error: () => this.activeOrg.set(null),
50193
+ });
50206
50194
  });
50195
+ connectPageRefresh(() => this.loadPendingInvites());
50207
50196
  }
50208
50197
  orgTypeLabel(type) {
50209
50198
  const map = {
@@ -50225,7 +50214,6 @@ class AccountViewComponent {
50225
50214
  this.createOrgOpen.set(true);
50226
50215
  }
50227
50216
  onOrgCreated(newOrg) {
50228
- this.loadOrgs();
50229
50217
  this.resolvedConfig().onOrgCreated?.(newOrg);
50230
50218
  }
50231
50219
  onMoreInfo() {
@@ -50291,7 +50279,6 @@ class AccountViewComponent {
50291
50279
  duration: 3500,
50292
50280
  });
50293
50281
  this.pendingInvites.update(list => list.filter(i => i.orgId !== invite.orgId));
50294
- this.loadOrgs();
50295
50282
  },
50296
50283
  error: err => {
50297
50284
  this.errors.handle(err, { context: 'account.acceptPendingInvite' });
@@ -50323,26 +50310,6 @@ class AccountViewComponent {
50323
50310
  complete: () => this.inviteAccepting.set(null),
50324
50311
  });
50325
50312
  }
50326
- loadOrgs() {
50327
- this.orgsLoading.set(true);
50328
- this.orgsError.set(null);
50329
- return new Promise(resolve => {
50330
- this.orgService.listMyOrgs().subscribe({
50331
- next: orgs => {
50332
- const activeId = this.activeOrgId();
50333
- this.orgs.set([...orgs].sort((a, b) => (a.id === activeId ? -1 : b.id === activeId ? 1 : 0)));
50334
- this.activeOrgLogoFailed.set(false);
50335
- this.orgsLoading.set(false);
50336
- resolve();
50337
- },
50338
- error: err => {
50339
- this.orgsError.set(err);
50340
- this.orgsLoading.set(false);
50341
- resolve();
50342
- },
50343
- });
50344
- });
50345
- }
50346
50313
  tt(key) {
50347
50314
  return this.i18n.t(key, this.ns);
50348
50315
  }
@@ -50402,66 +50369,59 @@ class AccountViewComponent {
50402
50369
  />
50403
50370
  </div>
50404
50371
  <div class="section-body">
50405
- @if (orgsLoading()) {
50406
- <val-skeleton-layout [props]="{ preset: 'list', rows: 3 }" />
50407
- } @else if (orgsErrorState()) {
50408
- <val-empty-state [props]="orgsErrorState()!" />
50409
- } @else {
50410
- @if (activeOrg(); as org) {
50411
- <div class="orgs-list">
50412
- <div class="org-card org-card--active">
50413
- <div class="org-card__icon">
50414
- @if (activeOrg()?.logoUrl && !activeOrgLogoFailed()) {
50415
- <img
50416
- [src]="activeOrg()!.logoUrl!"
50417
- [alt]="activeOrg()?.name ?? ''"
50418
- (error)="activeOrgLogoFailed.set(true)"
50419
- />
50420
- } @else {
50421
- <ion-icon name="business-outline" />
50422
- }
50423
- </div>
50424
- <div class="org-card__body">
50425
- <span class="org-card__name">{{ org.name }}</span>
50426
- <div class="org-card__meta">
50427
- <span class="org-card__meta-item">
50428
- <span class="org-card__meta-label">{{ tt('orgsLabelType') }}</span>
50429
- {{ orgTypeLabel(org.type) }}
50430
- </span>
50431
- @if (activeOrgRole()) {
50432
- <span class="org-card__meta-item">
50433
- <span class="org-card__meta-label">{{ tt('orgsLabelRole') }}</span>
50434
- {{ activeOrgRole() | titlecase }}
50435
- </span>
50436
- }
50372
+ @if (activeOrg(); as org) {
50373
+ <div class="orgs-list">
50374
+ <div class="org-card org-card--active">
50375
+ <div class="org-card__icon">
50376
+ @if (activeOrg()?.logoUrl && !activeOrgLogoFailed()) {
50377
+ <img
50378
+ [src]="activeOrg()!.logoUrl!"
50379
+ [alt]="activeOrg()?.name ?? ''"
50380
+ (error)="activeOrgLogoFailed.set(true)"
50381
+ />
50382
+ } @else {
50383
+ <ion-icon name="business-outline" />
50384
+ }
50385
+ </div>
50386
+ <div class="org-card__body">
50387
+ <span class="org-card__name">{{ org.name }}</span>
50388
+ <div class="org-card__meta">
50389
+ <span class="org-card__meta-item">
50390
+ <span class="org-card__meta-label">{{ tt('orgsLabelType') }}</span>
50391
+ {{ orgTypeLabel(org.type) }}
50392
+ </span>
50393
+ @if (activeOrgRole()) {
50437
50394
  <span class="org-card__meta-item">
50438
- <span class="org-card__meta-label">{{ tt('orgsLabelStatus') }}</span>
50439
- {{ tt('orgsStatusActive') }}
50395
+ <span class="org-card__meta-label">{{ tt('orgsLabelRole') }}</span>
50396
+ {{ activeOrgRole() | titlecase }}
50440
50397
  </span>
50441
- </div>
50442
- </div>
50443
- <div class="org-card__end">
50444
- <ion-button fill="outline" color="dark" shape="round" size="small" (click)="onManageOrg()">
50445
- {{ tt('orgsManage') }}
50446
- </ion-button>
50398
+ }
50399
+ <span class="org-card__meta-item">
50400
+ <span class="org-card__meta-label">{{ tt('orgsLabelStatus') }}</span>
50401
+ {{ tt('orgsStatusActive') }}
50402
+ </span>
50447
50403
  </div>
50448
50404
  </div>
50449
- </div>
50450
- } @else if (orgs().length === 0) {
50451
- <div class="orgs-empty-card">
50452
- <div class="orgs-empty-card__main">
50453
- <ion-icon name="people-outline" class="orgs-empty-card__icon" />
50454
- <span class="orgs-empty-card__text">{{ orgsEmpty() }}</span>
50405
+ <div class="org-card__end">
50406
+ <ion-button fill="outline" color="dark" shape="round" size="small" (click)="onManageOrg()">
50407
+ {{ tt('orgsManage') }}
50408
+ </ion-button>
50455
50409
  </div>
50456
- <button class="orgs-empty-card__link" (click)="onMoreInfo()">
50457
- {{ orgsMoreInfo() }}
50458
- </button>
50459
50410
  </div>
50460
- }
50461
- @if (resolvedConfig().showNewOrgCta) {
50462
- <!-- Nueva organizacion: CTA card con titulo, subtitulo y boton -->
50463
- <val-cta-card class="org-new-cta-card" [props]="newOrgCtaProps()" (onAction)="onNewOrg()" />
50464
- }
50411
+ </div>
50412
+ } @else if (!activeOrgId()) {
50413
+ <div class="orgs-empty-card">
50414
+ <div class="orgs-empty-card__main">
50415
+ <ion-icon name="people-outline" class="orgs-empty-card__icon" />
50416
+ <span class="orgs-empty-card__text">{{ orgsEmpty() }}</span>
50417
+ </div>
50418
+ <button class="orgs-empty-card__link" (click)="onMoreInfo()">
50419
+ {{ orgsMoreInfo() }}
50420
+ </button>
50421
+ </div>
50422
+ }
50423
+ @if (resolvedConfig().showNewOrgCta) {
50424
+ <val-cta-card class="org-new-cta-card" [props]="newOrgCtaProps()" (onAction)="onNewOrg()" />
50465
50425
  }
50466
50426
  </div>
50467
50427
  </section>
@@ -50528,14 +50488,12 @@ class AccountViewComponent {
50528
50488
  (dismissed)="deleteAccountOpen.set(false)"
50529
50489
  />
50530
50490
  </div>
50531
- `, isInline: true, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.page-header{margin-bottom:16px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.settings-section val-title{display:block;margin-bottom:12px}.section-body{display:flex;flex-direction:column;gap:10px}.row-actions{margin-top:12px}.row-actions--gap{display:flex;flex-wrap:wrap;gap:8px}.section-header-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.org-new-cta-card{display:block;margin-top:12px}.orgs-empty-card{background:var(--ion-color-secondary-tint, rgba(var(--ion-color-secondary-rgb, 130, 101, 208), .2));border-radius:18px;padding:18px 16px 12px;display:flex;flex-direction:column;gap:8px}.orgs-empty-card__main{display:flex;align-items:center;gap:10px}.orgs-empty-card__icon{font-size:20px;flex-shrink:0;color:var(--ion-color-dark)}.orgs-empty-card__text{font-size:.875rem;color:var(--ion-color-dark)}.orgs-empty-card__link{background:none;border:none;padding:0;cursor:pointer;font-size:.8125rem;color:var(--ion-color-primary);text-align:left;text-decoration:underline;text-underline-offset:2px;font-family:inherit}.orgs-list{display:flex;flex-direction:column;gap:8px}.org-card{display:flex;align-items:center;gap:14px;padding:14px 16px;border-radius:12px;background:var(--ion-color-light, #f4f5f8);border:1.5px solid transparent;cursor:pointer;transition:background .15s,border-color .15s}.org-card:active{opacity:.75}.org-card--active{border-color:var(--ion-color-primary);background:color-mix(in srgb,var(--ion-color-primary) 8%,transparent)}:host-context(body.dark) .org-card,:host-context(html.ion-palette-dark) .org-card,:host-context([data-theme=\"dark\"]) .org-card{background:#ffffff0d}:host-context(body.dark) .org-card--active,:host-context(html.ion-palette-dark) .org-card--active,:host-context([data-theme=\"dark\"]) .org-card--active{background:color-mix(in srgb,var(--ion-color-primary) 15%,transparent)}.org-card__icon{width:40px;height:40px;border-radius:50%;background:color-mix(in srgb,var(--ion-color-primary) 15%,transparent);display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:20px;color:var(--ion-color-primary);overflow:hidden;img{width:100%;height:100%;object-fit:cover;border-radius:50%}}.org-card__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.org-card__name{font-weight:600;font-size:.95rem;color:var(--ion-color-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.org-card__meta{display:flex;flex-direction:column;gap:1px;margin-top:3px}.org-card__meta-item{font-size:.78rem;color:var(--ion-color-dark)}.org-card__meta-label{font-weight:600;color:var(--ion-color-dark);margin-right:4px}.org-card__end{display:flex;align-items:center;gap:8px;flex-shrink:0}.section-title-danger{display:flex;align-items:center;gap:8px;margin-bottom:12px}.section-title-danger val-title{display:block;margin:0}.danger-icon{display:block;font-size:1.125rem;color:var(--ion-color-warning-shade, #d4a017);flex-shrink:0}.settings-section--danger{background:color-mix(in srgb,var(--ion-color-danger) 4%,transparent);border-radius:14px;padding:16px;margin:0 -4px}:host-context(body.dark) .settings-section--danger,:host-context(html.ion-palette-dark) .settings-section--danger,:host-context([data-theme=\"dark\"]) .settings-section--danger{background:color-mix(in srgb,var(--ion-color-danger) 8%,transparent)}\n"], dependencies: [{ kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: SkeletonLayoutComponent, selector: "val-skeleton-layout", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: CtaCardComponent, selector: "val-cta-card", inputs: ["props"], outputs: ["onAction"] }, { kind: "component", type: InvitationCardComponent, selector: "val-invitation-card", inputs: ["props"], outputs: ["onAccept", "onDecline"] }, { kind: "component", type: CreateOrgModalComponent, selector: "val-create-org-modal", inputs: ["i18nNamespace", "isOpen"], outputs: ["dismissed", "created"] }, { kind: "component", type: DeleteAccountModalComponent, selector: "val-delete-account-modal", inputs: ["i18nNamespace", "isOpen"], outputs: ["dismissed"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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: "pipe", type: TitleCasePipe, name: "titlecase" }] }); }
50491
+ `, isInline: true, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.page-header{margin-bottom:16px}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.settings-section val-title{display:block;margin-bottom:12px}.section-body{display:flex;flex-direction:column;gap:10px}.row-actions{margin-top:12px}.row-actions--gap{display:flex;flex-wrap:wrap;gap:8px}.section-header-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.org-new-cta-card{display:block;margin-top:12px}.orgs-empty-card{background:var(--ion-color-secondary-tint, rgba(var(--ion-color-secondary-rgb, 130, 101, 208), .2));border-radius:18px;padding:18px 16px 12px;display:flex;flex-direction:column;gap:8px}.orgs-empty-card__main{display:flex;align-items:center;gap:10px}.orgs-empty-card__icon{font-size:20px;flex-shrink:0;color:var(--ion-color-dark)}.orgs-empty-card__text{font-size:.875rem;color:var(--ion-color-dark)}.orgs-empty-card__link{background:none;border:none;padding:0;cursor:pointer;font-size:.8125rem;color:var(--ion-color-primary);text-align:left;text-decoration:underline;text-underline-offset:2px;font-family:inherit}.orgs-list{display:flex;flex-direction:column;gap:8px}.org-card{display:flex;align-items:center;gap:14px;padding:14px 16px;border-radius:12px;background:var(--ion-color-light, #f4f5f8);border:1.5px solid transparent;cursor:pointer;transition:background .15s,border-color .15s}.org-card:active{opacity:.75}.org-card--active{border-color:var(--ion-color-primary);background:color-mix(in srgb,var(--ion-color-primary) 8%,transparent)}:host-context(body.dark) .org-card,:host-context(html.ion-palette-dark) .org-card,:host-context([data-theme=\"dark\"]) .org-card{background:#ffffff0d}:host-context(body.dark) .org-card--active,:host-context(html.ion-palette-dark) .org-card--active,:host-context([data-theme=\"dark\"]) .org-card--active{background:color-mix(in srgb,var(--ion-color-primary) 15%,transparent)}.org-card__icon{width:40px;height:40px;border-radius:50%;background:color-mix(in srgb,var(--ion-color-primary) 15%,transparent);display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:20px;color:var(--ion-color-primary);overflow:hidden;img{width:100%;height:100%;object-fit:cover;border-radius:50%}}.org-card__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.org-card__name{font-weight:600;font-size:.95rem;color:var(--ion-color-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.org-card__meta{display:flex;flex-direction:column;gap:1px;margin-top:3px}.org-card__meta-item{font-size:.78rem;color:var(--ion-color-dark)}.org-card__meta-label{font-weight:600;color:var(--ion-color-dark);margin-right:4px}.org-card__end{display:flex;align-items:center;gap:8px;flex-shrink:0}.section-title-danger{display:flex;align-items:center;gap:8px;margin-bottom:12px}.section-title-danger val-title{display:block;margin:0}.danger-icon{display:block;font-size:1.125rem;color:var(--ion-color-warning-shade, #d4a017);flex-shrink:0}.settings-section--danger{background:color-mix(in srgb,var(--ion-color-danger) 4%,transparent);border-radius:14px;padding:16px;margin:0 -4px}:host-context(body.dark) .settings-section--danger,:host-context(html.ion-palette-dark) .settings-section--danger,:host-context([data-theme=\"dark\"]) .settings-section--danger{background:color-mix(in srgb,var(--ion-color-danger) 8%,transparent)}\n"], dependencies: [{ kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: CtaCardComponent, selector: "val-cta-card", inputs: ["props"], outputs: ["onAction"] }, { kind: "component", type: InvitationCardComponent, selector: "val-invitation-card", inputs: ["props"], outputs: ["onAccept", "onDecline"] }, { kind: "component", type: CreateOrgModalComponent, selector: "val-create-org-modal", inputs: ["i18nNamespace", "isOpen"], outputs: ["dismissed", "created"] }, { kind: "component", type: DeleteAccountModalComponent, selector: "val-delete-account-modal", inputs: ["i18nNamespace", "isOpen"], outputs: ["dismissed"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { 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: "pipe", type: TitleCasePipe, name: "titlecase" }] }); }
50532
50492
  }
50533
50493
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AccountViewComponent, decorators: [{
50534
50494
  type: Component,
50535
50495
  args: [{ selector: 'val-account-view', standalone: true, imports: [
50536
50496
  DisplayComponent,
50537
- EmptyStateComponent,
50538
- SkeletonLayoutComponent,
50539
50497
  TitleComponent,
50540
50498
  TextComponent,
50541
50499
  ButtonComponent,
@@ -50601,66 +50559,59 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
50601
50559
  />
50602
50560
  </div>
50603
50561
  <div class="section-body">
50604
- @if (orgsLoading()) {
50605
- <val-skeleton-layout [props]="{ preset: 'list', rows: 3 }" />
50606
- } @else if (orgsErrorState()) {
50607
- <val-empty-state [props]="orgsErrorState()!" />
50608
- } @else {
50609
- @if (activeOrg(); as org) {
50610
- <div class="orgs-list">
50611
- <div class="org-card org-card--active">
50612
- <div class="org-card__icon">
50613
- @if (activeOrg()?.logoUrl && !activeOrgLogoFailed()) {
50614
- <img
50615
- [src]="activeOrg()!.logoUrl!"
50616
- [alt]="activeOrg()?.name ?? ''"
50617
- (error)="activeOrgLogoFailed.set(true)"
50618
- />
50619
- } @else {
50620
- <ion-icon name="business-outline" />
50621
- }
50622
- </div>
50623
- <div class="org-card__body">
50624
- <span class="org-card__name">{{ org.name }}</span>
50625
- <div class="org-card__meta">
50626
- <span class="org-card__meta-item">
50627
- <span class="org-card__meta-label">{{ tt('orgsLabelType') }}</span>
50628
- {{ orgTypeLabel(org.type) }}
50629
- </span>
50630
- @if (activeOrgRole()) {
50631
- <span class="org-card__meta-item">
50632
- <span class="org-card__meta-label">{{ tt('orgsLabelRole') }}</span>
50633
- {{ activeOrgRole() | titlecase }}
50634
- </span>
50635
- }
50562
+ @if (activeOrg(); as org) {
50563
+ <div class="orgs-list">
50564
+ <div class="org-card org-card--active">
50565
+ <div class="org-card__icon">
50566
+ @if (activeOrg()?.logoUrl && !activeOrgLogoFailed()) {
50567
+ <img
50568
+ [src]="activeOrg()!.logoUrl!"
50569
+ [alt]="activeOrg()?.name ?? ''"
50570
+ (error)="activeOrgLogoFailed.set(true)"
50571
+ />
50572
+ } @else {
50573
+ <ion-icon name="business-outline" />
50574
+ }
50575
+ </div>
50576
+ <div class="org-card__body">
50577
+ <span class="org-card__name">{{ org.name }}</span>
50578
+ <div class="org-card__meta">
50579
+ <span class="org-card__meta-item">
50580
+ <span class="org-card__meta-label">{{ tt('orgsLabelType') }}</span>
50581
+ {{ orgTypeLabel(org.type) }}
50582
+ </span>
50583
+ @if (activeOrgRole()) {
50636
50584
  <span class="org-card__meta-item">
50637
- <span class="org-card__meta-label">{{ tt('orgsLabelStatus') }}</span>
50638
- {{ tt('orgsStatusActive') }}
50585
+ <span class="org-card__meta-label">{{ tt('orgsLabelRole') }}</span>
50586
+ {{ activeOrgRole() | titlecase }}
50639
50587
  </span>
50640
- </div>
50641
- </div>
50642
- <div class="org-card__end">
50643
- <ion-button fill="outline" color="dark" shape="round" size="small" (click)="onManageOrg()">
50644
- {{ tt('orgsManage') }}
50645
- </ion-button>
50588
+ }
50589
+ <span class="org-card__meta-item">
50590
+ <span class="org-card__meta-label">{{ tt('orgsLabelStatus') }}</span>
50591
+ {{ tt('orgsStatusActive') }}
50592
+ </span>
50646
50593
  </div>
50647
50594
  </div>
50648
- </div>
50649
- } @else if (orgs().length === 0) {
50650
- <div class="orgs-empty-card">
50651
- <div class="orgs-empty-card__main">
50652
- <ion-icon name="people-outline" class="orgs-empty-card__icon" />
50653
- <span class="orgs-empty-card__text">{{ orgsEmpty() }}</span>
50595
+ <div class="org-card__end">
50596
+ <ion-button fill="outline" color="dark" shape="round" size="small" (click)="onManageOrg()">
50597
+ {{ tt('orgsManage') }}
50598
+ </ion-button>
50654
50599
  </div>
50655
- <button class="orgs-empty-card__link" (click)="onMoreInfo()">
50656
- {{ orgsMoreInfo() }}
50657
- </button>
50658
50600
  </div>
50659
- }
50660
- @if (resolvedConfig().showNewOrgCta) {
50661
- <!-- Nueva organizacion: CTA card con titulo, subtitulo y boton -->
50662
- <val-cta-card class="org-new-cta-card" [props]="newOrgCtaProps()" (onAction)="onNewOrg()" />
50663
- }
50601
+ </div>
50602
+ } @else if (!activeOrgId()) {
50603
+ <div class="orgs-empty-card">
50604
+ <div class="orgs-empty-card__main">
50605
+ <ion-icon name="people-outline" class="orgs-empty-card__icon" />
50606
+ <span class="orgs-empty-card__text">{{ orgsEmpty() }}</span>
50607
+ </div>
50608
+ <button class="orgs-empty-card__link" (click)="onMoreInfo()">
50609
+ {{ orgsMoreInfo() }}
50610
+ </button>
50611
+ </div>
50612
+ }
50613
+ @if (resolvedConfig().showNewOrgCta) {
50614
+ <val-cta-card class="org-new-cta-card" [props]="newOrgCtaProps()" (onAction)="onNewOrg()" />
50664
50615
  }
50665
50616
  </div>
50666
50617
  </section>