qwc2
Version:
QGIS Web Client
230 lines (229 loc) • 10.1 kB
JavaScript
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
/**
* Copyright 2020-2024 Sourcepole AG
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
import React from 'react';
import classNames from 'classnames';
import isEmpty from 'lodash.isempty';
import PropTypes from 'prop-types';
import MiscUtils from '../../utils/MiscUtils';
import Icon from '../Icon';
import InputContainer from './InputContainer';
import PopupMenu from './PopupMenu';
import './style/EditableSelect.css';
var EditableSelect = /*#__PURE__*/function (_React$Component) {
function EditableSelect(props) {
var _this;
_classCallCheck(this, EditableSelect);
_this = _callSuper(this, EditableSelect, [props]);
_defineProperty(_this, "state", {
propValue: "",
value: "",
manualInput: false,
selectedOption: null,
focused: false,
popup: false
});
_defineProperty(_this, "renderOptions", function () {
var lvalue = _this.state.value.toLowerCase();
var options = _this.props.options.map(function (option, idx) {
var label = EditableSelect.optionLabel(option);
if (_this.state.manualInput && lvalue && !label.toLowerCase().includes(lvalue)) {
return null;
}
return /*#__PURE__*/React.createElement("div", {
key: "opt" + idx,
onClick: function onClick() {
return _this.optionSelected(option);
},
onMouseDown: MiscUtils.killEvent,
title: label
}, label);
}).filter(Boolean);
return !isEmpty(options) ? /*#__PURE__*/React.createElement(PopupMenu, {
anchor: _this.el,
className: "editable-select-dropdown",
onClose: function onClose() {
return _this.setState({
popup: false
});
}
}, options) : null;
});
_defineProperty(_this, "renderSelectedOption", function () {
var label = EditableSelect.optionLabel(_this.state.selectedOption);
return /*#__PURE__*/React.createElement("div", {
className: "editable-select-selopt",
onClick: function onClick() {
return _this.setState({
popup: true
});
},
title: label
}, label);
});
_defineProperty(_this, "valueChanged", function (ev) {
_this.setState({
value: ev.target.value,
selectedOption: null,
manualInput: true
});
});
_defineProperty(_this, "optionSelected", function (option) {
var value = EditableSelect.optionValue(option);
_this.props.onChange(value);
_this.setState({
selectedOption: option,
popup: false,
value: value
});
});
_defineProperty(_this, "clear", function () {
if (!_this.props.readOnly) {
_this.props.onChange("");
}
});
_defineProperty(_this, "onClick", function (ev) {
if (!_this.state.manualInput) {
ev.target.select();
_this.setState({
popup: true
});
}
});
_defineProperty(_this, "onFocus", function (ev) {
ev.target.select();
_this.setState({
focused: true,
manualInput: false
});
});
_defineProperty(_this, "onBlur", function () {
if (!_this.props.readOnly) {
_this.props.onChange(_this.state.value.trim());
_this.setState({
focused: false
});
}
});
_defineProperty(_this, "onKeyDown", function (ev) {
if (!_this.props.readOnly && ev.key === 'Enter') {
_this.props.onChange(_this.state.value.trim());
MiscUtils.killEvent(ev);
if (_this.props.onSubmit) {
_this.props.onSubmit(_this.state.value.trim());
}
}
});
_this.el = null;
return _this;
}
_inherits(EditableSelect, _React$Component);
return _createClass(EditableSelect, [{
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps, prevState) {
if (this.state.value !== prevState.value && !this.state.manualInput && document.activeElement === this.el) {
this.el.select();
} else if (!this.state.value && this.state.manualInput) {
this.setState({
manualInput: false,
popup: true
});
}
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var classes = classNames(_defineProperty({
EditableSelect: true
}, this.props.className, true));
return /*#__PURE__*/React.createElement("div", {
className: classes
}, /*#__PURE__*/React.createElement(InputContainer, {
className: "editable-select-inputcontainer"
}, /*#__PURE__*/React.createElement("input", {
autoComplete: "off",
name: this.props.name,
onBlur: this.onBlur,
onChange: this.valueChanged,
onClick: this.onClick,
onFocus: this.onFocus,
onKeyDown: this.onKeyDown,
placeholder: this.props.placeholder,
readOnly: this.props.readOnly,
ref: function ref(el) {
_this2.el = el;
},
role: "input",
type: "text",
value: this.state.value
}), /*#__PURE__*/React.createElement(Icon, {
icon: "clear",
onClick: this.clear,
role: "suffix"
})), this.state.selectedOption ? this.renderSelectedOption() : null, this.el && this.state.popup && !this.props.readOnly ? this.renderOptions() : null);
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(nextProps, state) {
var _nextProps$value;
if (state.focused) {
// No changes while focussed
return null;
}
var value = String((_nextProps$value = nextProps.value) !== null && _nextProps$value !== void 0 ? _nextProps$value : "");
if (value !== state.propValue) {
var _nextProps$options$fi;
var selectedOption = (_nextProps$options$fi = nextProps.options.find(function (option) {
return EditableSelect.optionValue(option) === value;
})) !== null && _nextProps$options$fi !== void 0 ? _nextProps$options$fi : null;
return {
propValue: value,
value: value,
manualInput: false,
selectedOption: selectedOption
};
}
return null;
}
}, {
key: "optionLabel",
value: function optionLabel(option) {
return _typeof(option) === 'object' ? option.label : String(option);
}
}, {
key: "optionValue",
value: function optionValue(option) {
return _typeof(option) === 'object' ? option.value : String(option);
}
}]);
}(React.Component);
_defineProperty(EditableSelect, "propTypes", {
className: PropTypes.string,
name: PropTypes.string,
onChange: PropTypes.func,
onSubmit: PropTypes.func,
options: PropTypes.array,
placeholder: PropTypes.string,
readOnly: PropTypes.bool,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number])
});
export { EditableSelect as default };