@sneat/extension-debtus-ui 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{sneat-extension-debtus-ui-new-transfer-page.component-YaGgYqKB.mjs → sneat-extension-debtus-ui-new-transfer-page.component-DUkdGP92.mjs} +10 -4
- package/fesm2022/sneat-extension-debtus-ui-new-transfer-page.component-DUkdGP92.mjs.map +1 -0
- package/fesm2022/sneat-extension-debtus-ui-source-obligations-page.component-BJ6Oe79f.mjs +992 -0
- package/fesm2022/sneat-extension-debtus-ui-source-obligations-page.component-BJ6Oe79f.mjs.map +1 -0
- package/fesm2022/sneat-extension-debtus-ui-source-repayment-form-CZ7EtdUp.mjs +30 -0
- package/fesm2022/sneat-extension-debtus-ui-source-repayment-form-CZ7EtdUp.mjs.map +1 -0
- package/fesm2022/sneat-extension-debtus-ui-transfer-details-page.component-BSDIDPAb.mjs +254 -0
- package/fesm2022/sneat-extension-debtus-ui-transfer-details-page.component-BSDIDPAb.mjs.map +1 -0
- package/fesm2022/sneat-extension-debtus-ui.mjs +153 -6
- package/fesm2022/sneat-extension-debtus-ui.mjs.map +1 -1
- package/package.json +7 -4
- package/types/sneat-extension-debtus-ui.d.ts +31 -2
- package/fesm2022/sneat-extension-debtus-ui-new-transfer-page.component-YaGgYqKB.mjs.map +0 -1
- package/fesm2022/sneat-extension-debtus-ui-source-obligations-page.component-6E9_pHCq.mjs +0 -423
- package/fesm2022/sneat-extension-debtus-ui-source-obligations-page.component-6E9_pHCq.mjs.map +0 -1
- package/fesm2022/sneat-extension-debtus-ui-transfer-details-page.component-B6iQS1YJ.mjs +0 -105
- package/fesm2022/sneat-extension-debtus-ui-transfer-details-page.component-B6iQS1YJ.mjs.map +0 -1
|
@@ -65,9 +65,15 @@ class NewTransferPageComponent extends SpacePageBaseComponent {
|
|
|
65
65
|
this.debtusService
|
|
66
66
|
.getContactBalance(spaceID, contactID)
|
|
67
67
|
.pipe(first())
|
|
68
|
-
.subscribe(
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
.subscribe({
|
|
69
|
+
next: (c) => {
|
|
70
|
+
this.counterpartyName.setValue(c.title);
|
|
71
|
+
this.changeDetector.markForCheck();
|
|
72
|
+
},
|
|
73
|
+
// A Contactus contact can legitimately have no Debtus balance
|
|
74
|
+
// before its first transfer. The contact picker remains the
|
|
75
|
+
// source for its title and emits it independently.
|
|
76
|
+
error: () => undefined,
|
|
71
77
|
});
|
|
72
78
|
});
|
|
73
79
|
}
|
|
@@ -197,4 +203,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImpor
|
|
|
197
203
|
}], ctorParameters: () => [] });
|
|
198
204
|
|
|
199
205
|
export { NewTransferPageComponent };
|
|
200
|
-
//# sourceMappingURL=sneat-extension-debtus-ui-new-transfer-page.component-
|
|
206
|
+
//# sourceMappingURL=sneat-extension-debtus-ui-new-transfer-page.component-DUkdGP92.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sneat-extension-debtus-ui-new-transfer-page.component-DUkdGP92.mjs","sources":["../../../../../../libs/extensions/debtus/ui/src/lib/pages/new-transfer/new-transfer-page.component.ts","../../../../../../libs/extensions/debtus/ui/src/lib/pages/new-transfer/new-transfer-page.component.html"],"sourcesContent":["import { ChangeDetectorRef, Component, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport {\n IonBackButton,\n IonButton,\n IonButtons,\n IonCard,\n IonCardContent,\n IonContent,\n IonHeader,\n IonInput,\n IonItem,\n IonLabel,\n IonNote,\n IonSegment,\n IonSegmentButton,\n IonSelect,\n IonSelectOption,\n IonSpinner,\n IonTextarea,\n IonTitle,\n IonToolbar,\n ToastController,\n} from '@ionic/angular';\nimport { IContactContext } from '@sneat/extension-contactus-contract';\nimport { ContactInputComponent } from '@sneat/extension-contactus-ui';\nimport {\n CurrencyCode,\n DEBTUS_SERVICE,\n DebtDirection,\n ICreateTransferRequest,\n} from '@sneat/extension-debtus-contract';\nimport {\n SpaceComponentBaseParams,\n SpacePageBaseComponent,\n} from '@sneat/space-components';\nimport { SpaceServiceModule } from '@sneat/space-services';\nimport { ClassName } from '@sneat/ui';\nimport { filter, first, startWith } from 'rxjs';\n\n// Create transfer — the primary write flow. Mirrors the bot's lend/borrow\n// wizard: direction, counterparty (a contactus space contact), amount +\n// currency, optional note. Reuses the contactus `sneat-contact-input` picker\n// so the counterparty is a real space contact, not a debtus-private person.\n@Component({\n selector: 'sneat-debtus-new-transfer-page',\n templateUrl: './new-transfer-page.component.html',\n imports: [\n ReactiveFormsModule,\n IonHeader,\n IonToolbar,\n IonButtons,\n IonBackButton,\n IonTitle,\n IonContent,\n IonCard,\n IonCardContent,\n IonItem,\n IonLabel,\n IonInput,\n IonTextarea,\n IonSelect,\n IonSelectOption,\n IonSegment,\n IonSegmentButton,\n IonButton,\n IonNote,\n IonSpinner,\n ContactInputComponent,\n SpaceServiceModule,\n ],\n providers: [\n { provide: ClassName, useValue: 'NewTransferPageComponent' },\n SpaceComponentBaseParams,\n ],\n})\nexport class NewTransferPageComponent extends SpacePageBaseComponent {\n private readonly debtusService = inject(DEBTUS_SERVICE);\n private readonly changeDetector = inject(ChangeDetectorRef);\n private readonly toastController = inject(ToastController);\n\n protected readonly $submitting = signal(false);\n protected readonly $pickedContact = signal<IContactContext | undefined>(\n undefined,\n );\n /** Set when arriving from a contact detail page (?contactID=…). */\n protected prefilledContactID?: string;\n\n protected readonly direction = new FormControl<DebtDirection>('lend', {\n nonNullable: true,\n });\n protected readonly currency = new FormControl<CurrencyCode>('EUR', {\n nonNullable: true,\n });\n protected readonly amount = new FormControl<number | null>(null, [\n Validators.required,\n Validators.min(0.01),\n ]);\n protected readonly counterpartyName = new FormControl<string>('', {\n nonNullable: true,\n });\n protected readonly note = new FormControl<string>('', { nonNullable: true });\n\n protected readonly form = new FormGroup({\n direction: this.direction,\n currency: this.currency,\n amount: this.amount,\n counterpartyName: this.counterpartyName,\n note: this.note,\n });\n\n protected readonly currencies: CurrencyCode[] = ['EUR', 'USD'];\n\n constructor() {\n super();\n this.$defaultBackUrlSpacePath.set('debts');\n this.route.queryParamMap.pipe(first(), takeUntilDestroyed()).subscribe({\n next: (params) => {\n const dir = params.get('direction');\n if (dir === 'lend' || dir === 'borrow') {\n this.direction.setValue(dir);\n }\n const contactID = params.get('contactID');\n if (contactID) {\n this.prefilledContactID = contactID;\n // Prefill the name field from the known balance so the user sees who\n // they're recording against even before the contactus picker loads.\n this.spaceIDChanged$.pipe(\n startWith(this.$spaceID()),\n filter((spaceID): spaceID is string => !!spaceID),\n first(),\n ).subscribe((spaceID) => {\n this.debtusService\n .getContactBalance(spaceID, contactID)\n .pipe(first())\n .subscribe({\n next: (c) => {\n this.counterpartyName.setValue(c.title);\n this.changeDetector.markForCheck();\n },\n // A Contactus contact can legitimately have no Debtus balance\n // before its first transfer. The contact picker remains the\n // source for its title and emits it independently.\n error: () => undefined,\n });\n });\n }\n },\n });\n }\n\n protected onContactChanged(contact: IContactContext | undefined): void {\n this.$pickedContact.set(contact);\n if (contact) {\n // A picked contact supersedes a typed name / prefilled id.\n this.prefilledContactID = undefined;\n this.counterpartyName.setValue(contact.brief?.title ?? '');\n }\n }\n\n private resolveCounterparty(): { contactID: string; title: string } | null {\n const picked = this.$pickedContact();\n if (picked) {\n return { contactID: picked.id, title: picked.brief?.title ?? picked.id };\n }\n if (this.prefilledContactID) {\n return {\n contactID: this.prefilledContactID,\n title: this.counterpartyName.value,\n };\n }\n // Fable refactoring: the \"new counterparty by name\" path is disabled —\n // the assumption that \"the backend create flow resolves/creates it\" was\n // wrong: POST create-transfer validation requires toContactID/fromContactID\n // (facade4debtus CreateTransferRequest.Validate), so an empty contactID\n // always 400s. Until a create-contact-then-transfer flow is wired, users\n // must pick an existing space contact (the picker above supports adding\n // one). Original branch kept per the no-delete policy:\n // const name = this.counterpartyName.value.trim();\n // if (name) {\n // // New counterparty by name (mirrors the bot's \"new counterparty\"\n // // step). No contactID yet — the backend create flow\n // // resolves/creates it.\n // return { contactID: '', title: name };\n // }\n return null;\n }\n\n protected submit(): void {\n this.form.markAllAsTouched();\n const amount = this.amount.value;\n if (!amount || amount <= 0) {\n return;\n }\n const counterparty = this.resolveCounterparty();\n if (!counterparty) {\n this.showToast(\n 'Pick a counterparty contact. To record against someone new, add them as a space contact first.',\n 'danger',\n );\n return;\n }\n const spaceID = this.$spaceID();\n if (!spaceID) {\n return;\n }\n const request: ICreateTransferRequest = {\n spaceID,\n direction: this.direction.value,\n amount: { currency: this.currency.value, value: amount },\n contactID: counterparty.contactID,\n contactTitle: counterparty.title,\n note: this.note.value.trim() || undefined,\n counterpartySpaceID: this.$pickedContact()?.space?.id,\n };\n\n this.$submitting.set(true);\n this.debtusService.createTransfer(request).subscribe({\n next: (resp) => {\n this.$submitting.set(false);\n // Go to the persisted transfer's detail and replace the filled form in\n // history. Router state avoids an immediate duplicate read; a reload\n // retrieves the same transfer through the Debtus API.\n this.spaceNav.navigateForwardToSpacePage(\n this.space,\n `transfer/${resp.transfer.id}`,\n { replaceUrl: true, state: { transfer: resp.transfer } },\n );\n },\n error: (err) => {\n this.$submitting.set(false);\n this.errorLogger.logError(err, 'Failed to create transfer', {\n show: false,\n });\n this.showToast('Failed to record transfer. Please try again.', 'danger');\n },\n });\n }\n\n private async showToast(message: string, color: string): Promise<void> {\n const toast = await this.toastController.create({\n message,\n duration: 3000,\n color,\n });\n await toast.present();\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>New transfer</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"cardy\">\n <form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\n <ion-card>\n <ion-card-content>\n <ion-segment [formControl]=\"direction\">\n <ion-segment-button value=\"lend\">\n <ion-label>I lent</ion-label>\n </ion-segment-button>\n <ion-segment-button value=\"borrow\">\n <ion-label>I borrowed</ion-label>\n </ion-segment-button>\n </ion-segment>\n <ion-note class=\"ion-padding-start\" color=\"medium\">\n {{\n direction.value === 'lend'\n ? 'You gave money — they owe you.'\n : 'You got money — you owe them.'\n }}\n </ion-note>\n </ion-card-content>\n </ion-card>\n\n <ion-card>\n <ion-card-content>\n <!-- Reuse the contactus space-contact picker. The counterparty is a\n real contactus contact, not a debtus-private person. -->\n <sneat-contact-input\n [space]=\"space\"\n label=\"Counterparty\"\n [canChangeContact]=\"true\"\n (contactChange)=\"onContactChanged($event)\"\n />\n @if (prefilledContactID) {\n <ion-note class=\"ion-padding-start\" color=\"medium\">\n Recording against\n {{ counterpartyName.value || prefilledContactID }}\n </ion-note>\n }\n <!-- Fable refactoring: the \"Or new counterparty name\" free-text input\n is disabled — a name-only counterparty always 400s server-side\n (POST create-transfer requires a real contact id; see\n resolveCounterparty() in the component). Re-enable once a\n create-contact-then-transfer flow exists. Kept per the no-delete\n policy:\n <ion-item>\n <ion-label position=\"stacked\">\n Or new counterparty name\n </ion-label>\n <ion-input\n [formControl]=\"counterpartyName\"\n placeholder=\"e.g. Alex\"\n autocapitalize=\"words\"\n />\n </ion-item>\n -->\n </ion-card-content>\n </ion-card>\n\n <ion-card>\n <ion-card-content>\n <ion-item>\n <ion-label>Currency</ion-label>\n <ion-select [formControl]=\"currency\" interface=\"popover\">\n @for (c of currencies; track c) {\n <ion-select-option [value]=\"c\">{{ c }}</ion-select-option>\n }\n </ion-select>\n </ion-item>\n <ion-item>\n <ion-label position=\"stacked\">Amount</ion-label>\n <ion-input\n type=\"number\"\n inputmode=\"decimal\"\n [formControl]=\"amount\"\n placeholder=\"0.00\"\n />\n </ion-item>\n @if (amount.touched && amount.invalid) {\n <ion-note color=\"danger\" class=\"ion-padding-start\">\n Enter an amount greater than zero.\n </ion-note>\n }\n <ion-item>\n <ion-label position=\"stacked\">Note (optional)</ion-label>\n <ion-textarea\n [formControl]=\"note\"\n placeholder=\"What is it for?\"\n [autoGrow]=\"true\"\n />\n </ion-item>\n </ion-card-content>\n </ion-card>\n\n <div class=\"ion-padding\">\n <ion-button\n expand=\"block\"\n type=\"submit\"\n [disabled]=\"$submitting() || form.invalid\"\n >\n @if ($submitting()) {\n <ion-spinner name=\"dots\" slot=\"start\" />\n Saving…\n } @else {\n Record transfer\n }\n </ion-button>\n </div>\n </form>\n</ion-content>\n"],"names":[],"mappings":"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"}
|