Adding indexmenu version 2024-01-05 (ed06f21).
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
92cc8375f2
commit
f339727d60
766 changed files with 83299 additions and 0 deletions
349
plugins/55/indexmenu/scripts/toolbarindexwizard.js
Normal file
349
plugins/55/indexmenu/scripts/toolbarindexwizard.js
Normal file
|
@ -0,0 +1,349 @@
|
|||
/**
|
||||
* The Indexmenu Wizard
|
||||
*
|
||||
* @author Gerrit Uitslag
|
||||
* based on Linkwiz by
|
||||
* @author Andreas Gohr <gohr@cosmocode.de>
|
||||
* @author Pierre Spring <pierre.spring@caillou.ch>
|
||||
* and the concepts of the old indexmenu wizard
|
||||
*/
|
||||
const indexmenu_wiz = {
|
||||
$wiz: null,
|
||||
timer: null,
|
||||
textArea: null,
|
||||
|
||||
defaulttheme: 'default',
|
||||
fields: {
|
||||
div1: {
|
||||
elems: {
|
||||
jstoggle: {label: 'js'}
|
||||
}
|
||||
},
|
||||
div2: {
|
||||
tlbclass: 'jsitem theme',
|
||||
elems: {
|
||||
el1: {headerid: 'theme'}
|
||||
}
|
||||
},
|
||||
div3: {
|
||||
elems: {
|
||||
el2: {headerid: 'navigation'},
|
||||
navbar: {},
|
||||
context: {},
|
||||
nocookie: {tlbclass: 'jsitem'},
|
||||
noscroll: {tlbclass: 'jsitem'},
|
||||
notoc: {tlbclass: 'jsitem'}
|
||||
}
|
||||
},
|
||||
div4: {
|
||||
elems: {
|
||||
el3: {headerid: 'sort'},
|
||||
tsort: {},
|
||||
dsort: {},
|
||||
msort: {},
|
||||
hsort: {},
|
||||
rsort: {},
|
||||
nsort: {}
|
||||
}
|
||||
},
|
||||
div5: {
|
||||
elems: {
|
||||
el4: {headerid: 'filter'},
|
||||
nons: {},
|
||||
nopg: {}
|
||||
}
|
||||
},
|
||||
div6: {
|
||||
tlbclass: 'jsitem',
|
||||
elems: {
|
||||
el5: {headerid: 'performance'},
|
||||
max: {tlbclass: 'jsitem', numberinput: ['maxn', 'maxm']},
|
||||
maxjs: {tlbclass: 'jsitem', numberinput: ['maxjsn']},
|
||||
id: {tlbclass: 'jsitem', numberinput: ['idn']}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialize the indexmenu_wiz by creating the needed HTML
|
||||
* and attaching the eventhandlers
|
||||
*/
|
||||
init: function ($editor) {
|
||||
// position relative to the text area
|
||||
const pos = $editor.position();
|
||||
|
||||
// create HTML Structure
|
||||
indexmenu_wiz.$wiz = jQuery(document.createElement('div'))
|
||||
.dialog({
|
||||
autoOpen: false,
|
||||
draggable: true,
|
||||
title: LANG.plugins.indexmenu.indexmenuwizard,
|
||||
resizable: false
|
||||
})
|
||||
.html(
|
||||
'<fieldset class="indexmenu_index"><legend>' + LANG.plugins.indexmenu.index + '</legend>' +
|
||||
'<div><label>' + LANG.plugins.indexmenu.namespace + '<input id="namespace" type="text"></label></div>' +
|
||||
'<div><label class="number">' + LANG.plugins.indexmenu.nsdepth + ' #<input id="nsdepth" type="text" value=1></label></div>' +
|
||||
'</fieldset>' +
|
||||
|
||||
'<fieldset class="indexmenu_options"><legend>' + LANG.plugins.indexmenu.options + '</legend>' +
|
||||
'</fieldset>' +
|
||||
'<input type="submit" value="' + LANG.plugins.indexmenu.insert + '" class="button" id="indexmenu__insert">' +
|
||||
|
||||
'<fieldset class="indexmenu_metanumber">' +
|
||||
'<label class="number">' + LANG.plugins.indexmenu.metanum + '<input type="text" id="metanumber"></label>' +
|
||||
'<input type="submit" value="' + LANG.plugins.indexmenu.insertmetanum + '" class="button" id="indexmenu__insertmetanum">' +
|
||||
'</fieldset>'
|
||||
)
|
||||
.parent()
|
||||
.attr('id', 'indexmenu__wiz')
|
||||
.css({
|
||||
'position': 'absolute',
|
||||
'top': (pos.top + 20) + 'px',
|
||||
'left': (pos.left + 80) + 'px'
|
||||
})
|
||||
.hide()
|
||||
.appendTo('.dokuwiki:first');
|
||||
|
||||
indexmenu_wiz.textArea = $editor[0];
|
||||
let $opt_fieldset = jQuery('#indexmenu__wiz fieldset.indexmenu_options');
|
||||
|
||||
jQuery.each(indexmenu_wiz.fields, function (i, section) {
|
||||
let div = jQuery('<div>').addClass(section.tlbclass);
|
||||
|
||||
jQuery.each(section.elems, function (elid, props) {
|
||||
if (props.headerid) {
|
||||
div.append('<strong>' + LANG.plugins.indexmenu[props.headerid] + '</strong><br />');
|
||||
} else {
|
||||
let label = props.label || elid;
|
||||
//checkbox
|
||||
jQuery("<label>")
|
||||
.addClass(props.tlbclass).addClass(props.numberinput ? ' hasnumber' : '')
|
||||
.html('<input id="' + elid + '" type="checkbox">' + label)
|
||||
.attr({title: LANG.plugins.indexmenu[elid]})
|
||||
.appendTo(div);
|
||||
|
||||
//number inputs
|
||||
if (props.numberinput) {
|
||||
jQuery.each(props.numberinput, function (j, numid) {
|
||||
jQuery("<label>")
|
||||
.attr({title: LANG.plugins.indexmenu[elid]})
|
||||
.addClass("number " + props.tlbclass)
|
||||
.html('#<input type="text" id="' + numid + '">')
|
||||
.appendTo(div);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
$opt_fieldset.append(div);
|
||||
});
|
||||
|
||||
indexmenu_wiz.includeThemes();
|
||||
|
||||
if (JSINFO && JSINFO.namespace) {
|
||||
jQuery('#namespace').val(':' + JSINFO.namespace);
|
||||
}
|
||||
|
||||
// attach event handlers
|
||||
|
||||
//toggle js fields
|
||||
jQuery('#jstoggle')
|
||||
.on('change', function () {
|
||||
jQuery('#indexmenu__wiz .jsitem').toggle(this.checked);
|
||||
}).trigger('change')
|
||||
.parent().css({display: 'inline-block', width: '40px'}); //enlarge clickable area of label
|
||||
|
||||
//interactive number fields
|
||||
jQuery('label.number input').on('keydown keyup', function () {
|
||||
//allow only numbers
|
||||
indexmenu_wiz.filterNumberinput(this);
|
||||
//checked the option if a number in input
|
||||
indexmenu_wiz.autoCheckboxForNumbers(this);
|
||||
});
|
||||
|
||||
jQuery('#indexmenu__insert').on('click', indexmenu_wiz.insertIndexmenu);
|
||||
jQuery('#indexmenu__insertmetanum').on('click', indexmenu_wiz.insertMetaNumber);
|
||||
|
||||
jQuery('#indexmenu__wiz').find('.ui-dialog-titlebar-close').on('click', indexmenu_wiz.hide);
|
||||
},
|
||||
|
||||
/**
|
||||
* Request and include themes in wizard
|
||||
*/
|
||||
includeThemes: function () {
|
||||
|
||||
let addButtons = function (data) {
|
||||
jQuery('<div>')
|
||||
.attr('id', 'themebar')
|
||||
.addClass('toolbar')
|
||||
.appendTo('div.theme');
|
||||
|
||||
jQuery.each(data.themes, function (i, theme) {
|
||||
let themeName = theme.split('.');
|
||||
|
||||
let icoUrl = DOKU_BASE + data.themebase + '/' + theme + '/base.' + IndexmenuUtils.determineExtension(theme);
|
||||
let $ico = jQuery('<div>')
|
||||
.css({background: 'url(' + icoUrl + ') no-repeat center'});
|
||||
jQuery('<button>')
|
||||
.addClass('themebutton toolbutton')
|
||||
.attr('id', theme)
|
||||
.attr('title', themeName[0])
|
||||
.append($ico)
|
||||
.on('click', indexmenu_wiz.selectTheme)
|
||||
.appendTo('div#themebar');
|
||||
});
|
||||
|
||||
//select default theme
|
||||
jQuery('#themebar button#' + indexmenu_wiz.defaulttheme).trigger('click');
|
||||
};
|
||||
|
||||
jQuery.post(
|
||||
DOKU_BASE + 'lib/exe/ajax.php',
|
||||
{call: 'indexmenu', req: 'local'},
|
||||
addButtons,
|
||||
'json'
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* set class 'selected' to clicked theme, remove from other
|
||||
*/
|
||||
selectTheme: function () {
|
||||
jQuery('.themebutton').toggleClass('selected', false);
|
||||
jQuery(this).toggleClass('selected', true);
|
||||
},
|
||||
|
||||
/**
|
||||
* Allow only number, by direct removing other characters from input
|
||||
*/
|
||||
filterNumberinput: function (elem) {
|
||||
if (elem.value.match(/\D/)) {
|
||||
elem.value = this.value.replace(/\D/g, '');
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* When a number larger than zero is inputted, check the checkbox
|
||||
*/
|
||||
autoCheckboxForNumbers: function (elem) {
|
||||
let checkboxid = elem.id.substring(0, elem.id.length - 1);
|
||||
let value = elem.value;
|
||||
//exception for second number field of max: only uncheck when first field is also empty
|
||||
if (elem.id === 'maxm' && !(elem.value > 0)) {
|
||||
value = parseInt(jQuery('input#maxn').val());
|
||||
}
|
||||
jQuery('input#' + checkboxid).prop('checked', value > 0);
|
||||
},
|
||||
|
||||
/**
|
||||
* Insert the indexmenu with options to the textarea,
|
||||
* replacing the current selection or at the cursor position.
|
||||
*/
|
||||
insertIndexmenu: function () {
|
||||
let options = '';
|
||||
jQuery('fieldset.indexmenu_options input').each(function (i, input) {
|
||||
let $label = jQuery(this).parent();
|
||||
|
||||
if (input.checked && (!$label.hasClass('jsitem') || jQuery('input#jstoggle').is(':checked'))) {
|
||||
if (input.id === 'jstoggle') {
|
||||
//add js options
|
||||
options += ' js';
|
||||
//add theme
|
||||
let themename = jQuery('#themebar button.selected').attr('id');
|
||||
if (indexmenu_wiz.defaulttheme !== themename) { //skip default theme
|
||||
options += '#' + themename;
|
||||
}
|
||||
} else {
|
||||
//add option
|
||||
options += ' ' + input.id;
|
||||
//add numbers
|
||||
if ($label.hasClass('hasnumber')) {
|
||||
jQuery.each(indexmenu_wiz.fields.div6.elems[input.id].numberinput, function (j, numid) {
|
||||
let num = parseInt(jQuery('input#' + numid).val());
|
||||
options += num ? '#' + num : '';
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
options = options ? '|' + options.trim() : '';
|
||||
|
||||
let sel, ns, depth, syntax, eo;
|
||||
|
||||
// XXX: Compatibility Fix for 2014-05-05 "Ponder Stibbons", splitbrain/dokuwiki#505
|
||||
if (DWgetSelection) {
|
||||
sel = DWgetSelection(indexmenu_wiz.textArea);
|
||||
} else {
|
||||
sel = getSelection(indexmenu_wiz.textArea);
|
||||
}
|
||||
|
||||
|
||||
ns = jQuery('#namespace').val();
|
||||
depth = parseInt(jQuery('#nsdepth').val());
|
||||
depth = depth ? '#' + depth : '';
|
||||
|
||||
syntax = '{{indexmenu>' + ns + depth + options + '}}';
|
||||
eo = depth.length + options.length + 2;
|
||||
|
||||
pasteText(sel, syntax, {startofs: 12, endofs: eo});
|
||||
indexmenu_wiz.hide();
|
||||
},
|
||||
|
||||
/**
|
||||
* Insert meta number for sorting in textarea
|
||||
* Takes number from input, otherwise tries the selection in textarea
|
||||
*/
|
||||
insertMetaNumber: function () {
|
||||
let sel, selnum, syntax, number;
|
||||
|
||||
// XXX: Compatibility Fix for 2014-05-05 "Ponder Stibbons", splitbrain/dokuwiki#505
|
||||
if (DWgetSelection) {
|
||||
sel = DWgetSelection(indexmenu_wiz.textArea);
|
||||
} else {
|
||||
sel = getSelection(indexmenu_wiz.textArea);
|
||||
}
|
||||
|
||||
selnum = parseInt(sel.getText());
|
||||
number = parseInt(jQuery('input#metanumber').val());
|
||||
number = number || selnum || 1;
|
||||
syntax = '{{indexmenu_n>' + number + '}}';
|
||||
|
||||
pasteText(sel, syntax, {startofs: 14, endofs: 2});
|
||||
indexmenu_wiz.hide();
|
||||
},
|
||||
|
||||
/**
|
||||
* Show the indexmenu wizard
|
||||
*/
|
||||
show: function () {
|
||||
// XXX: Compatibility Fix for 2014-05-05 "Ponder Stibbons", splitbrain/dokuwiki#505
|
||||
if (DWgetSelection) {
|
||||
indexmenu_wiz.selection = DWgetSelection(indexmenu_wiz.textArea);
|
||||
} else {
|
||||
indexmenu_wiz.selection = getSelection(indexmenu_wiz.textArea);
|
||||
}
|
||||
|
||||
indexmenu_wiz.$wiz.show();
|
||||
jQuery('#namespace').trigger('focus');
|
||||
},
|
||||
|
||||
/**
|
||||
* Hide the indexmenu wizard
|
||||
*/
|
||||
hide: function () {
|
||||
indexmenu_wiz.$wiz.hide();
|
||||
indexmenu_wiz.textArea.focus(); //pure js
|
||||
},
|
||||
|
||||
/**
|
||||
* Toggle the indexmenu wizard
|
||||
*/
|
||||
toggle: function () {
|
||||
if (indexmenu_wiz.$wiz.css('display') === 'none') {
|
||||
indexmenu_wiz.show();
|
||||
} else {
|
||||
indexmenu_wiz.hide();
|
||||
}
|
||||
}
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue