ChurchAngular/src/app/admin/family-members/family-members.component.ts
Chris Chen 6301d6008b WIP
2024-02-28 15:17:41 -08:00

217 lines
6.0 KiB
TypeScript

import { Component, OnInit, ViewChild } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { NbDialogService } from '@nebular/theme';
import { Observable } from 'rxjs';
import { first } from 'rxjs/operators';
import { FamilyMember, Gender } from '../../entity/Member';
import { PastoralDomain } from '../../entity/PastoralDomain';
import { FamilyMemberService } from '../../services/crudServices/family-member.service';
import { PastoralDomainService } from '../../services/crudServices/pastoral-domain.service';
import { MsgBoxService } from '../../services/msg-box.service';
import { StateService } from '../../services/state.service';
import { FancySettings } from '../../ui/fancy-table/fancy-settings.model';
import { FancyTableComponent } from '../../ui/fancy-table/fancy-table.component';
import { ObjectUtils } from '../../utilities/object-utils';
import { AssignMemberCellGroupComponent } from './assign-member-cell-group/assign-member-cell-group.component';
import { FamilyMemberEditorComponent } from './family-member-editor/family-member-editor.component';
@Component({
selector: 'ngx-family-members',
templateUrl: './family-members.component.html',
styleUrls: ['./family-members.component.scss']
})
export class FamilyMembersComponent implements OnInit {
@ViewChild(FancyTableComponent, { static: false }) fancyTable: FancyTableComponent<FamilyMember>;
data: FamilyMember;
allData: FamilyMember[];
selectedIndex: number = 0;
isLoading: boolean = true;
cellGroups: PastoralDomain[];
constructor(
private familyMemberService: FamilyMemberService,
private pastoralDomainService: PastoralDomainService,
private msgBoxService: MsgBoxService,
private dlgService: NbDialogService,
protected stateService: StateService,
protected route: ActivatedRoute,
) {
}
//#region Table Setting
settings = <FancySettings<FamilyMember>>{
multiselect: true,
contextMenuItems: [
{
id: 'add',
enabled: true,
title: 'Add New',
icon: 'plus-circle-outline',
callback: (datum, element) => {
this.openEditingDialog(true);
},
},
{
id: 'edit',
enabled: true,
title: 'Edit',
icon: 'edit',
callback: (datum, element) => {
this.openEditingDialog(false);
},
},
{
enabled: true,
id: 'delete',
title: 'Delete',
icon: 'trash-2-outline',
callback: (datum, element) => {
this.delete(datum);
},
},
{
enabled: true,
id: 'assign',
title: 'Assign Cell Group',
icon: 'send-outline',
callback: (datum, element) => {
this.assignCellGroup();
},
},
],
onContextMenuOpening: (datum, menuItems) => {
menuItems.find(i => i.id == 'delete').visible = !!datum;
menuItems.find(i => i.id == 'edit').visible = !!datum;
return datum;
},
columns: [
// {
// name: 'avatarImage',
// title: 'Avatar Image',
// type: 'text',
// widthPx: 100,
// //valuePrepareFunction: (item) => ,
// },
{
name: 'firstName',
title: 'First Name',
type: 'text',
widthPx: 130,
//valuePrepareFunction: (item) => ,
},
{
name: 'lastName',
title: 'Last Name',
type: 'text',
widthPx: 100,
//valuePrepareFunction: (item) => ,
},
{
name: 'email',
title: 'Email',
type: 'text',
widthPx: 260,
//valuePrepareFunction: (item) => ,
},
{
name: 'gender',
title: 'Gender',
type: 'text',
widthPx: 60,
valuePrepareFunction: (item) => item.gender == Gender.Male ? '男' : '女',
},
{
name: 'birthday',
title: 'Birthday',
type: 'date',
widthPx: 110,
//valuePrepareFunction: (item) => ,
},
{
name: 'address',
title: 'Address',
type: 'text',
widthPx: 200,
//valuePrepareFunction: (item) => ,
},
// {
// name: 'baptized',
// title: 'Baptized',
// type: 'text',
// widthPx: 100,
// //valuePrepareFunction: (item) => ,
// },
{
name: 'role',
title: 'Role',
type: 'text',
widthPx: 50,
//valuePrepareFunction: (item) => ,
},
],
};
//#endregion
//#region Implements Methods
ngOnInit(): void {
this.getAllData();
}
get saveMethod(): Observable<any> {
return Observable.of(true);
}
getAllData() {
this.isLoading = true;
this.pastoralDomainService.getAll().pipe(first()).subscribe(result => {
this.cellGroups = result;
this.familyMemberService.getAll().pipe(first()).subscribe(result => {
this.isLoading = false;
this.allData = result;
});
});
}
//#endregion
//#region UI Calling Methods
openEditingDialog(isAdding: boolean) {
this.dlgService.open(FamilyMemberEditorComponent, {
context: {
data: isAdding ? null : ObjectUtils.CloneValue(this.allData[this.selectedIndex]),
isAdding: isAdding
}
}).onClose.pipe(first()).subscribe(result => {
if (result) {
this.getAllData();
}
});
}
assignCellGroup() {
this.dlgService.open(AssignMemberCellGroupComponent, {
context: {
members: this.fancyTable.getSelected().selectedRows,
cellGroups: this.cellGroups
}
}).onClose.pipe(first()).subscribe(result => {
this.getAllData();
});
}
//#endregion
//#region CRUD Methods
delete(datum) {
this.msgBoxService.showConfirmDeleteBox().pipe(first()).subscribe(answer => {
if (answer === true) {
this.isLoading = true;
this.familyMemberService.delete(datum).pipe(first()).subscribe(result => {
this.isLoading = false;
this.allData.splice(this.selectedIndex, 1);
this.fancyTable.reload();
});
}
});
}
//#endregion
}