summaryrefslogtreecommitdiffstats
path: root/plugins/55/indexmenu/scripts/toolbarindexwizard.js
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/55/indexmenu/scripts/toolbarindexwizard.js')
-rw-r--r--plugins/55/indexmenu/scripts/toolbarindexwizard.js349
1 files changed, 349 insertions, 0 deletions
diff --git a/plugins/55/indexmenu/scripts/toolbarindexwizard.js b/plugins/55/indexmenu/scripts/toolbarindexwizard.js
new file mode 100644
index 0000000..3a81b4b
--- /dev/null
+++ b/plugins/55/indexmenu/scripts/toolbarindexwizard.js
@@ -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();
+ }
+ }
+};