| /******************************************************************************** |
| * Copyright (c) 2020 Contributors to the Eclipse Foundation |
| * |
| * See the NOTICE file(s) distributed with this work for additional |
| * information regarding copyright ownership. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| ********************************************************************************/ |
| import { Injectable } from '@angular/core'; |
| import { BaseSandbox } from '@grid-failure-information-app/shared/sandbox/base.sandbox'; |
| import { Store, ActionsSubject } from '@ngrx/store'; |
| import * as store from '@grid-failure-information-app/shared/store'; |
| import { Observable } from 'rxjs'; |
| import * as distributionGroupActions from '@grid-failure-information-app/shared/store/actions/distribution-groups.action'; |
| import * as distributionGroupFormReducer from '@grid-failure-information-app/shared/store/reducers/distribution-groups/distribution-group-details-form.reducer'; |
| import { FormGroupState, MarkAsTouchedAction, ResetAction, SetValueAction } from 'ngrx-forms'; |
| import { debounceTime, distinctUntilChanged, map, takeUntil, switchMap } from 'rxjs/operators'; |
| import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; |
| import { SafetyQueryDialogComponent } from '@grid-failure-information-app/shared/components/dialogs/safety-query-dialog/safety-query-dialog.component'; |
| import { ofType } from '@ngrx/effects'; |
| import { UtilService } from '@grid-failure-information-app/shared/utility/utility.service'; |
| import { CellClickedEvent } from 'ag-grid-community'; |
| import { DistributionGroup, DistributionGroupMember, Contact, DistributionGroupTextPlaceholder } from '@grid-failure-information-app/shared/models'; |
| |
| @Injectable() |
| export class DistributionGroupSandbox extends BaseSandbox { |
| public distributionGroupList$: Observable<DistributionGroup[]> = this.appState$.select(store.getDistributionGroupsData); |
| public distributionGroupLoading$: Observable<boolean> = this.appState$.select(store.getDistributionGroupsLoading); |
| public distributionGroupDetailsFormState$: Observable<FormGroupState<DistributionGroup>> = this.appState$.select(store.getDistributionGroupsDetails); |
| public currentFormState: FormGroupState<DistributionGroup>; |
| public distributionGroupMember$: Observable<DistributionGroupMember[]> = this.appState$.select(store.getDistributionGroupMembersData); |
| public distributionGroupMemberLoading$: Observable<boolean> = this.appState$.select(store.getDistributionGroupMembersLoading); |
| public displayForm: boolean = false; |
| public displayDistributionGroupMember: boolean = false; |
| public distributionGroupTextPlaceholder: DistributionGroupTextPlaceholder; |
| private _selectedDistributionGroup: DistributionGroup; |
| private _selectedContact: Contact; |
| private _distributionGroupMembers: Array<DistributionGroupMember>; |
| |
| constructor( |
| protected appState$: Store<store.State>, |
| private _actionsSubject: ActionsSubject, |
| private _utilService: UtilService, |
| private _modalService: NgbModal |
| ) { |
| super(appState$); |
| this.registerEvents(); |
| } |
| |
| public openForm(): void { |
| if (!this.displayDistributionGroupMember) { |
| this._clear(); |
| this.appState$.dispatch(new MarkAsTouchedAction(distributionGroupFormReducer.FORM_ID)); |
| this.displayForm = true; |
| } |
| } |
| |
| public loadDistributionGroups(): void { |
| this.appState$.dispatch(distributionGroupActions.loadDistributionGroups()); |
| } |
| |
| public loadDistributionGroupDetail(id: string): void { |
| this.appState$.dispatch(distributionGroupActions.loadDistributionGroupsDetail({ payload: id })); |
| } |
| |
| public loadDistributionGroupTextPlaceholders(): void { |
| this.appState$.dispatch(distributionGroupActions.loadDistributionGroupTextPlaceholders()); |
| } |
| |
| public cancel(): void { |
| if (!this.currentFormState.isPristine) { |
| const modalRef = this._modalService.open(SafetyQueryDialogComponent); |
| modalRef.componentInstance.title = 'ConfirmDialog.Action.edit'; |
| modalRef.componentInstance.body = 'ConfirmDialog.Content'; |
| modalRef.result.then( |
| () => { |
| this._clear(); |
| }, |
| () => {} |
| ); |
| } else { |
| this._clear(); |
| } |
| } |
| |
| public saveDistributionGroup(): void { |
| if (this.currentFormState.isValid) { |
| this.appState$.dispatch( |
| distributionGroupActions.saveDistributionGroup({ |
| payload: new DistributionGroup(this.currentFormState.value), |
| }) |
| ); |
| this._actionsSubject.pipe(ofType(distributionGroupActions.saveDistributionGroupSuccess), takeUntil(this._endSubscriptions$)).subscribe(() => { |
| this._clear(); |
| }); |
| } else { |
| this._utilService.displayNotification('MandatoryFieldError', 'alert'); |
| } |
| } |
| |
| public deleteDistributionGroup(id: string): void { |
| const modalRef = this._modalService.open(SafetyQueryDialogComponent); |
| modalRef.componentInstance.title = 'ConfirmDialog.Action.delete'; |
| modalRef.componentInstance.body = 'ConfirmDialog.Deletion'; |
| modalRef.result.then( |
| () => { |
| this.appState$.dispatch(distributionGroupActions.deleteDistributionGroup({ payload: id })); |
| this._clear(); |
| this.displayDistributionGroupMember = false; |
| }, |
| () => {} |
| ); |
| } |
| |
| public deleteDistributionGroupMember(groupId: string, memberId: string): void { |
| const modalRef = this._modalService.open(SafetyQueryDialogComponent); |
| modalRef.componentInstance.title = 'ConfirmDialog.Action.delete'; |
| modalRef.componentInstance.body = 'ConfirmDialog.Deletion'; |
| modalRef.result.then( |
| () => { |
| this.appState$.dispatch(distributionGroupActions.deleteDistributionGroupMember({ groupId: groupId, memberId: memberId })); |
| this._clear(); |
| }, |
| () => {} |
| ); |
| } |
| |
| public registerEvents(): void { |
| this.distributionGroupDetailsFormState$.pipe(takeUntil(this._endSubscriptions$)).subscribe((formState: FormGroupState<DistributionGroup>) => { |
| this.currentFormState = formState; |
| }); |
| this._actionsSubject |
| .pipe( |
| ofType(distributionGroupActions.loadDistributionGroupMembersSuccess), |
| map(action => action.payload), |
| takeUntil(this._endSubscriptions$) |
| ) |
| .subscribe((members: Array<DistributionGroupMember>) => { |
| this._distributionGroupMembers = members; |
| }); |
| this._actionsSubject |
| .pipe( |
| ofType(distributionGroupActions.loadDistributionGroupTextPlaceholdersSuccess), |
| map(action => action.payload), |
| takeUntil(this._endSubscriptions$) |
| ) |
| .subscribe((item: DistributionGroupTextPlaceholder) => { |
| this.distributionGroupTextPlaceholder = item; |
| }); |
| } |
| |
| public showMembersToSelectedGroup(selectedGroup: CellClickedEvent): void { |
| if (!this.displayForm) { |
| this.displayDistributionGroupMember = true; |
| this._selectedDistributionGroup = selectedGroup.data; |
| this.appState$.dispatch(distributionGroupActions.loadDistributionGroupMembers({ payload: selectedGroup.data.id })); |
| } |
| } |
| |
| public cancelMembersDisplay(): void { |
| this.displayDistributionGroupMember = false; |
| this._selectedDistributionGroup = null; |
| this._selectedContact = null; |
| } |
| |
| public loadContacts(term: string): Observable<any> { |
| this.appState$.dispatch(distributionGroupActions.loadContacts({ searchText: term })); |
| return this._actionsSubject.pipe( |
| ofType(distributionGroupActions.loadContactsSuccess), |
| map(action => action.payload), |
| takeUntil(this._endSubscriptions$) |
| ); |
| } |
| |
| public searchForContacts = (text$: Observable<string>) => |
| text$.pipe( |
| debounceTime(200), |
| distinctUntilChanged(), |
| switchMap(term => (term.length < 2 ? [] : this.loadContacts(term))) |
| ); |
| |
| public formatter = (s: Contact | string) => { |
| if (s instanceof Contact) return s.contactSearchString; |
| else return s; |
| }; |
| |
| public setSelectedContact(selectedContact: Contact): void { |
| this._selectedContact = selectedContact; |
| } |
| |
| public assignContactToGroup(): void { |
| if (!this._selectedContact) { |
| this._utilService.displayNotification('NoContatctSelected'); |
| return; |
| } |
| let testMember: DistributionGroupMember = this._distributionGroupMembers.find(member => member.contactId === this._selectedContact.uuid); |
| if (testMember) { |
| this._utilService.displayNotification('SelectedContactAlreadyAssigned', 'alert'); |
| this.setSelectedContact(undefined); |
| } else { |
| let newGroupMember = { |
| contactId: this._selectedContact.uuid, |
| distributionGroupUuid: this._selectedDistributionGroup.id, |
| }; |
| this.appState$.dispatch( |
| distributionGroupActions.createDistributionGroupMember({ |
| groupId: this._selectedDistributionGroup.id, |
| newMember: new DistributionGroupMember(newGroupMember), |
| }) |
| ); |
| this.setSelectedContact(undefined); |
| } |
| } |
| |
| private _clear(): void { |
| this.appState$.dispatch(new SetValueAction(distributionGroupFormReducer.FORM_ID, distributionGroupFormReducer.INITIAL_STATE.value)); |
| this.appState$.dispatch(new ResetAction(distributionGroupFormReducer.FORM_ID)); |
| this.displayForm = false; |
| } |
| } |