This commit is contained in:
2026-08-18 13:13:11 +00:00
parent 65527dcbff
commit 2a29dc9195
6 changed files with 40 additions and 39 deletions
@@ -53,7 +53,6 @@ export class VoucherService {
getFromBill(billId: Signal<string | null | undefined>): HttpResourceRef<Bill | undefined> { getFromBill(billId: Signal<string | null | undefined>): HttpResourceRef<Bill | undefined> {
return httpResource<Bill>(() => { return httpResource<Bill>(() => {
const id = billId(); const id = billId();
console.log(id);
return id ? `${url}/from-bill/${id}` : undefined; return id ? `${url}/from-bill/${id}` : undefined;
}); });
} }
@@ -1,30 +1,25 @@
import { HttpClient, httpResource, HttpResourceRef } from '@angular/common/http'; import { httpResource, HttpResourceRef } from '@angular/common/http';
import { Injectable, inject } from '@angular/core'; import { Injectable, inject, Injector } from '@angular/core';
import { Observable } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { ErrorLoggerService } from '../../core/error-logger.service';
import { DiscountItem } from './discount-item'; import { DiscountItem } from './discount-item';
const url = '/api/customer-discounts'; const url = '/api/customer-discounts';
const serviceName = 'CustomerService';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
}) })
export class CustomerDiscountsService { export class CustomerDiscountsService {
private http = inject(HttpClient); private injector = inject(Injector);
private log = inject(ErrorLoggerService);
list(id: string | undefined): HttpResourceRef<DiscountItem[] | undefined> { list(id: string | undefined): HttpResourceRef<DiscountItem[] | undefined> {
return httpResource<DiscountItem[]>(() => (id === undefined ? url : `${url}/${id}`)); return httpResource<DiscountItem[]>(() => (id === undefined ? url : `${url}/${id}`), {
injector: this.injector,
});
} }
listForDiscount(): Observable<{ name: string; discount: number; discountLimit: number }[]> { listForDiscount(): HttpResourceRef<{ name: string; discount: number; discountLimit: number }[] | undefined> {
return this.http return httpResource<{ name: string; discount: number; discountLimit: number }[]>(() => `${url}/for-discount`, {
.get<{ name: string; discount: number; discountLimit: number }[]>(`${url}/for-discount`) injector: this.injector,
.pipe(catchError(this.log.handleError(serviceName, 'list'))) as Observable< });
{ name: string; discount: number; discountLimit: number }[]
>;
} }
} }
@@ -1,6 +1,7 @@
import { CdkScrollableModule } from '@angular/cdk/scrolling'; import { CdkScrollableModule } from '@angular/cdk/scrolling';
import { PercentPipe } from '@angular/common'; import { PercentPipe } from '@angular/common';
import { Component, inject, signal, computed } from '@angular/core'; import { HttpResourceRef } from '@angular/common/http';
import { Component, inject, signal, computed, effect } from '@angular/core';
import { form, FormField } from '@angular/forms/signals'; import { form, FormField } from '@angular/forms/signals';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MAT_DIALOG_DATA, MatDialogRef, MatDialogModule } from '@angular/material/dialog'; import { MAT_DIALOG_DATA, MatDialogRef, MatDialogModule } from '@angular/material/dialog';
@@ -8,7 +9,6 @@ import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatTableModule } from '@angular/material/table'; import { MatTableModule } from '@angular/material/table';
import { round } from 'mathjs'; import { round } from 'mathjs';
import { Observable } from 'rxjs';
import { DiscountItem } from './discount-item'; import { DiscountItem } from './discount-item';
@@ -36,7 +36,7 @@ export interface DiscountFormData {
}) })
export class DiscountComponent { export class DiscountComponent {
dialogRef = inject<MatDialogRef<DiscountComponent>>(MatDialogRef); dialogRef = inject<MatDialogRef<DiscountComponent>>(MatDialogRef);
data = inject<Observable<DiscountItem[]>>(MAT_DIALOG_DATA); data = inject<HttpResourceRef<DiscountItem[] | undefined>>(MAT_DIALOG_DATA);
list = signal<DiscountItem[]>([]); list = signal<DiscountItem[]>([]);
formModel = signal<DiscountFormData>({ formModel = signal<DiscountFormData>({
@@ -50,15 +50,18 @@ export class DiscountComponent {
displayedColumns = ['name', 'discount']; displayedColumns = ['name', 'discount'];
constructor() { constructor() {
this.data.subscribe((list: DiscountItem[]) => { effect(() => {
this.list.set(list); const list = this.data.value();
this.formModel.update((f) => ({ if (list) {
...f, this.list.set(list);
discounts: list.map((x) => ({ this.formModel.update((f) => ({
name: x.name, ...f,
discount: x.discount * 100, discounts: list.map((x) => ({
})), name: x.name,
})); discount: x.discount * 100,
})),
}));
}
}); });
} }
@@ -1,7 +1,7 @@
<h2 mat-dialog-title>Tables</h2> <h2 mat-dialog-title>Tables</h2>
<mat-dialog-content> <mat-dialog-content>
<div class="tables-grid"> <div class="tables-grid">
@for (table of list | async; track table) { @for (table of list.value(); track table) {
<mat-card <mat-card
class="flex-col square-button" class="flex-col square-button"
matRipple matRipple
@@ -1,11 +1,11 @@
import { CdkScrollableModule } from '@angular/cdk/scrolling'; import { CdkScrollableModule } from '@angular/cdk/scrolling';
import { CommonModule, CurrencyPipe } from '@angular/common'; import { CommonModule, CurrencyPipe } from '@angular/common';
import { HttpResourceRef } from '@angular/common/http';
import { Component, inject } from '@angular/core'; import { Component, inject } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card'; import { MatCardModule } from '@angular/material/card';
import { MatRippleModule } from '@angular/material/core'; import { MatRippleModule } from '@angular/material/core';
import { MAT_DIALOG_DATA, MatDialogRef, MatDialogModule } from '@angular/material/dialog'; import { MAT_DIALOG_DATA, MatDialogRef, MatDialogModule } from '@angular/material/dialog';
import { Observable } from 'rxjs';
import { Table } from '../../core/table'; import { Table } from '../../core/table';
@@ -26,11 +26,11 @@ import { Table } from '../../core/table';
export class TablesDialogComponent { export class TablesDialogComponent {
dialogRef = inject<MatDialogRef<TablesDialogComponent>>(MatDialogRef); dialogRef = inject<MatDialogRef<TablesDialogComponent>>(MatDialogRef);
data = inject<{ data = inject<{
list: Observable<Table[]>; list: HttpResourceRef<Table[] | undefined>;
canChooseRunning: boolean; canChooseRunning: boolean;
}>(MAT_DIALOG_DATA); }>(MAT_DIALOG_DATA);
list: Observable<Table[]>; list: HttpResourceRef<Table[] | undefined>;
canChooseRunning: boolean; canChooseRunning: boolean;
selected: Table | null; selected: Table | null;
+11 -7
View File
@@ -1,5 +1,5 @@
import { HttpClient, HttpHeaders, httpResource, HttpResourceRef } from '@angular/common/http'; import { HttpClient, HttpHeaders, httpResource, HttpResourceRef } from '@angular/common/http';
import { Injectable, Signal, inject } from '@angular/core'; import { Injectable, Signal, inject, Injector } from '@angular/core';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { catchError } from 'rxjs/operators'; import { catchError } from 'rxjs/operators';
@@ -18,20 +18,24 @@ const serviceName = 'TableService';
export class TableService { export class TableService {
private http = inject(HttpClient); private http = inject(HttpClient);
private log = inject(ErrorLoggerService); private log = inject(ErrorLoggerService);
private injector = inject(Injector);
get(id: Signal<string | null> | string | null): HttpResourceRef<Table | undefined> { get(id: Signal<string | null> | string | null): HttpResourceRef<Table | undefined> {
return httpResource<Table>(() => { return httpResource<Table>(
const idVal = typeof id === 'function' ? id() : id; () => {
return idVal === null || idVal === undefined ? url : `${url}/${idVal}`; const idVal = typeof id === 'function' ? id() : id;
}); return idVal === null || idVal === undefined ? url : `${url}/${idVal}`;
},
{ injector: this.injector },
);
} }
list(): HttpResourceRef<Table[] | undefined> { list(): HttpResourceRef<Table[] | undefined> {
return httpResource<Table[]>(() => `${url}/list`); return httpResource<Table[]>(() => `${url}/list`, { injector: this.injector });
} }
running(): HttpResourceRef<Table[] | undefined> { running(): HttpResourceRef<Table[] | undefined> {
return httpResource<Table[]>(() => `${url}/running`); return httpResource<Table[]>(() => `${url}/running`, { injector: this.injector });
} }
save(tables: Table): Observable<Table> { save(tables: Table): Observable<Table> {