@sneat/contactus-internal 0.3.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.
Files changed (71) hide show
  1. package/esm2022/index.js +2 -0
  2. package/esm2022/index.js.map +1 -0
  3. package/esm2022/lib/contactus-routing.module.js +48 -0
  4. package/esm2022/lib/contactus-routing.module.js.map +1 -0
  5. package/esm2022/lib/index.js +3 -0
  6. package/esm2022/lib/index.js.map +1 -0
  7. package/esm2022/lib/members/index.js +4 -0
  8. package/esm2022/lib/members/index.js.map +1 -0
  9. package/esm2022/lib/members/members-base-page.js +30 -0
  10. package/esm2022/lib/members/members-base-page.js.map +1 -0
  11. package/esm2022/lib/members/members-routing.js +32 -0
  12. package/esm2022/lib/members/members-routing.js.map +1 -0
  13. package/esm2022/lib/members/pages/member/space-member-page.component.js +95 -0
  14. package/esm2022/lib/members/pages/member/space-member-page.component.js.map +1 -0
  15. package/esm2022/lib/members/pages/member-base-page.js +23 -0
  16. package/esm2022/lib/members/pages/member-base-page.js.map +1 -0
  17. package/esm2022/lib/members/pages/members/members-page.component.js +155 -0
  18. package/esm2022/lib/members/pages/members/members-page.component.js.map +1 -0
  19. package/esm2022/lib/members/pages/new-member/index.js +2 -0
  20. package/esm2022/lib/members/pages/new-member/index.js.map +1 -0
  21. package/esm2022/lib/members/pages/new-member/new-member-form.component.js +223 -0
  22. package/esm2022/lib/members/pages/new-member/new-member-form.component.js.map +1 -0
  23. package/esm2022/lib/members/pages/new-member/new-member-page.component.js +132 -0
  24. package/esm2022/lib/members/pages/new-member/new-member-page.component.js.map +1 -0
  25. package/esm2022/lib/pages/contact/contact-page.component.js +96 -0
  26. package/esm2022/lib/pages/contact/contact-page.component.js.map +1 -0
  27. package/esm2022/lib/pages/contact/index.js +2 -0
  28. package/esm2022/lib/pages/contact/index.js.map +1 -0
  29. package/esm2022/lib/pages/contact-base-page.js +59 -0
  30. package/esm2022/lib/pages/contact-base-page.js.map +1 -0
  31. package/esm2022/lib/pages/contacts/contacts-page.component.js +113 -0
  32. package/esm2022/lib/pages/contacts/contacts-page.component.js.map +1 -0
  33. package/esm2022/lib/pages/contacts/index.js +2 -0
  34. package/esm2022/lib/pages/contacts/index.js.map +1 -0
  35. package/esm2022/lib/pages/index.js +5 -0
  36. package/esm2022/lib/pages/index.js.map +1 -0
  37. package/esm2022/lib/pages/new-contact/index.js +2 -0
  38. package/esm2022/lib/pages/new-contact/index.js.map +1 -0
  39. package/esm2022/lib/pages/new-contact/new-contact-page.component.js +104 -0
  40. package/esm2022/lib/pages/new-contact/new-contact-page.component.js.map +1 -0
  41. package/esm2022/lib/pages/new-location/index.js +2 -0
  42. package/esm2022/lib/pages/new-location/index.js.map +1 -0
  43. package/esm2022/lib/pages/new-location/new-location-page.component.js +55 -0
  44. package/esm2022/lib/pages/new-location/new-location-page.component.js.map +1 -0
  45. package/esm2022/sneat-contactus-internal.js +5 -0
  46. package/esm2022/sneat-contactus-internal.js.map +1 -0
  47. package/index.d.ts +1 -0
  48. package/lib/contactus-routing.module.d.ts +2 -0
  49. package/lib/index.d.ts +2 -0
  50. package/lib/members/index.d.ts +2 -0
  51. package/lib/members/members-base-page.d.ts +12 -0
  52. package/lib/members/members-routing.d.ts +2 -0
  53. package/lib/members/pages/member/space-member-page.component.d.ts +11 -0
  54. package/lib/members/pages/member-base-page.d.ts +10 -0
  55. package/lib/members/pages/members/members-page.component.d.ts +18 -0
  56. package/lib/members/pages/new-member/index.d.ts +1 -0
  57. package/lib/members/pages/new-member/new-member-form.component.d.ts +26 -0
  58. package/lib/members/pages/new-member/new-member-page.component.d.ts +17 -0
  59. package/lib/pages/contact/contact-page.component.d.ts +15 -0
  60. package/lib/pages/contact/index.d.ts +1 -0
  61. package/lib/pages/contact-base-page.d.ts +16 -0
  62. package/lib/pages/contacts/contacts-page.component.d.ts +22 -0
  63. package/lib/pages/contacts/index.d.ts +1 -0
  64. package/lib/pages/index.d.ts +4 -0
  65. package/lib/pages/new-contact/index.d.ts +1 -0
  66. package/lib/pages/new-contact/new-contact-page.component.d.ts +24 -0
  67. package/lib/pages/new-location/index.d.ts +1 -0
  68. package/lib/pages/new-location/new-location-page.component.d.ts +12 -0
  69. package/package.json +26 -0
  70. package/sneat-contactus-internal.d.ts +5 -0
  71. package/tsconfig.lib.prod.tsbuildinfo +1 -0
@@ -0,0 +1,59 @@
1
+ import { inject } from '@angular/core';
2
+ import { ContactusSpaceService, } from '@sneat/contactus-services';
3
+ import { SpaceItemPageBaseComponent } from '@sneat/space-components';
4
+ import { takeUntil, throwError } from 'rxjs';
5
+ export class ContactBasePage extends SpaceItemPageBaseComponent {
6
+ get contact() {
7
+ return this.$contact();
8
+ }
9
+ constructor(contactService, defaultBackPage = 'contacts') {
10
+ super(defaultBackPage, 'contact', contactService);
11
+ this.contactService = contactService;
12
+ this.$contact = this.$item.asReadonly();
13
+ this.$contactID = this.$itemID;
14
+ this.contactusSpaceService = inject(ContactusSpaceService);
15
+ }
16
+ watchItemChanges() {
17
+ const itemID = this.$itemID();
18
+ if (!itemID) {
19
+ return throwError(() => new Error('no contact context'));
20
+ }
21
+ const space = this.space;
22
+ if (!space) {
23
+ return throwError(() => new Error('no team context'));
24
+ }
25
+ return this.contactService.watchContactById(space, itemID);
26
+ // .pipe(this.takeUntilNeeded(), takeUntil(this.spaceIDChanged$))
27
+ }
28
+ briefs() {
29
+ return undefined;
30
+ // throw new Error('Method not implemented.'); // return this.contactusTeam?.dto?.contacts;
31
+ }
32
+ onSpaceIdChanged() {
33
+ super.onSpaceIdChanged();
34
+ this.watchSpaceContactusEntry();
35
+ }
36
+ watchSpaceContactusEntry() {
37
+ if (this.space?.id) {
38
+ this.contactusSpaceService
39
+ .watchContactBriefs(this.space.id)
40
+ .pipe(this.takeUntilDestroyed(), takeUntil(this.spaceIDChanged$))
41
+ .subscribe({
42
+ next: (contacts) => {
43
+ console.log('watchSpaceContactusEntry() => contacts:', contacts, 'this.contact:', this.contact);
44
+ if (this.contact?.id && !this.contact?.dbo) {
45
+ const contactID = this.contact.id;
46
+ const contact = contacts.find((c) => c.id === contactID);
47
+ if (contact) {
48
+ console.log('setItemContext from contact space brief', contact.brief);
49
+ this.setItemContext({ ...this.contact, brief: contact.brief });
50
+ // this.contact = { brief: contact.brief, ...this.contact };
51
+ // this.teamParams.changeDetectorRef.detectChanges();
52
+ }
53
+ }
54
+ },
55
+ });
56
+ }
57
+ }
58
+ }
59
+ //# sourceMappingURL=contact-base-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact-base-page.js","sourceRoot":"","sources":["../../../../../../../libs/contactus/internal/src/lib/pages/contact-base-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAEL,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AAMnC,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAc,SAAS,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAEzD,MAAM,OAAgB,eAAgB,SAAQ,0BAG7C;IAIC,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAID,YACqB,cAA8B,EACjD,kBAA0C,UAAU;QAEpD,KAAK,CAAC,eAAe,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;QAH/B,mBAAc,GAAd,cAAc,CAAgB;QAVhC,aAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACnC,eAAU,GAAG,IAAI,CAAC,OAAO,CAAC;QAM1B,0BAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAOzE,CAAC;IAEkB,gBAAgB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC3D,iEAAiE;IACnE,CAAC;IAEkB,MAAM;QACvB,OAAO,SAAS,CAAC;QACjB,2FAA2F;IAC7F,CAAC;IAEkB,gBAAgB;QACjC,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACzB,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAEO,wBAAwB;QAC9B,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;YACnB,IAAI,CAAC,qBAAqB;iBACvB,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;iBACjC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;iBAChE,SAAS,CAAC;gBACT,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE;oBACjB,OAAO,CAAC,GAAG,CACT,yCAAyC,EACzC,QAAQ,EACR,eAAe,EACf,IAAI,CAAC,OAAO,CACb,CAAC;oBACF,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;wBAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;wBAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;wBACzD,IAAI,OAAO,EAAE,CAAC;4BACZ,OAAO,CAAC,GAAG,CACT,yCAAyC,EACzC,OAAO,CAAC,KAAK,CACd,CAAC;4BACF,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;4BAC/D,4DAA4D;4BAC5D,qDAAqD;wBACvD,CAAC;oBACH,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;QACP,CAAC;IACH,CAAC;CAqDF","sourcesContent":["import { inject } from '@angular/core';\nimport {\n ContactService,\n ContactusSpaceService,\n} from '@sneat/contactus-services';\nimport {\n IContactBrief,\n IContactDbo,\n IContactContext,\n} from '@sneat/contactus-core';\nimport { SpaceItemPageBaseComponent } from '@sneat/space-components';\nimport { Observable, takeUntil, throwError } from 'rxjs';\n\nexport abstract class ContactBasePage extends SpaceItemPageBaseComponent<\n IContactBrief,\n IContactDbo\n> {\n protected readonly $contact = this.$item.asReadonly();\n protected readonly $contactID = this.$itemID;\n\n public get contact() {\n return this.$contact();\n }\n\n protected readonly contactusSpaceService = inject(ContactusSpaceService);\n\n protected constructor(\n protected readonly contactService: ContactService,\n defaultBackPage: 'contacts' | 'members' = 'contacts',\n ) {\n super(defaultBackPage, 'contact', contactService);\n }\n\n protected override watchItemChanges(): Observable<IContactContext> {\n const itemID = this.$itemID();\n if (!itemID) {\n return throwError(() => new Error('no contact context'));\n }\n const space = this.space;\n if (!space) {\n return throwError(() => new Error('no team context'));\n }\n return this.contactService.watchContactById(space, itemID);\n // .pipe(this.takeUntilNeeded(), takeUntil(this.spaceIDChanged$))\n }\n\n protected override briefs(): Record<string, IContactBrief> | undefined {\n return undefined;\n // throw new Error('Method not implemented.'); // return this.contactusTeam?.dto?.contacts;\n }\n\n protected override onSpaceIdChanged(): void {\n super.onSpaceIdChanged();\n this.watchSpaceContactusEntry();\n }\n\n private watchSpaceContactusEntry(): void {\n if (this.space?.id) {\n this.contactusSpaceService\n .watchContactBriefs(this.space.id)\n .pipe(this.takeUntilDestroyed(), takeUntil(this.spaceIDChanged$))\n .subscribe({\n next: (contacts) => {\n console.log(\n 'watchSpaceContactusEntry() => contacts:',\n contacts,\n 'this.contact:',\n this.contact,\n );\n if (this.contact?.id && !this.contact?.dbo) {\n const contactID = this.contact.id;\n const contact = contacts.find((c) => c.id === contactID);\n if (contact) {\n console.log(\n 'setItemContext from contact space brief',\n contact.brief,\n );\n this.setItemContext({ ...this.contact, brief: contact.brief });\n // this.contact = { brief: contact.brief, ...this.contact };\n // this.teamParams.changeDetectorRef.detectChanges();\n }\n }\n },\n });\n }\n }\n\n // private watchContact(): void {\n // \tconsole.log('ContactBasePage.watchContact()');\n // \tif (!this.contact?.id) {\n // \t\treturn;\n // \t}\n // \tconst team = this.team;\n // \tif (!team) {\n // \t\treturn;\n // \t}\n // \tthis.contactService\n // \t\t.watchContactById(team, this.contact?.id)\n // \t\t.pipe(this.takeUntilNeeded())\n // \t\t.subscribe({\n // \t\t\tnext: (contact) => {\n // \t\t\t\tconsole.log('watchContact =>', contact);\n // \t\t\t\tif (!contact) {\n // \t\t\t\t\treturn;\n // \t\t\t\t}\n // \t\t\t\tthis.contact = contact;\n // \t\t\t},\n // \t\t\terror: this.errorLogger.logErrorHandler('failed to get contact by ID'),\n // \t\t});\n // }\n\n // private trackContactId(): void {\n // \tconsole.log('ContactBasePage.trackContactId()');\n // \tthis.route.paramMap\n // \t\t.pipe(\n // \t\t\tthis.takeUntilNeeded(),\n // \t\t\tmap((params) => params.get('contactID')),\n // \t\t\tdistinctUntilChanged(),\n // \t\t)\n // \t\t.subscribe({\n // \t\t\tnext: (contactID) => {\n // \t\t\t\tconsole.log('trackContactId() =>', contactID, this.contact);\n // \t\t\t\tif (!contactID) {\n // \t\t\t\t\tthis.contact = undefined;\n // \t\t\t\t\treturn;\n // \t\t\t\t}\n // \t\t\t\tconst team = this.team;\n // \t\t\t\tthis.contact = {\n // \t\t\t\t\tid: contactID,\n // \t\t\t\t\tbrief: undefined,\n // \t\t\t\t\tdto: undefined,\n // \t\t\t\t\tteam,\n // \t\t\t\t};\n // \t\t\t\tthis.onContactIdChanged(contactID);\n // \t\t\t},\n // \t\t\terror: this.logErrorHandler(),\n // \t\t});\n // }\n}\n"]}
@@ -0,0 +1,113 @@
1
+ import { ChangeDetectionStrategy, Component, computed, signal, inject, } from '@angular/core';
2
+ import { IonBackButton, IonButton, IonButtons, IonContent, IonFooter, IonHeader, IonIcon, IonLabel, IonMenuButton, IonTitle, IonToolbar, } from '@ionic/angular/standalone';
3
+ import { ContactsComponent, } from '@sneat/contactus-shared';
4
+ import { setHrefQueryParam } from '@sneat/core';
5
+ import { addSpace, } from '@sneat/contactus-core';
6
+ import { SpacePageTitleComponent, SpaceItemsBaseComponent, } from '@sneat/space-components';
7
+ import { ContactusServicesModule, ContactusSpaceService, } from '@sneat/contactus-services';
8
+ import { SpaceServiceModule } from '@sneat/space-services';
9
+ import { ClassName } from '@sneat/ui';
10
+ import { Subject } from 'rxjs';
11
+ import * as i0 from "@angular/core";
12
+ export class ContactsPageComponent extends SpaceItemsBaseComponent {
13
+ constructor() {
14
+ super('');
15
+ this.contactusSpaceService = inject(ContactusSpaceService);
16
+ this.$allContacts = signal(undefined, ...(ngDevMode ? [{ debugName: "$allContacts" }] : []));
17
+ // public readonly $filter = signal<string>('');
18
+ this.$role = signal(undefined, ...(ngDevMode ? [{ debugName: "$role" }] : []));
19
+ this.$pageTitle = computed(() => {
20
+ const role = this.$role();
21
+ if (role) {
22
+ return `${role.toUpperCase() + role.substr(1)}s`;
23
+ }
24
+ return 'Contacts';
25
+ }, ...(ngDevMode ? [{ debugName: "$pageTitle" }] : []));
26
+ this.$selectedContacts = computed(() => this.$allContacts()?.filter((c) => c.isChecked), ...(ngDevMode ? [{ debugName: "$selectedContacts" }] : []));
27
+ this.$titleIcon = computed(() => {
28
+ switch (this.$role()) {
29
+ case 'tenant':
30
+ return '🤠';
31
+ case 'landlord':
32
+ return '🤴';
33
+ case 'applicant':
34
+ return '🤔';
35
+ default:
36
+ return '📇';
37
+ }
38
+ }, ...(ngDevMode ? [{ debugName: "$titleIcon" }] : []));
39
+ this.setSpaceContacts = (contacts) => {
40
+ this.$allContacts.set(contacts);
41
+ };
42
+ this.command = new Subject();
43
+ const role = location.pathname.match(/(applicant|landlord|tenant)/);
44
+ if (role) {
45
+ this.$role.set(role[1]);
46
+ }
47
+ // const allContacts = window.history.state.contacts as IContactWithSpace[];
48
+ // if (allContacts) {
49
+ // this.$allContacts.set(allContacts);
50
+ // }
51
+ this.route.queryParamMap.pipe(this.takeUntilDestroyed()).subscribe({
52
+ next: (q) => {
53
+ this.$role.set(q.get('role') || undefined);
54
+ },
55
+ });
56
+ this.spaceIDChanged$.subscribe({
57
+ next: (spaceID) => {
58
+ if (!spaceID) {
59
+ return;
60
+ }
61
+ this.contactusSpaceService
62
+ .watchContactBriefs(this.space.id)
63
+ .pipe(this.takeUntilDestroyed(), this.takeUntilSpaceIdChanged())
64
+ .subscribe({
65
+ next: (contacts) => {
66
+ const space = this.$space();
67
+ if (space.id !== spaceID) {
68
+ return;
69
+ }
70
+ this.setSpaceContacts(contacts.map(addSpace(space)) || []);
71
+ },
72
+ });
73
+ },
74
+ });
75
+ }
76
+ onRoleChanged(role) {
77
+ this.$role.set(role);
78
+ const url = setHrefQueryParam('role', role || '');
79
+ history.replaceState(undefined, document.title, url);
80
+ }
81
+ sendCommand(event, name) {
82
+ this.command.next({ name, event });
83
+ }
84
+ ngOnDestroy() {
85
+ this.command.complete();
86
+ super.ngOnDestroy();
87
+ }
88
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ContactsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
89
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ContactsPageComponent, isStandalone: true, selector: "sneat-contacts-page", providers: [{ provide: ClassName, useValue: 'ContactsPageComponent' }], usesInheritance: true, ngImport: i0, template: "<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]=\"$role() ? undefined : $space()\"\n [generalTitle]=\"$pageTitle()\"\n [icon]=\"$titleIcon()\"\n [titlesBySpaceType]=\"{\n personal: 'Personal contacts',\n family: 'Family contacts',\n }\"\n />\n <ion-buttons slot=\"end\">\n <ion-button\n color=\"primary\"\n size=\"small\"\n title=\"Add contact\"\n (click)=\"sendCommand($event, 'new_contact')\"\n >\n <ion-icon name=\"add\" slot=\"start\" />\n <ion-label>Add</ion-label>\n </ion-button>\n <ion-menu-button />\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n <sneat-contacts\n [$space]=\"$space()\"\n [$roleID]=\"$role()\"\n [$allContacts]=\"$allContacts()\"\n [command]=\"command.asObservable()\"\n (contactsChange)=\"$allContacts.set($event)\"\n (roleChange)=\"onRoleChanged($event)\"\n />\n <div style=\"height: 30px\"></div>\n</ion-content>\n\n@if ($selectedContacts()?.length; as numberOfSelectedContacts) {\n <ion-footer>\n <ion-toolbar color=\"light\">\n <ion-buttons slot=\"start\">\n <ion-button\n title=\"Reset\"\n (click)=\"sendCommand($event, 'reset_selected')\"\n >\n <ion-icon name=\"close-circle-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>\n @if (numberOfSelectedContacts === 1) {\n {{ numberOfSelectedContacts }} contact selected\n } @else {\n {{ numberOfSelectedContacts }} contacts selected\n }\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-button color=\"success\">Share</ion-button>\n <ion-button color=\"warning\">Archive</ion-button>\n <!--\t\t\t\t<ion-button color=\"danger\">Delete</ion-button>-->\n </ion-buttons>\n </ion-toolbar>\n </ion-footer>\n}\n", dependencies: [{ kind: "component", type: SpacePageTitleComponent, selector: "sneat-space-page-title", inputs: ["icon", "generalTitle", "space", "titlesBySpaceType"] }, { kind: "ngmodule", type: ContactusServicesModule }, { kind: "ngmodule", type: SpaceServiceModule }, { kind: "component", type: ContactsComponent, selector: "sneat-contacts", inputs: ["$space", "$roleID", "command", "goToNewContactPage", "$allContacts", "contactClicked"], outputs: ["roleChange", "contactsChange", "addContactEvent", "addContactClick"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonBackButton, selector: "ion-back-button" }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonMenuButton, selector: "ion-menu-button", inputs: ["autoHide", "color", "disabled", "menu", "mode", "type"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
90
+ }
91
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ContactsPageComponent, decorators: [{
92
+ type: Component,
93
+ args: [{ imports: [
94
+ SpacePageTitleComponent,
95
+ ContactusServicesModule,
96
+ SpaceServiceModule,
97
+ ContactsComponent,
98
+ IonHeader,
99
+ IonToolbar,
100
+ IonButtons,
101
+ IonBackButton,
102
+ IonButtons,
103
+ IonButton,
104
+ IonBackButton,
105
+ IonTitle,
106
+ IonIcon,
107
+ IonFooter,
108
+ IonLabel,
109
+ IonContent,
110
+ IonMenuButton,
111
+ ], providers: [{ provide: ClassName, useValue: 'ContactsPageComponent' }], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'sneat-contacts-page', template: "<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]=\"$role() ? undefined : $space()\"\n [generalTitle]=\"$pageTitle()\"\n [icon]=\"$titleIcon()\"\n [titlesBySpaceType]=\"{\n personal: 'Personal contacts',\n family: 'Family contacts',\n }\"\n />\n <ion-buttons slot=\"end\">\n <ion-button\n color=\"primary\"\n size=\"small\"\n title=\"Add contact\"\n (click)=\"sendCommand($event, 'new_contact')\"\n >\n <ion-icon name=\"add\" slot=\"start\" />\n <ion-label>Add</ion-label>\n </ion-button>\n <ion-menu-button />\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n <sneat-contacts\n [$space]=\"$space()\"\n [$roleID]=\"$role()\"\n [$allContacts]=\"$allContacts()\"\n [command]=\"command.asObservable()\"\n (contactsChange)=\"$allContacts.set($event)\"\n (roleChange)=\"onRoleChanged($event)\"\n />\n <div style=\"height: 30px\"></div>\n</ion-content>\n\n@if ($selectedContacts()?.length; as numberOfSelectedContacts) {\n <ion-footer>\n <ion-toolbar color=\"light\">\n <ion-buttons slot=\"start\">\n <ion-button\n title=\"Reset\"\n (click)=\"sendCommand($event, 'reset_selected')\"\n >\n <ion-icon name=\"close-circle-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>\n @if (numberOfSelectedContacts === 1) {\n {{ numberOfSelectedContacts }} contact selected\n } @else {\n {{ numberOfSelectedContacts }} contacts selected\n }\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-button color=\"success\">Share</ion-button>\n <ion-button color=\"warning\">Archive</ion-button>\n <!--\t\t\t\t<ion-button color=\"danger\">Delete</ion-button>-->\n </ion-buttons>\n </ion-toolbar>\n </ion-footer>\n}\n" }]
112
+ }], ctorParameters: () => [] });
113
+ //# sourceMappingURL=contacts-page.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts-page.component.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/internal/src/lib/pages/contacts/contacts-page.component.ts","../../../../../../../../libs/contactus/internal/src/lib/pages/contacts/contacts-page.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,SAAS,EACT,QAAQ,EAER,MAAM,EACN,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,OAAO,EACP,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,UAAU,GACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,iBAAiB,GAGlB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,QAAQ,GAGT,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;;AA2B/B,MAAM,OAAO,qBACX,SAAQ,uBAAuB;IAwB/B;QACE,KAAK,CAAC,EAAE,CAAC,CAAC;QAtBK,0BAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAEpD,iBAAY,GAAG,MAAM,CAEtC,SAAS,wDAAC,CAAC;QAEb,gDAAgD;QAChC,UAAK,GAAG,MAAM,CAA0B,SAAS,iDAAC,CAAC;QAEzD,eAAU,GAAG,QAAQ,CAAC,GAAG,EAAE;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;YACnD,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC,sDAAC,CAAC;QAEgB,sBAAiB,GAAG,QAAQ,CAAC,GAAG,EAAE,CACnD,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,6DAChD,CAAC;QAwCQ,eAAU,GAAG,QAAQ,CAAC,GAAG,EAAE;YACnC,QAAQ,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;gBACrB,KAAK,QAAQ;oBACX,OAAO,IAAI,CAAC;gBACd,KAAK,UAAU;oBACb,OAAO,IAAI,CAAC;gBACd,KAAK,WAAW;oBACd,OAAO,IAAI,CAAC;gBACd;oBACE,OAAO,IAAI,CAAC;YAChB,CAAC;QACH,CAAC,sDAAC,CAAC;QAEc,qBAAgB,GAAG,CAAC,QAA6B,EAAQ,EAAE;YAC1E,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;QAQiB,YAAO,GAAG,IAAI,OAAO,EAA4B,CAAC;QA3DnE,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACpE,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAgB,CAAC,CAAC;QACzC,CAAC;QAED,4EAA4E;QAC5E,qBAAqB;QACrB,uCAAuC;QACvC,IAAI;QAEJ,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS,CAAC;YACjE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE;gBACV,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAiB,IAAI,SAAS,CAAC,CAAC;YAC9D,CAAC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;YAC7B,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;gBAChB,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,qBAAqB;qBACvB,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;qBACjC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,uBAAuB,EAAE,CAAC;qBAC/D,SAAS,CAAC;oBACT,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE;wBACjB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;wBAC5B,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;4BACzB,OAAO;wBACT,CAAC;wBACD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC7D,CAAC;iBACF,CAAC,CAAC;YACP,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAmBS,aAAa,CAAC,IAAkB;QACxC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;IAIS,WAAW,CACnB,KAAY,EACZ,IAAkC;QAElC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,CAAC;IAEe,WAAW;QACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,CAAC,WAAW,EAAE,CAAC;IACtB,CAAC;8GAlGU,qBAAqB;kGAArB,qBAAqB,kEALrB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,uBAAuB,EAAE,CAAC,iDChExE,skEAmEA,4CDrBI,uBAAuB,kIACvB,uBAAuB,8BACvB,kBAAkB,+BAClB,iBAAiB,8OACjB,SAAS,oGACT,UAAU,mFACV,UAAU,8EACV,aAAa,4DAEb,SAAS,oPAET,QAAQ,iFACR,OAAO,2JACP,SAAS,oGACT,QAAQ,6FACR,UAAU,wKACV,aAAa;;2FAOJ,qBAAqB;kBAzBjC,SAAS;8BACC;wBACP,uBAAuB;wBACvB,uBAAuB;wBACvB,kBAAkB;wBAClB,iBAAiB;wBACjB,SAAS;wBACT,UAAU;wBACV,UAAU;wBACV,aAAa;wBACb,UAAU;wBACV,SAAS;wBACT,aAAa;wBACb,QAAQ;wBACR,OAAO;wBACP,SAAS;wBACT,QAAQ;wBACR,UAAU;wBACV,aAAa;qBACd,aACU,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,uBAAuB,EAAE,CAAC,mBACrD,uBAAuB,CAAC,MAAM,YACrC,qBAAqB","sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n OnDestroy,\n signal,\n inject,\n} from '@angular/core';\nimport {\n IonBackButton,\n IonButton,\n IonButtons,\n IonContent,\n IonFooter,\n IonHeader,\n IonIcon,\n IonLabel,\n IonMenuButton,\n IonTitle,\n IonToolbar,\n} from '@ionic/angular/standalone';\nimport {\n ContactsComponent,\n ContactsComponentCommand,\n ContactsComponentCommandName,\n} from '@sneat/contactus-shared';\nimport { setHrefQueryParam } from '@sneat/core';\nimport {\n addSpace,\n ContactRole,\n IContactWithCheck,\n} from '@sneat/contactus-core';\nimport {\n SpacePageTitleComponent,\n SpaceItemsBaseComponent,\n} from '@sneat/space-components';\nimport {\n ContactusServicesModule,\n ContactusSpaceService,\n} from '@sneat/contactus-services';\nimport { SpaceServiceModule } from '@sneat/space-services';\nimport { ClassName } from '@sneat/ui';\nimport { Subject } from 'rxjs';\n\n@Component({\n imports: [\n SpacePageTitleComponent,\n ContactusServicesModule,\n SpaceServiceModule,\n ContactsComponent,\n IonHeader,\n IonToolbar,\n IonButtons,\n IonBackButton,\n IonButtons,\n IonButton,\n IonBackButton,\n IonTitle,\n IonIcon,\n IonFooter,\n IonLabel,\n IonContent,\n IonMenuButton,\n ],\n providers: [{ provide: ClassName, useValue: 'ContactsPageComponent' }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'sneat-contacts-page',\n templateUrl: './contacts-page.component.html',\n})\nexport class ContactsPageComponent\n extends SpaceItemsBaseComponent\n implements OnDestroy\n{\n private readonly contactusSpaceService = inject(ContactusSpaceService);\n\n protected readonly $allContacts = signal<\n undefined | readonly IContactWithCheck[]\n >(undefined);\n\n // public readonly $filter = signal<string>('');\n public readonly $role = signal<ContactRole | undefined>(undefined);\n\n protected $pageTitle = computed(() => {\n const role = this.$role();\n if (role) {\n return `${role.toUpperCase() + role.substr(1)}s`;\n }\n return 'Contacts';\n });\n\n protected readonly $selectedContacts = computed(() =>\n this.$allContacts()?.filter((c) => c.isChecked),\n );\n\n constructor() {\n super('');\n const role = location.pathname.match(/(applicant|landlord|tenant)/);\n if (role) {\n this.$role.set(role[1] as ContactRole);\n }\n\n // const allContacts = window.history.state.contacts as IContactWithSpace[];\n // if (allContacts) {\n // \tthis.$allContacts.set(allContacts);\n // }\n\n this.route.queryParamMap.pipe(this.takeUntilDestroyed()).subscribe({\n next: (q) => {\n this.$role.set((q.get('role') as ContactRole) || undefined);\n },\n });\n this.spaceIDChanged$.subscribe({\n next: (spaceID) => {\n if (!spaceID) {\n return;\n }\n this.contactusSpaceService\n .watchContactBriefs(this.space.id)\n .pipe(this.takeUntilDestroyed(), this.takeUntilSpaceIdChanged())\n .subscribe({\n next: (contacts) => {\n const space = this.$space();\n if (space.id !== spaceID) {\n return;\n }\n this.setSpaceContacts(contacts.map(addSpace(space)) || []);\n },\n });\n },\n });\n }\n\n protected $titleIcon = computed(() => {\n switch (this.$role()) {\n case 'tenant':\n return '🤠';\n case 'landlord':\n return '🤴';\n case 'applicant':\n return '🤔';\n default:\n return '📇';\n }\n });\n\n private readonly setSpaceContacts = (contacts: IContactWithCheck[]): void => {\n this.$allContacts.set(contacts);\n };\n\n protected onRoleChanged(role?: ContactRole): void {\n this.$role.set(role);\n const url = setHrefQueryParam('role', role || '');\n history.replaceState(undefined, document.title, url);\n }\n\n protected readonly command = new Subject<ContactsComponentCommand>();\n\n protected sendCommand(\n event: Event,\n name: ContactsComponentCommandName,\n ): void {\n this.command.next({ name, event });\n }\n\n public override ngOnDestroy(): void {\n this.command.complete();\n super.ngOnDestroy();\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]=\"$role() ? undefined : $space()\"\n [generalTitle]=\"$pageTitle()\"\n [icon]=\"$titleIcon()\"\n [titlesBySpaceType]=\"{\n personal: 'Personal contacts',\n family: 'Family contacts',\n }\"\n />\n <ion-buttons slot=\"end\">\n <ion-button\n color=\"primary\"\n size=\"small\"\n title=\"Add contact\"\n (click)=\"sendCommand($event, 'new_contact')\"\n >\n <ion-icon name=\"add\" slot=\"start\" />\n <ion-label>Add</ion-label>\n </ion-button>\n <ion-menu-button />\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n <sneat-contacts\n [$space]=\"$space()\"\n [$roleID]=\"$role()\"\n [$allContacts]=\"$allContacts()\"\n [command]=\"command.asObservable()\"\n (contactsChange)=\"$allContacts.set($event)\"\n (roleChange)=\"onRoleChanged($event)\"\n />\n <div style=\"height: 30px\"></div>\n</ion-content>\n\n@if ($selectedContacts()?.length; as numberOfSelectedContacts) {\n <ion-footer>\n <ion-toolbar color=\"light\">\n <ion-buttons slot=\"start\">\n <ion-button\n title=\"Reset\"\n (click)=\"sendCommand($event, 'reset_selected')\"\n >\n <ion-icon name=\"close-circle-outline\"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>\n @if (numberOfSelectedContacts === 1) {\n {{ numberOfSelectedContacts }} contact selected\n } @else {\n {{ numberOfSelectedContacts }} contacts selected\n }\n </ion-title>\n <ion-buttons slot=\"end\">\n <ion-button color=\"success\">Share</ion-button>\n <ion-button color=\"warning\">Archive</ion-button>\n <!--\t\t\t\t<ion-button color=\"danger\">Delete</ion-button>-->\n </ion-buttons>\n </ion-toolbar>\n </ion-footer>\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './contacts-page.component';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/internal/src/lib/pages/contacts/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC","sourcesContent":["export * from './contacts-page.component';\n"]}
@@ -0,0 +1,5 @@
1
+ export * from './contact';
2
+ export * from './contacts';
3
+ export * from './new-contact';
4
+ export * from './new-location';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/contactus/internal/src/lib/pages/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC","sourcesContent":["export * from './contact';\nexport * from './contacts';\nexport * from './new-contact';\nexport * from './new-location';\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './new-contact-page.component';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/internal/src/lib/pages/new-contact/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC","sourcesContent":["export * from './new-contact-page.component';\n"]}
@@ -0,0 +1,104 @@
1
+ import { ChangeDetectionStrategy, Component, computed, signal, } from '@angular/core';
2
+ import { FormsModule } from '@angular/forms';
3
+ import { IonBackButton, IonButtons, IonContent, IonHeader, IonNav, IonTitle, IonToolbar, } from '@ionic/angular/standalone';
4
+ import { ContactusServicesModule } from '@sneat/contactus-services';
5
+ import { NewContactFormComponent, } from '@sneat/contactus-shared';
6
+ import { emptySpaceRef } from '@sneat/core';
7
+ import { SpaceBaseComponent, SpaceComponentBaseParams, } from '@sneat/space-components';
8
+ import { SpaceServiceModule } from '@sneat/space-services';
9
+ import { ClassName } from '@sneat/ui';
10
+ import * as i0 from "@angular/core";
11
+ export class NewContactPageComponent extends SpaceBaseComponent {
12
+ constructor() {
13
+ super();
14
+ // @ViewChild('nameInput', { static: true }) nameInput?: IonInput;
15
+ // TODO: relationship is not implemented yet
16
+ this.$relation = signal(undefined, ...(ngDevMode ? [{ debugName: "$relation" }] : []));
17
+ this.$contact = signal({
18
+ space: emptySpaceRef,
19
+ dbo: {
20
+ type: 'person',
21
+ gender: 'unknown', // Undefined would indicate "loading" and gender form would be disabled.
22
+ },
23
+ }, ...(ngDevMode ? [{ debugName: "$contact" }] : []));
24
+ this.$contactGroupID = signal('', ...(ngDevMode ? [{ debugName: "$contactGroupID" }] : []));
25
+ this.$contactRoleID = signal(undefined, ...(ngDevMode ? [{ debugName: "$contactRoleID" }] : []));
26
+ this.$assetID = signal('', ...(ngDevMode ? [{ debugName: "$assetID" }] : []));
27
+ this.$contactRole = signal(undefined, ...(ngDevMode ? [{ debugName: "$contactRole" }] : []));
28
+ this.$contactGroup = signal(undefined, ...(ngDevMode ? [{ debugName: "$contactGroup" }] : []));
29
+ this.$parentContactID = signal('', ...(ngDevMode ? [{ debugName: "$parentContactID" }] : []));
30
+ this.$title = computed(() => {
31
+ const contactRoleBrief = this.$contactRole()?.brief;
32
+ return contactRoleBrief
33
+ ? `${contactRoleBrief.emoji} New ${contactRoleBrief.title.toLowerCase()}`
34
+ : 'New contact';
35
+ }, ...(ngDevMode ? [{ debugName: "$title" }] : []));
36
+ this.$asset = signal(undefined, ...(ngDevMode ? [{ debugName: "$asset" }] : []));
37
+ this.onUrlParamsChanged = (params) => {
38
+ const relation = params.get('relation');
39
+ if (relation) {
40
+ this.$relation.set(relation);
41
+ }
42
+ const contactGroupID = params.get('group');
43
+ if (contactGroupID && contactGroupID !== this.$contactGroupID()) {
44
+ this.$contactGroupID.set(contactGroupID);
45
+ }
46
+ const contactRole = params.get('role');
47
+ if (contactRole && !this.$contactRole()) {
48
+ this.$contactRoleID.set(contactRole);
49
+ }
50
+ const space = this.space;
51
+ if (!space) {
52
+ throw new Error('Space is not defined');
53
+ }
54
+ const assetId = params.get('asset');
55
+ if (assetId && assetId !== this.$assetID()) {
56
+ this.$assetID.set(assetId);
57
+ }
58
+ const parentContactID = params.get('contact');
59
+ if (parentContactID && this.$parentContactID() !== parentContactID) {
60
+ this.$parentContactID.set(parentContactID);
61
+ }
62
+ };
63
+ this.defaultBackPage = 'contacts';
64
+ this.$asset.set(window.history.state?.asset);
65
+ }
66
+ // onContactTypeChanged(v: ContactRole): void {
67
+ //
68
+ // }
69
+ ngOnInit() {
70
+ super.ngOnInit();
71
+ this.route.queryParamMap
72
+ .pipe(this.takeUntilDestroyed())
73
+ .subscribe(this.onUrlParamsChanged);
74
+ }
75
+ onContactChanged(contact) {
76
+ // console.log('onContactChanged', contact);
77
+ this.$contact.set(contact);
78
+ }
79
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: NewContactPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
80
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.0", type: NewContactPageComponent, isStandalone: true, selector: "sneat-new-contact-page", providers: [
81
+ SpaceComponentBaseParams,
82
+ { provide: ClassName, useValue: 'NewContactPageComponent' },
83
+ ], usesInheritance: true, ngImport: i0, template: "<ion-nav />\n\n<ion-header>\n <ion-toolbar color=\"light\" class=\"with-back-button\">\n <ion-buttons slot=\"start\">\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n <ion-title>{{ $title() }}</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <sneat-new-contact-form\n [$space]=\"$space()\"\n [$contact]=\"$contact()\"\n (contactChange)=\"onContactChanged($event)\"\n />\n <!--\t<sneat-new-person-form-->\n <!--\t\t[$fixedGroupID]=\"$contactGroupID()\"-->\n <!--\t\t[$fixedRoleID]=\"$contactRoleID()\"-->\n <!--\t\t[$parentContactID]=\"$parentContactID()\"-->\n <!--\t\t(contactRoleChange)=\"$contactRole.set($event)\"-->\n <!--\t\t(contactGroupChange)=\"$contactGroup.set($event)\"-->\n <!--\t\t(contactChange)=\"$contact.set($event)\"-->\n <!--\t/>-->\n</ion-content>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: SpaceServiceModule }, { kind: "ngmodule", type: ContactusServicesModule }, { kind: "component", type: IonNav, selector: "ion-nav" }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonBackButton, selector: "ion-back-button" }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: NewContactFormComponent, selector: "sneat-new-contact-form", inputs: ["command", "selectGroupAndRole$"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
84
+ }
85
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: NewContactPageComponent, decorators: [{
86
+ type: Component,
87
+ args: [{ imports: [
88
+ FormsModule,
89
+ SpaceServiceModule,
90
+ ContactusServicesModule,
91
+ IonNav,
92
+ IonHeader,
93
+ IonToolbar,
94
+ IonButtons,
95
+ IonBackButton,
96
+ IonTitle,
97
+ IonContent,
98
+ NewContactFormComponent,
99
+ ], providers: [
100
+ SpaceComponentBaseParams,
101
+ { provide: ClassName, useValue: 'NewContactPageComponent' },
102
+ ], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'sneat-new-contact-page', template: "<ion-nav />\n\n<ion-header>\n <ion-toolbar color=\"light\" class=\"with-back-button\">\n <ion-buttons slot=\"start\">\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n <ion-title>{{ $title() }}</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <sneat-new-contact-form\n [$space]=\"$space()\"\n [$contact]=\"$contact()\"\n (contactChange)=\"onContactChanged($event)\"\n />\n <!--\t<sneat-new-person-form-->\n <!--\t\t[$fixedGroupID]=\"$contactGroupID()\"-->\n <!--\t\t[$fixedRoleID]=\"$contactRoleID()\"-->\n <!--\t\t[$parentContactID]=\"$parentContactID()\"-->\n <!--\t\t(contactRoleChange)=\"$contactRole.set($event)\"-->\n <!--\t\t(contactGroupChange)=\"$contactGroup.set($event)\"-->\n <!--\t\t(contactChange)=\"$contact.set($event)\"-->\n <!--\t/>-->\n</ion-content>\n" }]
103
+ }], ctorParameters: () => [] });
104
+ //# sourceMappingURL=new-contact-page.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new-contact-page.component.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/internal/src/lib/pages/new-contact/new-contact-page.component.ts","../../../../../../../../libs/contactus/internal/src/lib/pages/new-contact/new-contact-page.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n OnInit,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ParamMap } from '@angular/router';\nimport {\n IonBackButton,\n IonButtons,\n IonContent,\n IonHeader,\n IonNav,\n IonTitle,\n IonToolbar,\n} from '@ionic/angular/standalone';\nimport { ContactusServicesModule } from '@sneat/contactus-services';\nimport {\n OptionalContactGroupIdAndBrief,\n OptionalContactRoleIdAndBrief,\n NewContactFormComponent,\n} from '@sneat/contactus-shared';\nimport {\n ContactIdAndDboWithSpaceRef,\n ContactRole,\n ContactToContactRelation,\n NewContactBaseDboAndSpaceRef,\n} from '@sneat/contactus-core';\nimport { emptySpaceRef } from '@sneat/core';\nimport {\n SpaceBaseComponent,\n SpaceComponentBaseParams,\n} from '@sneat/space-components';\nimport { IAssetContext } from '@sneat/mod-assetus-core';\nimport { SpaceServiceModule } from '@sneat/space-services';\nimport { ClassName } from '@sneat/ui';\n\n@Component({\n imports: [\n FormsModule,\n SpaceServiceModule,\n ContactusServicesModule,\n IonNav,\n IonHeader,\n IonToolbar,\n IonButtons,\n IonBackButton,\n IonTitle,\n IonContent,\n NewContactFormComponent,\n ],\n providers: [\n SpaceComponentBaseParams,\n { provide: ClassName, useValue: 'NewContactPageComponent' },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'sneat-new-contact-page',\n templateUrl: './new-contact-page.component.html',\n})\nexport class NewContactPageComponent\n extends SpaceBaseComponent\n implements OnInit\n{\n // @ViewChild('nameInput', { static: true }) nameInput?: IonInput;\n\n // TODO: relationship is not implemented yet\n protected $relation = signal<ContactToContactRelation | undefined>(undefined);\n\n public readonly $contact = signal<NewContactBaseDboAndSpaceRef>({\n space: emptySpaceRef,\n dbo: {\n type: 'person',\n gender: 'unknown', // Undefined would indicate \"loading\" and gender form would be disabled.\n },\n } as ContactIdAndDboWithSpaceRef);\n\n protected readonly $contactGroupID = signal<string>('');\n protected readonly $contactRoleID = signal<ContactRole | undefined>(\n undefined,\n );\n protected readonly $assetID = signal<string>('');\n\n protected readonly $contactRole =\n signal<OptionalContactRoleIdAndBrief>(undefined);\n protected readonly $contactGroup =\n signal<OptionalContactGroupIdAndBrief>(undefined);\n\n protected readonly $parentContactID = signal<string>('');\n\n protected readonly $title = computed(() => {\n const contactRoleBrief = this.$contactRole()?.brief;\n return contactRoleBrief\n ? `${contactRoleBrief.emoji} New ${contactRoleBrief.title.toLowerCase()}`\n : 'New contact';\n });\n\n protected readonly $asset = signal<IAssetContext | undefined>(undefined);\n\n constructor() {\n super();\n this.defaultBackPage = 'contacts';\n this.$asset.set(window.history.state?.asset as IAssetContext);\n }\n\n // onContactTypeChanged(v: ContactRole): void {\n //\n // }\n\n override ngOnInit(): void {\n super.ngOnInit();\n this.route.queryParamMap\n .pipe(this.takeUntilDestroyed())\n .subscribe(this.onUrlParamsChanged);\n }\n\n private readonly onUrlParamsChanged = (params: ParamMap): void => {\n const relation = params.get('relation');\n if (relation) {\n this.$relation.set(relation as ContactToContactRelation);\n }\n const contactGroupID = params.get('group');\n if (contactGroupID && contactGroupID !== this.$contactGroupID()) {\n this.$contactGroupID.set(contactGroupID);\n }\n const contactRole = params.get('role');\n\n if (contactRole && !this.$contactRole()) {\n this.$contactRoleID.set(contactRole as ContactRole);\n }\n\n const space = this.space;\n if (!space) {\n throw new Error('Space is not defined');\n }\n\n const assetId = params.get('asset');\n if (assetId && assetId !== this.$assetID()) {\n this.$assetID.set(assetId);\n }\n const parentContactID = params.get('contact');\n if (parentContactID && this.$parentContactID() !== parentContactID) {\n this.$parentContactID.set(parentContactID);\n }\n };\n\n protected onContactChanged(contact: NewContactBaseDboAndSpaceRef): void {\n // console.log('onContactChanged', contact);\n this.$contact.set(contact);\n }\n}\n","<ion-nav />\n\n<ion-header>\n <ion-toolbar color=\"light\" class=\"with-back-button\">\n <ion-buttons slot=\"start\">\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n <ion-title>{{ $title() }}</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <sneat-new-contact-form\n [$space]=\"$space()\"\n [$contact]=\"$contact()\"\n (contactChange)=\"onContactChanged($event)\"\n />\n <!--\t<sneat-new-person-form-->\n <!--\t\t[$fixedGroupID]=\"$contactGroupID()\"-->\n <!--\t\t[$fixedRoleID]=\"$contactRoleID()\"-->\n <!--\t\t[$parentContactID]=\"$parentContactID()\"-->\n <!--\t\t(contactRoleChange)=\"$contactRole.set($event)\"-->\n <!--\t\t(contactGroupChange)=\"$contactGroup.set($event)\"-->\n <!--\t\t(contactChange)=\"$contact.set($event)\"-->\n <!--\t/>-->\n</ion-content>\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './new-location-page.component';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/internal/src/lib/pages/new-location/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC","sourcesContent":["export * from './new-location-page.component';\n"]}
@@ -0,0 +1,55 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { IonBackButton, IonContent, IonHeader, IonTitle, IonToolbar, } from '@ionic/angular/standalone';
3
+ import { PersonTitle } from '@sneat/contactus-shared';
4
+ import { ContactService } from '@sneat/contactus-services';
5
+ import { LocationFormComponent } from '@sneat/contactus-shared';
6
+ import { ClassName } from '@sneat/ui';
7
+ import { ContactBasePage } from '../contact-base-page';
8
+ import * as i0 from "@angular/core";
9
+ export class NewLocationPageComponent extends ContactBasePage {
10
+ constructor() {
11
+ super(inject(ContactService));
12
+ this.newLocation = {
13
+ id: '',
14
+ brief: { type: 'location' },
15
+ // space: this.space,
16
+ };
17
+ }
18
+ onSpaceDboChanged() {
19
+ super.onSpaceDboChanged();
20
+ // if (this.team?.dto?.countryID && !this.newLocationDto.countryID) {
21
+ // this.newLocationDto = { ...this.newLocationDto, countryID: this.team.dto.countryID };
22
+ // }
23
+ }
24
+ onLocationChanged(contact) {
25
+ this.newLocation = contact;
26
+ }
27
+ onContactCreated(contact) {
28
+ this.newLocation = contact;
29
+ const space = this.space;
30
+ if (!space) {
31
+ throw new Error('Space is not defined');
32
+ }
33
+ const url = this.spacePageUrl(`contact/${this.$contactID()}`);
34
+ if (url) {
35
+ this.navController
36
+ .navigateBack(url)
37
+ .catch(this.errorLogger.logErrorHandler('failed navigate to parent contact'));
38
+ }
39
+ }
40
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: NewLocationPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
41
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: NewLocationPageComponent, isStandalone: true, selector: "sneat-new-location-page", providers: [{ provide: ClassName, useValue: 'NewLocationPageComponent' }], usesInheritance: true, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"light\">\n <ion-back-button\n slot=\"start\"\n [defaultHref]=\"spacePageUrl('contact/{{contact?.id}}')\"\n />\n <ion-title>\n @if ($contact(); as contact) {\n New location &#64; {{ contact | personTitle }}\n } @else {\n New location\n }\n </ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <sneat-location-form\n [$space]=\"$space()\"\n [parentContact]=\"$contact()\"\n [location]=\"newLocation\"\n (locationChange)=\"onLocationChanged($event)\"\n (locationCreated)=\"onContactCreated($event)\"\n />\n</ion-content>\n", dependencies: [{ kind: "component", type: LocationFormComponent, selector: "sneat-location-form", inputs: ["$space", "contactRole", "countryID", "location", "parentContact", "hideSubmitButton", "label", "contactType"], outputs: ["locationChange", "locationCreated"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonBackButton, selector: "ion-back-button" }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "pipe", type: PersonTitle, name: "personTitle" }] }); }
42
+ }
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: NewLocationPageComponent, decorators: [{
44
+ type: Component,
45
+ args: [{ selector: 'sneat-new-location-page', imports: [
46
+ LocationFormComponent,
47
+ PersonTitle,
48
+ IonHeader,
49
+ IonToolbar,
50
+ IonBackButton,
51
+ IonTitle,
52
+ IonContent,
53
+ ], providers: [{ provide: ClassName, useValue: 'NewLocationPageComponent' }], template: "<ion-header>\n <ion-toolbar color=\"light\">\n <ion-back-button\n slot=\"start\"\n [defaultHref]=\"spacePageUrl('contact/{{contact?.id}}')\"\n />\n <ion-title>\n @if ($contact(); as contact) {\n New location &#64; {{ contact | personTitle }}\n } @else {\n New location\n }\n </ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <sneat-location-form\n [$space]=\"$space()\"\n [parentContact]=\"$contact()\"\n [location]=\"newLocation\"\n (locationChange)=\"onLocationChanged($event)\"\n (locationCreated)=\"onContactCreated($event)\"\n />\n</ion-content>\n" }]
54
+ }], ctorParameters: () => [] });
55
+ //# sourceMappingURL=new-location-page.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new-location-page.component.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/internal/src/lib/pages/new-location/new-location-page.component.ts","../../../../../../../../libs/contactus/internal/src/lib/pages/new-location/new-location-page.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EACL,aAAa,EACb,UAAU,EACV,SAAS,EACT,QAAQ,EACR,UAAU,GACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;;AAgBvD,MAAM,OAAO,wBAAyB,SAAQ,eAAe;IAO3D;QACE,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QAPhC,gBAAW,GAA4B;YACrC,EAAE,EAAE,EAAE;YACN,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;YAC3B,qBAAqB;SACtB,CAAC;IAIF,CAAC;IAEkB,iBAAiB;QAClC,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,qEAAqE;QACrE,yFAAyF;QACzF,IAAI;IACN,CAAC;IAED,iBAAiB,CAAC,OAAgC;QAChD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;IAC7B,CAAC;IAED,gBAAgB,CAAC,OAAgC;QAC/C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC9D,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,aAAa;iBACf,YAAY,CAAC,GAAG,CAAC;iBACjB,KAAK,CACJ,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,mCAAmC,CAAC,CACtE,CAAC;QACN,CAAC;IACH,CAAC;8GApCU,wBAAwB;kGAAxB,wBAAwB,sEAFxB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,0BAA0B,EAAE,CAAC,iDC3B3E,8nBAyBA,4CDNI,qBAAqB,yOAErB,SAAS,oGACT,UAAU,mFACV,aAAa,4DACb,QAAQ,iFACR,UAAU,mKALV,WAAW;;2FASF,wBAAwB;kBAdpC,SAAS;+BACE,yBAAyB,WAE1B;wBACP,qBAAqB;wBACrB,WAAW;wBACX,SAAS;wBACT,UAAU;wBACV,aAAa;wBACb,QAAQ;wBACR,UAAU;qBACX,aACU,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,0BAA0B,EAAE,CAAC","sourcesContent":["import { Component, inject } from '@angular/core';\nimport {\n IonBackButton,\n IonContent,\n IonHeader,\n IonTitle,\n IonToolbar,\n} from '@ionic/angular/standalone';\nimport { PersonTitle } from '@sneat/contactus-shared';\nimport { ContactService } from '@sneat/contactus-services';\nimport { LocationFormComponent } from '@sneat/contactus-shared';\nimport { IContactWithOptionalDbo } from '@sneat/contactus-core';\nimport { ClassName } from '@sneat/ui';\nimport { ContactBasePage } from '../contact-base-page';\n\n@Component({\n selector: 'sneat-new-location-page',\n templateUrl: './new-location-page.component.html',\n imports: [\n LocationFormComponent,\n PersonTitle,\n IonHeader,\n IonToolbar,\n IonBackButton,\n IonTitle,\n IonContent,\n ],\n providers: [{ provide: ClassName, useValue: 'NewLocationPageComponent' }],\n})\nexport class NewLocationPageComponent extends ContactBasePage {\n newLocation: IContactWithOptionalDbo = {\n id: '',\n brief: { type: 'location' },\n // space: this.space,\n };\n\n public constructor() {\n super(inject(ContactService));\n }\n\n protected override onSpaceDboChanged() {\n super.onSpaceDboChanged();\n // if (this.team?.dto?.countryID && !this.newLocationDto.countryID) {\n // \tthis.newLocationDto = { ...this.newLocationDto, countryID: this.team.dto.countryID };\n // }\n }\n\n onLocationChanged(contact: IContactWithOptionalDbo): void {\n this.newLocation = contact;\n }\n\n onContactCreated(contact: IContactWithOptionalDbo): void {\n this.newLocation = contact;\n const space = this.space;\n if (!space) {\n throw new Error('Space is not defined');\n }\n const url = this.spacePageUrl(`contact/${this.$contactID()}`);\n if (url) {\n this.navController\n .navigateBack(url)\n .catch(\n this.errorLogger.logErrorHandler('failed navigate to parent contact'),\n );\n }\n }\n}\n","<ion-header>\n <ion-toolbar color=\"light\">\n <ion-back-button\n slot=\"start\"\n [defaultHref]=\"spacePageUrl('contact/{{contact?.id}}')\"\n />\n <ion-title>\n @if ($contact(); as contact) {\n New location &#64; {{ contact | personTitle }}\n } @else {\n New location\n }\n </ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <sneat-location-form\n [$space]=\"$space()\"\n [parentContact]=\"$contact()\"\n [location]=\"newLocation\"\n (locationChange)=\"onLocationChanged($event)\"\n (locationCreated)=\"onContactCreated($event)\"\n />\n</ion-content>\n"]}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=sneat-contactus-internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sneat-contactus-internal.js","sourceRoot":"","sources":["../../../../../libs/contactus/internal/src/sneat-contactus-internal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC","sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"]}
package/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './lib';
@@ -0,0 +1,2 @@
1
+ import { Route } from '@angular/router';
2
+ export declare const contactusRoutes: Route[];
package/lib/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './contactus-routing.module';
2
+ export { membersRoutes } from './members/members-routing';
@@ -0,0 +1,2 @@
1
+ export * from './members-routing';
2
+ export * from './members-routing';
@@ -0,0 +1,12 @@
1
+ import { SpaceMemberType } from '@sneat/auth-models';
2
+ import { ContactusModuleBaseComponent } from '@sneat/contactus-shared';
3
+ import { IIdAndBriefAndOptionalDbo } from '@sneat/core';
4
+ import { ContactusSpaceService } from '@sneat/contactus-services';
5
+ import { IContactBrief, IContactDbo } from '@sneat/contactus-core';
6
+ export declare abstract class MembersBasePage extends ContactusModuleBaseComponent {
7
+ members?: readonly IIdAndBriefAndOptionalDbo<IContactBrief, IContactDbo>[];
8
+ abstract get memberType(): SpaceMemberType;
9
+ protected constructor(contactusTeamService: ContactusSpaceService);
10
+ goNewMember: () => void;
11
+ get supportsMemberGroups(): boolean;
12
+ }
@@ -0,0 +1,2 @@
1
+ import { Route } from '@angular/router';
2
+ export declare const membersRoutes: Route[];
@@ -0,0 +1,11 @@
1
+ import { MemberRelationship } from '@sneat/contactus-core';
2
+ import { MemberBasePage } from '../member-base-page';
3
+ import * as i0 from "@angular/core";
4
+ export declare class SpaceMemberPageComponent extends MemberBasePage {
5
+ relatedAs?: MemberRelationship;
6
+ constructor();
7
+ removeMember(): void;
8
+ private setRelatedAs;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<SpaceMemberPageComponent, never>;
10
+ static ɵcmp: i0.ɵɵComponentDeclaration<SpaceMemberPageComponent, "sneat-space-member-page", never, {}, {}, never, never, true, never>;
11
+ }
@@ -0,0 +1,10 @@
1
+ import { IContactContext } from '@sneat/contactus-core';
2
+ import { ContactService } from '@sneat/contactus-services';
3
+ import { ContactBasePage } from '../../pages/contact-base-page';
4
+ export declare abstract class MemberBasePage extends ContactBasePage {
5
+ segment: 'friends' | 'other' | 'summary';
6
+ private memberContext?;
7
+ protected constructor(contactService: ContactService);
8
+ get member(): IContactContext | undefined;
9
+ protected goNew: (_event: Event, _type: "new-contact" | "new-document" | "new-liability" | "new-asset", _relation?: string) => void;
10
+ }
@@ -0,0 +1,18 @@
1
+ import { SpaceMemberType } from '@sneat/auth-models';
2
+ import { MemberGroup } from '@sneat/contactus-shared';
3
+ import { IMemberGroupContext } from '@sneat/contactus-core';
4
+ import { MembersBasePage } from '../../members-base-page';
5
+ import * as i0 from "@angular/core";
6
+ export declare class MembersPageComponent extends MembersBasePage {
7
+ memberGroups?: readonly IMemberGroupContext[];
8
+ segment: 'all' | 'groups';
9
+ readonly memberType: SpaceMemberType;
10
+ constructor();
11
+ protected goGroup(memberGroup: IMemberGroupContext): void;
12
+ protected goNewMemberPage(group?: MemberGroup): void;
13
+ goNew(): void;
14
+ onSpaceDboChanged(): void;
15
+ private loadData;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<MembersPageComponent, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<MembersPageComponent, "sneat-members-page", never, {}, {}, never, never, true, never>;
18
+ }
@@ -0,0 +1 @@
1
+ export * from './new-member-page.component';
@@ -0,0 +1,26 @@
1
+ import { OnChanges, SimpleChanges } from '@angular/core';
2
+ import { UntypedFormGroup } from '@angular/forms';
3
+ import { PersonWizardComponent } from '@sneat/contactus-shared';
4
+ import { IContactusSpaceDboAndID, IPersonRequirements, NewContactBaseDboAndSpaceRef } from '@sneat/contactus-core';
5
+ import { WithNewContactInput } from '@sneat/contactus-shared';
6
+ import * as i0 from "@angular/core";
7
+ export declare class NewMemberFormComponent extends WithNewContactInput implements OnChanges {
8
+ personRequirements: IPersonRequirements;
9
+ private readonly navController;
10
+ private readonly hasNavHistory;
11
+ protected readonly $isSubmitting: import("@angular/core").WritableSignal<boolean>;
12
+ protected readonly $canSubmit: import("@angular/core").Signal<boolean | "">;
13
+ protected readonly $qrData: import("@angular/core").Signal<string>;
14
+ protected contactusSpace?: IContactusSpaceDboAndID;
15
+ protected readonly $isContactReady: import("@angular/core").Signal<boolean>;
16
+ personFormComponent?: PersonWizardComponent;
17
+ addMemberForm: UntypedFormGroup;
18
+ private readonly memberService;
19
+ constructor();
20
+ ngOnChanges(changes: SimpleChanges): void;
21
+ private setPersonRequirements;
22
+ submit(): void;
23
+ onContactChanged(contact: NewContactBaseDboAndSpaceRef): void;
24
+ static ɵfac: i0.ɵɵFactoryDeclaration<NewMemberFormComponent, never>;
25
+ static ɵcmp: i0.ɵɵComponentDeclaration<NewMemberFormComponent, "sneat-new-member-form", never, {}, {}, never, never, true, never>;
26
+ }