dev #160

Merged
sora merged 97 commits from dev into master 2025-03-02 01:09:30 +01:00
Showing only changes of commit b8e71cd6fa - Show all commits

138
src/types/wrapper.ts Normal file
View 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;