2021-01-28 17:33:16 +01:00
import { Component , ElementRef , OnInit , ViewChild } from '@angular/core' ;
2019-12-18 16:14:21 +01:00
import { ActivatedRoute , Router } from '@angular/router' ;
import { HelpContentService } from '../../services/help-content.service' ;
2021-01-28 17:33:16 +01:00
import { FormBuilder , FormGroup , Validators } from '@angular/forms' ;
2019-12-18 16:14:21 +01:00
import { CheckEntity , Entity } from '../../utils/entities/adminTool/entity' ;
2020-09-24 13:18:24 +02:00
import { Portal } from '../../utils/entities/adminTool/portal' ;
2019-12-18 16:14:21 +01:00
import { EnvProperties } from '../../utils/properties/env-properties' ;
import { Session } from '../../login/utils/helper.class' ;
import { UserManagementService } from '../../services/user-management.service' ;
import { Subscriber } from "rxjs" ;
2021-01-11 10:21:42 +01:00
import { properties } from "../../../../environments/environment" ;
2021-01-28 17:33:16 +01:00
import { AlertModal } from "../../utils/modal/alert" ;
2021-02-02 13:29:18 +01:00
import { SearchInputComponent } from "../../sharedComponents/search-input/search-input.component" ;
2021-03-19 17:51:02 +01:00
import { StringUtils } from "../../utils/string-utils.class" ;
import { Title } from "@angular/platform-browser" ;
2022-03-22 16:47:38 +01:00
import { StakeholderService } from '../../monitor/services/stakeholder.service' ;
2019-12-18 16:14:21 +01:00
2021-02-01 20:17:55 +01:00
declare var UIkit ;
2019-12-18 16:14:21 +01:00
@Component ( {
selector : 'entities' ,
templateUrl : './entities.component.html' ,
} )
export class EntitiesComponent implements OnInit {
2021-01-26 17:21:55 +01:00
2021-01-28 17:33:16 +01:00
@ViewChild ( 'editModal' ) editModal : AlertModal ;
@ViewChild ( 'deleteModal' ) deleteModal : AlertModal ;
@ViewChild ( 'relatedPages' ) relatedPages : AlertModal ;
2019-12-18 16:14:21 +01:00
private selectedEntities : string [ ] = [ ] ;
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public checkboxes : CheckEntity [ ] = [ ] ;
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public entities : Entity [ ] = [ ] ;
2021-01-26 17:21:55 +01:00
2021-01-28 17:33:16 +01:00
public entityForm : FormGroup ;
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
private searchText : RegExp = new RegExp ( '' ) ;
public keyword = '' ;
2021-01-26 17:21:55 +01:00
2020-09-24 13:18:24 +02:00
public communities : Portal [ ] = [ ] ;
2021-01-26 18:00:40 +01:00
public portal : string ;
2022-03-22 16:47:38 +01:00
public name : string ;
2022-03-24 13:56:55 +01:00
public logo : string ;
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public toggleIds : string [ ] ;
public toggleStatus : boolean ;
2021-01-26 17:21:55 +01:00
public properties : EnvProperties = properties ;
2019-12-18 16:14:21 +01:00
public showLoading = true ;
public isPortalAdministrator = null ;
2021-01-11 10:21:42 +01:00
public filterForm : FormGroup ;
2019-12-18 16:14:21 +01:00
private subscriptions : any [ ] = [ ] ;
2021-01-28 17:33:16 +01:00
private index : number ;
2022-03-22 16:47:38 +01:00
public stickyPageHeader : boolean = false ;
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
constructor ( private element : ElementRef , private route : ActivatedRoute ,
2021-03-19 17:51:02 +01:00
private _router : Router , private title : Title ,
2019-12-18 16:14:21 +01:00
private _helpContentService : HelpContentService ,
2022-03-22 16:47:38 +01:00
private userManagementService : UserManagementService , private _fb : FormBuilder ,
private stakeholderService : StakeholderService ) {
2019-12-18 16:14:21 +01:00
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
ngOnInit() {
2021-01-11 10:21:42 +01:00
this . filterForm = this . _fb . group ( {
keyword : [ '' ] ,
2021-01-26 17:21:55 +01:00
status : [ 'all' , Validators . required ]
} ) ;
2021-01-11 10:21:42 +01:00
this . subscriptions . push ( this . filterForm . get ( 'keyword' ) . valueChanges . subscribe ( value = > {
2021-01-29 11:47:37 +01:00
this . searchText = new RegExp ( value , 'i' ) ;
this . applyFilters ( ) ;
2019-12-18 16:14:21 +01:00
} ) ) ;
2021-01-11 10:21:42 +01:00
this . subscriptions . push ( this . filterForm . get ( 'status' ) . valueChanges . subscribe ( value = > {
2021-01-29 11:47:37 +01:00
this . applyFilters ( ) ;
2021-01-11 10:21:42 +01:00
} ) ) ;
2021-01-26 17:21:55 +01:00
this . userManagementService . getUserInfo ( ) . subscribe ( user = > {
2021-01-26 18:00:40 +01:00
this . portal = ( this . route . snapshot . data . portal ) ? this . route.snapshot.data.portal : this.route.snapshot.params [ this . route . snapshot . data . param ] ;
2021-03-19 17:51:02 +01:00
if ( this . route . snapshot . data . portal ) {
this . title . setTitle ( StringUtils . capitalize ( this . portal ) + ' | Entities' ) ;
} else if ( this . route . snapshot . params [ this . route . snapshot . data . param ] ) {
2022-03-22 16:47:38 +01:00
if ( this . route . snapshot . data . param === 'stakeholder' ) {
this . subscriptions . push ( this . stakeholderService . getStakeholderAsObservable ( ) . subscribe ( stakeholder = > {
if ( stakeholder ) {
this . name = stakeholder . name ;
2022-03-24 13:56:55 +01:00
this . logo = stakeholder . logoUrl ;
2022-03-22 16:47:38 +01:00
this . title . setTitle ( stakeholder . name + ' | Entities' ) ;
}
} ) ) ;
} else {
// TODO: for portals as well
this . title . setTitle ( this . portal . toUpperCase ( ) + ' | Entities' ) ;
}
2021-03-19 17:51:02 +01:00
} else {
this . title . setTitle ( 'Administrator Dashboard | Entities' ) ;
}
2021-01-26 18:00:40 +01:00
this . applyPortalFilter ( this . portal ) ;
this . isPortalAdministrator = Session . isPortalAdministrator ( user ) && ! this . portal ;
2021-01-26 17:21:55 +01:00
} ) ;
2019-12-18 16:14:21 +01:00
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
ngOnDestroy ( ) : void {
this . subscriptions . forEach ( value = > {
if ( value instanceof Subscriber ) {
value . unsubscribe ( ) ;
} else if ( value instanceof Function ) {
value ( ) ;
}
} ) ;
}
2021-01-26 17:21:55 +01:00
2021-01-26 18:00:40 +01:00
getEntities ( portal : string ) {
2021-03-19 17:51:02 +01:00
this . showLoading = true ;
if ( portal ) {
this . _helpContentService . getCommunityEntities ( portal , this . properties . adminToolsAPIURL ) . subscribe (
entities = > {
this . entities = entities ;
this . checkboxes = [ ] ;
let self = this ;
entities . forEach ( _ = > {
self . checkboxes . push ( < CheckEntity > { entity : _ , checked : false } ) ;
} ) ;
this . showLoading = false ;
} ,
error = > this . handleError ( 'System error retrieving entities' , error ) ) ;
2019-12-18 16:14:21 +01:00
} else {
2021-03-19 17:51:02 +01:00
this . _helpContentService . getEntities ( this . properties . adminToolsAPIURL ) . subscribe (
entities = > {
this . entities = entities ;
this . checkboxes = [ ] ;
let self = this ;
entities . forEach ( _ = > {
self . checkboxes . push ( < CheckEntity > { entity : _ , checked : false } ) ;
} ) ;
this . showLoading = false ;
} ,
error = > this . handleError ( 'System error retrieving entities' , error ) ) ;
2019-12-18 16:14:21 +01:00
}
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public toggleCheckBoxes ( event ) {
this . checkboxes . forEach ( _ = > _ . checked = event . target . checked ) ;
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public applyCheck ( flag : boolean ) {
this . checkboxes . forEach ( _ = > _ . checked = flag ) ;
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public getSelectedEntities ( ) : string [ ] {
return this . checkboxes . filter ( entity = > entity . checked === true ) . map ( checkedEntity = > checkedEntity . entity ) . map ( res = > res . _id ) ;
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
private deleteEntitiesFromArray ( ids : string [ ] ) : void {
for ( let id of ids ) {
2021-01-28 17:33:16 +01:00
let i = this . entities . findIndex ( _ = > _ . _id == id ) ;
this . entities . splice ( i , 1 ) ;
2019-12-18 16:14:21 +01:00
}
2021-01-29 11:47:37 +01:00
this . applyFilters ( ) ;
2019-12-18 16:14:21 +01:00
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public confirmDeleteEntity ( id : string ) {
// this.deleteConfirmationModal.ids = [id];
// this.deleteConfirmationModal.showModal();
this . selectedEntities = [ id ] ;
this . confirmDeleteEntitiesModalOpen ( ) ;
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public confirmDeleteSelectedEntities() {
// this.deleteConfirmationModal.ids = this.getSelectedEntities();
// this.deleteConfirmationModal.showModal();
this . selectedEntities = this . getSelectedEntities ( ) ;
this . confirmDeleteEntitiesModalOpen ( ) ;
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
private confirmDeleteEntitiesModalOpen() {
2021-03-19 17:51:02 +01:00
this . deleteModal . cancelButton = true ;
this . deleteModal . okButton = true ;
this . deleteModal . alertTitle = 'Delete Confirmation' ;
this . deleteModal . message = 'Are you sure you want to delete the selected entity(-ies)?' ;
this . deleteModal . okButtonText = 'Yes' ;
this . deleteModal . open ( ) ;
2019-12-18 16:14:21 +01:00
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public confirmedDeleteEntities ( data : any ) {
2021-03-19 17:51:02 +01:00
this . showLoading = true ;
this . _helpContentService . deleteEntities ( this . selectedEntities , this . properties . adminToolsAPIURL ) . subscribe (
_ = > {
this . deleteEntitiesFromArray ( this . selectedEntities ) ;
UIkit . notification ( 'Entities have been <b>successfully deleted</b>' , {
status : 'success' ,
timeout : 6000 ,
pos : 'bottom-right'
} ) ;
this . showLoading = false ;
} ,
error = > this . handleUpdateError ( 'System error deleting the selected entities' , error )
) ;
2019-12-18 16:14:21 +01:00
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public editEntity ( i : number ) {
const entity : Entity = this . checkboxes [ i ] . entity ;
2021-01-28 17:33:16 +01:00
this . index = this . entities . findIndex ( value = > value . _id === entity . _id ) ;
this . entityForm = this . _fb . group ( {
name : this._fb.control ( entity . name , Validators . required ) ,
_id : this._fb.control ( entity . _id ) ,
pid : this._fb.control ( entity . pid , Validators . required )
2019-12-18 16:14:21 +01:00
} ) ;
2021-01-28 17:33:16 +01:00
this . entitiesModalOpen ( 'Edit Entity' , 'Save Changes' ) ;
2019-12-18 16:14:21 +01:00
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public newEntity() {
2021-01-28 17:33:16 +01:00
this . entityForm = this . _fb . group ( {
_id : this._fb.control ( null ) ,
name : this._fb.control ( '' , Validators . required ) ,
pid : this._fb.control ( '' , Validators . required )
2019-12-18 16:14:21 +01:00
} ) ;
2021-01-28 17:33:16 +01:00
this . entitiesModalOpen ( 'Create Entity' , 'Create' ) ;
2019-12-18 16:14:21 +01:00
}
2021-01-26 17:21:55 +01:00
2021-01-28 17:33:16 +01:00
private entitiesModalOpen ( title : string , yesBtn : string ) {
2021-03-19 17:51:02 +01:00
this . editModal . cancelButton = true ;
this . editModal . okButton = true ;
this . editModal . okButtonLeft = false ;
this . editModal . alertTitle = title ;
this . editModal . okButtonText = yesBtn ;
this . editModal . open ( ) ;
2019-12-18 16:14:21 +01:00
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public entitySaveConfirmed ( data : any ) {
2021-02-01 20:17:55 +01:00
this . showLoading = true ;
2021-03-19 17:51:02 +01:00
if ( this . entityForm . value . _id ) {
this . _helpContentService . updateEntity (
< Entity > this . entityForm . value , this . properties . adminToolsAPIURL ) . subscribe (
entity = > {
this . entityUpdatedSuccessfully ( entity ) ;
UIkit . notification ( 'Entity <b>' + entity . name + '</b> has been <b>successfully updated</b>' , {
status : 'success' ,
timeout : 6000 ,
pos : 'bottom-right'
} ) ;
} ,
error = > this . handleUpdateError ( 'System error updating entity' , error )
) ;
2019-12-18 16:14:21 +01:00
} else {
2021-03-19 17:51:02 +01:00
this . _helpContentService . saveEntity ( < Entity > this . entityForm . value , this . properties . adminToolsAPIURL ) . subscribe (
entity = > {
this . entitySavedSuccessfully ( entity ) ;
UIkit . notification ( 'Entity <b>' + entity . name + '</b> has been <b>successfully created</b>' , {
status : 'success' ,
timeout : 6000 ,
pos : 'bottom-right'
} ) ;
} ,
error = > this . handleUpdateError ( 'System error creating entity' , error )
) ;
2019-12-18 16:14:21 +01:00
}
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public entitySavedSuccessfully ( entity : Entity ) {
2021-01-28 17:33:16 +01:00
this . entities . push ( entity ) ;
2021-01-29 11:47:37 +01:00
this . applyFilters ( ) ;
2019-12-18 16:14:21 +01:00
this . applyCheck ( false ) ;
2021-02-01 20:17:55 +01:00
this . showLoading = false ;
2019-12-18 16:14:21 +01:00
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public entityUpdatedSuccessfully ( entity : Entity ) {
2021-01-28 17:33:16 +01:00
this . entities [ this . index ] = entity ;
2021-01-29 11:47:37 +01:00
this . applyFilters ( ) ;
2019-12-18 16:14:21 +01:00
this . applyCheck ( false ) ;
2021-02-01 20:17:55 +01:00
this . showLoading = false ;
2019-12-18 16:14:21 +01:00
}
2021-01-26 17:21:55 +01:00
2021-01-29 11:47:37 +01:00
public applyFilters() {
2019-12-18 16:14:21 +01:00
this . checkboxes = [ ] ;
2021-01-29 11:47:37 +01:00
this . entities . filter ( item = > this . filterEntitiesByStatus ( item ) ) . forEach (
2019-12-18 16:14:21 +01:00
_ = > this . checkboxes . push ( < CheckEntity > { entity : _ , checked : false } )
) ;
2021-01-29 11:47:37 +01:00
this . checkboxes = this . checkboxes . filter ( item = > this . filterEntities ( item . entity ) ) ;
2019-12-18 16:14:21 +01:00
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public filterEntities ( entity : Entity ) : boolean {
const textFlag = this . searchText . toString ( ) === '' || ( entity . name ) . match ( this . searchText ) != null ;
return textFlag ;
}
2021-01-26 17:21:55 +01:00
2021-01-11 10:21:42 +01:00
public filterEntitiesByStatus ( entity : Entity ) : boolean {
let status = this . filterForm . get ( "status" ) . value ;
2021-01-26 17:21:55 +01:00
return status == "all" || ( status == "disabled" && ! entity . isEnabled ) || ( status == "enabled" && entity . isEnabled ) ;
2021-01-11 10:21:42 +01:00
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
handleError ( message : string , error ) {
2021-03-18 15:11:41 +01:00
UIkit . notification ( message , {
status : 'danger' ,
timeout : 6000 ,
pos : 'bottom-right'
} ) ;
2019-12-18 16:14:21 +01:00
console . log ( 'Server responded: ' + error ) ;
this . showLoading = false ;
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
handleUpdateError ( message : string , error ) {
if ( error == null ) {
2021-01-28 17:33:16 +01:00
this . entityForm = this . _fb . group ( {
2019-12-18 16:14:21 +01:00
pid : [ '' , Validators . required ] ,
name : [ '' , Validators . required ] ,
isEnabled : '' ,
_id : ''
} ) ;
} else {
2021-03-18 15:11:41 +01:00
UIkit . notification ( message , {
status : 'danger' ,
timeout : 6000 ,
pos : 'bottom-right'
} ) ;
2019-12-18 16:14:21 +01:00
console . log ( 'Server responded: ' + error ) ;
}
this . showLoading = false ;
}
2021-01-26 17:21:55 +01:00
2021-01-26 18:00:40 +01:00
public applyPortalFilter ( portal : string ) {
this . getEntities ( portal ) ;
2019-12-18 16:14:21 +01:00
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public toggleEntities ( status : boolean , ids : string [ ] ) {
// this.okModal.showModal();
this . toggleIds = ids ;
this . toggleStatus = status ;
this . confirmRelatedPagesModalOpen ( ) ;
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
private confirmRelatedPagesModalOpen() {
2021-03-19 17:51:02 +01:00
this . relatedPages . cancelButton = true ;
this . relatedPages . okButton = true ;
this . relatedPages . alertTitle = 'Warning' ;
this . relatedPages . 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 . relatedPages . okButtonText = 'Yes' ;
this . relatedPages . open ( ) ;
2019-12-18 16:14:21 +01:00
}
2021-01-26 17:21:55 +01:00
2019-12-18 16:14:21 +01:00
public continueToggling ( event : any ) {
2021-03-19 17:51:02 +01:00
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 )
) ;
2019-12-18 16:14:21 +01:00
}
2021-02-02 13:29:18 +01:00
2021-03-19 17:51:02 +01:00
selectAll() {
let checked = ( this . getSelectedEntities ( ) . length != this . checkboxes . length ) ;
2021-02-25 16:55:56 +01:00
for ( let check of this . checkboxes ) {
check . checked = checked ;
}
}
2019-12-18 16:14:21 +01:00
}