feat : display data in middle section
This commit is contained in:
parent
c1405df5f9
commit
2fe155391b
@ -49,8 +49,20 @@ div[style*="background-color: black"] .custom-cell {
|
|||||||
background-color: #f8f9fa;
|
background-color: #f8f9fa;
|
||||||
border-radius: 0.3rem;
|
border-radius: 0.3rem;
|
||||||
border: 1px solid rgba(3, 27, 69, 0.678);
|
border: 1px solid rgba(3, 27, 69, 0.678);
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.custom-cell-new-1,
|
||||||
|
.custom-cell-new-2,
|
||||||
|
.custom-cell-new-3 {
|
||||||
|
height: 2.5rem;
|
||||||
|
background-color: #f8f9fa;
|
||||||
|
border-radius: 0.3rem;
|
||||||
|
border: 1px solid rgba(3, 27, 69, 0.678);
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
div[style*="background-color: black"] .custom-cell {
|
div[style*="background-color: black"] .custom-cell {
|
||||||
background-color: #343a40;
|
background-color: #343a40;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,32 +34,35 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Main Table -->
|
<!-- Main Table -->
|
||||||
<div class="main-table ">
|
<div class="main-table ">
|
||||||
<div
|
<div
|
||||||
class="p-2 rounded h-100 d-flex flex-column justify-content-between"
|
class="p-2 rounded h-100 d-flex flex-column justify-content-between"
|
||||||
style="background-color: #f1f1f1df"
|
style="background-color: #f1f1f1df"
|
||||||
>
|
>
|
||||||
<table class="table borderless-custom w-100 mb-2 table-main">
|
<table class="table borderless-custom w-100 mb-2 table-main">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col style="width: 12%" />
|
<col style="width: 12%" />
|
||||||
<col style="width: 60%" />
|
<col style="width: 60%" />
|
||||||
<col style="width: 10%" />
|
<col style="width: 10%" />
|
||||||
<col style="width: 18%" />
|
<col style="width: 18%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr *ngFor="let row of rows | slice:0:5">
|
<tr *ngFor="let row of filledRows">
|
||||||
<td class="custom-cell-new"></td>
|
<td class="custom-cell-new-1">{{ row.label }}</td>
|
||||||
<td class="custom-cell-new"></td>
|
<td class="custom-cell-new">{{ row.numbers.join(', ') }}</td>
|
||||||
<td class="custom-cell-new"></td>
|
<td class="custom-cell-new-2">{{ row.value || '' }}</td>
|
||||||
<td class="custom-cell-new"></td>
|
<td class="custom-cell-new-3">{{ row.total || '' }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<div class="buttons-custom">
|
</tbody>
|
||||||
<button class="btn btn-dark">Repeat</button>
|
</table>
|
||||||
<div class="fw-bold">Amount :</div>
|
|
||||||
</div>
|
<div class="buttons-custom">
|
||||||
|
<button class="btn btn-dark">Repeat</button>
|
||||||
|
<div class="fw-bold">Amount :</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,21 +1,7 @@
|
|||||||
// import { Component } from '@angular/core';
|
import { Component, Input, OnInit, OnDestroy } from '@angular/core';
|
||||||
// import { CommonModule } from '@angular/common'; // ✅ Import this
|
|
||||||
|
|
||||||
// @Component({
|
|
||||||
// selector: 'app-middle-section',
|
|
||||||
// standalone: true,
|
|
||||||
// imports: [CommonModule], // ✅ Add CommonModule here
|
|
||||||
// templateUrl: './middle-section.component.html',
|
|
||||||
// styleUrls: ['./middle-section.component.css']
|
|
||||||
// })
|
|
||||||
// export class MiddleSectionComponent {
|
|
||||||
// rows = Array.from({ length: 5 });
|
|
||||||
// summaryRows = Array.from({ length: 4 }); // 4 empty rows for now
|
|
||||||
|
|
||||||
// }
|
|
||||||
|
|
||||||
import { Component, Input } from '@angular/core';
|
|
||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
|
import { SelectionService, SelectionData } from '../selection.service/selection.service';
|
||||||
|
import { Subscription } from 'rxjs';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-middle-section',
|
selector: 'app-middle-section',
|
||||||
@ -24,9 +10,50 @@ import { CommonModule } from '@angular/common';
|
|||||||
templateUrl: './middle-section.component.html',
|
templateUrl: './middle-section.component.html',
|
||||||
styleUrls: ['./middle-section.component.css']
|
styleUrls: ['./middle-section.component.css']
|
||||||
})
|
})
|
||||||
export class MiddleSectionComponent {
|
export class MiddleSectionComponent implements OnInit, OnDestroy {
|
||||||
@Input() containerHeight: string = '50vh'; // default for home screen
|
@Input() containerHeight: string = '50vh';
|
||||||
|
summaryRows = Array.from({ length: 4 });
|
||||||
|
|
||||||
rows = Array.from({ length: 5 });
|
filledRows: SelectionData[] = [];
|
||||||
summaryRows = Array.from({ length: 4 }); // 4 empty rows for now
|
currentRow: SelectionData = { label: '', numbers: [], value: 0, total: 0 };
|
||||||
|
|
||||||
|
private selections: SelectionData[] = [];
|
||||||
|
private sub1!: Subscription;
|
||||||
|
private sub2!: Subscription;
|
||||||
|
|
||||||
|
constructor(private selectionService: SelectionService) {}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
// Subscription for finalized selections
|
||||||
|
this.sub1 = this.selectionService.selections$.subscribe(data => {
|
||||||
|
this.selections = data;
|
||||||
|
this.updateFilledRows(this.selections, this.currentRow);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Subscription for current in-progress row
|
||||||
|
this.sub2 = this.selectionService.currentRow$.subscribe(row => {
|
||||||
|
this.currentRow = row;
|
||||||
|
this.updateFilledRows(this.selections, row);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
updateFilledRows(saved: SelectionData[], current: SelectionData) {
|
||||||
|
const rows: SelectionData[] = [...saved];
|
||||||
|
if (rows.length < 5) rows.push(current);
|
||||||
|
|
||||||
|
const emptyCount = Math.max(5 - rows.length, 0);
|
||||||
|
const emptyRows = Array.from({ length: emptyCount }, () => ({
|
||||||
|
label: '',
|
||||||
|
numbers: [],
|
||||||
|
value: 0,
|
||||||
|
total: 0
|
||||||
|
}));
|
||||||
|
|
||||||
|
this.filledRows = [...rows, ...emptyRows].slice(0, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnDestroy() {
|
||||||
|
this.sub1.unsubscribe();
|
||||||
|
this.sub2.unsubscribe();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,47 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { BehaviorSubject } from 'rxjs';
|
||||||
|
// selection.service.ts
|
||||||
|
export interface SelectionData {
|
||||||
|
label: string;
|
||||||
|
numbers: number[];
|
||||||
|
value: number;
|
||||||
|
total: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Injectable({ providedIn: 'root' })
|
||||||
|
export class SelectionService {
|
||||||
|
private selections = new BehaviorSubject<SelectionData[]>([]);
|
||||||
|
selections$ = this.selections.asObservable();
|
||||||
|
|
||||||
|
private currentRow = new BehaviorSubject<SelectionData>({
|
||||||
|
label: '',
|
||||||
|
numbers: [],
|
||||||
|
value: 0,
|
||||||
|
total: 0
|
||||||
|
});
|
||||||
|
currentRow$ = this.currentRow.asObservable();
|
||||||
|
|
||||||
|
updatePartial(update: Partial<SelectionData>) {
|
||||||
|
const current = this.currentRow.value;
|
||||||
|
this.currentRow.next({ ...current, ...update });
|
||||||
|
}
|
||||||
|
|
||||||
|
finalizeCurrentRow() {
|
||||||
|
const completed = this.currentRow.value;
|
||||||
|
if (!completed.label || completed.numbers.length === 0 || !completed.value) return;
|
||||||
|
|
||||||
|
const total = completed.numbers.length * completed.value * 10;
|
||||||
|
const finalRow = { ...completed, total };
|
||||||
|
|
||||||
|
const updated = [...this.selections.value, finalRow];
|
||||||
|
this.selections.next(updated);
|
||||||
|
|
||||||
|
// Reset current row
|
||||||
|
this.currentRow.next({ label: '', numbers: [], value: 0, total: 0 });
|
||||||
|
}
|
||||||
|
|
||||||
|
clearSelections() {
|
||||||
|
this.selections.next([]);
|
||||||
|
this.currentRow.next({ label: '', numbers: [], value: 0, total: 0 });
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,5 +1,6 @@
|
|||||||
import { Component, Input, OnInit } from '@angular/core';
|
import { Component, Input, OnInit } from '@angular/core';
|
||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
|
import { SelectionService } from '../selection.service/selection.service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-touch-pad-menu',
|
selector: 'app-touch-pad-menu',
|
||||||
@ -31,6 +32,8 @@ export class TouchPadMenuComponent implements OnInit {
|
|||||||
calculatorOpen = false;
|
calculatorOpen = false;
|
||||||
calcDisplay = '';
|
calcDisplay = '';
|
||||||
|
|
||||||
|
constructor(private selectionService: SelectionService) {}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.labelRowsFlat = this.labelRows.flat();
|
this.labelRowsFlat = this.labelRows.flat();
|
||||||
this.numbersFlat = this.numberRows.flat();
|
this.numbersFlat = this.numberRows.flat();
|
||||||
@ -59,6 +62,9 @@ export class TouchPadMenuComponent implements OnInit {
|
|||||||
this.selectedNumbers = [];
|
this.selectedNumbers = [];
|
||||||
this.padValue = '';
|
this.padValue = '';
|
||||||
this.canPrint = false;
|
this.canPrint = false;
|
||||||
|
|
||||||
|
// 👇 Update label immediately in table
|
||||||
|
this.selectionService.updatePartial({ label });
|
||||||
}
|
}
|
||||||
|
|
||||||
selectNumber(number: number) {
|
selectNumber(number: number) {
|
||||||
@ -67,6 +73,9 @@ export class TouchPadMenuComponent implements OnInit {
|
|||||||
this.selectedNumbers.push(number);
|
this.selectedNumbers.push(number);
|
||||||
this.padValue = '';
|
this.padValue = '';
|
||||||
this.canPrint = false;
|
this.canPrint = false;
|
||||||
|
|
||||||
|
// 👇 Update numbers immediately in table
|
||||||
|
this.selectionService.updatePartial({ numbers: [...this.selectedNumbers] });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,18 +91,25 @@ export class TouchPadMenuComponent implements OnInit {
|
|||||||
this.padValue += 'X';
|
this.padValue += 'X';
|
||||||
}
|
}
|
||||||
this.updateCanPrint();
|
this.updateCanPrint();
|
||||||
|
|
||||||
|
// 👇 Update value in real-time
|
||||||
|
const value = parseFloat(this.padValue);
|
||||||
|
if (!isNaN(value)) {
|
||||||
|
this.selectionService.updatePartial({ value });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updateCanPrint() {
|
updateCanPrint() {
|
||||||
this.canPrint = this.padValue.trim().length > 0;
|
this.canPrint = this.padValue.trim().length > 0 && /^[0-9]+$/.test(this.padValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
padEnter() {
|
padEnter() {
|
||||||
// Optional action on enter
|
// Optional: can trigger print or do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
print() {
|
print() {
|
||||||
alert(`Printing: Label=${this.selectedLabel}, Numbers=${this.selectedNumbers.join(', ')}, Value=${this.padValue}`);
|
// 👇 Finalize current row (push to list)
|
||||||
|
this.selectionService.finalizeCurrentRow();
|
||||||
this.resetSelections();
|
this.resetSelections();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user