合并企业版代码(未测试,先提交到测试分支)
This commit is contained in:
124
web_map/static/src/map_view/map_controller.js
Normal file
124
web_map/static/src/map_view/map_controller.js
Normal file
@@ -0,0 +1,124 @@
|
||||
/** @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,
|
||||
};
|
||||
Reference in New Issue
Block a user