feat : touchpad math logic

This commit is contained in:
karthik 2025-07-25 13:11:51 +05:30
parent e135911c5e
commit bbeb97b7b4
3 changed files with 120 additions and 50 deletions

View File

@ -1,9 +1,10 @@
// selection.service.ts
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
// selection.service.ts
export interface SelectionData {
label: string;
numbers: number[];
numbers: (number | string)[];
value: number;
total: number;
}
@ -26,25 +27,51 @@ export class SelectionService {
// ✅ Update only part of the current row (label / numbers / value)
updatePartial(update: Partial<SelectionData>) {
const current = this.currentRow.value;
const updated: SelectionData = { ...current, ...update };
const updated: SelectionData = {
...current,
...update
};
const label = updated.label;
const value = updated.value;
const numbers = (updated.numbers || []).filter(n => typeof n === 'number') as number[];
const multiplyByTenLabels = ['WIN', 'SHP', 'THP', 'PLC'];
if (updated.numbers.length > 0 && updated.value > 0) {
if (multiplyByTenLabels.includes(updated.label)) {
updated.total = updated.numbers.length * updated.value * 10;
} else {
// For other labels, define your logic e.g. no multiply by 10 or another multiplier
updated.total = updated.numbers.length * updated.value;
// Or whatever logic you need here
}
} else {
updated.total = 0;
if (numbers.length > 0 && value > 0 && label) {
switch (label) {
// SINGLELEG: WIN, SHP, THP, PLC
case 'WIN':
case 'SHP':
case 'THP':
case 'PLC':
updated.total = numbers.length * value * 10;
break;
// EXOTIC: QUI (2 groups)
case 'QUI': {
const mid = Math.floor(numbers.length / 2);
const group1 = numbers.slice(0, mid);
const group2 = numbers.slice(mid);
const combinations = group1.length * group2.length;
updated.total = combinations * value * 10;
updated.numbers = [...group1, '-', ...group2];
break;
}
// MULTILEG: TRE (3 legs), MJP (4), JKP (5)
case 'TRE':
case 'MJP':
case 'JKP':
case 'SJP': {
const legs = this.splitToLegs(numbers, this.getLegCount(label));
const comb = legs.reduce((acc, leg) => acc * (leg.length || 1), 1);
updated.total = comb * value * 10;
break;
}
// EXOTIC fallback (e.g., TAN, EXA, FRP, QNP, EXP, etc.)
default:
updated.total = this.calculateCombinations(numbers.length) * value * 10;
break;
}
}
this.currentRow.next(updated);
@ -57,29 +84,38 @@ export class SelectionService {
// Validation: must have label, numbers, and valid value
if (!completed.label || completed.numbers.length === 0 || completed.value <= 0) return;
const total = completed.numbers.length * completed.value * 10;
const finalRow: SelectionData = { ...completed, total };
const finalRow: SelectionData = { ...completed };
this.selections.next([...this.selections.value, finalRow]);
const updatedSelections = [...this.selections.value, finalRow];
this.selections.next(updatedSelections);
// Reset current row
this.currentRow.next({
label: '',
numbers: [],
value: 0,
total: 0
});
this.currentRow.next({ label: '', numbers: [], value: 0, total: 0 });
}
// ✅ Clear everything (for ERASE)
clearSelections() {
this.selections.next([]);
this.currentRow.next({
label: '',
numbers: [],
value: 0,
total: 0
});
this.currentRow.next({ label: '', numbers: [], value: 0, total: 0 });
}
private calculateCombinations(n: number): number {
return n >= 2 ? (n * (n - 1)) / 2 : 0;
}
private splitToLegs(numbers: number[], legCount: number): number[][] {
const result: number[][] = [];
const perLeg = Math.floor(numbers.length / legCount);
for (let i = 0; i < legCount; i++) {
result.push(numbers.slice(i * perLeg, (i + 1) * perLeg));
}
return result;
}
private getLegCount(label: string): number {
switch (label) {
case 'TRE': return 3;
case 'MJP': return 4;
case 'JKP': return 5;
case 'SJP': return 5;
default: return 3;
}
}
}

View File

@ -14,7 +14,14 @@
<!-- Right Group: COPY, CLEAR, PR -->
<div class="d-flex flex-wrap justify-content-center gap-2 second">
<button class="btn btn-dark">Enter</button>
<button
class="btn btn-dark"
[disabled]="selectedLabel === 'QUI' && isQUIFirstGroupComplete"
(click)="padEnter()"
>
Enter
</button>
<button class="btn btn-dark">COPY</button>
<button class="btn btn-dark">CLEAR</button>
<button class="btn btn-dark">PR</button>

View File

@ -37,6 +37,10 @@ export class TouchPadMenuComponent implements OnInit {
// ✅ Disabled labels list
disabledLabels: string[] = ['SHW', 'SJP'];
isQUIFirstGroupComplete = false;
QUIGroup1: number[] = [];
QUIGroup2: number[] = [];
constructor(private selectionService: SelectionService) {}
ngOnInit() {
@ -77,24 +81,43 @@ export class TouchPadMenuComponent implements OnInit {
this.selectedNumbers = [];
this.padValue = '';
this.canPrint = false;
// 👇 Update label immediately in table
this.isQUIFirstGroupComplete = false;
this.QUIGroup1 = [];
this.QUIGroup2 = [];
this.selectionService.updatePartial({ label });
}
selectNumber(number: number) {
if (!this.selectedLabel) return;
if (this.selectedLabel === 'QUI') {
if (this.isQUIFirstGroupComplete) {
if (!this.QUIGroup2.includes(number)) {
this.QUIGroup2.push(number);
this.selectedNumbers = [...this.QUIGroup1, ...this.QUIGroup2];
this.selectionService.updatePartial({ numbers: this.selectedNumbers });
}
} else {
if (!this.QUIGroup1.includes(number)) {
this.QUIGroup1.push(number);
this.selectedNumbers = [...this.QUIGroup1];
this.selectionService.updatePartial({ numbers: this.selectedNumbers });
}
}
} else {
if (!this.selectedNumbers.includes(number)) {
this.selectedNumbers.push(number);
this.padValue = '';
this.canPrint = false;
// 👇 Update numbers immediately in table
this.selectionService.updatePartial({ numbers: [...this.selectedNumbers] });
}
}
this.padValue = '';
this.canPrint = false;
}
isNumberDisabled(number: number) {
if (this.selectedLabel === 'QUI') {
return this.QUIGroup1.includes(number) || this.QUIGroup2.includes(number);
}
return this.selectedNumbers.includes(number);
}
@ -119,7 +142,11 @@ export class TouchPadMenuComponent implements OnInit {
}
padEnter() {
if (this.canPrint) {
if (this.selectedLabel === 'QUI') {
if (!this.isQUIFirstGroupComplete && this.QUIGroup1.length > 0) {
this.isQUIFirstGroupComplete = true;
}
} else if (this.canPrint) {
this.print();
}
}