OpenSourcePolitics / decidim-ditp

Decidim instance for DITP OGP
1 stars 2 forks source link

ugly, refactor #31

Open github-actions[bot] opened 1 year ago

github-actions[bot] commented 1 year ago

Sets the text before the attributions.

Adds an attribution text (e.g. 'Vector data © Mapbox').

Removes an attribution text.

@section Control options

@option attributionControl: Boolean = true

Whether a attribution control is added to the map by default.

@factory L.control.attribution(options: Control.Attribution options)

Creates an attribution control.

https://api.github.com/OpenSourcePolitics/decidim-ditp/blob/cf68cc605e2b45b5d16865ebf4eadd87b89a898f/packages/core/node_modules/leaflet/src/control/Control.Attribution.js#L38


import {Control} from './Control';
import {Map} from '../map/Map';
import * as Util from '../core/Util';
import * as DomEvent from '../dom/DomEvent';
import * as DomUtil from '../dom/DomUtil';

/*
 * @class Control.Attribution
 * @aka L.Control.Attribution
 * @inherits Control
 *
 * The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its [`attributionControl` option](#map-attributioncontrol) to `false`, and it fetches attribution texts from layers with the [`getAttribution` method](#layer-getattribution) automatically. Extends Control.
 */

export var Attribution = Control.extend({
    // @section
    // @aka Control.Attribution options
    options: {
        position: 'bottomright',

        // @option prefix: String = 'Leaflet'
        // The HTML text shown before the attributions. Pass `false` to disable.
        prefix: '<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'
    },

    initialize: function (options) {
        Util.setOptions(this, options);

        this._attributions = {};
    },

    onAdd: function (map) {
        map.attributionControl = this;
        this._container = DomUtil.create('div', 'leaflet-control-attribution');
        DomEvent.disableClickPropagation(this._container);

        // TODO ugly, refactor
        for (var i in map._layers) {
            if (map._layers[i].getAttribution) {
                this.addAttribution(map._layers[i].getAttribution());
            }
        }

        this._update();

        return this._container;
    },

    // @method setPrefix(prefix: String): this
    // Sets the text before the attributions.
    setPrefix: function (prefix) {
        this.options.prefix = prefix;
        this._update();
        return this;
    },

    // @method addAttribution(text: String): this
    // Adds an attribution text (e.g. `'Vector data &copy; Mapbox'`).
    addAttribution: function (text) {
        if (!text) { return this; }

        if (!this._attributions[text]) {
            this._attributions[text] = 0;
        }
        this._attributions[text]++;

        this._update();

        return this;
    },

    // @method removeAttribution(text: String): this
    // Removes an attribution text.
    removeAttribution: function (text) {
        if (!text) { return this; }

        if (this._attributions[text]) {
            this._attributions[text]--;
            this._update();
        }

        return this;
    },

    _update: function () {
        if (!this._map) { return; }

        var attribs = [];

        for (var i in this._attributions) {
            if (this._attributions[i]) {
                attribs.push(i);
            }
        }

        var prefixAndAttribs = [];

        if (this.options.prefix) {
            prefixAndAttribs.push(this.options.prefix);
        }
        if (attribs.length) {
            prefixAndAttribs.push(attribs.join(', '));
        }

        this._container.innerHTML = prefixAndAttribs.join(' | ');
    }
});

// @namespace Map
// @section Control options
// @option attributionControl: Boolean = true
// Whether a [attribution control](#control-attribution) is added to the map by default.
Map.mergeOptions({
    attributionControl: true
});

Map.addInitHook(function () {
    if (this.options.attributionControl) {
        new Attribution().addTo(this);
    }
});

// @namespace Control.Attribution
// @factory L.control.attribution(options: Control.Attribution options)
// Creates an attribution control.
export var attribution = function (options) {
    return new Attribution(options);
};