diff --git a/src/types/wrapper.ts b/src/types/wrapper.ts new file mode 100644 index 0000000..faf74ec --- /dev/null +++ b/src/types/wrapper.ts @@ -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; \ No newline at end of file