Compare commits

...
5 Commits
60 changed files with 212 additions and 180 deletions
+14 -3
View File
@@ -1,13 +1,24 @@
{
// Use WSL paths + Poetry venv interpreter
"python.defaultInterpreterPath": "${workspaceFolder}/brewman/.venv/bin/python",
"python.defaultInterpreterPath": "/brewman/.venv/bin/python",
"python.terminal.useEnvFile": true,
"python.venvFolders": [
"barker/.venv",
"frank/.venv",
".venv"
],
"python.venvPath": "${workspaceFolder}/barker",
"python.terminal.activateEnvironment": true,
// Quality-of-life
// Quality-of-life
/* --- Pylance: keep IntelliSense, disable type checking --- */
// "python.analysis.typeCheckingMode": "off",
// "python.analysis.diagnosticMode": "openFilesOnly",
"python.analysis.typeCheckingMode": "basic",
"python.analysis.extraPaths": [
"${workspaceFolder}/brewman",
"./brewman"
],
"python.autoComplete.extraPaths": [
"${workspaceFolder}/brewman",
"./brewman"
],
// Ruff (you have ruff installed via poetry)
+1 -1
View File
@@ -1 +1 @@
__version__ = "15.2.4"
__version__ = "15.2.6"
+1 -1
View File
@@ -1,6 +1,6 @@
[project]
name = "brewman"
version = "15.2.4"
version = "15.2.6"
description = "Accounting plus inventory management for a restaurant."
requires-python = ">=3.14"
authors = [{ name = "tanshu", email = "git@tanshu.com" }]
+1 -1
View File
@@ -211,7 +211,7 @@ wheels = [
[[package]]
name = "brewman"
version = "15.2.4"
version = "15.2.6"
source = { editable = "." }
dependencies = [
{ name = "alembic" },
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "overlord",
"version": "15.2.4",
"version": "15.2.6",
"scripts": {
"ng": "ng",
"start": "ng serve",
+2 -8
View File
@@ -10,7 +10,7 @@ import { MomentDateAdapter } from '@angular/material-moment-adapter';
import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core';
import { MAT_SNACK_BAR_DEFAULT_OPTIONS } from '@angular/material/snack-bar';
import { BrowserModule } from '@angular/platform-browser';
import { provideRouter, withComponentInputBinding, withRouterConfig } from '@angular/router';
import { provideRouter, withComponentInputBinding } from '@angular/router';
import { dateFormat } from './app.environment';
import { routes } from './app.routes';
@@ -33,13 +33,7 @@ export const appConfig: ApplicationConfig = {
...(isDevMode() ? [delayInterceptor] : []),
]),
),
provideRouter(
routes,
withRouterConfig({
onSameUrlNavigation: 'reload',
}),
withComponentInputBinding(),
),
provideRouter(routes, withComponentInputBinding()),
{ provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] },
{ provide: MAT_DATE_FORMATS, useValue: dateFormat },
{ provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, useValue: { duration: 3000 } },
+1 -1
View File
@@ -1,6 +1,6 @@
export const environment = {
ACCESS_TOKEN_REFRESH_MINUTES: 10, // refresh token 10 minutes before expiry
version: '15.2.4',
version: '15.2.6',
title: 'HnG / TGB',
};
@@ -99,7 +99,11 @@ export class AttendanceComponent {
show() {
const date = moment(this.model().date).format('DD-MMM-YYYY');
this.router.navigate(['/attendance', date]);
if (this.date() === date) {
this.infoResource.reload();
} else {
this.router.navigate(['/attendance', date]);
}
}
save() {
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Attendance',
},
runGuardsAndResolvers: 'always',
},
{
path: ':date',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Attendance',
},
runGuardsAndResolvers: 'always',
},
];
@@ -112,7 +112,11 @@ export class BalanceSheetComponent {
show() {
const date = this.getDate();
this.router.navigate(['balance-sheet', date]);
if (this.date() === date) {
this.infoResource.reload();
} else {
this.router.navigate(['balance-sheet', date]);
}
}
getDate(): string {
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Balance Sheet',
},
runGuardsAndResolvers: 'always',
},
{
path: ':date',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Balance Sheet',
},
runGuardsAndResolvers: 'always',
},
];
@@ -11,6 +11,5 @@ export const routes: Routes = [
data: {
permission: 'Product Ledger',
},
runGuardsAndResolvers: 'always',
},
];
@@ -105,12 +105,16 @@ export class CashFlowComponent {
show() {
const info = this.getInfo();
this.router.navigate(['cash-flow'], {
queryParams: {
startDate: info.startDate,
finishDate: info.finishDate,
},
});
if (this.startDate() === info.startDate && this.finishDate() === info.finishDate) {
this.infoResource.reload();
} else {
this.router.navigate(['cash-flow'], {
queryParams: {
startDate: info.startDate,
finishDate: info.finishDate,
},
});
}
}
getInfo(): CashFlow {
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Cash Flow',
},
runGuardsAndResolvers: 'always',
},
{
path: ':id',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Cash Flow',
},
runGuardsAndResolvers: 'always',
},
];
@@ -151,11 +151,15 @@ export class ClosingStockComponent {
return;
}
const info = this.getInfo();
this.router.navigate(['closing-stock', info.date], {
queryParams: {
d: info.costCentre.id,
},
});
if (this.date() === info.date && this.d() === info.costCentre.id) {
this.infoResource.reload();
} else {
this.router.navigate(['closing-stock', info.date], {
queryParams: {
d: info.costCentre.id,
},
});
}
}
save() {
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Closing Stock',
},
runGuardsAndResolvers: 'always',
},
{
path: ':date',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Closing Stock',
},
runGuardsAndResolvers: 'always',
},
];
+10 -6
View File
@@ -127,12 +127,16 @@ export class DaybookComponent {
show() {
const l = this.prepareSubmit();
this.router.navigate(['daybook'], {
queryParams: {
startDate: l.startDate,
finishDate: l.finishDate,
},
});
if (this.startDate() === l.startDate && this.finishDate() === l.finishDate) {
this.infoResource.reload();
} else {
this.router.navigate(['daybook'], {
queryParams: {
startDate: l.startDate,
finishDate: l.finishDate,
},
});
}
}
prepareSubmit(): Daybook {
@@ -11,6 +11,5 @@ export const routes: Routes = [
data: {
permission: 'Daybook',
},
runGuardsAndResolvers: 'always',
},
];
@@ -126,12 +126,20 @@ export class EmployeeAttendanceComponent {
currentInfo.employee =
typeof formValue.employee !== 'string' && formValue.employee ? formValue.employee : undefined;
if (currentInfo.employee) {
this.router.navigate(['/employee-attendance', currentInfo.employee.id], {
queryParams: {
startDate: currentInfo.startDate,
finishDate: currentInfo.finishDate,
},
});
if (
this.id() === currentInfo.employee.id &&
this.startDate() === currentInfo.startDate &&
this.finishDate() === currentInfo.finishDate
) {
this.infoResource.reload();
} else {
this.router.navigate(['/employee-attendance', currentInfo.employee.id], {
queryParams: {
startDate: currentInfo.startDate,
finishDate: currentInfo.finishDate,
},
});
}
}
}
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Attendance',
},
runGuardsAndResolvers: 'always',
},
{
path: ':id',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Attendance',
},
runGuardsAndResolvers: 'always',
},
];
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'employee-benefit',
},
runGuardsAndResolvers: 'always',
},
{
path: ':id',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'employee-benefit',
},
runGuardsAndResolvers: 'always',
},
];
@@ -11,6 +11,5 @@ export const routes: Routes = [
data: {
permission: 'employee-benefit',
},
runGuardsAndResolvers: 'always',
},
];
@@ -11,6 +11,5 @@ export const routes: Routes = [
data: {
permission: 'Ledger',
},
runGuardsAndResolvers: 'always',
},
];
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'incentive',
},
runGuardsAndResolvers: 'always',
},
{
path: ':id',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'incentive',
},
runGuardsAndResolvers: 'always',
},
];
-2
View File
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Issue',
},
runGuardsAndResolvers: 'always',
},
{
path: ':id',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Issue',
},
runGuardsAndResolvers: 'always',
},
];
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Journal',
},
runGuardsAndResolvers: 'paramsChange',
},
{
path: ':id',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Journal',
},
runGuardsAndResolvers: 'paramsChange',
},
];
+7 -1
View File
@@ -260,7 +260,13 @@ export class LedgerComponent {
show() {
const info = this.getInfo();
if (info.account) {
if (
this.id() === info.account?.id &&
this.startDate() === info.startDate &&
this.finishDate() === info.finishDate
) {
this.infoResource.reload();
} else if (info.account) {
this.router.navigate(['ledger', info.account.id], {
queryParams: {
startDate: info.startDate,
-2
View File
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Ledger',
},
runGuardsAndResolvers: 'always',
},
{
path: ':id',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Ledger',
},
runGuardsAndResolvers: 'always',
},
];
@@ -111,7 +111,11 @@ export class MozimoDailyRegisterComponent {
show() {
const date = moment(this.model().date).format('DD-MMM-YYYY');
this.router.navigate(['/mozimo-daily-register', date]);
if (this.date() === date) {
this.infoResource.reload();
} else {
this.router.navigate(['/mozimo-daily-register', date]);
}
}
save() {
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Product Ledger',
},
runGuardsAndResolvers: 'always',
},
{
path: ':date',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Product Ledger',
},
runGuardsAndResolvers: 'always',
},
];
@@ -136,12 +136,20 @@ export class MozimoProductRegisterComponent {
show() {
const info = this.getInfo();
if (info.product) {
this.router.navigate(['mozimo-product-register', info.product.id], {
queryParams: {
startDate: info.startDate,
finishDate: info.finishDate,
},
});
if (
this.id() === info.product.id &&
this.startDate() === info.startDate &&
this.finishDate() === info.finishDate
) {
this.infoResource.reload();
} else {
this.router.navigate(['mozimo-product-register', info.product.id], {
queryParams: {
startDate: info.startDate,
finishDate: info.finishDate,
},
});
}
}
}
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Product Ledger',
},
runGuardsAndResolvers: 'always',
},
{
path: ':id',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Product Ledger',
},
runGuardsAndResolvers: 'always',
},
];
@@ -117,12 +117,16 @@ export class NetTransactionsComponent {
show() {
const l = this.prepareSubmit();
this.router.navigate(['net-transactions'], {
queryParams: {
startDate: l.startDate,
finishDate: l.finishDate,
},
});
if (this.startDate() === l.startDate && this.finishDate() === l.finishDate) {
this.infoResource.reload();
} else {
this.router.navigate(['net-transactions'], {
queryParams: {
startDate: l.startDate,
finishDate: l.finishDate,
},
});
}
}
prepareSubmit(): NetTransactions {
@@ -11,6 +11,5 @@ export const routes: Routes = [
data: {
permission: 'Net Transactions',
},
runGuardsAndResolvers: 'always',
},
];
@@ -11,6 +11,5 @@ export const routes: Routes = [
data: {
permission: 'Product Ledger',
},
runGuardsAndResolvers: 'always',
},
];
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'journal',
},
runGuardsAndResolvers: 'paramsChange',
},
{
path: ':id',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'journal',
},
runGuardsAndResolvers: 'paramsChange',
},
];
@@ -211,12 +211,20 @@ export class ProductLedgerComponent {
show() {
const info = this.getInfo();
if (info.product) {
this.router.navigate(['product-ledger', info.product.id], {
queryParams: {
startDate: info.startDate,
finishDate: info.finishDate,
},
});
if (
this.id() === info.product.id &&
this.startDate() === info.startDate &&
this.finishDate() === info.finishDate
) {
this.infoResource.reload();
} else {
this.router.navigate(['product-ledger', info.product.id], {
queryParams: {
startDate: info.startDate,
finishDate: info.finishDate,
},
});
}
}
}
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Product Ledger',
},
runGuardsAndResolvers: 'always',
},
{
path: ':id',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Product Ledger',
},
runGuardsAndResolvers: 'always',
},
];
@@ -117,12 +117,16 @@ export class ProfitLossComponent {
show() {
const info = this.getInfo();
this.router.navigate(['profit-loss'], {
queryParams: {
startDate: info.startDate,
finishDate: info.finishDate,
},
});
if (this.startDate() === info.startDate && this.finishDate() === info.finishDate) {
this.infoResource.reload();
} else {
this.router.navigate(['profit-loss'], {
queryParams: {
startDate: info.startDate,
finishDate: info.finishDate,
},
});
}
}
getInfo(): ProfitLoss {
@@ -11,6 +11,5 @@ export const routes: Routes = [
data: {
permission: 'Profit & Loss',
},
runGuardsAndResolvers: 'always',
},
];
@@ -121,12 +121,16 @@ export class PurchaseEntriesComponent {
show() {
const l = this.prepareSubmit();
this.router.navigate(['purchase-entries'], {
queryParams: {
startDate: l.startDate,
finishDate: l.finishDate,
},
});
if (this.startDate() === l.startDate && this.finishDate() === l.finishDate) {
this.resource.reload();
} else {
this.router.navigate(['purchase-entries'], {
queryParams: {
startDate: l.startDate,
finishDate: l.finishDate,
},
});
}
}
prepareSubmit(): PurchaseEntries {
@@ -11,6 +11,5 @@ export const routes: Routes = [
data: {
permission: 'Purchase Entries',
},
runGuardsAndResolvers: 'always',
},
];
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Purchase Return',
},
runGuardsAndResolvers: 'always',
},
{
path: ':id',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Purchase Return',
},
runGuardsAndResolvers: 'always',
},
];
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Purchase',
},
runGuardsAndResolvers: 'always',
},
{
path: ':id',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Purchase',
},
runGuardsAndResolvers: 'always',
},
];
@@ -115,12 +115,16 @@ export class PurchasesComponent {
show() {
const l = this.prepareSubmit();
this.router.navigate(['purchases'], {
queryParams: {
startDate: l.startDate,
finishDate: l.finishDate,
},
});
if (this.startDate() === l.startDate && this.finishDate() === l.finishDate) {
this.resource.reload();
} else {
this.router.navigate(['purchases'], {
queryParams: {
startDate: l.startDate,
finishDate: l.finishDate,
},
});
}
}
prepareSubmit(): Purchases {
@@ -11,6 +11,5 @@ export const routes: Routes = [
data: {
permission: 'Purchases',
},
runGuardsAndResolvers: 'always',
},
];
@@ -131,12 +131,16 @@ export class RawMaterialCostComponent {
show() {
const model = this.prepareSubmit();
this.router.navigate(['raw-material-cost'], {
queryParams: {
startDate: model.startDate,
finishDate: model.finishDate,
},
});
if (!this.id() && this.startDate() === model.startDate && this.finishDate() === model.finishDate) {
this.infoResource.reload();
} else {
this.router.navigate(['raw-material-cost'], {
queryParams: {
startDate: model.startDate,
finishDate: model.finishDate,
},
});
}
}
prepareSubmit(): RawMaterialCost {
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Raw Material Cost',
},
runGuardsAndResolvers: 'always',
},
{
path: ':id',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Raw Material Cost',
},
runGuardsAndResolvers: 'always',
},
];
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'journal',
},
runGuardsAndResolvers: 'paramsChange',
},
{
path: ':id',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'journal',
},
runGuardsAndResolvers: 'paramsChange',
},
];
@@ -16,16 +16,16 @@
<div class="row-container">
<mat-form-field class="flex-auto">
<mat-select [formField]="form.period">
@for (p of periods(); track p.id) {
<mat-option [value]="p"> {{ p.validFrom }} to {{ p.validTill }} </mat-option>
@for (p of periods(); track p) {
<mat-option [value]="p.id"> {{ p.validFrom }} to {{ p.validTill }} </mat-option>
}
</mat-select>
</mat-form-field>
<mat-form-field class="flex-auto">
<mat-label>Product Type</mat-label>
<mat-select [formField]="form.productGroup" (selectionChange)="filterProductGroup($event.value)">
<mat-option>-- All Products --</mat-option>
@for (mc of productGroups(); track mc.id) {
<mat-select [formField]="form.productGroup">
<mat-option [value]="null">-- All Products --</mat-option>
@for (mc of productGroups(); track mc) {
<mat-option [value]="mc.id">
{{ mc.name }}
</mat-option>
@@ -1,4 +1,4 @@
import { Component, inject, input, computed, effect, signal } from '@angular/core';
import { Component, inject, input, computed, effect, signal, linkedSignal } from '@angular/core';
import { form as createForm, FormField, FormRoot } from '@angular/forms/signals';
import { MatButtonModule } from '@angular/material/button';
import { MatOptionModule } from '@angular/material/core';
@@ -11,7 +11,6 @@ import { MatSortModule, Sort } from '@angular/material/sort';
import { MatTableModule } from '@angular/material/table';
import { Router, RouterModule } from '@angular/router';
import { ProductGroup } from '../../core/product-group';
import { Period } from '../../period/period';
import { PeriodService } from '../../period/period.service';
import { ProductGroupService } from '../../product-group/product-group.service';
@@ -19,6 +18,10 @@ import { ErrorStateComponent } from '../../shared/error-state/error-state.compon
import { SkeletonLoaderComponent } from '../../shared/skeleton-loader/skeleton-loader.component';
import { RecipeService } from '../recipe.service';
export interface RecipeListFormData {
period: string | null;
productGroup: string | null;
}
@Component({
selector: 'app-recipe-list',
templateUrl: './recipe-list.component.html',
@@ -52,31 +55,34 @@ export class RecipeListComponent {
sortActive = signal('');
sortDirection = signal('');
p = input<string>();
model = signal({
period: null as Period | null,
productGroup: null as ProductGroup | string | null,
});
form = createForm(this.model);
p = input('', { transform: (v: string | null | undefined) => v ?? null });
periodsResource = this.periodSer.list();
periods = computed(() => this.periodsResource.value() ?? []);
model = linkedSignal<string | null, RecipeListFormData>({
source: () => this.p(),
computation: (period) => ({
period: period,
productGroup: null,
}),
});
form = createForm(this.model);
productGroupsResource = this.productGroupSer.list();
productGroups = computed(() => this.productGroupsResource.value() ?? []);
periodFilter = computed(() => this.p() || '');
resource = this.ser.list(this.periodFilter);
resource = this.ser.list(this.p);
productGroupFilter = computed(() => this.model().productGroup ?? null);
info = computed(() => this.resource.value() ?? []);
sortedList = computed(() => {
let data = this.info() ?? [];
const pg = this.model().productGroup;
const pg = this.productGroupFilter();
if (pg) {
const pgId = typeof pg === 'string' ? pg : pg.id;
data = data.filter((r) => r.productGroupId === pgId);
data = data.filter((r) => r.productGroupId === pg);
}
const active = this.sortActive();
@@ -118,18 +124,13 @@ export class RecipeListComponent {
const x = this.model().period;
if (!x) return;
this.router.navigate([], {
queryParams: { p: x.id },
queryParams: { p: x },
replaceUrl: true,
queryParamsHandling: 'merge',
});
this.period = x;
});
}
filterProductGroup(val: string) {
this.model.update((m) => ({ ...m, productGroup: val }));
}
handlePageEvent(e: PageEvent) {
this.pageSize.set(e.pageSize);
this.pageIndex.set(e.pageIndex);
-1
View File
@@ -12,7 +12,6 @@ export const routes: Routes = [
data: {
permission: 'Recipes',
},
runGuardsAndResolvers: 'paramsOrQueryParamsChange',
},
{
path: 'new',
@@ -11,6 +11,5 @@ export const routes: Routes = [
data: {
permission: 'Maintenance', // 'Lock Date'
},
runGuardsAndResolvers: 'always',
},
];
@@ -114,12 +114,16 @@ export class StockMovementComponent {
show() {
const l = this.prepareSubmit();
this.router.navigate(['stock-movement'], {
queryParams: {
startDate: l.startDate,
finishDate: l.finishDate,
},
});
if (this.startDate() === l.startDate && this.finishDate() === l.finishDate) {
this.resource.reload();
} else {
this.router.navigate(['stock-movement'], {
queryParams: {
startDate: l.startDate,
finishDate: l.finishDate,
},
});
}
}
prepareSubmit(): StockMovement {
@@ -11,6 +11,5 @@ export const routes: Routes = [
data: {
permission: 'Stock Movement',
},
runGuardsAndResolvers: 'always',
},
];
@@ -8,7 +8,7 @@
<mat-form-field class="flex-auto basis-30">
<mat-label>Product Group</mat-label>
<mat-select [formField]="form.productGroup">
<mat-option>-- All Products --</mat-option>
<mat-option [value]="null">-- All Products --</mat-option>
@for (pg of productGroups(); track pg) {
<mat-option [value]="pg.id">
{{ pg.name }}
@@ -9,7 +9,6 @@ import { MatSelectModule } from '@angular/material/select';
import { MatTableModule } from '@angular/material/table';
import { ActivatedRoute, Router, RouterLink } from '@angular/router';
import { Product, StockKeepingUnit } from '../../core/product';
import { ProductGroupService } from '../../product-group/product-group.service';
import { ErrorStateComponent } from '../../shared/error-state/error-state.component';
import { SkeletonLoaderComponent } from '../../shared/skeleton-loader/skeleton-loader.component';
@@ -18,7 +17,7 @@ import { TemporalProductService } from '../temporal-product.service';
export interface TemporalProductListFormData {
filter: string;
productGroup: Product | StockKeepingUnit | string | null;
productGroup: string | null;
}
@Component({
@@ -66,16 +65,11 @@ export class TemporalProductListComponent {
form = createForm(this.formModel);
filterSignal = computed(() => this.formModel().filter);
debouncedFilter = debounced(this.filterSignal, 150);
productGroupFilter = computed(() => this.formModel().productGroup ?? null);
filteredList = computed(() => {
const data = this.list();
const search = this.debouncedFilter.value() ?? '';
const productGroup = this.formModel().productGroup;
const groupId =
typeof productGroup === 'string'
? productGroup
: productGroup && 'id' in productGroup
? (productGroup.id ?? '')
: '';
const productGroup = this.productGroupFilter();
const tokens = search.trim().toLowerCase().split(/\s+/).filter(Boolean);
@@ -97,7 +91,7 @@ export class TemporalProductListComponent {
}),
);
const matchesProductGroup = !groupId || products.some((k) => (k.productGroup?.id ?? '') === groupId);
const matchesProductGroup = !productGroup || products.some((k) => k.productGroup?.id === productGroup);
return matchesSearch && matchesProductGroup;
});
});
@@ -109,7 +109,11 @@ export class TrialBalanceComponent {
show() {
const info = this.getInfo();
this.router.navigate(['trial-balance', info.date]);
if (this.date() === info.date) {
this.resource.reload();
} else {
this.router.navigate(['trial-balance', info.date]);
}
}
getInfo(): TrialBalance {
@@ -11,7 +11,6 @@ export const routes: Routes = [
data: {
permission: 'Trial Balance',
},
runGuardsAndResolvers: 'always',
},
{
path: ':date',
@@ -20,6 +19,5 @@ export const routes: Routes = [
data: {
permission: 'Trial Balance',
},
runGuardsAndResolvers: 'always',
},
];
+2 -2
View File
@@ -32,12 +32,12 @@ a
text-decoration: underline
button.mat-primary
button.mat-primary:not(:disabled)
background: var(--mat-sys-primary) !important
color: var(--mat-sys-on-primary) !important
button.mat-warn
button.mat-warn:not(:disabled)
background: var(--mat-sys-error) !important
color: var(--mat-sys-on-error) !important