415 lines
14 KiB
JavaScript
415 lines
14 KiB
JavaScript
/**
|
|
* @class elFinder command "help"
|
|
* "About" dialog
|
|
*
|
|
* @author Dmitry (dio) Levashov
|
|
**/
|
|
(elFinder.prototype.commands.help = function() {
|
|
"use strict";
|
|
var fm = this.fm,
|
|
self = this,
|
|
linktpl = '<div class="elfinder-help-link"> <a href="{url}">{link}</a></div>',
|
|
linktpltgt = '<div class="elfinder-help-link"> <a href="{url}" target="_blank">{link}</a></div>',
|
|
atpl = '<div class="elfinder-help-team"><div>{author}</div>{work}</div>',
|
|
url = /\{url\}/,
|
|
link = /\{link\}/,
|
|
author = /\{author\}/,
|
|
work = /\{work\}/,
|
|
r = 'replace',
|
|
prim = 'ui-priority-primary',
|
|
sec = 'ui-priority-secondary',
|
|
lic = 'elfinder-help-license',
|
|
tab = '<li class="' + fm.res('class', 'tabstab') + ' elfinder-help-tab-{id}"><a href="#'+fm.namespace+'-help-{id}" class="ui-tabs-anchor">{title}</a></li>',
|
|
html = ['<div class="ui-tabs ui-widget ui-widget-content ui-corner-all elfinder-help">',
|
|
'<ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-top">'],
|
|
stpl = '<div class="elfinder-help-shortcut"><div class="elfinder-help-shortcut-pattern">{pattern}</div> {descrip}</div>',
|
|
sep = '<div class="elfinder-help-separator"></div>',
|
|
selfUrl = jQuery('base').length? fm.escape(document.location.href.replace(/#.*$/, '')) : '',
|
|
clTabActive = fm.res('class', 'tabsactive'),
|
|
|
|
getTheme = function() {
|
|
var src;
|
|
if (fm.theme && fm.theme.author) {
|
|
src = atpl[r]('elfinder-help-team', 'elfinder-help-team elfinder-help-term-theme')[r](author, fm.i18n(fm.theme.author) + (fm.theme.email? ' <'+fm.theme.email+'>' : ''))[r](work, fm.i18n('theme') + ' ('+fm.i18n(fm.theme.name)+')');
|
|
} else {
|
|
src = '<div class="elfinder-help-team elfinder-help-term-theme" style="display:none"></div>';
|
|
}
|
|
return src;
|
|
},
|
|
|
|
about = function() {
|
|
html.push('<div id="'+fm.namespace+'-help-about" class="ui-tabs-panel ui-widget-content ui-corner-bottom"><div class="elfinder-help-logo"></div>');
|
|
html.push('<h3>elFinder</h3>');
|
|
html.push('<div class="'+prim+'">'+fm.i18n('webfm')+'</div>');
|
|
html.push('<div class="'+sec+'">'+fm.i18n('ver')+': '+fm.version+'</div>');
|
|
html.push('<div class="'+sec+'">'+fm.i18n('protocolver')+': <span class="apiver"></span></div>');
|
|
html.push('<div class="'+sec+'">jQuery/jQuery UI: '+jQuery().jquery+'/'+jQuery.ui.version+'</div>');
|
|
|
|
html.push(sep);
|
|
|
|
html.push(linktpltgt[r](url, 'https://studio-42.github.io/elFinder/')[r](link, fm.i18n('homepage')));
|
|
html.push(linktpltgt[r](url, 'https://github.com/Studio-42/elFinder/wiki')[r](link, fm.i18n('docs')));
|
|
html.push(linktpltgt[r](url, 'https://github.com/Studio-42/elFinder')[r](link, fm.i18n('github')));
|
|
//html.push(linktpltgt[r](url, 'http://twitter.com/elrte_elfinder')[r](link, fm.i18n('twitter')));
|
|
|
|
html.push(sep);
|
|
|
|
html.push('<div class="'+prim+'">'+fm.i18n('team')+'</div>');
|
|
|
|
html.push(atpl[r](author, 'Dmitry "dio" Levashov <dio@std42.ru>')[r](work, fm.i18n('chiefdev')));
|
|
html.push(atpl[r](author, 'Naoki Sawada <hypweb+elfinder@gmail.com>')[r](work, fm.i18n('developer')));
|
|
html.push(atpl[r](author, 'Troex Nevelin <troex@fury.scancode.ru>')[r](work, fm.i18n('maintainer')));
|
|
html.push(atpl[r](author, 'Alexey Sukhotin <strogg@yandex.ru>')[r](work, fm.i18n('contributor')));
|
|
|
|
if (fm.i18[fm.lang].translator) {
|
|
jQuery.each(fm.i18[fm.lang].translator.split(', '), function() {
|
|
html.push(atpl[r](author, jQuery.trim(this))[r](work, fm.i18n('translator')+' ('+fm.i18[fm.lang].language+')'));
|
|
});
|
|
}
|
|
|
|
html.push(getTheme());
|
|
|
|
html.push(sep);
|
|
html.push('<div class="'+lic+'">'+fm.i18n('icons')+': Pixelmixer, <a href="http://p.yusukekamiyamane.com" target="_blank">Fugue</a>, <a href="https://icons8.com" target="_blank">Icons8</a></div>');
|
|
|
|
html.push(sep);
|
|
html.push('<div class="'+lic+'">Licence: 3-clauses BSD Licence</div>');
|
|
html.push('<div class="'+lic+'">Copyright © 2009-2021, Studio 42</div>');
|
|
html.push('<div class="'+lic+'">„ …'+fm.i18n('dontforget')+' ”</div>');
|
|
html.push('</div>');
|
|
},
|
|
shortcuts = function() {
|
|
var sh = fm.shortcuts();
|
|
// shortcuts tab
|
|
html.push('<div id="'+fm.namespace+'-help-shortcuts" class="ui-tabs-panel ui-widget-content ui-corner-bottom">');
|
|
|
|
if (sh.length) {
|
|
html.push('<div class="ui-widget-content elfinder-help-shortcuts">');
|
|
jQuery.each(sh, function(i, s) {
|
|
html.push(stpl.replace(/\{pattern\}/, s[0]).replace(/\{descrip\}/, s[1]));
|
|
});
|
|
|
|
html.push('</div>');
|
|
} else {
|
|
html.push('<div class="elfinder-help-disabled">'+fm.i18n('shortcutsof')+'</div>');
|
|
}
|
|
|
|
|
|
html.push('</div>');
|
|
|
|
},
|
|
help = function() {
|
|
// help tab
|
|
html.push('<div id="'+fm.namespace+'-help-help" class="ui-tabs-panel ui-widget-content ui-corner-bottom">');
|
|
html.push('<a href="https://github.com/Studio-42/elFinder/wiki" target="_blank" class="elfinder-dont-panic"><span>DON\'T PANIC</span></a>');
|
|
html.push('</div>');
|
|
// end help
|
|
},
|
|
useInteg = false,
|
|
integrations = function() {
|
|
useInteg = true;
|
|
html.push('<div id="'+fm.namespace+'-help-integrations" class="ui-tabs-panel ui-widget-content ui-corner-bottom"></div>');
|
|
},
|
|
useDebug = false,
|
|
debug = function() {
|
|
useDebug = true;
|
|
// debug tab
|
|
html.push('<div id="'+fm.namespace+'-help-debug" class="ui-tabs-panel ui-widget-content ui-corner-bottom">');
|
|
html.push('<div class="ui-widget-content elfinder-help-debug"><ul></ul></div>');
|
|
html.push('</div>');
|
|
// end debug
|
|
},
|
|
debugRender = function() {
|
|
var render = function(elm, obj) {
|
|
jQuery.each(obj, function(k, v) {
|
|
elm.append(jQuery('<dt></dt>').text(k));
|
|
if (typeof v === 'undefined') {
|
|
elm.append(jQuery('<dd></dd>').append(jQuery('<span></span>').text('undfined')));
|
|
} else if (typeof v === 'object' && !v) {
|
|
elm.append(jQuery('<dd></dd>').append(jQuery('<span></span>').text('null')));
|
|
} else if (typeof v === 'object' && (jQuery.isPlainObject(v) || v.length)) {
|
|
elm.append( jQuery('<dd></dd>').append(render(jQuery('<dl></dl>'), v)));
|
|
} else {
|
|
elm.append(jQuery('<dd></dd>').append(jQuery('<span></span>').text((v && typeof v === 'object')? '[]' : (v? v : '""'))));
|
|
}
|
|
});
|
|
return elm;
|
|
},
|
|
cnt = debugUL.children('li').length,
|
|
targetL, target, tabId,
|
|
info, lastUL, lastDIV;
|
|
|
|
if (self.debug.options || self.debug.debug) {
|
|
if (cnt >= 5) {
|
|
lastUL = debugUL.children('li:last');
|
|
lastDIV = debugDIV.children('div:last');
|
|
if (lastDIV.is(':hidden')) {
|
|
lastUL.remove();
|
|
lastDIV.remove();
|
|
} else {
|
|
lastUL.prev().remove();
|
|
lastDIV.prev().remove();
|
|
}
|
|
}
|
|
|
|
tabId = fm.namespace + '-help-debug-' + (+new Date());
|
|
targetL = jQuery('<li></li>').html('<a href="'+selfUrl+'#'+tabId+'">'+self.debug.debug.cmd+'</a>').prependTo(debugUL);
|
|
target = jQuery('<div id="'+tabId+'"></div>').data('debug', self.debug);
|
|
|
|
targetL.on('click.debugrender', function() {
|
|
var debug = target.data('debug');
|
|
target.removeData('debug');
|
|
if (debug) {
|
|
target.hide();
|
|
if (debug.debug) {
|
|
info = jQuery('<fieldset>').append(jQuery('<legend></legend>').text('debug'), render(jQuery('<dl></dl>'), debug.debug));
|
|
target.append(info);
|
|
}
|
|
if (debug.options) {
|
|
info = jQuery('<fieldset>').append(jQuery('<legend></legend>').text('options'), render(jQuery('<dl></dl>'), debug.options));
|
|
target.append(info);
|
|
}
|
|
target.show();
|
|
}
|
|
targetL.off('click.debugrender');
|
|
});
|
|
|
|
debugUL.after(target);
|
|
|
|
opened && debugDIV.tabs('refresh');
|
|
}
|
|
},
|
|
content = '',
|
|
opened, tabInteg, integDIV, tabDebug, debugDIV, debugUL;
|
|
|
|
this.alwaysEnabled = true;
|
|
this.updateOnSelect = false;
|
|
this.state = -1;
|
|
|
|
this.shortcuts = [{
|
|
pattern : 'f1',
|
|
description : this.title
|
|
}];
|
|
|
|
fm.bind('load', function() {
|
|
var parts = self.options.view || ['about', 'shortcuts', 'help', 'integrations', 'debug'],
|
|
i, helpSource, tabBase, tabNav, tabs, delta;
|
|
|
|
// remove 'preference' tab, it moved to command 'preference'
|
|
if ((i = jQuery.inArray('preference', parts)) !== -1) {
|
|
parts.splice(i, 1);
|
|
}
|
|
|
|
// debug tab require jQueryUI Tabs Widget
|
|
if (! jQuery.fn.tabs) {
|
|
if ((i = jQuery.inArray(parts, 'debug')) !== -1) {
|
|
parts.splice(i, 1);
|
|
}
|
|
}
|
|
|
|
jQuery.each(parts, function(i, title) {
|
|
html.push(tab[r](/\{id\}/g, title)[r](/\{title\}/, fm.i18n(title)));
|
|
});
|
|
|
|
html.push('</ul>');
|
|
|
|
jQuery.inArray('about', parts) !== -1 && about();
|
|
jQuery.inArray('shortcuts', parts) !== -1 && shortcuts();
|
|
if (jQuery.inArray('help', parts) !== -1) {
|
|
helpSource = fm.i18nBaseUrl + 'help/%s.html.js';
|
|
help();
|
|
}
|
|
jQuery.inArray('integrations', parts) !== -1 && integrations();
|
|
jQuery.inArray('debug', parts) !== -1 && debug();
|
|
|
|
html.push('</div>');
|
|
content = jQuery(html.join(''));
|
|
|
|
content.find('.ui-tabs-nav li')
|
|
.on('mouseenter mouseleave', function(e) {
|
|
jQuery(this).toggleClass('ui-state-hover', e.type === 'mouseenter');
|
|
})
|
|
.on('focus blur', 'a', function(e) {
|
|
jQuery(e.delegateTarget).toggleClass('ui-state-focus', e.type === 'focusin');
|
|
})
|
|
.children()
|
|
.on('click', function(e) {
|
|
var link = jQuery(this);
|
|
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
link.parent().addClass(clTabActive).siblings().removeClass(clTabActive);
|
|
content.children('.ui-tabs-panel').hide().filter(link.attr('href')).show();
|
|
})
|
|
.filter(':first').trigger('click');
|
|
|
|
if (useInteg) {
|
|
tabInteg = content.find('.elfinder-help-tab-integrations').hide();
|
|
integDIV = content.find('#'+fm.namespace+'-help-integrations').hide().append(jQuery('<div class="elfinder-help-integrations-desc"></div>').html(fm.i18n('integrationWith')));
|
|
fm.bind('helpIntegration', function(e) {
|
|
var ul = integDIV.children('ul:first'),
|
|
data, elm, cmdUL, cmdCls;
|
|
if (e.data) {
|
|
if (jQuery.isPlainObject(e.data)) {
|
|
data = Object.assign({
|
|
link: '',
|
|
title: '',
|
|
banner: ''
|
|
}, e.data);
|
|
if (data.title || data.link) {
|
|
if (!data.title) {
|
|
data.title = data.link;
|
|
}
|
|
if (data.link) {
|
|
elm = jQuery('<a></a>').attr('href', data.link).attr('target', '_blank').text(data.title);
|
|
} else {
|
|
elm = jQuery('<span></span>').text(data.title);
|
|
}
|
|
if (data.banner) {
|
|
elm = jQuery('<span></span>').append(jQuery('<img/>').attr(data.banner), elm);
|
|
}
|
|
}
|
|
} else {
|
|
elm = jQuery(e.data);
|
|
elm.filter('a').each(function() {
|
|
var tgt = jQuery(this);
|
|
if (!tgt.attr('target')) {
|
|
tgt.attr('target', '_blank');;
|
|
}
|
|
});
|
|
}
|
|
if (elm) {
|
|
tabInteg.show();
|
|
if (!ul.length) {
|
|
ul = jQuery('<ul class="elfinder-help-integrations"></ul>').appendTo(integDIV);
|
|
}
|
|
if (data && data.cmd) {
|
|
cmdCls = 'elfinder-help-integration-' + data.cmd;
|
|
cmdUL = ul.find('ul.' + cmdCls);
|
|
if (!cmdUL.length) {
|
|
cmdUL = jQuery('<ul class="'+cmdCls+'"></ul>');
|
|
ul.append(jQuery('<li></li>').append(jQuery('<span></span>').html(fm.i18n('cmd'+data.cmd))).append(cmdUL));
|
|
}
|
|
elm = cmdUL.append(jQuery('<li></li>').append(elm));
|
|
} else {
|
|
ul.append(jQuery('<li></li>').append(elm));
|
|
}
|
|
}
|
|
}
|
|
}).bind('themechange', function() {
|
|
content.find('div.elfinder-help-term-theme').replaceWith(getTheme());
|
|
});
|
|
}
|
|
|
|
// debug
|
|
if (useDebug) {
|
|
tabDebug = content.find('.elfinder-help-tab-debug').hide();
|
|
debugDIV = content.find('#'+fm.namespace+'-help-debug').children('div:first');
|
|
debugUL = debugDIV.children('ul:first').on('click', function(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
});
|
|
|
|
self.debug = {};
|
|
|
|
fm.bind('backenddebug', function(e) {
|
|
// CAUTION: DO NOT TOUCH `e.data`
|
|
if (useDebug && e.data && e.data.debug) {
|
|
self.debug = { options : e.data.options, debug : Object.assign({ cmd : fm.currentReqCmd }, e.data.debug) };
|
|
if (self.dialog) {
|
|
debugRender();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
content.find('#'+fm.namespace+'-help-about').find('.apiver').text(fm.api);
|
|
self.dialog = self.fmDialog(content, {
|
|
title : self.title,
|
|
width : 530,
|
|
maxWidth: 'window',
|
|
maxHeight: 'window',
|
|
autoOpen : false,
|
|
destroyOnClose : false,
|
|
close : function() {
|
|
if (useDebug) {
|
|
tabDebug.hide();
|
|
debugDIV.tabs('destroy');
|
|
}
|
|
opened = false;
|
|
}
|
|
})
|
|
.on('click', function(e) {
|
|
e.stopPropagation();
|
|
})
|
|
.css({
|
|
overflow: 'hidden'
|
|
});
|
|
|
|
tabBase = self.dialog.children('.ui-tabs');
|
|
tabNav = tabBase.children('.ui-tabs-nav:first');
|
|
tabs = tabBase.children('.ui-tabs-panel');
|
|
delta = self.dialog.outerHeight(true) - self.dialog.height();
|
|
self.dialog.closest('.ui-dialog').on('resize', function() {
|
|
tabs.height(self.dialog.height() - delta - tabNav.outerHeight(true) - 20);
|
|
});
|
|
|
|
if (helpSource) {
|
|
self.dialog.one('initContents', function() {
|
|
jQuery.ajax({
|
|
url: self.options.helpSource? self.options.helpSource : helpSource.replace('%s', fm.lang),
|
|
dataType: 'html'
|
|
}).done(function(source) {
|
|
jQuery('#'+fm.namespace+'-help-help').html(source);
|
|
}).fail(function() {
|
|
jQuery.ajax({
|
|
url: helpSource.replace('%s', 'en'),
|
|
dataType: 'html'
|
|
}).done(function(source) {
|
|
jQuery('#'+fm.namespace+'-help-help').html(source);
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
self.state = 0;
|
|
|
|
fm.trigger('helpBuilded', self.dialog);
|
|
}).one('open', function() {
|
|
var debug = false;
|
|
fm.one('backenddebug', function() {
|
|
debug =true;
|
|
}).one('opendone', function() {
|
|
requestAnimationFrame(function() {
|
|
if (! debug && useDebug) {
|
|
useDebug = false;
|
|
tabDebug.hide();
|
|
debugDIV.hide();
|
|
debugUL.hide();
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|
|
this.getstate = function() {
|
|
return 0;
|
|
};
|
|
|
|
this.exec = function(sel, opts) {
|
|
var tab = opts? opts.tab : void(0),
|
|
debugShow = function() {
|
|
if (useDebug) {
|
|
debugDIV.tabs();
|
|
debugUL.find('a:first').trigger('click');
|
|
tabDebug.show();
|
|
opened = true;
|
|
}
|
|
};
|
|
debugShow();
|
|
this.dialog.trigger('initContents').elfinderdialog('open').find((tab? '.elfinder-help-tab-'+tab : '.ui-tabs-nav li') + ' a:first').trigger('click');
|
|
return jQuery.Deferred().resolve();
|
|
};
|
|
|
|
}).prototype = { forceLoad : true }; // this is required command
|