@c8y/ngx-components 1023.14.103 → 1023.14.111

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 (80) hide show
  1. package/alarms/index.d.ts +2 -1
  2. package/alarms/index.d.ts.map +1 -1
  3. package/asset-properties/index.d.ts +1 -1
  4. package/context-dashboard/index.d.ts +1 -1
  5. package/datapoints-export-selector/index.d.ts +2 -2
  6. package/device-enrolment/index.d.ts +6 -0
  7. package/device-enrolment/index.d.ts.map +1 -0
  8. package/device-enrolment/modal/index.d.ts +88 -0
  9. package/device-enrolment/modal/index.d.ts.map +1 -0
  10. package/device-grid/index.d.ts +1 -1
  11. package/device-list/index.d.ts +1 -1
  12. package/device-shell/index.d.ts +1 -1
  13. package/echart/index.d.ts +1 -1
  14. package/echart/models/index.d.ts +2 -2
  15. package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs +1 -1
  16. package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs +1 -1
  17. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  18. package/fesm2022/c8y-ngx-components-branding-shared.mjs +1 -1
  19. package/fesm2022/c8y-ngx-components-child-devices.mjs +1 -1
  20. package/fesm2022/c8y-ngx-components-context-dashboard-asset-add.mjs +1 -1
  21. package/fesm2022/c8y-ngx-components-context-dashboard-device-add.mjs +1 -1
  22. package/fesm2022/c8y-ngx-components-context-dashboard-devicemanagement.mjs +1 -1
  23. package/fesm2022/{c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-D0C7SH6L.mjs → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-DvKsV_Fs.mjs} +14 -12
  24. package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-DvKsV_Fs.mjs.map +1 -0
  25. package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab.mjs +2 -2
  26. package/fesm2022/c8y-ngx-components-datapoint-explorer-devicemanagement.mjs +1 -1
  27. package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +1 -1
  28. package/fesm2022/c8y-ngx-components-datapoint-library.mjs +1 -1
  29. package/fesm2022/c8y-ngx-components-device-enrolment-modal.mjs +570 -0
  30. package/fesm2022/c8y-ngx-components-device-enrolment-modal.mjs.map +1 -0
  31. package/fesm2022/c8y-ngx-components-device-enrolment.mjs +147 -0
  32. package/fesm2022/c8y-ngx-components-device-enrolment.mjs.map +1 -0
  33. package/fesm2022/c8y-ngx-components-echart.mjs +12 -7
  34. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  35. package/fesm2022/c8y-ngx-components-ecosystem.mjs +2 -2
  36. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  37. package/fesm2022/c8y-ngx-components-exports.mjs +1 -1
  38. package/fesm2022/c8y-ngx-components-register-device.mjs +1 -1
  39. package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs +1 -1
  40. package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs +1 -1
  41. package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs +1 -1
  42. package/fesm2022/c8y-ngx-components-report-dashboard.mjs +1 -1
  43. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +1 -1
  44. package/fesm2022/c8y-ngx-components-sub-assets.mjs +132 -55
  45. package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
  46. package/fesm2022/c8y-ngx-components-tenants.mjs +74 -36
  47. package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
  48. package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-welcome.mjs +4 -4
  49. package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-welcome.mjs.map +1 -1
  50. package/fesm2022/c8y-ngx-components.mjs +56 -12
  51. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  52. package/index.d.ts +19 -26
  53. package/index.d.ts.map +1 -1
  54. package/locales/de.po +138 -6
  55. package/locales/es.po +137 -6
  56. package/locales/fr.po +137 -6
  57. package/locales/ja_JP.po +117 -6
  58. package/locales/ko.po +138 -6
  59. package/locales/locales.pot +125 -3
  60. package/locales/nl.po +137 -6
  61. package/locales/pl.po +137 -6
  62. package/locales/pt_BR.po +137 -6
  63. package/locales/zh_CN.po +138 -6
  64. package/locales/zh_TW.po +137 -6
  65. package/map/index.d.ts +1 -0
  66. package/map/index.d.ts.map +1 -1
  67. package/operations/bulk-operations-service/index.d.ts +1 -1
  68. package/package.json +1 -1
  69. package/protocol-opcua/mappings/index.d.ts +1 -1
  70. package/register-device/index.d.ts +1 -1
  71. package/remote-access/data/index.d.ts +1 -0
  72. package/remote-access/data/index.d.ts.map +1 -1
  73. package/repository/shared/index.d.ts.map +1 -1
  74. package/sub-assets/index.d.ts +9 -3
  75. package/sub-assets/index.d.ts.map +1 -1
  76. package/tenants/index.d.ts +1 -0
  77. package/tenants/index.d.ts.map +1 -1
  78. package/widgets/implementations/datapoints-table/index.d.ts +2 -2
  79. package/widgets/implementations/kpi/index.d.ts +1 -1
  80. package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-D0C7SH6L.mjs.map +0 -1
@@ -7,7 +7,7 @@ import { gettext } from '@c8y/ngx-components/gettext';
7
7
  import * as i1 from '@c8y/ngx-components';
8
8
  import { NavigatorNode, FormGroupComponent, C8yTranslatePipe, DatePipe, Permissions, BuiltInActionType, Status, TitleComponent, BreadcrumbComponent, BreadcrumbItemComponent, ActionBarItemComponent, IconDirective, HelpComponent, DataGridComponent, LoadingComponent, EmptyStateContextDirective, EmptyStateComponent, GuideDocsComponent, C8yTranslateDirective, GuideHrefDirective, ColumnDirective, CellRendererDefDirective, ValidationPattern, validateInternationalPhoneNumber, CommonModule, RequiredInputPlaceholderDirective, NewPasswordComponent, FormsModule as FormsModule$1, DateTimePickerModule, CoreModule, hookNavigator, hookRoute, ViewContext } from '@c8y/ngx-components';
9
9
  import * as i4 from '@angular/common';
10
- import { NgIf, AsyncPipe, NgTemplateOutlet, CommonModule as CommonModule$1 } from '@angular/common';
10
+ import { AsyncPipe, NgTemplateOutlet, CommonModule as CommonModule$1 } from '@angular/common';
11
11
  import * as i2 from '@ngx-translate/core';
12
12
  import { saveAs } from 'file-saver';
13
13
  import { BehaviorSubject, from } from 'rxjs';
@@ -415,22 +415,30 @@ class TenantListComponent {
415
415
  }
416
416
  }
417
417
  async suspendTenant(tenant) {
418
- const title = gettext('Suspend tenant');
419
- const confirmationText = gettext('You are about to suspend tenant "{{ company }}" (ID "{{ id }}").');
420
- const proceed = gettext('Do you want to proceed?');
421
- const body = [
422
- this.translateService.instant(confirmationText, {
423
- company: tenant.company,
424
- id: tenant.id
425
- }),
426
- this.translateService.instant(proceed)
427
- ].join(' ');
428
- const labels = {
429
- ok: gettext('Suspend`tenant`')
430
- };
431
418
  try {
432
- await this.modalService.confirm(title, body, Status.DANGER, labels);
433
- const confirmed = await this.passwordService.confirmPassword().toPromise();
419
+ const user = await this.appState.currentUser.value;
420
+ const isExternalUser = user.customProperties?.userOrigin === 'OAUTH2';
421
+ let confirmed;
422
+ if (isExternalUser) {
423
+ confirmed = await this.showExternalUserConfirmModal('suspend', tenant);
424
+ }
425
+ else {
426
+ const title = gettext('Suspend tenant');
427
+ const confirmationText = gettext('You are about to suspend tenant "{{ company }}" (ID "{{ id }}").');
428
+ const proceed = gettext('Do you want to proceed?');
429
+ const body = [
430
+ this.translateService.instant(confirmationText, {
431
+ company: tenant.company,
432
+ id: tenant.id
433
+ }),
434
+ this.translateService.instant(proceed)
435
+ ].join(' ');
436
+ const labels = {
437
+ ok: gettext('Suspend`tenant`')
438
+ };
439
+ await this.modalService.confirm(title, body, Status.DANGER, labels);
440
+ confirmed = await this.passwordService.confirmPassword().toPromise();
441
+ }
434
442
  if (confirmed === true) {
435
443
  const { data: savedTenant } = await this.tenantService.update({
436
444
  id: tenant.id,
@@ -447,24 +455,32 @@ class TenantListComponent {
447
455
  }
448
456
  }
449
457
  async delete(tenant) {
450
- const title = gettext('Delete tenant');
451
- const confirmationText = gettext('You are about to delete tenant "{{ company }}" (ID "{{ id }}").');
452
- const hint = gettext('This operation is irreversible.');
453
- const proceed = gettext('Do you want to proceed?');
454
- const body = [
455
- this.translateService.instant(confirmationText, {
456
- company: tenant.company,
457
- id: tenant.id
458
- }),
459
- this.translateService.instant(hint),
460
- this.translateService.instant(proceed)
461
- ].join(' ');
462
- const labels = {
463
- ok: gettext('Delete`tenant`')
464
- };
465
458
  try {
466
- await this.modalService.confirm(title, body, Status.DANGER, labels);
467
- const confirmed = await this.passwordService.confirmPassword().toPromise();
459
+ const user = await this.appState.currentUser.value;
460
+ const isExternalUser = user.customProperties?.userOrigin === 'OAUTH2';
461
+ let confirmed;
462
+ if (isExternalUser) {
463
+ confirmed = await this.showExternalUserConfirmModal('delete', tenant);
464
+ }
465
+ else {
466
+ const title = gettext('Delete tenant');
467
+ const confirmationText = gettext('You are about to delete tenant "{{ company }}" (ID "{{ id }}").');
468
+ const hint = gettext('This operation is irreversible.');
469
+ const proceed = gettext('Do you want to proceed?');
470
+ const body = [
471
+ this.translateService.instant(confirmationText, {
472
+ company: tenant.company,
473
+ id: tenant.id
474
+ }),
475
+ this.translateService.instant(hint),
476
+ this.translateService.instant(proceed)
477
+ ].join(' ');
478
+ const labels = {
479
+ ok: gettext('Delete`tenant`')
480
+ };
481
+ await this.modalService.confirm(title, body, Status.DANGER, labels);
482
+ confirmed = await this.passwordService.confirmPassword().toPromise();
483
+ }
468
484
  if (confirmed === true) {
469
485
  await this.tenantService.delete(tenant);
470
486
  const tenantsWithoutRemovedOne = this.tenants$.value.filter(t => t !== tenant);
@@ -492,8 +508,31 @@ class TenantListComponent {
492
508
  const blob = new Blob([data], { type: contentType });
493
509
  saveAs(blob, filename);
494
510
  }
511
+ async showExternalUserConfirmModal(action, tenant) {
512
+ try {
513
+ const title = action === 'suspend' ? gettext('Suspend tenant') : gettext('Delete tenant');
514
+ const confirmationText = action === 'suspend'
515
+ ? gettext('You are about to suspend tenant "{{ company }}" (ID "{{ id }}"). This action will immediately affect all users of this tenant.')
516
+ : gettext('You are about to delete tenant "{{ company }}" (ID "{{ id }}"). This action will immediately affect all users of this tenant.');
517
+ const hint = action === 'delete' ? gettext('This operation is irreversible.') + '<br><br>' : '';
518
+ const instruction = gettext('For security reasons, the external authentication server (single sign-on) does not allow for password confirmation. Instead, enter the following code to continue:');
519
+ const body = `${this.translateService.instant(confirmationText, {
520
+ company: tenant.company,
521
+ id: tenant.id
522
+ })}<br><br>${hint}${this.translateService.instant(instruction)}`;
523
+ const labels = {
524
+ ok: action === 'suspend' ? gettext('Suspend`tenant`') : gettext('Delete`tenant`')
525
+ };
526
+ const status = action === 'suspend' ? Status.WARNING : Status.DANGER;
527
+ await this.modalService.confirm(title, body, status, labels, {}, undefined, true);
528
+ return true;
529
+ }
530
+ catch {
531
+ return false;
532
+ }
533
+ }
495
534
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: TenantListComponent, deps: [{ token: i1.AppStateService }, { token: i1.AlertService }, { token: i1.ModalService }, { token: i2.TranslateService }, { token: i1$1.TenantService }, { token: i1.TenantUiService }, { token: i4.Location }, { token: i1.PasswordService }, { token: i1$1.UserService }, { token: i1.Permissions }, { token: i1.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); }
496
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: TenantListComponent, isStandalone: true, selector: "c8y-tenant-list", ngImport: i0, template: "<c8y-title>\n {{ 'Subtenants' | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-layers\"\n label=\"{{ 'Tenants' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-layers'\"\n [label]=\"'Subtenants' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n *ngIf=\"!!(appState.state$ | async).newsletter\"\n [placement]=\"'right'\"\n>\n <button\n class=\"btn btn-link\"\n title=\"{{\n 'Downloads the list of emails of users subscribed for newsletter on the current tenant and its subtenants.'\n | translate\n }}\"\n type=\"button\"\n (click)=\"downloadNewsletterEmails()\"\n >\n <i c8yIcon=\"download\"></i>\n {{ 'Email addresses' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Create tenant' | translate }}\"\n type=\"button\"\n (click)=\"createTenant({ sendGainsightEvent: false })\"\n [disabled]=\"!isPermittedToCreateTenanant\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Create tenant' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/enterprise-tenant/managing-tenants/#managing-subtenants\"></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n <c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [displayOptions]=\"displayOptions\"\n [columns]=\"columns\"\n [rows]=\"tenants$ | async\"\n [pagination]=\"pagination\"\n [showSearch]=\"showSearch\"\n [actionControls]=\"actionControls\"\n (onReload)=\"loadTenants()\"\n >\n <ng-container *ngIf=\"!(tenants$ | async); else empty\">\n <c8y-loading></c8y-loading>\n </ng-container>\n <ng-template #empty>\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'c8y-layers'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"\n stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\n \"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n >\n <ng-container *ngIf=\"stats?.size === 0\">\n <div>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Create tenant' | translate }}\"\n (click)=\"createTenant()\"\n [disabled]=\"!isPermittedToCreateTenanant\"\n >\n {{ 'Create tenant' | translate }}\n </button>\n </div>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/enterprise-tenant/managing-tenants\">user documentation</a>\n .\n </small>\n </p>\n </ng-container>\n </c8y-ui-empty-state>\n </ng-template>\n\n <c8y-column name=\"company\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }}\">\n <a [routerLink]=\"['/tenants', context.item.id]\">{{ context.value }}</a>\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"parent\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value || currentTenant.name }}\">\n {{ context.value || currentTenant.name }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"creationTime\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | c8yDate }}\">\n {{ context.value | c8yDate }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"status\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span\n title=\"{{ 'Active`tenant`' | translate }}\"\n *ngIf=\"context.item.status === TenantStatus.ACTIVE\"\n >\n <i\n class=\"text-success\"\n c8yIcon=\"check-circle\"\n ></i>\n </span>\n <span\n title=\"{{ 'Suspended`tenant`' | translate }}\"\n *ngIf=\"context.item.status === TenantStatus.SUSPENDED\"\n >\n <i\n class=\"text-danger\"\n c8yIcon=\"ban\"\n ></i>\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "component", type: TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "loading", "columns", "rows", "pagination", "childNodePagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "treeGrid", "hideReload", "childNodesProperty", "parentNodeLabelProperty"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "directive", type: EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "component", type: GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "directive", type: ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "directive", type: CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }] }); }
535
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: TenantListComponent, isStandalone: true, selector: "c8y-tenant-list", ngImport: i0, template: "<c8y-title>\n {{ 'Subtenants' | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-layers\"\n label=\"{{ 'Tenants' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-layers'\"\n [label]=\"'Subtenants' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n@if (!!(appState.state$ | async).newsletter) {\n <c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{\n 'Downloads the list of emails of users subscribed for newsletter on the current tenant and its subtenants.'\n | translate\n }}\"\n type=\"button\"\n (click)=\"downloadNewsletterEmails()\"\n >\n <i c8yIcon=\"download\"></i>\n {{ 'Email addresses' | translate }}\n </button>\n </c8y-action-bar-item>\n}\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Create tenant' | translate }}\"\n type=\"button\"\n (click)=\"createTenant({ sendGainsightEvent: false })\"\n [disabled]=\"!isPermittedToCreateTenanant\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Create tenant' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/enterprise-tenant/managing-tenants/#managing-subtenants\"></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n <c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [displayOptions]=\"displayOptions\"\n [columns]=\"columns\"\n [rows]=\"tenants$ | async\"\n [pagination]=\"pagination\"\n [showSearch]=\"showSearch\"\n [actionControls]=\"actionControls\"\n (onReload)=\"loadTenants()\"\n >\n @if (!(tenants$ | async)) {\n <c8y-loading></c8y-loading>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'c8y-layers'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"\n stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\n \"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n >\n @if (stats?.size === 0) {\n <div>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Create tenant' | translate }}\"\n (click)=\"createTenant()\"\n [disabled]=\"!isPermittedToCreateTenanant\"\n >\n {{ 'Create tenant' | translate }}\n </button>\n </div>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/enterprise-tenant/managing-tenants\">user documentation</a>\n .\n </small>\n </p>\n }\n </c8y-ui-empty-state>\n }\n\n <c8y-column name=\"company\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }}\">\n <a [routerLink]=\"['/tenants', context.item.id]\">{{ context.value }}</a>\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"parent\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value || currentTenant.name }}\">\n {{ context.value || currentTenant.name }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"creationTime\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | c8yDate }}\">\n {{ context.value | c8yDate }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"status\">\n <ng-container *c8yCellRendererDef=\"let context\">\n @if (context.item.status === TenantStatus.ACTIVE) {\n <span title=\"{{ 'Active`tenant`' | translate }}\">\n <i\n class=\"text-success\"\n c8yIcon=\"check-circle\"\n ></i>\n </span>\n }\n @if (context.item.status === TenantStatus.SUSPENDED) {\n <span title=\"{{ 'Suspended`tenant`' | translate }}\">\n <i\n class=\"text-danger\"\n c8yIcon=\"ban\"\n ></i>\n </span>\n }\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "component", type: TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "loading", "columns", "rows", "pagination", "childNodePagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "treeGrid", "hideReload", "childNodesProperty", "parentNodeLabelProperty"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "directive", type: EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "component", type: GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "directive", type: ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "directive", type: CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }] }); }
497
536
  }
498
537
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: TenantListComponent, decorators: [{
499
538
  type: Component,
@@ -501,7 +540,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
501
540
  TitleComponent,
502
541
  BreadcrumbComponent,
503
542
  BreadcrumbItemComponent,
504
- NgIf,
505
543
  ActionBarItemComponent,
506
544
  IconDirective,
507
545
  HelpComponent,
@@ -518,7 +556,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
518
556
  C8yTranslatePipe,
519
557
  AsyncPipe,
520
558
  DatePipe
521
- ], template: "<c8y-title>\n {{ 'Subtenants' | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-layers\"\n label=\"{{ 'Tenants' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-layers'\"\n [label]=\"'Subtenants' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n *ngIf=\"!!(appState.state$ | async).newsletter\"\n [placement]=\"'right'\"\n>\n <button\n class=\"btn btn-link\"\n title=\"{{\n 'Downloads the list of emails of users subscribed for newsletter on the current tenant and its subtenants.'\n | translate\n }}\"\n type=\"button\"\n (click)=\"downloadNewsletterEmails()\"\n >\n <i c8yIcon=\"download\"></i>\n {{ 'Email addresses' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Create tenant' | translate }}\"\n type=\"button\"\n (click)=\"createTenant({ sendGainsightEvent: false })\"\n [disabled]=\"!isPermittedToCreateTenanant\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Create tenant' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/enterprise-tenant/managing-tenants/#managing-subtenants\"></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n <c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [displayOptions]=\"displayOptions\"\n [columns]=\"columns\"\n [rows]=\"tenants$ | async\"\n [pagination]=\"pagination\"\n [showSearch]=\"showSearch\"\n [actionControls]=\"actionControls\"\n (onReload)=\"loadTenants()\"\n >\n <ng-container *ngIf=\"!(tenants$ | async); else empty\">\n <c8y-loading></c8y-loading>\n </ng-container>\n <ng-template #empty>\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'c8y-layers'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"\n stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\n \"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n >\n <ng-container *ngIf=\"stats?.size === 0\">\n <div>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Create tenant' | translate }}\"\n (click)=\"createTenant()\"\n [disabled]=\"!isPermittedToCreateTenanant\"\n >\n {{ 'Create tenant' | translate }}\n </button>\n </div>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/enterprise-tenant/managing-tenants\">user documentation</a>\n .\n </small>\n </p>\n </ng-container>\n </c8y-ui-empty-state>\n </ng-template>\n\n <c8y-column name=\"company\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }}\">\n <a [routerLink]=\"['/tenants', context.item.id]\">{{ context.value }}</a>\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"parent\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value || currentTenant.name }}\">\n {{ context.value || currentTenant.name }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"creationTime\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | c8yDate }}\">\n {{ context.value | c8yDate }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"status\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span\n title=\"{{ 'Active`tenant`' | translate }}\"\n *ngIf=\"context.item.status === TenantStatus.ACTIVE\"\n >\n <i\n class=\"text-success\"\n c8yIcon=\"check-circle\"\n ></i>\n </span>\n <span\n title=\"{{ 'Suspended`tenant`' | translate }}\"\n *ngIf=\"context.item.status === TenantStatus.SUSPENDED\"\n >\n <i\n class=\"text-danger\"\n c8yIcon=\"ban\"\n ></i>\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n" }]
559
+ ], template: "<c8y-title>\n {{ 'Subtenants' | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-layers\"\n label=\"{{ 'Tenants' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-layers'\"\n [label]=\"'Subtenants' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n@if (!!(appState.state$ | async).newsletter) {\n <c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{\n 'Downloads the list of emails of users subscribed for newsletter on the current tenant and its subtenants.'\n | translate\n }}\"\n type=\"button\"\n (click)=\"downloadNewsletterEmails()\"\n >\n <i c8yIcon=\"download\"></i>\n {{ 'Email addresses' | translate }}\n </button>\n </c8y-action-bar-item>\n}\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Create tenant' | translate }}\"\n type=\"button\"\n (click)=\"createTenant({ sendGainsightEvent: false })\"\n [disabled]=\"!isPermittedToCreateTenanant\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Create tenant' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/enterprise-tenant/managing-tenants/#managing-subtenants\"></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n <c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [displayOptions]=\"displayOptions\"\n [columns]=\"columns\"\n [rows]=\"tenants$ | async\"\n [pagination]=\"pagination\"\n [showSearch]=\"showSearch\"\n [actionControls]=\"actionControls\"\n (onReload)=\"loadTenants()\"\n >\n @if (!(tenants$ | async)) {\n <c8y-loading></c8y-loading>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'c8y-layers'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"\n stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\n \"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n >\n @if (stats?.size === 0) {\n <div>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Create tenant' | translate }}\"\n (click)=\"createTenant()\"\n [disabled]=\"!isPermittedToCreateTenanant\"\n >\n {{ 'Create tenant' | translate }}\n </button>\n </div>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/enterprise-tenant/managing-tenants\">user documentation</a>\n .\n </small>\n </p>\n }\n </c8y-ui-empty-state>\n }\n\n <c8y-column name=\"company\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }}\">\n <a [routerLink]=\"['/tenants', context.item.id]\">{{ context.value }}</a>\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"parent\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value || currentTenant.name }}\">\n {{ context.value || currentTenant.name }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"creationTime\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | c8yDate }}\">\n {{ context.value | c8yDate }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"status\">\n <ng-container *c8yCellRendererDef=\"let context\">\n @if (context.item.status === TenantStatus.ACTIVE) {\n <span title=\"{{ 'Active`tenant`' | translate }}\">\n <i\n class=\"text-success\"\n c8yIcon=\"check-circle\"\n ></i>\n </span>\n }\n @if (context.item.status === TenantStatus.SUSPENDED) {\n <span title=\"{{ 'Suspended`tenant`' | translate }}\">\n <i\n class=\"text-danger\"\n c8yIcon=\"ban\"\n ></i>\n </span>\n }\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n" }]
522
560
  }], ctorParameters: () => [{ type: i1.AppStateService }, { type: i1.AlertService }, { type: i1.ModalService }, { type: i2.TranslateService }, { type: i1$1.TenantService }, { type: i1.TenantUiService }, { type: i4.Location }, { type: i1.PasswordService }, { type: i1$1.UserService }, { type: i1.Permissions }, { type: i1.GainsightService }] });
523
561
 
524
562
  /**