2024-04-13 08:05:31 +00:00
|
|
|
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';
|
|
|
|
|
2024-06-04 22:45:43 +00:00
|
|
|
export type TrackerStage = 'waiting' | 'pending' | 'soon' | 'next' | 'confirmed' | 'replaced';
|
2024-04-13 08:05:31 +00:00
|
|
|
|
|
|
|
@Component({
|
|
|
|
selector: 'app-tracker-bar',
|
|
|
|
templateUrl: './tracker-bar.component.html',
|
|
|
|
styleUrls: ['./tracker-bar.component.scss'],
|
|
|
|
changeDetection: ChangeDetectionStrategy.OnPush
|
|
|
|
})
|
|
|
|
export class TrackerBarComponent implements OnInit, OnChanges {
|
|
|
|
@Input() stage: TrackerStage = 'waiting';
|
|
|
|
|
|
|
|
transitionsEnabled: boolean = false;
|
|
|
|
|
|
|
|
stages = {
|
|
|
|
waiting: {
|
|
|
|
state: 'blank',
|
|
|
|
},
|
|
|
|
pending: {
|
|
|
|
state: 'blank',
|
|
|
|
},
|
|
|
|
soon: {
|
|
|
|
state: 'blank',
|
|
|
|
},
|
|
|
|
next: {
|
|
|
|
state: 'blank',
|
|
|
|
},
|
|
|
|
confirmed: {
|
|
|
|
state: 'blank',
|
|
|
|
},
|
|
|
|
};
|
|
|
|
stageOrder: TrackerStage[] = ['waiting', 'pending', 'soon', 'next', 'confirmed'];
|
|
|
|
|
|
|
|
constructor (
|
|
|
|
private cd: ChangeDetectorRef,
|
|
|
|
) {}
|
|
|
|
|
|
|
|
ngOnInit(): void {
|
|
|
|
this.setStage();
|
|
|
|
setTimeout(() => {
|
|
|
|
this.transitionsEnabled = true;
|
|
|
|
}, 100)
|
|
|
|
}
|
|
|
|
|
|
|
|
ngOnChanges(changes: SimpleChanges): void {
|
|
|
|
if (changes.stage) {
|
|
|
|
this.setStage();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
setStage() {
|
|
|
|
let matched = 0;
|
|
|
|
for (let stage of this.stageOrder) {
|
|
|
|
if (stage === this.stage) {
|
|
|
|
this.stages[stage].state = 'current';
|
|
|
|
matched = 1;
|
|
|
|
} else {
|
|
|
|
if (matched > 1) {
|
|
|
|
this.stages[stage].state = 'blank';
|
|
|
|
} else if (matched) {
|
|
|
|
this.stages[stage].state = 'next';
|
|
|
|
matched++;
|
|
|
|
} else {
|
|
|
|
this.stages[stage].state = 'done';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.stages = this.stages;
|
|
|
|
this.cd.markForCheck();
|
|
|
|
}
|
|
|
|
}
|