Merge branch 'staging' of github.com:xwiki-labs/cryptpad into staging

pull/1/head
ansuz 8 years ago
commit 8c49150725

@ -107,6 +107,7 @@ define(function () {
out.printDate = "Afficher la date"; out.printDate = "Afficher la date";
out.printTitle = "Afficher le titre du pad"; out.printTitle = "Afficher le titre du pad";
out.printCSS = "Personnaliser l'apparence (CSS):"; out.printCSS = "Personnaliser l'apparence (CSS):";
out.printTransition = "Activer les animations de transition";
out.slideOptionsTitle = "Personnaliser la présentation"; out.slideOptionsTitle = "Personnaliser la présentation";
out.slideOptionsButton = "Enregistrer (Entrée)"; out.slideOptionsButton = "Enregistrer (Entrée)";

@ -109,6 +109,7 @@ define(function () {
out.printDate = "Display the date"; out.printDate = "Display the date";
out.printTitle = "Display the pad title"; out.printTitle = "Display the pad title";
out.printCSS = "Custom style rules (CSS):"; out.printCSS = "Custom style rules (CSS):";
out.printTransition = "Enable transition animations";
out.slideOptionsTitle = "Customize your slides"; out.slideOptionsTitle = "Customize your slides";
out.slideOptionsButton = "Save (enter)"; out.slideOptionsButton = "Save (enter)";

@ -3,11 +3,12 @@
"description": "realtime collaborative visual editor with zero knowlege server", "description": "realtime collaborative visual editor with zero knowlege server",
"version": "1.6.0", "version": "1.6.0",
"dependencies": { "dependencies": {
"chainpad-server": "^1.0.1",
"express": "~4.10.1", "express": "~4.10.1",
"ws": "^1.0.1",
"nthen": "~0.1.0", "nthen": "~0.1.0",
"saferphore": "0.0.1",
"tweetnacl": "~0.12.2", "tweetnacl": "~0.12.2",
"chainpad-server": "^1.0.1" "ws": "^1.0.1"
}, },
"devDependencies": { "devDependencies": {
"jshint": "~2.9.1", "jshint": "~2.9.1",

@ -0,0 +1,101 @@
/* jshint esversion: 6 */
const Fs = require('fs');
const Semaphore = require('saferphore');
const nThen = require('nthen');
const hashesFromPinFile = (pinFile, fileName) => {
var pins = {};
pinFile.split('\n').filter((x)=>(x)).map((l) => JSON.parse(l)).forEach((l) => {
switch (l[0]) {
case 'RESET': {
pins = {};
//jshint -W086
// fallthrough
}
case 'PIN': {
l[1].forEach((x) => { pins[x] = 1; });
break;
}
case 'UNPIN': {
l[1].forEach((x) => { delete pins[x]; });
break;
}
default: throw new Error(JSON.stringify(l) + ' ' + fileName);
}
});
return Object.keys(pins);
};
const sizeForHashes = (hashes, dsFileSizes) => {
let sum = 0;
hashes.forEach((h) => {
const s = dsFileSizes[h];
if (typeof(s) !== 'number') {
//console.log('missing ' + h + ' ' + typeof(s));
} else {
sum += s;
}
});
return sum;
};
const sema = Semaphore.create(20);
let dirList;
const fileList = [];
const dsFileSizes = {};
const out = [];
nThen((waitFor) => {
Fs.readdir('./datastore', waitFor((err, list) => {
if (err) { throw err; }
dirList = list;
}));
}).nThen((waitFor) => {
dirList.forEach((f) => {
sema.take((returnAfter) => {
Fs.readdir('./datastore/' + f, waitFor(returnAfter((err, list2) => {
if (err) { throw err; }
list2.forEach((ff) => { fileList.push('./datastore/' + f + '/' + ff); });
})));
});
});
}).nThen((waitFor) => {
fileList.forEach((f) => {
sema.take((returnAfter) => {
Fs.stat(f, waitFor(returnAfter((err, st) => {
if (err) { throw err; }
dsFileSizes[f.replace(/^.*\/([^\/]*)\.ndjson$/, (all, a) => (a))] = st.size;
})));
});
});
}).nThen((waitFor) => {
Fs.readdir('./pins', waitFor((err, list) => {
if (err) { throw err; }
dirList = list;
}));
}).nThen((waitFor) => {
fileList.splice(0, fileList.length);
dirList.forEach((f) => {
sema.take((returnAfter) => {
Fs.readdir('./pins/' + f, waitFor(returnAfter((err, list2) => {
if (err) { throw err; }
list2.forEach((ff) => { fileList.push('./pins/' + f + '/' + ff); });
})));
});
});
}).nThen((waitFor) => {
fileList.forEach((f) => {
sema.take((returnAfter) => {
Fs.readFile(f, waitFor(returnAfter((err, content) => {
if (err) { throw err; }
const hashes = hashesFromPinFile(content.toString('utf8'), f);
const size = sizeForHashes(hashes, dsFileSizes);
out.push([f, Math.floor(size / (1024 * 1024))]);
})));
});
});
}).nThen(() => {
out.sort((a,b) => (a[1] - b[1]));
out.forEach((x) => { console.log(x[0] + ' ' + x[1] + ' MB'); });
});

@ -143,7 +143,7 @@ define([
return { return {
show: function () { show: function () {
$target.show(); $target.css('display', 'inline');
return this; return this;
}, },
hide: function () { hide: function () {

@ -840,21 +840,17 @@ define([
return; return;
} }
var rootFiles = getFiles([ROOT, TEMPLATE]).slice(); var rootFiles = getFiles([ROOT, TEMPLATE]).slice();
//var toClean = [];
var root = find([ROOT]); var root = find([ROOT]);
us.forEach(function (el) { us.forEach(function (el) {
if (!isFile(el) || rootFiles.indexOf(el) !== -1) { if (!isFile(el) || rootFiles.indexOf(el) !== -1) {
return; return;
//toClean.push(idx);
} }
var name = getFileData(el).title || NEW_FILE_NAME; var data = getFileData(el);
var name = data ? data.title : NEW_FILE_NAME;
var newName = getAvailableName(root, name); var newName = getAvailableName(root, name);
root[newName] = el; root[newName] = el;
}); });
delete files[UNSORTED]; delete files[UNSORTED];
/*toClean.forEach(function (idx) {
us.splice(idx, 1);
});*/
}; };
var fixTemplate = function () { var fixTemplate = function () {
if (!Array.isArray(files[TEMPLATE])) { debug("TEMPLATE was not an array"); files[TEMPLATE] = []; } if (!Array.isArray(files[TEMPLATE])) { debug("TEMPLATE was not an array"); files[TEMPLATE] = []; }

@ -371,6 +371,7 @@ define([
e.stopPropagation(); e.stopPropagation();
}); });
// Arrow keys to modify the selection
$(ifrw).keydown(function (e) { $(ifrw).keydown(function (e) {
var $searchBar = $tree.find('#searchInput'); var $searchBar = $tree.find('#searchInput');
if ($searchBar.is(':focus') && $searchBar.val()) { return; } if ($searchBar.is(':focus') && $searchBar.val()) { return; }
@ -381,6 +382,7 @@ define([
if (e.ctrlKey) { ev.ctrlKey = true; } if (e.ctrlKey) { ev.ctrlKey = true; }
if (e.shiftKey) { ev.shiftKey = true; } if (e.shiftKey) { ev.shiftKey = true; }
var click = function (el) { var click = function (el) {
if (!el) { return; }
module.onElementClick(ev, $(el)); module.onElementClick(ev, $(el));
}; };
@ -402,6 +404,7 @@ define([
// [Left, Up, Right, Down] // [Left, Up, Right, Down]
if ([37, 38, 39, 40].indexOf(e.which) === -1) { return; } if ([37, 38, 39, 40].indexOf(e.which) === -1) { return; }
e.preventDefault();
var $selection = $content.find('.element.selected'); var $selection = $content.find('.element.selected');
if ($selection.length === 0) { return void click($elements.first()[0]); } if ($selection.length === 0) { return void click($elements.first()[0]); }
@ -715,6 +718,21 @@ define([
updatePathSize(); updatePathSize();
}; };
var scrollTo = function ($element) {
// Current scroll position
var st = $content.scrollTop();
// Block height
var h = $content.height();
// Current top position of the element relative to the scroll position
var pos = Math.round($element.offset().top - $content.position().top);
// Element height
var eh = $element.outerHeight();
// New scroll value
var v = st + pos + eh - h;
// If the element is completely visile, don't change the scroll position
if (pos+eh <= h && pos >= 0) { return; }
$content.scrollTop(v);
};
// Add the "selected" class to the "li" corresponding to the clicked element // Add the "selected" class to the "li" corresponding to the clicked element
var onElementClick = module.onElementClick = function (e, $element) { var onElementClick = module.onElementClick = function (e, $element) {
// If "Ctrl" is pressed, do not remove the current selection // If "Ctrl" is pressed, do not remove the current selection
@ -730,6 +748,7 @@ define([
log(Messages.fm_selectError); log(Messages.fm_selectError);
return; return;
} }
scrollTo($element);
// Add the selected class to the clicked / right-clicked element // Add the selected class to the clicked / right-clicked element
// Remove the class if it already has it // Remove the class if it already has it
// If ctrlKey, add to the selection // If ctrlKey, add to the selection
@ -1793,7 +1812,11 @@ define([
module.resetTree(); module.resetTree();
// in history mode we want to focus the version number input // in history mode we want to focus the version number input
if (!history.isHistoryMode && !APP.mobile()) { $tree.find('#searchInput').focus(); } if (!history.isHistoryMode && !APP.mobile()) {
var st = $tree.scrollTop() || 0;
$tree.find('#searchInput').focus();
$tree.scrollTop(st);
}
$tree.find('#searchInput')[0].selectionStart = getSearchCursor(); $tree.find('#searchInput')[0].selectionStart = getSearchCursor();
$tree.find('#searchInput')[0].selectionEnd = getSearchCursor(); $tree.find('#searchInput')[0].selectionEnd = getSearchCursor();
@ -2080,12 +2103,14 @@ define([
}; };
module.resetTree = function () { module.resetTree = function () {
var s = $tree.scrollTop() || 0;
$tree.html(''); $tree.html('');
if (displayedCategories.indexOf(SEARCH) !== -1) { createSearch($tree); } if (displayedCategories.indexOf(SEARCH) !== -1) { createSearch($tree); }
if (displayedCategories.indexOf(ROOT) !== -1) { createTree($tree, [ROOT]); } if (displayedCategories.indexOf(ROOT) !== -1) { createTree($tree, [ROOT]); }
if (displayedCategories.indexOf(TEMPLATE) !== -1) { createTemplate($tree, [TEMPLATE]); } if (displayedCategories.indexOf(TEMPLATE) !== -1) { createTemplate($tree, [TEMPLATE]); }
if (displayedCategories.indexOf(FILES_DATA) !== -1) { createAllFiles($tree, [FILES_DATA]); } if (displayedCategories.indexOf(FILES_DATA) !== -1) { createAllFiles($tree, [FILES_DATA]); }
if (displayedCategories.indexOf(TRASH) !== -1) { createTrash($tree, [TRASH]); } if (displayedCategories.indexOf(TRASH) !== -1) { createTrash($tree, [TRASH]); }
$tree.scrollTop(s);
}; };
module.hideMenu = function () { module.hideMenu = function () {
@ -2665,12 +2690,16 @@ define([
var $usage = $('<span>', {'class': 'usage'}).css('width', width+'px'); var $usage = $('<span>', {'class': 'usage'}).css('width', width+'px');
if (quota >= 0.8) { if (quota >= 0.8) {
var origin = encodeURIComponent(window.location.origin);
var $upgradeLink = $('<a>', {
href: "https://account.cryptpad.fr/#!on=" + origin,
rel: "noreferrer noopener",
target: "_blank",
}).appendTo($leftside);
$('<button>', { $('<button>', {
'class': 'upgrade buttonSuccess', 'class': 'upgrade buttonSuccess',
title: Messages.upgradeTitle title: Messages.upgradeTitle
}).text(Messages.upgrade).click(function () { }).text(Messages.upgrade).appendTo($upgradeLink);
// TODO
}).appendTo($leftside);
} }
if (quota < 0.8) { $usage.addClass('normal'); } if (quota < 0.8) { $usage.addClass('normal'); }

@ -188,6 +188,7 @@ define([
title: false, title: false,
slide: false, slide: false,
date: false, date: false,
transition: true,
style: '' style: ''
}; };
@ -220,6 +221,13 @@ define([
}).appendTo($p).css('width', 'auto'); }).appendTo($p).css('width', 'auto');
$('<label>', {'for': 'checkTitle'}).text(Messages.printTitle).appendTo($p); $('<label>', {'for': 'checkTitle'}).text(Messages.printTitle).appendTo($p);
$p.append($('<br>')); $p.append($('<br>'));
// Transition
$('<input>', {type: 'checkbox', id: 'checkTransition', checked: slideOptionsTmp.transition}).on('change', function () {
var c = this.checked;
slideOptionsTmp.transition = c;
}).appendTo($p).css('width', 'auto');
$('<label>', {'for': 'checkTransition'}).text(Messages.printTransition).appendTo($p);
$p.append($('<br>'));
// CSS // CSS
$('<label>', {'for': 'cssPrint'}).text(Messages.printCSS).appendTo($p); $('<label>', {'for': 'cssPrint'}).text(Messages.printCSS).appendTo($p);
$p.append($('<br>')); $p.append($('<br>'));

@ -168,13 +168,16 @@ body .CodeMirror-focused .cm-matchhighlight {
} }
.cp div.modal #content, .cp div.modal #content,
.cp div#modal #content { .cp div#modal #content {
transition: margin-left 1s;
font-size: 20vh; font-size: 20vh;
position: relative; position: relative;
height: 100%; height: 100%;
overflow: visible; overflow: visible;
white-space: nowrap; white-space: nowrap;
} }
.cp div.modal #content.transition,
.cp div#modal #content.transition {
transition: margin-left 1s;
}
.cp div.modal #content .slide-frame, .cp div.modal #content .slide-frame,
.cp div#modal #content .slide-frame { .cp div#modal #content .slide-frame {
display: inline-block; display: inline-block;
@ -198,10 +201,11 @@ body .CodeMirror-focused .cm-matchhighlight {
} }
.cp div.modal #content .slide-container, .cp div.modal #content .slide-container,
.cp div#modal #content .slide-container { .cp div#modal #content .slide-container {
display: inline-block; display: inline-flex;
height: 100%; height: 100%;
width: 100vw; width: 100vw;
text-align: center; text-align: center;
vertical-align: top;
} }
.cp div.modal .center, .cp div.modal .center,
.cp div#modal .center { .cp div#modal .center {

@ -184,6 +184,10 @@ define([
$('<div>', {'class': 'slideTitle'}).text(APP.title).appendTo($(el)); $('<div>', {'class': 'slideTitle'}).text(APP.title).appendTo($(el));
} }
}); });
$content.removeClass('transition');
if (options.transition) {
$content.addClass('transition');
}
//$content.find('.' + slideClass).hide(); //$content.find('.' + slideClass).hide();
//$content.find('.' + slideClass + ':eq( ' + i + ' )').show(); //$content.find('.' + slideClass + ':eq( ' + i + ' )').show();
$content.css('margin-left', -(i*100)+'vw'); $content.css('margin-left', -(i*100)+'vw');

@ -161,7 +161,9 @@ div.modal, div#modal {
width: 100%; width: 100%;
} }
#content { #content {
&.transition {
transition: margin-left 1s; transition: margin-left 1s;
}
font-size: 20vh; font-size: 20vh;
position: relative; position: relative;
height: 100%; height: 100%;
@ -191,9 +193,10 @@ div.modal, div#modal {
margin: auto; margin: auto;
} }
.slide-container { .slide-container {
display: inline-block; display: inline-flex;
height: 100%; width: 100vw; height: 100%; width: 100vw;
text-align: center; text-align: center;
vertical-align: top;
} }
} }

Loading…
Cancel
Save