Files
test/web_map/static/src/map_view/map_controller.js
2023-04-14 17:42:23 +08:00

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,
};