diff --git a/src/client/old.js b/src/client/old.js
index 42cb379..a81823a 100644
--- a/src/client/old.js
+++ b/src/client/old.js
@@ -16,172 +16,228 @@ Vue.component("multiselect", window.VueMultiselect.default);
Vue.use(window.VueTextareaAutosize);
const app = new Vue({
- el: "#app",
- data: {
- journey_edit:
- ["view", "short"].indexOf(window.location.pathname.split("/")[1]) == -1,
- journey: new journey_wrapper(window.location.pathname.split("/").pop() || String.gen_id(16)),
+ el: "#app",
+ data: {
+ edit_active: ["view", "short"].indexOf(window.location.pathname.split("/")[1]) == -1,
+ drawer_active: "hotel",
+ journey: new journey_wrapper(window.location.pathname.split("/").pop() || String.gen_id(16)),
+ map_override: { active: false, center: [0, 0] },
- query: {
- type: "",
- act: false,
- res: [],
- },
- impexp: "",
- lang: {
- format: "ddd D MMM",
- formatLocale: {
- firstDayOfWeek: 1,
- },
- monthBeforeYear: true,
- },
- polyline: {
- latlngs: [],
- color: 'green'
- }
- },
- methods: {
- start_journey: function () { window.location.href = "/" + this.journey.id },
+ query: {
+ type: "", res: [],
+ },
+ impexp: "",
+ lang: {
+ format: "ddd D MMM",
+ formatLocale: {
+ firstDayOfWeek: 1,
+ },
+ monthBeforeYear: true,
+ },
+ polyline: {
+ latlngs: [],
+ color: 'green'
+ }
+ },
+ methods: {
+ start_journey: function () { window.location.href = "/" + this.journey.id },
- compute_bb: function () {
- const bounds = this.$refs.map[0].mapObject.getBounds();
- return [[bounds.getSouthWest().lng, bounds.getSouthWest().lat],
- [bounds.getNorthEast().lng, bounds.getNorthEast().lat]]
- },
- generate_rotation: function (index, list) {
- if (index < 0 || index >= list.length) return 0;
- const c0 = list[(index == 0) ? index : (index - 1)]
- const c1 = list[(index == list.length - 1) ? index : (index + 1)]
- const brng = Math.atan2(c1[1] - c0[1], c1[0] - c0[0]);
- return `rotate:${brng - Math.PI / 2}rad`;
+ compute_bb: function () {
+ const bounds = this.$refs.map[0].mapObject.getBounds();
+ return [[bounds.getSouthWest().lng, bounds.getSouthWest().lat],
+ [bounds.getNorthEast().lng, bounds.getNorthEast().lat]]
+ },
+ generate_rotation: function (index, list) {
+ if (index < 0 || index >= list.length) return 0;
+ const c0 = list[(index == 0) ? index : (index - 1)]
+ const c1 = list[(index == list.length - 1) ? index : (index + 1)]
+ const brng = Math.atan2(c1[1] - c0[1], c1[0] - c0[0]);
+ return `rotate:${brng - Math.PI / 2}rad`;
- },
- generate_marker: function (item, fcolor) {
- return `
+ },
+ generate_marker: function (item, fcolor) {
+ return `
`
- },
- generate_icon: function (item, fcolor, styling = "") {
- return `
`;
- },
+ },
+ generate_icon: function (item, fcolor, styling = "") {
+ return `
`;
+ },
- import_data: function () {
- this.journey.data = Object.assign(
- {},
- JSON.parse(this.impexp.toDecoded()),
- );
- this.journey.data.main.forEach((e) => {
- if (e.date_range) {
- e.date_range[0] = new Date(e.date_range[0]);
- e.date_range[1] = new Date(e.date_range[1]);
- }
- });
- },
- export_data: function () {
- this.impexp = JSON.stringify(this.journey.data).toEncoded();
- },
- filter_selected: function (list, step) {
- return list.filter((e) =>
- step ? e.step == this.journey.sel_day : e.step >= 0,
- );
- },
- filter_unselected: function (list) {
- return list.filter((e) => e.step == undefined || e.step < 0);
- },
- remove_item: function (list, idx) {
- list[idx].step = -1;
- list.splice(idx, 1);
- },
- log: function (e) {
- console.log(e);
- },
+ import_data: function () {
+ this.journey.data = Object.assign(
+ {},
+ JSON.parse(this.impexp.toDecoded()),
+ );
+ this.journey.data.main.forEach((e) => {
+ if (e.date_range) {
+ e.date_range[0] = new Date(e.date_range[0]);
+ e.date_range[1] = new Date(e.date_range[1]);
+ }
+ });
+ },
+ export_data: function () {
+ this.impexp = JSON.stringify(this.journey.data).toEncoded();
+ },
+ filter_selected: function (list, step) {
+ return list.filter((e) =>
+ step ? e.step == this.journey.sel_day : e.step >= 0,
+ );
+ },
+ filter_unselected: function (list) {
+ return list.filter((e) => e.step == undefined || e.step < 0);
+ },
+ remove_item: function (list, idx) {
+ list[idx].step = -1;
+ list.splice(idx, 1);
+ },
+ log: function (e) {
+ console.log(e);
+ },
- get_filter: function (f) {
- switch (f) {
- case "hotel": return api.is_hotel_type;
- case "restaurant": return api.is_restauration_type;
- case "place": return api.is_attraction_type;
- case "other":
- default: return () => true;
- }
- },
+ get_filter: function (f) {
+ switch (f) {
+ case "hotel": return api.is_hotel_type;
+ case "restaurant": return api.is_restauration_type;
+ case "place": return api.is_attraction_type;
+ case "other":
+ default: return () => true;
+ }
+ },
- search_nominatim: function (f) {
- return (q) => {
- this.query.act = true;
- this.query.type = f;
- return api.query_nominatim(q, this.compute_bb(), this.get_filter(f)).catch((_err) => []).then((r) => {
- r.forEach((rr) => {
- rr.latlon = [parseFloat(rr.lat), parseFloat(rr.lon)];
- rr.sname = rr.display_name.split(",")[0];
- });
- this.query.res = r;
- this.query.act = false;
- return r
- });
- }
- },
- search_travel: function (f) {
- return (q) => {
- this.query.act = true;
- this.query.type = f;
- return api.query_flight(q).then((r) => {
- r.forEach(el => el.path = getGeoLine(
- new L.LatLng(el.from_geo.lat, el.from_geo.lon),
- new L.LatLng(el.to_geo.lat, el.to_geo.lon), { dist: 5_000_000 }).map(v => [v.lat, v.lng]));
- this.query.res = r;
- this.query.act = false;
- return r;
- });
- }
- },
+ search_nominatim: function (f) {
+ return (q) => {
+ this.query.type = f;
+ return api.query_nominatim(q, this.compute_bb(), this.get_filter(f)).catch((_err) => []).then((r) => {
+ r.forEach((rr) => {
+ rr.latlon = [parseFloat(rr.lat), parseFloat(rr.lon)];
+ rr.sname = rr.display_name.split(",")[0];
+ });
+ this.query.res = r;
+ this.query.type = null;
+ return r
+ });
+ }
+ },
+ search_travel: function (f) {
+ return (q) => {
+ this.query.type = f;
+ return api.query_flight(q).then((r) => {
+ r.forEach(el => {
+ el.path = getGeoLine(
+ { lat: el.from_geo.lat, lng: el.from_geo.lon },
+ { lat: el.to_geo.lat, lng: el.to_geo.lon }, { dist: 5_000_000 }).map(v => [v.lat, v.lng])
+ el.type = "flight";
+ });
+ this.query.res = r;
+ this.query.type = null;
+ return r;
+ });
+ }
+ },
- keyboardEvent(e) {
- if (e.which === 13) {
- }
- },
- },
- created: function () {
+ drawer_hover_item: function (item) {
+ if (item) {
+ this.map_override.active = true
+ this.map_override.center = [item.lat, item.lon]
+ } else {
+ this.map_override.active = false
+ }
+ },
- this.search_hotel = api.throttle(this.search_nominatim("hotel"), 1000)
- this.search_restaurant = api.throttle(this.search_nominatim("restaurant"), 1000)
- this.search_place = api.throttle(this.search_nominatim("place"), 1000)
- this.save_data = api.throttle(() => {
- this.impexp = JSON.stringify(this.journey.data).toEncoded();
- api.save(this.journey.id, this.journey.data);
- }, 1000);
- this.search_flight = api.throttle(this.search_travel("flight"), 2000)
+ drawer_click_item: function (item) {
+ console.log(item)
+ console.log(this.journey.leg_get())
+ switch (this.drawer_active) {
+ case 'hotel': return this.journey.leg_get().hotel = item;
+ case 'restaurant': return this.journey.leg_get().places.restaurants.push(item);
+ case 'place': return this.journey.leg_get().places.places.push(item);
+ case 'other': return;
+ case 'flight': return this.journey.leg_get().travel.push(item);
+ }
+ },
- window.addEventListener("keydown", (e) => {
- switch (e.key) {
- case "ArrowLeft":
- this.journey.day_prev();
- break;
- case "ArrowRight":
- this.journey.day_next();
- break;
- default:
- console.log(e.key);
- }
- });
+ search_active: function (q) {
+ const txt = q.target.value
+ switch (this.drawer_active) {
+ case 'hotel': return this.search_hotel(txt);
+ case 'restaurant': return this.search_restaurant(txt);
+ case 'place': return this.search_place(txt);
+ case 'other': return this.search_other(txt);
+ case 'flight': return this.search_flight(txt);
+ }
+ },
- api.load(this.journey.id).then((r) => (app.journey.data = migrator(r)));
+ keyboardEvent(e) {
+ if (e.which === 13) {
+ }
+ },
+ },
+ created: function () {
+ this.search_hotel = api.throttle(this.search_nominatim("hotel"), 1000)
+ this.search_restaurant = api.throttle(this.search_nominatim("restaurant"), 1000)
+ this.search_place = api.throttle(this.search_nominatim("place"), 1000)
+ this.save_data = api.throttle(() => {
+ this.impexp = JSON.stringify(this.journey.data).toEncoded();
+ api.save(this.journey.id, this.journey.data);
+ }, 1000);
+ this.search_flight = api.throttle(this.search_travel("flight"), 2000)
+ this
- this.search_travel("flight")("qf1").then(r => {
- this.polyline.latlngs = r.map(e => e.path)
- });
+ window.addEventListener("keydown", (e) => {
+ switch (e.key) {
+ case "ArrowLeft":
+ this.journey.day_prev();
+ break;
+ case "ArrowRight":
+ this.journey.day_next();
+ break;
+ default:
+ console.log(e.key);
+ }
+ });
- },
- watch: {
- journey: {
- handler: function (ndata, odata) {
- this.save_data();
- },
- deep: true,
- },
- },
+ api.load(this.journey.id).then((r) => (app.journey.data = migrator(r)));
+
+ // this.search_travel("flight")("qf1").then(r => {
+ // // this.polyline.latlngs = r.map(e => e.path)
+ // this.journey.data.main[this.journey.sel_leg].travel = r;
+ // });
+
+ },
+ watch: {
+ journey: {
+ handler: function (ndata, odata) {
+ this.save_data();
+ },
+ deep: true,
+ },
+ },
});
+
+var scrollInterval = null;
+var scrollDir = null;
+document.querySelector('.scroll-content').addEventListener('mousemove', (e) => {
+ const c = document.querySelector('.scroll-content')
+ const newDir =
+ e.pageX < c.offsetWidth * 0.2 ? 'left' :
+ (e.pageX > c.offsetWidth * 0.8 ? 'right' : scrollDir)
+ if (!scrollInterval || scrollDir != newDir) {
+ if (scrollInterval) clearInterval(scrollInterval)
+ sideScroll(c, newDir, 25, 10);
+ }
+});
+document.querySelector('.scroll-content').addEventListener('mouseleave', () => {
+ clearInterval(scrollInterval);
+ scrollInterval = null
+});
+function sideScroll(element, direction, speed, step) {
+ scrollDir = direction
+ scrollInterval = setInterval(() => {
+ element.scrollLeft += (direction == 'left') ? -step : step;
+ }, speed);
+}