cryptpad/www/filepicker/inner.js

200 lines
6.7 KiB
JavaScript
Raw Normal View History

define([
'jquery',
'/bower_components/chainpad-crypto/crypto.js',
'/bower_components/textpatcher/TextPatcher.js',
'/bower_components/chainpad-json-validator/json-ot.js',
'/common/cryptpad-common.js',
'/bower_components/nthen/index.js',
'/common/sframe-common.js',
'/common/common-interface.js',
'/common/common-ui-elements.js',
2017-11-13 15:32:40 +00:00
'/common/common-util.js',
'/common/common-hash.js',
2017-09-05 09:35:15 +00:00
'json.sortify',
'css!/bower_components/bootstrap/dist/css/bootstrap.min.css',
'less!/bower_components/components-font-awesome/css/font-awesome.min.css',
2017-09-04 13:09:54 +00:00
'less!/customize/src/less2/main.less',
], function (
$,
Crypto,
TextPatcher,
JsonOT,
Cryptpad,
nThen,
2017-09-05 09:35:15 +00:00
SFCommon,
UI,
UIElements,
2017-11-13 15:32:40 +00:00
Util,
Hash,
2017-09-05 09:35:15 +00:00
Sortify)
{
var Messages = Cryptpad.Messages;
var APP = window.APP = {
Cryptpad: Cryptpad,
};
var onConnectError = function () {
UI.errorLoadingScreen(Messages.websocketError);
};
var andThen = function (common) {
2017-09-05 09:35:15 +00:00
var metadataMgr = common.getMetadataMgr();
var $body = $('body');
var sframeChan = common.getSframeChannel();
2017-09-05 09:35:15 +00:00
var filters = metadataMgr.getPrivateData().types;
2017-09-05 09:35:15 +00:00
var hideFileDialog = function () {
sframeChan.event('EV_FILE_PICKER_CLOSE');
};
var onFilePicked = function (data) {
2017-11-13 15:32:40 +00:00
var parsed = Hash.parsePadUrl(data.url);
2017-09-05 09:35:15 +00:00
hideFileDialog();
if (parsed.type === 'file') {
2017-11-13 15:32:40 +00:00
var hexFileName = Util.base64ToHex(parsed.hashData.channel);
2017-09-05 09:35:15 +00:00
var src = '/blob/' + hexFileName.slice(0,2) + '/' + hexFileName;
sframeChan.event("EV_FILE_PICKED", {
type: parsed.type,
src: src,
key: parsed.hashData.key
});
return;
}
sframeChan.event("EV_FILE_PICKED", {
2017-09-05 09:35:15 +00:00
type: parsed.type,
href: data.url,
});
};
2017-09-04 13:09:54 +00:00
// File uploader
var fmConfig = {
body: $('body'),
noHandlers: true,
onUploaded: function (ev, data) {
onFilePicked(data);
}
};
APP.FM = common.createFileManager(fmConfig);
2017-09-04 13:09:54 +00:00
// Create file picker
var onSelect = function (url) {
onFilePicked({url: url});
};
2017-09-04 13:09:54 +00:00
var data = {
FM: APP.FM
};
2017-09-05 09:35:15 +00:00
var updateContainer;
var createFileDialog = function () {
2017-09-08 13:54:54 +00:00
var types = filters.types || [];
2017-09-04 13:09:54 +00:00
// Create modal
var $blockContainer = UIElements.createModal({
2017-09-04 13:09:54 +00:00
id: 'cp-filepicker-dialog',
$body: $body,
onClose: hideFileDialog
}).show();
// Set the fixed content
var $block = $blockContainer.find('.cp-modal');
2017-09-05 09:35:15 +00:00
// Description
var text = Messages.filePicker_description;
2017-09-08 15:39:41 +00:00
if (types && types.length === 1 && types[0] !== 'file') {
2017-09-05 09:35:15 +00:00
// Should be Templates
text = Messages.selectTemplate;
}
var $description = $('<p>').text(text);
2017-09-04 13:09:54 +00:00
$block.append($description);
2017-09-05 09:35:15 +00:00
2017-09-04 13:09:54 +00:00
var $filter = $('<p>', {'class': 'cp-modal-form'}).appendTo($block);
var to;
$('<input>', {
type: 'text',
'class': 'cp-filepicker-filter',
'placeholder': Messages.filePicker_filter
}).appendTo($filter).on('keypress', function () {
if (to) { window.clearTimeout(to); }
to = window.setTimeout(updateContainer, 300);
});
2017-09-05 09:35:15 +00:00
//If file, display the upload button
if (types.indexOf('file') !== -1 && common.isLoggedIn()) {
2017-09-05 09:35:15 +00:00
$filter.append(common.createButton('upload', false, data));
}
2017-09-04 13:09:54 +00:00
var $container = $('<span>', {'class': 'cp-filepicker-content'}).appendTo($block);
2017-09-04 13:09:54 +00:00
// Update the files list when needed
updateContainer = function () {
$container.html('');
2017-09-08 13:01:47 +00:00
var $input = $filter.find('.cp-filepicker-filter');
var filter = $input.val().trim();
2017-09-04 13:09:54 +00:00
var todo = function (err, list) {
if (err) { return void console.error(err); }
Object.keys(list).forEach(function (id) {
var data = list[id];
var name = data.title || '?';
if (filter && name.toLowerCase().indexOf(filter.toLowerCase()) === -1) {
return;
}
var $span = $('<span>', {
'class': 'cp-filepicker-content-element',
'title': name,
}).appendTo($container);
$span.append(UI.getFileIcon(data));
$('<span>', {'class': 'cp-filepicker-content-element-name'}).text(name)
.appendTo($span);
2017-09-04 13:09:54 +00:00
$span.click(function () {
if (typeof onSelect === "function") { onSelect(data.href); }
});
// Add thumbnail if it exists
common.displayThumbnail(data.href, $span);
2017-09-04 13:09:54 +00:00
});
2017-09-08 13:01:47 +00:00
$input.focus();
2017-09-04 13:09:54 +00:00
};
2017-09-05 09:35:15 +00:00
common.getFilesList(filters, todo);
2017-09-04 13:09:54 +00:00
};
updateContainer();
};
2017-09-05 09:35:15 +00:00
sframeChan.on('EV_FILE_PICKER_REFRESH', function (newFilters) {
console.log(Sortify(filters));
console.log(Sortify(newFilters));
if (Sortify(filters) !== Sortify(newFilters)) {
$body.html('');
filters = newFilters;
return void createFileDialog();
}
updateContainer();
});
2017-09-04 13:09:54 +00:00
createFileDialog();
UI.removeLoadingScreen();
};
var main = function () {
var common;
nThen(function (waitFor) {
$(waitFor(function () {
UI.addLoadingScreen({hideTips: true, hideLogo: true});
}));
SFCommon.create(waitFor(function (c) { APP.common = common = c; }));
}).nThen(function (/*waitFor*/) {
2017-09-05 09:35:15 +00:00
var metadataMgr = common.getMetadataMgr();
Cryptpad.onError(function (info) {
if (info && info.type === "store") {
onConnectError();
}
});
2017-09-05 09:35:15 +00:00
if (metadataMgr.getMetadataLazy() !== 'uninitialized') {
andThen(common);
return;
}
metadataMgr.onChange(function () {
andThen(common);
});
});
};
main();
});