Files
dokuwiki-plugin-struct/script/EntryEditor.js
2022-01-13 14:50:12 +01:00

153 lines
4.7 KiB
JavaScript

/**
* Attaches all the special handlers to the entry edit form
*
* @param {jQuery} $form The form where all the handlers are attached
*/
var EntryEditor = function ($form) {
/** counter for copied multi templates */
var copycount = 0;
/**
* hints
*/
$form.find('.struct .hashint').tooltip();
/**
* Attach datepicker to date types, if lacking HTML5 support.
*/
var ftypetext = function () {
return this.type === 'text';
};
$form.find('input.struct_date').filter(ftypetext).datepicker({
dateFormat: 'yy-mm-dd',
changeYear: true,
});
/**
* Attach datepicker to datetype types, keeps time part.
* Only if browser does not support HTML5 datetime-local input.
*/
$form.find('input.struct_datetime').filter(ftypetext).each(function (index, element) {
const $dtInput = jQuery(element);
$dtInput.val($dtInput.val().replace('T', ' '));
$dtInput.datepicker({
dateFormat: 'yy-mm-dd',
changeYear: true,
onSelect: function (date, inst) {
var $input = jQuery(this);
var both = inst.lastVal.split(' ', 2);
if (both.length === 2) {
date += ' ' + both[1];
} else {
date += ' 00:00';
}
$input.val(date);
}
});
});
/**
* Attach image dialog to image types
*/
$form.find('button.struct_media').click(function () {
var input_id = jQuery(this).siblings('input').attr('id');
window.open(
DOKU_BASE + 'lib/exe/mediamanager.php' +
'?ns=' + encodeURIComponent(JSINFO['namespace']) +
'&edid=' + encodeURIComponent(input_id) +
'&onselect=insertStructMedia',
'mediaselect',
'width=750,height=500,left=20,top=20,scrollbars=yes,resizable=yes'); //
});
/**
* Autocomplete for single type
*/
$form.find('input.struct_autocomplete').autocomplete({
ismulti: false,
source: function (request, cb) {
var name = jQuery(this.element[0]).closest('div.field').find('label').first().data('column');
var term = request.term;
if (this.options.ismulti) {
term = extractLast(term);
}
struct_ajax(name, cb, {search: term});
}
});
/**
* Autocomplete for multi type
*/
$form.find('.multiwrap input.struct_autocomplete').autocomplete('option', {
ismulti: true,
focus: function () {
// prevent value inserted on focus
return false;
},
select: function (event, ui) {
var terms = split(this.value);
// remove the current input
terms.pop();
// add the selected item
terms.push(ui.item.value);
// add placeholder to get the comma-and-space at the end
terms.push("");
this.value = terms.join(", ");
return false;
}
});
/**
* Duplicate the elements in .newtemplate whenever any input in it changes
*/
$form.find('.newtemplate').each(function () {
var $tplwrapper = jQuery(this);
var $tpl = $tplwrapper.children().clone(true, true);
$tplwrapper.on('change', 'input,textarea,select', function () {
if (jQuery(this).val() == '') return;
// prepare a new template and make sure all the IDs in it are unique
var $copy = $tpl.clone(true, true);
copycount++;
$copy.find('*[id]').each(function () {
this.id = this.id + '_' + copycount;
});
// move edited .multiwrap out of .newtemplate container
$tplwrapper.before(jQuery(this).closest('.multiwrap').detach());
// append the template
$tplwrapper.append($copy);
});
});
/**
* Toggle fieldsets in edit form and remeber in cookie
*/
$form.find('.struct_entry_form fieldset legend').each(function () {
var $legend = jQuery(this);
var $fset = $legend.parent();
// reinit saved state from cookie
if (DokuCookie.getValue($fset.data('schema'))) {
$fset.toggleClass('closed');
}
// attach click handler
$legend.click(function () {
$fset.toggleClass('closed');
// remember setting in preference cookie
if ($fset.hasClass('closed')) {
DokuCookie.setValue($fset.data('schema'), 1);
} else {
DokuCookie.setValue($fset.data('schema'), '');
}
});
});
};