@sneat/extension-debtus-ui 0.1.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.
@@ -0,0 +1,97 @@
1
+ import { DatePipe } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, signal, Component } from '@angular/core';
4
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
+ import { Router } from '@angular/router';
6
+ import { IonHeader, IonToolbar, IonButtons, IonBackButton, IonTitle, IonContent, IonCard, IonCardHeader, IonCardTitle, IonCardContent, IonList, IonItem, IonLabel, IonNote, IonBadge, IonButton, IonIcon, IonSpinner } from '@ionic/angular';
7
+ import { DEBTUS_SERVICE, formatAmount } from '@sneat/extension-debtus-contract';
8
+ import { SpacePageBaseComponent, SpaceComponentBaseParams } from '@sneat/space-components';
9
+ import { combineLatest, switchMap, of } from 'rxjs';
10
+
11
+ // Transfer detail / receipt — amount, parties, date, note, and its effect on
12
+ // the balance. Mirrors the bot's receipt. Offers a settle-up entry.
13
+ class TransferDetailsPageComponent extends SpacePageBaseComponent {
14
+ debtusService = inject(DEBTUS_SERVICE);
15
+ router = inject(Router);
16
+ $loading = signal(true, /* @ts-ignore */
17
+ ...(ngDevMode ? [{ debugName: "$loading" }] : /* istanbul ignore next */ []));
18
+ $error = signal(undefined, /* @ts-ignore */
19
+ ...(ngDevMode ? [{ debugName: "$error" }] : /* istanbul ignore next */ []));
20
+ $transfer = signal(undefined, /* @ts-ignore */
21
+ ...(ngDevMode ? [{ debugName: "$transfer" }] : /* istanbul ignore next */ []));
22
+ formatAmount = formatAmount;
23
+ constructor() {
24
+ super();
25
+ this.$defaultBackUrlSpacePath.set('debts');
26
+ // A transfer just created by the new-transfer/settle-up pages is handed
27
+ // over via router `state` (it survives reloads through history.state).
28
+ // Prefer it: transfer reads are not wired to the live backend yet, so
29
+ // fetching a REAL transfer's id would fail — and it must fail rather than
30
+ // fabricate a receipt from fixtures.
31
+ const stateTransfer = (this.router.getCurrentNavigation()?.extras?.state ?? history.state)?.['transfer'];
32
+ combineLatest([this.spaceIDChanged$, this.route.paramMap])
33
+ .pipe(switchMap(([spaceID, params]) => {
34
+ const transferID = params.get('transferID') ?? '';
35
+ this.$loading.set(true);
36
+ this.$error.set(undefined);
37
+ if (stateTransfer?.id === transferID) {
38
+ return of(stateTransfer);
39
+ }
40
+ return this.debtusService.getTransfer(spaceID ?? '', transferID);
41
+ }), takeUntilDestroyed())
42
+ .subscribe({
43
+ next: (transfer) => {
44
+ this.$transfer.set(transfer);
45
+ this.$loading.set(false);
46
+ },
47
+ error: (err) => {
48
+ this.$error.set('Failed to load transfer');
49
+ this.$loading.set(false);
50
+ this.errorLogger.logError(err, 'Failed to load debtus transfer');
51
+ },
52
+ });
53
+ }
54
+ settleUp() {
55
+ const t = this.$transfer();
56
+ if (!t) {
57
+ return;
58
+ }
59
+ this.spaceNav.navigateForwardToSpacePage(this.space, `settle-up?contactID=${t.counterpartyContactID}`);
60
+ }
61
+ openContact() {
62
+ const t = this.$transfer();
63
+ if (!t?.counterpartyContactID) {
64
+ return;
65
+ }
66
+ this.spaceNav.navigateForwardToSpacePage(this.space, `debtus-contact/${t.counterpartyContactID}`);
67
+ }
68
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: TransferDetailsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
69
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.3", type: TransferDetailsPageComponent, isStandalone: true, selector: "sneat-debtus-transfer-details-page", providers: [SpaceComponentBaseParams], usesInheritance: true, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"light\">\n <ion-buttons slot=\"start\">\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n <ion-title>Transfer</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n @if ($loading()) {\n <div class=\"ion-padding ion-text-center\">\n <ion-spinner name=\"dots\" />\n </div>\n } @else if ($error()) {\n <div class=\"ion-padding\">\n <ion-note color=\"danger\">{{ $error() }}</ion-note>\n </div>\n } @else if ($transfer(); as t) {\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n {{ t.direction === 'lend' ? 'You lent' : 'You borrowed' }}\n @if (t.isReturn) { \u00B7 return }\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <ion-badge\n [color]=\"t.direction === 'lend' ? 'success' : 'warning'\"\n style=\"font-size: 1.2rem\"\n >\n {{ formatAmount(t.amount) }}\n </ion-badge>\n </ion-card-content>\n </ion-card>\n\n <ion-card>\n <ion-list lines=\"full\">\n <ion-item button (click)=\"openContact()\">\n <ion-label>\n <p>Counterparty</p>\n <h2>{{ t.counterpartyTitle }}</h2>\n </ion-label>\n </ion-item>\n <ion-item>\n <ion-label>\n <p>Date</p>\n <h2>{{ t.created | date: 'medium' }}</h2>\n </ion-label>\n </ion-item>\n @if (t.dueOn) {\n <ion-item>\n <ion-label>\n <p>Due</p>\n <h2>{{ t.dueOn | date: 'mediumDate' }}</h2>\n </ion-label>\n </ion-item>\n }\n @if (t.note) {\n <ion-item>\n <ion-label class=\"ion-text-wrap\">\n <p>Note</p>\n <h2>{{ t.note }}</h2>\n </ion-label>\n </ion-item>\n }\n <ion-item>\n <ion-label>\n <p>Status</p>\n <h2>{{ t.isOutstanding ? 'Outstanding' : 'Settled' }}</h2>\n </ion-label>\n </ion-item>\n <ion-item>\n <ion-label class=\"ion-text-wrap\">\n <p>Effect on balance</p>\n <h2>\n @if (t.direction === 'lend') {\n {{ t.counterpartyTitle }} owes you {{ formatAmount(t.amount) }}\n } @else {\n You owe {{ t.counterpartyTitle }} {{ formatAmount(t.amount) }}\n }\n </h2>\n </ion-label>\n </ion-item>\n @if (t.counterpartySpaceID) {\n <ion-item>\n <ion-label class=\"ion-text-wrap\">\n <p>Cross-space</p>\n <h2>Counterparty side is in space {{ t.counterpartySpaceID }}</h2>\n <ion-note color=\"medium\">\n Your side: {{ t.creatorSpaceID }}\n </ion-note>\n </ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-card>\n\n @if (t.isOutstanding) {\n <div class=\"ion-padding\">\n <ion-button expand=\"block\" color=\"success\" (click)=\"settleUp()\">\n <ion-icon name=\"checkmark-done-outline\" slot=\"start\" />\n Settle up\n </ion-button>\n </div>\n }\n }\n</ion-content>\n", dependencies: [{ 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"], outputs: ["ionScrollStart", "ionScroll", "ionScrollEnd"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonNote, selector: "ion-note", inputs: ["color", "mode"] }, { kind: "component", type: IonBadge, selector: "ion-badge", inputs: ["color", "mode"] }, { 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"], outputs: ["ionFocus", "ionBlur"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "pipe", type: DatePipe, name: "date" }] });
70
+ }
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: TransferDetailsPageComponent, decorators: [{
72
+ type: Component,
73
+ args: [{ selector: 'sneat-debtus-transfer-details-page', imports: [
74
+ IonHeader,
75
+ IonToolbar,
76
+ IonButtons,
77
+ IonBackButton,
78
+ IonTitle,
79
+ IonContent,
80
+ IonCard,
81
+ IonCardHeader,
82
+ IonCardTitle,
83
+ IonCardContent,
84
+ IonList,
85
+ IonItem,
86
+ IonLabel,
87
+ IonNote,
88
+ IonBadge,
89
+ IonButton,
90
+ IonIcon,
91
+ IonSpinner,
92
+ DatePipe,
93
+ ], providers: [SpaceComponentBaseParams], template: "<ion-header>\n <ion-toolbar color=\"light\">\n <ion-buttons slot=\"start\">\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n <ion-title>Transfer</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n @if ($loading()) {\n <div class=\"ion-padding ion-text-center\">\n <ion-spinner name=\"dots\" />\n </div>\n } @else if ($error()) {\n <div class=\"ion-padding\">\n <ion-note color=\"danger\">{{ $error() }}</ion-note>\n </div>\n } @else if ($transfer(); as t) {\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n {{ t.direction === 'lend' ? 'You lent' : 'You borrowed' }}\n @if (t.isReturn) { \u00B7 return }\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <ion-badge\n [color]=\"t.direction === 'lend' ? 'success' : 'warning'\"\n style=\"font-size: 1.2rem\"\n >\n {{ formatAmount(t.amount) }}\n </ion-badge>\n </ion-card-content>\n </ion-card>\n\n <ion-card>\n <ion-list lines=\"full\">\n <ion-item button (click)=\"openContact()\">\n <ion-label>\n <p>Counterparty</p>\n <h2>{{ t.counterpartyTitle }}</h2>\n </ion-label>\n </ion-item>\n <ion-item>\n <ion-label>\n <p>Date</p>\n <h2>{{ t.created | date: 'medium' }}</h2>\n </ion-label>\n </ion-item>\n @if (t.dueOn) {\n <ion-item>\n <ion-label>\n <p>Due</p>\n <h2>{{ t.dueOn | date: 'mediumDate' }}</h2>\n </ion-label>\n </ion-item>\n }\n @if (t.note) {\n <ion-item>\n <ion-label class=\"ion-text-wrap\">\n <p>Note</p>\n <h2>{{ t.note }}</h2>\n </ion-label>\n </ion-item>\n }\n <ion-item>\n <ion-label>\n <p>Status</p>\n <h2>{{ t.isOutstanding ? 'Outstanding' : 'Settled' }}</h2>\n </ion-label>\n </ion-item>\n <ion-item>\n <ion-label class=\"ion-text-wrap\">\n <p>Effect on balance</p>\n <h2>\n @if (t.direction === 'lend') {\n {{ t.counterpartyTitle }} owes you {{ formatAmount(t.amount) }}\n } @else {\n You owe {{ t.counterpartyTitle }} {{ formatAmount(t.amount) }}\n }\n </h2>\n </ion-label>\n </ion-item>\n @if (t.counterpartySpaceID) {\n <ion-item>\n <ion-label class=\"ion-text-wrap\">\n <p>Cross-space</p>\n <h2>Counterparty side is in space {{ t.counterpartySpaceID }}</h2>\n <ion-note color=\"medium\">\n Your side: {{ t.creatorSpaceID }}\n </ion-note>\n </ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-card>\n\n @if (t.isOutstanding) {\n <div class=\"ion-padding\">\n <ion-button expand=\"block\" color=\"success\" (click)=\"settleUp()\">\n <ion-icon name=\"checkmark-done-outline\" slot=\"start\" />\n Settle up\n </ion-button>\n </div>\n }\n }\n</ion-content>\n" }]
94
+ }], ctorParameters: () => [] });
95
+
96
+ export { TransferDetailsPageComponent };
97
+ //# sourceMappingURL=sneat-extension-debtus-ui-transfer-details-page.component-uo5lP557.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sneat-extension-debtus-ui-transfer-details-page.component-uo5lP557.mjs","sources":["../../../../../../libs/extensions/debtus/ui/src/lib/pages/transfer-details/transfer-details-page.component.ts","../../../../../../libs/extensions/debtus/ui/src/lib/pages/transfer-details/transfer-details-page.component.html"],"sourcesContent":["import { DatePipe } from '@angular/common';\nimport { Component, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport {\n IonBackButton,\n IonBadge,\n IonButton,\n IonButtons,\n IonCard,\n IonCardContent,\n IonCardHeader,\n IonCardTitle,\n IonContent,\n IonHeader,\n IonIcon,\n IonItem,\n IonLabel,\n IonList,\n IonNote,\n IonSpinner,\n IonTitle,\n IonToolbar,\n} from '@ionic/angular';\nimport {\n DEBTUS_SERVICE,\n IDebtusTransfer,\n formatAmount,\n} from '@sneat/extension-debtus-contract';\nimport {\n SpaceComponentBaseParams,\n SpacePageBaseComponent,\n} from '@sneat/space-components';\nimport { combineLatest, of, switchMap } from 'rxjs';\n\n// Transfer detail / receipt — amount, parties, date, note, and its effect on\n// the balance. Mirrors the bot's receipt. Offers a settle-up entry.\n@Component({\n selector: 'sneat-debtus-transfer-details-page',\n templateUrl: './transfer-details-page.component.html',\n imports: [\n IonHeader,\n IonToolbar,\n IonButtons,\n IonBackButton,\n IonTitle,\n IonContent,\n IonCard,\n IonCardHeader,\n IonCardTitle,\n IonCardContent,\n IonList,\n IonItem,\n IonLabel,\n IonNote,\n IonBadge,\n IonButton,\n IonIcon,\n IonSpinner,\n DatePipe,\n ],\n providers: [SpaceComponentBaseParams],\n})\nexport class TransferDetailsPageComponent extends SpacePageBaseComponent {\n private readonly debtusService = inject(DEBTUS_SERVICE);\n private readonly router = inject(Router);\n\n protected readonly $loading = signal(true);\n protected readonly $error = signal<string | undefined>(undefined);\n protected readonly $transfer = signal<IDebtusTransfer | undefined>(undefined);\n\n protected readonly formatAmount = formatAmount;\n\n constructor() {\n super();\n this.$defaultBackUrlSpacePath.set('debts');\n // A transfer just created by the new-transfer/settle-up pages is handed\n // over via router `state` (it survives reloads through history.state).\n // Prefer it: transfer reads are not wired to the live backend yet, so\n // fetching a REAL transfer's id would fail — and it must fail rather than\n // fabricate a receipt from fixtures.\n const stateTransfer = (\n this.router.getCurrentNavigation()?.extras?.state ?? history.state\n )?.['transfer'] as IDebtusTransfer | undefined;\n combineLatest([this.spaceIDChanged$, this.route.paramMap])\n .pipe(\n switchMap(([spaceID, params]) => {\n const transferID = params.get('transferID') ?? '';\n this.$loading.set(true);\n this.$error.set(undefined);\n if (stateTransfer?.id === transferID) {\n return of(stateTransfer);\n }\n return this.debtusService.getTransfer(spaceID ?? '', transferID);\n }),\n takeUntilDestroyed(),\n )\n .subscribe({\n next: (transfer) => {\n this.$transfer.set(transfer);\n this.$loading.set(false);\n },\n error: (err) => {\n this.$error.set('Failed to load transfer');\n this.$loading.set(false);\n this.errorLogger.logError(err, 'Failed to load debtus transfer');\n },\n });\n }\n\n protected settleUp(): void {\n const t = this.$transfer();\n if (!t) {\n return;\n }\n this.spaceNav.navigateForwardToSpacePage(\n this.space,\n `settle-up?contactID=${t.counterpartyContactID}`,\n );\n }\n\n protected openContact(): void {\n const t = this.$transfer();\n if (!t?.counterpartyContactID) {\n return;\n }\n this.spaceNav.navigateForwardToSpacePage(\n this.space,\n `debtus-contact/${t.counterpartyContactID}`,\n );\n }\n}\n","<ion-header>\n <ion-toolbar color=\"light\">\n <ion-buttons slot=\"start\">\n <ion-back-button [defaultHref]=\"$defaultBackUrl()\" />\n </ion-buttons>\n <ion-title>Transfer</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n @if ($loading()) {\n <div class=\"ion-padding ion-text-center\">\n <ion-spinner name=\"dots\" />\n </div>\n } @else if ($error()) {\n <div class=\"ion-padding\">\n <ion-note color=\"danger\">{{ $error() }}</ion-note>\n </div>\n } @else if ($transfer(); as t) {\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n {{ t.direction === 'lend' ? 'You lent' : 'You borrowed' }}\n @if (t.isReturn) { · return }\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <ion-badge\n [color]=\"t.direction === 'lend' ? 'success' : 'warning'\"\n style=\"font-size: 1.2rem\"\n >\n {{ formatAmount(t.amount) }}\n </ion-badge>\n </ion-card-content>\n </ion-card>\n\n <ion-card>\n <ion-list lines=\"full\">\n <ion-item button (click)=\"openContact()\">\n <ion-label>\n <p>Counterparty</p>\n <h2>{{ t.counterpartyTitle }}</h2>\n </ion-label>\n </ion-item>\n <ion-item>\n <ion-label>\n <p>Date</p>\n <h2>{{ t.created | date: 'medium' }}</h2>\n </ion-label>\n </ion-item>\n @if (t.dueOn) {\n <ion-item>\n <ion-label>\n <p>Due</p>\n <h2>{{ t.dueOn | date: 'mediumDate' }}</h2>\n </ion-label>\n </ion-item>\n }\n @if (t.note) {\n <ion-item>\n <ion-label class=\"ion-text-wrap\">\n <p>Note</p>\n <h2>{{ t.note }}</h2>\n </ion-label>\n </ion-item>\n }\n <ion-item>\n <ion-label>\n <p>Status</p>\n <h2>{{ t.isOutstanding ? 'Outstanding' : 'Settled' }}</h2>\n </ion-label>\n </ion-item>\n <ion-item>\n <ion-label class=\"ion-text-wrap\">\n <p>Effect on balance</p>\n <h2>\n @if (t.direction === 'lend') {\n {{ t.counterpartyTitle }} owes you {{ formatAmount(t.amount) }}\n } @else {\n You owe {{ t.counterpartyTitle }} {{ formatAmount(t.amount) }}\n }\n </h2>\n </ion-label>\n </ion-item>\n @if (t.counterpartySpaceID) {\n <ion-item>\n <ion-label class=\"ion-text-wrap\">\n <p>Cross-space</p>\n <h2>Counterparty side is in space {{ t.counterpartySpaceID }}</h2>\n <ion-note color=\"medium\">\n Your side: {{ t.creatorSpaceID }}\n </ion-note>\n </ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-card>\n\n @if (t.isOutstanding) {\n <div class=\"ion-padding\">\n <ion-button expand=\"block\" color=\"success\" (click)=\"settleUp()\">\n <ion-icon name=\"checkmark-done-outline\" slot=\"start\" />\n Settle up\n </ion-button>\n </div>\n }\n }\n</ion-content>\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Component, inject, input } from '@angular/core';
3
+ import * as i1 from '@angular/forms';
4
+ import { FormControl, Validators, FormGroup, ReactiveFormsModule } from '@angular/forms';
5
+ import { IonCard, IonCardHeader, IonCardTitle, IonItem, IonLabel, IonSelect, IonSelectOption, IonInput, IonButton } from '@ionic/angular';
6
+ import { ErrorLogger } from '@sneat/core';
7
+ import { DEBTUS_SERVICE } from '@sneat/extension-debtus-contract';
8
+
9
+ // Persistent "demo data" banner for fixture-backed READ surfaces.
10
+ //
11
+ // Balances, contacts and transfer history are still served from demo fixtures
12
+ // (no wired read endpoints yet — see DebtusService), while creates/settles
13
+ // WRITE real records. Without this banner users see fiction presented as
14
+ // their data, and the transfers they record never appear in any list. Show
15
+ // this on every page that renders fixture-backed reads; remove per page once
16
+ // its live read endpoint is wired.
17
+ class DemoDataBannerComponent {
18
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: DemoDataBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
19
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.3", type: DemoDataBannerComponent, isStandalone: true, selector: "sneat-debtus-demo-data-banner", ngImport: i0, template: `
20
+ <div class="demo-banner" role="note">
21
+ ⚠️ <b>Demo data</b> — balances, contacts &amp; history shown here are
22
+ sample fixtures, not your records yet. Transfers you record are saved for
23
+ real and will show up once live reads are wired.
24
+ </div>
25
+ `, isInline: true, styles: [".demo-banner{margin:8px 12px 0;padding:8px 12px;border-radius:8px;font-size:.85rem;background:var(--ion-color-warning-tint, #ffd534);color:var(--ion-color-warning-contrast, #000)}\n"] });
26
+ }
27
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: DemoDataBannerComponent, decorators: [{
28
+ type: Component,
29
+ args: [{ selector: 'sneat-debtus-demo-data-banner', template: `
30
+ <div class="demo-banner" role="note">
31
+ ⚠️ <b>Demo data</b> — balances, contacts &amp; history shown here are
32
+ sample fixtures, not your records yet. Transfers you record are saved for
33
+ real and will show up once live reads are wired.
34
+ </div>
35
+ `, styles: [".demo-banner{margin:8px 12px 0;padding:8px 12px;border-radius:8px;font-size:.85rem;background:var(--ion-color-warning-tint, #ffd534);color:var(--ion-color-warning-contrast, #000)}\n"] }]
36
+ }] });
37
+
38
+ class MemberDebtsSummaryComponent {
39
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: MemberDebtsSummaryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
40
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.3", type: MemberDebtsSummaryComponent, isStandalone: true, selector: "sneat-debtus-member-debts-summary", ngImport: i0, template: "<h2>Debts</h2>\n" });
41
+ }
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: MemberDebtsSummaryComponent, decorators: [{
43
+ type: Component,
44
+ args: [{ selector: 'sneat-debtus-member-debts-summary', template: "<h2>Debts</h2>\n" }]
45
+ }] });
46
+
47
+ class NewDebtFormComponent {
48
+ errorLogger = inject(ErrorLogger);
49
+ debtusService = inject(DEBTUS_SERVICE);
50
+ space = input.required(/* @ts-ignore */
51
+ ...(ngDevMode ? [{ debugName: "space" }] : /* istanbul ignore next */ []));
52
+ contact = input.required(/* @ts-ignore */
53
+ ...(ngDevMode ? [{ debugName: "contact" }] : /* istanbul ignore next */ []));
54
+ currency = new FormControl('EUR');
55
+ amount = new FormControl(undefined, Validators.required);
56
+ newDebtForm = new FormGroup({
57
+ currency: this.currency,
58
+ amount: this.amount,
59
+ });
60
+ currencies = ['EUR', 'USD'];
61
+ submit() {
62
+ const spaceID = this.space()?.id;
63
+ if (!spaceID) {
64
+ throw new Error('spaceID is not set');
65
+ }
66
+ const contactID = this.contact()?.id;
67
+ if (!contactID) {
68
+ throw new Error('contactID is not set');
69
+ }
70
+ if (!this.amount.value) {
71
+ throw new Error('amount is not set');
72
+ }
73
+ if (!this.currency.value) {
74
+ throw new Error('currency is not set');
75
+ }
76
+ const request = {
77
+ spaceID,
78
+ contactID,
79
+ amount: this.amount.value,
80
+ currency: this.currency.value,
81
+ };
82
+ this.debtusService.createDebtRecord(request).subscribe({
83
+ next: () => {
84
+ // Debt record created successfully
85
+ },
86
+ error: (err) => {
87
+ console.error('Failed to create debt record:', err);
88
+ },
89
+ });
90
+ }
91
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: NewDebtFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
92
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.3", type: NewDebtFormComponent, isStandalone: true, selector: "sneat-debtus-new-debt-form", inputs: { space: { classPropertyName: "space", publicName: "space", isSignal: true, isRequired: true, transformFunction: null }, contact: { classPropertyName: "contact", publicName: "contact", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<ion-card>\n <ion-card-header>\n <ion-card-title>New debt</ion-card-title>\n </ion-card-header>\n <ion-item>\n <ion-label>Currency</ion-label>\n <ion-select [formControl]=\"currency\" placeholder=\"Select Currency\">\n @for (currency of currencies; track currency) {\n <ion-select-option [value]=\"currency\">{{ currency }}</ion-select-option>\n }\n </ion-select>\n </ion-item>\n <ion-item>\n <ion-label>Amount</ion-label>\n <ion-input type=\"number\" [formControl]=\"amount\" />\n </ion-item>\n\n <!--\t<sneat-contact-input [team]=\"team\" />-->\n\n <ion-button (click)=\"submit()\">Add debt</ion-button>\n</ion-card>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["description", "disabled", "justify", "labelPlacement", "mode", "value"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { 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"], outputs: ["ionFocus", "ionBlur"] }] });
93
+ }
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: NewDebtFormComponent, decorators: [{
95
+ type: Component,
96
+ args: [{ selector: 'sneat-debtus-new-debt-form', imports: [
97
+ ReactiveFormsModule,
98
+ IonCard,
99
+ IonCardHeader,
100
+ IonCardTitle,
101
+ IonItem,
102
+ IonLabel,
103
+ IonSelect,
104
+ IonSelectOption,
105
+ IonInput,
106
+ IonButton,
107
+ // ContactInputComponent,
108
+ // forwardRef(() => ContactInputComponent),
109
+ ], template: "<ion-card>\n <ion-card-header>\n <ion-card-title>New debt</ion-card-title>\n </ion-card-header>\n <ion-item>\n <ion-label>Currency</ion-label>\n <ion-select [formControl]=\"currency\" placeholder=\"Select Currency\">\n @for (currency of currencies; track currency) {\n <ion-select-option [value]=\"currency\">{{ currency }}</ion-select-option>\n }\n </ion-select>\n </ion-item>\n <ion-item>\n <ion-label>Amount</ion-label>\n <ion-input type=\"number\" [formControl]=\"amount\" />\n </ion-item>\n\n <!--\t<sneat-contact-input [team]=\"team\" />-->\n\n <ion-button (click)=\"submit()\">Add debt</ion-button>\n</ion-card>\n" }]
110
+ }], propDecorators: { space: [{ type: i0.Input, args: [{ isSignal: true, alias: "space", required: true }] }], contact: [{ type: i0.Input, args: [{ isSignal: true, alias: "contact", required: true }] }] } });
111
+
112
+ // Debtus space-scoped routes, mounted under space/:spaceType/:spaceID.
113
+ // Full flow: debts (home/balances) -> debtus-contacts -> debtus-contact/:id
114
+ // -> new-transfer / settle-up -> transfer/:id (receipt).
115
+ const spacePagesRoutes = [
116
+ {
117
+ path: 'debts',
118
+ data: { title: 'Debts' },
119
+ loadComponent: () => import('./sneat-extension-debtus-ui-debtus-home-page.component-BCNMpirX.mjs').then((m) => m.DebtusHomePageComponent),
120
+ },
121
+ {
122
+ path: 'debtus-contacts',
123
+ data: { title: 'Contacts' },
124
+ loadComponent: () => import('./sneat-extension-debtus-ui-debtus-contacts-page.component-DYtFeNsM.mjs').then((m) => m.DebtusContactsPageComponent),
125
+ },
126
+ {
127
+ path: 'debtus-contact/:contactID',
128
+ data: { title: 'Contact' },
129
+ loadComponent: () => import('./sneat-extension-debtus-ui-debtus-contact-details-page.component-DIAVE0D6.mjs').then((m) => m.DebtusContactDetailsPageComponent),
130
+ },
131
+ {
132
+ path: 'new-transfer',
133
+ data: { title: 'New transfer' },
134
+ loadComponent: () => import('./sneat-extension-debtus-ui-new-transfer-page.component-CT-6X_0e.mjs').then((m) => m.NewTransferPageComponent),
135
+ },
136
+ {
137
+ path: 'settle-up',
138
+ data: { title: 'Settle up' },
139
+ loadComponent: () => import('./sneat-extension-debtus-ui-settle-up-page.component-CUoNSuAE.mjs').then((m) => m.SettleUpPageComponent),
140
+ },
141
+ {
142
+ path: 'transfer/:transferID',
143
+ data: { title: 'Transfer' },
144
+ loadComponent: () => import('./sneat-extension-debtus-ui-transfer-details-page.component-uo5lP557.mjs').then((m) => m.TransferDetailsPageComponent),
145
+ },
146
+ ];
147
+
148
+ /**
149
+ * Generated bundle index. Do not edit.
150
+ */
151
+
152
+ export { DemoDataBannerComponent, MemberDebtsSummaryComponent, NewDebtFormComponent, spacePagesRoutes };
153
+ //# sourceMappingURL=sneat-extension-debtus-ui.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sneat-extension-debtus-ui.mjs","sources":["../../../../../../libs/extensions/debtus/ui/src/lib/components/demo-data-banner/demo-data-banner.component.ts","../../../../../../libs/extensions/debtus/ui/src/lib/components/member-debts-summary/member-debts-summary.component.ts","../../../../../../libs/extensions/debtus/ui/src/lib/components/member-debts-summary/member-debts-summary.component.html","../../../../../../libs/extensions/debtus/ui/src/lib/components/new-debt-form/new-debt-form.component.ts","../../../../../../libs/extensions/debtus/ui/src/lib/components/new-debt-form/new-debt-form.component.html","../../../../../../libs/extensions/debtus/ui/src/lib/pages/space-pages-routing.ts","../../../../../../libs/extensions/debtus/ui/src/sneat-extension-debtus-ui.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n// Persistent \"demo data\" banner for fixture-backed READ surfaces.\n//\n// Balances, contacts and transfer history are still served from demo fixtures\n// (no wired read endpoints yet — see DebtusService), while creates/settles\n// WRITE real records. Without this banner users see fiction presented as\n// their data, and the transfers they record never appear in any list. Show\n// this on every page that renders fixture-backed reads; remove per page once\n// its live read endpoint is wired.\n@Component({\n selector: 'sneat-debtus-demo-data-banner',\n template: `\n <div class=\"demo-banner\" role=\"note\">\n ⚠️ <b>Demo data</b> — balances, contacts &amp; history shown here are\n sample fixtures, not your records yet. Transfers you record are saved for\n real and will show up once live reads are wired.\n </div>\n `,\n styles: [\n `\n .demo-banner {\n margin: 8px 12px 0;\n padding: 8px 12px;\n border-radius: 8px;\n font-size: 0.85rem;\n background: var(--ion-color-warning-tint, #ffd534);\n color: var(--ion-color-warning-contrast, #000);\n }\n `,\n ],\n})\nexport class DemoDataBannerComponent {}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'sneat-debtus-member-debts-summary',\n templateUrl: './member-debts-summary.component.html',\n})\nexport class MemberDebtsSummaryComponent {}\n","<h2>Debts</h2>\n","import { Component, inject, input } from '@angular/core';\nimport {\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport {\n IonButton,\n IonCard,\n IonCardHeader,\n IonCardTitle,\n IonInput,\n IonItem,\n IonLabel,\n IonSelect,\n IonSelectOption,\n} from '@ionic/angular';\nimport { IContactContext } from '@sneat/extension-contactus-contract';\nimport { ErrorLogger, IErrorLogger } from '@sneat/core';\nimport {\n CurrencyCode,\n DEBTUS_SERVICE,\n ICreateDebtRecordRequest,\n} from '@sneat/extension-debtus-contract';\nimport { ISpaceContext } from '@sneat/space-models';\n\n@Component({\n selector: 'sneat-debtus-new-debt-form',\n templateUrl: './new-debt-form.component.html',\n imports: [\n ReactiveFormsModule,\n IonCard,\n IonCardHeader,\n IonCardTitle,\n IonItem,\n IonLabel,\n IonSelect,\n IonSelectOption,\n IonInput,\n IonButton,\n // ContactInputComponent,\n // forwardRef(() => ContactInputComponent),\n ],\n})\nexport class NewDebtFormComponent {\n private readonly errorLogger = inject<IErrorLogger>(ErrorLogger);\n private readonly debtusService = inject(DEBTUS_SERVICE);\n\n public readonly space = input.required<ISpaceContext | undefined>();\n public readonly contact = input.required<IContactContext | undefined>();\n\n protected currency = new FormControl<CurrencyCode>('EUR');\n protected amount = new FormControl<number | undefined>(\n undefined,\n Validators.required,\n );\n\n protected newDebtForm = new FormGroup({\n currency: this.currency,\n amount: this.amount,\n });\n\n protected readonly currencies = ['EUR', 'USD'];\n\n protected submit() {\n const spaceID = this.space()?.id;\n if (!spaceID) {\n throw new Error('spaceID is not set');\n }\n const contactID = this.contact()?.id;\n if (!contactID) {\n throw new Error('contactID is not set');\n }\n if (!this.amount.value) {\n throw new Error('amount is not set');\n }\n if (!this.currency.value) {\n throw new Error('currency is not set');\n }\n const request: ICreateDebtRecordRequest = {\n spaceID,\n contactID,\n amount: this.amount.value,\n currency: this.currency.value,\n };\n this.debtusService.createDebtRecord(request).subscribe({\n next: () => {\n // Debt record created successfully\n },\n error: (err) => {\n console.error('Failed to create debt record:', err);\n },\n });\n }\n}\n","<ion-card>\n <ion-card-header>\n <ion-card-title>New debt</ion-card-title>\n </ion-card-header>\n <ion-item>\n <ion-label>Currency</ion-label>\n <ion-select [formControl]=\"currency\" placeholder=\"Select Currency\">\n @for (currency of currencies; track currency) {\n <ion-select-option [value]=\"currency\">{{ currency }}</ion-select-option>\n }\n </ion-select>\n </ion-item>\n <ion-item>\n <ion-label>Amount</ion-label>\n <ion-input type=\"number\" [formControl]=\"amount\" />\n </ion-item>\n\n <!--\t<sneat-contact-input [team]=\"team\" />-->\n\n <ion-button (click)=\"submit()\">Add debt</ion-button>\n</ion-card>\n","import { Route } from '@angular/router';\n\n// Debtus space-scoped routes, mounted under space/:spaceType/:spaceID.\n// Full flow: debts (home/balances) -> debtus-contacts -> debtus-contact/:id\n// -> new-transfer / settle-up -> transfer/:id (receipt).\nexport const spacePagesRoutes: Route[] = [\n {\n path: 'debts',\n data: { title: 'Debts' },\n loadComponent: () =>\n import('./debtus-home/debtus-home-page.component').then(\n (m) => m.DebtusHomePageComponent,\n ),\n },\n {\n path: 'debtus-contacts',\n data: { title: 'Contacts' },\n loadComponent: () =>\n import('./debtus-contacts/debtus-contacts-page.component').then(\n (m) => m.DebtusContactsPageComponent,\n ),\n },\n {\n path: 'debtus-contact/:contactID',\n data: { title: 'Contact' },\n loadComponent: () =>\n import(\n './debtus-contact-details/debtus-contact-details-page.component'\n ).then((m) => m.DebtusContactDetailsPageComponent),\n },\n {\n path: 'new-transfer',\n data: { title: 'New transfer' },\n loadComponent: () =>\n import('./new-transfer/new-transfer-page.component').then(\n (m) => m.NewTransferPageComponent,\n ),\n },\n {\n path: 'settle-up',\n data: { title: 'Settle up' },\n loadComponent: () =>\n import('./settle-up/settle-up-page.component').then(\n (m) => m.SettleUpPageComponent,\n ),\n },\n {\n path: 'transfer/:transferID',\n data: { title: 'Transfer' },\n loadComponent: () =>\n import('./transfer-details/transfer-details-page.component').then(\n (m) => m.TransferDetailsPageComponent,\n ),\n },\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@sneat/extension-debtus-ui",
3
+ "version": "0.1.0",
4
+ "peerDependencies": {
5
+ "@angular/common": ">=22.0.0 <23.0.0",
6
+ "@angular/core": ">=22.0.0 <23.0.0",
7
+ "@angular/forms": ">=22.0.0 <23.0.0",
8
+ "@angular/router": ">=22.0.0 <23.0.0",
9
+ "@ionic/angular": ">=9.0.0 <10.0.0",
10
+ "rxjs": "^7.0.0",
11
+ "@sneat/extension-contactus-contract": "0.12.2",
12
+ "@sneat/core": "^0.26.4",
13
+ "@sneat/space-components": "^0.26.4",
14
+ "@sneat/space-models": "^0.26.4",
15
+ "@sneat/space-services": "^0.26.4",
16
+ "@sneat/ui": "^0.26.4",
17
+ "@sneat/extension-debtus-contract": "^0.2.0",
18
+ "@sneat/extension-contactus-ui": "0.13.9"
19
+ },
20
+ "dependencies": {
21
+ "tslib": "^2.3.0"
22
+ },
23
+ "sideEffects": false,
24
+ "module": "fesm2022/sneat-extension-debtus-ui.mjs",
25
+ "typings": "types/sneat-extension-debtus-ui.d.ts",
26
+ "exports": {
27
+ "./package.json": {
28
+ "default": "./package.json"
29
+ },
30
+ ".": {
31
+ "types": "./types/sneat-extension-debtus-ui.d.ts",
32
+ "default": "./fesm2022/sneat-extension-debtus-ui.mjs"
33
+ }
34
+ },
35
+ "type": "module"
36
+ }
@@ -0,0 +1,37 @@
1
+ import * as i0 from '@angular/core';
2
+ import { FormControl, FormGroup } from '@angular/forms';
3
+ import { IContactContext } from '@sneat/extension-contactus-contract';
4
+ import { CurrencyCode } from '@sneat/extension-debtus-contract';
5
+ import { ISpaceContext } from '@sneat/space-models';
6
+ import { Route } from '@angular/router';
7
+
8
+ declare class DemoDataBannerComponent {
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<DemoDataBannerComponent, never>;
10
+ static ɵcmp: i0.ɵɵComponentDeclaration<DemoDataBannerComponent, "sneat-debtus-demo-data-banner", never, {}, {}, never, never, true, never>;
11
+ }
12
+
13
+ declare class MemberDebtsSummaryComponent {
14
+ static ɵfac: i0.ɵɵFactoryDeclaration<MemberDebtsSummaryComponent, never>;
15
+ static ɵcmp: i0.ɵɵComponentDeclaration<MemberDebtsSummaryComponent, "sneat-debtus-member-debts-summary", never, {}, {}, never, never, true, never>;
16
+ }
17
+
18
+ declare class NewDebtFormComponent {
19
+ private readonly errorLogger;
20
+ private readonly debtusService;
21
+ readonly space: i0.InputSignal<ISpaceContext | undefined>;
22
+ readonly contact: i0.InputSignal<IContactContext | undefined>;
23
+ protected currency: FormControl<CurrencyCode | null>;
24
+ protected amount: FormControl<number | null | undefined>;
25
+ protected newDebtForm: FormGroup<{
26
+ currency: FormControl<CurrencyCode | null>;
27
+ amount: FormControl<number | null | undefined>;
28
+ }>;
29
+ protected readonly currencies: string[];
30
+ protected submit(): void;
31
+ static ɵfac: i0.ɵɵFactoryDeclaration<NewDebtFormComponent, never>;
32
+ static ɵcmp: i0.ɵɵComponentDeclaration<NewDebtFormComponent, "sneat-debtus-new-debt-form", never, { "space": { "alias": "space"; "required": true; "isSignal": true; }; "contact": { "alias": "contact"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
33
+ }
34
+
35
+ declare const spacePagesRoutes: Route[];
36
+
37
+ export { DemoDataBannerComponent, MemberDebtsSummaryComponent, NewDebtFormComponent, spacePagesRoutes };