geopf-extensions-openlayers
Version:
French Geoportal Extensions for OpenLayers libraries
310 lines (268 loc) • 10.4 kB
JavaScript
// import CSS
import "../../CSS/Controls/ControlList/GPFcontrolList.css";
// import OpenLayers
import Widget from "../Widget";
import Control from "../Control";
import Map from "ol/Map";
// import local
import Logger from "../../Utils/LoggerByDefault";
import Utils from "../../Utils/Helper";
import SelectorID from "../../Utils/SelectorID";
import Draggable from "../../Utils/Draggable";
import Interactions from "../Utils/Interactions";
// import local with ol dependencies
import checkDsfr from "../Utils/CheckDsfr";
// DOM
import ControlListDOM from "./ControlListDOM";
var logger = Logger.getLogger("controlList");
/**
* @typedef {Object} ControlListOptions
* @property {boolean} [collapsed=true] - Définit si le widget est replié au chargement.
* @property {boolean} [draggable=false] - Permet de déplacer le panneau du widget.
* @property {string} [position] - Position CSS du widget sur la carte.
* @property {string|number} [id] - Identifiant unique du widget.
* @property {HTMLElement} [controlCatalogElement] - Élément DOM à afficher en pied de panneau (ex : bouton catalogue).
* @property {boolean} [gutter] - Ajoute ou retire l’espace autour du panneau.
*/
/**
* @classdesc
*
* ControlList Control.
*
* @alias ol.control.ControlList
* @module ControlList
*
*/
class ControlList extends Control {
/**
* @constructor
* @param {ControlListOptions} options - ControlList control options
*/
constructor (options) {
options = options || {};
// call ol.control.Control constructor
super(options);
if (!(this instanceof ControlList)) {
throw new TypeError("ERROR CLASS_CONSTRUCTOR");
}
if (options.controlCatalogElement) {
this.controlCatalogElement = options.controlCatalogElement;
} else {
this.controlCatalogElement = null;
}
/**
* Nom de la classe (heritage)
* @private
*/
this.CLASSNAME = "ControlList";
// initialisation du composant
this.initialize(options);
// // Widget main DOM container
this._container = this._initContainer();
// ajout du container
(this.element) ? this.element.appendChild(this._container) : this.element = this._container;
return this;
}
/**
* Overwrite OpenLayers setMap method
*
* @param {Map} map - Map.
*/
setMap (map) {
if (map) {
// mode "draggable"
if (this.draggable) {
Draggable.dragElement(
this._ControlListPanelContainer,
this._ControlListPanelHeaderContainer,
map.getTargetElement()
);
}
// mode "collapsed"
if (!this.collapsed) {
this._pictoControlListButton.setAttribute("aria-pressed", true);
}
}
// on appelle la méthode setMap originale d'OpenLayers
super.setMap(map);
// position
if (this.options.position) {
this.setPosition(this.options.position);
}
}
// ################################################################### //
// ##################### public methods ############################## //
// ################################################################### //
/**
* Returns true if widget is collapsed (minimized), false otherwise
*
* @returns {Boolean} collapsed - true if widget is collapsed
*/
getCollapsed () {
return this.collapsed;
}
/**
* Collapse or display widget main container
*
* @param {Boolean} collapsed - True to collapse widget, False to display it
*/
setCollapsed (collapsed) {
if (collapsed === undefined) {
logger.log("[ERROR] ControlList:setCollapsed - missing collapsed parameter");
return;
}
if ((collapsed && this.collapsed) || (!collapsed && !this.collapsed)) {
return;
}
if (collapsed) {
document.getElementById("GPcontrolListPanelClose-" + this._uid).click();
} else {
this._pictoIsoButton.click();
}
this.collapsed = collapsed;
}
/**
* Get container
*
* @returns {HTMLElement} container
*/
getContainer () {
return this._container;
}
/**
* Clean UI : reinit control
*/
clean () {
this._clearIsoInputs();
// INFO
// le comportement est surchargé, ceci supprime la couche !?
// cf. _createIsoPanelFormPointElement()
this._originPoint.clearResults();
document.getElementById("GPlocationPoint_1-" + this._uid).style.cssText = "";
document.getElementById("GPlocationOriginCoords_1-" + this._uid).value = "";
document.getElementById("GPlocationOrigin_1-" + this._uid).value = "";
document.getElementById("GPlocationPoint_1-" + this._uid).style.cssText = "";
document.getElementById("GPlocationOriginPointer_1-" + this._uid).checked = false;
document.getElementById("GPlocationOrigin_1-" + this._uid).className = "GPlocationOriginVisible gpf-visible";
document.getElementById("GPlocationOriginCoords_1-" + this._uid).className = "GPlocationOriginHidden gpf-hidden";
this._currentIsoResults = null;
this.setLayer();
}
// ################################################################### //
// ##################### init component ############################## //
// ################################################################### //
/**
* Initialize control (called by constructor)
*
* @param {Object} options - constructor options
* @private
*/
initialize (options) {
// collapsed
if (options.collapsed === "true") {
options.collapsed = true;
}
if (options.collapsed === "false") {
options.collapsed = false;
}
// set default options
this.options = {
collapsed : true,
draggable : false,
};
// merge with user options
Utils.assign(this.options, options);
/**
* @type {Boolean}
* specify if control is collapsed (true) or not (false) */
this.collapsed = this.options.collapsed;
/**
* @type {Boolean}
* specify if control is draggable (true) or not (false) */
this.draggable = this.options.draggable;
/**
* @private
* identifiant du contrôle :
* utile pour suffixer les identifiants CSS
* (pour gérer le cas où il y en a plusieurs dans la même page) */
this._uid = this.options.id || SelectorID.generate();
}
// ################################################################### //
// ######################## DOM initialize ########################### //
// ################################################################### //
/**
* initialize component container (DOM)
* @returns {HTMLElement} DOM element
*
* @private
*/
_initContainer () {
// creation du container principal
var container = this._createMainContainerElement();
var picto = this._pictoControlListButton = this._createShowControlListPictoElement();
container.appendChild(picto);
// panneau
var panel = this._ControlListPanelContainer = this._createControlListPanelElement();
var panelDiv = this._createControlListPanelDivElement();
panel.appendChild(panelDiv);
// header
var header = this._ControlListPanelHeaderContainer = this._createControlListPanelHeaderElement();
panelDiv.appendChild(header);
// content
var content = this._ControlListPanelContentContainer = this._createControlListPanelContentElement();
panelDiv.appendChild(content);
if (this.controlCatalogElement) {
// footer
var footer = this._createControlListPanelFooterElement(this.controlCatalogElement);
panelDiv.appendChild(footer);
}
container.appendChild(panel);
return container;
}
// ################################################################### //
// ####################### handlers events to dom #################### //
// ################################################################### //
/**
* this method is called by event 'click' on 'GPshowControlListPicto' picto
* (cf. this._createShowControlListPictoElement),
*
* @param { Event } e évènement associé au clic
* @private
*/
onShowControlListPanelClick (e) {
if (e.target.ariaPressed === "true") {
this.onPanelOpen();
}
var map = this.getMap();
// on supprime toutes les interactions
Interactions.unset(map);
var opened = this._pictoControlListButton.ariaPressed;
this.collapsed = !(opened === "true");
// on génère nous même l'evenement OpenLayers de changement de propriété
// (utiliser ol.control.ControlList.on("change:collapsed", function ) pour s'abonner à cet évènement)
this.dispatchEvent("change:collapsed");
// on recalcule la position
if (this.options.position && !this.collapsed) {
this.updatePosition(this.options.position);
}
if (!this.collapsed) {
const controls = this.getMap().getControls().getArray();
controls.forEach(control => {
if (control.listable) {
let element = this._createControlListPanelControl(control);
this._ControlListPanelContentContainer.appendChild(element);
}
});
} else {
this._ControlListPanelContentContainer.innerHTML = "";
}
}
};
// on récupère les méthodes de la classe commune ControlList
Object.assign(ControlList.prototype, ControlListDOM);
Object.assign(ControlList.prototype, Widget);
export default ControlList;
// Expose ControlList as ol.control.ControlList (for a build bundle)
if (window.ol && window.ol.control) {
window.ol.control.ControlList = ControlList;
}