@c8y/ngx-components 1018.0.194 → 1018.0.201
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/core/common/global-config.service.d.ts +1 -1
- package/core/common/permissions.service.d.ts +69 -2
- package/core/common/tenant-ui.service.d.ts +1 -1
- package/core/i18n/pattern-messages.data.d.ts +20 -20
- package/esm2020/assets-navigator/asset-node.service.mjs +11 -4
- package/esm2020/auth-configuration/auth-configuration.guard.mjs +5 -2
- package/esm2020/auth-configuration/factories/navigation.factory.mjs +3 -3
- package/esm2020/cockpit-config/cockpit-config.guard.mjs +2 -2
- package/esm2020/cockpit-config/cockpit-config.service.mjs +2 -2
- package/esm2020/context-dashboard/add-dashboard.factory.mjs +13 -3
- package/esm2020/context-dashboard/context-dashboard.service.mjs +11 -3
- package/esm2020/context-dashboard/dashboard-detail.component.mjs +7 -2
- package/esm2020/context-dashboard/report-dashboard/report-dashboard-list.component.mjs +5 -3
- package/esm2020/core/common/global-config.service.mjs +7 -2
- package/esm2020/core/common/permissions.service.mjs +69 -2
- package/esm2020/core/common/tenant-ui.service.mjs +3 -2
- package/esm2020/core/common/user-preferences/user-preferences.service.mjs +10 -2
- package/esm2020/core/i18n/pattern-messages.data.mjs +21 -21
- package/esm2020/ecosystem/application-properties/application-properties.component.mjs +2 -2
- package/esm2020/ecosystem/ecosystem-navigation.factory.mjs +3 -3
- package/esm2020/ecosystem/packages/package-list/packages-list.component.mjs +2 -2
- package/esm2020/ecosystem/packages/package-versions/package-versions-list/package-versions-list.component.mjs +2 -2
- package/esm2020/files-repository/files-repository.guard.mjs +6 -3
- package/esm2020/protocol-lwm2m/components/bootstrap-parameters/lwm2m-bootstrap-parameters.component.mjs +2 -2
- package/esm2020/register-device/register-device-navigation.factory.mjs +3 -3
- package/esm2020/reports/export-schedules.component.mjs +3 -3
- package/esm2020/repository/configuration/device-tab/configuration-preview.component.mjs +14 -6
- package/esm2020/sms-gateway/sms-gateway.guard.mjs +2 -2
- package/esm2020/sms-gateway/sms-gateway.module.mjs +6 -6
- package/esm2020/sub-assets/add-group/add-group.component.mjs +7 -2
- package/esm2020/sub-assets/groups.component.mjs +5 -2
- package/esm2020/sub-assets/sub-assets.component.mjs +7 -2
- package/esm2020/sub-assets/sub-assets.service.mjs +22 -10
- package/esm2020/tenants/tenant-list/tenant-list.component.mjs +12 -7
- package/esm2020/upgrade/ng1/downgraded.services.mjs +3 -2
- package/esm2020/upgrade/ng1/index.mjs +4 -3
- package/fesm2015/c8y-ngx-components-assets-navigator.mjs +10 -3
- package/fesm2015/c8y-ngx-components-assets-navigator.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-auth-configuration.mjs +7 -4
- package/fesm2015/c8y-ngx-components-auth-configuration.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-cockpit-config.mjs +3 -3
- package/fesm2015/c8y-ngx-components-cockpit-config.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-context-dashboard.mjs +33 -8
- package/fesm2015/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-ecosystem.mjs +6 -6
- package/fesm2015/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-files-repository.mjs +6 -3
- package/fesm2015/c8y-ngx-components-files-repository.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-protocol-lwm2m-components-bootstrap-parameters.mjs +2 -2
- package/fesm2015/c8y-ngx-components-protocol-lwm2m-components-bootstrap-parameters.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-register-device.mjs +3 -3
- package/fesm2015/c8y-ngx-components-register-device.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-reports.mjs +2 -2
- package/fesm2015/c8y-ngx-components-reports.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-repository-configuration.mjs +13 -5
- package/fesm2015/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-sms-gateway.mjs +6 -6
- package/fesm2015/c8y-ngx-components-sms-gateway.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-sub-assets.mjs +38 -13
- package/fesm2015/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-tenants.mjs +11 -6
- package/fesm2015/c8y-ngx-components-tenants.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-upgrade.mjs +4 -2
- package/fesm2015/c8y-ngx-components-upgrade.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components.mjs +103 -24
- package/fesm2015/c8y-ngx-components.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-assets-navigator.mjs +10 -3
- package/fesm2020/c8y-ngx-components-assets-navigator.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-auth-configuration.mjs +7 -4
- package/fesm2020/c8y-ngx-components-auth-configuration.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-cockpit-config.mjs +3 -3
- package/fesm2020/c8y-ngx-components-cockpit-config.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-context-dashboard.mjs +34 -9
- package/fesm2020/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-ecosystem.mjs +6 -6
- package/fesm2020/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-files-repository.mjs +6 -3
- package/fesm2020/c8y-ngx-components-files-repository.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-protocol-lwm2m-components-bootstrap-parameters.mjs +2 -2
- package/fesm2020/c8y-ngx-components-protocol-lwm2m-components-bootstrap-parameters.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-register-device.mjs +3 -3
- package/fesm2020/c8y-ngx-components-register-device.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-reports.mjs +2 -2
- package/fesm2020/c8y-ngx-components-reports.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-repository-configuration.mjs +13 -5
- package/fesm2020/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-sms-gateway.mjs +6 -6
- package/fesm2020/c8y-ngx-components-sms-gateway.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-sub-assets.mjs +38 -13
- package/fesm2020/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-tenants.mjs +11 -6
- package/fesm2020/c8y-ngx-components-tenants.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-upgrade.mjs +4 -2
- package/fesm2020/c8y-ngx-components-upgrade.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components.mjs +103 -24
- package/fesm2020/c8y-ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/tenants/tenant-list/tenant-list.component.d.ts +4 -2
- package/upgrade/ng1/downgraded.services.d.ts +1 -0
|
@@ -5,7 +5,7 @@ import { RouterModule } from '@angular/router';
|
|
|
5
5
|
import * as i2$1 from 'ngx-bootstrap/datepicker';
|
|
6
6
|
import { BsDatepickerModule } from 'ngx-bootstrap/datepicker';
|
|
7
7
|
import * as i1 from '@c8y/ngx-components';
|
|
8
|
-
import { NavigatorNode, gettext, Status, CoreModule, hookNavigator, hookRoute } from '@c8y/ngx-components';
|
|
8
|
+
import { NavigatorNode, gettext, Permissions, Status, CoreModule, hookNavigator, hookRoute } from '@c8y/ngx-components';
|
|
9
9
|
import { __awaiter } from 'tslib';
|
|
10
10
|
import { BehaviorSubject, from } from 'rxjs';
|
|
11
11
|
import { expand, takeWhile, reduce, shareReplay } from 'rxjs/operators';
|
|
@@ -145,7 +145,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
145
145
|
}], ctorParameters: function () { return [{ type: i1.FilteringFormRendererContext }]; } });
|
|
146
146
|
|
|
147
147
|
class TenantListComponent {
|
|
148
|
-
constructor(appState, alertService, modalService, translateService, tenantService, tenantUiService, location, passwordService, userService) {
|
|
148
|
+
constructor(appState, alertService, modalService, translateService, tenantService, tenantUiService, location, passwordService, userService, permissionsService) {
|
|
149
149
|
this.appState = appState;
|
|
150
150
|
this.alertService = alertService;
|
|
151
151
|
this.modalService = modalService;
|
|
@@ -155,7 +155,12 @@ class TenantListComponent {
|
|
|
155
155
|
this.location = location;
|
|
156
156
|
this.passwordService = passwordService;
|
|
157
157
|
this.userService = userService;
|
|
158
|
+
this.permissionsService = permissionsService;
|
|
158
159
|
this.tenants$ = new BehaviorSubject(undefined);
|
|
160
|
+
this.isPermittedToCreateTenanant = this.permissionsService.hasAnyRole([
|
|
161
|
+
Permissions.ROLE_TENANT_MANAGEMENT_ADMIN,
|
|
162
|
+
Permissions.ROLE_TENANT_MANAGEMENT_CREATE
|
|
163
|
+
]);
|
|
159
164
|
this.TOP_TENANT_NAME = 'management';
|
|
160
165
|
this.title = null;
|
|
161
166
|
this.loadMoreItemsLabel = gettext('Load more tenants');
|
|
@@ -395,12 +400,12 @@ class TenantListComponent {
|
|
|
395
400
|
});
|
|
396
401
|
}
|
|
397
402
|
}
|
|
398
|
-
TenantListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: TenantListComponent, deps: [{ token: i1.AppStateService }, { token: i1.AlertService }, { token: i1.ModalService }, { token: i2$2.TranslateService }, { token: i3.TenantService }, { token: i1.TenantUiService }, { token: i4.Location }, { token: i1.PasswordService }, { token: i3.UserService }], target: i0.ɵɵFactoryTarget.Component });
|
|
399
|
-
TenantListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: TenantListComponent, selector: "c8y-tenant-list", ngImport: i0, template: "<c8y-title>\n {{ 'Subtenants' | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item label=\"{{ 'Tenants' | translate }}\" icon=\"c8y-layers\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"'Subtenants' | translate\"\n [icon]=\"'c8y-layers'\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item *ngIf=\"!!(appState.state$ | async).newsletter\" [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{\n 'Downloads the list of emails of users subscribed for newsletter on the current tenant and its subtenants.'\n | translate\n }}\"\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 type=\"button\"\n title=\"{{ 'Create tenant' | translate }}\"\n (click)=\"createTenant()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Create tenant' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/enterprise-tenant/#managing-tenants\"></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 <div class=\"c8y-empty-state j-c-center\">\n <ng-container *ngIf=\"!(tenants$ | async)\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-container *ngIf=\"(tenants$ | async)?.length === 0\">\n <div class=\"text-center\">\n <h1 c8yIcon=\"c8y-layers\"></h1>\n <h3 translate>There are no tenants defined.</h3>\n <p translate>Create the first tenant.</p>\n <div>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Create tenant' | translate }}\"\n (click)=\"createTenant()\"\n >\n {{ 'Create tenant' | translate }}\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/enterprise-tenant/#managing-tenants\">\n User guide`KEEP_ORIGINAL`\n </a>\n .\n </small>\n </p>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(tenants$ | async)?.length > 0\">\n <div class=\"text-center\">\n <h1 class=\"c8y-icon-duocolor\" c8yIcon=\"search\"></h1>\n <h3 translate>No tenants to display.</h3>\n <p translate>Refine your search terms or check your spelling.</p>\n </div>\n </ng-container>\n </div>\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 *ngIf=\"context.item.status === TenantStatus.ACTIVE\"\n title=\"{{ 'Active`tenant`' | translate }}\"\n >\n <i c8yIcon=\"check-circle\" class=\"text-success\"></i>\n </span>\n <span\n *ngIf=\"context.item.status === TenantStatus.SUSPENDED\"\n title=\"{{ 'Suspended`tenant`' | translate }}\"\n >\n <i c8yIcon=\"ban\" class=\"text-danger\"></i>\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "directive", type: i5.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { kind: "component", type: i1.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: i1.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i1.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.LoadingComponent, selector: "c8y-loading" }, { kind: "directive", type: i1.CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: i1.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i1.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "infiniteScroll", "serverSideDataCallback", "selectable", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "component", type: i1.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i1.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i1.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "component", type: i1.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DatePipe, name: "c8yDate" }] });
|
|
403
|
+
TenantListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: TenantListComponent, deps: [{ token: i1.AppStateService }, { token: i1.AlertService }, { token: i1.ModalService }, { token: i2$2.TranslateService }, { token: i3.TenantService }, { token: i1.TenantUiService }, { token: i4.Location }, { token: i1.PasswordService }, { token: i3.UserService }, { token: i1.Permissions }], target: i0.ɵɵFactoryTarget.Component });
|
|
404
|
+
TenantListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: TenantListComponent, selector: "c8y-tenant-list", ngImport: i0, template: "<c8y-title>\n {{ 'Subtenants' | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item label=\"{{ 'Tenants' | translate }}\" icon=\"c8y-layers\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"'Subtenants' | translate\"\n [icon]=\"'c8y-layers'\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item *ngIf=\"!!(appState.state$ | async).newsletter\" [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{\n 'Downloads the list of emails of users subscribed for newsletter on the current tenant and its subtenants.'\n | translate\n }}\"\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 type=\"button\"\n title=\"{{ 'Create tenant' | translate }}\"\n (click)=\"createTenant()\"\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=\"/users-guide/enterprise-tenant/#managing-tenants\"></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 <div class=\"c8y-empty-state j-c-center\">\n <ng-container *ngIf=\"!(tenants$ | async)\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-container *ngIf=\"(tenants$ | async)?.length === 0\">\n <div class=\"text-center\">\n <h1 c8yIcon=\"c8y-layers\"></h1>\n <h3 translate>There are no tenants defined.</h3>\n <p translate>Create the first tenant.</p>\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 translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/enterprise-tenant/#managing-tenants\">\n User guide`KEEP_ORIGINAL`\n </a>\n .\n </small>\n </p>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(tenants$ | async)?.length > 0\">\n <div class=\"text-center\">\n <h1 class=\"c8y-icon-duocolor\" c8yIcon=\"search\"></h1>\n <h3 translate>No tenants to display.</h3>\n <p translate>Refine your search terms or check your spelling.</p>\n </div>\n </ng-container>\n </div>\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 *ngIf=\"context.item.status === TenantStatus.ACTIVE\"\n title=\"{{ 'Active`tenant`' | translate }}\"\n >\n <i c8yIcon=\"check-circle\" class=\"text-success\"></i>\n </span>\n <span\n *ngIf=\"context.item.status === TenantStatus.SUSPENDED\"\n title=\"{{ 'Suspended`tenant`' | translate }}\"\n >\n <i c8yIcon=\"ban\" class=\"text-danger\"></i>\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "directive", type: i5.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { kind: "component", type: i1.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: i1.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i1.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.LoadingComponent, selector: "c8y-loading" }, { kind: "directive", type: i1.CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: i1.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i1.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "infiniteScroll", "serverSideDataCallback", "selectable", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "component", type: i1.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i1.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i1.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "component", type: i1.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DatePipe, name: "c8yDate" }] });
|
|
400
405
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: TenantListComponent, decorators: [{
|
|
401
406
|
type: Component,
|
|
402
|
-
args: [{ selector: 'c8y-tenant-list', template: "<c8y-title>\n {{ 'Subtenants' | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item label=\"{{ 'Tenants' | translate }}\" icon=\"c8y-layers\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"'Subtenants' | translate\"\n [icon]=\"'c8y-layers'\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item *ngIf=\"!!(appState.state$ | async).newsletter\" [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{\n 'Downloads the list of emails of users subscribed for newsletter on the current tenant and its subtenants.'\n | translate\n }}\"\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 type=\"button\"\n title=\"{{ 'Create tenant' | translate }}\"\n (click)=\"createTenant()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Create tenant' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/enterprise-tenant/#managing-tenants\"></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 <div class=\"c8y-empty-state j-c-center\">\n <ng-container *ngIf=\"!(tenants$ | async)\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-container *ngIf=\"(tenants$ | async)?.length === 0\">\n <div class=\"text-center\">\n <h1 c8yIcon=\"c8y-layers\"></h1>\n <h3 translate>There are no tenants defined.</h3>\n <p translate>Create the first tenant.</p>\n <div>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Create tenant' | translate }}\"\n (click)=\"createTenant()\"\n >\n {{ 'Create tenant' | translate }}\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/enterprise-tenant/#managing-tenants\">\n User guide`KEEP_ORIGINAL`\n </a>\n .\n </small>\n </p>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(tenants$ | async)?.length > 0\">\n <div class=\"text-center\">\n <h1 class=\"c8y-icon-duocolor\" c8yIcon=\"search\"></h1>\n <h3 translate>No tenants to display.</h3>\n <p translate>Refine your search terms or check your spelling.</p>\n </div>\n </ng-container>\n </div>\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 *ngIf=\"context.item.status === TenantStatus.ACTIVE\"\n title=\"{{ 'Active`tenant`' | translate }}\"\n >\n <i c8yIcon=\"check-circle\" class=\"text-success\"></i>\n </span>\n <span\n *ngIf=\"context.item.status === TenantStatus.SUSPENDED\"\n title=\"{{ 'Suspended`tenant`' | translate }}\"\n >\n <i c8yIcon=\"ban\" class=\"text-danger\"></i>\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n" }]
|
|
403
|
-
}], ctorParameters: function () { return [{ type: i1.AppStateService }, { type: i1.AlertService }, { type: i1.ModalService }, { type: i2$2.TranslateService }, { type: i3.TenantService }, { type: i1.TenantUiService }, { type: i4.Location }, { type: i1.PasswordService }, { type: i3.UserService }]; } });
|
|
407
|
+
args: [{ selector: 'c8y-tenant-list', template: "<c8y-title>\n {{ 'Subtenants' | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item label=\"{{ 'Tenants' | translate }}\" icon=\"c8y-layers\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"'Subtenants' | translate\"\n [icon]=\"'c8y-layers'\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item *ngIf=\"!!(appState.state$ | async).newsletter\" [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{\n 'Downloads the list of emails of users subscribed for newsletter on the current tenant and its subtenants.'\n | translate\n }}\"\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 type=\"button\"\n title=\"{{ 'Create tenant' | translate }}\"\n (click)=\"createTenant()\"\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=\"/users-guide/enterprise-tenant/#managing-tenants\"></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 <div class=\"c8y-empty-state j-c-center\">\n <ng-container *ngIf=\"!(tenants$ | async)\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-container *ngIf=\"(tenants$ | async)?.length === 0\">\n <div class=\"text-center\">\n <h1 c8yIcon=\"c8y-layers\"></h1>\n <h3 translate>There are no tenants defined.</h3>\n <p translate>Create the first tenant.</p>\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 translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/enterprise-tenant/#managing-tenants\">\n User guide`KEEP_ORIGINAL`\n </a>\n .\n </small>\n </p>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(tenants$ | async)?.length > 0\">\n <div class=\"text-center\">\n <h1 class=\"c8y-icon-duocolor\" c8yIcon=\"search\"></h1>\n <h3 translate>No tenants to display.</h3>\n <p translate>Refine your search terms or check your spelling.</p>\n </div>\n </ng-container>\n </div>\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 *ngIf=\"context.item.status === TenantStatus.ACTIVE\"\n title=\"{{ 'Active`tenant`' | translate }}\"\n >\n <i c8yIcon=\"check-circle\" class=\"text-success\"></i>\n </span>\n <span\n *ngIf=\"context.item.status === TenantStatus.SUSPENDED\"\n title=\"{{ 'Suspended`tenant`' | translate }}\"\n >\n <i c8yIcon=\"ban\" class=\"text-danger\"></i>\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n" }]
|
|
408
|
+
}], ctorParameters: function () { return [{ type: i1.AppStateService }, { type: i1.AlertService }, { type: i1.ModalService }, { type: i2$2.TranslateService }, { type: i3.TenantService }, { type: i1.TenantUiService }, { type: i4.Location }, { type: i1.PasswordService }, { type: i3.UserService }, { type: i1.Permissions }]; } });
|
|
404
409
|
|
|
405
410
|
class TenantsModule {
|
|
406
411
|
static config(config = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-tenants.mjs","sources":["../../tenants/tenants.model.ts","../../tenants/tenant-list/tenant-list.guard.ts","../../tenants/tenants-navigation.factory.ts","../../tenants/tenant-list/status.filtering-form-renderer.component.ts","../../tenants/tenant-list/status.filtering-form-renderer.component.html","../../tenants/tenant-list/creation-time.filtering-form-renderer.component.ts","../../tenants/tenant-list/creation-time.filtering-form-renderer.component.html","../../tenants/tenant-list/tenant-list.component.ts","../../tenants/tenant-list/tenant-list.component.html","../../tenants/tenants.module.ts","../../tenants/c8y-ngx-components-tenants.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { NavigatorNode } from '@c8y/ngx-components';\n\nexport const TENANTS_MODULE_CONFIG = new InjectionToken<TenantsModuleConfig>('TenantsModuleConfig');\n\n/**\n * Configuration object for `TenantsModule`.\n */\nexport interface TenantsModuleConfig {\n /**\n * Allows for hiding or customizing \"Subtenants\" navigator node:\n * - `subtenantsNavigatorNode: true` - shows the default navigator node (default),\n * - `subtenantsNavigatorNode: false` - hides the navigator node,\n * - `subtenantsNavigatorNode: { label: 'My subtenants' }` - overrides default navigator node,\n * - `subtenantsNavigatorNode: new NavigatorNode({ label: 'My subtenants' })` - overrides default navigator node.\n */\n subtenantsNavigatorNode?: boolean | Partial<NavigatorNode>;\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { TenantUiService } from '@c8y/ngx-components';\n\n@Injectable()\nexport class TenantListGuard implements CanActivate {\n private active: boolean;\n\n constructor(private tenantUiService: TenantUiService) {}\n\n /**\n * Checks if tenant list should be active,\n * i.e. whether the current tenant can read other tenants.\n * **Note: the check is executed only once in the runtime.**\n *\n * @returns True, if the feature should be active.\n */\n canActivate(): boolean {\n if (this.active === undefined) {\n this.active = this.tenantUiService.canReadTenants();\n }\n return this.active;\n }\n}\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\nimport { TenantListGuard } from './tenant-list/tenant-list.guard';\nimport { TenantsModuleConfig, TENANTS_MODULE_CONFIG } from './tenants.model';\n\n@Injectable()\nexport class TenantsNavigationFactory implements NavigatorNodeFactory {\n private navs: NavigatorNode[] = [];\n\n constructor(\n private tenantListGuard: TenantListGuard,\n @Optional() @Inject(TENANTS_MODULE_CONFIG) private config: TenantsModuleConfig\n ) {}\n\n async get(): Promise<NavigatorNode[]> {\n const canActivateTenantList = await this.tenantListGuard.canActivate();\n if (!this.navs.length) {\n const subtenantsNavigatorNode = this.config?.subtenantsNavigatorNode ?? true;\n if (subtenantsNavigatorNode !== false) {\n this.navs.push(\n new NavigatorNode({\n parent: {\n label: gettext('Tenants'),\n icon: 'c8y-layers'\n },\n label: gettext('Subtenants'),\n icon: 'c8y-sub-tenants',\n path: 'tenants',\n routerLinkExact: false,\n priority: 4000,\n hidden: !canActivateTenantList,\n ...(subtenantsNavigatorNode === true ? {} : subtenantsNavigatorNode)\n })\n );\n }\n }\n return this.navs;\n }\n}\n","import { Component } from '@angular/core';\nimport { ITenant, TenantStatus } from '@c8y/client';\nimport { FilteringFormRendererContext } from '@c8y/ngx-components';\n\n@Component({\n templateUrl: './status.filtering-form-renderer.component.html'\n})\nexport class StatusFilteringFormRendererComponent {\n model: {\n active: boolean;\n suspended: boolean;\n };\n\n constructor(public context: FilteringFormRendererContext) {\n this.model = (this.context.property.externalFilterQuery || {}).model || {};\n }\n\n applyFilter() {\n this.context.applyFilter({\n externalFilterQuery: {\n model: this.model\n },\n filterPredicate: (tenant: ITenant) =>\n Boolean(\n (!this.model.active && !this.model.suspended) ||\n (this.model.active && tenant.status === TenantStatus.ACTIVE) ||\n (this.model.suspended && tenant.status === TenantStatus.SUSPENDED)\n )\n });\n }\n\n resetFilter() {\n this.context.resetFilter();\n }\n}\n","<form #filterForm=\"ngForm\">\n <div class=\"m-b-8 p-t-8\">\n <label>{{ 'Filter by status' | translate }}</label>\n <c8y-form-group class=\"m-b-0\">\n <label class=\"c8y-checkbox\">\n <input type=\"checkbox\" name=\"active\" [(ngModel)]=\"model.active\" />\n <span></span>\n <span>{{ 'Active`tenant`' | translate }}</span>\n </label>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-0\">\n <label class=\"c8y-checkbox\">\n <input type=\"checkbox\" name=\"suspended\" [(ngModel)]=\"model.suspended\" />\n <span></span>\n <span>{{ 'Suspended`tenant`' | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n</form>\n\n<div class=\"data-grid__dropdown__footer d-flex separator-top\">\n <button\n class=\"btn btn-default btn-sm m-r-8 flex-grow\"\n (click)=\"resetFilter()\"\n title=\"{{ 'Reset' | translate }}\"\n >\n {{ 'Reset' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n [disabled]=\"filterForm.invalid\"\n (click)=\"applyFilter()\"\n title=\"{{ 'Apply' | translate }}\"\n >\n {{ 'Apply' | translate }}\n </button>\n</div>\n","import { Component } from '@angular/core';\nimport { ITenant } from '@c8y/client';\nimport { FilteringFormRendererContext } from '@c8y/ngx-components';\n\n@Component({\n templateUrl: './creation-time.filtering-form-renderer.component.html'\n})\nexport class CreationTimeFilteringFormRendererComponent {\n model: {\n dateFrom: Date;\n dateTo: Date;\n };\n\n constructor(public context: FilteringFormRendererContext) {\n this.model = (this.context.property.externalFilterQuery || {}).model || {};\n }\n\n applyFilter() {\n this.context.applyFilter({\n externalFilterQuery: {\n model: this.model\n },\n filterPredicate: (tenant: ITenant) => {\n const creationTime = new Date(tenant.creationTime);\n let dateFrom;\n let dateTo;\n\n if (this.model.dateFrom) {\n dateFrom = this.model.dateFrom;\n dateFrom.setHours(0, 0, 0, 0);\n }\n\n if (this.model.dateTo) {\n dateTo = this.model.dateTo;\n dateTo.setHours(23, 59, 59, 999);\n }\n\n return Boolean(\n (!dateFrom && !dateTo) ||\n (dateFrom && !dateTo && dateFrom <= creationTime) ||\n (!dateFrom && dateTo && creationTime <= dateTo) ||\n (dateFrom && dateTo && dateFrom <= creationTime && creationTime <= dateTo)\n );\n }\n });\n }\n\n resetFilter() {\n this.context.resetFilter();\n }\n}\n","<form #filterForm=\"ngForm\">\n <div class=\"m-b-8 p-t-8\">\n <label>{{ 'Filter by creation time' | translate }}</label>\n <c8y-form-group class=\"datepicker d-block m-b-16\" style=\"max-height: 32px\">\n <input\n name=\"dateFrom\"\n [(ngModel)]=\"model.dateFrom\"\n class=\"form-control fit-w text-left\"\n placeholder=\"{{ 'Created from`date`' | translate }}\"\n bsDatepicker\n [bsConfig]=\"{ customTodayClass: 'today', returnFocusToInput: true }\"\n [maxDate]=\"model.dateTo\"\n />\n </c8y-form-group>\n <c8y-form-group class=\"datepicker m-l-0 d-block\" style=\"max-height: 32px\">\n <input\n name=\"dateTo\"\n [(ngModel)]=\"model.dateTo\"\n class=\"form-control fit-w text-left\"\n placeholder=\"{{ 'Created to`date`' | translate }}\"\n bsDatepicker\n [bsConfig]=\"{ customTodayClass: 'today', returnFocusToInput: true }\"\n [minDate]=\"model.dateFrom\"\n />\n </c8y-form-group>\n </div>\n</form>\n\n<div class=\"data-grid__dropdown__footer d-flex separator-top\">\n <button\n class=\"btn btn-default btn-sm m-r-8 flex-grow\"\n (click)=\"resetFilter()\"\n title=\"{{ 'Reset' | translate }}\"\n >\n {{ 'Reset' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n [disabled]=\"filterForm.invalid\"\n (click)=\"applyFilter()\"\n title=\"{{ 'Apply' | translate }}\"\n >\n {{ 'Apply' | translate }}\n </button>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { Location } from '@angular/common';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, from } from 'rxjs';\nimport { expand, reduce, shareReplay, takeWhile } from 'rxjs/operators';\nimport { saveAs } from 'file-saver';\n\nimport {\n ICurrentTenant,\n IResultList,\n ITenant,\n TenantService,\n TenantStatus,\n UserService\n} from '@c8y/client';\nimport {\n ActionControl,\n AlertService,\n AppStateService,\n BuiltInActionType,\n Column,\n SortOrder,\n DisplayOptions,\n gettext,\n ModalService,\n Pagination,\n Status,\n TenantUiService,\n PasswordService\n} from '@c8y/ngx-components';\n\nimport { StatusFilteringFormRendererComponent } from './status.filtering-form-renderer.component';\nimport { CreationTimeFilteringFormRendererComponent } from './creation-time.filtering-form-renderer.component';\n\n@Component({\n selector: 'c8y-tenant-list',\n templateUrl: './tenant-list.component.html'\n})\nexport class TenantListComponent implements OnInit {\n tenants$: BehaviorSubject<ITenant[]> = new BehaviorSubject(undefined);\n currentTenant: ICurrentTenant;\n isManagementTenant: boolean;\n TOP_TENANT_NAME = 'management';\n\n title: string = null;\n loadMoreItemsLabel: string = gettext('Load more tenants');\n loadingItemsLabel: string = gettext('Loading tenants…');\n\n displayOptions: DisplayOptions = {\n bordered: false,\n striped: true,\n filter: true,\n gridHeader: true\n };\n\n columns: Column[] = this.getColumns();\n pagination: Pagination = this.getPagination();\n showSearch = true;\n actionControls: ActionControl[] = this.getActionControls();\n\n TenantStatus = TenantStatus;\n\n constructor(\n public appState: AppStateService,\n private alertService: AlertService,\n private modalService: ModalService,\n private translateService: TranslateService,\n private tenantService: TenantService,\n private tenantUiService: TenantUiService,\n private location: Location,\n private passwordService: PasswordService,\n private userService: UserService\n ) {}\n\n async ngOnInit() {\n this.currentTenant = this.appState.currentTenant.value;\n this.isManagementTenant = await this.tenantUiService.isManagementTenant();\n this.loadTenants();\n }\n\n loadTenants() {\n this.tenants$.next(undefined);\n from(this.tenantService.list({ pageSize: 2000, withTotalPages: true, withApps: false }))\n .pipe(\n expand(resultList => resultList.paging.nextPage !== null && resultList.paging.next()),\n takeWhile(resultList => resultList.paging.nextPage !== null, true),\n reduce(\n (tenants: ITenant[], resultList: IResultList<ITenant>) => [\n ...tenants,\n ...resultList.data\n ],\n []\n ),\n shareReplay(1)\n )\n .subscribe(tenants => this.tenants$.next(tenants));\n }\n\n getColumns(): Column[] {\n return [\n {\n name: 'company',\n header: gettext('Tenant'),\n path: 'company',\n filterable: true,\n sortable: true,\n sortOrder: 'asc' as SortOrder\n },\n {\n name: 'id',\n header: gettext('ID'),\n path: 'id',\n filterable: true,\n sortable: true\n },\n {\n name: 'domain',\n header: gettext('Domain'),\n path: 'domain',\n filterable: true,\n sortable: true\n },\n {\n name: 'parent',\n header: gettext('Parent tenant'),\n path: 'parent',\n filterable: true,\n sortable: true\n },\n {\n name: 'contactName',\n header: gettext('Contact name'),\n path: 'contactName',\n filterable: true,\n sortable: true\n },\n {\n name: 'creationTime',\n header: gettext('Created'),\n path: 'creationTime',\n filterable: true,\n filteringFormRendererComponent: CreationTimeFilteringFormRendererComponent,\n sortable: true\n },\n {\n name: 'externalReference',\n header: gettext('External reference'),\n path: 'customProperties.externalReference',\n filterable: true,\n sortable: true\n },\n {\n name: 'status',\n header: gettext('Status'),\n path: 'status',\n filterable: true,\n filteringFormRendererComponent: StatusFilteringFormRendererComponent,\n sortable: true,\n resizable: false\n }\n ];\n }\n\n getPagination(): Pagination {\n return {\n pageSize: 10,\n currentPage: 1\n };\n }\n\n getActionControls(): ActionControl[] {\n return [\n {\n type: BuiltInActionType.Edit,\n text: gettext('Edit`tenant`'),\n callback: tenant => this.goToDetails(tenant)\n },\n {\n type: 'activateTenantAction',\n icon: 'power-off',\n text: gettext('Activate`tenant`'),\n callback: (tenant: ITenant) => this.activateTenant(tenant),\n showIf: (tenant: ITenant) => this.isSuspended(tenant)\n },\n {\n type: 'suspendTenantAction',\n icon: 'power-off',\n text: gettext('Suspend`tenant`'),\n callback: (tenant: ITenant) => this.suspendTenant(tenant),\n showIf: (tenant: ITenant) => this.isActive(tenant)\n },\n {\n type: BuiltInActionType.Delete,\n text: gettext('Delete`tenant`'),\n callback: tenant => this.delete(tenant),\n showIf: () => this.isManagementTenant\n }\n ];\n }\n\n createTenant() {\n this.location.go('/tenants/new');\n }\n\n goToDetails(tenant: ITenant) {\n this.location.go(`/tenants/${tenant.id}`);\n }\n\n async activateTenant(tenant) {\n try {\n const { data: savedTenant } = await this.tenantService.update({\n id: tenant.id,\n status: TenantStatus.ACTIVE\n });\n Object.assign(tenant, savedTenant);\n this.alertService.success(gettext('Tenant activated.'));\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n async suspendTenant(tenant) {\n const title = gettext('Suspend tenant');\n const confirmationText = gettext(\n 'You are about to suspend tenant \"{{ company }}\" (ID \"{{ id }}\").'\n );\n const proceed = gettext('Do you want to proceed?');\n const body = [\n this.translateService.instant(confirmationText, {\n company: tenant.company,\n id: tenant.id\n }),\n this.translateService.instant(proceed)\n ].join(' ');\n const labels = {\n ok: gettext('Suspend`tenant`')\n };\n try {\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n const confirmed = await this.passwordService.confirmPassword().toPromise();\n if (confirmed === true) {\n const { data: savedTenant } = await this.tenantService.update({\n id: tenant.id,\n status: TenantStatus.SUSPENDED\n });\n Object.assign(tenant, savedTenant);\n this.alertService.success(gettext('Tenant suspended.'));\n }\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n async delete(tenant) {\n const title = gettext('Delete tenant');\n const confirmationText = gettext(\n 'You are about to delete tenant \"{{ company }}\" (ID \"{{ id }}\").'\n );\n const hint = gettext('This operation is irreversible.');\n const proceed = gettext('Do you want to proceed?');\n const body = [\n this.translateService.instant(confirmationText, {\n company: tenant.company,\n id: tenant.id\n }),\n this.translateService.instant(hint),\n this.translateService.instant(proceed)\n ].join(' ');\n const labels = {\n ok: gettext('Delete`tenant`')\n };\n try {\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n const confirmed = await this.passwordService.confirmPassword().toPromise();\n if (confirmed === true) {\n await this.tenantService.delete(tenant);\n const tenantsWithoutRemovedOne = this.tenants$.value.filter(t => t !== tenant);\n this.tenants$.next(tenantsWithoutRemovedOne);\n this.alertService.success(\n gettext('Tenant is being deleted in the background. This might take a while…')\n );\n }\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n isActive(tenant: ITenant) {\n return tenant.status === TenantStatus.ACTIVE;\n }\n\n isSuspended(tenant: ITenant) {\n return tenant.status === TenantStatus.SUSPENDED;\n }\n\n async downloadNewsletterEmails() {\n const { res, data } = await this.userService.getNewsletterEmails();\n const contentType = res.headers.get('content-type');\n const contentDisposition = res.headers.get('content-disposition');\n const filename = /filename=\"(.*)\"/.exec(contentDisposition)[1];\n const blob = new Blob([data], { type: contentType });\n saveAs(blob, filename);\n }\n}\n","<c8y-title>\n {{ 'Subtenants' | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item label=\"{{ 'Tenants' | translate }}\" icon=\"c8y-layers\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"'Subtenants' | translate\"\n [icon]=\"'c8y-layers'\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item *ngIf=\"!!(appState.state$ | async).newsletter\" [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{\n 'Downloads the list of emails of users subscribed for newsletter on the current tenant and its subtenants.'\n | translate\n }}\"\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 type=\"button\"\n title=\"{{ 'Create tenant' | translate }}\"\n (click)=\"createTenant()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Create tenant' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/enterprise-tenant/#managing-tenants\"></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 <div class=\"c8y-empty-state j-c-center\">\n <ng-container *ngIf=\"!(tenants$ | async)\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-container *ngIf=\"(tenants$ | async)?.length === 0\">\n <div class=\"text-center\">\n <h1 c8yIcon=\"c8y-layers\"></h1>\n <h3 translate>There are no tenants defined.</h3>\n <p translate>Create the first tenant.</p>\n <div>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Create tenant' | translate }}\"\n (click)=\"createTenant()\"\n >\n {{ 'Create tenant' | translate }}\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/enterprise-tenant/#managing-tenants\">\n User guide`KEEP_ORIGINAL`\n </a>\n .\n </small>\n </p>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(tenants$ | async)?.length > 0\">\n <div class=\"text-center\">\n <h1 class=\"c8y-icon-duocolor\" c8yIcon=\"search\"></h1>\n <h3 translate>No tenants to display.</h3>\n <p translate>Refine your search terms or check your spelling.</p>\n </div>\n </ng-container>\n </div>\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 *ngIf=\"context.item.status === TenantStatus.ACTIVE\"\n title=\"{{ 'Active`tenant`' | translate }}\"\n >\n <i c8yIcon=\"check-circle\" class=\"text-success\"></i>\n </span>\n <span\n *ngIf=\"context.item.status === TenantStatus.SUSPENDED\"\n title=\"{{ 'Suspended`tenant`' | translate }}\"\n >\n <i c8yIcon=\"ban\" class=\"text-danger\"></i>\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { BsDatepickerModule } from 'ngx-bootstrap/datepicker';\n\nimport { CoreModule, hookNavigator, hookRoute } from '@c8y/ngx-components';\nimport { TenantsNavigationFactory } from './tenants-navigation.factory';\nimport { TenantListComponent } from './tenant-list/tenant-list.component';\nimport { CreationTimeFilteringFormRendererComponent } from './tenant-list/creation-time.filtering-form-renderer.component';\nimport { StatusFilteringFormRendererComponent } from './tenant-list/status.filtering-form-renderer.component';\nimport { TenantsModuleConfig, TENANTS_MODULE_CONFIG } from './tenants.model';\nimport { TenantListGuard } from './tenant-list/tenant-list.guard';\n\n@NgModule({\n imports: [RouterModule, BsDatepickerModule, CoreModule],\n exports: [],\n declarations: [\n TenantListComponent,\n CreationTimeFilteringFormRendererComponent,\n StatusFilteringFormRendererComponent\n ],\n entryComponents: [\n TenantListComponent,\n CreationTimeFilteringFormRendererComponent,\n StatusFilteringFormRendererComponent\n ],\n providers: [\n TenantListGuard,\n hookNavigator(TenantsNavigationFactory),\n hookRoute({\n path: 'tenants',\n icon: 'c8y-layers',\n component: TenantListComponent,\n canActivate: [TenantListGuard]\n })\n ]\n})\nexport class TenantsModule {\n static config(config: TenantsModuleConfig = {}): ModuleWithProviders<TenantsModule> {\n return {\n ngModule: TenantsModule,\n providers: [\n {\n provide: TENANTS_MODULE_CONFIG,\n useValue: config\n }\n ]\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i3"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-tenants.mjs","sources":["../../tenants/tenants.model.ts","../../tenants/tenant-list/tenant-list.guard.ts","../../tenants/tenants-navigation.factory.ts","../../tenants/tenant-list/status.filtering-form-renderer.component.ts","../../tenants/tenant-list/status.filtering-form-renderer.component.html","../../tenants/tenant-list/creation-time.filtering-form-renderer.component.ts","../../tenants/tenant-list/creation-time.filtering-form-renderer.component.html","../../tenants/tenant-list/tenant-list.component.ts","../../tenants/tenant-list/tenant-list.component.html","../../tenants/tenants.module.ts","../../tenants/c8y-ngx-components-tenants.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { NavigatorNode } from '@c8y/ngx-components';\n\nexport const TENANTS_MODULE_CONFIG = new InjectionToken<TenantsModuleConfig>('TenantsModuleConfig');\n\n/**\n * Configuration object for `TenantsModule`.\n */\nexport interface TenantsModuleConfig {\n /**\n * Allows for hiding or customizing \"Subtenants\" navigator node:\n * - `subtenantsNavigatorNode: true` - shows the default navigator node (default),\n * - `subtenantsNavigatorNode: false` - hides the navigator node,\n * - `subtenantsNavigatorNode: { label: 'My subtenants' }` - overrides default navigator node,\n * - `subtenantsNavigatorNode: new NavigatorNode({ label: 'My subtenants' })` - overrides default navigator node.\n */\n subtenantsNavigatorNode?: boolean | Partial<NavigatorNode>;\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { TenantUiService } from '@c8y/ngx-components';\n\n@Injectable()\nexport class TenantListGuard implements CanActivate {\n private active: boolean;\n\n constructor(private tenantUiService: TenantUiService) {}\n\n /**\n * Checks if tenant list should be active,\n * i.e. whether the current tenant can read other tenants.\n * **Note: the check is executed only once in the runtime.**\n *\n * @returns True, if the feature should be active.\n */\n canActivate(): boolean {\n if (this.active === undefined) {\n this.active = this.tenantUiService.canReadTenants();\n }\n return this.active;\n }\n}\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\nimport { TenantListGuard } from './tenant-list/tenant-list.guard';\nimport { TenantsModuleConfig, TENANTS_MODULE_CONFIG } from './tenants.model';\n\n@Injectable()\nexport class TenantsNavigationFactory implements NavigatorNodeFactory {\n private navs: NavigatorNode[] = [];\n\n constructor(\n private tenantListGuard: TenantListGuard,\n @Optional() @Inject(TENANTS_MODULE_CONFIG) private config: TenantsModuleConfig\n ) {}\n\n async get(): Promise<NavigatorNode[]> {\n const canActivateTenantList = await this.tenantListGuard.canActivate();\n if (!this.navs.length) {\n const subtenantsNavigatorNode = this.config?.subtenantsNavigatorNode ?? true;\n if (subtenantsNavigatorNode !== false) {\n this.navs.push(\n new NavigatorNode({\n parent: {\n label: gettext('Tenants'),\n icon: 'c8y-layers'\n },\n label: gettext('Subtenants'),\n icon: 'c8y-sub-tenants',\n path: 'tenants',\n routerLinkExact: false,\n priority: 4000,\n hidden: !canActivateTenantList,\n ...(subtenantsNavigatorNode === true ? {} : subtenantsNavigatorNode)\n })\n );\n }\n }\n return this.navs;\n }\n}\n","import { Component } from '@angular/core';\nimport { ITenant, TenantStatus } from '@c8y/client';\nimport { FilteringFormRendererContext } from '@c8y/ngx-components';\n\n@Component({\n templateUrl: './status.filtering-form-renderer.component.html'\n})\nexport class StatusFilteringFormRendererComponent {\n model: {\n active: boolean;\n suspended: boolean;\n };\n\n constructor(public context: FilteringFormRendererContext) {\n this.model = (this.context.property.externalFilterQuery || {}).model || {};\n }\n\n applyFilter() {\n this.context.applyFilter({\n externalFilterQuery: {\n model: this.model\n },\n filterPredicate: (tenant: ITenant) =>\n Boolean(\n (!this.model.active && !this.model.suspended) ||\n (this.model.active && tenant.status === TenantStatus.ACTIVE) ||\n (this.model.suspended && tenant.status === TenantStatus.SUSPENDED)\n )\n });\n }\n\n resetFilter() {\n this.context.resetFilter();\n }\n}\n","<form #filterForm=\"ngForm\">\n <div class=\"m-b-8 p-t-8\">\n <label>{{ 'Filter by status' | translate }}</label>\n <c8y-form-group class=\"m-b-0\">\n <label class=\"c8y-checkbox\">\n <input type=\"checkbox\" name=\"active\" [(ngModel)]=\"model.active\" />\n <span></span>\n <span>{{ 'Active`tenant`' | translate }}</span>\n </label>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-0\">\n <label class=\"c8y-checkbox\">\n <input type=\"checkbox\" name=\"suspended\" [(ngModel)]=\"model.suspended\" />\n <span></span>\n <span>{{ 'Suspended`tenant`' | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n</form>\n\n<div class=\"data-grid__dropdown__footer d-flex separator-top\">\n <button\n class=\"btn btn-default btn-sm m-r-8 flex-grow\"\n (click)=\"resetFilter()\"\n title=\"{{ 'Reset' | translate }}\"\n >\n {{ 'Reset' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n [disabled]=\"filterForm.invalid\"\n (click)=\"applyFilter()\"\n title=\"{{ 'Apply' | translate }}\"\n >\n {{ 'Apply' | translate }}\n </button>\n</div>\n","import { Component } from '@angular/core';\nimport { ITenant } from '@c8y/client';\nimport { FilteringFormRendererContext } from '@c8y/ngx-components';\n\n@Component({\n templateUrl: './creation-time.filtering-form-renderer.component.html'\n})\nexport class CreationTimeFilteringFormRendererComponent {\n model: {\n dateFrom: Date;\n dateTo: Date;\n };\n\n constructor(public context: FilteringFormRendererContext) {\n this.model = (this.context.property.externalFilterQuery || {}).model || {};\n }\n\n applyFilter() {\n this.context.applyFilter({\n externalFilterQuery: {\n model: this.model\n },\n filterPredicate: (tenant: ITenant) => {\n const creationTime = new Date(tenant.creationTime);\n let dateFrom;\n let dateTo;\n\n if (this.model.dateFrom) {\n dateFrom = this.model.dateFrom;\n dateFrom.setHours(0, 0, 0, 0);\n }\n\n if (this.model.dateTo) {\n dateTo = this.model.dateTo;\n dateTo.setHours(23, 59, 59, 999);\n }\n\n return Boolean(\n (!dateFrom && !dateTo) ||\n (dateFrom && !dateTo && dateFrom <= creationTime) ||\n (!dateFrom && dateTo && creationTime <= dateTo) ||\n (dateFrom && dateTo && dateFrom <= creationTime && creationTime <= dateTo)\n );\n }\n });\n }\n\n resetFilter() {\n this.context.resetFilter();\n }\n}\n","<form #filterForm=\"ngForm\">\n <div class=\"m-b-8 p-t-8\">\n <label>{{ 'Filter by creation time' | translate }}</label>\n <c8y-form-group class=\"datepicker d-block m-b-16\" style=\"max-height: 32px\">\n <input\n name=\"dateFrom\"\n [(ngModel)]=\"model.dateFrom\"\n class=\"form-control fit-w text-left\"\n placeholder=\"{{ 'Created from`date`' | translate }}\"\n bsDatepicker\n [bsConfig]=\"{ customTodayClass: 'today', returnFocusToInput: true }\"\n [maxDate]=\"model.dateTo\"\n />\n </c8y-form-group>\n <c8y-form-group class=\"datepicker m-l-0 d-block\" style=\"max-height: 32px\">\n <input\n name=\"dateTo\"\n [(ngModel)]=\"model.dateTo\"\n class=\"form-control fit-w text-left\"\n placeholder=\"{{ 'Created to`date`' | translate }}\"\n bsDatepicker\n [bsConfig]=\"{ customTodayClass: 'today', returnFocusToInput: true }\"\n [minDate]=\"model.dateFrom\"\n />\n </c8y-form-group>\n </div>\n</form>\n\n<div class=\"data-grid__dropdown__footer d-flex separator-top\">\n <button\n class=\"btn btn-default btn-sm m-r-8 flex-grow\"\n (click)=\"resetFilter()\"\n title=\"{{ 'Reset' | translate }}\"\n >\n {{ 'Reset' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n [disabled]=\"filterForm.invalid\"\n (click)=\"applyFilter()\"\n title=\"{{ 'Apply' | translate }}\"\n >\n {{ 'Apply' | translate }}\n </button>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { Location } from '@angular/common';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, from } from 'rxjs';\nimport { expand, reduce, shareReplay, takeWhile } from 'rxjs/operators';\nimport { saveAs } from 'file-saver';\n\nimport {\n ICurrentTenant,\n IResultList,\n ITenant,\n TenantService,\n TenantStatus,\n UserService\n} from '@c8y/client';\nimport {\n ActionControl,\n AlertService,\n AppStateService,\n BuiltInActionType,\n Column,\n SortOrder,\n DisplayOptions,\n gettext,\n ModalService,\n Pagination,\n Status,\n TenantUiService,\n PasswordService,\n Permissions\n} from '@c8y/ngx-components';\n\nimport { StatusFilteringFormRendererComponent } from './status.filtering-form-renderer.component';\nimport { CreationTimeFilteringFormRendererComponent } from './creation-time.filtering-form-renderer.component';\n\n@Component({\n selector: 'c8y-tenant-list',\n templateUrl: './tenant-list.component.html'\n})\nexport class TenantListComponent implements OnInit {\n tenants$: BehaviorSubject<ITenant[]> = new BehaviorSubject(undefined);\n isPermittedToCreateTenanant = this.permissionsService.hasAnyRole([\n Permissions.ROLE_TENANT_MANAGEMENT_ADMIN,\n Permissions.ROLE_TENANT_MANAGEMENT_CREATE\n ]);\n currentTenant: ICurrentTenant;\n isManagementTenant: boolean;\n TOP_TENANT_NAME = 'management';\n\n title: string = null;\n loadMoreItemsLabel: string = gettext('Load more tenants');\n loadingItemsLabel: string = gettext('Loading tenants…');\n\n displayOptions: DisplayOptions = {\n bordered: false,\n striped: true,\n filter: true,\n gridHeader: true\n };\n\n columns: Column[] = this.getColumns();\n pagination: Pagination = this.getPagination();\n showSearch = true;\n actionControls: ActionControl[] = this.getActionControls();\n\n TenantStatus = TenantStatus;\n\n constructor(\n public appState: AppStateService,\n private alertService: AlertService,\n private modalService: ModalService,\n private translateService: TranslateService,\n private tenantService: TenantService,\n private tenantUiService: TenantUiService,\n private location: Location,\n private passwordService: PasswordService,\n private userService: UserService,\n private permissionsService: Permissions\n ) {}\n\n async ngOnInit() {\n this.currentTenant = this.appState.currentTenant.value;\n this.isManagementTenant = await this.tenantUiService.isManagementTenant();\n this.loadTenants();\n }\n\n loadTenants() {\n this.tenants$.next(undefined);\n from(this.tenantService.list({ pageSize: 2000, withTotalPages: true, withApps: false }))\n .pipe(\n expand(resultList => resultList.paging.nextPage !== null && resultList.paging.next()),\n takeWhile(resultList => resultList.paging.nextPage !== null, true),\n reduce(\n (tenants: ITenant[], resultList: IResultList<ITenant>) => [\n ...tenants,\n ...resultList.data\n ],\n []\n ),\n shareReplay(1)\n )\n .subscribe(tenants => this.tenants$.next(tenants));\n }\n\n getColumns(): Column[] {\n return [\n {\n name: 'company',\n header: gettext('Tenant'),\n path: 'company',\n filterable: true,\n sortable: true,\n sortOrder: 'asc' as SortOrder\n },\n {\n name: 'id',\n header: gettext('ID'),\n path: 'id',\n filterable: true,\n sortable: true\n },\n {\n name: 'domain',\n header: gettext('Domain'),\n path: 'domain',\n filterable: true,\n sortable: true\n },\n {\n name: 'parent',\n header: gettext('Parent tenant'),\n path: 'parent',\n filterable: true,\n sortable: true\n },\n {\n name: 'contactName',\n header: gettext('Contact name'),\n path: 'contactName',\n filterable: true,\n sortable: true\n },\n {\n name: 'creationTime',\n header: gettext('Created'),\n path: 'creationTime',\n filterable: true,\n filteringFormRendererComponent: CreationTimeFilteringFormRendererComponent,\n sortable: true\n },\n {\n name: 'externalReference',\n header: gettext('External reference'),\n path: 'customProperties.externalReference',\n filterable: true,\n sortable: true\n },\n {\n name: 'status',\n header: gettext('Status'),\n path: 'status',\n filterable: true,\n filteringFormRendererComponent: StatusFilteringFormRendererComponent,\n sortable: true,\n resizable: false\n }\n ];\n }\n\n getPagination(): Pagination {\n return {\n pageSize: 10,\n currentPage: 1\n };\n }\n\n getActionControls(): ActionControl[] {\n return [\n {\n type: BuiltInActionType.Edit,\n text: gettext('Edit`tenant`'),\n callback: tenant => this.goToDetails(tenant)\n },\n {\n type: 'activateTenantAction',\n icon: 'power-off',\n text: gettext('Activate`tenant`'),\n callback: (tenant: ITenant) => this.activateTenant(tenant),\n showIf: (tenant: ITenant) => this.isSuspended(tenant)\n },\n {\n type: 'suspendTenantAction',\n icon: 'power-off',\n text: gettext('Suspend`tenant`'),\n callback: (tenant: ITenant) => this.suspendTenant(tenant),\n showIf: (tenant: ITenant) => this.isActive(tenant)\n },\n {\n type: BuiltInActionType.Delete,\n text: gettext('Delete`tenant`'),\n callback: tenant => this.delete(tenant),\n showIf: () => this.isManagementTenant\n }\n ];\n }\n\n createTenant() {\n this.location.go('/tenants/new');\n }\n\n goToDetails(tenant: ITenant) {\n this.location.go(`/tenants/${tenant.id}`);\n }\n\n async activateTenant(tenant) {\n try {\n const { data: savedTenant } = await this.tenantService.update({\n id: tenant.id,\n status: TenantStatus.ACTIVE\n });\n Object.assign(tenant, savedTenant);\n this.alertService.success(gettext('Tenant activated.'));\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n async suspendTenant(tenant) {\n const title = gettext('Suspend tenant');\n const confirmationText = gettext(\n 'You are about to suspend tenant \"{{ company }}\" (ID \"{{ id }}\").'\n );\n const proceed = gettext('Do you want to proceed?');\n const body = [\n this.translateService.instant(confirmationText, {\n company: tenant.company,\n id: tenant.id\n }),\n this.translateService.instant(proceed)\n ].join(' ');\n const labels = {\n ok: gettext('Suspend`tenant`')\n };\n try {\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n const confirmed = await this.passwordService.confirmPassword().toPromise();\n if (confirmed === true) {\n const { data: savedTenant } = await this.tenantService.update({\n id: tenant.id,\n status: TenantStatus.SUSPENDED\n });\n Object.assign(tenant, savedTenant);\n this.alertService.success(gettext('Tenant suspended.'));\n }\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n async delete(tenant) {\n const title = gettext('Delete tenant');\n const confirmationText = gettext(\n 'You are about to delete tenant \"{{ company }}\" (ID \"{{ id }}\").'\n );\n const hint = gettext('This operation is irreversible.');\n const proceed = gettext('Do you want to proceed?');\n const body = [\n this.translateService.instant(confirmationText, {\n company: tenant.company,\n id: tenant.id\n }),\n this.translateService.instant(hint),\n this.translateService.instant(proceed)\n ].join(' ');\n const labels = {\n ok: gettext('Delete`tenant`')\n };\n try {\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n const confirmed = await this.passwordService.confirmPassword().toPromise();\n if (confirmed === true) {\n await this.tenantService.delete(tenant);\n const tenantsWithoutRemovedOne = this.tenants$.value.filter(t => t !== tenant);\n this.tenants$.next(tenantsWithoutRemovedOne);\n this.alertService.success(\n gettext('Tenant is being deleted in the background. This might take a while…')\n );\n }\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n isActive(tenant: ITenant) {\n return tenant.status === TenantStatus.ACTIVE;\n }\n\n isSuspended(tenant: ITenant) {\n return tenant.status === TenantStatus.SUSPENDED;\n }\n\n async downloadNewsletterEmails() {\n const { res, data } = await this.userService.getNewsletterEmails();\n const contentType = res.headers.get('content-type');\n const contentDisposition = res.headers.get('content-disposition');\n const filename = /filename=\"(.*)\"/.exec(contentDisposition)[1];\n const blob = new Blob([data], { type: contentType });\n saveAs(blob, filename);\n }\n}\n","<c8y-title>\n {{ 'Subtenants' | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item label=\"{{ 'Tenants' | translate }}\" icon=\"c8y-layers\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"'Subtenants' | translate\"\n [icon]=\"'c8y-layers'\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item *ngIf=\"!!(appState.state$ | async).newsletter\" [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{\n 'Downloads the list of emails of users subscribed for newsletter on the current tenant and its subtenants.'\n | translate\n }}\"\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 type=\"button\"\n title=\"{{ 'Create tenant' | translate }}\"\n (click)=\"createTenant()\"\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=\"/users-guide/enterprise-tenant/#managing-tenants\"></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 <div class=\"c8y-empty-state j-c-center\">\n <ng-container *ngIf=\"!(tenants$ | async)\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-container *ngIf=\"(tenants$ | async)?.length === 0\">\n <div class=\"text-center\">\n <h1 c8yIcon=\"c8y-layers\"></h1>\n <h3 translate>There are no tenants defined.</h3>\n <p translate>Create the first tenant.</p>\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 translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/enterprise-tenant/#managing-tenants\">\n User guide`KEEP_ORIGINAL`\n </a>\n .\n </small>\n </p>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(tenants$ | async)?.length > 0\">\n <div class=\"text-center\">\n <h1 class=\"c8y-icon-duocolor\" c8yIcon=\"search\"></h1>\n <h3 translate>No tenants to display.</h3>\n <p translate>Refine your search terms or check your spelling.</p>\n </div>\n </ng-container>\n </div>\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 *ngIf=\"context.item.status === TenantStatus.ACTIVE\"\n title=\"{{ 'Active`tenant`' | translate }}\"\n >\n <i c8yIcon=\"check-circle\" class=\"text-success\"></i>\n </span>\n <span\n *ngIf=\"context.item.status === TenantStatus.SUSPENDED\"\n title=\"{{ 'Suspended`tenant`' | translate }}\"\n >\n <i c8yIcon=\"ban\" class=\"text-danger\"></i>\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { BsDatepickerModule } from 'ngx-bootstrap/datepicker';\n\nimport { CoreModule, hookNavigator, hookRoute } from '@c8y/ngx-components';\nimport { TenantsNavigationFactory } from './tenants-navigation.factory';\nimport { TenantListComponent } from './tenant-list/tenant-list.component';\nimport { CreationTimeFilteringFormRendererComponent } from './tenant-list/creation-time.filtering-form-renderer.component';\nimport { StatusFilteringFormRendererComponent } from './tenant-list/status.filtering-form-renderer.component';\nimport { TenantsModuleConfig, TENANTS_MODULE_CONFIG } from './tenants.model';\nimport { TenantListGuard } from './tenant-list/tenant-list.guard';\n\n@NgModule({\n imports: [RouterModule, BsDatepickerModule, CoreModule],\n exports: [],\n declarations: [\n TenantListComponent,\n CreationTimeFilteringFormRendererComponent,\n StatusFilteringFormRendererComponent\n ],\n entryComponents: [\n TenantListComponent,\n CreationTimeFilteringFormRendererComponent,\n StatusFilteringFormRendererComponent\n ],\n providers: [\n TenantListGuard,\n hookNavigator(TenantsNavigationFactory),\n hookRoute({\n path: 'tenants',\n icon: 'c8y-layers',\n component: TenantListComponent,\n canActivate: [TenantListGuard]\n })\n ]\n})\nexport class TenantsModule {\n static config(config: TenantsModuleConfig = {}): ModuleWithProviders<TenantsModule> {\n return {\n ngModule: TenantsModule,\n providers: [\n {\n provide: TENANTS_MODULE_CONFIG,\n useValue: config\n }\n ]\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i3"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { NgZone, Injectable, NgModule, Inject, Component, ChangeDetectionStrategy, Optional } from '@angular/core';
|
|
3
3
|
import { setAngularJSGlobal, downgradeComponent, downgradeInjectable } from '@angular/upgrade/static';
|
|
4
4
|
import * as i2 from '@c8y/ngx-components';
|
|
5
|
-
import { DatePipe, ViewContext, EmptyComponent, gettext, AppStateService, RouterService, ActionService, TenantUiService, RouterModule, hookNavigator, hookTab, hookActionBar, hookAction, hookBreadcrumb, hookDocs, BootstrapComponent, UserTotpRevokeComponent, DataGridComponent, LoadingComponent, RangeDisplayComponent, HelpComponent, HighlightComponent, EmptyStateComponent, HOOK_PATTERN_MESSAGES, HeaderService, AlertService, UserMenuService, DocsService, PasswordService, CachedLocaleDictionaryService, ModalService, GainsightService, FilesService, NavigatorNodeRoot, getActivatedRoute, DynamicDatapointsResolver, DynamicManagedObjectResolver, C8yTranslateModule, hookComponent } from '@c8y/ngx-components';
|
|
5
|
+
import { DatePipe, ViewContext, EmptyComponent, gettext, AppStateService, RouterService, ActionService, TenantUiService, RouterModule, hookNavigator, hookTab, hookActionBar, hookAction, hookBreadcrumb, hookDocs, BootstrapComponent, UserTotpRevokeComponent, DataGridComponent, LoadingComponent, RangeDisplayComponent, HelpComponent, HighlightComponent, EmptyStateComponent, HOOK_PATTERN_MESSAGES, HeaderService, AlertService, UserMenuService, DocsService, PasswordService, CachedLocaleDictionaryService, ModalService, GainsightService, GlobalConfigService, FilesService, NavigatorNodeRoot, getActivatedRoute, DynamicDatapointsResolver, DynamicManagedObjectResolver, C8yTranslateModule, hookComponent } from '@c8y/ngx-components';
|
|
6
6
|
import * as angular from 'angular';
|
|
7
7
|
import { filter, merge, debounceTime, switchMap, startWith, map as map$1, shareReplay, take } from 'rxjs/operators';
|
|
8
8
|
import { ReplaySubject, BehaviorSubject, of, combineLatest, from, fromEventPattern, Subject, defer } from 'rxjs';
|
|
@@ -800,6 +800,7 @@ const cachedLocaleDictionaryService = downgradeInjectable(CachedLocaleDictionary
|
|
|
800
800
|
const serverMessagesService = downgradeInjectable(ServerMessagesService);
|
|
801
801
|
const modalService = downgradeInjectable(ModalService);
|
|
802
802
|
const gainsightService = downgradeInjectable(GainsightService);
|
|
803
|
+
const globalConfigService = downgradeInjectable(GlobalConfigService);
|
|
803
804
|
const filesService = downgradeInjectable(FilesService);
|
|
804
805
|
const deviceTypeDetailEditedService = downgradeInjectable(DeviceTypeDetailEditedService);
|
|
805
806
|
|
|
@@ -1170,7 +1171,8 @@ angular
|
|
|
1170
1171
|
.service('c8yPasswordConfirm', passwordService)
|
|
1171
1172
|
.service('c8yModalService', modalService)
|
|
1172
1173
|
.service('c8yGainsightService', gainsightService)
|
|
1173
|
-
.service('c8yFilesService', filesService)
|
|
1174
|
+
.service('c8yFilesService', filesService)
|
|
1175
|
+
.service('c8yGlobalConfigService', globalConfigService);
|
|
1174
1176
|
angular
|
|
1175
1177
|
.module('c8y.ui')
|
|
1176
1178
|
.filter('absoluteDate', absoluteDateService)
|