mirror of
https://github.com/cosmocode/dokuwiki-plugin-struct.git
synced 2025-08-03 15:59:53 +00:00
153 lines
4.7 KiB
JavaScript
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'), '');
|
|
}
|
|
});
|
|
});
|
|
|
|
};
|