',
+ '
',
+ '
',
'',
'
',
'
',
diff --git a/www/common/sframe-common-codemirror.js b/www/common/sframe-common-codemirror.js
index 4c0fe5cfc..6686a9a55 100644
--- a/www/common/sframe-common-codemirror.js
+++ b/www/common/sframe-common-codemirror.js
@@ -49,6 +49,7 @@ define([
readOnly: true
});
editor.setValue(Messages.codeInitialState);
+ editor.focus();
var setMode = exp.setMode = function (mode, cb) {
exp.highlightMode = mode;
diff --git a/www/common/sframe-common-interface.js b/www/common/sframe-common-interface.js
index 6588dbaf5..0a7306cdf 100644
--- a/www/common/sframe-common-interface.js
+++ b/www/common/sframe-common-interface.js
@@ -200,20 +200,7 @@ define([
return button;
};
-
- UI.getFileSize = function (Common, href, cb) {
- var channelId = Cryptpad.hrefToHexChannelId(href);
- Common.sendAnonRpcMsg("GET_FILE_SIZE", channelId, function (data) {
- if (!data) { return void cb("No response"); }
- if (data.error) { return void cb(data.error); }
- if (data.response && data.response.length && typeof(data.response[0]) === 'number') {
- return void cb(void 0, data.response[0]);
- } else {
- cb('INVALID_RESPONSE');
- }
- });
- };
-
+ // Avatars
UI.displayAvatar = function (Common, $container, href, name, cb) {
var MutationObserver = window.MutationObserver;
var displayDefault = function () {
@@ -229,7 +216,7 @@ define([
var cryptKey = secret.keys && secret.keys.fileKeyStr;
var hexFileName = Cryptpad.base64ToHex(secret.channel);
var src = Cryptpad.getBlobPathFromHex(hexFileName);
- UI.getFileSize(Common, href, function (e, data) {
+ Common.getFileSize(href, function (e, data) {
if (e) {
displayDefault();
return void console.error(e);
@@ -467,9 +454,13 @@ define([
var metadataMgr = common.getMetadataMgr();
var type = metadataMgr.getMetadataLazy().type;
var sframeChan = common.getSframeChannel();
+ var focus;
var onConfirm = function (yes) {
- if (!yes) { return; }
+ if (!yes) {
+ if (focus) { focus.focus(); }
+ return;
+ }
var first = true; // We can only pick a template once (for a new document)
var fileDialogCfg = {
onSelect: function (data) {
@@ -480,6 +471,7 @@ define([
Cryptpad.removeLoadingScreen();
common.feedback('TEMPLATE_USED');
});
+ if (focus) { focus.focus(); }
return;
}
}
@@ -494,6 +486,7 @@ define([
sframeChan.query("Q_TEMPLATE_EXIST", type, function (err, data) {
if (data) {
+ focus = document.activeElement;
Cryptpad.confirm(Messages.useTemplate, onConfirm, {
ok: Messages.useTemplateOK,
cancel: Messages.useTemplateCancel,
diff --git a/www/common/sframe-common.js b/www/common/sframe-common.js
index 5fd99d3d5..35e2f3577 100644
--- a/www/common/sframe-common.js
+++ b/www/common/sframe-common.js
@@ -77,7 +77,6 @@ define([
funcs.openTemplatePicker = callWithCommon(UI.openTemplatePicker);
funcs.displayAvatar = callWithCommon(UI.displayAvatar);
funcs.createButton = callWithCommon(UI.createButton);
- funcs.getFileSize = callWithCommon(UI.getFileSize);
// History
funcs.getHistory = callWithCommon(History.create);
@@ -106,6 +105,19 @@ define([
}
return;
};
+ funcs.getFileSize = function (href, cb) {
+ var channelId = Cryptpad.hrefToHexChannelId(href);
+ funcs.sendAnonRpcMsg("GET_FILE_SIZE", channelId, function (data) {
+ if (!data) { return void cb("No response"); }
+ if (data.error) { return void cb(data.error); }
+ if (data.response && data.response.length && typeof(data.response[0]) === 'number') {
+ return void cb(void 0, data.response[0]);
+ } else {
+ cb('INVALID_RESPONSE');
+ }
+ });
+ };
+
// CodeMirror
funcs.initCodeMirrorApp = callWithCommon(CodeMirror.create);
diff --git a/www/common/toolbar3.js b/www/common/toolbar3.js
index ce5cf1cb3..335888256 100644
--- a/www/common/toolbar3.js
+++ b/www/common/toolbar3.js
@@ -837,7 +837,7 @@ define([
};
// Events
- var initClickEvents = function (toolbar, config) {
+ var initClickEvents = function (toolbar) {
var removeDropdowns = function () {
window.setTimeout(function () {
toolbar.$toolbar.find('.cp-dropdown-content').hide();
diff --git a/www/file/inner.js b/www/file/inner.js
index 6b8ebfa75..a71c4a7f5 100644
--- a/www/file/inner.js
+++ b/www/file/inner.js
@@ -232,13 +232,14 @@ define([
return;
}
+ // we're in upload mode
+
if (!common.isLoggedIn()) {
- // TODO
return Cryptpad.alert(Messages.upload_mustLogin, function () {
- if (sessionStorage) {
- sessionStorage.redirectTo = window.location.href;
- }
- window.location.href = '/login/';
+ Cryptpad.errorLoadingScreen(Messages.upload_mustLogin);
+ common.setLoginRedirect(function () {
+ common.gotoURL('/login/');
+ });
});
}
@@ -260,521 +261,7 @@ define([
FM.handleFile(file);
});
- // we're in upload mode
Cryptpad.removeLoadingScreen();
-
-
-
-
-
-
-
-
- return;
- //===========================================================================
- var readOnly = false;
- var cpNfInner;
- var metadataMgr;
- var $bar = $('#cme_toolbox');
-
- var isHistoryMode = false;
-
- var setEditable = APP.setEditable = function (bool) {
- if (readOnly && bool) { return; }
- editor.setOption('readOnly', !bool);
- };
-
- var Title;
-
- var config = {
- readOnly: readOnly,
- transformFunction: JsonOT.validate,
- // cryptpad debug logging (default is 1)
- // logLevel: 0,
- validateContent: function (content) {
- try {
- JSON.parse(content);
- return true;
- } catch (e) {
- console.log("Failed to parse, rejecting patch");
- return false;
- }
- }
- };
-
- var canonicalize = function (t) { return t.replace(/\r\n/g, '\n'); };
-
- var setHistory = function (bool, update) {
- isHistoryMode = bool;
- setEditable(!bool);
- if (!bool && update) {
- config.onRemote();
- }
- };
-
- var $contentContainer = $('#cp-app-code-editor');
- var $previewContainer = $('#cp-app-code-preview');
- var $preview = $('#cp-app-code-preview-content');
- $preview.click(function (e) {
- if (!e.target) { return; }
- var $t = $(e.target);
- if ($t.is('a') || $t.parents('a').length) {
- e.preventDefault();
- var $a = $t.is('a') ? $t : $t.parents('a').first();
- var href = $a.attr('href');
- window.open(href);
- }
- });
-
- var setIndentation = APP.setIndentation = function (units, useTabs) {
- if (typeof(units) !== 'number') { return; }
- editor.setOption('indentUnit', units);
- editor.setOption('tabSize', units);
- editor.setOption('indentWithTabs', useTabs);
- };
-
- var indentKey = 'indentUnit';
- var useTabsKey = 'indentWithTabs';
- var updateIndentSettings = function () {
- if (!metadataMgr) { return; }
- var data = metadataMgr.getPrivateData().settings;
- data = data.codemirror || {};
- var indentUnit = data[indentKey];
- var useTabs = data[useTabsKey];
- setIndentation(
- typeof(indentUnit) === 'number'? indentUnit: 2,
- typeof(useTabs) === 'boolean'? useTabs: false);
- };
-
- CommonRealtime.onInfiniteSpinner(function () { setEditable(false); });
-
- setEditable(false);
- var initializing = true;
-
- var stringifyInner = function (textValue) {
- var obj = {
- content: textValue,
- metadata: metadataMgr.getMetadataLazy()
- };
- /* metadata: {
- users: UserList.userData,
- defaultTitle: Title.defaultTitle
- }
- };
- if (!initializing) {
- obj.metadata.title = Title.title;
- }*/
- // set mode too...
- obj.highlightMode = CodeMirror.highlightMode;
-
- // stringify the json and send it into chainpad
- return stringify(obj);
- };
-
- var forceDrawPreview = function () {
- try {
- DiffMd.apply(DiffMd.render(editor.getValue()), $preview);
- } catch (e) { console.error(e); }
- };
-
- var drawPreview = Cryptpad.throttle(function () {
- if (CodeMirror.highlightMode !== 'markdown') { return; }
- if (!$previewContainer.is(':visible')) { return; }
- forceDrawPreview();
- }, 150);
-
- var onLocal = config.onLocal = function () {
- if (initializing) { return; }
- if (isHistoryMode) { return; }
- if (readOnly) { return; }
-
- editor.save();
-
- drawPreview();
-
- var textValue = canonicalize(CodeMirror.$textarea.val());
- var shjson = stringifyInner(textValue);
-
- APP.patchText(shjson);
-
- if (APP.realtime.getUserDoc() !== shjson) {
- console.error("realtime.getUserDoc() !== shjson");
- }
- };
-
- var mediaTagModes = [
- 'markdown',
- 'html',
- 'htmlembedded',
- 'htmlmixed',
- 'index.html',
- 'php',
- 'velocity',
- 'xml',
- ];
-
- var onModeChanged = function (mode) {
- var $codeMirror = $('.CodeMirror');
- window.clearTimeout(APP.previewTo);
- $codeMirror.addClass('transition');
- APP.previewTo = window.setTimeout(function () {
- $codeMirror.removeClass('transition');
- }, 500);
- if (mediaTagModes.indexOf(mode) !== -1) {
- $(APP.$mediaTagButton).show();
- } else { $(APP.$mediaTagButton).hide(); }
-
- if (mode === "markdown") {
- APP.$previewButton.show();
- common.getPadAttribute('previewMode', function (e, data) {
- if (e) { return void console.error(e); }
- if (data !== false) {
- $previewContainer.show();
- APP.$previewButton.addClass('active');
- $codeMirror.removeClass('fullPage');
- }
- });
- return;
- }
- APP.$previewButton.hide();
- $previewContainer.hide();
- APP.$previewButton.removeClass('active');
- $codeMirror.addClass('fullPage');
- };
-
- config.onInit = function (info) {
- metadataMgr.onChangeLazy(updateIndentSettings);
- updateIndentSettings();
-
- readOnly = metadataMgr.getPrivateData().readOnly;
-
- var titleCfg = { getHeadingText: CodeMirror.getHeadingText };
- Title = common.createTitle(titleCfg, config.onLocal);
-
- var configTb = {
- displayed: ['title', 'useradmin', 'spinner', 'share', 'userlist', 'newpad', 'limit'],
- title: Title.getTitleConfig(),
- metadataMgr: metadataMgr,
- readOnly: readOnly,
- ifrw: window,
- realtime: info.realtime,
- common: Cryptpad,
- sfCommon: common,
- $container: $bar,
- $contentContainer: $contentContainer
- };
- toolbar = APP.toolbar = Toolbar.create(configTb);
- Title.setToolbar(toolbar);
- CodeMirror.init(config.onLocal, Title, toolbar);
-
- var $rightside = toolbar.$rightside;
- var $drawer = toolbar.$drawer;
-
- /* add a history button */
- var histConfig = {
- onLocal: config.onLocal,
- onRemote: config.onRemote,
- setHistory: setHistory,
- applyVal: function (val) {
- var remoteDoc = JSON.parse(val || '{}').content;
- editor.setValue(remoteDoc || '');
- editor.save();
- },
- $toolbar: $bar
- };
- var $hist = common.createButton('history', true, {histConfig: histConfig});
- $drawer.append($hist);
-
- /* save as template */
- if (!metadataMgr.getPrivateData().isTemplate) {
- var templateObj = {
- rt: info.realtime,
- getTitle: function () { return metadataMgr.getMetadata().title; }
- };
- var $templateButton = common.createButton('template', true, templateObj);
- $rightside.append($templateButton);
- }
-
- /* add an export button */
- var $export = common.createButton('export', true, {}, CodeMirror.exportText);
- $drawer.append($export);
-
- if (!readOnly) {
- /* add an import button */
- var $import = common.createButton('import', true, {}, CodeMirror.importText);
- $drawer.append($import);
- }
-
- /* add a forget button */
- var forgetCb = function (err) {
- if (err) { return; }
- setEditable(false);
- };
- var $forgetPad = common.createButton('forget', true, {}, forgetCb);
- $rightside.append($forgetPad);
-
- var $previewButton = APP.$previewButton = common.createButton(null, true);
- $previewButton.removeClass('fa-question').addClass('fa-eye');
- $previewButton.attr('title', Messages.previewButtonTitle);
- $previewButton.click(function () {
- var $codeMirror = $('.CodeMirror');
- window.clearTimeout(APP.previewTo);
- $codeMirror.addClass('transition');
- APP.previewTo = window.setTimeout(function () {
- $codeMirror.removeClass('transition');
- }, 500);
- if (CodeMirror.highlightMode !== 'markdown') {
- $previewContainer.show();
- }
- $previewContainer.toggle();
- if ($previewContainer.is(':visible')) {
- forceDrawPreview();
- $codeMirror.removeClass('cp-ap-code-fullpage');
- $previewButton.addClass('cp-toolbar-button-active');
- common.setPadAttribute('previewMode', true, function (e) {
- if (e) { return console.log(e); }
- });
- } else {
- $codeMirror.addClass('cp-app-code-fullpage');
- $previewButton.removeClass('cp-toolbar-button-active');
- common.setPadAttribute('previewMode', false, function (e) {
- if (e) { return console.log(e); }
- });
- }
- });
- $rightside.append($previewButton);
-
- if (!readOnly) {
- CodeMirror.configureTheme(function () {
- CodeMirror.configureLanguage(null, onModeChanged);
- });
- }
- else {
- CodeMirror.configureTheme();
- }
-
- if (!readOnly) {
- var fileDialogCfg = {
- onSelect: function (data) {
- if (data.type === 'file') {
- var mt = '
';
- editor.replaceSelection(mt);
- return;
- }
- }
- };
- common.initFilePicker(fileDialogCfg);
- APP.$mediaTagButton = $('