Begin to move all src javascript to es6. Add search/filter ignore case option.

This commit is contained in:
Lars Jung 2016-06-02 23:16:23 +02:00
parent f37e8e7b89
commit 7ec2bdf16a
58 changed files with 3546 additions and 3420 deletions

View file

@ -5,29 +5,8 @@
es6: true es6: true
node: true node: true
ecmaFeatures: parserOptions:
arrowFunctions: true ecmaVersion: 6
binaryLiterals: true
blockBindings: true
classes: false
defaultParams: true
destructuring: true
forOf: true
generators: true
globalReturn: true
jsx: false
modules: true
objectLiteralComputedProperties: true
objectLiteralDuplicateProperties: true
objectLiteralShorthandMethods: true
objectLiteralShorthandProperties: true
octalLiterals: true
regexUFlag: true
regexYFlag: true
spread: true
superInFunctions: false
templateStrings: true
unicodeCodePointEscapes: true
rules: rules:
array-bracket-spacing: [2, never] array-bracket-spacing: [2, never]
@ -179,7 +158,7 @@
prefer-const: 1 prefer-const: 1
prefer-reflect: 1 prefer-reflect: 1
prefer-spread: 2 prefer-spread: 2
prefer-template: 0 ### prefer-template: 0
quote-props: [2, as-needed] quote-props: [2, as-needed]
quotes: [2, single, avoid-escape] quotes: [2, single, avoid-escape]
radix: 2 radix: 2

View file

@ -1,5 +1,6 @@
# Changelog # Changelog
* add options to filter/search ignore case
* replace PHP `getenv` calls with `$_SERVER` lookups * replace PHP `getenv` calls with `$_SERVER` lookups
* adds `view.fallbackMode` option to generally serve only fallback mode * adds `view.fallbackMode` option to generally serve only fallback mode
* serves fallback mode for text browsers (`curl`, `links`, `lynx`, `w3m`) * serves fallback mode for text browsers (`curl`, `links`, `lynx`, `w3m`)
@ -15,7 +16,7 @@
* updates `jQuery` to 2.2.4 * updates `jQuery` to 2.2.4
* updates `jquery-qrcode` to 0.14.0 * updates `jquery-qrcode` to 0.14.0
* updates `lodash` to 4.13.1 (removes `contains`) * updates `lodash` to 4.13.1 (removes `contains`)
* updates `modulejs` to 1.14.0 * removes `modulejs`
## v0.28.0 - *2015-12-19* ## v0.28.0 - *2015-12-19*

23
ghu.js
View file

@ -1,7 +1,7 @@
const {resolve, join} = require('path'); const {resolve, join} = require('path');
const { const {
ghu, autoprefixer, cssmin, each, ife, includeit, jszip, less, mapfn, ghu, autoprefixer, cssmin, each, ife, includeit, jszip, less, mapfn,
newerThan, pug, read, remove, run, uglify, watch, wrap, write newerThan, pug, read, remove, run, uglify, watch, webpack, wrap, write
} = require('ghu'); } = require('ghu');
const ROOT = resolve(__dirname); const ROOT = resolve(__dirname);
@ -49,8 +49,27 @@ ghu.task('lint', 'lint all JavaScript files with eslint', () => {
}); });
ghu.task('build:scripts', runtime => { ghu.task('build:scripts', runtime => {
return read(`${SRC}/_h5ai/public/js/*.js`) const webpackConfig = {
output: {},
module: {
loaders: [
{
include: [SRC],
loader: 'babel',
query: {
presets: ['es2015'],
cacheDirectory: true
}
}
],
presets: ['es2015']
}
};
return read(`${SRC}/_h5ai/public/js/scripts.js`)
.then(newerThan(mapper, `${SRC}/_h5ai/public/js/**`)) .then(newerThan(mapper, `${SRC}/_h5ai/public/js/**`))
.then(webpack(webpackConfig, {showStats: true}))
.then(wrap('\n\n// @include "vendor/*"\n\n'))
.then(includeit()) .then(includeit())
.then(ife(() => runtime.args.production, uglify())) .then(ife(() => runtime.args.production, uglify()))
.then(wrap(runtime.commentJs)) .then(wrap(runtime.commentJs))

View file

@ -15,6 +15,8 @@
"build": "node ghu release" "build": "node ghu release"
}, },
"devDependencies": { "devDependencies": {
"babel-loader": "6.2.4",
"babel-preset-es2015": "6.9.0",
"eslint": "2.11.0", "eslint": "2.11.0",
"ghu": "0.6.0" "ghu": "0.6.0"
}, },

View file

@ -1,43 +1,5 @@
--- ---
env:
es6: false
node: false
browser: true
mocha: false
globals:
modulejs: false
ecmaFeatures:
arrowFunctions: false
binaryLiterals: false
blockBindings: false
classes: false
defaultParams: false
destructuring: false
forOf: false
generators: false
globalReturn: false
jsx: false
modules: false
objectLiteralComputedProperties: false
objectLiteralDuplicateProperties: false
objectLiteralShorthandMethods: false
objectLiteralShorthandProperties: false
octalLiterals: false
regexUFlag: false
regexYFlag: false
spread: false
superInFunctions: false
templateStrings: false
unicodeCodePointEscapes: false
rules: rules:
consistent-this: 0
func-names: 0
max-params: [1, 10] max-params: [1, 10]
no-invalid-this: 0 no-console: 1
no-var: 0
object-shorthand: 0
prefer-arrow-callback: 0
prefer-reflect: 0 prefer-reflect: 0

View file

@ -144,11 +144,13 @@
- advanced: boolean, use advanced pattern parsing - advanced: boolean, use advanced pattern parsing
- debounceTime: number, debounce wait time in milliseconds - debounceTime: number, debounce wait time in milliseconds
- ignorecase: boolean, ignore case
*/ */
"filter": { "filter": {
"enabled": false, "enabled": true,
"advanced": true, "advanced": true,
"debounceTime": 100 "debounceTime": 100,
"ignorecase": true
}, },
/* /*
@ -311,11 +313,13 @@
- advanced: boolean, use advanced pattern parsing - advanced: boolean, use advanced pattern parsing
- debounceTime: number, debounce wait time in milliseconds - debounceTime: number, debounce wait time in milliseconds
- ignorecase: boolean, ignore case
*/ */
"search": { "search": {
"enabled": true, "enabled": true,
"advanced": true, "advanced": true,
"debounceTime": 300 "debounceTime": 300,
"ignorecase": true
}, },
/* /*

View file

@ -45,7 +45,6 @@ class Api {
foreach (['langs', 'options', 'types'] as $name) { foreach (['langs', 'options', 'types'] as $name) {
if ($this->request->query_boolean($name, false)) { if ($this->request->query_boolean($name, false)) {
$methodname = 'get_' . $name; $methodname = 'get_' . $name;
$response[$name] = $this->context->$methodname(); $response[$name] = $this->context->$methodname();
} }
@ -84,8 +83,9 @@ class Api {
Util::json_fail(Util::ERR_DISABLED, 'search disabled', !$this->context->query_option('search.enabled', false)); Util::json_fail(Util::ERR_DISABLED, 'search disabled', !$this->context->query_option('search.enabled', false));
$href = $this->request->query('search.href'); $href = $this->request->query('search.href');
$pattern = $this->request->query('search.pattern'); $pattern = $this->request->query('search.pattern');
$ignorecase = $this->request->query_boolean('search.ignorecase', false);
$search = new Search($this->context); $search = new Search($this->context);
$response['search'] = $search->get_items($href, $pattern); $response['search'] = $search->get_items($href, $pattern, $ignorecase);
} }
if ($this->request->query('thumbs', false)) { if ($this->request->query('thumbs', false)) {

View file

@ -7,10 +7,13 @@ class Search {
$this->context = $context; $this->context = $context;
} }
public function get_paths($root, $pattern = null) { public function get_paths($root, $pattern = null, $ignorecase = false) {
$paths = []; $paths = [];
if ($pattern && $this->context->is_managed_path($root)) { if ($pattern && $this->context->is_managed_path($root)) {
$re = Util::wrap_pattern($pattern); $re = Util::wrap_pattern($pattern);
if ($ignorecase) {
$re .= 'i';
}
$names = $this->context->read_dir($root); $names = $this->context->read_dir($root);
foreach ($names as $name) { foreach ($names as $name) {
$path = $root . '/' . $name; $path = $root . '/' . $name;
@ -18,17 +21,17 @@ class Search {
$paths[] = $path; $paths[] = $path;
} }
if (@is_dir($path)) { if (@is_dir($path)) {
$paths = array_merge($paths, $this->get_paths($path, $pattern)); $paths = array_merge($paths, $this->get_paths($path, $pattern, $ignorecase));
} }
} }
} }
return $paths; return $paths;
} }
public function get_items($href, $pattern = null) { public function get_items($href, $pattern = null, $ignorecase = false) {
$cache = []; $cache = [];
$root = $this->context->to_path($href); $root = $this->context->to_path($href);
$paths = $this->get_paths($root, $pattern); $paths = $this->get_paths($root, $pattern, $ignorecase);
$items = array_map(function ($path) { $items = array_map(function ($path) {
return Item::get($this->context, $path, $cache)->to_json_object(); return Item::get($this->context, $path, $cache)->to_json_object();
}, $paths); }, $paths);

View file

@ -1,25 +0,0 @@
modulejs.define('boot', ['$', 'core/server'], function ($, server) {
var module = $('script[data-module]').data('module');
var data = {
action: 'get',
setup: true,
options: true,
types: true
};
if (module === 'index') {
data.theme = true;
data.langs = true;
} else if (module === 'info') {
data.refresh = true;
} else {
return;
}
server.request(data, function (config) {
modulejs.define('config', config);
$(function () {
modulejs.require('main/' + module);
});
});
});

View file

@ -0,0 +1,10 @@
const {request} = require('./core/server');
const config = module.exports = {
_update: data => {
return request(data).then(newConfig => {
Object.assign(config, newConfig);
return config;
});
}
};

View file

@ -1,36 +1,33 @@
modulejs.define('core/event', ['_'], function (_) { const {_: lo} = require('../win');
var slice = Array.prototype.slice;
var subscriptions = {};
function sub(topic, callback) { const subscriptions = {};
if (_.isString(topic) && _.isFunction(callback)) {
function sub(topic, listener) {
if (lo.isString(topic) && lo.isFunction(listener)) {
if (!subscriptions[topic]) { if (!subscriptions[topic]) {
subscriptions[topic] = []; subscriptions[topic] = [];
} }
subscriptions[topic].push(callback); subscriptions[topic].push(listener);
} }
} }
function unsub(topic, callback) { function unsub(topic, listener) {
if (_.isString(topic) && _.isFunction(callback) && subscriptions[topic]) { if (lo.isString(topic) && lo.isFunction(listener) && subscriptions[topic]) {
subscriptions[topic] = _.without(subscriptions[topic], callback); subscriptions[topic] = lo.without(subscriptions[topic], listener);
} }
} }
function pub(topic) { function pub(topic, ...args) {
var args = slice.call(arguments, 1); // console.log(topic, args);
if (lo.isString(topic) && subscriptions[topic]) {
if (_.isString(topic) && subscriptions[topic]) { lo.each(subscriptions[topic], listener => {
_.each(subscriptions[topic], function (callback) { listener.apply(topic, args);
callback.apply(topic, args);
}); });
} }
} }
module.exports = {
return { sub,
sub: sub, unsub,
unsub: unsub, pub
pub: pub
}; };
});

View file

@ -1,16 +1,18 @@
modulejs.define('core/format', ['_'], function (_) { const {_: lo} = require('../win');
var decimalMetric = {
const decimalMetric = {
t: 1000.0, t: 1000.0,
k: 1000.0, k: 1000.0,
u: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] u: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
}; };
var binaryMetric = { const binaryMetric = {
t: 1024.0, t: 1024.0,
k: 1024.0, k: 1024.0,
u: ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'] u: ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']
}; };
var defaultMetric = decimalMetric; let defaultMetric = decimalMetric;
var datePatterns = [
const datePatterns = [
[/YYYY/, 'Y', 4], [/YYYY/, 'Y', 4],
[/YY/, 'Y', 2], [/YY/, 'Y', 2],
[/Y/, 'Y', 0], [/Y/, 'Y', 0],
@ -25,7 +27,7 @@ modulejs.define('core/format', ['_'], function (_) {
[/ss/, 's', 2], [/ss/, 's', 2],
[/s/, 's', 0] [/s/, 's', 0]
]; ];
var defaultDateFormat = 'YYYY-MM-DD HH:mm'; let defaultDateFormat = 'YYYY-MM-DD HH:mm';
function setDefaultMetric(useBinaryMetric) { function setDefaultMetric(useBinaryMetric) {
@ -35,12 +37,12 @@ modulejs.define('core/format', ['_'], function (_) {
function formatSize(size, metric) { function formatSize(size, metric) {
metric = metric || defaultMetric; metric = metric || defaultMetric;
if (!_.isNumber(size) || size < 0) { if (!lo.isNumber(size) || size < 0) {
return ''; return '';
} }
var i = 0; let i = 0;
var maxI = metric.u.length - 1; const maxI = metric.u.length - 1;
while (size >= metric.t && i < maxI) { while (size >= metric.t && i < maxI) {
size /= metric.k; size /= metric.k;
@ -54,7 +56,7 @@ modulejs.define('core/format', ['_'], function (_) {
} }
function formatNumber(number, padding) { function formatNumber(number, padding) {
var str = String(number); let str = String(number);
if (padding) { if (padding) {
str = ('000' + str).substr(-padding); str = ('000' + str).substr(-padding);
} }
@ -62,14 +64,14 @@ modulejs.define('core/format', ['_'], function (_) {
} }
function formatDate(millis, format) { function formatDate(millis, format) {
if (!millis || !_.isNumber(millis)) { if (!millis || !lo.isNumber(millis)) {
return ''; return '';
} }
format = format || defaultDateFormat; format = format || defaultDateFormat;
var date = new Date(millis); const date = new Date(millis);
var d = { const d = {
Y: date.getFullYear(), Y: date.getFullYear(),
M: date.getMonth() + 1, M: date.getMonth() + 1,
D: date.getDate(), D: date.getDate(),
@ -78,7 +80,7 @@ modulejs.define('core/format', ['_'], function (_) {
s: date.getSeconds() s: date.getSeconds()
}; };
datePatterns.forEach(function (pattern) { datePatterns.forEach(pattern => {
format = format.replace(pattern[0], formatNumber(d[pattern[1]], pattern[2])); format = format.replace(pattern[0], formatNumber(d[pattern[1]], pattern[2]));
}); });
@ -86,10 +88,9 @@ modulejs.define('core/format', ['_'], function (_) {
} }
return { module.exports = {
setDefaultMetric: setDefaultMetric, setDefaultMetric,
formatSize: formatSize, formatSize,
setDefaultDateFormat: setDefaultDateFormat, setDefaultDateFormat,
formatDate: formatDate formatDate
}; };
});

View file

@ -1,3 +1,2 @@
modulejs.define('core/langs', ['_', 'config'], function (_, config) { const config = require('../config');
return _.extend({}, config.langs); module.exports = Object.assign({}, config.langs);
});

View file

@ -1,13 +1,19 @@
modulejs.define('core/location', ['_', 'core/event', 'core/modernizr', 'core/settings', 'view/notification'], function (_, event, modernizr, allsettings, notification) { const {window: win, document: doc, _: lo} = require('../win');
var settings = _.extend({ const {request} = require('./server');
const allsettings = require('./settings');
const modernizr = require('./modernizr');
const event = require('./event');
const notification = require('../view/notification');
const settings = lo.extend({
fastBrowsing: true, fastBrowsing: true,
unmanagedInNewWindow: true unmanagedInNewWindow: true
}, allsettings.view); }, allsettings.view);
var doc = document; const history = settings.fastBrowsing && modernizr.history ? win.history : null;
var history = settings.fastBrowsing && modernizr.history ? window.history : null; const reUriToPathname = /^.*:\/\/[^\/]*|[^\/]*$/g;
var reUriToPathname = /^.*:\/\/[^\/]*|[^\/]*$/g; const reForceEncoding = [
var absHref = null;
var reForceEncoding = [
[/\/+/g, '/'], [/\/+/g, '/'],
[/ /g, '%20'], [/ /g, '%20'],
[/!/g, '%21'], [/!/g, '%21'],
@ -29,8 +35,12 @@ modulejs.define('core/location', ['_', 'core/event', 'core/modernizr', 'core/set
[/\]/g, '%5D'] [/\]/g, '%5D']
]; ];
let absHref = null;
function forceEncoding(href) { function forceEncoding(href) {
return reForceEncoding.reduce(function (nuHref, data) { return reForceEncoding.reduce((nuHref, data) => {
return nuHref.replace(data[0], data[1]); return nuHref.replace(data[0], data[1]);
}, href); }, href);
} }
@ -39,17 +49,17 @@ modulejs.define('core/location', ['_', 'core/event', 'core/modernizr', 'core/set
return uri.replace(reUriToPathname, ''); return uri.replace(reUriToPathname, '');
} }
var hrefsAreDecoded = (function () { const hrefsAreDecoded = (() => {
var testpathname = '/a b'; const testpathname = '/a b';
var a = doc.createElement('a'); const a = doc.createElement('a');
a.href = testpathname; a.href = testpathname;
return uriToPathname(a.href) === testpathname; return uriToPathname(a.href) === testpathname;
}()); })();
function encodedHref(href) { function encodedHref(href) {
var a = doc.createElement('a'); const a = doc.createElement('a');
var location; let location;
a.href = href; a.href = href;
location = uriToPathname(a.href); location = uriToPathname(a.href);
@ -70,44 +80,45 @@ modulejs.define('core/location', ['_', 'core/event', 'core/modernizr', 'core/set
} }
function getItem() { function getItem() {
return modulejs.require('model/item').get(absHref); const Item = require('../model/item');
return Item.get(absHref);
} }
function load(callback) { function load(callback) {
modulejs.require('core/server').request({action: 'get', items: {href: absHref, what: 1}}, function (json) { request({action: 'get', items: {href: absHref, what: 1}}).then(json => {
var Item = modulejs.require('model/item'); const Item = require('../model/item');
var item = Item.get(absHref); const item = Item.get(absHref);
if (json) { if (json) {
var found = {}; const found = {};
_.each(json.items, function (jsonItem) { lo.each(json.items, jsonItem => {
var e = Item.get(jsonItem); const e = Item.get(jsonItem);
found[e.absHref] = true; found[e.absHref] = true;
}); });
_.each(item.content, function (e) { lo.each(item.content, e => {
if (!found[e.absHref]) { if (!found[e.absHref]) {
Item.remove(e.absHref); Item.remove(e.absHref);
} }
}); });
} }
if (_.isFunction(callback)) { if (lo.isFunction(callback)) {
callback(item); callback(item);
} }
}); });
} }
function refresh() { function refresh() {
var item = getItem(); const item = getItem();
var oldItems = _.values(item.content); const oldItems = lo.values(item.content);
event.pub('location.beforeRefresh'); event.pub('location.beforeRefresh');
load(function () { load(() => {
var newItems = _.values(item.content); const newItems = lo.values(item.content);
var added = _.difference(newItems, oldItems); const added = lo.difference(newItems, oldItems);
var removed = _.difference(oldItems, newItems); const removed = lo.difference(oldItems, newItems);
event.pub('location.refreshed', item, added, removed); event.pub('location.refreshed', item, added, removed);
}); });
@ -123,20 +134,20 @@ modulejs.define('core/location', ['_', 'core/event', 'core/modernizr', 'core/set
if (history) { if (history) {
if (keepBrowserUrl) { if (keepBrowserUrl) {
history.replaceState({absHref: absHref}, '', absHref); history.replaceState({absHref}, '', absHref);
} else { } else {
history.pushState({absHref: absHref}, '', absHref); history.pushState({absHref}, '', absHref);
} }
} }
} }
var item = getItem(); const item = getItem();
if (item.isLoaded) { if (item.isLoaded) {
event.pub('location.changed', item); event.pub('location.changed', item);
refresh(); refresh();
} else { } else {
notification.set('loading...'); notification.set('loading...');
load(function () { load(() => {
item.isLoaded = true; item.isLoaded = true;
notification.set(); notification.set();
event.pub('location.changed', item); event.pub('location.changed', item);
@ -148,7 +159,7 @@ modulejs.define('core/location', ['_', 'core/event', 'core/modernizr', 'core/set
$el.attr('href', item.absHref); $el.attr('href', item.absHref);
if (history && item.isFolder() && item.isManaged) { if (history && item.isFolder() && item.isManaged) {
$el.on('click', function () { $el.on('click', () => {
setLocation(item.absHref); setLocation(item.absHref);
return false; return false;
}); });
@ -166,16 +177,15 @@ modulejs.define('core/location', ['_', 'core/event', 'core/modernizr', 'core/set
} }
window.onpopstate = history ? onPopState : null; win.onpopstate = history ? onPopState : null;
return { module.exports = {
forceEncoding: forceEncoding, forceEncoding,
getDomain: getDomain, getDomain,
getAbsHref: getAbsHref, getAbsHref,
getItem: getItem, getItem,
setLocation: setLocation, setLocation,
refresh: refresh, refresh,
setLink: setLink setLink
}; };
});

View file

@ -1,25 +1,25 @@
modulejs.define('core/modernizr', function () { const win = require('../win');
var hasCanvas = (function () {
var elem = document.createElement('canvas');
return Boolean(elem.getContext && elem.getContext('2d'));
}());
var hasHistory = Boolean(window.history && history.pushState); const hasCanvas = (() => {
const elem = win.document.createElement('canvas');
return !!(elem.getContext && elem.getContext('2d'));
})();
var hasLocalStorage = (function () { const hasHistory = !!(win.history && win.history.pushState);
var key = '#test#';
const hasLocalStorage = (() => {
const key = '#test#';
try { try {
localStorage.setItem(key, key); win.localStorage.setItem(key, key);
localStorage.removeItem(key); win.localStorage.removeItem(key);
return true; return true;
} catch (e) { } catch (e) {
return false; return false;
} }
}()); })();
return { module.exports = {
canvas: hasCanvas, canvas: hasCanvas,
history: hasHistory, history: hasHistory,
localstorage: hasLocalStorage localstorage: hasLocalStorage
}; };
});

View file

@ -1,9 +1,12 @@
modulejs.define('core/resource', ['_', 'config', 'core/settings'], function (_, config, settings) { const {_: lo} = require('../win');
var imagesHref = settings.publicHref + 'images/'; const config = require('../config');
var uiHref = imagesHref + 'ui/'; const settings = require('./settings');
var themesHref = imagesHref + 'themes/';
var defaultThemeHref = themesHref + 'default/'; const imagesHref = settings.publicHref + 'images/';
var defaultIcons = ['file', 'folder', 'folder-page', 'folder-parent', 'ar', 'aud', 'bin', 'img', 'txt', 'vid', 'x']; const uiHref = imagesHref + 'ui/';
const themesHref = imagesHref + 'themes/';
const defaultThemeHref = themesHref + 'default/';
const defaultIcons = ['file', 'folder', 'folder-page', 'folder-parent', 'ar', 'aud', 'bin', 'img', 'txt', 'vid', 'x'];
function image(id) { function image(id) {
@ -11,18 +14,18 @@ modulejs.define('core/resource', ['_', 'config', 'core/settings'], function (_,
} }
function icon(id) { function icon(id) {
var baseId = (id || '').split('-')[0]; const baseId = (id || '').split('-')[0];
var href = config.theme[id] || config.theme[baseId]; const href = config.theme[id] || config.theme[baseId];
if (href) { if (href) {
return themesHref + href; return themesHref + href;
} }
if (_.includes(defaultIcons, id)) { if (lo.includes(defaultIcons, id)) {
return defaultThemeHref + id + '.svg'; return defaultThemeHref + id + '.svg';
} }
if (_.includes(defaultIcons, baseId)) { if (lo.includes(defaultIcons, baseId)) {
return defaultThemeHref + baseId + '.svg'; return defaultThemeHref + baseId + '.svg';
} }
@ -30,8 +33,7 @@ modulejs.define('core/resource', ['_', 'config', 'core/settings'], function (_,
} }
return { module.exports = {
image: image, image,
icon: icon icon
}; };
});

View file

@ -1,24 +1,23 @@
modulejs.define('core/server', ['_', '$'], function (_, $) { const {jQuery: jq, _: lo} = require('../win');
function request(data, callback) {
$.ajax({ function request(data) {
return new Promise(resolve => {
jq.ajax({
url: '?', url: '?',
data: data, data,
type: 'post', type: 'post',
dataType: 'json' dataType: 'json'
}) })
.done(function (json) { .done(json => resolve(json))
callback(json); .fail(() => resolve());
})
.fail(function () {
callback();
}); });
} }
function formRequest(data) { function formRequest(data) {
var $form = $('<form method="post" action="?" style="display:none;"/>'); const $form = jq('<form method="post" action="?" style="display:none;"/>');
_.each(data, function (val, key) { lo.each(data, (val, key) => {
$('<input type="hidden"/>') jq('<input type="hidden"/>')
.attr('name', key) .attr('name', key)
.attr('value', val) .attr('value', val)
.appendTo($form); .appendTo($form);
@ -27,9 +26,7 @@ modulejs.define('core/server', ['_', '$'], function (_, $) {
$form.appendTo('body').submit().remove(); $form.appendTo('body').submit().remove();
} }
module.exports = {
return { request,
request: request, formRequest
formRequest: formRequest
}; };
});

View file

@ -1,6 +1,6 @@
modulejs.define('core/settings', ['_', 'config'], function (_, config) { const config = require('../config');
return _.extend({}, config.options, {
module.exports = Object.assign({}, config.options, {
publicHref: config.setup.PUBLIC_HREF, publicHref: config.setup.PUBLIC_HREF,
rootHref: config.setup.ROOT_HREF rootHref: config.setup.ROOT_HREF
}); });
});

View file

@ -1,6 +1,8 @@
modulejs.define('core/store', ['core/modernizr'], function (modernizr) { const win = require('../win');
var store = modernizr.localstorage ? window.localStorage : {}; const modernizr = require('./modernizr');
var storekey = '_h5ai';
const store = modernizr.localstorage ? win.localStorage : {};
const storekey = '_h5ai';
function load() { function load() {
@ -15,7 +17,7 @@ modulejs.define('core/store', ['core/modernizr'], function (modernizr) {
} }
function put(key, value) { function put(key, value) {
var obj = load(); const obj = load();
obj[key] = value; obj[key] = value;
save(obj); save(obj);
} }
@ -25,8 +27,7 @@ modulejs.define('core/store', ['core/modernizr'], function (modernizr) {
} }
return { module.exports = {
put: put, put,
get: get get
}; };
});

View file

@ -1,6 +1,8 @@
modulejs.define('core/types', ['_', 'config'], function (_, config) { const {_: lo} = require('../win');
var reEndsWithSlash = /\/$/; const config = require('../config');
var regexps = {};
const reEndsWithSlash = /\/$/;
const regexps = {};
function escapeRegExp(sequence) { function escapeRegExp(sequence) {
@ -9,8 +11,8 @@ modulejs.define('core/types', ['_', 'config'], function (_, config) {
} }
function parse(types) { function parse(types) {
_.each(types, function (patterns, type) { lo.each(types, (patterns, type) => {
var pattern = '^(' + _.map(patterns, function (p) { return '(' + escapeRegExp(p).replace(/\*/g, '.*') + ')'; }).join('|') + ')$'; const pattern = '^(' + lo.map(patterns, p => '(' + escapeRegExp(p).replace(/\*/g, '.*') + ')').join('|') + ')$';
regexps[type] = new RegExp(pattern, 'i'); regexps[type] = new RegExp(pattern, 'i');
}); });
} }
@ -20,11 +22,11 @@ modulejs.define('core/types', ['_', 'config'], function (_, config) {
return 'folder'; return 'folder';
} }
var slashidx = sequence.lastIndexOf('/'); const slashidx = sequence.lastIndexOf('/');
var name = slashidx >= 0 ? sequence.substr(slashidx + 1) : sequence; const name = slashidx >= 0 ? sequence.substr(slashidx + 1) : sequence;
var result; let result;
_.each(regexps, function (regexp, type) { // eslint-disable-line consistent-return lo.each(regexps, (regexp, type) => { // eslint-disable-line consistent-return
if (regexps[type].test(name)) { if (regexps[type].test(name)) {
result = type; result = type;
return false; return false;
@ -35,9 +37,8 @@ modulejs.define('core/types', ['_', 'config'], function (_, config) {
} }
parse(_.extend({}, config.types)); parse(Object.assign({}, config.types));
return { module.exports = {
getType: getType getType
}; };
});

View file

@ -1,4 +1,5 @@
modulejs.define('core/util', ['_'], function (_) { const {_: lo} = require('../win');
function regularCmpFn(val1, val2) { function regularCmpFn(val1, val2) {
if (val1 < val2) { if (val1 < val2) {
return -1; return -1;
@ -14,22 +15,22 @@ modulejs.define('core/util', ['_'], function (_) {
// //
// Modified to make it work with h5ai // Modified to make it work with h5ai
function naturalCmpFn(val1, val2) { function naturalCmpFn(val1, val2) {
var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi; const re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi;
var sre = /(^[ ]*|[ ]*$)/g; const sre = /(^[ ]*|[ ]*$)/g;
var dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/; const dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/;
var hre = /^0x[0-9a-f]+$/i; const hre = /^0x[0-9a-f]+$/i;
var ore = /^0/; const ore = /^0/;
// convert all to strings strip whitespace // convert all to strings strip whitespace
var x = String(val1).replace(sre, ''); const x = String(val1).replace(sre, '');
var y = String(val2).replace(sre, ''); const y = String(val2).replace(sre, '');
// chunk/tokenize // chunk/tokenize
var xN = x.replace(re, '\0$1\0').replace(/\0$/, '').replace(/^\0/, '').split('\0'); const xN = x.replace(re, '\0$1\0').replace(/\0$/, '').replace(/^\0/, '').split('\0');
var yN = y.replace(re, '\0$1\0').replace(/\0$/, '').replace(/^\0/, '').split('\0'); const yN = y.replace(re, '\0$1\0').replace(/\0$/, '').replace(/^\0/, '').split('\0');
// numeric, hex or date detection // numeric, hex or date detection
var xD = parseInt(x.match(hre), 10) || xN.length !== 1 && x.match(dre) && Date.parse(x); const xD = parseInt(x.match(hre), 10) || xN.length !== 1 && x.match(dre) && Date.parse(x);
var yD = parseInt(y.match(hre), 10) || xD && y.match(dre) && Date.parse(y) || null; const yD = parseInt(y.match(hre), 10) || xD && y.match(dre) && Date.parse(y) || null;
var oFxNcL; let oFxNcL;
var oFyNcL; let oFyNcL;
// first try and sort Hex codes or Dates // first try and sort Hex codes or Dates
if (yD) { if (yD) {
if (xD < yD) { if (xD < yD) {
@ -39,7 +40,7 @@ modulejs.define('core/util', ['_'], function (_) {
} }
} }
// natural sorting through split numeric strings and default strings // natural sorting through split numeric strings and default strings
for (var cLoc = 0, numS = Math.max(xN.length, yN.length); cLoc < numS; cLoc += 1) { for (let cLoc = 0, numS = Math.max(xN.length, yN.length); cLoc < numS; cLoc += 1) {
// find floats not starting with '0', string or 0 if not defined (Clint Priest) // find floats not starting with '0', string or 0 if not defined (Clint Priest)
oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0; oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;
oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0; oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;
@ -74,8 +75,8 @@ modulejs.define('core/util', ['_'], function (_) {
return sequence.substr(3); return sequence.substr(3);
} }
sequence = _.map(_.trim(sequence).split(/\s+/), function (part) { sequence = lo.map(lo.trim(sequence).split(/\s+/), part => {
return _.map(part.split(''), function (character) { return lo.map(part.split(''), character => {
return escapePattern(character); return escapePattern(character);
}).join('.*?'); }).join('.*?');
}).join('|'); }).join('|');
@ -84,10 +85,9 @@ modulejs.define('core/util', ['_'], function (_) {
} }
return { module.exports = {
regularCmpFn: regularCmpFn, regularCmpFn,
naturalCmpFn: naturalCmpFn, naturalCmpFn,
escapePattern: escapePattern, escapePattern,
parsePattern: parsePattern parsePattern
}; };
});

View file

@ -1,9 +1,14 @@
modulejs.define('ext/autorefresh', ['_', '$', 'core/event', 'core/location', 'core/settings'], function (_, $, event, location, allsettings) { const {setTimeout} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const location = require('../core/location');
const allsettings = require('../core/settings');
const settings = Object.assign({
enabled: false, enabled: false,
interval: 5000 interval: 5000
}, allsettings.autorefresh); }, allsettings.autorefresh);
var timeoutId = null; let timeoutId = null;
function heartbeat() { function heartbeat() {
@ -34,4 +39,3 @@ modulejs.define('ext/autorefresh', ['_', '$', 'core/event', 'core/location', 'co
init(); init();
});

View file

@ -1,23 +1,26 @@
modulejs.define('ext/contextmenu', ['_', '$', 'core/resource', 'core/settings'], function (_, $, resource, allsettings) { const {document: doc, jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const resource = require('../core/resource');
const allsettings = require('../core/settings');
const settings = lo.extend({
enabled: false enabled: false
}, allsettings.contextmenu); }, allsettings.contextmenu);
var templateOverlay = '<div id="cm-overlay"/>'; const templateOverlay = '<div id="cm-overlay"/>';
var templatePanel = '<div class="cm-panel"><ul/></div>'; const templatePanel = '<div class="cm-panel"><ul/></div>';
var templateSep = '<li class="cm-sep"/>'; const templateSep = '<li class="cm-sep"/>';
var templateEntry = '<li class="cm-entry"><span class="cm-icon"><img/></span><span class="cm-text"/></li>'; const templateEntry = '<li class="cm-entry"><span class="cm-icon"><img/></span><span class="cm-text"/></li>';
var templateLabel = '<li class="cm-label"><span class="cm-text"/></li>'; const templateLabel = '<li class="cm-label"><span class="cm-text"/></li>';
function createOverlay(callback) { function createOverlay(callback) {
var $overlay = $(templateOverlay); const $overlay = jq(templateOverlay);
$overlay $overlay
.on('click contextmenu', function (ev) { .on('click contextmenu', ev => {
ev.stopPropagation(); ev.stopPropagation();
ev.preventDefault(); ev.preventDefault();
var cmId = $(ev.target).closest('.cm-entry').data('cm-id'); const cmId = jq(ev.target).closest('.cm-entry').data('cm-id');
if (ev.target === $overlay[0] || cmId !== undefined) { if (ev.target === $overlay[0] || cmId !== undefined) {
$overlay.remove(); $overlay.remove();
@ -29,18 +32,18 @@ modulejs.define('ext/contextmenu', ['_', '$', 'core/resource', 'core/settings'],
} }
function createPanel(menu) { function createPanel(menu) {
var $panel = $(templatePanel); const $panel = jq(templatePanel);
var $ul = $panel.find('ul'); const $ul = $panel.find('ul');
var $li; let $li;
_.each(menu, function (entry) { lo.each(menu, entry => {
if (entry.type === '-') { if (entry.type === '-') {
$(templateSep).appendTo($ul); jq(templateSep).appendTo($ul);
} else if (entry.type === 'l') { } else if (entry.type === 'l') {
$(templateLabel).appendTo($ul) jq(templateLabel).appendTo($ul)
.find('.cm-text').text(entry.text); .find('.cm-text').text(entry.text);
} else if (entry.type === 'e') { } else if (entry.type === 'e') {
$li = $(templateEntry).appendTo($ul); $li = jq(templateEntry).appendTo($ul);
$li.data('cm-id', entry.id); $li.data('cm-id', entry.id);
$li.find('.cm-text').text(entry.text); $li.find('.cm-text').text(entry.text);
if (entry.icon) { if (entry.icon) {
@ -55,7 +58,7 @@ modulejs.define('ext/contextmenu', ['_', '$', 'core/resource', 'core/settings'],
} }
function positionPanel($overlay, $panel, x, y) { function positionPanel($overlay, $panel, x, y) {
var margin = 4; const margin = 4;
$panel.css({ $panel.css({
left: 0, left: 0,
@ -64,20 +67,20 @@ modulejs.define('ext/contextmenu', ['_', '$', 'core/resource', 'core/settings'],
}); });
$overlay.show(); $overlay.show();
var overlayOffset = $overlay.offset(); const overlayOffset = $overlay.offset();
var overlayLeft = overlayOffset.left; const overlayLeft = overlayOffset.left;
var overlayTop = overlayOffset.top; const overlayTop = overlayOffset.top;
var overlayWidth = $overlay.outerWidth(true); const overlayWidth = $overlay.outerWidth(true);
var overlayHeight = $overlay.outerHeight(true); const overlayHeight = $overlay.outerHeight(true);
// var panelOffset = $panel.offset(); // const panelOffset = $panel.offset();
// var panelLeft = panelOffset.left; // const panelLeft = panelOffset.left;
// var panelTop = panelOffset.top; // const panelTop = panelOffset.top;
var panelWidth = $panel.outerWidth(true); let panelWidth = $panel.outerWidth(true);
var panelHeight = $panel.outerHeight(true); let panelHeight = $panel.outerHeight(true);
var posLeft = x; let posLeft = x;
var posTop = y; let posTop = y;
if (panelWidth > overlayWidth - 2 * margin) { if (panelWidth > overlayWidth - 2 * margin) {
posLeft = margin; posLeft = margin;
@ -115,30 +118,29 @@ modulejs.define('ext/contextmenu', ['_', '$', 'core/resource', 'core/settings'],
} }
function showMenuAt(x, y, menu, callback) { function showMenuAt(x, y, menu, callback) {
var $overlay = createOverlay(callback); const $overlay = createOverlay(callback);
var $panel = createPanel(menu); const $panel = createPanel(menu);
$overlay.append($panel).appendTo('body'); $overlay.append($panel).appendTo('body');
positionPanel($overlay, $panel, x, y); positionPanel($overlay, $panel, x, y);
} }
function init() { function init() {
// settings.enabled = true;
if (!settings.enabled) { if (!settings.enabled) {
return; return;
} }
$(document).on('contextmenu', function (ev) { jq(doc).on('contextmenu', ev => {
ev.stopPropagation(); ev.stopPropagation();
ev.preventDefault(); ev.preventDefault();
$(ev.target).trigger($.Event('h5ai-contextmenu', { jq(ev.target).trigger(jq.Event('h5ai-contextmenu', {
originalEvent: ev, originalEvent: ev,
showMenu: function (menu, callback) { showMenu: (menu, callback) => {
showMenuAt(ev.pageX, ev.pageY, menu, callback); showMenuAt(ev.pageX, ev.pageY, menu, callback);
} }
})); }));
}); });
// var menu = [ // const menu = [
// {type: 'e', id: 'e1', text: 'testing context menus'}, // {type: 'e', id: 'e1', text: 'testing context menus'},
// {type: 'e', id: 'e2', text: 'another entry'}, // {type: 'e', id: 'e2', text: 'another entry'},
// {type: 'e', id: 'e3', text: 'one with icon', icon: 'folder'}, // {type: 'e', id: 'e3', text: 'one with icon', icon: 'folder'},
@ -146,18 +148,15 @@ modulejs.define('ext/contextmenu', ['_', '$', 'core/resource', 'core/settings'],
// {type: 'e', id: 'e4', text: 'one with icon', icon: 'x'}, // {type: 'e', id: 'e4', text: 'one with icon', icon: 'x'},
// {type: 'e', id: 'e5', text: 'one with icon', icon: 'img'} // {type: 'e', id: 'e5', text: 'one with icon', icon: 'img'}
// ]; // ];
// var callback = function (res) { // const callback = res => {
// console.log('>> CB-RESULT >> ' + res);
// window.console.log('>> CB-RESULT >> ' + res);
// }; // };
//
// $(document).on('h5ai-contextmenu', '#items .item.folder', function (ev) { // jq(doc).on('h5ai-contextmenu', '#items .item.folder', ev => {
// console.log('CM', ev);
// window.console.log('CM', ev);
// ev.showMenu(menu, callback); // ev.showMenu(menu, callback);
// }); // });
} }
init(); init();
});

View file

@ -1,18 +1,26 @@
modulejs.define('ext/crumb', ['_', '$', 'core/event', 'core/location', 'core/resource', 'core/settings', 'view/topbar'], function (_, $, event, location, resource, allsettings, topbar) { const {jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const location = require('../core/location');
const resource = require('../core/resource');
const allsettings = require('../core/settings');
const topbar = require('../view/topbar');
const settings = lo.extend({
enabled: false enabled: false
}, allsettings.crumb); }, allsettings.crumb);
var crumbTemplate = const crumbTemplate =
'<a class="crumb">' + `<a class="crumb">
'<img class="sep" src="' + resource.image('crumb') + '" alt=">"/>' + <img class="sep" src="${resource.image('crumb')}" alt=">"/>
'<span class="label"/>' + <span class="label"/>
'</a>'; </a>`;
var pageHintTemplate = '<img class="hint" src="' + resource.icon('folder-page') + '" alt="has index page"/>'; const pageHintTemplate =
var $crumbbar; `<img class="hint" src="${resource.icon('folder-page')}" alt="has index page"/>`;
let $crumbbar;
function createHtml(item) { function createHtml(item) {
var $html = $(crumbTemplate).data('item', item); const $html = jq(crumbTemplate).data('item', item);
item.$crumb = $html; item.$crumb = $html;
location.setLink($html, item); location.setLink($html, item);
@ -23,21 +31,21 @@ modulejs.define('ext/crumb', ['_', '$', 'core/event', 'core/location', 'core/res
} }
if (!item.isManaged) { if (!item.isManaged) {
$html.append($(pageHintTemplate)); $html.append(jq(pageHintTemplate));
} }
return $html; return $html;
} }
function onLocationChanged(item) { function onLocationChanged(item) {
var $crumb = item.$crumb; const $crumb = item.$crumb;
if ($crumb && $crumb.parent()[0] === $crumbbar[0]) { if ($crumb && $crumb.parent()[0] === $crumbbar[0]) {
$crumbbar.children().removeClass('active'); $crumbbar.children().removeClass('active');
$crumb.addClass('active'); $crumb.addClass('active');
} else { } else {
$crumbbar.empty(); $crumbbar.empty();
_.each(item.getCrumb(), function (crumbItem) { lo.each(item.getCrumb(), crumbItem => {
$crumbbar.append(createHtml(crumbItem)); $crumbbar.append(createHtml(crumbItem));
}); });
} }
@ -48,11 +56,10 @@ modulejs.define('ext/crumb', ['_', '$', 'core/event', 'core/location', 'core/res
return; return;
} }
$crumbbar = $('<div id="crumbbar"/>').appendTo(topbar.$flowbar); $crumbbar = jq('<div id="crumbbar"/>').appendTo(topbar.$flowbar);
event.sub('location.changed', onLocationChanged); event.sub('location.changed', onLocationChanged);
} }
init(); init();
});

View file

@ -1,22 +1,27 @@
modulejs.define('ext/custom', ['_', '$', 'marked', 'core/event', 'core/server', 'core/settings'], function (_, $, marked, event, server, allsettings) { const {jQuery: jq, _: lo, marked} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const server = require('../core/server');
const allsettings = require('../core/settings');
const settings = lo.extend({
enabled: false enabled: false
}, allsettings.custom); }, allsettings.custom);
var $header; let $header;
var $footer; let $footer;
var duration = 200; const duration = 200;
function onLocationChanged(item) { function onLocationChanged(item) {
server.request({action: 'get', custom: item.absHref}, function (response) { server.request({action: 'get', custom: item.absHref}).then(response => {
var custom = response && response.custom; const custom = response && response.custom;
var hasHeader; let hasHeader;
var hasFooter; let hasFooter;
if (custom) { if (custom) {
var header = custom.header; const header = custom.header;
var footer = custom.footer; const footer = custom.footer;
var content; let content;
if (header.content) { if (header.content) {
content = header.content; content = header.content;
@ -51,12 +56,11 @@ modulejs.define('ext/custom', ['_', '$', 'marked', 'core/event', 'core/server',
return; return;
} }
$header = $('<div id="content-header"/>').hide().prependTo('#content'); $header = jq('<div id="content-header"/>').hide().prependTo('#content');
$footer = $('<div id="content-footer"/>').hide().appendTo('#content'); $footer = jq('<div id="content-footer"/>').hide().appendTo('#content');
event.sub('location.changed', onLocationChanged); event.sub('location.changed', onLocationChanged);
} }
init(); init();
});

View file

@ -1,16 +1,22 @@
modulejs.define('ext/download', ['_', '$', 'core/event', 'core/location', 'core/resource', 'core/server', 'core/settings'], function (_, $, event, location, resource, server, allsettings) { const {jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const location = require('../core/location');
const resource = require('../core/resource');
const server = require('../core/server');
const allsettings = require('../core/settings');
const settings = lo.extend({
enabled: false, enabled: false,
type: 'php-tar', type: 'php-tar',
packageName: 'package', packageName: 'package',
alwaysVisible: false alwaysVisible: false
}, allsettings.download); }, allsettings.download);
var template = const template =
'<div id="download" class="tool">' + `<div id="download" class="tool">
'<img src="' + resource.image('download') + '" alt="download"/>' + <img src="${resource.image('download')}" alt="download"/>
'</div>'; </div>`;
var selectedItems = []; let selectedItems = [];
var $download; let $download;
function onSelection(items) { function onSelection(items) {
@ -23,9 +29,9 @@ modulejs.define('ext/download', ['_', '$', 'core/event', 'core/location', 'core/
} }
function onClick() { function onClick() {
var type = settings.type; const type = settings.type;
var name = settings.packageName; let name = settings.packageName;
var extension = type === 'shell-zip' ? 'zip' : 'tar'; const extension = type === 'shell-zip' ? 'zip' : 'tar';
if (!name) { if (!name) {
if (selectedItems.length === 1) { if (selectedItems.length === 1) {
@ -35,14 +41,14 @@ modulejs.define('ext/download', ['_', '$', 'core/event', 'core/location', 'core/
} }
} }
var query = { const query = {
action: 'download', action: 'download',
as: name + '.' + extension, as: name + '.' + extension,
type: type, type,
baseHref: location.getAbsHref() baseHref: location.getAbsHref()
}; };
_.each(selectedItems, function (item, idx) { lo.each(selectedItems, (item, idx) => {
query['hrefs[' + idx + ']'] = item.absHref; query['hrefs[' + idx + ']'] = item.absHref;
}); });
@ -54,7 +60,7 @@ modulejs.define('ext/download', ['_', '$', 'core/event', 'core/location', 'core/
return; return;
} }
$download = $(template) $download = jq(template)
.hide() .hide()
.appendTo('#toolbar') .appendTo('#toolbar')
.on('click', onClick); .on('click', onClick);
@ -68,4 +74,3 @@ modulejs.define('ext/download', ['_', '$', 'core/event', 'core/location', 'core/
init(); init();
});

View file

@ -1,18 +1,27 @@
modulejs.define('ext/filter', ['_', '$', 'core/event', 'core/location', 'core/resource', 'core/settings', 'core/util', 'view/view'], function (_, $, event, location, resource, allsettings, util, view) { const {jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const location = require('../core/location');
const resource = require('../core/resource');
const allsettings = require('../core/settings');
const util = require('../core/util');
const view = require('../view/view');
const settings = lo.extend({
enabled: false, enabled: false,
advanced: false, advanced: false,
debounceTime: 100 debounceTime: 100,
ignorecase: true
}, allsettings.filter); }, allsettings.filter);
var template = const template =
'<div id="filter" class="tool">' + `<div id="filter" class="tool">
'<img src="' + resource.image('filter') + '" alt="filter"/>' + <img src="${resource.image('filter')}" alt="filter"/>
'<input class="l10n_ph-filter" type="text" value=""/>' + <input class="l10n_ph-filter" type="text" value=""/>
'</div>'; </div>`;
var inputIsVisible = false; let inputIsVisible = false;
var prevPattern = ''; let prevPattern = '';
var $filter; let $filter;
var $input; let $input;
function filter(pattern) { function filter(pattern) {
@ -29,10 +38,10 @@ modulejs.define('ext/filter', ['_', '$', 'core/event', 'core/location', 'core/re
$filter.addClass('pending'); $filter.addClass('pending');
var re = new RegExp(pattern); const re = new RegExp(pattern, settings.ignorecase ? 'i' : '');
var matchedItems = []; const matchedItems = [];
_.each(location.getItem().content, function (item) { lo.each(location.getItem().content, item => {
if (re.test(item.label)) { if (re.test(item.label)) {
matchedItems.push(item); matchedItems.push(item);
} }
@ -70,14 +79,13 @@ modulejs.define('ext/filter', ['_', '$', 'core/event', 'core/location', 'core/re
return; return;
} }
$filter = $(template).appendTo('#toolbar'); $filter = jq(template).appendTo('#toolbar');
$input = $filter.find('input'); $input = $filter.find('input');
$filter.on('click', 'img', toggle); $filter.on('click', 'img', toggle);
$input.on('keyup', _.debounce(update, settings.debounceTime, {trailing: true})); $input.on('keyup', lo.debounce(update, settings.debounceTime, {trailing: true}));
event.sub('location.changed', reset); event.sub('location.changed', reset);
} }
init(); init();
});

View file

@ -1,5 +1,9 @@
modulejs.define('ext/google-analytics-ua', ['_', 'core/event', 'core/settings'], function (_, event, allsettings) { const {window: win, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const allsettings = require('../core/settings');
const settings = lo.extend({
enabled: false, enabled: false,
id: 'UA-000000-0' id: 'UA-000000-0'
}, allsettings['google-analytics-ua']); }, allsettings['google-analytics-ua']);
@ -20,18 +24,15 @@ modulejs.define('ext/google-analytics-ua', ['_', 'core/event', 'core/settings'],
snippet(); snippet();
var WIN = window; win.ga('create', settings.id, 'auto');
var GA = 'ga';
WIN[GA]('create', settings.id, 'auto');
event.sub('location.changed', function (item) { event.sub('location.changed', item => {
var loc = WIN.location; const loc = win.location;
WIN[GA]('send', 'pageview', { win.ga('send', 'pageview', {
location: loc.protocol + '//' + loc.host + item.absHref, location: loc.protocol + '//' + loc.host + item.absHref,
title: _.map(item.getCrumb(), 'label').join(' > ') title: lo.map(item.getCrumb(), 'label').join(' > ')
}); });
}); });
} }
init(); init();
});

View file

@ -1,56 +1,64 @@
modulejs.define('ext/info', ['_', '$', 'core/event', 'core/format', 'core/modernizr', 'core/resource', 'core/settings', 'core/store'], function (_, $, event, format, modernizr, resource, allsettings, store) { const {window: win, jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const format = require('../core/format');
const modernizr = require('../core/modernizr');
const resource = require('../core/resource');
const allsettings = require('../core/settings');
const store = require('../core/store');
const settings = lo.extend({
enabled: false, enabled: false,
show: false, show: false,
qrcode: true, qrcode: true,
qrColor: '#999' qrColor: '#999'
}, allsettings.info); }, allsettings.info);
var template = const template =
'<div id="info">' + `<div id="info">
'<div class="icon"><img/></div>' + <div class="icon"><img/></div>
'<div class="block">' + <div class="block">
'<div class="label"/>' + <div class="label"/>
'<div class="time"/>' + <div class="time"/>
'<div class="size"/>' + <div class="size"/>
'<div class="content">' + <div class="content">
'<span class="folders"/> <span class="l10n-folders"/>, ' + <span class="folders"/> <span class="l10n-folders"/>,
'<span class="files"/> <span class="l10n-files"/>' + <span class="files"/> <span class="l10n-files"/>
'</div>' + </div>
'</div>' + </div>
'<div class="qrcode"/>' + <div class="qrcode"/>
'</div>'; </div>`;
var settingsTemplate = const settingsTemplate =
'<div class="block">' + `<div class="block">
'<h1 class="l10n-info">Info</h1>' + <h1 class="l10n-info">Info</h1>
'<div id="view-info" class="button view">' + <div id="view-info" class="button view">
'<img src="' + resource.image('info-toggle') + '" alt="view-info"/>' + <img src="${resource.image('info-toggle')}" alt="view-info"/>
'</div>' + </div>
'</div>'; </div>`;
var storekey = 'ext/info'; const storekey = 'ext/info';
var $img; let $img;
var $label; let $label;
var $time; let $time;
var $size; let $size;
var $content; let $content;
var $folders; let $folders;
var $files; let $files;
var $qrcode; let $qrcode;
var currentFolder; let currentFolder;
function updateSettings() { function updateSettings() {
if (store.get(storekey)) { if (store.get(storekey)) {
$('#view-info').addClass('active'); jq('#view-info').addClass('active');
$('#info').show(); jq('#info').show();
} else { } else {
$('#view-info').removeClass('active'); jq('#view-info').removeClass('active');
$('#info').hide(); jq('#info').hide();
} }
} }
function update(item) { function update(item) {
var src = item.thumbRational || item.icon; let src = item.thumbRational || item.icon;
var isThumb = Boolean(item.thumbRational); const isThumb = Boolean(item.thumbRational);
if (item.isCurrentFolder() || !src) { if (item.isCurrentFolder() || !src) {
src = resource.icon('folder'); src = resource.icon('folder');
@ -64,13 +72,13 @@ modulejs.define('ext/info', ['_', '$', 'core/event', 'core/format', 'core/modern
} }
$label.text(item.label); $label.text(item.label);
if (_.isNumber(item.time)) { if (lo.isNumber(item.time)) {
$time.text(format.formatDate(item.time)); $time.text(format.formatDate(item.time));
} else { } else {
$time.text('.'); $time.text('.');
} }
if (_.isNumber(item.size)) { if (lo.isNumber(item.size)) {
$size.text(format.formatSize(item.size)); $size.text(format.formatSize(item.size));
$size.show(); $size.show();
} else { } else {
@ -78,7 +86,7 @@ modulejs.define('ext/info', ['_', '$', 'core/event', 'core/format', 'core/modern
} }
if (item.isContentFetched) { if (item.isContentFetched) {
var stats = item.getStats(); const stats = item.getStats();
$folders.text(stats.folders); $folders.text(stats.folders);
$files.text(stats.files); $files.text(stats.files);
$content.show(); $content.show();
@ -92,7 +100,7 @@ modulejs.define('ext/info', ['_', '$', 'core/event', 'core/format', 'core/modern
size: 200, size: 200,
fill: settings.qrColor, fill: settings.qrColor,
background: null, background: null,
text: window.location.protocol + '//' + window.location.host + item.absHref text: win.location.protocol + '//' + win.location.host + item.absHref
}); });
} }
} }
@ -115,7 +123,7 @@ modulejs.define('ext/info', ['_', '$', 'core/event', 'core/format', 'core/modern
return; return;
} }
var $info = $(template).appendTo('#mainrow'); const $info = jq(template).appendTo('#mainrow');
$img = $info.find('.icon img'); $img = $info.find('.icon img');
$label = $info.find('.label'); $label = $info.find('.label');
$time = $info.find('.time'); $time = $info.find('.time');
@ -129,10 +137,10 @@ modulejs.define('ext/info', ['_', '$', 'core/event', 'core/format', 'core/modern
$qrcode.remove(); $qrcode.remove();
} }
$(settingsTemplate) jq(settingsTemplate)
.appendTo('#sidebar') .appendTo('#sidebar')
.find('#view-info') .find('#view-info')
.on('click', function (ev) { .on('click', ev => {
store.put(storekey, !store.get(storekey)); store.put(storekey, !store.get(storekey));
updateSettings(); updateSettings();
ev.preventDefault(); ev.preventDefault();
@ -151,4 +159,3 @@ modulejs.define('ext/info', ['_', '$', 'core/event', 'core/format', 'core/modern
init(); init();
});

View file

@ -1,11 +1,17 @@
modulejs.define('ext/l10n', ['_', '$', 'core/event', 'core/format', 'core/langs', 'core/server', 'core/settings', 'core/store'], const {navigator, jQuery: jq, _: lo} = require('../win');
function (_, $, event, format, langs, server, allsettings, store) { const event = require('../core/event');
var settings = _.extend({ const format = require('../core/format');
const langs = require('../core/langs');
const server = require('../core/server');
const allsettings = require('../core/settings');
const store = require('../core/store');
const settings = lo.extend({
enabled: false, enabled: false,
lang: 'en', lang: 'en',
useBrowserLang: true useBrowserLang: true
}, allsettings.l10n); }, allsettings.l10n);
var defaultTranslations = { const defaultTranslations = {
isoCode: 'en', isoCode: 'en',
lang: 'english', lang: 'english',
@ -28,13 +34,19 @@ function (_, $, event, format, langs, server, allsettings, store) {
tree: 'Tree', tree: 'Tree',
view: 'View' view: 'View'
}; };
var blockTemplate = '<div class="block"><h1 class="l10n-language">Language</h1><div class="select"><select id="langs"/></div></div>'; const blockTemplate =
var optionTemplate = '<option/>'; `<div class="block">
var storekey = 'ext/l10n'; <h1 class="l10n-language">Language</h1>
var loaded = { <div class="select">
en: _.extend({}, defaultTranslations) <select id="langs"/>
</div>
</div>`;
const optionTemplate = '<option/>';
const storekey = 'ext/l10n';
const loaded = {
en: lo.extend({}, defaultTranslations)
}; };
var currentLang = loaded.en; let currentLang = loaded.en;
function update(lang) { function update(lang) {
@ -42,21 +54,20 @@ function (_, $, event, format, langs, server, allsettings, store) {
currentLang = lang; currentLang = lang;
} }
$('#langs option') jq('#langs option')
.removeAttr('selected').removeProp('selected') .removeAttr('selected').removeProp('selected')
.filter('.' + currentLang.isoCode) .filter('.' + currentLang.isoCode)
.attr('selected', 'selected').prop('selected', 'selected'); .attr('selected', 'selected').prop('selected', 'selected');
$.each(currentLang, function (key, value) { jq.each(currentLang, (key, value) => {
$('.l10n-' + key).text(value); jq('.l10n-' + key).text(value);
$('.l10n_ph-' + key).attr('placeholder', value); jq('.l10n_ph-' + key).attr('placeholder', value);
}); });
format.setDefaultDateFormat(currentLang.dateFormat); format.setDefaultDateFormat(currentLang.dateFormat);
$('#items .item .date').each(function () { jq('#items .item .date').each((idx, el) => {
var $this = $(this); const $el = jq(el);
$el.text(format.formatDate($el.data('time')));
$this.text(format.formatDate($this.data('time')));
}); });
} }
@ -64,21 +75,21 @@ function (_, $, event, format, langs, server, allsettings, store) {
if (loaded[isoCode]) { if (loaded[isoCode]) {
callback(loaded[isoCode]); callback(loaded[isoCode]);
} else { } else {
server.request({action: 'get', l10n: [isoCode]}, function (response) { server.request({action: 'get', l10n: [isoCode]}).then(response => {
var json = response.l10n && response.l10n[isoCode] ? response.l10n[isoCode] : {}; const json = response.l10n && response.l10n[isoCode] ? response.l10n[isoCode] : {};
loaded[isoCode] = _.extend({}, defaultTranslations, json, {isoCode: isoCode}); loaded[isoCode] = lo.extend({}, defaultTranslations, json, {isoCode});
callback(loaded[isoCode]); callback(loaded[isoCode]);
}); });
} }
} }
function localize(languages, isoCode, useBrowserLang) { function localize(languages, isoCode, useBrowserLang) {
var storedIsoCode = store.get(storekey); const storedIsoCode = store.get(storekey);
if (languages[storedIsoCode]) { if (languages[storedIsoCode]) {
isoCode = storedIsoCode; isoCode = storedIsoCode;
} else if (useBrowserLang) { } else if (useBrowserLang) {
var browserLang = navigator.language || navigator.browserLanguage; const browserLang = navigator.language || navigator.browserLanguage;
if (browserLang) { if (browserLang) {
if (languages[browserLang]) { if (languages[browserLang]) {
isoCode = browserLang; isoCode = browserLang;
@ -96,20 +107,20 @@ function (_, $, event, format, langs, server, allsettings, store) {
} }
function initLangSelector(languages) { function initLangSelector(languages) {
var isoCodes = _.keys(languages).sort(); const isoCodes = lo.keys(languages).sort();
var $block = $(blockTemplate); const $block = jq(blockTemplate);
var $select = $block.find('select') const $select = $block.find('select')
.on('change', function (ev) { .on('change', ev => {
var isoCode = ev.target.value; const isoCode = ev.target.value;
store.put(storekey, isoCode); store.put(storekey, isoCode);
localize(languages, isoCode, false); localize(languages, isoCode, false);
}); });
$.each(isoCodes, function (idx, isoCode) { jq.each(isoCodes, (idx, isoCode) => {
$(optionTemplate) jq(optionTemplate)
.attr('value', isoCode) .attr('value', isoCode)
.addClass(isoCode) .addClass(isoCode)
.text(isoCode + ' - ' + (_.isString(languages[isoCode]) ? languages[isoCode] : languages[isoCode].lang)) .text(isoCode + ' - ' + (lo.isString(languages[isoCode]) ? languages[isoCode] : languages[isoCode].lang))
.appendTo($select); .appendTo($select);
}); });
@ -121,11 +132,10 @@ function (_, $, event, format, langs, server, allsettings, store) {
initLangSelector(langs); initLangSelector(langs);
} }
event.sub('view.changed', function () { event.sub('view.changed', () => {
localize(langs, settings.lang, settings.useBrowserLang); localize(langs, settings.lang, settings.useBrowserLang);
}); });
} }
init(); init();
});

View file

@ -1,5 +1,7 @@
modulejs.define('ext/peer5', ['_', '$', 'core/settings'], function (_, $, allsettings) { const {window: win, jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const allsettings = require('../core/settings');
const settings = lo.extend({
enabled: false, enabled: false,
id: 'z142i5n5qypq4cxr' id: 'z142i5n5qypq4cxr'
}, allsettings.peer5); }, allsettings.peer5);
@ -10,22 +12,21 @@ modulejs.define('ext/peer5', ['_', '$', 'core/settings'], function (_, $, allset
return; return;
} }
var peer5js = '//api.peer5.com/peer5.js?id=' + settings.id; const peer5js = '//api.peer5.com/peer5.js?id=' + settings.id;
// load peer5 with caching jq.ajax({
$.ajax({
url: peer5js, url: peer5js,
dataType: 'script', dataType: 'script',
cache: true cache: true
}); });
// attach to file items, once the DOM is ready // attach to file items, once the DOM is ready
$(function () { jq(() => {
$('body').on('click', '.item.file > a', function (ev) { // eslint-disable-line consistent-return jq('body').on('click', '.item.file > a', ev => { // eslint-disable-line consistent-return
if (window.peer5) { if (win.peer5) {
ev.preventDefault(); ev.preventDefault();
var url = ev.currentTarget.href; const url = ev.currentTarget.href;
window.peer5.download(url); win.peer5.download(url);
return false; return false;
} }
}); });
@ -34,4 +35,3 @@ modulejs.define('ext/peer5', ['_', '$', 'core/settings'], function (_, $, allset
init(); init();
});

27
src/_h5ai/public/js/lib/ext/piwik-analytics.js Executable file → Normal file
View file

@ -1,11 +1,14 @@
modulejs.define('ext/piwik-analytics', ['_', '$', 'core/settings'], function (_, $, allsettings) { const {window: win, jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const allsettings = require('../core/settings');
const settings = lo.extend({
enabled: false, enabled: false,
baseURL: 'not-set', baseURL: 'not-set',
idSite: 0 idSite: 0
}, allsettings['piwik-analytics']); }, allsettings['piwik-analytics']);
function init() { function init() {
if (!settings.enabled) { if (!settings.enabled) {
return; return;
@ -13,18 +16,20 @@ modulejs.define('ext/piwik-analytics', ['_', '$', 'core/settings'], function (_,
// reference: http://piwik.org/docs/javascript-tracking/ // reference: http://piwik.org/docs/javascript-tracking/
var pkBaseURL = (document.location.protocol === 'https:' ? 'https://' : 'http://') + settings.baseURL + '/'; const pkBaseURL = (win.location.protocol === 'https:' ? 'https://' : 'http://') + settings.baseURL + '/';
let piwikTracker = null;
$('<script/>').attr('src', pkBaseURL + 'piwik.js').appendTo('body'); jq('<script/>').attr('src', pkBaseURL + 'piwik.js').appendTo('body');
$(window).load(function () { jq(win).load(() => {
/* global Piwik */ piwikTracker = win.Piwik.getTracker(pkBaseURL + 'piwik.php', settings.idSite);
var piwikTracker = Piwik.getTracker(pkBaseURL + 'piwik.php', settings.idSite);
piwikTracker.trackPageView();
piwikTracker.enableLinkTracking(); piwikTracker.enableLinkTracking();
}); });
event.sub('location.changed', item => {
const title = lo.map(item.getCrumb(), 'label').join(' > ');
piwikTracker.trackPageView(title);
});
} }
init(); init();
});

View file

@ -1,12 +1,17 @@
modulejs.define('ext/preview-audio', ['_', '$', 'core/event', 'core/format', 'core/settings', 'ext/preview'], function (_, $, event, format, allsettings, preview) { const {setTimeout, jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const format = require('../core/format');
const allsettings = require('../core/settings');
const preview = require('./preview');
const settings = lo.extend({
enabled: false, enabled: false,
types: [] types: []
}, allsettings['preview-aud']); }, allsettings['preview-aud']);
function preloadAudio(src, callback) { function preloadAudio(src, callback) {
var $audio = $('<audio/>') const $audio = jq('<audio/>')
.one('loadedmetadata', function () { .one('loadedmetadata', () => {
callback($audio); callback($audio);
// setTimeout(function () { callback($img); }, 1000); // for testing // setTimeout(function () { callback($img); }, 1000); // for testing
}) })
@ -16,13 +21,13 @@ modulejs.define('ext/preview-audio', ['_', '$', 'core/event', 'core/format', 'co
} }
function onEnter(items, idx) { function onEnter(items, idx) {
var currentItems = items; const currentItems = items;
var currentIdx = idx; let currentIdx = idx;
var currentItem = items[idx]; let currentItem = items[idx];
function onAdjustSize() { function onAdjustSize() {
var $content = $('#pv-content'); const $content = jq('#pv-content');
var $audio = $('#pv-aud-audio'); const $audio = jq('#pv-aud-audio');
if ($audio.length) { if ($audio.length) {
$audio.css({ $audio.css({
@ -41,10 +46,10 @@ modulejs.define('ext/preview-audio', ['_', '$', 'core/event', 'core/format', 'co
currentIdx = (currentIdx + rel + currentItems.length) % currentItems.length; currentIdx = (currentIdx + rel + currentItems.length) % currentItems.length;
currentItem = currentItems[currentIdx]; currentItem = currentItems[currentIdx];
var spinnerTimeout = setTimeout(function () { preview.showSpinner(true); }, 200); const spinnerTimeout = setTimeout(() => preview.showSpinner(true), 200);
if ($('#pv-aud-audio').length) { if (jq('#pv-aud-audio').length) {
$('#pv-aud-audio')[0].pause(); jq('#pv-aud-audio')[0].pause();
} }
function updateMeta() { function updateMeta() {
@ -54,7 +59,7 @@ modulejs.define('ext/preview-audio', ['_', '$', 'core/event', 'core/format', 'co
} }
function swap(nuContent) { function swap(nuContent) {
$('#pv-content').empty().append(nuContent.attr('id', 'pv-vid-audio')).fadeIn(200); jq('#pv-content').empty().append(nuContent.attr('id', 'pv-vid-audio')).fadeIn(200);
// small timeout, so nuContent is visible and therefore its width is available // small timeout, so nuContent is visible and therefore its width is available
setTimeout(updateMeta, 10); setTimeout(updateMeta, 10);
} }
@ -63,9 +68,7 @@ modulejs.define('ext/preview-audio', ['_', '$', 'core/event', 'core/format', 'co
clearTimeout(spinnerTimeout); clearTimeout(spinnerTimeout);
preview.showSpinner(false); preview.showSpinner(false);
$('#pv-content').fadeOut(100, function () { jq('#pv-content').fadeOut(100, () => swap($preloadedContent));
swap($preloadedContent);
});
} }
preloadAudio(currentItem.absHref, onReady); preloadAudio(currentItem.absHref, onReady);
@ -78,22 +81,22 @@ modulejs.define('ext/preview-audio', ['_', '$', 'core/event', 'core/format', 'co
} }
function initItem(item) { function initItem(item) {
if (item.$view && _.includes(settings.types, item.type)) { if (item.$view && lo.includes(settings.types, item.type)) {
item.$view.find('a').on('click', function (ev) { item.$view.find('a').on('click', ev => {
ev.preventDefault(); ev.preventDefault();
var matchedItems = _.compact(_.map($('#items .item'), function (matchedItem) { const matchedItems = lo.compact(lo.map(jq('#items .item'), matchedItem => {
matchedItem = $(matchedItem).data('item'); matchedItem = jq(matchedItem).data('item');
return _.includes(settings.types, matchedItem.type) ? matchedItem : null; return lo.includes(settings.types, matchedItem.type) ? matchedItem : null;
})); }));
onEnter(matchedItems, _.indexOf(matchedItems, item)); onEnter(matchedItems, lo.indexOf(matchedItems, item));
}); });
} }
} }
function onViewChanged(added) { function onViewChanged(added) {
_.each(added, initItem); lo.each(added, initItem);
} }
function init() { function init() {
@ -105,4 +108,3 @@ modulejs.define('ext/preview-audio', ['_', '$', 'core/event', 'core/format', 'co
} }
init(); init();
});

View file

@ -1,14 +1,19 @@
modulejs.define('ext/preview-img', ['_', '$', 'core/event', 'core/server', 'core/settings', 'ext/preview'], function (_, $, event, server, allsettings, preview) { const {setTimeout, jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const server = require('../core/server');
const allsettings = require('../core/settings');
const preview = require('./preview');
const settings = lo.extend({
enabled: false, enabled: false,
size: null, size: null,
types: [] types: []
}, allsettings['preview-img']); }, allsettings['preview-img']);
var spinnerThreshold = 200; const spinnerThreshold = 200;
var spinnerTimeoutId; let spinnerTimeoutId;
var currentItems; let currentItems;
var currentIdx; let currentIdx;
var currentItem; let currentItem;
function requestSample(href, callback) { function requestSample(href, callback) {
@ -21,19 +26,19 @@ modulejs.define('ext/preview-img', ['_', '$', 'core/event', 'core/server', 'core
action: 'get', action: 'get',
thumbs: [{ thumbs: [{
type: 'img', type: 'img',
href: href, href,
width: settings.size, width: settings.size,
height: 0 height: 0
}] }]
}, function (json) { }).then(json => {
callback(json && json.thumbs && json.thumbs[0] ? json.thumbs[0] : null); callback(json && json.thumbs && json.thumbs[0] ? json.thumbs[0] : null);
}); });
} }
function preloadImage(item, callback) { function preloadImage(item, callback) {
requestSample(item.absHref, function (src) { requestSample(item.absHref, src => {
$('<img/>') jq('<img/>')
.one('load', function (ev) { .one('load', ev => {
callback(item, ev.target); callback(item, ev.target);
// for testing // for testing
@ -44,8 +49,8 @@ modulejs.define('ext/preview-img', ['_', '$', 'core/event', 'core/server', 'core
} }
function onAdjustSize() { function onAdjustSize() {
var $content = $('#pv-content'); const $content = jq('#pv-content');
var $img = $('#pv-img-image'); const $img = jq('#pv-img-image');
if ($img.length === 0) { if ($img.length === 0) {
return; return;
@ -56,7 +61,7 @@ modulejs.define('ext/preview-img', ['_', '$', 'core/event', 'core/server', 'core
top: ($content.height() - $img.height()) * 0.5 top: ($content.height() - $img.height()) * 0.5
}); });
var labels = [currentItem.label]; const labels = [currentItem.label];
if (!settings.size) { if (!settings.size) {
labels.push(String($img[0].naturalWidth) + 'x' + String($img[0].naturalHeight)); labels.push(String($img[0].naturalWidth) + 'x' + String($img[0].naturalHeight));
labels.push(String((100 * $img.width() / $img[0].naturalWidth).toFixed(0)) + '%'); labels.push(String((100 * $img.width() / $img[0].naturalWidth).toFixed(0)) + '%');
@ -72,26 +77,26 @@ modulejs.define('ext/preview-img', ['_', '$', 'core/event', 'core/server', 'core
preview.setIndex(currentIdx + 1, currentItems.length); preview.setIndex(currentIdx + 1, currentItems.length);
preview.setRawLink(currentItem.absHref); preview.setRawLink(currentItem.absHref);
$('#pv-content').hide(); jq('#pv-content').hide();
if (preview.isSpinnerVisible()) { if (preview.isSpinnerVisible()) {
preview.showSpinner(true, currentItem.thumbSquare); preview.showSpinner(true, currentItem.thumbSquare);
} else { } else {
clearTimeout(spinnerTimeoutId); clearTimeout(spinnerTimeoutId);
spinnerTimeoutId = setTimeout(function () { spinnerTimeoutId = setTimeout(() => {
preview.showSpinner(true, currentItem.thumbSquare); preview.showSpinner(true, currentItem.thumbSquare);
}, spinnerThreshold); }, spinnerThreshold);
} }
preloadImage(currentItem, function (item, preloadedImage) { preloadImage(currentItem, (item, preloadedImage) => {
if (item !== currentItem) { if (item !== currentItem) {
return; return;
} }
clearTimeout(spinnerTimeoutId); clearTimeout(spinnerTimeoutId);
preview.showSpinner(false); preview.showSpinner(false);
$('#pv-content') jq('#pv-content')
.empty() .empty()
.append($(preloadedImage).attr('id', 'pv-img-image')) .append(jq(preloadedImage).attr('id', 'pv-img-image'))
.show(); .show();
onAdjustSize(); onAdjustSize();
}); });
@ -107,22 +112,22 @@ modulejs.define('ext/preview-img', ['_', '$', 'core/event', 'core/server', 'core
} }
function initItem(item) { function initItem(item) {
if (item.$view && _.includes(settings.types, item.type)) { if (item.$view && lo.includes(settings.types, item.type)) {
item.$view.find('a').on('click', function (ev) { item.$view.find('a').on('click', ev => {
ev.preventDefault(); ev.preventDefault();
var matchedItems = _.compact(_.map($('#items .item'), function (matchedItem) { const matchedItems = lo.compact(lo.map(jq('#items .item'), matchedItem => {
matchedItem = $(matchedItem).data('item'); matchedItem = jq(matchedItem).data('item');
return _.includes(settings.types, matchedItem.type) ? matchedItem : null; return lo.includes(settings.types, matchedItem.type) ? matchedItem : null;
})); }));
onEnter(matchedItems, _.indexOf(matchedItems, item)); onEnter(matchedItems, lo.indexOf(matchedItems, item));
}); });
} }
} }
function onViewChanged(added) { function onViewChanged(added) {
_.each(added, initItem); lo.each(added, initItem);
} }
function init() { function init() {
@ -135,4 +140,3 @@ modulejs.define('ext/preview-img', ['_', '$', 'core/event', 'core/server', 'core
init(); init();
});

View file

@ -1,36 +1,41 @@
modulejs.define('ext/preview-txt', ['_', '$', 'marked', 'prism', 'core/event', 'core/settings', 'ext/preview'], function (_, $, marked, prism, event, allsettings, preview) { const {setTimeout, jQuery: jq, _: lo, marked, Prism: prism} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const allsettings = require('../core/settings');
const preview = require('./preview');
const settings = lo.extend({
enabled: false, enabled: false,
types: {} types: {}
}, allsettings['preview-txt']); }, allsettings['preview-txt']);
var tplText = '<pre id="pv-txt-text" class="highlighted"/>'; const tplText = '<pre id="pv-txt-text" class="highlighted"/>';
var tplMarkdown = '<div id="pv-txt-text" class="markdown"/>'; const tplMarkdown = '<div id="pv-txt-text" class="markdown"/>';
var spinnerThreshold = 200; const spinnerThreshold = 200;
var spinnerTimeoutId; let spinnerTimeoutId;
var currentItems; let currentItems;
var currentIdx; let currentIdx;
var currentItem; let currentItem;
function preloadText(item, callback) { function preloadText(item, callback) {
$.ajax({ jq.ajax({
url: item.absHref, url: item.absHref,
dataType: 'text' dataType: 'text'
}) })
.done(function (content) { .done(content => {
callback(item, content); callback(item, content);
// for testing // for testing
// setTimeout(function () { callback(item, content); }, 1000); // setTimeout(function () { callback(item, content); }, 1000);
}) })
.fail(function (jqXHR, textStatus) { .fail((jqXHR, textStatus) => {
callback(item, '[ajax error] ' + textStatus); callback(item, '[ajax error] ' + textStatus);
}); });
} }
function onAdjustSize() { function onAdjustSize() {
var $content = $('#pv-content'); const $content = jq('#pv-content');
var $text = $('#pv-txt-text'); const $text = jq('#pv-txt-text');
if ($text.length) { if ($text.length) {
$text.height($content.height() - 16); $text.height($content.height() - 16);
@ -48,46 +53,48 @@ modulejs.define('ext/preview-txt', ['_', '$', 'marked', 'prism', 'core/event', '
preview.setIndex(currentIdx + 1, currentItems.length); preview.setIndex(currentIdx + 1, currentItems.length);
preview.setRawLink(currentItem.absHref); preview.setRawLink(currentItem.absHref);
$('#pv-content').hide(); jq('#pv-content').hide();
if (preview.isSpinnerVisible()) { if (preview.isSpinnerVisible()) {
preview.showSpinner(true, currentItem.icon); preview.showSpinner(true, currentItem.icon);
} else { } else {
clearTimeout(spinnerTimeoutId); clearTimeout(spinnerTimeoutId);
spinnerTimeoutId = setTimeout(function () { spinnerTimeoutId = setTimeout(() => {
preview.showSpinner(true, currentItem.icon); preview.showSpinner(true, currentItem.icon);
}, spinnerThreshold); }, spinnerThreshold);
} }
preloadText(currentItem, function (item, textContent) { preloadText(currentItem, (item, textContent) => {
if (item !== currentItem) { if (item !== currentItem) {
return; return;
} }
var type = settings.types[currentItem.type]; const type = settings.types[currentItem.type];
var $text; let $text;
var $code; let $code;
if (type === 'none') { if (type === 'none') {
$text = $(tplMarkdown).text(textContent); $text = jq(tplMarkdown).text(textContent);
} else if (type === 'fixed') { } else if (type === 'fixed') {
$text = $(tplText).text(textContent); $text = jq(tplText).text(textContent);
} else if (type === 'markdown') { } else if (type === 'markdown') {
$text = $(tplMarkdown).html(marked(textContent)); $text = jq(tplMarkdown).html(marked(textContent));
} else { } else {
$text = $(tplText); $text = jq(tplText);
$code = $('<code/>').appendTo($text); $code = jq('<code/>').appendTo($text);
if (textContent.length < 20000) { if (textContent.length < 20000) {
$code.empty().html(prism.highlight(textContent, prism.languages[type])); $code.empty().html(prism.highlight(textContent, prism.languages[type]));
} else { } else {
$code.empty().text(textContent); $code.empty().text(textContent);
setTimeout(function () { $code.empty().html(prism.highlight(textContent, prism.languages[type])); }, 300); setTimeout(() => {
$code.empty().html(prism.highlight(textContent, prism.languages[type]));
}, 300);
} }
} }
clearTimeout(spinnerTimeoutId); clearTimeout(spinnerTimeoutId);
preview.showSpinner(false); preview.showSpinner(false);
$('#pv-content') jq('#pv-content')
.empty() .empty()
.append($text) .append($text)
.show(); .show();
@ -106,22 +113,22 @@ modulejs.define('ext/preview-txt', ['_', '$', 'marked', 'prism', 'core/event', '
} }
function initItem(item) { function initItem(item) {
if (item.$view && _.includes(_.keys(settings.types), item.type)) { if (item.$view && lo.includes(lo.keys(settings.types), item.type)) {
item.$view.find('a').on('click', function (ev) { item.$view.find('a').on('click', ev => {
ev.preventDefault(); ev.preventDefault();
var matchedItems = _.compact(_.map($('#items .item'), function (matchedItem) { const matchedItems = lo.compact(lo.map(jq('#items .item'), matchedItem => {
matchedItem = $(matchedItem).data('item'); matchedItem = jq(matchedItem).data('item');
return _.includes(_.keys(settings.types), matchedItem.type) ? matchedItem : null; return lo.includes(lo.keys(settings.types), matchedItem.type) ? matchedItem : null;
})); }));
onEnter(matchedItems, _.indexOf(matchedItems, item)); onEnter(matchedItems, lo.indexOf(matchedItems, item));
}); });
} }
} }
function onViewChanged(added) { function onViewChanged(added) {
_.each(added, initItem); lo.each(added, initItem);
} }
function init() { function init() {
@ -134,4 +141,3 @@ modulejs.define('ext/preview-txt', ['_', '$', 'marked', 'prism', 'core/event', '
init(); init();
});

View file

@ -1,12 +1,16 @@
modulejs.define('ext/preview-vid', ['_', '$', 'core/event', 'core/settings', 'ext/preview'], function (_, $, event, allsettings, preview) { const {setTimeout, jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const allsettings = require('../core/settings');
const preview = require('./preview');
const settings = lo.extend({
enabled: false, enabled: false,
types: [] types: []
}, allsettings['preview-vid']); }, allsettings['preview-vid']);
function preloadVideo(src, callback) { function preloadVideo(src, callback) {
var $video = $('<video/>') const $video = jq('<video/>')
.one('loadedmetadata', function () { .one('loadedmetadata', () => {
callback($video); callback($video);
// setTimeout(function () { callback($video); }, 1000); // for testing // setTimeout(function () { callback($video); }, 1000); // for testing
}) })
@ -16,13 +20,13 @@ modulejs.define('ext/preview-vid', ['_', '$', 'core/event', 'core/settings', 'ex
} }
function onEnter(items, idx) { function onEnter(items, idx) {
var currentItems = items; const currentItems = items;
var currentIdx = idx; let currentIdx = idx;
var currentItem = items[idx]; let currentItem = items[idx];
function onAdjustSize() { function onAdjustSize() {
var $content = $('#pv-content'); const $content = jq('#pv-content');
var $vid = $('#pv-vid-video'); const $vid = jq('#pv-vid-video');
if ($vid.length) { if ($vid.length) {
$vid.css({ $vid.css({
@ -42,10 +46,10 @@ modulejs.define('ext/preview-vid', ['_', '$', 'core/event', 'core/settings', 'ex
currentIdx = (currentIdx + rel + currentItems.length) % currentItems.length; currentIdx = (currentIdx + rel + currentItems.length) % currentItems.length;
currentItem = currentItems[currentIdx]; currentItem = currentItems[currentIdx];
var spinnerTimeout = setTimeout(function () { preview.showSpinner(true); }, 200); const spinnerTimeout = setTimeout(() => preview.showSpinner(true), 200);
if ($('#pv-vid-video').length) { if (jq('#pv-vid-video').length) {
$('#pv-vid-video')[0].pause(); jq('#pv-vid-video')[0].pause();
} }
function updateMeta() { function updateMeta() {
@ -55,7 +59,7 @@ modulejs.define('ext/preview-vid', ['_', '$', 'core/event', 'core/settings', 'ex
} }
function swap(nuContent) { function swap(nuContent) {
$('#pv-content').empty().append(nuContent.attr('id', 'pv-vid-video')).fadeIn(200); jq('#pv-content').empty().append(nuContent.attr('id', 'pv-vid-video')).fadeIn(200);
// small timeout, so nuContent is visible and therefore its width is available // small timeout, so nuContent is visible and therefore its width is available
setTimeout(updateMeta, 10); setTimeout(updateMeta, 10);
} }
@ -64,9 +68,7 @@ modulejs.define('ext/preview-vid', ['_', '$', 'core/event', 'core/settings', 'ex
clearTimeout(spinnerTimeout); clearTimeout(spinnerTimeout);
preview.showSpinner(false); preview.showSpinner(false);
$('#pv-content').fadeOut(100, function () { jq('#pv-content').fadeOut(100, () => swap($preloadedContent));
swap($preloadedContent);
});
} }
preloadVideo(currentItem.absHref, onReady); preloadVideo(currentItem.absHref, onReady);
@ -79,22 +81,22 @@ modulejs.define('ext/preview-vid', ['_', '$', 'core/event', 'core/settings', 'ex
} }
function initItem(item) { function initItem(item) {
if (item.$view && _.includes(settings.types, item.type)) { if (item.$view && lo.includes(settings.types, item.type)) {
item.$view.find('a').on('click', function (ev) { item.$view.find('a').on('click', ev => {
ev.preventDefault(); ev.preventDefault();
var matchedItems = _.compact(_.map($('#items .item'), function (matchedItem) { const matchedItems = lo.compact(lo.map(jq('#items .item'), matchedItem => {
matchedItem = $(matchedItem).data('item'); matchedItem = jq(matchedItem).data('item');
return _.includes(settings.types, matchedItem.type) ? matchedItem : null; return lo.includes(settings.types, matchedItem.type) ? matchedItem : null;
})); }));
onEnter(matchedItems, _.indexOf(matchedItems, item)); onEnter(matchedItems, lo.indexOf(matchedItems, item));
}); });
} }
} }
function onViewChanged(added) { function onViewChanged(added) {
_.each(added, initItem); lo.each(added, initItem);
} }
function init() { function init() {
@ -106,4 +108,3 @@ modulejs.define('ext/preview-vid', ['_', '$', 'core/event', 'core/settings', 'ex
} }
init(); init();
});

View file

@ -1,40 +1,45 @@
modulejs.define('ext/preview', ['_', '$', 'core/resource', 'core/settings', 'core/store'], function (_, $, resource, allsettings, store) { const {window: win, setTimeout, jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const resource = require('../core/resource');
const allsettings = require('../core/settings');
const store = require('../core/store');
const settings = lo.extend({
enabled: true enabled: true
}, allsettings.preview); }, allsettings.preview);
var $window = $(window); const $window = jq(win);
var tplOverlay = const tplOverlay =
'<div id="pv-overlay">' + `<div id="pv-overlay">
'<div id="pv-content"/>' + <div id="pv-content"/>
'<div id="pv-spinner"><img class="back"/><img class="spinner" src="' + resource.image('spinner') + '"/></div>' + <div id="pv-spinner"><img class="back"/><img class="spinner" src="${resource.image('spinner')}"/></div>
'<div id="pv-prev-area" class="hof"><img src="' + resource.image('preview-prev') + '"/></div>' + <div id="pv-prev-area" class="hof"><img src="${resource.image('preview-prev')}"/></div>
'<div id="pv-next-area" class="hof"><img src="' + resource.image('preview-next') + '"/></div>' + <div id="pv-next-area" class="hof"><img src="${resource.image('preview-next')}"/></div>
'<div id="pv-bottombar" class="clearfix hof">' + <div id="pv-bottombar" class="clearfix hof">
'<ul id="pv-buttons">' + <ul id="pv-buttons">
'<li id="pv-bar-close" class="bar-right bar-button"><img src="' + resource.image('preview-close') + '"/></li>' + <li id="pv-bar-close" class="bar-right bar-button"><img src="${resource.image('preview-close')}"/></li>
'<li id="pv-bar-raw" class="bar-right"><a class="bar-button" target="_blank"><img src="' + resource.image('preview-raw') + '"/></a></li>' + <li id="pv-bar-raw" class="bar-right"><a class="bar-button" target="_blank"><img src="${resource.image('preview-raw')}"/></a></li>
'<li id="pv-bar-fullscreen" class="bar-right bar-button"><img src="' + resource.image('preview-fullscreen') + '"/></li>' + <li id="pv-bar-fullscreen" class="bar-right bar-button"><img src="${resource.image('preview-fullscreen')}"/></li>
'<li id="pv-bar-next" class="bar-right bar-button"><img src="' + resource.image('preview-next') + '"/></li>' + <li id="pv-bar-next" class="bar-right bar-button"><img src="${resource.image('preview-next')}"/></li>
'<li id="pv-bar-idx" class="bar-right bar-label"/>' + <li id="pv-bar-idx" class="bar-right bar-label"/>
'<li id="pv-bar-prev" class="bar-right bar-button"><img src="' + resource.image('preview-prev') + '"/></li>' + <li id="pv-bar-prev" class="bar-right bar-button"><img src="${resource.image('preview-prev')}"/></li>
'</ul>' + </ul>
'</div>' + </div>
'</div>'; </div>`;
var storekey = 'ext/preview'; const storekey = 'ext/preview';
var isFullscreen = store.get(storekey) || false; let isFullscreen = store.get(storekey) || false;
var userAliveTimeoutId = null; let userAliveTimeoutId = null;
var onIndexChange = null; let onIndexChange = null;
var onAdjustSize = null; let onAdjustSize = null;
var spinnerVisible = false; let spinnerVisible = false;
function adjustSize() { function adjustSize() {
var winWidth = $window.width(); const winWidth = $window.width();
var winHeight = $window.height(); const winHeight = $window.height();
var $container = $('#pv-content'); const $container = jq('#pv-content');
var $spinner = $('#pv-spinner'); const $spinner = jq('#pv-spinner');
var margin = isFullscreen ? 0 : 20; const margin = isFullscreen ? 0 : 20;
var barHeight = isFullscreen ? 0 : 48; const barHeight = isFullscreen ? 0 : 48;
$container.css({ $container.css({
width: winWidth - 2 * margin, width: winWidth - 2 * margin,
@ -49,22 +54,22 @@ modulejs.define('ext/preview', ['_', '$', 'core/resource', 'core/settings', 'cor
}); });
if (isFullscreen) { if (isFullscreen) {
$('#pv-overlay').addClass('fullscreen'); jq('#pv-overlay').addClass('fullscreen');
$('#pv-bar-fullscreen').find('img').attr('src', resource.image('preview-no-fullscreen')); jq('#pv-bar-fullscreen').find('img').attr('src', resource.image('preview-no-fullscreen'));
} else { } else {
$('#pv-overlay').removeClass('fullscreen'); jq('#pv-overlay').removeClass('fullscreen');
$('#pv-bar-fullscreen').find('img').attr('src', resource.image('preview-fullscreen')); jq('#pv-bar-fullscreen').find('img').attr('src', resource.image('preview-fullscreen'));
} }
if (_.isFunction(onAdjustSize)) { if (lo.isFunction(onAdjustSize)) {
onAdjustSize(1); onAdjustSize(1);
} }
} }
function setLabels(labels) { function setLabels(labels) {
$('#pv-buttons .bar-left').remove(); jq('#pv-buttons .bar-left').remove();
_.each(labels, function (label) { lo.each(labels, label => {
$('<li/>') jq('<li/>')
.addClass('bar-left bar-label') .addClass('bar-left bar-label')
.text(label) .text(label)
.appendTo('#pv-buttons'); .appendTo('#pv-buttons');
@ -72,24 +77,24 @@ modulejs.define('ext/preview', ['_', '$', 'core/resource', 'core/settings', 'cor
} }
function onNext() { function onNext() {
if (_.isFunction(onIndexChange)) { if (lo.isFunction(onIndexChange)) {
onIndexChange(1); onIndexChange(1);
} }
} }
function onPrevious() { function onPrevious() {
if (_.isFunction(onIndexChange)) { if (lo.isFunction(onIndexChange)) {
onIndexChange(-1); onIndexChange(-1);
} }
} }
function userAlive() { function userAlive() {
clearTimeout(userAliveTimeoutId); clearTimeout(userAliveTimeoutId);
$('#pv-overlay .hof').stop(true, true).fadeIn(200); jq('#pv-overlay .hof').stop(true, true).fadeIn(200);
if (isFullscreen) { if (isFullscreen) {
userAliveTimeoutId = setTimeout(function () { userAliveTimeoutId = setTimeout(() => {
$('#pv-overlay .hof').stop(true, true).fadeOut(2000); jq('#pv-overlay .hof').stop(true, true).fadeOut(2000);
}, 2000); }, 2000);
} }
} }
@ -103,7 +108,7 @@ modulejs.define('ext/preview', ['_', '$', 'core/resource', 'core/settings', 'cor
} }
function onKeydown(ev) { function onKeydown(ev) {
var key = ev.which; const key = ev.which;
if (key === 27) { // esc if (key === 27) { // esc
ev.preventDefault(); ev.preventDefault();
@ -126,33 +131,33 @@ modulejs.define('ext/preview', ['_', '$', 'core/resource', 'core/settings', 'cor
function onEnter() { function onEnter() {
setLabels([]); setLabels([]);
$('#pv-content').empty(); jq('#pv-content').empty();
$('#pv-overlay').stop(true, true).fadeIn(200); jq('#pv-overlay').stop(true, true).fadeIn(200);
$window.on('keydown', onKeydown); $window.on('keydown', onKeydown);
adjustSize(); adjustSize();
} }
function onExit() { function onExit() {
$window.off('keydown', onKeydown); $window.off('keydown', onKeydown);
$('#pv-overlay').stop(true, true).fadeOut(200, function () { jq('#pv-overlay').stop(true, true).fadeOut(200, () => {
$('#pv-content').empty(); jq('#pv-content').empty();
setLabels([]); setLabels([]);
}); });
} }
function setIndex(idx, total) { function setIndex(idx, total) {
if (_.isNumber(idx)) { if (lo.isNumber(idx)) {
$('#pv-bar-idx').text(String(idx) + (_.isNumber(total) ? '/' + String(total) : '')).show(); jq('#pv-bar-idx').text(String(idx) + (lo.isNumber(total) ? '/' + String(total) : '')).show();
} else { } else {
$('#pv-bar-idx').text('').hide(); jq('#pv-bar-idx').text('').hide();
} }
} }
function setRawLink(href) { function setRawLink(href) {
if (href) { if (href) {
$('#pv-bar-raw').show().find('a').attr('href', href); jq('#pv-bar-raw').show().find('a').attr('href', href);
} else { } else {
$('#pv-bar-raw').hide().find('a').attr('href', '#'); jq('#pv-bar-raw').hide().find('a').attr('href', '#');
} }
} }
@ -165,12 +170,12 @@ modulejs.define('ext/preview', ['_', '$', 'core/resource', 'core/settings', 'cor
} }
function showSpinner(show, src, millis) { function showSpinner(show, src, millis) {
if (!_.isNumber(millis)) { if (!lo.isNumber(millis)) {
millis = 300; millis = 300;
} }
var $spinner = $('#pv-spinner').stop(true, true); const $spinner = jq('#pv-spinner').stop(true, true);
var $back = $spinner.find('.back'); const $back = $spinner.find('.back');
if (show) { if (show) {
if (src) { if (src) {
@ -195,18 +200,18 @@ modulejs.define('ext/preview', ['_', '$', 'core/resource', 'core/settings', 'cor
return; return;
} }
$(tplOverlay).appendTo('body'); jq(tplOverlay).appendTo('body');
$('#pv-spinner').hide(); jq('#pv-spinner').hide();
$('#pv-bar-prev, #pv-prev-area').on('click', onPrevious); jq('#pv-bar-prev, #pv-prev-area').on('click', onPrevious);
$('#pv-bar-next, #pv-next-area').on('click', onNext); jq('#pv-bar-next, #pv-next-area').on('click', onNext);
$('#pv-bar-close').on('click', onExit); jq('#pv-bar-close').on('click', onExit);
$('#pv-bar-fullscreen').on('click', onFullscreen); jq('#pv-bar-fullscreen').on('click', onFullscreen);
$('#pv-overlay') jq('#pv-overlay')
.on('keydown', onKeydown) .on('keydown', onKeydown)
.on('mousemove mousedown', userAlive) .on('mousemove mousedown', userAlive)
.on('click mousedown mousemove keydown keypress', function (ev) { .on('click mousedown mousemove keydown keypress', ev => {
if (ev.type === 'click' && (ev.target.id === 'pv-overlay' || ev.target.id === 'pv-content')) { if (ev.type === 'click' && (ev.target.id === 'pv-overlay' || ev.target.id === 'pv-content')) {
onExit(); onExit();
} }
@ -219,15 +224,14 @@ modulejs.define('ext/preview', ['_', '$', 'core/resource', 'core/settings', 'cor
init(); init();
return { module.exports = {
enter: onEnter, enter: onEnter,
exit: onExit, exit: onExit,
setIndex: setIndex, setIndex,
setRawLink: setRawLink, setRawLink,
setLabels: setLabels, setLabels,
setOnIndexChange: setOnIndexChange, setOnIndexChange,
setOnAdjustSize: setOnAdjustSize, setOnAdjustSize,
showSpinner: showSpinner, showSpinner,
isSpinnerVisible: isSpinnerVisible isSpinnerVisible
}; };
});

View file

@ -1,18 +1,29 @@
modulejs.define('ext/search', ['_', '$', 'core/event', 'core/location', 'core/resource', 'core/server', 'core/settings', 'core/util', 'model/item', 'view/view'], function (_, $, event, location, resource, server, allsettings, util, Item, view) { const {jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const location = require('../core/location');
const resource = require('../core/resource');
const server = require('../core/server');
const allsettings = require('../core/settings');
const util = require('../core/util');
const Item = require('../model/item');
const view = require('../view/view');
const settings = lo.extend({
enabled: false, enabled: false,
advanced: false, advanced: false,
debounceTime: 300 debounceTime: 300,
ignorecase: true
}, allsettings.search); }, allsettings.search);
var template = const template =
'<div id="search" class="tool">' + `<div id="search" class="tool">
'<img src="' + resource.image('search') + '" alt="search"/>' + <img src="${resource.image('search')}" alt="search"/>
'<input class="l10n_ph-search" type="text" value=""/>' + <input class="l10n_ph-search" type="text" value=""/>
'</div>'; </div>`;
var inputIsVisible = false; let inputIsVisible = false;
var prevPattern = ''; let prevPattern = '';
var $search; let $search;
var $input; let $input;
function search(pattern) { function search(pattern) {
@ -33,12 +44,13 @@ modulejs.define('ext/search', ['_', '$', 'core/event', 'core/location', 'core/re
action: 'get', action: 'get',
search: { search: {
href: location.getAbsHref(), href: location.getAbsHref(),
pattern: pattern pattern,
ignorecase: settings.ignorecase
} }
}, function (response) { }).then(response => {
$search.removeClass('pending'); $search.removeClass('pending');
view.setHint('noMatch'); view.setHint('noMatch');
view.setItems(_.map(response.search, function (item) { view.setItems(lo.map(response.search, item => {
return Item.get(item); return Item.get(item);
})); }));
}); });
@ -71,14 +83,13 @@ modulejs.define('ext/search', ['_', '$', 'core/event', 'core/location', 'core/re
return; return;
} }
$search = $(template).appendTo('#toolbar'); $search = jq(template).appendTo('#toolbar');
$input = $search.find('input'); $input = $search.find('input');
$search.on('click', 'img', toggle); $search.on('click', 'img', toggle);
$input.on('keyup', _.debounce(update, settings.debounceTime, {trailing: true})); $input.on('keyup', lo.debounce(update, settings.debounceTime, {trailing: true}));
event.sub('location.changed', reset); event.sub('location.changed', reset);
} }
init(); init();
});

View file

@ -1,27 +1,32 @@
modulejs.define('ext/select', ['_', '$', 'core/event', 'core/resource', 'core/settings'], function (_, $, event, resource, allsettings) { const {document: doc, jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const resource = require('../core/resource');
const allsettings = require('../core/settings');
const settings = lo.extend({
enabled: false, enabled: false,
clickndrag: false, clickndrag: false,
checkboxes: false checkboxes: false
}, allsettings.select); }, allsettings.select);
var template = '<span class="selector"><img src="' + resource.image('selected') + '" alt="selected"/></span>'; const template = '<span class="selector"><img src="' + resource.image('selected') + '" alt="selected"/></span>';
var x = 0; let x = 0;
var y = 0; let y = 0;
var l = 0; let l = 0;
var t = 0; let t = 0;
var w = 0; let w = 0;
var h = 0; let h = 0;
var isDragSelect; let isDragSelect;
var isCtrlPressed; let isCtrlPressed;
var shrink = 1 / 3; const shrink = 1 / 3;
var $document = $(document); const $document = jq(doc);
var $html = $('html'); const $html = jq('html');
var $selectionRect = $('<div id="selection-rect"/>'); const $selectionRect = jq('<div id="selection-rect"/>');
function publish() { function publish() {
var items = _.map($('#items .item.selected'), function (itemElement) { const items = lo.map(jq('#items .item.selected'), itemElement => {
return $(itemElement).data('item'); return jq(itemElement).data('item');
}); });
event.pub('selection', items); event.pub('selection', items);
} }
@ -31,11 +36,11 @@ modulejs.define('ext/select', ['_', '$', 'core/event', 'core/resource', 'core/se
return null; return null;
} }
var offset = $element.offset(); const offset = $element.offset();
var elL = offset.left; const elL = offset.left;
var elT = offset.top; const elT = offset.top;
var elW = $element.outerWidth(); const elW = $element.outerWidth();
var elH = $element.outerHeight(); const elH = $element.outerHeight();
return {l: elL, t: elT, w: elW, h: elH, r: elL + elW, b: elT + elH}; return {l: elL, t: elT, w: elW, h: elH, r: elL + elW, b: elT + elH};
} }
@ -44,12 +49,12 @@ modulejs.define('ext/select', ['_', '$', 'core/event', 'core/resource', 'core/se
return false; return false;
} }
var left = Math.max(rect1.l, rect2.l); const left = Math.max(rect1.l, rect2.l);
var right = Math.min(rect1.r, rect2.r); const right = Math.min(rect1.r, rect2.r);
var top = Math.max(rect1.t, rect2.t); const top = Math.max(rect1.t, rect2.t);
var bottom = Math.min(rect1.b, rect2.b); const bottom = Math.min(rect1.b, rect2.b);
var width = right - left; const width = right - left;
var height = bottom - top; const height = bottom - top;
return width >= 0 && height >= 0; return width >= 0 && height >= 0;
} }
@ -65,7 +70,7 @@ modulejs.define('ext/select', ['_', '$', 'core/event', 'core/resource', 'core/se
} }
if (!isDragSelect && !isCtrlPressed) { if (!isDragSelect && !isCtrlPressed) {
$('#items .item').removeClass('selected'); jq('#items .item').removeClass('selected');
publish(); publish();
} }
@ -78,10 +83,10 @@ modulejs.define('ext/select', ['_', '$', 'core/event', 'core/resource', 'core/se
.css({left: l, top: t, width: w, height: h, opacity: 1}) .css({left: l, top: t, width: w, height: h, opacity: 1})
.show(); .show();
var selRect = elementRect($selectionRect); const selRect = elementRect($selectionRect);
$('#items .item').removeClass('selecting').each(function () { jq('#items .item').removeClass('selecting').each((idx, el) => {
var $item = $(this); const $item = jq(el);
var inter = doOverlap(selRect, elementRect($item.find('a'))); const inter = doOverlap(selRect, elementRect($item.find('a')));
if (inter && !$item.hasClass('folder-parent')) { if (inter && !$item.hasClass('folder-parent')) {
$item.addClass('selecting'); $item.addClass('selecting');
@ -97,8 +102,8 @@ modulejs.define('ext/select', ['_', '$', 'core/event', 'core/resource', 'core/se
} }
ev.preventDefault(); ev.preventDefault();
$('#items .item.selecting.selected').removeClass('selecting').removeClass('selected'); jq('#items .item.selecting.selected').removeClass('selecting').removeClass('selected');
$('#items .item.selecting').removeClass('selecting').addClass('selected'); jq('#items .item.selecting').removeClass('selecting').addClass('selected');
publish(); publish();
$html.removeClass('drag-select'); $html.removeClass('drag-select');
@ -112,14 +117,14 @@ modulejs.define('ext/select', ['_', '$', 'core/event', 'core/resource', 'core/se
opacity: 0 opacity: 0
}, },
300, 300,
function () { () => {
$selectionRect.hide(); $selectionRect.hide();
}); });
} }
function selectionStart(ev) { function selectionStart(ev) {
// only on left button and don't block scrollbar // only on left button and don't block scrollbar
if (ev.button !== 0 || ev.offsetX >= $('#content').width() - 14) { if (ev.button !== 0 || ev.offsetX >= jq('#content').width() - 14) {
return; return;
} }
@ -137,13 +142,13 @@ modulejs.define('ext/select', ['_', '$', 'core/event', 'core/resource', 'core/se
ev.stopImmediatePropagation(); ev.stopImmediatePropagation();
ev.preventDefault(); ev.preventDefault();
$(ev.target).closest('.item').toggleClass('selected'); jq(ev.target).closest('.item').toggleClass('selected');
publish(); publish();
} }
function addCheckbox(item) { function addCheckbox(item) {
if (item.$view && !item.isCurrentParentFolder()) { if (item.$view && !item.isCurrentParentFolder()) {
$(template) jq(template)
.on('click', onSelectorClick) .on('click', onSelectorClick)
.appendTo(item.$view.find('a')); .appendTo(item.$view.find('a'));
} }
@ -151,10 +156,10 @@ modulejs.define('ext/select', ['_', '$', 'core/event', 'core/resource', 'core/se
function onViewChanged(added, removed) { function onViewChanged(added, removed) {
if (settings.checkboxes) { if (settings.checkboxes) {
_.each(added, addCheckbox); lo.each(added, addCheckbox);
} }
_.each(removed, function (item) { lo.each(removed, item => {
if (item.$view) { if (item.$view) {
item.$view.removeClass('selected'); item.$view.removeClass('selected');
} }
@ -173,14 +178,14 @@ modulejs.define('ext/select', ['_', '$', 'core/event', 'core/resource', 'core/se
if (settings.clickndrag) { if (settings.clickndrag) {
$selectionRect.hide().appendTo('body'); $selectionRect.hide().appendTo('body');
$('#content') jq('#content')
.on('mousedown', selectionStart) .on('mousedown', selectionStart)
.on('drag dragstart', function (ev) { .on('drag dragstart', ev => {
ev.stopImmediatePropagation(); ev.stopImmediatePropagation();
ev.preventDefault(); ev.preventDefault();
}) })
.on('click', function () { .on('click', () => {
$('#items .item').removeClass('selected'); jq('#items .item').removeClass('selected');
publish(); publish();
}); });
} }
@ -188,4 +193,3 @@ modulejs.define('ext/select', ['_', '$', 'core/event', 'core/resource', 'core/se
init(); init();
});

View file

@ -1,5 +1,11 @@
modulejs.define('ext/sort', ['_', '$', 'core/event', 'core/resource', 'core/settings', 'core/store', 'core/util'], function (_, $, event, resource, allsettings, store, util) { const {jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const resource = require('../core/resource');
const allsettings = require('../core/settings');
const store = require('../core/store');
const util = require('../core/util');
const settings = lo.extend({
enabled: false, enabled: false,
column: 0, column: 0,
reverse: false, reverse: false,
@ -7,12 +13,12 @@ modulejs.define('ext/sort', ['_', '$', 'core/event', 'core/resource', 'core/sett
natural: false, natural: false,
folders: 0 folders: 0
}, allsettings.sort); }, allsettings.sort);
var storekey = 'ext/sort'; const storekey = 'ext/sort';
var template = '<img src="' + resource.image('sort') + '" class="sort" alt="sort order" />'; const template = '<img src="' + resource.image('sort') + '" class="sort" alt="sort order" />';
function getType(item) { function getType(item) {
var $item = $(item); const $item = jq(item);
if ($item.hasClass('folder-parent')) { if ($item.hasClass('folder-parent')) {
return 0; return 0;
@ -29,24 +35,24 @@ modulejs.define('ext/sort', ['_', '$', 'core/event', 'core/resource', 'core/sett
} }
function getName(item) { function getName(item) {
return $(item).find('.label').text(); return jq(item).find('.label').text();
} }
function getTime(item) { function getTime(item) {
return $(item).find('.date').data('time'); return jq(item).find('.date').data('time');
} }
function getSize(item) { function getSize(item) {
return $(item).find('.size').data('bytes'); return jq(item).find('.size').data('bytes');
} }
var columnGetters = { const columnGetters = {
0: getName, 0: getName,
1: getTime, 1: getTime,
2: getSize 2: getSize
}; };
var columnClasses = { const columnClasses = {
0: 'label', 0: 'label',
1: 'date', 1: 'date',
2: 'size' 2: 'size'
@ -54,10 +60,10 @@ modulejs.define('ext/sort', ['_', '$', 'core/event', 'core/resource', 'core/sett
function cmpFn(getValue, reverse, ignorecase, natural) { function cmpFn(getValue, reverse, ignorecase, natural) {
return function (item1, item2) { return (item1, item2) => {
var res; let res;
var val1; let val1;
var val2; let val2;
res = getType(item1) - getType(item2); res = getType(item1) - getType(item2);
if (res !== 0) { if (res !== 0) {
@ -83,18 +89,18 @@ modulejs.define('ext/sort', ['_', '$', 'core/event', 'core/resource', 'core/sett
} }
function sortItems(column, reverse) { function sortItems(column, reverse) {
var $headers = $('#items li.header a'); const $headers = jq('#items li.header a');
var $header = $('#items li.header a.' + columnClasses[column]); const $header = jq('#items li.header a.' + columnClasses[column]);
var fn = cmpFn(columnGetters[column], reverse, settings.ignorecase, column === 0 && settings.natural); const fn = cmpFn(columnGetters[column], reverse, settings.ignorecase, column === 0 && settings.natural);
var $current = $('#items .item'); const $current = jq('#items .item');
var $sorted = $('#items .item').sort(fn); const $sorted = jq('#items .item').sort(fn);
store.put(storekey, {column: column, reverse: reverse}); store.put(storekey, {column, reverse});
$headers.removeClass('ascending descending'); $headers.removeClass('ascending descending');
$header.addClass(reverse ? 'descending' : 'ascending'); $header.addClass(reverse ? 'descending' : 'ascending');
for (var i = 0, l = $current.length; i < l; i += 1) { for (let i = 0, l = $current.length; i < l; i += 1) {
if ($current[i] !== $sorted[i]) { if ($current[i] !== $sorted[i]) {
$sorted.detach().sort(fn).appendTo('#items'); $sorted.detach().sort(fn).appendTo('#items');
break; break;
@ -103,9 +109,9 @@ modulejs.define('ext/sort', ['_', '$', 'core/event', 'core/resource', 'core/sett
} }
function onContentChanged() { function onContentChanged() {
var order = store.get(storekey); const order = store.get(storekey);
var column = order && order.column || settings.column; const column = order && order.column || settings.column;
var reverse = order && order.reverse || settings.reverse; const reverse = order && order.reverse || settings.reverse;
sortItems(column, reverse); sortItems(column, reverse);
} }
@ -115,26 +121,26 @@ modulejs.define('ext/sort', ['_', '$', 'core/event', 'core/resource', 'core/sett
return; return;
} }
var $header = $('#items li.header'); const $header = jq('#items li.header');
$header.find('a.label') $header.find('a.label')
.append(template) .append(template)
.click(function (ev) { .click(ev => {
sortItems(0, $(this).hasClass('ascending')); sortItems(0, jq(ev.currentTarget).hasClass('ascending'));
ev.preventDefault(); ev.preventDefault();
}); });
$header.find('a.date') $header.find('a.date')
.prepend(template) .prepend(template)
.click(function (ev) { .click(ev => {
sortItems(1, $(this).hasClass('ascending')); sortItems(1, jq(ev.currentTarget).hasClass('ascending'));
ev.preventDefault(); ev.preventDefault();
}); });
$header.find('a.size') $header.find('a.size')
.prepend(template) .prepend(template)
.click(function (ev) { .click(ev => {
sortItems(2, $(this).hasClass('ascending')); sortItems(2, jq(ev.currentTarget).hasClass('ascending'));
ev.preventDefault(); ev.preventDefault();
}); });
@ -143,4 +149,3 @@ modulejs.define('ext/sort', ['_', '$', 'core/event', 'core/resource', 'core/sett
init(); init();
});

View file

@ -1,5 +1,9 @@
modulejs.define('ext/thumbnails', ['_', 'core/event', 'core/server', 'core/settings'], function (_, event, server, allsettings) { const {_: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const server = require('../core/server');
const allsettings = require('../core/settings');
const settings = lo.extend({
enabled: false, enabled: false,
img: ['img-bmp', 'img-gif', 'img-ico', 'img-jpg', 'img-png'], img: ['img-bmp', 'img-gif', 'img-ico', 'img-jpg', 'img-png'],
mov: ['vid-avi', 'vid-flv', 'vid-mkv', 'vid-mov', 'vid-mp4', 'vid-mpg', 'vid-webm'], mov: ['vid-avi', 'vid-flv', 'vid-mkv', 'vid-mov', 'vid-mp4', 'vid-mpg', 'vid-webm'],
@ -8,17 +12,17 @@ modulejs.define('ext/thumbnails', ['_', 'core/event', 'core/server', 'core/setti
size: 100, size: 100,
exif: false exif: false
}, allsettings.thumbnails); }, allsettings.thumbnails);
var landscapeRatio = 4 / 3; const landscapeRatio = 4 / 3;
function queueItem(queue, item) { function queueItem(queue, item) {
var type = null; let type = null;
if (_.includes(settings.img, item.type)) { if (lo.includes(settings.img, item.type)) {
type = 'img'; type = 'img';
} else if (_.includes(settings.mov, item.type)) { } else if (lo.includes(settings.mov, item.type)) {
type = 'mov'; type = 'mov';
} else if (_.includes(settings.doc, item.type)) { } else if (lo.includes(settings.doc, item.type)) {
type = 'doc'; type = 'doc';
} else { } else {
return; return;
@ -28,10 +32,10 @@ modulejs.define('ext/thumbnails', ['_', 'core/event', 'core/server', 'core/setti
item.$view.find('.icon.square img').addClass('thumb').attr('src', item.thumbSquare); item.$view.find('.icon.square img').addClass('thumb').attr('src', item.thumbSquare);
} else { } else {
queue.push({ queue.push({
type: type, type,
href: item.absHref, href: item.absHref,
ratio: 1, ratio: 1,
callback: function (src) { callback: src => {
if (src && item.$view) { if (src && item.$view) {
item.thumbSquare = src; item.thumbSquare = src;
item.$view.find('.icon.square img').addClass('thumb').attr('src', src); item.$view.find('.icon.square img').addClass('thumb').attr('src', src);
@ -44,10 +48,10 @@ modulejs.define('ext/thumbnails', ['_', 'core/event', 'core/server', 'core/setti
item.$view.find('.icon.landscape img').addClass('thumb').attr('src', item.thumbRational); item.$view.find('.icon.landscape img').addClass('thumb').attr('src', item.thumbRational);
} else { } else {
queue.push({ queue.push({
type: type, type,
href: item.absHref, href: item.absHref,
ratio: landscapeRatio, ratio: landscapeRatio,
callback: function (src) { callback: src => {
if (src && item.$view) { if (src && item.$view) {
item.thumbRational = src; item.thumbRational = src;
item.$view.find('.icon.landscape img').addClass('thumb').attr('src', src); item.$view.find('.icon.landscape img').addClass('thumb').attr('src', src);
@ -58,7 +62,7 @@ modulejs.define('ext/thumbnails', ['_', 'core/event', 'core/server', 'core/setti
} }
function requestQueue(queue) { function requestQueue(queue) {
var thumbs = _.map(queue, function (req) { const thumbs = lo.map(queue, req => {
return { return {
type: req.type, type: req.type,
href: req.href, href: req.href,
@ -69,18 +73,18 @@ modulejs.define('ext/thumbnails', ['_', 'core/event', 'core/server', 'core/setti
server.request({ server.request({
action: 'get', action: 'get',
thumbs: thumbs thumbs
}, function (json) { }).then(json => {
_.each(queue, function (req, idx) { lo.each(queue, (req, idx) => {
req.callback(json && json.thumbs ? json.thumbs[idx] : null); req.callback(json && json.thumbs ? json.thumbs[idx] : null);
}); });
}); });
} }
function handleItems(items) { function handleItems(items) {
var queue = []; const queue = [];
_.each(items, function (item) { lo.each(items, item => {
queueItem(queue, item); queueItem(queue, item);
}); });
@ -90,7 +94,7 @@ modulejs.define('ext/thumbnails', ['_', 'core/event', 'core/server', 'core/setti
} }
function onViewChanged(added) { function onViewChanged(added) {
setTimeout(function () { setTimeout(() => {
handleItems(added); handleItems(added);
}, settings.delay); }, settings.delay);
} }
@ -105,4 +109,3 @@ modulejs.define('ext/thumbnails', ['_', 'core/event', 'core/server', 'core/setti
init(); init();
});

View file

@ -1,17 +1,21 @@
modulejs.define('ext/title', ['_', 'core/event', 'core/settings'], function (_, event, allsettings) { const {document: doc, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const allsettings = require('../core/settings');
const settings = lo.extend({
enabled: false enabled: false
}, allsettings.title); }, allsettings.title);
function onLocationChanged(item) { function onLocationChanged(item) {
var labels = _.map(item.getCrumb(), 'label'); const labels = lo.map(item.getCrumb(), 'label');
var title = labels.join(' > '); let title = labels.join(' > ');
if (labels.length > 1) { if (labels.length > 1) {
title = labels[labels.length - 1] + ' - ' + title; title = labels[labels.length - 1] + ' - ' + title;
} }
document.title = title; doc.title = title;
} }
function init() { function init() {
@ -23,4 +27,3 @@ modulejs.define('ext/title', ['_', 'core/event', 'core/settings'], function (_,
} }
init(); init();
});

View file

@ -1,34 +1,42 @@
modulejs.define('ext/tree', ['_', '$', 'core/event', 'core/location', 'core/resource', 'core/settings', 'core/store', 'core/util'], function (_, $, event, location, resource, allsettings, store, util) { const {jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const location = require('../core/location');
const resource = require('../core/resource');
const allsettings = require('../core/settings');
const store = require('../core/store');
const util = require('../core/util');
const settings = lo.extend({
enabled: false, enabled: false,
show: true, show: true,
maxSubfolders: 50, maxSubfolders: 50,
naturalSort: false, naturalSort: false,
ignorecase: true ignorecase: true
}, allsettings.tree); }, allsettings.tree);
var template = const template =
'<div class="item">' + `<div class="item">
'<span class="indicator none">' + <span class="indicator none">
'<img src="' + resource.image('tree-indicator') + '"/>' + <img src="${resource.image('tree-indicator')}"/>
'</span>' + </span>
'<a>' + <a>
'<span class="icon"><img/></span>' + <span class="icon"><img/></span>
'<span class="label"/>' + <span class="label"/>
'</a>' + </a>
'</span>'; </span>`;
var settingsTemplate = const settingsTemplate =
'<div class="block">' + `<div class="block">
'<h1 class="l10n-tree">Tree</h1>' + <h1 class="l10n-tree">Tree</h1>
'<div id="view-tree" class="button view">' + <div id="view-tree" class="button view">
'<img src="' + resource.image('tree-toggle') + '" alt="view-tree"/>' + <img src="${resource.image('tree-toggle')}" alt="view-tree"/>
'</div>' + </div>
'</div>'; </div>`;
var storekey = 'ext/tree'; const storekey = 'ext/tree';
function cmpFn(item1, item2) { function cmpFn(item1, item2) {
var val1 = item1.label; let val1 = item1.label;
var val2 = item2.label; let val2 = item2.label;
if (settings.ignorecase) { if (settings.ignorecase) {
val1 = val1.toLowerCase(); val1 = val1.toLowerCase();
@ -39,11 +47,11 @@ modulejs.define('ext/tree', ['_', '$', 'core/event', 'core/location', 'core/reso
} }
function update(item) { function update(item) {
var $html = $(template); const $html = jq(template);
var $indicator = $html.find('.indicator'); const $indicator = $html.find('.indicator');
var $a = $html.find('a'); const $a = $html.find('a');
var $img = $html.find('.icon img'); const $img = $html.find('.icon img');
var $label = $html.find('.label'); const $label = $html.find('.label');
$html $html
.addClass(item.isFolder() ? 'folder' : 'file') .addClass(item.isFolder() ? 'folder' : 'file')
@ -54,7 +62,7 @@ modulejs.define('ext/tree', ['_', '$', 'core/event', 'core/location', 'core/reso
$label.text(item.label); $label.text(item.label);
if (item.isFolder()) { if (item.isFolder()) {
var subfolders = item.getSubfolders(); const subfolders = item.getSubfolders();
// indicator // indicator
if (item.isManaged && !item.isContentFetched || subfolders.length) { if (item.isManaged && !item.isContentFetched || subfolders.length) {
@ -78,16 +86,16 @@ modulejs.define('ext/tree', ['_', '$', 'core/event', 'core/location', 'core/reso
if (subfolders.length) { if (subfolders.length) {
subfolders.sort(cmpFn); subfolders.sort(cmpFn);
var $ul = $('<ul class="content"/>').appendTo($html); const $ul = jq('<ul class="content"/>').appendTo($html);
var counter = 0; let counter = 0;
_.each(subfolders, function (e) { lo.each(subfolders, e => {
counter += 1; counter += 1;
if (counter <= settings.maxSubfolders) { if (counter <= settings.maxSubfolders) {
$('<li/>').append(update(e)).appendTo($ul); jq('<li/>').append(update(e)).appendTo($ul);
} }
}); });
if (subfolders.length > settings.maxSubfolders) { if (subfolders.length > settings.maxSubfolders) {
$('<li class="summary">… ' + (subfolders.length - settings.maxSubfolders) + ' more subfolders</li>').appendTo($ul); jq('<li class="summary">… ' + (subfolders.length - settings.maxSubfolders) + ' more subfolders</li>').appendTo($ul);
} }
if (!item.isContentVisible) { if (!item.isContentVisible) {
$ul.hide(); $ul.hide();
@ -115,14 +123,14 @@ modulejs.define('ext/tree', ['_', '$', 'core/event', 'core/location', 'core/reso
$content[down ? 'slideDown' : 'slideUp'](); $content[down ? 'slideDown' : 'slideUp']();
} }
return function () { return ev => {
var $indicator = $(this); let $indicator = jq(ev.currentTarget);
var $item = $indicator.closest('.item'); let $item = $indicator.closest('.item');
var item = $item.data('item'); const item = $item.data('item');
var $content = $item.find('> ul.content'); let $content = $item.find('> ul.content');
if ($indicator.hasClass('unknown')) { if ($indicator.hasClass('unknown')) {
item.fetchContent(function () { item.fetchContent(() => {
item.isContentVisible = false; item.isContentVisible = false;
$item = update(item); $item = update(item);
@ -143,7 +151,7 @@ modulejs.define('ext/tree', ['_', '$', 'core/event', 'core/location', 'core/reso
function fetchTree(item, callback) { function fetchTree(item, callback) {
item.isContentVisible = true; item.isContentVisible = true;
item.fetchContent(function () { item.fetchContent(() => {
if (item.parent) { if (item.parent) {
fetchTree(item.parent, callback); fetchTree(item.parent, callback);
} else { } else {
@ -154,17 +162,17 @@ modulejs.define('ext/tree', ['_', '$', 'core/event', 'core/location', 'core/reso
function updateSettings() { function updateSettings() {
if (store.get(storekey)) { if (store.get(storekey)) {
$('#view-tree').addClass('active'); jq('#view-tree').addClass('active');
$('#tree').show(); jq('#tree').show();
} else { } else {
$('#view-tree').removeClass('active'); jq('#view-tree').removeClass('active');
$('#tree').hide(); jq('#tree').hide();
} }
} }
function onLocationChanged(item) { function onLocationChanged(item) {
fetchTree(item, function (root) { fetchTree(item, root => {
$('#tree').append(update(root)); jq('#tree').append(update(root));
updateSettings(); updateSettings();
}); });
} }
@ -174,14 +182,14 @@ modulejs.define('ext/tree', ['_', '$', 'core/event', 'core/location', 'core/reso
return; return;
} }
$('<div id="tree"/>') jq('<div id="tree"/>')
.appendTo('#mainrow') .appendTo('#mainrow')
.on('click', '.indicator', createOnIndicatorClick()); .on('click', '.indicator', createOnIndicatorClick());
$(settingsTemplate) jq(settingsTemplate)
.appendTo('#sidebar') .appendTo('#sidebar')
.find('#view-tree') .find('#view-tree')
.on('click', function (ev) { .on('click', ev => {
store.put(storekey, !store.get(storekey)); store.put(storekey, !store.get(storekey));
updateSettings(); updateSettings();
ev.preventDefault(); ev.preventDefault();
@ -198,4 +206,3 @@ modulejs.define('ext/tree', ['_', '$', 'core/event', 'core/location', 'core/reso
init(); init();
});

View file

@ -0,0 +1,23 @@
const {jQuery: jq} = require('./win');
const config = require('./config');
const name = jq('script[data-module]').data('module');
const request = {
action: 'get',
setup: true,
options: true,
types: true
};
if (name === 'index') {
request.theme = true;
request.langs = true;
} else if (name === 'info') {
request.refresh = true;
} else {
throw new Error(`no-main-module: '${name}'`);
}
config._update(request).then(() => {
jq(() => require(`./main/${name}`));
});

View file

@ -1,11 +1,28 @@
modulejs.define('main/index', ['_', 'core/location'], function (_, location) { const {document: doc} = require('../win');
modulejs.require('view/viewmode'); const location = require('../core/location');
_.each(modulejs.state(), function (state, id) { require('../view/viewmode');
if (id.indexOf('ext/') === 0) { require('../ext/autorefresh');
modulejs.require(id); require('../ext/contextmenu');
} require('../ext/crumb');
}); require('../ext/custom');
require('../ext/download');
require('../ext/filter');
require('../ext/google-analytics');
require('../ext/info');
require('../ext/l10n');
require('../ext/peer5');
require('../ext/piwik-analytics');
require('../ext/preview');
require('../ext/preview-aud');
require('../ext/preview-img');
require('../ext/preview-txt');
require('../ext/preview-vid');
require('../ext/search');
require('../ext/select');
require('../ext/sort');
require('../ext/thumbnails');
require('../ext/title');
require('../ext/tree');
location.setLocation(document.location.href, true); location.setLocation(doc.location.href, true);
});

View file

@ -1,38 +1,43 @@
modulejs.define('main/info', ['$', 'config', 'core/resource', 'core/server'], function ($, config, resource, server) { const {window: win, jQuery: jq} = require('../win');
var tplTests = const config = require('../config');
const resource = require('../core/resource');
const server = require('../core/server');
const tplTests =
'<ul id="tests">'; '<ul id="tests">';
var tplTest = const tplTest =
'<li class="test">' + `<li class="test">
'<span class="label"></span>' + <span class="label"></span>
'<span class="result"></span>' + <span class="result"></span>
'<div class="info"></div>' + <div class="info"></div>
'</li>'; </li>`;
var tplLogin = const tplLogin =
'<div id="login-wrapper">' + `<div id="login-wrapper">
'<input id="pass" type="password" placeholder="password"/>' + <input id="pass" type="password" placeholder="password"/>
'<span id="login">login</span>' + <span id="login">login</span>
'<span id="logout">logout</span>' + <span id="logout">logout</span>
'<div id="hint">' + <div id="hint">
'The preset password is the empty string, just click login. ' + The preset password is the empty string, just click login.
'Change it in \'_h5ai/private/conf/options.json\'.' + Change it in '_h5ai/private/conf/options.json'.
'</div>' + </div>
'</div>'; </div>`;
var tplSupport = const tplSupport =
'<div id="support">' + `<div id="support">
'Show your support with a donation!' + Show your support with a donation!
'<div class="paypal">' + <div class="paypal">
'<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">' + <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
'<input type="hidden" name="cmd" value="_s-xclick" />' + <input type="hidden" name="cmd" value="_s-xclick" />
'<input type="hidden" name="hosted_button_id" value="8WSPKWT7YBTSQ" />' + <input type="hidden" name="hosted_button_id" value="8WSPKWT7YBTSQ" />
'<input type="image" src="' + resource.image('paypal') + '" name="submit" alt="PayPal" />' + <input type="image" src="${resource.image('paypal')}" name="submit" alt="PayPal" />
'</form>' + </form>
'</div>' + </div>
'</div>'; </div>`;
var setup = config.setup; const setup = config.setup;
function addTest(label, info, passed, result) { function addTest(label, info, passed, result) {
var $test = $(tplTest).appendTo('#tests'); const $test = jq(tplTest).appendTo('#tests');
$test.find('.label').text(label); $test.find('.label').text(label);
$test.find('.result') $test.find('.result')
.addClass(passed ? 'passed' : 'failed') .addClass(passed ? 'passed' : 'failed')
@ -45,7 +50,7 @@ modulejs.define('main/info', ['$', 'config', 'core/resource', 'core/server'], fu
return; return;
} }
$(tplTests).appendTo('#content'); jq(tplTests).appendTo('#content');
addTest( addTest(
'h5ai version', 'Only green if this is an official h5ai release', 'h5ai version', 'Only green if this is an official h5ai release',
@ -124,20 +129,20 @@ modulejs.define('main/info', ['$', 'config', 'core/resource', 'core/server'], fu
} }
function reload() { function reload() {
window.location.reload(); win.location.reload();
} }
function onLogin() { function onLogin() {
server.request({ server.request({
action: 'login', action: 'login',
pass: $('#pass').val() pass: jq('#pass').val()
}, reload); }).then(reload);
} }
function onLogout() { function onLogout() {
server.request({ server.request({
action: 'logout' action: 'logout'
}, reload); }).then(reload);
} }
function onKeydown(event) { function onKeydown(event) {
@ -147,23 +152,23 @@ modulejs.define('main/info', ['$', 'config', 'core/resource', 'core/server'], fu
} }
function addSupport() { function addSupport() {
$(tplSupport).appendTo('#content'); jq(tplSupport).appendTo('#content');
} }
function addLogin() { function addLogin() {
$(tplLogin).appendTo('#content'); jq(tplLogin).appendTo('#content');
if (setup.AS_ADMIN) { if (setup.AS_ADMIN) {
$('#pass').remove(); jq('#pass').remove();
$('#login').remove(); jq('#login').remove();
$('#logout').on('click', onLogout); jq('#logout').on('click', onLogout);
} else { } else {
$('#pass').on('keydown', onKeydown).focus(); jq('#pass').on('keydown', onKeydown).focus();
$('#login').on('click', onLogin); jq('#login').on('click', onLogin);
$('#logout').remove(); jq('#logout').remove();
} }
if (config.options.hasCustomPasshash) { if (config.options.hasCustomPasshash) {
$('#hint').remove(); jq('#hint').remove();
} }
} }
@ -175,4 +180,3 @@ modulejs.define('main/info', ['$', 'config', 'core/resource', 'core/server'], fu
init(); init();
});

View file

@ -1,7 +1,13 @@
modulejs.define('model/item', ['_', 'core/event', 'core/location', 'core/server', 'core/settings', 'core/types'], function (_, event, location, server, settings, types) { const {_: lo} = require('../win');
var reEndsWithSlash = /\/$/; const location = require('../core/location');
var reSplitPath = /^(.*\/)([^\/]+\/?)$/; const server = require('../core/server');
var cache = {}; const settings = require('../core/settings');
const types = require('../core/types');
const reEndsWithSlash = /\/$/;
const reSplitPath = /^(.*\/)([^\/]+\/?)$/;
const cache = {};
function startsWith(sequence, part) { function startsWith(sequence, part) {
@ -28,9 +34,9 @@ modulejs.define('model/item', ['_', 'core/event', 'core/location', 'core/server'
}; };
} }
var match = reSplitPath.exec(sequence); const match = reSplitPath.exec(sequence);
if (match) { if (match) {
var split = { const split = {
parent: match[1], parent: match[1],
name: match[2] name: match[2]
}; };
@ -43,24 +49,24 @@ modulejs.define('model/item', ['_', 'core/event', 'core/location', 'core/server'
} }
function getItem(options) { function getItem(options) {
if (_.isString(options)) { if (lo.isString(options)) {
options = {href: options}; options = {href: options};
} else if (!options || !_.isString(options.href)) { } else if (!options || !lo.isString(options.href)) {
return null; return null;
} }
var href = location.forceEncoding(options.href); const href = location.forceEncoding(options.href);
if (!startsWith(href, settings.rootHref)) { if (!startsWith(href, settings.rootHref)) {
return null; return null;
} }
var item = cache[href] || new Item(href); // eslint-disable-line no-use-before-define const item = cache[href] || new Item(href); // eslint-disable-line no-use-before-define
if (_.isNumber(options.time)) { if (lo.isNumber(options.time)) {
item.time = options.time; item.time = options.time;
} }
if (_.isNumber(options.size)) { if (lo.isNumber(options.size)) {
item.size = options.size; item.size = options.size;
} }
if (options.managed) { if (options.managed) {
@ -76,32 +82,32 @@ modulejs.define('model/item', ['_', 'core/event', 'core/location', 'core/server'
function removeItem(absHref) { function removeItem(absHref) {
absHref = location.forceEncoding(absHref); absHref = location.forceEncoding(absHref);
var item = cache[absHref]; const item = cache[absHref];
if (item) { if (item) {
delete cache[absHref]; delete cache[absHref];
if (item.parent) { if (item.parent) {
delete item.parent.content[item.absHref]; delete item.parent.content[item.absHref];
} }
_.each(item.content, function (child) { lo.each(item.content, child => {
removeItem(child.absHref); removeItem(child.absHref);
}); });
} }
} }
function fetchContent(absHref, callback) { function fetchContent(absHref, callback) {
var item = getItem(absHref); const item = getItem(absHref);
if (!_.isFunction(callback)) { if (!lo.isFunction(callback)) {
callback = function () {}; callback = () => undefined;
} }
if (item.isContentFetched) { if (item.isContentFetched) {
callback(item); callback(item);
} else { } else {
server.request({action: 'get', items: {href: item.absHref, what: 1}}, function (response) { server.request({action: 'get', items: {href: item.absHref, what: 1}}).then(response => {
if (response.items) { if (response.items) {
_.each(response.items, function (jsonItem) { lo.each(response.items, jsonItem => {
getItem(jsonItem); getItem(jsonItem);
}); });
} }
@ -113,7 +119,7 @@ modulejs.define('model/item', ['_', 'core/event', 'core/location', 'core/server'
function Item(absHref) { function Item(absHref) {
var split = splitPath(absHref); const split = splitPath(absHref);
cache[absHref] = this; cache[absHref] = this;
@ -129,50 +135,49 @@ modulejs.define('model/item', ['_', 'core/event', 'core/location', 'core/server'
if (split.parent) { if (split.parent) {
this.parent = getItem(split.parent); this.parent = getItem(split.parent);
this.parent.content[this.absHref] = this; this.parent.content[this.absHref] = this;
if (_.keys(this.parent.content).length > 1) { if (lo.keys(this.parent.content).length > 1) {
this.parent.isContentFetched = true; this.parent.isContentFetched = true;
} }
} }
} }
_.extend(Item.prototype, { lo.extend(Item.prototype, {
isFolder() {
isFolder: function () {
return reEndsWithSlash.test(this.absHref); return reEndsWithSlash.test(this.absHref);
}, },
isCurrentFolder: function () { isCurrentFolder() {
return this.absHref === location.getAbsHref(); return this.absHref === location.getAbsHref();
}, },
isInCurrentFolder: function () { isInCurrentFolder() {
return Boolean(this.parent) && this.parent.isCurrentFolder(); return Boolean(this.parent) && this.parent.isCurrentFolder();
}, },
isCurrentParentFolder: function () { isCurrentParentFolder() {
var item = getItem(location.getAbsHref()); const item = getItem(location.getAbsHref());
return Boolean(item) && this === item.parent; return Boolean(item) && this === item.parent;
}, },
isDomain: function () { isDomain() {
return this.absHref === '/'; return this.absHref === '/';
}, },
isRoot: function () { isRoot() {
return this.absHref === settings.rootHref; return this.absHref === settings.rootHref;
}, },
isEmpty: function () { isEmpty() {
return _.keys(this.content).length === 0; return lo.keys(this.content).length === 0;
}, },
fetchContent: function (callback) { fetchContent(callback) {
return fetchContent(this.absHref, callback); return fetchContent(this.absHref, callback);
}, },
getCrumb: function () { getCrumb() {
var item = this; // eslint-disable-line consistent-this let item = this; // eslint-disable-line consistent-this
var crumb = [item]; const crumb = [item];
while (item.parent) { while (item.parent) {
item = item.parent; item = item.parent;
@ -182,19 +187,19 @@ modulejs.define('model/item', ['_', 'core/event', 'core/location', 'core/server'
return crumb; return crumb;
}, },
getSubfolders: function () { getSubfolders() {
return _.sortBy(_.filter(this.content, function (item) { return lo.sortBy(lo.filter(this.content, item => {
return item.isFolder(); return item.isFolder();
}), function (item) { }), item => {
return item.label.toLowerCase(); return item.label.toLowerCase();
}); });
}, },
getStats: function () { getStats() {
var folders = 0; let folders = 0;
var files = 0; let files = 0;
_.each(this.content, function (item) { lo.each(this.content, item => {
if (item.isFolder()) { if (item.isFolder()) {
folders += 1; folders += 1;
} else { } else {
@ -202,8 +207,8 @@ modulejs.define('model/item', ['_', 'core/event', 'core/location', 'core/server'
} }
}); });
var depth = 0; let depth = 0;
var item = this; // eslint-disable-line consistent-this let item = this; // eslint-disable-line consistent-this
while (item.parent) { while (item.parent) {
depth += 1; depth += 1;
@ -211,16 +216,15 @@ modulejs.define('model/item', ['_', 'core/event', 'core/location', 'core/server'
} }
return { return {
folders: folders, folders,
files: files, files,
depth: depth depth
}; };
} }
}); });
return { module.exports = {
get: getItem, get: getItem,
remove: removeItem remove: removeItem
}; };
});

View file

@ -1,7 +1,8 @@
modulejs.define('view/content', ['$', 'view/mainrow'], function ($, mainrow) { const {jQuery: jq} = require('../win');
var $el = $('<div id="content"/>').appendTo(mainrow.$el); const mainrow = require('./mainrow');
return { const $el = jq('<div id="content"/>').appendTo(mainrow.$el);
$el: $el
module.exports = {
$el
}; };
});

View file

@ -1,7 +1,8 @@
modulejs.define('view/mainrow', ['$', 'view/root'], function ($, root) { const {jQuery: jq} = require('../win');
var $el = $('<div id="mainrow"/>').appendTo(root.$el); const root = require('./root');
return { const $el = jq('<div id="mainrow"/>').appendTo(root.$el);
$el: $el
module.exports = {
$el
}; };
});

View file

@ -1,5 +1,7 @@
modulejs.define('view/notification', ['$', 'view/root'], function ($, root) { const {jQuery: jq} = require('../win');
var $el = $('<div id="notification"/>').hide().appendTo(root.$el); const root = require('./root');
const $el = jq('<div id="notification"/>').hide().appendTo(root.$el);
function set(content) { function set(content) {
if (content) { if (content) {
@ -9,8 +11,7 @@ modulejs.define('view/notification', ['$', 'view/root'], function ($, root) {
} }
} }
return { module.exports = {
$el: $el, $el,
set: set set
}; };
});

View file

@ -1,9 +1,9 @@
modulejs.define('view/root', ['$'], function ($) { const {jQuery: jq} = require('../win');
var $el = $('body').attr('id', 'root');
$('#fallback, #fallback-hints').remove(); const $el = jq('body').attr('id', 'root');
return { jq('#fallback, #fallback-hints').remove();
$el: $el
module.exports = {
$el
}; };
});

View file

@ -1,17 +1,23 @@
modulejs.define('view/sidebar', ['$', 'core/resource', 'core/store', 'view/mainrow', 'view/topbar'], function ($, resource, store, mainrow, topbar) { const {jQuery: jq} = require('../win');
var storekey = 'sidebarIsVisible'; const resource = require('../core/resource');
var tplSidebar = '<div id="sidebar"/>'; const store = require('../core/store');
var tplToggle = const mainrow = require('./mainrow');
'<div id="sidebar-toggle" class="tool">' + const topbar = require('./topbar');
'<img alt="sidebar"/>' +
'</div>';
var $sidebar = $(tplSidebar); const storekey = 'sidebarIsVisible';
var $toggle = $(tplToggle); const tplSidebar = '<div id="sidebar"/>';
var $img = $toggle.find('img'); const tplToggle =
`<div id="sidebar-toggle" class="tool">
<img alt="sidebar"/>
</div>`;
const $sidebar = jq(tplSidebar);
const $toggle = jq(tplToggle);
const $img = $toggle.find('img');
function update(toggle) { function update(toggle) {
var isVisible = store.get(storekey); let isVisible = store.get(storekey);
if (toggle) { if (toggle) {
isVisible = !isVisible; isVisible = !isVisible;
@ -31,10 +37,9 @@ modulejs.define('view/sidebar', ['$', 'core/resource', 'core/store', 'view/mainr
$sidebar.appendTo(mainrow.$el); $sidebar.appendTo(mainrow.$el);
$toggle.appendTo(topbar.$toolbar).on('click', function () { update(true); }); $toggle.appendTo(topbar.$toolbar).on('click', () => update(true));
update(false); update();
return { module.exports = {
$el: $sidebar $el: $sidebar
}; };
});

View file

@ -1,18 +1,19 @@
modulejs.define('view/topbar', ['$', 'view/root'], function ($, root) { const {jQuery: jq} = require('../win');
var tplTopbar = const root = require('./root');
'<div id="topbar">' +
'<div id="toolbar"/>' +
'<div id="flowbar"/>' +
'<a id="backlink" href="https://larsjung.de/h5ai/" title="powered by h5ai - https://larsjung.de/h5ai/">' +
'<div>powered</div>' +
'<div>by h5ai</div>' +
'</a>' +
'</div>';
var $el = $(tplTopbar).appendTo(root.$el);
return { const tplTopbar =
$el: $el, `<div id="topbar">
<div id="toolbar"/>
<div id="flowbar"/>
<a id="backlink" href="https://larsjung.de/h5ai/" title="powered by h5ai - https://larsjung.de/h5ai/">
<div>powered</div>
<div>by h5ai</div>
</a>
</div>`;
const $el = jq(tplTopbar).appendTo(root.$el);
module.exports = {
$el,
$toolbar: $el.find('#toolbar'), $toolbar: $el.find('#toolbar'),
$flowbar: $el.find('#flowbar') $flowbar: $el.find('#flowbar')
}; };
});

View file

@ -1,42 +1,50 @@
modulejs.define('view/view', ['_', '$', 'core/event', 'core/format', 'core/location', 'core/resource', 'core/settings', 'core/store', 'view/content'], function (_, $, event, format, location, resource, allsettings, store, content) { const {jQuery: jq, _: lo} = require('../win');
var modes = ['details', 'grid', 'icons']; const event = require('../core/event');
var sizes = [20, 40, 60, 80, 100, 150, 200, 250, 300, 350, 400]; const format = require('../core/format');
var settings = _.extend({ const location = require('../core/location');
const resource = require('../core/resource');
const store = require('../core/store');
const allsettings = require('../core/settings');
const content = require('./content');
const modes = ['details', 'grid', 'icons'];
const sizes = [20, 40, 60, 80, 100, 150, 200, 250, 300, 350, 400];
const settings = lo.extend({
binaryPrefix: false, binaryPrefix: false,
hideFolders: false, hideFolders: false,
hideParentFolder: false, hideParentFolder: false,
modes: modes, modes,
setParentFolderLabels: false, setParentFolderLabels: false,
sizes: sizes sizes
}, allsettings.view); }, allsettings.view);
var sortedSizes = settings.sizes.sort(function (a, b) { return a - b; }); const sortedSizes = settings.sizes.sort((a, b) => a - b);
var checkedModes = _.intersection(settings.modes, modes); const checkedModes = lo.intersection(settings.modes, modes);
var storekey = 'view'; const storekey = 'view';
var tplView = const tplView =
'<div id="view">' + `<div id="view">
'<ul id="items" class="clearfix">' + <ul id="items" class="clearfix">
'<li class="header">' + <li class="header">
'<a class="icon"/>' + <a class="icon"/>
'<a class="label" href="#"><span class="l10n-name"/></a>' + <a class="label" href="#"><span class="l10n-name"/></a>
'<a class="date" href="#"><span class="l10n-lastModified"/></a>' + <a class="date" href="#"><span class="l10n-lastModified"/></a>
'<a class="size" href="#"><span class="l10n-size"/></a>' + <a class="size" href="#"><span class="l10n-size"/></a>
'</li>' + </li>
'</ul>' + </ul>
'<div id="view-hint"/>' + <div id="view-hint"/>
'</div>'; </div>`;
var tplItem = const tplItem =
'<li class="item">' + `<li class="item">
'<a>' + <a>
'<span class="icon square"><img/></span>' + <span class="icon square"><img/></span>
'<span class="icon landscape"><img/></span>' + <span class="icon landscape"><img/></span>
'<span class="label"/>' + <span class="label"/>
'<span class="date"/>' + <span class="date"/>
'<span class="size"/>' + <span class="size"/>
'</a>' + </a>
'</li>'; </li>`;
var $view = $(tplView); const $view = jq(tplView);
var $items = $view.find('#items'); const $items = $view.find('#items');
var $hint = $view.find('#view-hint'); const $hint = $view.find('#view-hint');
function cropSize(size, min, max) { function cropSize(size, min, max) {
@ -44,47 +52,47 @@ modulejs.define('view/view', ['_', '$', 'core/event', 'core/format', 'core/locat
} }
function createStyles(size) { function createStyles(size) {
var dsize = cropSize(size, 20, 80); const dsize = cropSize(size, 20, 80);
var gsize = cropSize(size, 40, 160); const gsize = cropSize(size, 40, 160);
var isize = cropSize(size, 80, 1000); const isize = cropSize(size, 80, 1000);
var ilsize = Math.round(isize * 4 / 3); const ilsize = Math.round(isize * 4 / 3);
var rules = [ const rules = [
'#view.view-details.view-size-' + size + ' .item .label { line-height: ' + (dsize + 14) + 'px !important; }', `#view.view-details.view-size-${size} .item .label {line-height: ${dsize + 14}px !important;}`,
'#view.view-details.view-size-' + size + ' .item .date { line-height: ' + (dsize + 14) + 'px !important; }', `#view.view-details.view-size-${size} .item .date {line-height: ${dsize + 14}px !important;}`,
'#view.view-details.view-size-' + size + ' .item .size { line-height: ' + (dsize + 14) + 'px !important; }', `#view.view-details.view-size-${size} .item .size {line-height: ${dsize + 14}px !important;}`,
'#view.view-details.view-size-' + size + ' .square { width: ' + dsize + 'px !important; height: ' + dsize + 'px !important; }', `#view.view-details.view-size-${size} .square {width: ${dsize}px !important; height: ${dsize}px !important;}`,
'#view.view-details.view-size-' + size + ' .square img { width: ' + dsize + 'px !important; height: ' + dsize + 'px !important; }', `#view.view-details.view-size-${size} .square img {width: ${dsize}px !important; height: ${dsize}px !important;}`,
'#view.view-details.view-size-' + size + ' .label { margin-left: ' + (dsize + 32) + 'px !important; }', `#view.view-details.view-size-${size} .label {margin-left: ${dsize + 32}px !important;}`,
'#view.view-grid.view-size-' + size + ' .item .label { line-height: ' + gsize + 'px !important; }', `#view.view-grid.view-size-${size} .item .label {line-height: ${gsize}px !important;}`,
'#view.view-grid.view-size-' + size + ' .square { width: ' + gsize + 'px !important; height: ' + gsize + 'px !important; }', `#view.view-grid.view-size-${size} .square {width: ${gsize}px !important; height: ${gsize}px !important;}`,
'#view.view-grid.view-size-' + size + ' .square img { width: ' + gsize + 'px !important; height: ' + gsize + 'px !important; }', `#view.view-grid.view-size-${size} .square img {width: ${gsize}px !important; height: ${gsize}px !important;}`,
'#view.view-icons.view-size-' + size + ' .item { width: ' + ilsize + 'px !important; }', `#view.view-icons.view-size-${size} .item {width: ${ilsize}px !important;}`,
'#view.view-icons.view-size-' + size + ' .landscape { width: ' + ilsize + 'px !important; height: ' + isize + 'px !important; }', `#view.view-icons.view-size-${size} .landscape {width: ${ilsize}px !important; height: ${isize}px !important;}`,
'#view.view-icons.view-size-' + size + ' .landscape img { width: ' + isize + 'px !important; height: ' + isize + 'px !important; }', `#view.view-icons.view-size-${size} .landscape img {width: ${isize}px !important; height: ${isize}px !important;}`,
'#view.view-icons.view-size-' + size + ' .landscape .thumb { width: ' + ilsize + 'px !important; }' `#view.view-icons.view-size-${size} .landscape .thumb {width: ${ilsize}px !important;}`
]; ];
return rules.join('\n'); return rules.join('\n');
} }
function addCssStyles() { function addCssStyles() {
var styles = _.map(sortedSizes, function (size) { return createStyles(size); }); const styles = lo.map(sortedSizes, size => createStyles(size));
styles.push('#view .icon img { max-width: ' + settings.maxIconSize + 'px; max-height: ' + settings.maxIconSize + 'px; }'); styles.push(`#view .icon img {max-width: ${settings.maxIconSize}px; max-height: ${settings.maxIconSize}px;}`);
$('<style/>').text(styles.join('\n')).appendTo('head'); jq('<style/>').text(styles.join('\n')).appendTo('head');
} }
function set(mode, size) { function set(mode, size) {
var stored = store.get(storekey); const stored = store.get(storekey);
mode = mode || stored && stored.mode; mode = mode || stored && stored.mode;
size = size || stored && stored.size; size = size || stored && stored.size;
mode = _.includes(settings.modes, mode) ? mode : settings.modes[0]; mode = lo.includes(settings.modes, mode) ? mode : settings.modes[0];
size = _.includes(settings.sizes, size) ? size : settings.sizes[0]; size = lo.includes(settings.sizes, size) ? size : settings.sizes[0];
store.put(storekey, {mode: mode, size: size}); store.put(storekey, {mode, size});
_.each(checkedModes, function (m) { lo.each(checkedModes, m => {
if (m === mode) { if (m === mode) {
$view.addClass('view-' + m); $view.addClass('view-' + m);
} else { } else {
@ -92,7 +100,7 @@ modulejs.define('view/view', ['_', '$', 'core/event', 'core/format', 'core/locat
} }
}); });
_.each(sortedSizes, function (s) { lo.each(sortedSizes, s => {
if (s === size) { if (s === size) {
$view.addClass('view-size-' + s); $view.addClass('view-size-' + s);
} else { } else {
@ -128,12 +136,12 @@ modulejs.define('view/view', ['_', '$', 'core/event', 'core/format', 'core/locat
} }
function createHtml(item) { function createHtml(item) {
var $html = $(tplItem); const $html = jq(tplItem);
var $a = $html.find('a'); const $a = $html.find('a');
var $iconImg = $html.find('.icon img'); const $iconImg = $html.find('.icon img');
var $label = $html.find('.label'); const $label = $html.find('.label');
var $date = $html.find('.date'); const $date = $html.find('.date');
var $size = $html.find('.size'); const $size = $html.find('.size');
$html $html
.addClass(item.isFolder() ? 'folder' : 'file') .addClass(item.isFolder() ? 'folder' : 'file')
@ -165,18 +173,18 @@ modulejs.define('view/view', ['_', '$', 'core/event', 'core/format', 'core/locat
return $html; return $html;
} }
function onMouseenter() { function onMouseenter(ev) {
var item = $(this).closest('.item').data('item'); const item = jq(ev.currentTarget).closest('.item').data('item');
event.pub('item.mouseenter', item); event.pub('item.mouseenter', item);
} }
function onMouseleave() { function onMouseleave(ev) {
var item = $(this).closest('.item').data('item'); const item = jq(ev.currentTarget).closest('.item').data('item');
event.pub('item.mouseleave', item); event.pub('item.mouseleave', item);
} }
function checkHint() { function checkHint() {
var hasNoItems = $items.find('.item').not('.folder-parent').length === 0; const hasNoItems = $items.find('.item').not('.folder-parent').length === 0;
if (hasNoItems) { if (hasNoItems) {
$hint.show(); $hint.show();
@ -186,13 +194,13 @@ modulejs.define('view/view', ['_', '$', 'core/event', 'core/format', 'core/locat
} }
function setItems(items) { function setItems(items) {
var removed = _.map($items.find('.item'), function (item) { const removed = lo.map($items.find('.item'), item => {
return $(item).data('item'); return jq(item).data('item');
}); });
$items.find('.item').remove(); $items.find('.item').remove();
_.each(items, function (e) { lo.each(items, e => {
$items.append(createHtml(e)); $items.append(createHtml(e));
}); });
@ -202,12 +210,12 @@ modulejs.define('view/view', ['_', '$', 'core/event', 'core/format', 'core/locat
} }
function changeItems(add, remove) { function changeItems(add, remove) {
_.each(add, function (item) { lo.each(add, item => {
createHtml(item).hide().appendTo($items).fadeIn(400); createHtml(item).hide().appendTo($items).fadeIn(400);
}); });
_.each(remove, function (item) { lo.each(remove, item => {
item.$view.fadeOut(400, function () { item.$view.fadeOut(400, () => {
item.$view.remove(); item.$view.remove();
}); });
}); });
@ -226,13 +234,13 @@ modulejs.define('view/view', ['_', '$', 'core/event', 'core/format', 'core/locat
item = location.getItem(); item = location.getItem();
} }
var items = []; const items = [];
if (item.parent && !settings.hideParentFolder) { if (item.parent && !settings.hideParentFolder) {
items.push(item.parent); items.push(item.parent);
} }
_.each(item.content, function (child) { lo.each(item.content, child => {
if (!(child.isFolder() && settings.hideFolders)) { if (!(child.isFolder() && settings.hideFolders)) {
items.push(child); items.push(child);
} }
@ -243,9 +251,9 @@ modulejs.define('view/view', ['_', '$', 'core/event', 'core/format', 'core/locat
} }
function onLocationRefreshed(item, added, removed) { function onLocationRefreshed(item, added, removed) {
var add = []; const add = [];
_.each(added, function (child) { lo.each(added, child => {
if (!(child.isFolder() && settings.hideFolders)) { if (!(child.isFolder() && settings.hideFolders)) {
add.push(child); add.push(child);
} }
@ -275,18 +283,17 @@ modulejs.define('view/view', ['_', '$', 'core/event', 'core/format', 'core/locat
init(); init();
return { module.exports = {
$el: $view, $el: $view,
$items: $items, $items,
setItems: setItems, setItems,
changeItems: changeItems, changeItems,
setLocation: onLocationChanged, setLocation: onLocationChanged,
setHint: setHint, setHint,
getModes: getModes, getModes,
getMode: getMode, getMode,
setMode: setMode, setMode,
getSizes: getSizes, getSizes,
getSize: getSize, getSize,
setSize: setSize setSize
}; };
});

View file

@ -1,32 +1,40 @@
modulejs.define('view/viewmode', ['_', '$', 'core/event', 'core/resource', 'core/settings', 'view/sidebar', 'view/topbar', 'view/view'], function (_, $, event, resource, allsettings, sidebar, topbar, view) { const {jQuery: jq, _: lo} = require('../win');
var settings = _.extend({ const event = require('../core/event');
const resource = require('../core/resource');
const allsettings = require('../core/settings');
const sidebar = require('./sidebar');
const topbar = require('./topbar');
const view = require('./view');
const settings = lo.extend({
modeToggle: false modeToggle: false
}, allsettings.view); }, allsettings.view);
var tplSettings = const tplSettings =
'<div id="viewmode-settings" class="block"><h1 class="l10n-view">View</h1></div>'; '<div id="viewmode-settings" class="block"><h1 class="l10n-view">View</h1></div>';
var tplMode = const tplMode =
'<div id="viewmode-[MODE]" class="button mode">' + `<div id="viewmode-[MODE]" class="button mode">
'<img src="' + resource.image('view-[MODE]') + '" alt="viewmode-[MODE]"/>' + <img src="${resource.image('view-[MODE]')}" alt="viewmode-[MODE]"/>
'</div>'; </div>`;
var tplSize = const tplSize =
'<input id="viewmode-size" type="range" min="0" max="0" value="0">'; '<input id="viewmode-size" type="range" min="0" max="0" value="0">';
var tplToggle = const tplToggle =
'<div id="viewmode-toggle" class="tool">' + `<div id="viewmode-toggle" class="tool">
'<img alt="viewmode"/>' + <img alt="viewmode"/>
'</div>'; </div>`;
var modes; let modes;
var sizes; let sizes;
function onChanged(mode, size) { function onChanged(mode, size) {
$('#viewmode-settings .mode').removeClass('active'); jq('#viewmode-settings .mode').removeClass('active');
$('#viewmode-' + mode).addClass('active'); jq('#viewmode-' + mode).addClass('active');
$('#viewmode-size').val(_.indexOf(sizes, size)); jq('#viewmode-size').val(lo.indexOf(sizes, size));
if (settings.modeToggle === 'next') { if (settings.modeToggle === 'next') {
mode = modes[(modes.indexOf(mode) + 1) % modes.length]; mode = modes[(modes.indexOf(mode) + 1) % modes.length];
} }
$('#viewmode-toggle img').attr('src', resource.image('view-' + mode)); jq('#viewmode-toggle img').attr('src', resource.image('view-' + mode));
} }
function addSettings() { function addSettings() {
@ -34,12 +42,12 @@ modulejs.define('view/viewmode', ['_', '$', 'core/event', 'core/resource', 'core
return; return;
} }
var $viewBlock = $(tplSettings); const $viewBlock = jq(tplSettings);
if (modes.length > 1) { if (modes.length > 1) {
_.each(modes, function (mode) { lo.each(modes, mode => {
$(tplMode.replace(/\[MODE\]/g, mode)) jq(tplMode.replace(/\[MODE\]/g, mode))
.on('click', function () { .on('click', () => {
view.setMode(mode); view.setMode(mode);
}) })
.appendTo($viewBlock); .appendTo($viewBlock);
@ -47,10 +55,10 @@ modulejs.define('view/viewmode', ['_', '$', 'core/event', 'core/resource', 'core
} }
if (sizes.length > 1) { if (sizes.length > 1) {
var max = sizes.length - 1; const max = sizes.length - 1;
$(tplSize) jq(tplSize)
.prop('max', max).attr('max', max) .prop('max', max).attr('max', max)
.on('input change', function (ev) { .on('input change', ev => {
view.setSize(sizes[ev.target.valueAsNumber]); view.setSize(sizes[ev.target.valueAsNumber]);
}) })
.appendTo($viewBlock); .appendTo($viewBlock);
@ -60,16 +68,16 @@ modulejs.define('view/viewmode', ['_', '$', 'core/event', 'core/resource', 'core
} }
function onToggle() { function onToggle() {
var mode = view.getMode(); const mode = view.getMode();
var nextIdx = (modes.indexOf(mode) + 1) % modes.length; const nextIdx = (modes.indexOf(mode) + 1) % modes.length;
var nextMode = modes[nextIdx]; const nextMode = modes[nextIdx];
view.setMode(nextMode); view.setMode(nextMode);
} }
function addToggle() { function addToggle() {
if (settings.modeToggle && modes.length > 1) { if (settings.modeToggle && modes.length > 1) {
$(tplToggle) jq(tplToggle)
.on('click', onToggle) .on('click', onToggle)
.appendTo(topbar.$toolbar); .appendTo(topbar.$toolbar);
} }
@ -88,4 +96,3 @@ modulejs.define('view/viewmode', ['_', '$', 'core/event', 'core/resource', 'core
init(); init();
});

View file

@ -0,0 +1,23 @@
const win = window; // eslint-disable-line no-undef
if (typeof win !== 'object' || win.window !== win || !win.document) {
throw new Error('no-window');
}
const noBrowser = 'no-browser';
const doc = win.document;
const docEl = doc.documentElement;
docEl.className = '';
function assert(expr, hint) {
if (!expr) {
docEl.className = noBrowser;
throw new Error(`${noBrowser}: ${hint}`);
}
}
assert(!doc.getElementById(noBrowser), 'ie<10');
assert(typeof Object.assign === 'function', 'assign');
assert(typeof Promise === 'function', 'promise');
module.exports = win;

View file

@ -1,30 +1 @@
(function () { require('./lib/init');
var doc = document;
var el = doc.documentElement;
var id = 'no-browser';
el.className = '';
if (doc.getElementById(id)) {
el.className = id;
throw id;
}
}());
// @include 'vendor/jquery-*.js'
// @include 'vendor/lodash-*.js'
// @include 'vendor/marked-*.js'
// @include 'vendor/modulejs-*.js'
// @include 'vendor/prism-*.js'
(function () {
'use strict'; // eslint-disable-line strict
var win = window;
modulejs.define('_', function () { return win._; });
modulejs.define('$', function () { return win.jQuery; });
modulejs.define('marked', function () { return win.marked; });
modulejs.define('prism', function () { return win.Prism; });
// @include 'lib/**/*.js'
modulejs.require('boot');
}());

View file

@ -1,2 +0,0 @@
/*! modulejs v1.14.0 - https://larsjung.de/modulejs/ */
!function(n,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define([],r):"object"==typeof exports?exports.modulejs=r():n.modulejs=r()}(this,function(){return function(n){function r(t){if(e[t])return e[t].exports;var i=e[t]={exports:{},id:t,loaded:!1};return n[t].call(i.exports,i,i.exports,r),i.loaded=!0,i.exports}var e={};return r.m=n,r.c=e,r.p="",r(0)}([function(n,r){"use strict";var e=Object.prototype,t=function(n){return function(r){return e.toString.call(r)==="[object "+n+"]"}},i=t("Array"),o=t("Function"),u=t("String"),s=function(n,r){return void 0!==n&&null!==n&&e.hasOwnProperty.call(n,r)},f=function(n,r){if(n&&n.length)for(var e=0,t=n.length;t>e;e+=1)r(n[e],e,n);else for(var i in n)s(n,i)&&r(n[i],i,n)},c=function(n,r){if(n&&n.length)for(var e=0,t=n.length;t>e;e+=1)if(n[e]===r)return!0;return!1},a=function(n){var r=[];return f(n,function(n){c(r,n)||r.push(n)}),r},d=function(n,r){if(!n)throw new Error("[modulejs] "+r)},p=function l(){var n={},r={},e=function y(e,t,i){d(u(e),"id must be string: "+e);var o=t===!0,p=(o?void 0:t)||r;if(!o&&s(p,e))return p[e];var l=n[e];d(l,"id not defined: "+e),i=(i||[]).slice(),i.push(e);var v=[];if(f(l.deps,function(n){d(!c(i,n),"circular dependencies: "+n+" in "+i),o?(v=v.concat(y(n,t,i)),v.push(n)):v.push(y(n,t,i))}),o)return a(v);var h=l.fn.apply(void 0,v);return p[e]=h,h},t=function(r,e,t){if(void 0===t){var f=[[],e];e=f[0],t=f[1]}d(u(r),"id must be string: "+r),d(!s(n,r),"id already defined: "+r),d(i(e),"deps must be array: "+r),n[r]={id:r,deps:e,fn:o(t)?t:function(){return t}}},p=function(n,r){return e(n,r)},v=function(){var t={};return f(n,function(n,i){t[i]={deps:n.deps.slice(),reqs:e(i,!0),init:s(r,i)}}),f(n,function(r,e){var i=[];f(n,function(n,r){c(t[r].reqs,e)&&i.push(r)}),t[e].reqd=i}),t},h=function(n){var r="\n";return f(v(),function(e,t){var i=n?e.reqd:e.reqs;r+=(e.init?"* ":" ")+t+" -> [ "+i.join(", ")+" ]\n"}),r};return{create:l,define:t,log:h,require:p,state:v,_private:{assert:d,contains:c,definitions:n,each:f,has:s,instances:r,isArray:i,isFunction:o,isString:u,resolve:e,uniq:a}}};n.exports=p()}])});