125 lines
3.7 KiB
JavaScript
125 lines
3.7 KiB
JavaScript
/** @odoo-module **/
|
|
|
|
import { loadJS, loadCSS } from "@web/core/assets";
|
|
import { useService } from "@web/core/utils/hooks";
|
|
import { useModel } from "@web/views/model";
|
|
import { standardViewProps } from "@web/views/standard_view_props";
|
|
import { useSetupView } from "@web/views/view_hook";
|
|
import { Layout } from "@web/search/layout";
|
|
import { usePager } from "@web/search/pager_hook";
|
|
|
|
const { Component, onWillUnmount, onWillStart } = owl;
|
|
|
|
export class MapController extends Component {
|
|
setup() {
|
|
this.action = useService("action");
|
|
|
|
/** @type {typeof MapModel} */
|
|
const Model = this.props.Model;
|
|
const model = useModel(Model, this.props.modelParams);
|
|
this.model = model;
|
|
|
|
onWillUnmount(() => {
|
|
this.model.stopFetchingCoordinates();
|
|
});
|
|
|
|
useSetupView({
|
|
getLocalState: () => {
|
|
return this.model.metaData;
|
|
},
|
|
});
|
|
|
|
onWillStart(() =>
|
|
Promise.all([
|
|
loadJS("/web_map/static/lib/leaflet/leaflet.js"),
|
|
loadCSS("/web_map/static/lib/leaflet/leaflet.css"),
|
|
])
|
|
);
|
|
|
|
usePager(() => {
|
|
return {
|
|
offset: this.model.metaData.offset,
|
|
limit: this.model.metaData.limit,
|
|
total: this.model.data.count,
|
|
onUpdate: ({ offset, limit }) => this.model.load({ offset, limit }),
|
|
};
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @returns {any}
|
|
*/
|
|
get rendererProps() {
|
|
return {
|
|
model: this.model,
|
|
onMarkerClick: this.openRecords.bind(this),
|
|
};
|
|
}
|
|
/**
|
|
* @returns {string}
|
|
*/
|
|
get googleMapUrl() {
|
|
let url = "https://www.google.com/maps/dir/?api=1";
|
|
if (this.model.data.records.length) {
|
|
const allCoordinates = this.model.data.records.filter(
|
|
({ partner }) => partner && partner.partner_latitude && partner.partner_longitude
|
|
);
|
|
const uniqueCoordinates = allCoordinates.reduce((coords, { partner }) => {
|
|
const coord = partner.partner_latitude + "," + partner.partner_longitude;
|
|
if (!coords.includes(coord)) {
|
|
coords.push(coord);
|
|
}
|
|
return coords;
|
|
}, []);
|
|
if (uniqueCoordinates.length && this.model.metaData.routing) {
|
|
// When routing is enabled, make last record the destination
|
|
url += `&destination=${uniqueCoordinates.pop()}`;
|
|
}
|
|
if (uniqueCoordinates.length) {
|
|
url += `&waypoints=${uniqueCoordinates.join("|")}`;
|
|
}
|
|
}
|
|
return url;
|
|
}
|
|
|
|
/**
|
|
* Redirects to views when clicked on open button in marker popup.
|
|
*
|
|
* @param {number[]} ids
|
|
*/
|
|
openRecords(ids) {
|
|
if (ids.length > 1) {
|
|
this.action.doAction({
|
|
type: "ir.actions.act_window",
|
|
name: this.env.config.getDisplayName() || this.env._t("Untitled"),
|
|
views: [
|
|
[false, "list"],
|
|
[false, "form"],
|
|
],
|
|
res_model: this.props.resModel,
|
|
domain: [["id", "in", ids]],
|
|
});
|
|
} else {
|
|
this.action.switchView("form", {
|
|
resId: ids[0],
|
|
mode: "readonly",
|
|
model: this.props.resModel,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
MapController.template = "web_map.MapView";
|
|
|
|
MapController.components = {
|
|
Layout,
|
|
};
|
|
|
|
MapController.props = {
|
|
...standardViewProps,
|
|
Model: Function,
|
|
modelParams: Object,
|
|
Renderer: Function,
|
|
buttonTemplate: String,
|
|
};
|