You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
3.2 KiB
134 lines
3.2 KiB
/* global ns*/
|
|
H5PEditor.widgets.select = H5PEditor.Select = (function (E) {
|
|
/**
|
|
* Initialize a new widget.
|
|
*
|
|
* @param {object} parent
|
|
* @param {object} field
|
|
* @param {object} params
|
|
* @param {function} setValue
|
|
* @returns {_L3.C}
|
|
*/
|
|
function C(parent, field, params, setValue) {
|
|
this.field = field;
|
|
this.value = params;
|
|
this.setValue = setValue;
|
|
|
|
// Setup event dispatching on change
|
|
this.changes = [];
|
|
this.triggerListeners = function (value) {
|
|
// Run callbacks
|
|
for (var i = 0; i < this.changes.length; i++) {
|
|
this.changes[i](value);
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Append widget to the DOM.
|
|
*
|
|
* @param {jQuery} $wrapper
|
|
* @returns {undefined}
|
|
*/
|
|
C.prototype.appendTo = function ($wrapper) {
|
|
var that = this;
|
|
|
|
this.$item = E.$(this.createHtml()).appendTo($wrapper);
|
|
this.$select = this.$item.find('select');
|
|
this.$errors = this.$item.children('.h5p-errors');
|
|
|
|
this.$select.change(function () {
|
|
var val = that.validate();
|
|
if (val !== false) {
|
|
that.value = val;
|
|
that.setValue(that.field, val);
|
|
that.triggerListeners(val);
|
|
}
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Generate HTML for the widget.
|
|
*
|
|
* @returns {String} HTML.
|
|
*/
|
|
C.prototype.createHtml = function () {
|
|
const id = ns.getNextFieldId(this.field);
|
|
|
|
let options = '';
|
|
if (this.field.optional === true || this.field.default === undefined) {
|
|
options = E.createOption('-', '-');
|
|
}
|
|
options += C.createOptionsHtml(this.field.options, this.value);
|
|
|
|
let select = '<select id="' + id + '"';
|
|
if (this.field.description !== undefined) {
|
|
select += ' aria-describedby="' + ns.getDescriptionId(id) + '"';
|
|
}
|
|
select += ' class="h5peditor-select">' + options + '</select>';
|
|
|
|
return E.createFieldMarkup(this.field, select, id);
|
|
};
|
|
|
|
/**
|
|
* Generate HTML for select options.
|
|
*
|
|
* @param {Array} options
|
|
* @param {string} selected value
|
|
* @return {string}
|
|
*/
|
|
C.createOptionsHtml = function (options, selected) {
|
|
var html = '';
|
|
|
|
for (var i = 0; i < options.length; i++) {
|
|
if (options[i].type === 'optgroup') {
|
|
html += '<optgroup label="' + options[i].label + '" >';
|
|
html += C.createOptionsHtml(options[i].options, selected);
|
|
html += '</optgroup>';
|
|
}
|
|
else {
|
|
html += E.createOption(options[i].value, options[i].label, options[i].value === selected);
|
|
}
|
|
}
|
|
|
|
return html;
|
|
};
|
|
|
|
/**
|
|
* Validate this field.
|
|
*
|
|
* @returns {Boolean}
|
|
*/
|
|
C.prototype.validate = function () {
|
|
var value = this.$select.val();
|
|
if (value === '-') {
|
|
value = undefined; // No value selected
|
|
}
|
|
|
|
if (this.field.optional !== true && value === undefined) {
|
|
// Not optional and no value selected, print required error
|
|
this.$errors.append(ns.createError(ns.t('core', 'requiredProperty', {':property': ns.t('core', 'textField')})));
|
|
|
|
return false;
|
|
}
|
|
|
|
// All valid. Remove old errors
|
|
var $errors = this.$errors.children();
|
|
if ($errors.length) {
|
|
$errors.remove();
|
|
}
|
|
|
|
return value;
|
|
};
|
|
|
|
/**
|
|
* Remove widget from DOM.
|
|
*
|
|
* @returns {undefined}
|
|
*/
|
|
C.prototype.remove = function () {
|
|
this.$item.remove();
|
|
};
|
|
|
|
return C;
|
|
})(H5PEditor);
|
|
|