Add src/types/wrapper.ts
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
c4537ca1b0
commit
b8e71cd6fa
138
src/types/wrapper.ts
Normal file
138
src/types/wrapper.ts
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
import { journey_template, leg_template } from "./format"
|
||||||
|
|
||||||
|
const date_day_diff = (d0: Date, d1: Date): number =>
|
||||||
|
(d1.getTime() - d0.getTime()) / (1000 * 60 * 60 * 24)
|
||||||
|
|
||||||
|
class journey_wrapper {
|
||||||
|
id: string
|
||||||
|
data: journey = journey_template;
|
||||||
|
sel_leg: number = 0;
|
||||||
|
sel_day: number = 0;
|
||||||
|
|
||||||
|
constructor(id: string) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
leg_first = () => this.data.main[0]
|
||||||
|
leg_last = () => this.data.main[this.leg_count() - 1]
|
||||||
|
leg_count(): number {
|
||||||
|
return this.data.main.length;
|
||||||
|
}
|
||||||
|
leg_len(idx: number = null): number {
|
||||||
|
let d = this.leg_get(idx == null ? this.sel_leg : idx).date_range;
|
||||||
|
return d ? date_day_diff(d[0], d[1]) + 1 : 1;
|
||||||
|
}
|
||||||
|
add_leg(): void {
|
||||||
|
if (this.data.main == undefined) this.data.main = [];
|
||||||
|
this.data.main.push(leg_template);
|
||||||
|
}
|
||||||
|
rm_leg(idx: number): void {
|
||||||
|
this.data.main.splice(idx, 1);
|
||||||
|
if (this.sel_leg == idx) this.leg_prev();
|
||||||
|
}
|
||||||
|
tot_len(): number | "?" {
|
||||||
|
if (this.leg_count() == 0) return 0;
|
||||||
|
try {
|
||||||
|
let d0 = this.leg_first().date_range[0]
|
||||||
|
let d1 = this.leg_last().date_range[1]
|
||||||
|
return date_day_diff(d0, d1);
|
||||||
|
} catch {
|
||||||
|
return "?";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
leg_sel(idx: number): void {
|
||||||
|
this.sel_leg = idx;
|
||||||
|
this.sel_day = 1;
|
||||||
|
}
|
||||||
|
leg_get(idx: number = null): leg {
|
||||||
|
return this.data.main[idx == null ? this.sel_leg : idx]
|
||||||
|
}
|
||||||
|
leg_next(): void {
|
||||||
|
this.sel_leg = Math.min(this.sel_leg + 1, this.leg_count() - 1);
|
||||||
|
this.sel_day = 0;
|
||||||
|
}
|
||||||
|
leg_prev(): void {
|
||||||
|
this.sel_leg = Math.max(this.sel_leg - 1, 0);
|
||||||
|
this.sel_day = 0;
|
||||||
|
}
|
||||||
|
day_next() {
|
||||||
|
this.sel_day += 1
|
||||||
|
if (this.sel_day > this.leg_len() - 1) {
|
||||||
|
if (this.sel_leg < this.leg_count() - 1) {
|
||||||
|
this.leg_next()
|
||||||
|
this.sel_day = 0;
|
||||||
|
} else {
|
||||||
|
this.sel_day = this.leg_len() - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
day_prev() {
|
||||||
|
this.sel_day -= 1
|
||||||
|
if (this.sel_day < 0) {
|
||||||
|
if (this.sel_leg > 0) {
|
||||||
|
this.leg_prev()
|
||||||
|
this.sel_day = this.leg_len() - 1;
|
||||||
|
} else {
|
||||||
|
this.sel_day = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
date_sel(): string {
|
||||||
|
if (this.sel_day < 0) return "?";
|
||||||
|
if (!this.leg_get().date_range)
|
||||||
|
return "?";
|
||||||
|
var date = new Date(
|
||||||
|
this.leg_get().date_range[0],
|
||||||
|
);
|
||||||
|
date.setDate(date.getDate() + this.sel_day);
|
||||||
|
return date.toLocal();
|
||||||
|
}
|
||||||
|
date_tot() {
|
||||||
|
if (this.leg_count() == 0) return "";
|
||||||
|
try {
|
||||||
|
return `${this.leg_first().date_range[0].toLocal()} - ${this.leg_last().date_range[1].toLocal()}`;
|
||||||
|
} catch {
|
||||||
|
return "?";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
date_update(idx: number) {
|
||||||
|
let date_range = this.leg_get(idx).date_range;
|
||||||
|
let start_end = [0, 0];
|
||||||
|
let step_len = 0;
|
||||||
|
|
||||||
|
let last_start = date_range[0];
|
||||||
|
for (let i = idx - 1; i >= 0; --i) {
|
||||||
|
step_len = this.leg_len(i) - 1;
|
||||||
|
if (this.leg_get(i).date_range) {
|
||||||
|
start_end = [last_start.getDate() - step_len, last_start.getDate()];
|
||||||
|
} else {
|
||||||
|
this.leg_get(i).date_range = [new Date(), new Date()];
|
||||||
|
start_end = [last_start.getDate() - step_len, last_start.getDate()];
|
||||||
|
}
|
||||||
|
this.leg_get(i).date_range[0].setTime(last_start.getTime());
|
||||||
|
this.leg_get(i).date_range[0].setDate(start_end[0]);
|
||||||
|
this.leg_get(i).date_range[1].setTime(last_start.getTime());
|
||||||
|
this.leg_get(i).date_range[1].setDate(start_end[1]);
|
||||||
|
last_start = this.leg_get(i).date_range[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
let last_end = date_range[1];
|
||||||
|
for (let i = idx + 1; i < this.leg_count(); ++i) {
|
||||||
|
step_len = this.leg_len(i) - 1;
|
||||||
|
if (this.leg_get(i).date_range) {
|
||||||
|
start_end = [last_end.getDate(), last_end.getDate() + step_len];
|
||||||
|
} else {
|
||||||
|
this.leg_get(i).date_range = [new Date(), new Date()];
|
||||||
|
start_end = [last_end.getDate(), last_end.getDate() + step_len];
|
||||||
|
}
|
||||||
|
this.leg_get(i).date_range[0].setTime(last_end.getTime());
|
||||||
|
this.leg_get(i).date_range[0].setDate(start_end[0]);
|
||||||
|
this.leg_get(i).date_range[1].setTime(last_end.getTime());
|
||||||
|
this.leg_get(i).date_range[1].setDate(start_end[1]);
|
||||||
|
last_end = this.leg_get(i).date_range[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default journey_wrapper;
|
Loading…
x
Reference in New Issue
Block a user