2021-07-21 11:32:27 +02:00
|
|
|
import {
|
|
|
|
Component,
|
|
|
|
OnInit,
|
|
|
|
ViewChild,
|
|
|
|
ViewContainerRef
|
|
|
|
} from '@angular/core';
|
|
|
|
import { ActivatedRoute } from '@angular/router';
|
|
|
|
|
2021-10-15 00:59:43 +02:00
|
|
|
import { first } from 'rxjs/operators';
|
|
|
|
|
2021-07-21 11:32:27 +02:00
|
|
|
import { ApiService } from 'jslib-common/abstractions/api.service';
|
|
|
|
import { I18nService } from 'jslib-common/abstractions/i18n.service';
|
2021-08-05 03:53:15 +02:00
|
|
|
import { LogService } from 'jslib-common/abstractions/log.service';
|
2021-07-21 11:32:27 +02:00
|
|
|
import { PlatformUtilsService } from 'jslib-common/abstractions/platformUtils.service';
|
|
|
|
import { SearchService } from 'jslib-common/abstractions/search.service';
|
|
|
|
import { UserService } from 'jslib-common/abstractions/user.service';
|
|
|
|
|
2021-08-27 14:50:58 +02:00
|
|
|
import { ModalService } from 'jslib-angular/services/modal.service';
|
|
|
|
import { ValidationService } from 'jslib-angular/services/validation.service';
|
|
|
|
|
2021-08-09 19:24:12 +02:00
|
|
|
import { PlanType } from 'jslib-common/enums/planType';
|
2021-08-05 03:53:15 +02:00
|
|
|
import { ProviderUserType } from 'jslib-common/enums/providerUserType';
|
|
|
|
|
2021-08-25 16:10:17 +02:00
|
|
|
import { Organization } from 'jslib-common/models/domain/organization';
|
2021-07-21 11:32:27 +02:00
|
|
|
import {
|
|
|
|
ProviderOrganizationOrganizationDetailsResponse
|
|
|
|
} from 'jslib-common/models/response/provider/providerOrganizationResponse';
|
|
|
|
|
|
|
|
import { ProviderService } from '../services/provider.service';
|
2021-08-05 03:53:15 +02:00
|
|
|
|
2021-07-21 11:32:27 +02:00
|
|
|
import { AddOrganizationComponent } from './add-organization.component';
|
|
|
|
|
2021-08-09 19:24:12 +02:00
|
|
|
const DisallowedPlanTypes = [PlanType.Free, PlanType.FamiliesAnnually2019, PlanType.FamiliesAnnually];
|
|
|
|
|
2021-07-21 11:32:27 +02:00
|
|
|
@Component({
|
|
|
|
templateUrl: 'clients.component.html',
|
|
|
|
})
|
|
|
|
export class ClientsComponent implements OnInit {
|
|
|
|
|
|
|
|
@ViewChild('add', { read: ViewContainerRef, static: true }) addModalRef: ViewContainerRef;
|
|
|
|
|
|
|
|
providerId: any;
|
|
|
|
searchText: string;
|
2021-08-09 19:24:12 +02:00
|
|
|
addableOrganizations: Organization[];
|
2021-07-21 11:32:27 +02:00
|
|
|
loading = true;
|
2021-08-05 03:53:15 +02:00
|
|
|
manageOrganizations = false;
|
2021-07-21 11:32:27 +02:00
|
|
|
showAddExisting = false;
|
|
|
|
|
|
|
|
clients: ProviderOrganizationOrganizationDetailsResponse[];
|
|
|
|
pagedClients: ProviderOrganizationOrganizationDetailsResponse[];
|
|
|
|
|
|
|
|
protected didScroll = false;
|
|
|
|
protected pageSize = 100;
|
|
|
|
protected actionPromise: Promise<any>;
|
|
|
|
private pagedClientsCount = 0;
|
|
|
|
|
|
|
|
constructor(private route: ActivatedRoute, private userService: UserService,
|
|
|
|
private apiService: ApiService, private searchService: SearchService,
|
|
|
|
private platformUtilsService: PlatformUtilsService, private i18nService: I18nService,
|
2021-12-07 20:41:45 +01:00
|
|
|
private validationService: ValidationService, private providerService: ProviderService,
|
|
|
|
private logService: LogService, private modalService: ModalService) { }
|
2021-07-21 11:32:27 +02:00
|
|
|
|
|
|
|
async ngOnInit() {
|
|
|
|
this.route.parent.params.subscribe(async params => {
|
|
|
|
this.providerId = params.providerId;
|
|
|
|
|
|
|
|
await this.load();
|
2021-07-21 19:53:21 +02:00
|
|
|
|
2021-10-15 00:59:43 +02:00
|
|
|
this.route.queryParams.pipe(first()).subscribe(async qParams => {
|
2021-07-21 19:53:21 +02:00
|
|
|
this.searchText = qParams.search;
|
|
|
|
});
|
2021-07-21 11:32:27 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async load() {
|
|
|
|
const response = await this.apiService.getProviderClients(this.providerId);
|
|
|
|
this.clients = response.data != null && response.data.length > 0 ? response.data : [];
|
2021-08-05 03:53:15 +02:00
|
|
|
this.manageOrganizations = (await this.userService.getProvider(this.providerId)).type === ProviderUserType.ProviderAdmin;
|
2021-08-31 19:01:29 +02:00
|
|
|
const candidateOrgs = (await this.userService.getAllOrganizations()).filter(o => o.isOwner && o.providerId == null);
|
2021-08-09 19:24:12 +02:00
|
|
|
const allowedOrgsIds = await Promise.all(candidateOrgs.map(o => this.apiService.getOrganization(o.id))).then(orgs =>
|
|
|
|
orgs.filter(o => !DisallowedPlanTypes.includes(o.planType))
|
|
|
|
.map(o => o.id));
|
|
|
|
this.addableOrganizations = candidateOrgs.filter(o => allowedOrgsIds.includes(o.id));
|
|
|
|
|
2021-08-25 16:10:17 +02:00
|
|
|
this.showAddExisting = this.addableOrganizations.length !== 0;
|
2021-07-21 11:32:27 +02:00
|
|
|
this.loading = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
isPaging() {
|
|
|
|
const searching = this.isSearching();
|
|
|
|
if (searching && this.didScroll) {
|
|
|
|
this.resetPaging();
|
|
|
|
}
|
|
|
|
return !searching && this.clients && this.clients.length > this.pageSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
isSearching() {
|
|
|
|
return this.searchService.isSearchable(this.searchText);
|
|
|
|
}
|
|
|
|
|
|
|
|
async resetPaging() {
|
|
|
|
this.pagedClients = [];
|
|
|
|
this.loadMore();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
loadMore() {
|
|
|
|
if (!this.clients || this.clients.length <= this.pageSize) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const pagedLength = this.pagedClients.length;
|
|
|
|
let pagedSize = this.pageSize;
|
|
|
|
if (pagedLength === 0 && this.pagedClientsCount > this.pageSize) {
|
|
|
|
pagedSize = this.pagedClientsCount;
|
|
|
|
}
|
|
|
|
if (this.clients.length > pagedLength) {
|
|
|
|
this.pagedClients = this.pagedClients.concat(this.clients.slice(pagedLength, pagedLength + pagedSize));
|
|
|
|
}
|
|
|
|
this.pagedClientsCount = this.pagedClients.length;
|
|
|
|
this.didScroll = this.pagedClients.length > this.pageSize;
|
|
|
|
}
|
|
|
|
|
2021-08-27 14:50:58 +02:00
|
|
|
async addExistingOrganization() {
|
2021-08-31 16:42:43 +02:00
|
|
|
const [modal] = await this.modalService.openViewRef(AddOrganizationComponent, this.addModalRef, comp => {
|
2021-08-27 14:50:58 +02:00
|
|
|
comp.providerId = this.providerId;
|
|
|
|
comp.organizations = this.addableOrganizations;
|
|
|
|
comp.onAddedOrganization.subscribe(async () => {
|
|
|
|
try {
|
|
|
|
await this.load();
|
|
|
|
modal.close();
|
|
|
|
} catch (e) {
|
|
|
|
this.logService.error(`Handled exception: ${e}`);
|
|
|
|
}
|
|
|
|
});
|
2021-07-21 11:32:27 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async remove(organization: ProviderOrganizationOrganizationDetailsResponse) {
|
|
|
|
const confirmed = await this.platformUtilsService.showDialog(
|
|
|
|
this.i18nService.t('detachOrganizationConfirmation'), organization.organizationName,
|
|
|
|
this.i18nService.t('yes'), this.i18nService.t('no'), 'warning');
|
|
|
|
|
|
|
|
if (!confirmed) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.actionPromise = this.providerService.detachOrganizastion(this.providerId, organization.id);
|
|
|
|
try {
|
|
|
|
await this.actionPromise;
|
2021-12-07 20:41:45 +01:00
|
|
|
this.platformUtilsService.showToast('success', null,
|
|
|
|
this.i18nService.t('detachedOrganization', organization.organizationName));
|
2021-07-21 11:32:27 +02:00
|
|
|
await this.load();
|
|
|
|
} catch (e) {
|
|
|
|
this.validationService.showError(e);
|
|
|
|
}
|
|
|
|
this.actionPromise = null;
|
|
|
|
}
|
|
|
|
}
|