ol-ext
Version:
A set of cool extensions for OpenLayers (ol) in node modules structure
114 lines (101 loc) • 4.01 kB
JavaScript
import ol_ext_element from '../element.js';
import ol_ext_input_Base from './Base.js'
/** Checkbox input
* @constructor
* @extends {ol_ext_input_Base}
* @param {*} options
* @param {string} [options.className]
* @param {Element} [options.input] input element, if non create one (use parent to tell where)
* @param {Element} [options.parent] element to use as parent if no input option
* @param {booelan} [options.hover=true] show popup on hover
* @param {string} [options.align=left] align popup left/right
* @param {string} [options.type] a slide type as 'size'
* @param {number} [options.min] min value, default use input min
* @param {number} [options.max] max value, default use input max
* @param {number} [options.step] step value, default use input step
* @param {boolean} [options.overflow=false] enable values over min/max
* @param {string|Element} [options.before] an element to add before the slider
* @param {string|Element} [options.after] an element to add after the slider
* @param {boolean} [options.fixed=false] no pupop
*/
var ol_ext_input_Slider = class olextinputSlider extends ol_ext_input_Base {
constructor(options) {
options = options || {};
super(options);
this.set('overflow', !!options.overflow);
this.element = ol_ext_element.create('DIV', {
className: 'ol-input-slider'
+ (options.hover !== false ? ' ol-hover' : '')
+ (options.type ? ' ol-' + options.type : '')
+ (options.className ? ' ' + options.className : '')
});
if (options.fixed)
this.element.classList.add('ol-fixed');
var input = this.input;
if (input.parentNode)
input.parentNode.insertBefore(this.element, input);
this.element.appendChild(input);
if (options.align === 'right')
this.element.classList.add('ol-right');
var popup = ol_ext_element.create('DIV', {
className: 'ol-popup',
parent: this.element
});
// Before element
if (options.before) {
ol_ext_element.create('DIV', {
className: 'ol-before',
html: options.before,
parent: popup
});
}
// Slider
var slider = this.slider = ol_ext_element.create('DIV', {
className: 'ol-slider',
parent: popup
});
ol_ext_element.create('DIV', {
className: 'ol-back',
parent: this.slider
});
// Cursor
var cursor = ol_ext_element.create('DIV', {
className: 'ol-cursor',
parent: slider
});
// After element
if (options.after) {
ol_ext_element.create('DIV', {
className: 'ol-after',
html: options.after,
parent: popup
});
}
var min = (options.min !== undefined) ? options.min : parseFloat(input.min) || 0;
var max = (options.max !== undefined) ? options.max : parseFloat(input.max) || 1;
var step = (options.step !== undefined) ? options.step : parseFloat(input.step) || 1;
var dstep = 1 / step;
// Handle popup drag
this._listenDrag(slider, function (e) {
var tx = Math.max(0, Math.min(e.offsetX / slider.clientWidth, 1));
cursor.style.left = Math.max(0, Math.min(100, Math.round(tx * 100))) + '%';
var v = input.value = Math.round((tx * (max - min) + min) * dstep) / dstep;
input.focus();
this.dispatchEvent({ type: 'change:value', value: v });
}.bind(this));
// Set value
var setValue = function () {
var v = parseFloat(input.value) || 0;
if (!this.get('overflow'))
v = Math.max(min, Math.min(max, v));
if (v != input.value)
input.value = v;
var tx = (v - min) / (max - min);
cursor.style.left = Math.max(0, Math.min(100, Math.round(tx * 100))) + '%';
this.dispatchEvent({ type: 'change:value', value: v });
}.bind(this);
input.addEventListener('change', setValue);
setValue();
}
}
export default ol_ext_input_Slider