blob: 43319231ed74883bfafa45aac6f0238f1f7b4099 [file] [log] [blame]
/********************************************************************************
* 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;
}
}