Add NumRanges
parent
2fc902403e
commit
65761b500f
@ -1,8 +0,0 @@
|
||||
.number-range-wrapper {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
.range-spacer {
|
||||
margin: 0 0.5em;
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
<p>date-range-cell works!</p>
|
@ -0,0 +1,15 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'app-date-range-cell',
|
||||
templateUrl: './date-range-cell.component.html',
|
||||
styleUrls: ['./date-range-cell.component.scss']
|
||||
})
|
||||
export class DateRangeCellComponent implements OnInit {
|
||||
|
||||
constructor() { }
|
||||
|
||||
ngOnInit(): void {
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
<div
|
||||
*ngIf="editable || label"
|
||||
class="number-range-wrapper"
|
||||
[formGroup]="rangeForm"
|
||||
>
|
||||
<mat-form-field class="number-range-form-field">
|
||||
<mat-label *ngIf="label">{{ label }} min</mat-label>
|
||||
<input
|
||||
matInput
|
||||
type="number"
|
||||
formControlName="minValue"
|
||||
(input)="minValueChange($event)"
|
||||
/>
|
||||
</mat-form-field>
|
||||
<span class="range-spacer">-</span>
|
||||
<mat-form-field class="number-range-form-field">
|
||||
<mat-label *ngIf="label">{{ label }} max</mat-label>
|
||||
<input
|
||||
matInput
|
||||
formControlName="maxValue"
|
||||
type="number"
|
||||
(input)="maxValueChange($event)"
|
||||
/>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
<div *ngIf="!editable && !label">
|
||||
{{ min }} - {{ max }}
|
||||
</div>
|
@ -0,0 +1,8 @@
|
||||
.number-range-wrapper {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
.range-spacer {
|
||||
margin: 0 0.5em;
|
||||
}
|
||||
}
|
@ -0,0 +1,123 @@
|
||||
import { DatePipe } from '@angular/common';
|
||||
import {
|
||||
Component,
|
||||
Input,
|
||||
Output,
|
||||
EventEmitter,
|
||||
ChangeDetectorRef,
|
||||
OnInit,
|
||||
} from '@angular/core';
|
||||
import { FormControl, FormGroup, Validators } from '@angular/forms';
|
||||
|
||||
@Component({
|
||||
selector: 'app-number-range-cell',
|
||||
templateUrl: './number-range-cell.component.html',
|
||||
styleUrls: ['./number-range-cell.component.scss'],
|
||||
})
|
||||
export class NumberRangeCellComponent implements OnInit {
|
||||
@Input()
|
||||
set min(value: number) {
|
||||
this._min = value;
|
||||
this.rangeForm?.controls['minValue'].setValue(value);
|
||||
}
|
||||
get min() {
|
||||
return this._min;
|
||||
}
|
||||
_min: number;
|
||||
|
||||
@Input()
|
||||
set max(value: number) {
|
||||
this._max = value;
|
||||
this.rangeForm?.controls['maxValue'].setValue(value);
|
||||
}
|
||||
get max() {
|
||||
return this._max;
|
||||
}
|
||||
_max: number;
|
||||
|
||||
rangeForm: FormGroup;
|
||||
|
||||
@Output() minChange = new EventEmitter<number>();
|
||||
@Output() maxChange = new EventEmitter<number>();
|
||||
|
||||
@Input()
|
||||
set editable(value) {
|
||||
this._editable = value;
|
||||
if (value) {
|
||||
this.rangeForm?.controls['minValue'].enable();
|
||||
this.rangeForm?.controls['maxValue'].enable();
|
||||
} else {
|
||||
this.rangeForm?.controls['minValue'].disable();
|
||||
this.rangeForm?.controls['maxValue'].disable();
|
||||
}
|
||||
}
|
||||
_editable = false;
|
||||
get editable() {
|
||||
return this._editable;
|
||||
}
|
||||
@Input()
|
||||
required = false;
|
||||
@Input()
|
||||
label: string = null;
|
||||
@Output() validityChange = new EventEmitter<boolean>();
|
||||
isValid = true;
|
||||
|
||||
constructor(private cdr: ChangeDetectorRef, public datepipe: DatePipe) {}
|
||||
|
||||
ngOnInit() {
|
||||
this.rangeForm = new FormGroup({
|
||||
minValue: new FormControl(),
|
||||
maxValue: new FormControl(),
|
||||
});
|
||||
this.rangeForm.controls['minValue'].markAsTouched();
|
||||
this.rangeForm.controls['maxValue'].markAsTouched();
|
||||
this.rangeForm?.controls['minValue'].setValue(this.min);
|
||||
this.rangeForm?.controls['maxValue'].setValue(this.max);
|
||||
}
|
||||
|
||||
minValueChange(event) {
|
||||
this.min = this.toPositiveNumber(event.target.value);
|
||||
this.minChange.emit(this.min);
|
||||
this.checkIfRangeIsValid();
|
||||
}
|
||||
|
||||
maxValueChange(event) {
|
||||
this.max = this.toPositiveNumber(event.target.value);
|
||||
this.maxChange.emit(this.max);
|
||||
this.checkIfRangeIsValid();
|
||||
}
|
||||
|
||||
checkIfRangeIsValid() {
|
||||
if (this.min == null || this.max == null) {
|
||||
this.setRangeError(false);
|
||||
return;
|
||||
}
|
||||
if (this.min <= this.max) {
|
||||
this.setRangeError(false);
|
||||
return;
|
||||
}
|
||||
this.setRangeError(true);
|
||||
}
|
||||
|
||||
setRangeError(error: boolean): void {
|
||||
this.validityChange.emit(!error);
|
||||
if (error) {
|
||||
this.rangeForm.controls['minValue'].setErrors({ rangeError: true });
|
||||
this.rangeForm.controls['maxValue'].setErrors({ rangeError: true });
|
||||
} else {
|
||||
this.rangeForm.controls['minValue'].setErrors(null);
|
||||
this.rangeForm.controls['maxValue'].setErrors(null);
|
||||
}
|
||||
}
|
||||
|
||||
toPositiveNumber(str: string): number {
|
||||
if (str === '') {
|
||||
return null;
|
||||
}
|
||||
const number = +str;
|
||||
if (number < 0) {
|
||||
return Math.abs(number);
|
||||
}
|
||||
return number;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue