@sneat/extension-contactus 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -0
- package/fesm2022/sneat-extension-contactus-contact-base-page-D6vHs5em.mjs +63 -0
- package/fesm2022/sneat-extension-contactus-contact-base-page-D6vHs5em.mjs.map +1 -0
- package/fesm2022/sneat-extension-contactus-contacts-page.component-BzTRhfPJ.mjs +118 -0
- package/fesm2022/sneat-extension-contactus-contacts-page.component-BzTRhfPJ.mjs.map +1 -0
- package/fesm2022/sneat-extension-contactus-index-DVC9hDgV.mjs +352 -0
- package/fesm2022/sneat-extension-contactus-index-DVC9hDgV.mjs.map +1 -0
- package/fesm2022/sneat-extension-contactus-index-weKgp-3B.mjs +272 -0
- package/fesm2022/sneat-extension-contactus-index-weKgp-3B.mjs.map +1 -0
- package/fesm2022/sneat-extension-contactus-members-page.component-DPXZ6eSl.mjs +188 -0
- package/fesm2022/sneat-extension-contactus-members-page.component-DPXZ6eSl.mjs.map +1 -0
- package/fesm2022/sneat-extension-contactus-sneat-extension-contactus-BkVEPHoJ.mjs +560 -0
- package/fesm2022/sneat-extension-contactus-sneat-extension-contactus-BkVEPHoJ.mjs.map +1 -0
- package/fesm2022/sneat-extension-contactus-space-member-page.component-BgZCwQmN.mjs +124 -0
- package/fesm2022/sneat-extension-contactus-space-member-page.component-BgZCwQmN.mjs.map +1 -0
- package/fesm2022/sneat-extension-contactus.mjs +2 -0
- package/fesm2022/sneat-extension-contactus.mjs.map +1 -0
- package/package.json +48 -0
- package/types/sneat-extension-contactus.d.ts +15 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sneat-extension-contactus-members-page.component-DPXZ6eSl.mjs","sources":["../../../../../../libs/extensions/contactus/runtime/src/lib/members/members-base-page.ts","../../../../../../libs/extensions/contactus/runtime/src/lib/members/pages/members/members-page.component.ts","../../../../../../libs/extensions/contactus/runtime/src/lib/members/pages/members/members-page.component.html"],"sourcesContent":["import { SpaceMemberType } from '@sneat/auth-models';\nimport { ContactusModuleBaseComponent } from '@sneat/extension-contactus-ui';\nimport { IIdAndBriefAndOptionalDbo } from '@sneat/core';\nimport { isSpaceSupportsMemberGroups } from '@sneat/dto';\nimport { ContactusSpaceService } from '../services';\nimport { IContactBrief, IContactDbo } from '@sneat/extension-contactus-contract';\n\nexport abstract class MembersBasePage extends ContactusModuleBaseComponent {\n public members?: readonly IIdAndBriefAndOptionalDbo<\n IContactBrief,\n IContactDbo\n >[];\n\n // protected currentUserDto: IDtoUser;\n\n abstract get memberType(): SpaceMemberType;\n\n // protected setCurrentUser(dto: IDtoUser) {\n // this.currentUserDto = dto;\n // }\n\n protected constructor(contactusTeamService: ContactusSpaceService) {\n super(contactusTeamService);\n // this.userService.currentUserLoaded.subscribe(user => this.setCurrentUser(user));\n }\n\n goNewMember = () => {\n // TODO: use it?\n this.navigateForwardToSpacePage('new-member').catch(\n this.logErrorHandler('failed to navigate to new member page'),\n );\n };\n\n // goMember = (member: IMemberContext, page?: MemberPages) => {\n // \tthis.navigateForwardToSpacePage(\n // \t\t(page || 'member') + '/' + member.id,\n // \t).catch(this.logErrorHandler('failed to navigate to team member page'));\n // };\n //\n // goContact = (id: string, event: Event) => {\n // \tevent.stopPropagation();\n // \tthis.navigateForwardToSpacePage(`contact/${id}`)\n // \t\t.catch(this.logErrorHandler('failed to navigate to contact page'));\n // };\n\n public get supportsMemberGroups(): boolean {\n return (\n !!this.space?.brief && isSpaceSupportsMemberGroups(this.space.brief.type)\n );\n }\n\n // protected setPageCommuneIds(source: string, communeIds: ICommuneIds, communeDto?: ICommuneDto): void {\n // \tsuper.setPageCommuneIds(source, communeIds, communeDto);\n // \tif (this.communeRealId) {\n // \t\tthis.membersService.selectByType(this.communeRealId, this.memberType)\n // \t\t\t.subscribe(\n // \t\t\t\tmembers => {\n // \t\t\t\t\tthis.members = members;\n // \t\t\t\t},\n // \t\t\t\tthis.errorLogger.logError,\n // \t\t\t);\n // \t}\n // }\n}\n","import { AsyncPipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { Params } from '@angular/router';\nimport {\n IonBackButton,\n IonBadge,\n IonButton,\n IonButtons,\n IonCard,\n IonContent,\n IonFooter,\n IonHeader,\n IonIcon,\n IonItem,\n IonItemDivider,\n IonItemGroup,\n IonLabel,\n IonMenuButton,\n IonSegment,\n IonSegmentButton,\n IonToolbar,\n} from '@ionic/angular/standalone';\nimport { SpaceMemberType } from '@sneat/auth-models';\nimport {\n ContactusServicesModule,\n ContactusSpaceService,\n} from '../../../services';\nimport { FamilyMembersComponent, MemberGroup } from '@sneat/extension-contactus-ui';\nimport { IMemberGroupContext } from '@sneat/extension-contactus-contract';\nimport { isSpaceSupportsMemberGroups } from '@sneat/dto';\nimport {\n SpaceComponentBaseParams,\n SpacePageTitleComponent,\n} from '@sneat/space-components';\nimport { SpaceServiceModule } from '@sneat/space-services';\nimport { ClassName } from '@sneat/ui';\nimport { MembersBasePage } from '../../members-base-page';\nimport { Component, inject } from '@angular/core';\n\n@Component({\n imports: [\n FormsModule,\n SpacePageTitleComponent,\n ContactusServicesModule,\n FamilyMembersComponent,\n SpaceServiceModule,\n IonHeader,\n IonToolbar,\n IonButtons,\n IonBackButton,\n IonMenuButton,\n IonContent,\n IonSegment,\n IonSegmentButton,\n IonLabel,\n IonCard,\n AsyncPipe,\n IonItemGroup,\n IonItemDivider,\n IonIcon,\n IonBadge,\n IonItem,\n IonFooter,\n IonButton,\n ],\n providers: [\n { provide: ClassName, useValue: 'MembersPageComponent' },\n SpaceComponentBaseParams,\n ],\n selector: 'sneat-members-page',\n templateUrl: 'members-page.component.html',\n})\nexport class MembersPageComponent extends MembersBasePage {\n // private readonly memberGroupService = inject(MemberGroupService);\n\n public memberGroups?: readonly IMemberGroupContext[];\n // public loadingStubs?: number[];\n public segment: 'all' | 'groups' = 'all';\n // public listMode: 'list' | 'cards' = 'list';\n // public membersByGroupId: { [id: string]: IMemberContext[] } = {};\n\n readonly memberType: SpaceMemberType = 'member';\n\n constructor() {\n const contactusTeamService = inject(ContactusSpaceService);\n\n super(contactusTeamService);\n }\n\n protected goGroup(memberGroup: IMemberGroupContext): void {\n this.navigateForwardToSpacePage(`group/${memberGroup.id}`, {\n state: { memberGroup },\n }).catch(this.logErrorHandler('failed to navigate to members group page'));\n }\n\n protected goNewMemberPage(group?: MemberGroup): void {\n const queryParams: Params | undefined = group\n ? { group: group.id }\n : undefined;\n this.navigateForwardToSpacePage('new-member', {\n queryParams,\n state: { group },\n }).catch(\n this.logErrorHandler(\n 'failed to navigate to new member page with age parameter',\n ),\n );\n }\n\n public goNew(): void {\n switch (this.segment) {\n case 'all':\n this.goNewMemberPage();\n break;\n case 'groups':\n this.navigateForwardToSpacePage('new-group').catch(\n this.logErrorHandler('failed to navigate to new group page'),\n );\n break;\n default:\n alert(`Unknown segment: ${this.segment}`);\n return;\n }\n }\n\n override onSpaceDboChanged(): void {\n super.onSpaceDboChanged();\n if (!this.space) {\n throw new Error('!this.commune');\n }\n // console.log(`MembersPageComponent.onSpaceDboChanged()`);\n // if (this.team?.dto?.numberOf?.members) {\n // \tthis.loadingStubs = Array(this.team?.dto?.numberOf?.members).fill(1);\n // }\n // if (!isNaN(this.prevMembersCount) && this.prevMembersCount != this.commune.numberOf.members) {\n // this.loadData();\n // }\n this.loadData('onSpaceDboChanged');\n // this.prevMembersCount = this.team?.dto?.numberOf?.members || 0;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n private loadData(_source: string): void {\n // console.log(`MembersPageComponent.loadData(source=${source})`);\n\n // this.unsubscribe();\n const space = this.space;\n if (!space) {\n throw new Error('!this.team');\n }\n // this.noGroupMembers = this.team?.brief && isTeamSupportsMemberGroups(this.team.brief.type) ? [] : undefined;\n\n // const contactusTeam = this.teamModuleDto;\n //\n // if (contactusTeam?.dto?.contacts) {\n // \tthis.processContactusSpaceDbo(contactusTeam.dto);\n // } else {\n // \tthis.contactService\n // \t\t.watchContactsWithRole(space, 'space_member') // TODO: use constant\n // \t\t.pipe(takeUntil(this.spaceIDChanged$))\n // \t\t.subscribe({\n // \t\t\tnext: (members) => {\n // \t\t\t\tconsole.log(\n // \t\t\t\t\t`MembersPageComponent.loadData(source=${source}), members =>`,\n // \t\t\t\t\tmembers,\n // \t\t\t\t);\n // \t\t\t\tif (members?.length) {\n // \t\t\t\t\t// TODO: deep equal\n // \t\t\t\t\tmembers.forEach((m) => {\n // \t\t\t\t\t\tif (m.id) {\n // \t\t\t\t\t\t\tif (m.dto?.related) {\n // \t\t\t\t\t\t\t\t// this.contactsByMember[m.id] = zipMapBriefsWithIDs(\n // \t\t\t\t\t\t\t\t// \tm.dto.relatedContacts,\n // \t\t\t\t\t\t\t\t// );\n // \t\t\t\t\t\t\t} else if (this.contactsByMember[m.id]) {\n // \t\t\t\t\t\t\t\tdelete this.contactsByMember[m.id];\n // \t\t\t\t\t\t\t}\n // \t\t\t\t\t\t}\n // \t\t\t\t\t});\n // \t\t\t\t\tthis.members = members;\n // \t\t\t\t\tthis.processMembers();\n // \t\t\t\t}\n // \t\t\t},\n // \t\t});\n // }\n\n if (space.type && isSpaceSupportsMemberGroups(space.type)) {\n throw new Error('not implemented yet due to refactoring');\n // this.contactService.watchContactsByRole(team)\n // \t.subscribe(memberGroups => {\n // \t\tif (memberGroups && (!this.memberGroups || memberGroups.length !== this.memberGroups.length)) { // TODO: deep equal\n // \t\t\tthis.memberGroups = memberGroups;\n // \t\t}\n // \t});\n }\n }\n}\n","<ion-header>\n <ion-toolbar color=\"light\" class=\"with-back-button with-end-buttons\">\n <ion-buttons slot=\"start\">\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n <sneat-space-page-title\n [space]=\"space\"\n generalTitle=\"Members\"\n icon=\"👪\"\n [titlesBySpaceType]=\"{\n family: 'Family members',\n }\"\n />\n <ion-buttons slot=\"end\">\n <ion-menu-button menu=\"mainMenu\" />\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n @if (supportsMemberGroups) {\n <div class=\"segment\">\n <ion-segment [(ngModel)]=\"segment\">\n <ion-segment-button value=\"all\">\n <ion-label>All</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"groups\">\n <ion-label>\n @if (space.type === \"cohabit\") {\n By room\n } @else {\n By group\n }\n </ion-label>\n </ion-segment-button>\n </ion-segment>\n </div>\n }\n\n <!--\t<div class=\"segment\" *ngIf=\"spaceType === 'family'\">-->\n <!--\t\t<ion-segment [(ngModel)]=\"listMode\">-->\n <!--\t\t\t<ion-segment-button value=\"list\">List</ion-segment-button>-->\n <!--\t\t\t<ion-segment-button value=\"cards\">Cards</ion-segment-button>-->\n <!--\t\t</ion-segment>-->\n <!--\t</div>-->\n\n <!--\t<ion-list *ngIf=\"segment === 'all' && teamType === 'family'\">-->\n <!--\t\t<sneat-members-list *ngIf=\"adults\"-->\n <!--\t\t\t\t\t\t\t\t\t\t\t\t[team]=\"team\"-->\n <!--\t\t\t\t\t\t\t\t\t\t\t\t[allMembers]=\"members\"-->\n <!--\t\t\t\t\t\t\t\t\t\t\t\t[contactsByMember]=\"contactsByMember\"-->\n <!--\t\t></sneat-members-list>-->\n <!--\t</ion-list>-->\n\n @if (segment === \"all\" && $spaceType() === \"family\") {\n <ion-card>\n <sneat-family-members\n [$space]=\"$space()\"\n [contactusSpaceDbo]=\"spaceModuleDbo$ | async\"\n (addMember)=\"goNewMemberPage($event)\"\n />\n </ion-card>\n }\n\n @if (segment === \"groups\") {\n @if ($spaceType() === \"cohabit\") {\n @if (memberGroups) {\n @for (group of memberGroups; track group.id) {\n <ion-item-group>\n <ion-item-divider>\n <ion-icon name=\"people\" style=\"margin-right: 0.5em\" />\n <ion-label>\n {{ group.brief?.title }}\n </ion-label>\n @if (group.dbo?.numberOf?.members) {\n <ion-badge color=\"light\">\n {{ group.dbo?.numberOf?.members }} members\n </ion-badge>\n }\n </ion-item-divider>\n <!--\t\t\t\t\t<ng-container *ngIf=\"membersByGroupId[group.id]\">-->\n <!--\t\t\t\t\t\t<sneat-members-list [members]=\"this.membersByGroupId[group.id]\"-->\n <!--\t\t\t\t\t\t></sneat-members-list>-->\n <!--\t\t\t\t\t</ng-container>-->\n </ion-item-group>\n }\n\n <!--\t\t\t\t<ng-container *ngIf=\"noGroupMembers && noGroupMembers.length\">-->\n <!--\t\t\t\t\t<ion-item-divider>-->\n <!--\t\t\t\t\t\t<ion-label>No group members</ion-label>-->\n <!--\t\t\t\t\t</ion-item-divider>-->\n <!--\t\t\t\t\t<sneat-members-list [members]=\"noGroupMembers\"-->\n <!--\t\t\t\t\t></sneat-members-list>-->\n <!--\t\t\t\t</ng-container>-->\n }\n } @else if (memberGroups) {\n @for (group of memberGroups; track group.id) {\n <ion-item-group>\n <ion-item button=\"button\" (click)=\"goGroup(group)\">\n <ion-icon name=\"people\" style=\"margin-right: 0.5em\" />\n <ion-label>\n {{ group.brief?.title }}\n </ion-label>\n @if (group.dbo?.numberOf?.members) {\n <ion-badge color=\"light\">\n {{ group?.dbo?.numberOf?.members }} members\n </ion-badge>\n }\n </ion-item>\n </ion-item-group>\n }\n <!--\t\t\t\t<ng-container *ngIf=\"noGroupMembers && noGroupMembers.length\">-->\n <!--\t\t\t\t\t<ion-item-divider>-->\n <!--\t\t\t\t\t\t<ion-label>No group members</ion-label>-->\n <!--\t\t\t\t\t\t<ion-badge color=\"light\" slot=\"end\"-->\n <!--\t\t\t\t\t\t\t\t\t\t\t style=\"margin-right: 1em\">{{noGroupMembers.length}}</ion-badge>-->\n <!--\t\t\t\t\t</ion-item-divider>-->\n <!--\t\t\t\t\t<sneat-members-list-->\n <!--\t\t\t\t\t\t[members]=\"noGroupMembers\"-->\n <!--\t\t\t\t\t\t[contactsByMember]=\"contactsByMember\"-->\n <!--\t\t\t\t\t></sneat-members-list>-->\n <!--\t\t\t\t</ng-container>-->\n }\n }\n</ion-content>\n\n<ion-footer>\n <ion-toolbar color=\"light\">\n @if (space.dbo) {\n @switch (segment) {\n @case (\"all\") {\n <ion-label>\n <b>Total</b>:\n <!--\t\t\t{{ team.dto.numberOf?.members ?? 0 }}-->\n <!--\t\t\t{{ team.dto.numberOf?.members === 1 ? \"member\" : \"members\" }}-->\n </ion-label>\n }\n @case (\"groups\") {\n <ion-label>\n <b>Total</b>:\n <!--\t\t\t{{ team.dto.numberOf?.memberGroups || 0 }}-->\n <!--\t\t\t{{ team.dto.numberOf?.memberGroups === 1 ? \"group\" : \"groups\" }}-->\n </ion-label>\n }\n }\n } @else {\n <ion-label>Loading...</ion-label>\n }\n\n <ion-buttons slot=\"end\">\n <ion-button\n size=\"small\"\n color=\"primary\"\n [disabled]=\"!space.brief\"\n (click)=\"goNew()\"\n [title]=\"segment === 'groups' ? 'Add new group' : 'Add new member'\"\n >\n <ion-icon name=\"add\" />\n <ion-label>Add</ion-label>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-footer>\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
import { defaultFamilyContactGroupDTOs, defaultFamilyContactGroups, validateContactRequest, validateUpdateContactRequest, validateCreateSpaceMemberRequest, CONTACT_SERVICE, CONTACTUS_SPACE_SERVICE, CONTACT_NAV_SERVICE, CONTACTUS_NAV_SERVICE, CONTACT_GROUP_SERVICE, CONTACT_ROLE_SERVICE, INVITE_SERVICE } from '@sneat/extension-contactus-contract';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { inject, Injector, Injectable, NgModule } from '@angular/core';
|
|
4
|
+
import { Firestore } from '@angular/fire/firestore';
|
|
5
|
+
import { SneatApiService } from '@sneat/api';
|
|
6
|
+
import { ModuleSpaceItemService, SpaceNavService, SpaceModuleService } from '@sneat/space-services';
|
|
7
|
+
import { of, throwError, tap, map, Subject, takeUntil, from, switchMap } from 'rxjs';
|
|
8
|
+
import { ErrorLogger, excludeUndefined, excludeEmpty } from '@sneat/core';
|
|
9
|
+
import { SneatUserService, SneatAuthStateService } from '@sneat/auth-core';
|
|
10
|
+
import { trimNames } from '@sneat/auth-models';
|
|
11
|
+
import { Auth, createUserWithEmailAndPassword } from '@angular/fire/auth';
|
|
12
|
+
import { RandomIdService } from '@sneat/random';
|
|
13
|
+
import { map as map$1 } from 'rxjs/operators';
|
|
14
|
+
|
|
15
|
+
class ContactGroupService {
|
|
16
|
+
spaceItemService;
|
|
17
|
+
constructor() {
|
|
18
|
+
const afs = inject(Firestore);
|
|
19
|
+
const sneatApiService = inject(SneatApiService);
|
|
20
|
+
const injector = inject(Injector);
|
|
21
|
+
this.spaceItemService = new ModuleSpaceItemService(injector, 'contactus', 'contact_groups', afs, sneatApiService);
|
|
22
|
+
}
|
|
23
|
+
getContactGroups() {
|
|
24
|
+
return of(defaultFamilyContactGroupDTOs);
|
|
25
|
+
}
|
|
26
|
+
getContactGroupByID(id, space) {
|
|
27
|
+
const cg = defaultFamilyContactGroups.find((cg) => cg.id === id);
|
|
28
|
+
if (!cg) {
|
|
29
|
+
return of({ id, space, dbo: { title: id } });
|
|
30
|
+
}
|
|
31
|
+
return of(cg);
|
|
32
|
+
}
|
|
33
|
+
watchMemberGroupsBySpace(space, status = 'active') {
|
|
34
|
+
// console.log('watchMemberGroupsByTeamID()', spaceID);
|
|
35
|
+
return this.spaceItemService.watchModuleSpaceItemsWithSpaceRef(space, {
|
|
36
|
+
filter: [{ field: 'status', operator: '==', value: status }],
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactGroupService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
40
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactGroupService });
|
|
41
|
+
}
|
|
42
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactGroupService, decorators: [{
|
|
43
|
+
type: Injectable
|
|
44
|
+
}], ctorParameters: () => [] });
|
|
45
|
+
|
|
46
|
+
class ContactNavService {
|
|
47
|
+
errorLogger = inject(ErrorLogger);
|
|
48
|
+
spaceNavService = inject(SpaceNavService);
|
|
49
|
+
goNewContactPage(space, params) {
|
|
50
|
+
this.spaceNavService
|
|
51
|
+
.navigateForwardToSpacePage(space, 'new-contact', {
|
|
52
|
+
queryParams: excludeUndefined(params),
|
|
53
|
+
})
|
|
54
|
+
.catch(this.errorLogger.logErrorHandler('failed to navigate to "new-contact" page'));
|
|
55
|
+
}
|
|
56
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactNavService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
57
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactNavService, providedIn: 'root' });
|
|
58
|
+
}
|
|
59
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactNavService, decorators: [{
|
|
60
|
+
type: Injectable,
|
|
61
|
+
args: [{ providedIn: 'root' }]
|
|
62
|
+
}] });
|
|
63
|
+
|
|
64
|
+
class ContactusSpaceService extends SpaceModuleService {
|
|
65
|
+
constructor() {
|
|
66
|
+
const afs = inject(Firestore);
|
|
67
|
+
const injector = inject(Injector);
|
|
68
|
+
super(injector, 'contactus', afs);
|
|
69
|
+
}
|
|
70
|
+
watchContactBriefs = (spaceID) => {
|
|
71
|
+
// console.log(`ContactusSpaceService.watchContactBriefs(${spaceID})`);
|
|
72
|
+
return this.watchBriefs(spaceID, (dto) => dto?.contacts || {});
|
|
73
|
+
};
|
|
74
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactusSpaceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
75
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactusSpaceService });
|
|
76
|
+
}
|
|
77
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactusSpaceService, decorators: [{
|
|
78
|
+
type: Injectable
|
|
79
|
+
}], ctorParameters: () => [] });
|
|
80
|
+
|
|
81
|
+
class ContactService extends ModuleSpaceItemService {
|
|
82
|
+
contactusSpaceService = inject(ContactusSpaceService);
|
|
83
|
+
userService = inject(SneatUserService);
|
|
84
|
+
constructor() {
|
|
85
|
+
const afs = inject(Firestore);
|
|
86
|
+
const sneatApiService = inject(SneatApiService);
|
|
87
|
+
const injector = inject(Injector);
|
|
88
|
+
super(injector, 'contactus', 'contacts', afs, sneatApiService);
|
|
89
|
+
// this.briefService = new TeamItemService<{id: string}, IContactsBrief>('briefs', afs, sneatApiService);
|
|
90
|
+
}
|
|
91
|
+
createContact(spaceRef, request, endpoint = 'contactus/create_contact') {
|
|
92
|
+
return this.createSpaceItem(endpoint, spaceRef, request);
|
|
93
|
+
}
|
|
94
|
+
deleteContact(request) {
|
|
95
|
+
validateContactRequest(request);
|
|
96
|
+
return this.deleteSpaceItem('contactus/delete_contact', request);
|
|
97
|
+
}
|
|
98
|
+
updateContact(request) {
|
|
99
|
+
validateUpdateContactRequest(request);
|
|
100
|
+
return this.sneatApiService.post('contactus/update_contact', request);
|
|
101
|
+
}
|
|
102
|
+
addContactCommChannel(request) {
|
|
103
|
+
return this.sneatApiService.post('contactus/add_contact_comm_channel', request);
|
|
104
|
+
}
|
|
105
|
+
updateContactCommChannel(request) {
|
|
106
|
+
return this.sneatApiService.post('contactus/update_contact_comm_channel', request);
|
|
107
|
+
}
|
|
108
|
+
deleteContactCommChannel(request) {
|
|
109
|
+
return this.sneatApiService.post('contactus/delete_contact_comm_channel', request);
|
|
110
|
+
}
|
|
111
|
+
setContactsStatus(request) {
|
|
112
|
+
if (!request.contactIDs?.length) {
|
|
113
|
+
return throwError(() => 'at least 1 contact is required');
|
|
114
|
+
}
|
|
115
|
+
return this.sneatApiService.post('contactus/set_contacts_status', request);
|
|
116
|
+
}
|
|
117
|
+
watchContactsWithRole(space, role, status = 'active', filter) {
|
|
118
|
+
filter = [
|
|
119
|
+
...(filter || []),
|
|
120
|
+
{ field: 'roles', operator: '==', value: role },
|
|
121
|
+
];
|
|
122
|
+
return this.watchSpaceContacts(space, status, filter);
|
|
123
|
+
}
|
|
124
|
+
watchSpaceContacts(space, status = 'active', filter) {
|
|
125
|
+
filter = [
|
|
126
|
+
{
|
|
127
|
+
field: 'status',
|
|
128
|
+
value: status,
|
|
129
|
+
operator: '==',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
field: 'parentContactID',
|
|
133
|
+
operator: '==',
|
|
134
|
+
value: '',
|
|
135
|
+
},
|
|
136
|
+
...(filter || []),
|
|
137
|
+
];
|
|
138
|
+
return this.watchModuleSpaceItemsWithSpaceRef(space, {
|
|
139
|
+
filter,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
watchContactById(space, contactID) {
|
|
143
|
+
return this.watchSpaceItemByIdWithSpaceRef(space, contactID).pipe(tap((contact) => console.log('contact loaded:', contactID, contact)));
|
|
144
|
+
}
|
|
145
|
+
watchContactsByRole(space, filter) {
|
|
146
|
+
const f = [
|
|
147
|
+
// { field: 'spaceID', value: team.id, operator: '==' },
|
|
148
|
+
];
|
|
149
|
+
if (filter?.status) {
|
|
150
|
+
f.push({ field: 'status', value: filter.status, operator: '==' });
|
|
151
|
+
}
|
|
152
|
+
if (filter?.role) {
|
|
153
|
+
f.push({
|
|
154
|
+
field: 'roles',
|
|
155
|
+
operator: 'array-contains',
|
|
156
|
+
value: filter.role,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
return this.watchModuleSpaceItemsWithSpaceRef(space, { filter: f });
|
|
160
|
+
}
|
|
161
|
+
watchChildContacts(space, id, filter = { status: 'active' }) {
|
|
162
|
+
const f = [
|
|
163
|
+
{ field: 'parentContactID', value: id, operator: '==' },
|
|
164
|
+
];
|
|
165
|
+
if (filter.status) {
|
|
166
|
+
f.push({ field: 'status', value: filter.status, operator: '==' });
|
|
167
|
+
}
|
|
168
|
+
if (filter.role) {
|
|
169
|
+
f.push({
|
|
170
|
+
field: 'roles',
|
|
171
|
+
operator: 'array-contains',
|
|
172
|
+
value: filter.role,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
return this.watchModuleSpaceItemsWithSpaceRef(space, { filter: f });
|
|
176
|
+
}
|
|
177
|
+
changeContactRole(request) {
|
|
178
|
+
return this.sneatApiService
|
|
179
|
+
.post(`contactus/change_member_role`, request)
|
|
180
|
+
.pipe(map(() => {
|
|
181
|
+
return;
|
|
182
|
+
}));
|
|
183
|
+
}
|
|
184
|
+
removeSpaceMember(request) {
|
|
185
|
+
console.log(`removeTeamMember(spaceID=${request.spaceID}, contactID=${request.contactID})`);
|
|
186
|
+
try {
|
|
187
|
+
validateContactRequest(request);
|
|
188
|
+
}
|
|
189
|
+
catch (ex) {
|
|
190
|
+
return throwError(() => ex);
|
|
191
|
+
}
|
|
192
|
+
// const request: IContactRequest = { spaceID, contactID };
|
|
193
|
+
return this.sneatApiService.post('contactus/remove_team_member', request);
|
|
194
|
+
}
|
|
195
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
196
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactService });
|
|
197
|
+
}
|
|
198
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactService, decorators: [{
|
|
199
|
+
type: Injectable
|
|
200
|
+
}], ctorParameters: () => [] });
|
|
201
|
+
|
|
202
|
+
// TODO: ContactusSpaceContextService can be abstracted and reused by other entities
|
|
203
|
+
class ContactusSpaceContextService {
|
|
204
|
+
destroyed$;
|
|
205
|
+
spaceID$;
|
|
206
|
+
// Is used to emit contactus space record changes
|
|
207
|
+
contactusSpaceContext = new Subject();
|
|
208
|
+
contactusSpaceContext$ = this.contactusSpaceContext.asObservable();
|
|
209
|
+
spaceID;
|
|
210
|
+
spaceModuleRecordSub;
|
|
211
|
+
errorLogger = inject(ErrorLogger);
|
|
212
|
+
userService = inject(SneatUserService);
|
|
213
|
+
contactusSpaceService = inject(ContactusSpaceService);
|
|
214
|
+
constructor(destroyed$, spaceID$) {
|
|
215
|
+
this.destroyed$ = destroyed$;
|
|
216
|
+
this.spaceID$ = spaceID$;
|
|
217
|
+
destroyed$.subscribe({
|
|
218
|
+
next: () => {
|
|
219
|
+
this.contactusSpaceContext.complete();
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
spaceID$.pipe(takeUntil(destroyed$)).subscribe({
|
|
223
|
+
next: (spaceID) => {
|
|
224
|
+
this.spaceID = spaceID;
|
|
225
|
+
if (this.userService.currentUserID) {
|
|
226
|
+
this.subscribeForContactusSpaceChanges(spaceID);
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
this.userService.userChanged.pipe(takeUntil(destroyed$)).subscribe({
|
|
231
|
+
next: (uid) => {
|
|
232
|
+
if (uid) {
|
|
233
|
+
this.subscribeForContactusSpaceChanges(this.spaceID);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
this.spaceModuleRecordSub?.unsubscribe();
|
|
237
|
+
this.contactusSpaceContext.next(undefined);
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
subscribeForContactusSpaceChanges = (spaceID) => {
|
|
243
|
+
this.spaceModuleRecordSub?.unsubscribe();
|
|
244
|
+
if (!spaceID) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
this.spaceModuleRecordSub = this.contactusSpaceService
|
|
248
|
+
.watchSpaceModuleRecord(spaceID)
|
|
249
|
+
.pipe(takeUntil(this.spaceID$), takeUntil(this.destroyed$))
|
|
250
|
+
.subscribe({
|
|
251
|
+
next: this.onContactusSpaceChanged,
|
|
252
|
+
error: this.errorLogger.logErrorHandler('ContactusSpaceContextService: failed to get contactus space record'),
|
|
253
|
+
});
|
|
254
|
+
};
|
|
255
|
+
onContactusSpaceChanged = (contactusSpace) => {
|
|
256
|
+
console.log('ContactusSpaceContextService.onContactusSpaceChanged()', contactusSpace);
|
|
257
|
+
this.contactusSpaceContext.next(contactusSpace);
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
class ContactRoleService {
|
|
262
|
+
getContactRoleByID(id) {
|
|
263
|
+
for (const cg of defaultFamilyContactGroups) {
|
|
264
|
+
for (let j = 0; j < (cg?.dbo?.roles?.length || 0); j++) {
|
|
265
|
+
const role = cg.dbo?.roles && cg.dbo.roles[j];
|
|
266
|
+
if (role?.id === id) {
|
|
267
|
+
return of({ id, brief: role.brief });
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return of({ id, brief: { title: id } });
|
|
272
|
+
}
|
|
273
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactRoleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
274
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactRoleService });
|
|
275
|
+
}
|
|
276
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactRoleService, decorators: [{
|
|
277
|
+
type: Injectable
|
|
278
|
+
}] });
|
|
279
|
+
|
|
280
|
+
class MemberService extends ContactService {
|
|
281
|
+
acceptPersonalInvite(request, firebaseToken) {
|
|
282
|
+
// console.log('MemberService.acceptPersonalInvite()');
|
|
283
|
+
if (firebaseToken) {
|
|
284
|
+
this.sneatApiService.setApiAuthToken(firebaseToken);
|
|
285
|
+
}
|
|
286
|
+
return this.sneatApiService.post('invites/accept_personal_invite', request);
|
|
287
|
+
}
|
|
288
|
+
createMember(request) {
|
|
289
|
+
// console.log(`MemberService.addMember()`, request);
|
|
290
|
+
if (request.names) {
|
|
291
|
+
request = { ...request, names: trimNames(request.names) };
|
|
292
|
+
}
|
|
293
|
+
validateCreateSpaceMemberRequest(request);
|
|
294
|
+
return this.sneatApiService.post('contactus/create_member', request);
|
|
295
|
+
}
|
|
296
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: MemberService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
297
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: MemberService });
|
|
298
|
+
}
|
|
299
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: MemberService, decorators: [{
|
|
300
|
+
type: Injectable
|
|
301
|
+
}] });
|
|
302
|
+
|
|
303
|
+
class ContactusServicesModule {
|
|
304
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactusServicesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
305
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: ContactusServicesModule });
|
|
306
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactusServicesModule, providers: [
|
|
307
|
+
ContactService,
|
|
308
|
+
ContactNavService,
|
|
309
|
+
ContactGroupService,
|
|
310
|
+
ContactRoleService,
|
|
311
|
+
ContactusSpaceService,
|
|
312
|
+
MemberService,
|
|
313
|
+
] });
|
|
314
|
+
}
|
|
315
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactusServicesModule, decorators: [{
|
|
316
|
+
type: NgModule,
|
|
317
|
+
args: [{
|
|
318
|
+
imports: [],
|
|
319
|
+
providers: [
|
|
320
|
+
ContactService,
|
|
321
|
+
ContactNavService,
|
|
322
|
+
ContactGroupService,
|
|
323
|
+
ContactRoleService,
|
|
324
|
+
ContactusSpaceService,
|
|
325
|
+
MemberService,
|
|
326
|
+
],
|
|
327
|
+
}]
|
|
328
|
+
}] });
|
|
329
|
+
|
|
330
|
+
class MemberGroupService {
|
|
331
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: MemberGroupService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
332
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: MemberGroupService, providedIn: 'root' });
|
|
333
|
+
}
|
|
334
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: MemberGroupService, decorators: [{
|
|
335
|
+
type: Injectable,
|
|
336
|
+
args: [{
|
|
337
|
+
providedIn: 'root',
|
|
338
|
+
}]
|
|
339
|
+
}] });
|
|
340
|
+
|
|
341
|
+
class InviteService {
|
|
342
|
+
errorLogger = inject(ErrorLogger);
|
|
343
|
+
sneatAuthService = inject(SneatAuthStateService);
|
|
344
|
+
sneatApiService = inject(SneatApiService);
|
|
345
|
+
afAuth = inject(Auth);
|
|
346
|
+
randomService = inject(RandomIdService);
|
|
347
|
+
createInviteForMember(request) {
|
|
348
|
+
return this.sneatApiService.post('invites/create_invite_for_member', excludeEmpty(request));
|
|
349
|
+
}
|
|
350
|
+
getInviteLinkForMember(request) {
|
|
351
|
+
// TODO: Should we pass `request.message`? If not should be excluded from request
|
|
352
|
+
return this.sneatApiService.get(`invites/invite_link_for_member?space=${request.spaceID}&member=${request.to.memberID}`);
|
|
353
|
+
}
|
|
354
|
+
getSpaceJoinInfo(inviteID, pin) {
|
|
355
|
+
return this.sneatApiService
|
|
356
|
+
.postAsAnonymous('space/join_info', {
|
|
357
|
+
inviteID,
|
|
358
|
+
pin,
|
|
359
|
+
})
|
|
360
|
+
.pipe(map$1((response) => ({
|
|
361
|
+
...response,
|
|
362
|
+
invite: {
|
|
363
|
+
...response.invite,
|
|
364
|
+
id: inviteID,
|
|
365
|
+
pin,
|
|
366
|
+
},
|
|
367
|
+
})));
|
|
368
|
+
}
|
|
369
|
+
rejectPersonalInvite(request) {
|
|
370
|
+
return this.sneatApiService.post('invites/reject_personal_invite', request);
|
|
371
|
+
}
|
|
372
|
+
acceptInviteByAuthenticatedUser(inviteInfo) {
|
|
373
|
+
const request = {
|
|
374
|
+
spaceID: inviteInfo.space.id,
|
|
375
|
+
inviteID: inviteInfo.invite.id,
|
|
376
|
+
pin: inviteInfo.invite.pin,
|
|
377
|
+
member: inviteInfo.member,
|
|
378
|
+
// email: this.email,
|
|
379
|
+
// fullName: this.fullName,
|
|
380
|
+
};
|
|
381
|
+
return this.sneatApiService.post('invites/accept_personal_invite', request);
|
|
382
|
+
}
|
|
383
|
+
acceptInviteByUnauthenticatedUser(inviteInfo) {
|
|
384
|
+
if (inviteInfo.invite.to.channel === 'email' &&
|
|
385
|
+
inviteInfo.invite.to.address) {
|
|
386
|
+
return this.acceptEmailInviteByUnauthenticatedUser(inviteInfo);
|
|
387
|
+
}
|
|
388
|
+
return throwError(() => 'Only join from an email invites is implemented yet');
|
|
389
|
+
}
|
|
390
|
+
acceptEmailInviteByUnauthenticatedUser(inviteInfo) {
|
|
391
|
+
const email = inviteInfo.invite.to.address;
|
|
392
|
+
if (!email) {
|
|
393
|
+
return throwError(() => 'No value in inviteInfo.invite.to.address');
|
|
394
|
+
}
|
|
395
|
+
const password = this.randomService.newRandomId({ len: 12 });
|
|
396
|
+
const credentialPromise = createUserWithEmailAndPassword(this.afAuth, email, password);
|
|
397
|
+
const credentialObserver = from(credentialPromise);
|
|
398
|
+
return credentialObserver.pipe(switchMap((userCredential) => {
|
|
399
|
+
if (!userCredential.user) {
|
|
400
|
+
throw new Error('!userCredential.user');
|
|
401
|
+
}
|
|
402
|
+
// We call it to be 100% sure user fully authenticated
|
|
403
|
+
return from(userCredential.user.getIdToken());
|
|
404
|
+
}), switchMap((firebaseToken) => {
|
|
405
|
+
this.sneatApiService.setApiAuthToken(firebaseToken);
|
|
406
|
+
return this.acceptInviteByAuthenticatedUser(inviteInfo);
|
|
407
|
+
}));
|
|
408
|
+
}
|
|
409
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: InviteService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
410
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: InviteService });
|
|
411
|
+
}
|
|
412
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: InviteService, decorators: [{
|
|
413
|
+
type: Injectable
|
|
414
|
+
}] });
|
|
415
|
+
|
|
416
|
+
class ContactusNavService {
|
|
417
|
+
spaceNavService = inject(SpaceNavService);
|
|
418
|
+
navigateToAddMember = (space) => this.spaceNavService.navigateForwardToSpacePage(space, 'add-member');
|
|
419
|
+
navigateToMember(memberContext) {
|
|
420
|
+
console.log(`navigateToMember(team.id=${memberContext?.space?.id}, memberInfo.id=${memberContext?.id})`);
|
|
421
|
+
// const id = `${memberContext?.space?.id}:${memberContext?.id}`;
|
|
422
|
+
// const { space } = memberContext;
|
|
423
|
+
// if (!space) {
|
|
424
|
+
// this.errorLogger.logError(
|
|
425
|
+
// 'not able to navigate to member without team context',
|
|
426
|
+
// );
|
|
427
|
+
// return;
|
|
428
|
+
// }
|
|
429
|
+
// this.spaceNavService.navigateForwardToSpacePage(
|
|
430
|
+
// space,
|
|
431
|
+
// `member/${memberContext.id}`,
|
|
432
|
+
// {
|
|
433
|
+
// state: {
|
|
434
|
+
// contact: memberContext,
|
|
435
|
+
// },
|
|
436
|
+
// },
|
|
437
|
+
// );
|
|
438
|
+
}
|
|
439
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactusNavService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
440
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactusNavService });
|
|
441
|
+
}
|
|
442
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContactusNavService, decorators: [{
|
|
443
|
+
type: Injectable
|
|
444
|
+
}] });
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Provides the concrete contactus services and binds them to the
|
|
448
|
+
* contract injection tokens. Consumed at app bootstrap; other
|
|
449
|
+
* extensions must NOT import this.
|
|
450
|
+
*/
|
|
451
|
+
function provideContactus() {
|
|
452
|
+
// NOTE: ContactusSpaceContextService is intentionally NOT provided here — it
|
|
453
|
+
// is manually instantiated (its constructor takes plain Observables: the
|
|
454
|
+
// destroyed$ and spaceID$ streams), so it has no Angular DI factory and
|
|
455
|
+
// registering it as a provider throws NG0204. Consumers `new` it directly.
|
|
456
|
+
return [
|
|
457
|
+
ContactService,
|
|
458
|
+
ContactNavService,
|
|
459
|
+
ContactGroupService,
|
|
460
|
+
ContactRoleService,
|
|
461
|
+
ContactusSpaceService,
|
|
462
|
+
ContactusNavService,
|
|
463
|
+
MemberService,
|
|
464
|
+
MemberGroupService,
|
|
465
|
+
InviteService,
|
|
466
|
+
{ provide: CONTACT_SERVICE, useExisting: ContactService },
|
|
467
|
+
{ provide: CONTACTUS_SPACE_SERVICE, useExisting: ContactusSpaceService },
|
|
468
|
+
{ provide: CONTACT_NAV_SERVICE, useExisting: ContactNavService },
|
|
469
|
+
{ provide: CONTACTUS_NAV_SERVICE, useExisting: ContactusNavService },
|
|
470
|
+
{ provide: CONTACT_GROUP_SERVICE, useExisting: ContactGroupService },
|
|
471
|
+
{ provide: CONTACT_ROLE_SERVICE, useExisting: ContactRoleService },
|
|
472
|
+
{ provide: INVITE_SERVICE, useExisting: InviteService },
|
|
473
|
+
];
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
const membersRoutes = [
|
|
477
|
+
{
|
|
478
|
+
path: 'members',
|
|
479
|
+
data: { title: 'Members' },
|
|
480
|
+
loadComponent: () => import('./sneat-extension-contactus-members-page.component-DPXZ6eSl.mjs').then((m) => m.MembersPageComponent),
|
|
481
|
+
// ...guardRoute,
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
path: 'new-member',
|
|
485
|
+
data: { title: 'New member' },
|
|
486
|
+
loadComponent: () => import('./sneat-extension-contactus-index-DVC9hDgV.mjs').then((m) => m.NewMemberPageComponent),
|
|
487
|
+
// ...guardRoute,
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
path: 'member/:contactID',
|
|
491
|
+
data: { title: 'Member' },
|
|
492
|
+
loadComponent: () => import('./sneat-extension-contactus-space-member-page.component-BgZCwQmN.mjs').then((m) => m.SpaceMemberPageComponent),
|
|
493
|
+
},
|
|
494
|
+
// {
|
|
495
|
+
// path: 'pupils',
|
|
496
|
+
// loadChildren: () => import('./pupils/pupils.module')
|
|
497
|
+
// .then(m => m.PupilsPageModule),
|
|
498
|
+
// // ...guardRoute,
|
|
499
|
+
// },
|
|
500
|
+
// {
|
|
501
|
+
// path: 'staff',
|
|
502
|
+
// loadChildren: () => import('./staff/staff.module')
|
|
503
|
+
// .then(m => m.StaffPageModule),
|
|
504
|
+
// // ...guardRoute,
|
|
505
|
+
// },
|
|
506
|
+
];
|
|
507
|
+
|
|
508
|
+
// import {guardRoute} from '../../utils/guard-route';
|
|
509
|
+
const contactusRoutes = [
|
|
510
|
+
{
|
|
511
|
+
path: 'contacts',
|
|
512
|
+
data: { title: 'Contacts' },
|
|
513
|
+
loadComponent: () => import('./sneat-extension-contactus-contacts-page.component-BzTRhfPJ.mjs').then((m) => m.ContactsPageComponent),
|
|
514
|
+
// ...guardRoute,
|
|
515
|
+
},
|
|
516
|
+
{
|
|
517
|
+
path: 'new-contact',
|
|
518
|
+
data: { title: 'New Contact' },
|
|
519
|
+
loadComponent: () => import('./sneat-extension-contactus-index-weKgp-3B.mjs').then((m) => m.NewContactPageComponent),
|
|
520
|
+
// ...guardRoute,
|
|
521
|
+
},
|
|
522
|
+
{
|
|
523
|
+
path: 'contact/:contactID',
|
|
524
|
+
data: { title: 'Contact' },
|
|
525
|
+
loadComponent: () => import('./sneat-extension-contactus-index-weKgp-3B.mjs').then((m) => m.ContactPageComponent),
|
|
526
|
+
// ...guardRoute,
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
path: 'contact/:contactID/new-location',
|
|
530
|
+
data: { title: 'New location' },
|
|
531
|
+
loadComponent: () => import('./sneat-extension-contactus-index-weKgp-3B.mjs').then((m) => m.NewLocationPageComponent),
|
|
532
|
+
// ...guardRoute,
|
|
533
|
+
},
|
|
534
|
+
...membersRoutes,
|
|
535
|
+
// {
|
|
536
|
+
// path: 'applicants',
|
|
537
|
+
// loadChildren: () => import('./pages/contacts/contacts-page.module')
|
|
538
|
+
// .then(m => m.ContactsPageModule),
|
|
539
|
+
// // ...guardRoute,
|
|
540
|
+
// },
|
|
541
|
+
// {
|
|
542
|
+
// path: 'tenants',
|
|
543
|
+
// loadChildren: () => import('./pages/contacts/contacts-page.module')
|
|
544
|
+
// .then(m => m.ContactsPageModule),
|
|
545
|
+
// // ...guardRoute,
|
|
546
|
+
// },
|
|
547
|
+
// {
|
|
548
|
+
// path: 'landlords',
|
|
549
|
+
// loadChildren: () => import('./pages/contacts/contacts-page.module')
|
|
550
|
+
// .then(m => m.ContactsPageModule),
|
|
551
|
+
// // ...guardRoute,
|
|
552
|
+
// },
|
|
553
|
+
];
|
|
554
|
+
|
|
555
|
+
/**
|
|
556
|
+
* Generated bundle index. Do not edit.
|
|
557
|
+
*/
|
|
558
|
+
|
|
559
|
+
export { ContactService as C, MemberService as M, ContactusServicesModule as a, ContactusSpaceService as b, ContactusSpaceContextService as c, contactusRoutes as d, membersRoutes as m, provideContactus as p };
|
|
560
|
+
//# sourceMappingURL=sneat-extension-contactus-sneat-extension-contactus-BkVEPHoJ.mjs.map
|