From 06cb6683e62abc38f7c8ccd5b529a28d153a728d Mon Sep 17 00:00:00 2001 From: Chris Chen Date: Sun, 2 Oct 2022 08:39:35 -0700 Subject: [PATCH] Update pastoral domain --- src/app/admin/admin-routing.module.ts | 3 +- src/app/admin/admin.module.ts | 8 +- .../best-list-dlg.component.html | 2 +- .../best-list-dlg/best-list-dlg.component.ts | 9 +- .../happiness-group-adding-dlg.component.html | 54 ----------- .../happiness-group-adding-dlg.component.scss | 4 - ...ppiness-group-adding-dlg.component.spec.ts | 25 ----- .../happiness-group-adding-dlg.component.ts | 28 ------ .../happiness-groups.component.html | 53 ----------- .../happiness-groups.component.ts | 93 ------------------- .../happiness-week-list-dlg.component.html | 13 ++- .../happiness-week-list-dlg.component.scss | 4 + .../happiness-week-list-dlg.component.ts | 21 ++++- .../week-task-editor.component.html | 38 ++++++++ .../week-task-editor.component.scss} | 0 .../week-task-editor.component.spec.ts} | 12 +-- .../week-task-editor.component.ts | 79 ++++++++++++++++ .../pastoral-domain-editor.component.html | 77 +++++++++++++-- .../pastoral-domain-editor.component.ts | 38 +++++++- .../pastoral-domains.component.ts | 49 +++++++++- src/app/entity/HappinessGroup.ts | 22 ++--- src/app/entity/LineMessagingAccount.ts | 8 ++ src/app/entity/PastoralDomain.ts | 37 +++++++- src/app/invitation/invitation.component.ts | 13 +-- src/app/services/crudServices/crud.service.ts | 12 +-- .../crudServices/happiness-group.service.ts | 24 +++-- .../line-messaging-account.service.ts | 18 +++- src/app/utilities/string-utils.ts | 45 ++++++--- 28 files changed, 438 insertions(+), 351 deletions(-) delete mode 100644 src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.html delete mode 100644 src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.scss delete mode 100644 src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.spec.ts delete mode 100644 src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.ts delete mode 100644 src/app/admin/happiness-groups/happiness-groups.component.html delete mode 100644 src/app/admin/happiness-groups/happiness-groups.component.ts create mode 100644 src/app/admin/happiness-groups/week-task-editor/week-task-editor.component.html rename src/app/admin/happiness-groups/{happiness-groups.component.scss => week-task-editor/week-task-editor.component.scss} (100%) rename src/app/admin/happiness-groups/{happiness-groups.component.spec.ts => week-task-editor/week-task-editor.component.spec.ts} (51%) create mode 100644 src/app/admin/happiness-groups/week-task-editor/week-task-editor.component.ts diff --git a/src/app/admin/admin-routing.module.ts b/src/app/admin/admin-routing.module.ts index 296752e..f388464 100644 --- a/src/app/admin/admin-routing.module.ts +++ b/src/app/admin/admin-routing.module.ts @@ -4,7 +4,6 @@ import { NbMenuItem } from '@nebular/theme'; import { AdminComponent } from './admin.component'; import { FamilyMembersComponent } from './family-members/family-members.component'; -import { HappinessGroupsComponent } from './happiness-groups/happiness-groups.component'; import { LineMessagingAccountComponent } from './lines/line-messaging-account/line-messaging-account.component'; import { LogsComponent } from './logs/logs.component'; import { PastoralDomainsComponent } from './pastoral-domains/pastoral-domains.component'; @@ -55,7 +54,7 @@ const routes: Routes = [ [ { path: 'members', component: FamilyMembersComponent }, { path: 'pastoralDomains', component: PastoralDomainsComponent }, - { path: 'happinessGroup', component: HappinessGroupsComponent }, + { path: 'happinessGroup', component: PastoralDomainsComponent }, { path: 'logs', component: LogsComponent }, { path: 'lineAccount', component: LineMessagingAccountComponent }, ] diff --git a/src/app/admin/admin.module.ts b/src/app/admin/admin.module.ts index aba4b62..4e43349 100644 --- a/src/app/admin/admin.module.ts +++ b/src/app/admin/admin.module.ts @@ -3,10 +3,8 @@ import { CommonModule } from '@angular/common'; import { AdminRoutingModule } from './admin-routing.module'; import { AdminComponent } from './admin.component'; -import { HappinessGroupsComponent } from './happiness-groups/happiness-groups.component'; import { NbMenuModule, NbInputModule, NbCardModule, NbButtonModule, NbActionsModule, NbCheckboxModule, NbRadioModule, NbDatepickerModule, NbSelectModule, NbIconModule, NbTagModule, NbStepperModule, NbListModule, NbSpinnerModule, NbDialogModule, NbUserModule } from '@nebular/theme'; import { ThemeModule } from '../@theme/theme.module'; -import { HappinessGroupAddingDlgComponent } from './happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component'; import { FormsModule } from '@angular/forms'; import { BestListDlgComponent } from './happiness-groups/best-list-dlg/best-list-dlg.component'; import { AlertDlgModule } from '../ui/alert-dlg/alert-dlg.module'; @@ -28,12 +26,11 @@ import { MaskDirectiveModule } from '../directives/mask-directive/mask-directive import { DateInputModule } from '../ui/date-input/date-input.module'; import { LineMessagingAccountComponent } from './lines/line-messaging-account/line-messaging-account.component'; import { LineMessagingAccountEditorComponent } from './lines/line-messaging-account-editor/line-messaging-account-editor.component'; +import { WeekTaskEditorComponent } from './happiness-groups/week-task-editor/week-task-editor.component'; @NgModule({ declarations: [ AdminComponent, - HappinessGroupsComponent, - HappinessGroupAddingDlgComponent, BestListDlgComponent, HappinessWeekEditorComponent, HappinessWeekListDlgComponent, @@ -46,7 +43,8 @@ import { LineMessagingAccountEditorComponent } from './lines/line-messaging-acco LogsComponent, LogDetailComponent, LineMessagingAccountComponent, - LineMessagingAccountEditorComponent], + LineMessagingAccountEditorComponent, + WeekTaskEditorComponent], imports: [ CommonModule, FormsModule, diff --git a/src/app/admin/happiness-groups/best-list-dlg/best-list-dlg.component.html b/src/app/admin/happiness-groups/best-list-dlg/best-list-dlg.component.html index 0a2b8b9..ef1cffb 100644 --- a/src/app/admin/happiness-groups/best-list-dlg/best-list-dlg.component.html +++ b/src/app/admin/happiness-groups/best-list-dlg/best-list-dlg.component.html @@ -9,7 +9,7 @@ - +
diff --git a/src/app/admin/happiness-groups/best-list-dlg/best-list-dlg.component.ts b/src/app/admin/happiness-groups/best-list-dlg/best-list-dlg.component.ts index 51dfde9..9332758 100644 --- a/src/app/admin/happiness-groups/best-list-dlg/best-list-dlg.component.ts +++ b/src/app/admin/happiness-groups/best-list-dlg/best-list-dlg.component.ts @@ -2,7 +2,8 @@ import { Component, OnInit } from '@angular/core'; import { NbDialogRef, NbToastrService } from '@nebular/theme'; import { first } from 'rxjs/operators'; import { environment } from '../../../../environments/environment'; -import { HappinessBEST, HappinessGroup } from '../../../entity/HappinessGroup'; +import { HappinessBEST } from '../../../entity/HappinessGroup'; +import { PastoralDomain } from '../../../entity/PastoralDomain'; import { BestService } from '../../../services/crudServices/best.service'; import { HappinessGroupService } from '../../../services/crudServices/happiness-group.service'; import { LineGroup, LineService } from '../../../services/line.service'; @@ -20,7 +21,7 @@ export class BestListDlgComponent implements OnInit { processing: boolean = false; isAdding: boolean = false; - group: HappinessGroup; + group: PastoralDomain; datum: HappinessBEST; constructor( private dlgRef: NbDialogRef, @@ -32,7 +33,7 @@ export class BestListDlgComponent implements OnInit { ) { } ngOnInit(): void { - this.group.bestList = this.group.bestList.sort((a, b) => 0 - (a.name < b.name ? 1 : -1)); + this.group.bests = this.group.bests.sort((a, b) => 0 - (a.name < b.name ? 1 : -1)); } close() { @@ -63,7 +64,7 @@ export class BestListDlgComponent implements OnInit { this.toastrService.success(dummy.value, "複製地址至剪貼簿!"); } copyBestList() { - let list = "".concat(...this.group.bestList.map(b => `${b.name}\t\t: ${environment.invitationUrl}${b.id}\r\n`)); + let list = "".concat(...this.group.bests.map(b => `${b.name}\t\t: ${environment.invitationUrl}${b.id}\r\n`)); var dummy = document.createElement("textarea"); document.body.appendChild(dummy); dummy.value = list; diff --git a/src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.html b/src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.html deleted file mode 100644 index 8a4da0a..0000000 --- a/src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.html +++ /dev/null @@ -1,54 +0,0 @@ - - - Happiness Group - - -
-
-
- - -
-
-
-
- - - - -
-
-
-
- - -
-
-
-
- - -
-
- -
-
- - -
-
- -
-
- - - - -
\ No newline at end of file diff --git a/src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.scss b/src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.scss deleted file mode 100644 index 12d612c..0000000 --- a/src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.scss +++ /dev/null @@ -1,4 +0,0 @@ -nb-card { - max-height: 90vh; - width: 700px; -} diff --git a/src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.spec.ts b/src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.spec.ts deleted file mode 100644 index 30e6f71..0000000 --- a/src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { HappinessGroupAddingDlgComponent } from './happiness-group-adding-dlg.component'; - -describe('HappinessGroupAddingDlgComponent', () => { - let component: HappinessGroupAddingDlgComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ HappinessGroupAddingDlgComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(HappinessGroupAddingDlgComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.ts b/src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.ts deleted file mode 100644 index b4de317..0000000 --- a/src/app/admin/happiness-groups/happiness-group-adding-dlg/happiness-group-adding-dlg.component.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { NbDialogRef } from '@nebular/theme'; -import { HappinessGroup } from '../../../entity/HappinessGroup'; - -@Component({ - selector: 'ngx-happiness-group-adding-dlg', - templateUrl: './happiness-group-adding-dlg.component.html', - styleUrls: ['./happiness-group-adding-dlg.component.scss'] -}) -export class HappinessGroupAddingDlgComponent implements OnInit { - - processing: boolean = false; - isAdding: boolean = false; - datum: HappinessGroup; - constructor( - private dlgRef: NbDialogRef - ) { } - - ngOnInit(): void { - } - - close() { - this.dlgRef.close(); - } - update() { - this.dlgRef.close(this.datum); - } -} diff --git a/src/app/admin/happiness-groups/happiness-groups.component.html b/src/app/admin/happiness-groups/happiness-groups.component.html deleted file mode 100644 index 478652d..0000000 --- a/src/app/admin/happiness-groups/happiness-groups.component.html +++ /dev/null @@ -1,53 +0,0 @@ - - - Happiness Group - - - -
- - - - - - - - - - - - - - - -
NameBegin Time
- - - - - {{formatDate(group.beginTime)}} - - - - - - -
- -
- - - -
- - - -
\ No newline at end of file diff --git a/src/app/admin/happiness-groups/happiness-groups.component.ts b/src/app/admin/happiness-groups/happiness-groups.component.ts deleted file mode 100644 index 98b1cb7..0000000 --- a/src/app/admin/happiness-groups/happiness-groups.component.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { NbDateService, NbDialogService } from '@nebular/theme'; -import { first } from 'rxjs/operators'; -import { HappinessGroup } from '../../entity/HappinessGroup'; -import { HappinessGroupService } from '../../services/crudServices/happiness-group.service'; -import { DateUtils } from '../../utilities/date-utils'; -import { BestListDlgComponent } from './best-list-dlg/best-list-dlg.component'; -import { HappinessGroupAddingDlgComponent } from './happiness-group-adding-dlg/happiness-group-adding-dlg.component'; -import { HappinessWeekListDlgComponent } from './happiness-week-list-dlg/happiness-week-list-dlg.component'; - -@Component({ - selector: 'ngx-happiness-groups', - templateUrl: './happiness-groups.component.html', - styleUrls: ['./happiness-groups.component.scss'] -}) -export class HappinessGroupsComponent implements OnInit { - - constructor(private happinessService: HappinessGroupService, - private dlgService: NbDialogService, - ) { } - allData: HappinessGroup[] = []; - processing: boolean = false; - ngOnInit(): void { - this.getAllData(); - } - - getAllData() { - this.processing = true; - this.happinessService.getAll().pipe(first()).subscribe(result => { - this.allData = result; - this.processing = false; - }); - } - openEditDlg(group: HappinessGroup) { - - this.dlgService.open(HappinessGroupAddingDlgComponent, { - context: { - isAdding: false, - datum: group - } - }).onClose.pipe(first()).subscribe(result => { - if (result) { - this.processing = true; - - this.happinessService.update(result).pipe(first()).subscribe(result => { - this.getAllData(); - }); - } - }); - } - openAddDlg() { - this.dlgService.open(HappinessGroupAddingDlgComponent, { - context: { - isAdding: true, - datum: { id: '123', beginTime: new Date() } as HappinessGroup - } - }).onClose.pipe(first()).subscribe(result => { - if (result) { - this.processing = true; - - this.happinessService.createOrUpdate(result).pipe(first()).subscribe(result => { - this.getAllData(); - }); - } - }); - } - openBestListDlg(currentGroup: HappinessGroup) { - this.dlgService.open(BestListDlgComponent, { - context: { - group: currentGroup - } - }).onClose.pipe(first()).subscribe(result => { - this.getAllData(); - }); - - } - openWeekListDlg(currentGroup: HappinessGroup) { - this.dlgService.open(HappinessWeekListDlgComponent, { - context: { - group: currentGroup - } - }).onClose.pipe(first()).subscribe(result => { - this.getAllData(); - }); - - } - - - - formatDate(d: Date) { - return DateUtils.format(d, "yyyy/MM/dd hh:mm aa"); - } -} diff --git a/src/app/admin/happiness-groups/happiness-week-list-dlg/happiness-week-list-dlg.component.html b/src/app/admin/happiness-groups/happiness-week-list-dlg/happiness-week-list-dlg.component.html index 8830da0..8e27224 100644 --- a/src/app/admin/happiness-groups/happiness-week-list-dlg/happiness-week-list-dlg.component.html +++ b/src/app/admin/happiness-groups/happiness-week-list-dlg/happiness-week-list-dlg.component.html @@ -5,12 +5,12 @@ - +
-
- - - +
+ {{weekDisplay(week.seq)}} +
@@ -18,6 +18,9 @@ + +
diff --git a/src/app/admin/happiness-groups/happiness-week-list-dlg/happiness-week-list-dlg.component.scss b/src/app/admin/happiness-groups/happiness-week-list-dlg/happiness-week-list-dlg.component.scss index e69de29..12d612c 100644 --- a/src/app/admin/happiness-groups/happiness-week-list-dlg/happiness-week-list-dlg.component.scss +++ b/src/app/admin/happiness-groups/happiness-week-list-dlg/happiness-week-list-dlg.component.scss @@ -0,0 +1,4 @@ +nb-card { + max-height: 90vh; + width: 700px; +} diff --git a/src/app/admin/happiness-groups/happiness-week-list-dlg/happiness-week-list-dlg.component.ts b/src/app/admin/happiness-groups/happiness-week-list-dlg/happiness-week-list-dlg.component.ts index 4135f56..7158aa2 100644 --- a/src/app/admin/happiness-groups/happiness-week-list-dlg/happiness-week-list-dlg.component.ts +++ b/src/app/admin/happiness-groups/happiness-week-list-dlg/happiness-week-list-dlg.component.ts @@ -1,9 +1,11 @@ import { Component, OnInit } from '@angular/core'; import { NbDialogRef, NbDialogService } from '@nebular/theme'; import { first } from 'rxjs/operators'; -import { HappinessGroup, HappinessWeek } from '../../../entity/HappinessGroup'; +import { HappinessWeek } from '../../../entity/HappinessGroup'; +import { PastoralDomain } from '../../../entity/PastoralDomain'; import { NumberUtils } from '../../../utilities/number-utils'; import { HappinessWeekEditorComponent } from '../happiness-week-editor/happiness-week-editor.component'; +import { WeekTaskEditorComponent } from '../week-task-editor/week-task-editor.component'; @Component({ selector: 'ngx-happiness-week-list-dlg', @@ -12,7 +14,7 @@ import { HappinessWeekEditorComponent } from '../happiness-week-editor/happiness }) export class HappinessWeekListDlgComponent implements OnInit { - group: HappinessGroup; + group: PastoralDomain; constructor( private dlgRef: NbDialogRef, private dlgService: NbDialogService @@ -31,9 +33,20 @@ export class HappinessWeekListDlgComponent implements OnInit { } }).onClose.pipe(first()).subscribe(result => { if (result) this.close(); - });; + }); + } + openTaskDlg(week: HappinessWeek) { + this.dlgService.open(WeekTaskEditorComponent, { + context: { + data: week, + allData: this.group.happinessWeeks + } + }).onClose.pipe(first()).subscribe(result => { + + }); + } weekDisplay(seq: number) { - return NumberUtils.Ordinal(seq) + ' Week'; + return `W${seq} ${this.group.happinessWeeks[seq - 1].topic}`; } } diff --git a/src/app/admin/happiness-groups/week-task-editor/week-task-editor.component.html b/src/app/admin/happiness-groups/week-task-editor/week-task-editor.component.html new file mode 100644 index 0000000..14d01f2 --- /dev/null +++ b/src/app/admin/happiness-groups/week-task-editor/week-task-editor.component.html @@ -0,0 +1,38 @@ +
+ + + 第 {{data.seq}} 周 {{data.topic}} 分工 + + +
+
+
+ + + +
+
+ +
+
+ + +
+
+
+ +
+ + + + +
+
\ No newline at end of file diff --git a/src/app/admin/happiness-groups/happiness-groups.component.scss b/src/app/admin/happiness-groups/week-task-editor/week-task-editor.component.scss similarity index 100% rename from src/app/admin/happiness-groups/happiness-groups.component.scss rename to src/app/admin/happiness-groups/week-task-editor/week-task-editor.component.scss diff --git a/src/app/admin/happiness-groups/happiness-groups.component.spec.ts b/src/app/admin/happiness-groups/week-task-editor/week-task-editor.component.spec.ts similarity index 51% rename from src/app/admin/happiness-groups/happiness-groups.component.spec.ts rename to src/app/admin/happiness-groups/week-task-editor/week-task-editor.component.spec.ts index 99a0290..e201191 100644 --- a/src/app/admin/happiness-groups/happiness-groups.component.spec.ts +++ b/src/app/admin/happiness-groups/week-task-editor/week-task-editor.component.spec.ts @@ -1,20 +1,20 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { HappinessGroupsComponent } from './happiness-groups.component'; +import { WeekTaskEditorComponent } from './week-task-editor.component'; -describe('HappinessGroupsComponent', () => { - let component: HappinessGroupsComponent; - let fixture: ComponentFixture; +describe('WeekTaskEditorComponent', () => { + let component: WeekTaskEditorComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ HappinessGroupsComponent ] + declarations: [ WeekTaskEditorComponent ] }) .compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(HappinessGroupsComponent); + fixture = TestBed.createComponent(WeekTaskEditorComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/app/admin/happiness-groups/week-task-editor/week-task-editor.component.ts b/src/app/admin/happiness-groups/week-task-editor/week-task-editor.component.ts new file mode 100644 index 0000000..19b8e5d --- /dev/null +++ b/src/app/admin/happiness-groups/week-task-editor/week-task-editor.component.ts @@ -0,0 +1,79 @@ +import { Component, OnInit } from '@angular/core'; +import { NbDialogRef } from '@nebular/theme'; +import { HappinessTask, HappinessTaskType, HappinessWeek } from '../../../entity/HappinessGroup'; +import { HappinessTaskService } from '../../../services/crudServices/happiness-group.service'; +import { first } from 'rxjs/operators'; +import { DropDownOption } from '../../../entity/dropDownOption'; +import { StringUtils } from '../../../utilities/string-utils'; + +@Component({ + selector: 'ngx-week-task-editor', + templateUrl: './week-task-editor.component.html', + styleUrls: ['./week-task-editor.component.scss'] +}) +export class WeekTaskEditorComponent implements OnInit { + processing: boolean = false; + allData: HappinessWeek[]; + data: HappinessWeek; + taskrOptions: DropDownOption[] = []; + constructor( + private happinessTaskService: HappinessTaskService, + private dlgRef: NbDialogRef + ) { + + } + ngOnInit(): void { + if (this.data.tasks.length == 0) { + this.data.tasks = []; + for (let i = HappinessTaskType.IceBreak; i <= HappinessTaskType.Dessert; i++) { + this.data.tasks.push( + { + weekId: this.data.id, + id: 'new', + type: i as HappinessTaskType, + tasker: '', + content: '' + } as HappinessTask + + ) + } + } + let names = [] as string[]; + this.allData.forEach(week => { + if (week.tasks) { + names = names.concat(week.tasks.map(t => t.tasker.trim())); + + } + }); + this.taskrOptions = names.filter(function (item, pos) { + return !StringUtils.isNullOrWhitespace(item) && names.indexOf(item) == pos; + }).map(name => new DropDownOption(name, name)); + } + + close() { + this.dlgRef.close(); + } + update() { + if (this.processing == false) { + + this.processing = true; + + this.happinessTaskService.createOrUpdateAll(this.data.tasks).pipe(first()).subscribe(result => { + this.processing = false; + this.dlgRef.close(true); + }); + } + } + + getTaskTitle(t: HappinessTaskType) { + switch (t) { + case HappinessTaskType.IceBreak: return '帶遊戲'; + case HappinessTaskType.Worship: return '唱歌'; + case HappinessTaskType.Testimony: return '見證'; + case HappinessTaskType.Message: return '信息'; + case HappinessTaskType.Gift: return '準備禮物'; + case HappinessTaskType.Dessert: return '準備點心'; + default: break; + } + } +} \ No newline at end of file diff --git a/src/app/admin/pastoral-domains/pastoral-domain-editor/pastoral-domain-editor.component.html b/src/app/admin/pastoral-domains/pastoral-domain-editor/pastoral-domain-editor.component.html index ca0a431..70fb3db 100644 --- a/src/app/admin/pastoral-domains/pastoral-domain-editor/pastoral-domain-editor.component.html +++ b/src/app/admin/pastoral-domains/pastoral-domain-editor/pastoral-domain-editor.component.html @@ -4,29 +4,92 @@ Pastoral Domain -
-
+
+ +
+
+ + +
+
+
-
+
-
- + +
+
+ +
+
+ + +
+
+
+
+ + +
+
+ +
+
+ + + +
+
+ + +
+
+ +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ +
diff --git a/src/app/admin/pastoral-domains/pastoral-domain-editor/pastoral-domain-editor.component.ts b/src/app/admin/pastoral-domains/pastoral-domain-editor/pastoral-domain-editor.component.ts index cd56c0d..227f385 100644 --- a/src/app/admin/pastoral-domains/pastoral-domain-editor/pastoral-domain-editor.component.ts +++ b/src/app/admin/pastoral-domains/pastoral-domain-editor/pastoral-domain-editor.component.ts @@ -1,9 +1,11 @@ import { Component, OnInit } from '@angular/core'; import { NbDialogRef } from '@nebular/theme'; -import { first } from 'rxjs/operators'; +import { forkJoin, Observable } from 'rxjs'; +import { first, map, mergeMap } from 'rxjs/operators'; import { DropDownOption } from '../../../entity/dropDownOption'; import { FamilyMember } from '../../../entity/Member'; -import { PastoralDomain } from '../../../entity/PastoralDomain'; +import { AddressInfo, DomainType, PastoralDomain } from '../../../entity/PastoralDomain'; +import { LineClientService, LineMessagingAccountService } from '../../../services/crudServices/line-messaging-account.service'; import { PastoralDomainService } from '../../../services/crudServices/pastoral-domain.service'; @Component({ @@ -12,21 +14,47 @@ import { PastoralDomainService } from '../../../services/crudServices/pastoral-d styleUrls: ['./pastoral-domain-editor.component.scss'] }) export class PastoralDomainEditorComponent implements OnInit { + isLoading = true; isAdding: boolean = false; processing: boolean = false; data: PastoralDomain; members: FamilyMember[]; - leaderOptions: DropDownOption[]; + leaderOptions: DropDownOption[] = [new DropDownOption(null, 'N/A')]; + lineRobotOptions: DropDownOption[] = [new DropDownOption(null, 'N/A')]; + lineClientOptions: DropDownOption[] = [new DropDownOption(null, 'N/A')]; + domainTypeOptions: DropDownOption[] = [ + new DropDownOption(DomainType.CellGroup, 'Cell Group'), + new DropDownOption(DomainType.HappinessGroup, 'Happiness Group'), + ]; + constructor( private pastoralDomainService: PastoralDomainService, - private dlgRef: NbDialogRef + private dlgRef: NbDialogRef, + private lineAccountService: LineMessagingAccountService, + private lineClientService: LineClientService ) { } + ngOnInit(): void { - this.leaderOptions = this.members.map(m => new DropDownOption(m.id, `${m.firstName} ${m.lastName}`)); + this.leaderOptions = this.leaderOptions.concat(this.members.map(m => new DropDownOption(m.id, `${m.firstName} ${m.lastName}`))); if (this.isAdding) { this.data = { id: '' } as PastoralDomain; } + + if (!this.data.serviceAddress) { + this.data.serviceAddress = new AddressInfo(); + } + + forkJoin( + [this.lineAccountService.getAll(), + this.lineClientService.getAll()] + // getMultiValueObservable(), forkJoin on works for observables that complete + ).pipe(first()).subscribe(result => { + this.lineRobotOptions = this.lineRobotOptions.concat(result[0].map(m => new DropDownOption(m.id, `${m.name} (${500 - m.totalUsage})`))); + this.lineClientOptions = this.lineClientOptions.concat(result[1].filter(l => l.isGroup).map(m => new DropDownOption(m.clientId, `${m.name}`))); + this.isLoading = false; + }); + } close() { diff --git a/src/app/admin/pastoral-domains/pastoral-domains.component.ts b/src/app/admin/pastoral-domains/pastoral-domains.component.ts index 318f911..f0256ba 100644 --- a/src/app/admin/pastoral-domains/pastoral-domains.component.ts +++ b/src/app/admin/pastoral-domains/pastoral-domains.component.ts @@ -5,13 +5,15 @@ import { Observable } from 'rxjs'; import { first } from 'rxjs/operators'; import { StateService } from '../../@core/utils'; import { FamilyMember } from '../../entity/Member'; -import { PastoralDomain } from '../../entity/PastoralDomain'; +import { DomainType, 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 { FancySettings } from '../../ui/fancy-table/fancy-settings.model'; import { FancyTableComponent } from '../../ui/fancy-table/fancy-table.component'; import { ObjectUtils } from '../../utilities/object-utils'; +import { BestListDlgComponent } from '../happiness-groups/best-list-dlg/best-list-dlg.component'; +import { HappinessWeekListDlgComponent } from '../happiness-groups/happiness-week-list-dlg/happiness-week-list-dlg.component'; import { PastoralDomainEditorComponent } from './pastoral-domain-editor/pastoral-domain-editor.component'; @Component({ @@ -21,7 +23,6 @@ import { PastoralDomainEditorComponent } from './pastoral-domain-editor/pastoral }) export class PastoralDomainsComponent implements OnInit { - @ViewChild(FancyTableComponent, { static: false }) fancyTable: FancyTableComponent; data: PastoralDomain; allData: PastoralDomain[]; @@ -68,10 +69,31 @@ export class PastoralDomainsComponent implements OnInit { callback: (datum, element) => { this.delete(datum); }, - }], + }, + { + enabled: true, + id: 'happinessBest', + title: 'Bests', + icon: 'smiling-face-outline', + callback: (datum, element) => { + this.openBestListDlg(datum); + }, + }, + { + enabled: true, + id: 'happinessWeek', + title: 'Week Info', + icon: 'smiling-face-outline', + callback: (datum, element) => { + this.openHappinessWeekListDlg(datum); + }, + } + ], onContextMenuOpening: (datum, menuItems) => { menuItems.find(i => i.id == 'delete').visible = !!datum; menuItems.find(i => i.id == 'edit').visible = !!datum; + menuItems.find(i => i.id == 'happinessBest').visible = datum.type == DomainType.HappinessGroup; + menuItems.find(i => i.id == 'happinessWeek').visible = datum.type == DomainType.HappinessGroup; return datum; }, columns: [ @@ -179,5 +201,26 @@ export class PastoralDomainsComponent implements OnInit { return 'N/A'; } + private openHappinessWeekListDlg(datum: PastoralDomain) { + + this.dlgService.open(HappinessWeekListDlgComponent, { + context: { + group: datum + } + }).onClose.pipe(first()).subscribe(result => { + this.getAllData(); + }); + } + private openBestListDlg(datum: PastoralDomain) { + + this.dlgService.open(BestListDlgComponent, { + context: { + group: datum + } + }).onClose.pipe(first()).subscribe(result => { + this.getAllData(); + }); + } + } diff --git a/src/app/entity/HappinessGroup.ts b/src/app/entity/HappinessGroup.ts index a142b85..acfb94a 100644 --- a/src/app/entity/HappinessGroup.ts +++ b/src/app/entity/HappinessGroup.ts @@ -1,30 +1,22 @@ +import { PastoralDomain } from "./PastoralDomain"; + export interface HappinessWeek { groupId: string; - happinessGroup: HappinessGroup; - weekId: string; + happinessGroup: PastoralDomain; + id: string; date: Date; invitationText: string; address: string; cityAndZipCode: string; seq: number; updateRestWeekDate: boolean; - -} - -export interface HappinessGroup { - id: string; - name: string; - beginTime: Date; - address: string; - cityAndZipCode: string; - invitationText: string; - bestList: HappinessBEST[]; - weeks: HappinessWeek[]; + tasks: HappinessTask[]; + topic: string } export interface HappinessBEST { groupId: string; - happinessGroup: HappinessGroup; + happinessGroup: PastoralDomain; id: string; name: string; email: string; diff --git a/src/app/entity/LineMessagingAccount.ts b/src/app/entity/LineMessagingAccount.ts index 57e72cb..a17eb1e 100644 --- a/src/app/entity/LineMessagingAccount.ts +++ b/src/app/entity/LineMessagingAccount.ts @@ -4,4 +4,12 @@ export interface LineMessagingAccount { chatToken: string; totalUsage: number; seq: number; +} + +export interface LineClient { + id: string; + clientId: string; + isGroup: boolean; + isManager: boolean; + name: string; } \ No newline at end of file diff --git a/src/app/entity/PastoralDomain.ts b/src/app/entity/PastoralDomain.ts index fcdcb3b..a369122 100644 --- a/src/app/entity/PastoralDomain.ts +++ b/src/app/entity/PastoralDomain.ts @@ -1,5 +1,14 @@ +import { HappinessBEST, HappinessWeek } from "./HappinessGroup"; import { FamilyMember } from "./Member"; +export enum DomainType { + CellGroup, + HappinessGroup, + CellGroupCoworker, + ChurchCoworker, + Person = 99 +} + export interface PastoralDomain { id: string; name: string; @@ -12,10 +21,18 @@ export interface PastoralDomain { leaderMemberId: string; leader: FamilyMember; familyMembers: FamilyMember[]; + + lineGroupId: string; + lineAccountId: string; + + bests: HappinessBEST[]; + happinessWeeks: HappinessWeek[]; + + serviceAddress: AddressInfo; + type: DomainType; + serviceTime: Date; } export class DomainMemberRelationship { - - constructor(pastoralDomainId: string, familyMemberId: string) { this.pastoralDomainId = pastoralDomainId this.familyMemberId = familyMemberId @@ -23,4 +40,20 @@ export class DomainMemberRelationship { pastoralDomainId: string; familyMemberId: string; +} +export class AddressInfo { + /** + * + */ + constructor() { + this.id = "new"; + this.address = ""; + this.city = ""; + this.zip = ""; + } + id: string; + address: string; + city: string; + state: string; + zip: string; } \ No newline at end of file diff --git a/src/app/invitation/invitation.component.ts b/src/app/invitation/invitation.component.ts index 4f6c76f..e03f061 100644 --- a/src/app/invitation/invitation.component.ts +++ b/src/app/invitation/invitation.component.ts @@ -5,6 +5,7 @@ import { first } from 'rxjs/operators'; import { HappinessBEST, HappinessWeek } from '../entity/HappinessGroup'; import { HappinessGroupService } from '../services/crudServices/happiness-group.service'; import { DateUtils } from '../utilities/date-utils'; +import { StringUtils } from '../utilities/string-utils'; declare let TypeIt: any; @Component({ selector: 'ngx-invitation', @@ -41,7 +42,7 @@ export class InvitationComponent implements OnInit { this.happinessGroupService.getBest(id).pipe(first()).subscribe(result => { if (result) { this.best = result; - this.weeks = this.best.happinessGroup.weeks.sort((a, b) => a.seq - b.seq); + this.weeks = this.best.happinessGroup.happinessWeeks.sort((a, b) => a.seq - b.seq); if (this.weekNo == -1) { var today = new Date(); @@ -72,7 +73,7 @@ export class InvitationComponent implements OnInit { if (this.week) { dummy.value = `${this.week.address} ${this.week.cityAndZipCode}`; } else { - dummy.value = `${this.best.happinessGroup.address} ${this.best.happinessGroup.cityAndZipCode}`; + dummy.value = `${this.best.happinessGroup.leader} ${StringUtils.AddressCszToString(this.best.happinessGroup.serviceAddress)}`; } dummy.select(); document.execCommand("copy"); @@ -170,11 +171,11 @@ export class InvitationComponent implements OnInit { break; } - if (this.best.happinessGroup.invitationText) { + if (this.best.happinessGroup.description) { instance .break({ delay: 500 }) - .type(`${this.best.happinessGroup.invitationText}`) + .type(`${this.best.happinessGroup.description}`) } instance @@ -212,10 +213,10 @@ export class InvitationComponent implements OnInit { .break() .pause(200) .options({ speed: 50 }) - .type(`${week ? week.address : this.best.happinessGroup.address}`) + .type(`${week ? week.address : this.best.happinessGroup.serviceAddress.address}`) .break() .pause(200) - .type(`${week ? week.cityAndZipCode : this.best.happinessGroup.cityAndZipCode}`) + .type(`${week ? week.cityAndZipCode : StringUtils.AddressCszToString(this.best.happinessGroup.serviceAddress)}`) .break() .options({ speed: 125 }) .exec(async () => { diff --git a/src/app/services/crudServices/crud.service.ts b/src/app/services/crudServices/crud.service.ts index c3336b8..fc6da23 100644 --- a/src/app/services/crudServices/crud.service.ts +++ b/src/app/services/crudServices/crud.service.ts @@ -40,7 +40,7 @@ export class CrudService implements ICrudService { return this.http.get(this.GET_URL_GET_BY_ID(id)); } - update(data) { + update(data: T) { return this.http.post(this.POST_URL_UPDATE(), JSON.stringify(data), { headers: { @@ -50,7 +50,7 @@ export class CrudService implements ICrudService { }); } - createOrUpdate(data) { + createOrUpdate(data: T) { return this.http.post(this.POST_URL_CREATE_OR_UPDATE(), JSON.stringify(data), { headers: { @@ -60,7 +60,7 @@ export class CrudService implements ICrudService { }); } - createOrUpdateAll(data) { + createOrUpdateAll(data: T[]) { return this.http.post(this.POST_URL_CREATE_OR_UPDATE_ALL(), JSON.stringify(data), { headers: { @@ -122,7 +122,7 @@ export class CombinedKeyCrudService implements ICrudService { return this.http.get(this.GET_URL_GET_BY_ID(ids)); } - update(data) { + update(data: T) { return this.http.post(this.POST_URL_UPDATE(), JSON.stringify(data), { headers: { @@ -132,7 +132,7 @@ export class CombinedKeyCrudService implements ICrudService { }); } - createOrUpdate(data) { + createOrUpdate(data: T) { return this.http.post(this.POST_URL_CREATE_OR_UPDATE(), JSON.stringify(data), { headers: { @@ -142,7 +142,7 @@ export class CombinedKeyCrudService implements ICrudService { }); } - createOrUpdateAll(data) { + createOrUpdateAll(data: T[]) { return this.http.post(this.POST_URL_CREATE_OR_UPDATE_ALL(), JSON.stringify(data), { headers: { diff --git a/src/app/services/crudServices/happiness-group.service.ts b/src/app/services/crudServices/happiness-group.service.ts index dd891ac..0e069e3 100644 --- a/src/app/services/crudServices/happiness-group.service.ts +++ b/src/app/services/crudServices/happiness-group.service.ts @@ -2,26 +2,22 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/internal/Observable'; import { first, map } from 'rxjs/operators'; -import { environment } from '../../../environments/environment'; -import { HappinessBEST, HappinessGroup } from '../../entity/HappinessGroup'; +import { HappinessBEST, HappinessTask } from '../../entity/HappinessGroup'; import { saveAs } from 'file-saver'; -import { DateUtils } from '../../utilities/date-utils'; import { CrudService } from './crud.service'; -const GET_GROUP_GET_ALL = "/api/HappinessGroup" const BEST_URL = (id: string = null) => { return `Best${(id ? `/${id}` : '')}` }; -const HAPPINESS_GROUP_BASE_URL = (id: string = null) => { return `HappinessGroup${(id ? `/${id}` : '')}` }; -const POST_URL_UPDATE_BEST_WEEK = 'HappinessGroup/UpdateBestWeek'; +const POST_URL_UPDATE_BEST_WEEK = 'Best/UpdateBestWeek'; @Injectable({ providedIn: 'root' }) -export class HappinessGroupService extends CrudService { +export class HappinessGroupService { constructor( protected http: HttpClient, ) { - super(http, HAPPINESS_GROUP_BASE_URL); + //super(http, HAPPINESS_GROUP_BASE_URL); } createOrUpdateBestWeek(data) { return this.http.post(POST_URL_UPDATE_BEST_WEEK, @@ -59,3 +55,15 @@ export class HappinessGroupService extends CrudService { } + + +const WEEK_TASK_BASE_URL = (action: string = null) => { return `HappinessWeekTask${(action ? `/${action}` : '')}` } +@Injectable({ + providedIn: 'root' +}) +export class HappinessTaskService extends CrudService { + + constructor(protected http: HttpClient) { + super(http, WEEK_TASK_BASE_URL); + } +} diff --git a/src/app/services/crudServices/line-messaging-account.service.ts b/src/app/services/crudServices/line-messaging-account.service.ts index 663bbd5..81ab4e6 100644 --- a/src/app/services/crudServices/line-messaging-account.service.ts +++ b/src/app/services/crudServices/line-messaging-account.service.ts @@ -3,7 +3,7 @@ import { Injectable } from '@angular/core'; import { NewVisitor } from '../../entity/NewVisitor'; import { CrudService } from './crud.service'; import { first, map } from 'rxjs/operators'; -import { LineMessagingAccount } from '../../entity/LineMessagingAccount'; +import { LineClient, LineMessagingAccount } from '../../entity/LineMessagingAccount'; const BASE_URL = (action: string = null) => { return `LineMessagingAccount${(action ? `/${action}` : '')}` } @@ -22,3 +22,19 @@ export class LineMessagingAccountService extends CrudService { return `LineClient${(action ? `/${action}` : '')}` } + +@Injectable({ + providedIn: 'root' +}) +export class LineClientService extends CrudService { + + constructor(protected http: HttpClient) { + super(http, LINE_CLIENT_BASE_URL); + } + +} + diff --git a/src/app/utilities/string-utils.ts b/src/app/utilities/string-utils.ts index a3e6af5..8ebcc62 100644 --- a/src/app/utilities/string-utils.ts +++ b/src/app/utilities/string-utils.ts @@ -1,6 +1,9 @@ //import { FtTagType } from "../components/fancy-table/fancy-row-column.model"; //import { AddressInfo } from "../models/contactInfo.model"; +import { stringify } from "querystring"; +import { AddressInfo } from "../entity/PastoralDomain"; + export class StringUtils { // Sorting function for SemVer @@ -143,20 +146,34 @@ export class StringUtils { /** * Try to parse city sate zip string like `Monrovia, CA 91016` to AddressInfo, if failed will return `null` instead. */ - // public static tryParseCityStateZip(cityStateZip: string): AddressInfo { + public static tryParseCityStateZip(cityStateZip: string): AddressInfo { - // let addressInfo = new AddressInfo(); - // var regex = /([\w\s]*),\s*([A-Z]{2})\s*(\d*-?\d*)/g; - // var match = regex.exec(cityStateZip); - // if (match) { - // addressInfo = new AddressInfo(); - // addressInfo.city = match[1]; - // addressInfo.state = match[2]; - // addressInfo.zip = match[3]; - // return addressInfo; - // } else { - // return null; - // } - // } + let addressInfo = new AddressInfo(); + var regex = /([\w\s]*),\s*([A-Z]{2})\s*(\d*-?\d*)/g; + var match = regex.exec(cityStateZip); + if (match) { + addressInfo = new AddressInfo(); + addressInfo.city = match[1]; + addressInfo.state = match[2]; + addressInfo.zip = match[3]; + return addressInfo; + } else { + return null; + } + } + public static AddressCszToString(info: AddressInfo): string { + + let result = ''; + let secondPart = ''; + if (info) { + + if (!this.isNullOrWhitespace(info.city)) result += info.city.trim(); + + secondPart = `${info.city} ${info.zip}`; + if (!this.isNullOrWhitespace(secondPart)) result += `, ${secondPart.trim()}` + } + + return result; + } }