Source: modules/config/Options.js

/**
 * @module config/Options.js
 * @name Options
 * @copyright 2023 3Liz
 * @author DHONT René-Luc
 * @license MPL-2.0
 */

import { BaseObjectConfig } from './BaseObject.js';
import { ValidationError } from './../Errors.js';
import { Extent } from './../utils/Extent.js';

const requiredProperties = {
    'bbox': {type: 'extent'},
    'initialExtent': {type: 'extent'},
    'mapScales': {type: 'array'},
    'minScale': {type: 'number'},
    'maxScale': {type: 'number'},
    'projection': {type: 'object'},
    'pointTolerance': {type: 'number'},
    'lineTolerance': {type: 'number'},
    'polygonTolerance': {type: 'number'},
    'popupLocation': {type: 'string'},
    'datavizLocation': {type: 'string'}
};

const optionalProperties = {
    'hideProject': {type: 'boolean', default: false},
    'wmsMaxHeight': {type: 'number', default: 3000},
    'wmsMaxWidth': {type: 'number', default: 3000},
    'fixed_scale_overview_map': {type: 'boolean', default: true},
    'max_scale_points': {type: 'number', default: 5000},
    'max_scale_lines_polygons': {type: 'number', default: 5000},
    'use_native_zoom_levels': {type: 'boolean', nullable: true, default: null},
    'hide_numeric_scale_value': {type: 'boolean', default: false},
    'hideGroupCheckbox': { type: 'boolean', default: false },
    'activateFirstMapTheme': { type: 'boolean', default: false },
    'automatic_permalink': { type: 'boolean', default: false },
    'wms_single_request_for_all_layers' : { type:'boolean', default: false }
};

/**
 * Class representing the options config
 * @class
 * @augments BaseObjectConfig
 */
export class OptionsConfig  extends BaseObjectConfig {

    /**
     * Create an options config instance based on a config object
     * @param {object}   cfg                                      - the lizmap config object for options
     * @param {number[]} cfg.bbox                                 - the project and web services max extent
     * @param {number[]} cfg.initialExtent                        - the map extent at the loading page
     * @param {number[]} cfg.mapScales                            - the map scales
     * @param {number}   cfg.minScale                             - the map's min scale
     * @param {number}   cfg.maxScale                             - the map's max scale
     * @param {object}   cfg.projection                           - the web map projection
     * @param {number}   cfg.pointTolerance                       - the point tolerance for QGIS Server WMS GetFeatureInfo request
     * @param {number}   cfg.lineTolerance                        - the line tolerance for QGIS Server WMS GetFeatureInfo request
     * @param {number}   cfg.polygonTolerance                     - the polygon tolerance for QGIS Server WMS GetFeatureInfo request
     * @param {string}   cfg.popupLocation                        - the popup location in the User interface: dock, bottom-dock, right-dock, mini-dock, map
     * @param {string}   cfg.datavizLocation                      - the popup location in the User interface: dock, bottom-dock, right-dock
     * @param {boolean}  [cfg.hideProject]                        - is the project hidden in user interface ? Only services are available.
     * @param {number}   [cfg.wmsMaxHeight]                       - the image max height for WMS GetMap request
     * @param {number}   [cfg.wmsMaxWidth]                        - the image max width for WMS GetMap request
     * @param {boolean}  [cfg.fixed_scale_overview_map]           - does the Overview map have fixed scale ?
     * @param {number}   [cfg.max_scale_points]                   - maximum scale when zooming on points
     * @param {boolean}  [cfg.max_scale_lines_polygons]           - maximum scale when zooming on lines or polygons
     * @param {boolean}  [cfg.use_native_zoom_levels]             - does the map use native zoom levels ?
     * @param {boolean}  [cfg.hide_numeric_scale_value]           - does the scale line hide numeric scale value ?
     * @param {boolean}  [cfg.hideGroupCheckbox]                  - are groups checkbox hidden ?
     * @param {boolean}  [cfg.activateFirstMapTheme]              - is first map theme activated ?
     * @param {boolean}  [cfg.automatic_permalink]                - is automatic permalink activated ?
     * @param {boolean}  [cfg.wms_single_request_for_all_layers]  - are layers loaded as single WMS image ?
     */
    constructor(cfg) {
        if (!cfg || typeof cfg !== "object") {
            throw new ValidationError('The `options` in the config is not an Object!');
        }

        if (Object.getOwnPropertyNames(cfg).length == 0) {
            throw new ValidationError('The `options` in the config is empty!');
        }

        super(cfg, requiredProperties, optionalProperties)
    }

    /**
     * The project is hidden in user interface
     * Services are still available
     * @type {boolean}
     */
    get hideProject() {
        return this._hideProject;
    }

    /**
     * The project and web services max extent
     * @type {Extent}
     */
    get bbox() {
        return this._bbox;
    }

    /**
     * The map extent at the loading page
     * @type {Extent}
     */
    get initialExtent() {
        return this._initialExtent;
    }

    /**
     * The web map scales
     * @type {Array}
     */
    get mapScales() {
        return this._mapScales;
    }

    /**
     * The web map min scale
     * @type {number}
     */
    get minScale() {
        return this._minScale;
    }

    /**
     * The web map max scale
     * @type {number}
     */
    get maxScale() {
        return this._maxScale;
    }

    /**
     * The web map projection
     * @type {object}
     */
    get projection() {
        return this._projection;
    }

    /**
     * The QGIS Server point tolerance for
     * WMS GetFeatureInfo request
     * @type {number}
     */
    get pointTolerance() {
        return this._pointTolerance;
    }

    /**
     * The QGIS Server line tolerance for
     * WMS GetFeatureInfo request
     * @type {number}
     */
    get lineTolerance() {
        return this._lineTolerance;
    }

    /**
     * The QGIS Server polygon tolerance for
     * WMS GetFeatureInfo request
     * @type {number}
     */
    get polygonTolerance() {
        return this._polygonTolerance;
    }

    /**
     * The popup location in the User interface
     * dock, bottom-dock, right-dock, mini-dock, map
     * @type {string}
     */
    get popupLocation() {
        return this._popupLocation;
    }

    /**
     * The popup location in the User interface
     * dock, bottom-dock, right-dock
     * @type {string}
     */
    get datavizLocation() {
        return this._datavizLocation;
    }

    /**
     * The image max height for WMS GetMap request
     * @type {number}
     */
    get wmsMaxHeight() {
        return this._wmsMaxHeight;
    }

    /**
     * The image max width for WMS GetMap request
     * @type {number}
     */
    get wmsMaxWidth() {
        return this._wmsMaxWidth;
    }

    /**
     * The Overview map has fixed scale
     * @type {boolean}
     */
    get fixed_scale_overview_map() {
        return this._fixed_scale_overview_map;
    }

    /**
     * Maximum scale when zooming on points
     * @type {boolean}
     */
    get max_scale_points() {
        return this._max_scale_points;
    }

    /**
     * Maximum scale when zooming on lines or polygons
     * @type {boolean}
     */
    get max_scale_lines_polygons() {
        return this._max_scale_lines_polygons;
    }

    /**
     * The map uses native zoom levels
     * @type {boolean}
     */
    get use_native_zoom_levels() {
        if (this._use_native_zoom_levels !== null) {
            return this._use_native_zoom_levels;
        }

        if (this.projection.ref == 'EPSG:3857') {
            return true;
        }
        if (this.mapScales.length == 2) {
            return true;
        }
        return false;
    }

    /**
     * Hide numeric scale value
     * @type {boolean}
     */
    get hide_numeric_scale_value() {
        return this._hide_numeric_scale_value;
    }

    /**
     * Hide groups checkbox
     * @type {boolean}
     */
    get hideGroupCheckbox() {
        return this._hideGroupCheckbox;
    }

    /**
     * Activate first map theme
     * @type {boolean}
     */
    get activateFirstMapTheme() {
        return this._activateFirstMapTheme;
    }

    /**
     * Activate first map theme
     * @type {boolean}
     */
    get automatic_permalink() {
        return this._automatic_permalink;
    }

    /**
     * The layers are loaded as a single WMS image
     * @type {boolean}
     */
    get wms_single_request_for_all_layers() {
        return this._wms_single_request_for_all_layers;
    }

}