import {Component, ViewChild, OnInit, ElementRef} from '@angular/core'; import {ActivatedRoute, Router} from '@angular/router'; import {HelpContentService} from '../../services/help-content.service'; import {FormBuilder, FormControl, FormGroup, Validators} from '@angular/forms'; import {CheckEntity, Entity} from '../../utils/entities/adminTool/entity'; import {Portal} from '../../utils/entities/adminTool/portal'; import {EnvProperties} from '../../utils/properties/env-properties'; import {Session} from '../../login/utils/helper.class'; import {LoginErrorCodes} from '../../login/utils/guardHelper.class'; import {HelperFunctions} from "../../utils/HelperFunctions.class"; import {UserManagementService} from '../../services/user-management.service'; import {Subscriber} from "rxjs"; import {properties} from "../../../../environments/environment"; import {ConnectHelper} from "../../connect/connectHelper"; @Component({ selector: 'entities', templateUrl: './entities.component.html', }) export class EntitiesComponent implements OnInit { @ViewChild('AlertModalSaveEntity') alertModalSaveEntity; @ViewChild('AlertModalDeleteEntities') alertModalDeleteEntities; private selectedEntities: string[] = []; public checkboxes: CheckEntity[] = []; public entities: Entity[] = []; public myForm: FormGroup; private searchText: RegExp = new RegExp(''); public keyword = ''; public communities: Portal[] = []; public portal: string; @ViewChild('AlertModalRelatedPages') alertModalRelatedPages; public toggleIds: string[]; public toggleStatus: boolean; public properties: EnvProperties = properties; public showLoading = true; public errorMessage = ''; public updateErrorMessage = ''; public modalErrorMessage = ''; public isPortalAdministrator = null; public filterForm: FormGroup; private subscriptions: any[] = []; constructor(private element: ElementRef, private route: ActivatedRoute, private _router: Router, private _helpContentService: HelpContentService, private userManagementService: UserManagementService, private _fb: FormBuilder) { } ngOnInit() { this.filterForm = this._fb.group({ keyword: [''], status: ['all', Validators.required] }); this.myForm = this._fb.group({ pid: ['', Validators.required], name: ['', Validators.required], isEnabled: '', _id: '' }); this.subscriptions.push(this.filterForm.get('keyword').valueChanges.subscribe(value => { this.filterBySearch(value); })); this.subscriptions.push(this.filterForm.get('status').valueChanges.subscribe(value => { this.applyStatusFilter(); })); this.userManagementService.getUserInfo().subscribe(user => { this.portal = (this.route.snapshot.data.portal) ? this.route.snapshot.data.portal : this.route.snapshot.params[this.route.snapshot.data.param]; if(this.portal === 'connect' || this.portal === 'explore') { ConnectHelper.setPortalTypeFromPid(this.portal); } this.applyPortalFilter(this.portal); this.isPortalAdministrator = Session.isPortalAdministrator(user) && !this.portal; }); } ngOnDestroy(): void { this.subscriptions.forEach(value => { if (value instanceof Subscriber) { value.unsubscribe(); } else if (value instanceof Function) { value(); } }); } getEntities(portal: string) { if (!Session.isLoggedIn()) { this._router.navigate(['/user-info'], {queryParams: {'errorCode': LoginErrorCodes.NOT_VALID, 'redirectUrl': this._router.url}}); } else { this.showLoading = true; this.updateErrorMessage = ''; this.errorMessage = ''; if (portal) { this._helpContentService.getCommunityEntities(portal, this.properties.adminToolsAPIURL).subscribe( entities => { this.entities = entities; this.checkboxes = []; let self = this; entities.forEach(_ => { self.checkboxes.push({entity: _, checked: false}); }); this.showLoading = false; }, error => this.handleError('System error retrieving entities', error)); } else { this._helpContentService.getEntities(this.properties.adminToolsAPIURL).subscribe( entities => { this.entities = entities; this.checkboxes = []; let self = this; entities.forEach(_ => { self.checkboxes.push({entity: _, checked: false}); }); this.showLoading = false; }, error => this.handleError('System error retrieving entities', error)); } } } public toggleCheckBoxes(event) { this.checkboxes.forEach(_ => _.checked = event.target.checked); } public applyCheck(flag: boolean) { this.checkboxes.forEach(_ => _.checked = flag); } public getSelectedEntities(): string[] { return this.checkboxes.filter(entity => entity.checked === true).map(checkedEntity => checkedEntity.entity).map(res => res._id); } private deleteEntitiesFromArray(ids: string[]): void { for (let id of ids) { const i = this.checkboxes.findIndex(_ => _.entity._id === id); this.checkboxes.splice(i, 1); } } public confirmDeleteEntity(id: string) { // this.deleteConfirmationModal.ids = [id]; // this.deleteConfirmationModal.showModal(); this.selectedEntities = [id]; this.confirmDeleteEntitiesModalOpen(); } public confirmDeleteSelectedEntities() { // this.deleteConfirmationModal.ids = this.getSelectedEntities(); // this.deleteConfirmationModal.showModal(); this.selectedEntities = this.getSelectedEntities(); this.confirmDeleteEntitiesModalOpen(); } private confirmDeleteEntitiesModalOpen() { if (!Session.isLoggedIn()) { this._router.navigate(['/user-info'], {queryParams: {'errorCode': LoginErrorCodes.NOT_VALID, 'redirectUrl': this._router.url}}); } else { this.alertModalDeleteEntities.cancelButton = true; this.alertModalDeleteEntities.okButton = true; this.alertModalDeleteEntities.alertTitle = 'Delete Confirmation'; this.alertModalDeleteEntities.message = 'Are you sure you want to delete the selected entity(-ies)?'; this.alertModalDeleteEntities.okButtonText = 'Yes'; this.alertModalDeleteEntities.open(); } } public confirmedDeleteEntities(data: any) { if (!Session.isLoggedIn()) { this._router.navigate(['/user-info'], {queryParams: {'errorCode': LoginErrorCodes.NOT_VALID, 'redirectUrl': this._router.url}}); } else { this.showLoading = true; this.updateErrorMessage = ''; this._helpContentService.deleteEntities(this.selectedEntities, this.properties.adminToolsAPIURL).subscribe( _ => { this.deleteEntitiesFromArray(this.selectedEntities); this.showLoading = false; }, error => this.handleUpdateError('System error deleting the selected entities', error) ); } } public editEntity(i: number) { const entity: Entity = this.checkboxes[i].entity; this.myForm = this._fb.group({ name: [entity.name, Validators.required], _id: entity._id, pid: [entity.pid, Validators.required], }); this.modalErrorMessage = ''; this.entitiesModalOpen(this.alertModalSaveEntity, '', 'Save Changes'); } public newEntity() { this.myForm = this._fb.group({ pid: ['', Validators.required], name: ['', Validators.required], isEnabled: '', _id: '' }); this.modalErrorMessage = ''; this.entitiesModalOpen(this.alertModalSaveEntity, '', 'Save'); } private entitiesModalOpen(modal: any, title: string, yesBtn: string) { if (!Session.isLoggedIn()) { this._router.navigate(['/user-info'], {queryParams: {'errorCode': LoginErrorCodes.NOT_VALID, 'redirectUrl': this._router.url}}); } else { modal.cancelButton = true; modal.okButton = true; modal.alertTitle = title; modal.okButtonText = yesBtn; modal.open(); } } public entitySaveConfirmed(data: any) { if (!Session.isLoggedIn()) { this._router.navigate(['/user-info'], {queryParams: {'errorCode': LoginErrorCodes.NOT_VALID, 'redirectUrl': this._router.url}}); } else { this.modalErrorMessage = ''; if (this.myForm.getRawValue()['_id'].length > 0) { this._helpContentService.updateEntity( this.myForm.value, this.properties.adminToolsAPIURL).subscribe( entity => { this.entityUpdatedSuccessfully(entity); }, error => this.handleUpdateError('System error updating entity', error) ); } else { this._helpContentService.saveEntity(this.myForm.value, this.properties.adminToolsAPIURL).subscribe( entity => { this.entitySavedSuccessfully(entity); }, error => this.handleUpdateError('System error creating entity', error) ); } } } public entitySavedSuccessfully(entity: Entity) { this.checkboxes.push({entity: entity, checked: false}); this.applyCheck(false); } public entityUpdatedSuccessfully(entity: Entity) { this.checkboxes.find(checkItem => checkItem.entity._id === entity._id).entity = entity; this.applyCheck(false); } public filterBySearch(text: string) { this.searchText = new RegExp(text, 'i'); this.applyFilter(); } public applyFilter() { this.checkboxes = []; this.entities.filter(item => this.filterEntities(item)).forEach( _ => this.checkboxes.push({entity: _, checked: false}) ); } public filterEntities(entity: Entity): boolean { const textFlag = this.searchText.toString() === '' || (entity.name).match(this.searchText) != null; return textFlag; } public applyStatusFilter() { this.checkboxes = []; this.entities.filter(item => this.filterEntitiesByStatus(item)).forEach( _ => this.checkboxes.push({entity: _, checked: false}) ); } public filterEntitiesByStatus(entity: Entity): boolean { let status = this.filterForm.get("status").value; return status == "all" || (status == "disabled" && !entity.isEnabled) || (status == "enabled" && entity.isEnabled); } handleError(message: string, error) { this.errorMessage = message; console.log('Server responded: ' + error); this.showLoading = false; } handleUpdateError(message: string, error) { if (error == null) { this.myForm = this._fb.group({ pid: ['', Validators.required], name: ['', Validators.required], isEnabled: '', _id: '' }); } else { this.updateErrorMessage = message; console.log('Server responded: ' + error); } this.showLoading = false; } public applyPortalFilter(portal: string) { this.getEntities(portal); } public toggleEntities(status: boolean, ids: string[]) { // this.okModal.showModal(); this.toggleIds = ids; this.toggleStatus = status; this.confirmRelatedPagesModalOpen(); } private confirmRelatedPagesModalOpen() { if (!Session.isLoggedIn()) { this._router.navigate(['/user-info'], {queryParams: {'errorCode': LoginErrorCodes.NOT_VALID, 'redirectUrl': this._router.url}}); } else { this.alertModalRelatedPages.cancelButton = true; this.alertModalRelatedPages.okButton = true; this.alertModalRelatedPages.alertTitle = 'Warning'; this.alertModalRelatedPages.message = "This action will affect all search pages related to this entity! Pages' status will change to entity's status! Do you want to continue?"; this.alertModalRelatedPages.okButtonText = 'Yes'; this.alertModalRelatedPages.open(); } } public continueToggling(event: any) { if (!Session.isLoggedIn()) { this._router.navigate(['/user-info'], {queryParams: {'errorCode': LoginErrorCodes.NOT_VALID, 'redirectUrl': this._router.url}}); } else { this.updateErrorMessage = ''; this._helpContentService.toggleEntities( this.portal, this.toggleIds, this.toggleStatus, this.properties.adminToolsAPIURL).subscribe( () => { for (let id of this.toggleIds) { const i = this.checkboxes.findIndex(_ => _.entity._id === id); this.checkboxes[i].entity.isEnabled = this.toggleStatus; } this.applyCheck(false); }, error => this.handleUpdateError('System error changing the status of the selected entity(-ies)', error) ); } } }