import { CurrencyPipe } from '@angular/common'; import { Component, OnInit, inject } from '@angular/core'; import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatOptionModule } from '@angular/material/core'; import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; import { MatSnackBar } from '@angular/material/snack-bar'; import { MatTableModule } from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import moment from 'moment'; import { User } from '../core/user'; import { ToCsvService } from '../shared/to-csv.service'; import { CashierReport } from './cashier-report'; import { CashierReportDataSource } from './cashier-report-datasource'; import { CashierReportService } from './cashier-report.service'; @Component({ selector: 'app-cashier-report', templateUrl: './cashier-report.component.html', styleUrls: ['./cashier-report.component.sass'], imports: [ CurrencyPipe, MatButtonModule, MatDatepickerModule, MatFormFieldModule, MatIconModule, MatInputModule, MatOptionModule, MatSelectModule, MatTableModule, ReactiveFormsModule, ], }) export class CashierReportComponent implements OnInit { private route = inject(ActivatedRoute); private router = inject(Router); private toCsv = inject(ToCsvService); private snackBar = inject(MatSnackBar); private ser = inject(CashierReportService); activeCashiers: User[] = []; info: CashierReport = new CashierReport(); dataSource: CashierReportDataSource = new CashierReportDataSource(this.info.amounts); form: FormGroup<{ startDate: FormControl; finishDate: FormControl; cashier: FormControl; }>; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['name', 'amount']; constructor() { // Create form this.form = new FormGroup({ startDate: new FormControl(new Date(), { nonNullable: true }), finishDate: new FormControl(new Date(), { nonNullable: true }), cashier: new FormControl(null), }); } ngOnInit() { this.route.data.subscribe((value) => { const data = value as { cashiers: User[]; info: CashierReport }; this.activeCashiers = data.cashiers; this.info = data.info; this.form.setValue({ cashier: this.info.cashier.id ?? '', startDate: moment(this.info.startDate, 'DD-MMM-YYYY').toDate(), finishDate: moment(this.info.finishDate, 'DD-MMM-YYYY').toDate(), }); this.dataSource = new CashierReportDataSource(this.info.amounts); }); } show() { const info = this.getInfo(); const url = ['cashier-report']; if (info.cashier.id) { url.push(info.cashier.id); } this.router.navigate(url, { queryParams: { startDate: info.startDate, finishDate: info.finishDate, }, }); } print() { this.ser.print(this.info.cashier.id as string, this.info.startDate, this.info.finishDate).subscribe({ next: () => { this.snackBar.open('Successfully Printed', ''); }, error: (error) => { this.snackBar.open(error, 'Error'); }, }); } getInfo(): CashierReport { const formModel = this.form.value; return new CashierReport({ cashier: new User({ id: formModel.cashier ?? undefined }), cashiers: this.info.cashiers, startDate: moment(formModel.startDate).format('DD-MMM-YYYY'), finishDate: moment(formModel.finishDate).format('DD-MMM-YYYY'), }); } exportCsv() { const headers = { Name: 'name', Amount: 'amount', }; const csvData = new Blob([this.toCsv.toCsv(headers, this.dataSource.data)], { type: 'text/csv;charset=utf-8;', }); const link = document.createElement('a'); link.href = window.URL.createObjectURL(csvData); link.setAttribute('download', 'cashier-report.csv'); document.body.appendChild(link); link.click(); document.body.removeChild(link); } }