testsAndMisc-archive/TS/two-inputs/src/app/app.component.ts

139 lines
4.7 KiB
TypeScript
Raw Normal View History

import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterOutlet } from '@angular/router';
import { MatInputModule } from '@angular/material/input';
import {MatButtonModule} from '@angular/material/button';
import { FormsModule } from '@angular/forms';
@Component({
selector: 'app-root',
standalone: true,
imports: [CommonModule, RouterOutlet, MatInputModule, FormsModule, MatButtonModule],
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
inputOne: number | null = null; // Default initialization to 50
inputTwo: number | null = null; // Default initialization to 50
min: number | null = 100;
max: number | null = 250;
step: number | null = 25;
targetValue: number | null = 325;
indexOne: number = 0;
indexTwo: number = 0;
possibleValues: Array<[number, number]> | null = [];
constructor() {
this.possibleValues = AppComponent.findValidPairs(this.step, this.min, this.max, this.targetValue);
}
ngOnInit() {
this.possibleValues = AppComponent.findValidPairs(this.step, this.min, this.max, this.targetValue);
}
public updateInput() {
this.possibleValues = AppComponent.findValidPairs(this.step, this.min, this.max, this.targetValue);
}
private changeIndex(currentValue: number, direction: boolean) {
this.possibleValues = AppComponent.findValidPairs(this.step, this.min, this.max, this.targetValue);
const length = this.possibleValues?.length;
if(typeof length !== "undefined") {
if(direction) {
if(currentValue + 1 > length - 1) {
return 0;
}
return currentValue + 1;
} else {
if(currentValue - 1 < 0) {
return length - 1;
}
return currentValue - 1;
}
} else {
console.error(`appComponent, changeIndex, length is undefined!`, length);
}
return currentValue;
}
updateTwoValue() {
if(this.possibleValues !== null) {
this.inputOne = this.possibleValues[this.indexOne][0];
if(typeof this.inputOne !== "undefined" && this.inputOne !== null) {
const result = AppComponent.findCorrespondingValue(this.possibleValues, this.inputOne);
if(result !== null) {
[this.inputTwo, this.indexTwo] = result;
return;
}
console.error(`result is null!`);
}
console.error(`this.inputOne is null or undefined!: `, this.inputOne, this.possibleValues, this.indexOne);
}
}
upOne() {
this.indexOne = this.changeIndex(this.indexOne, true);
this.updateTwoValue();
}
downOne() {
this.indexOne = this.changeIndex(this.indexOne, false);
this.updateTwoValue();
}
upTwo() {
this.indexTwo = this.changeIndex(this.indexTwo, true);
if(this.possibleValues !== null) {
this.inputTwo = this.possibleValues[this.indexTwo][1];
const result = AppComponent.findCorrespondingValue(this.possibleValues, this.inputTwo);
if(result !== null) {
[this.inputOne, this.indexOne] = result;
}
}
}
downTwo() {
this.indexTwo = this.changeIndex(this.indexTwo, false);
if(this.possibleValues !== null) {
this.inputTwo = this.possibleValues[this.indexTwo][1];
const result = AppComponent.findCorrespondingValue(this.possibleValues, this.inputTwo);
if(result !== null) {
[this.inputOne, this.indexOne] = result;
}
}
}
private static findCorrespondingValue(pairs: Array<[number, number]>, number: number): [number, number] | null {
for (let index = 0; index < pairs.length; index += 1) {
if (pairs[index][0] === number) {
return [pairs[index][1], index]; // Return n2 if the given number matches n1
} else if (pairs[index][1] === number) {
return [pairs[index][0], index]; // Return n1 if the given number matches n2
}
}
console.error("No corresponding value found for the provided number in the pairs.", pairs, number);
return null; // Return null if no matching number is found
}
private static findValidPairs(x: number | null, y: number | null, z: number | null, ml: number | null): Array<[number, number]> | null {
if (x === null || y === null || z === null || ml === null) {
console.error("findValidPairs, some value is null");
return null;
}
const results: Array<[number, number]> = [];
// Iterate through possible values of n1, which must be multiples of x, at least y, and not more than z
for (let n1 = y; n1 <= ml - y && n1 <= z; n1 += x) {
let n2 = ml - n1;
// Ensure n2 is also a multiple of x, n2 >= y, and n2 <= z
if (n2 % x === 0 && n2 >= y && n2 <= z) {
results.push([n1, n2]);
}
}
return results;
}
}