From 9e92a597b32f5fb68d094f7f5feec4e366ed5ec1 Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 24 Oct 2016 18:32:43 +0200 Subject: [PATCH] Ability to edit the title in the toolbar by clicking it --- www/common/cryptpad-common.js | 29 ++++++++++++++++++++++++----- www/common/toolbar.js | 26 +++++++++++++++++++------- www/pad/main.js | 27 +++++++++++++++++---------- 3 files changed, 60 insertions(+), 22 deletions(-) diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js index b6d5f1588..51d1aadf1 100644 --- a/www/common/cryptpad-common.js +++ b/www/common/cryptpad-common.js @@ -302,13 +302,17 @@ define([ var type = parsed.type; var untitledIndex = 1; var name = (Messages.type)[type] + ' - ' + new Date().toString().split(' ').slice(0,4).join(' '); - if (isNameAvailable(name, parsed, recentPads)) { return name; } - while (!isNameAvailable(name + ' - ' + untitledIndex, parsed, recentPads)) { untitledIndex++; } - return name + ' - ' + untitledIndex; + return name; + /* + * Pad titles are shared in the document so it does not make sense anymore to avoid duplicates + if (isNameAvailable(name, parsed, recentPads)) { return name; } + while (!isNameAvailable(name + ' - ' + untitledIndex, parsed, recentPads)) { untitledIndex++; } + return name + ' - ' + untitledIndex; + */ }; var isDefaultName = common.isDefaultName = function (parsed, title) { var name = getDefaultName(parsed, []); - return title.slice(0, name.length) === name; + return title === name; }; var makePad = function (href, title) { @@ -622,7 +626,21 @@ define([ var renamePad = common.renamePad = function (title, callback) { if (title === null) { return; } - common.causesNamingConflict(title, function (err, conflicts) { + if (title.trim() === "") { + var parsed = parsePadUrl(window.location.href); + title = getDefaultName(parsed); + } + + common.setPadTitle(title, function (err, data) { + if (err) { + console.log("unable to set pad title"); + console.log(err); + return; + } + callback(null, title); + }); + /* Pad titles are shared in the document. We don't check for duplicates anymore. + common.causesNamingConflict(title, function (err, conflicts) { if (err) { console.log("Unable to determine if name caused a conflict"); console.error(err); @@ -644,6 +662,7 @@ define([ callback(null, title); }); }); + */ }; var createButton = common.createButton = function (type, rightside, data, callback) { var button; diff --git a/www/common/toolbar.js b/www/common/toolbar.js index bd58f324a..28e218046 100644 --- a/www/common/toolbar.js +++ b/www/common/toolbar.js @@ -303,29 +303,40 @@ define([ $(lagElement).append(lagLight); }; - var createTitle = function ($container, readOnly, cb) { + var createTitle = function ($container, readOnly, config, Cryptpad) { + var callback = config.onRename; + var placeholder = config.defaultName; + var $titleContainer = $('', { id: 'toolbarTitle', 'class': TITLE_CLS }).appendTo($container); var $text = $('').appendTo($titleContainer); - if (readOnly === 1) { return; } + if (readOnly === 1 || typeof(Cryptpad) === "unedfined") { return; } var $input = $('', { - type: 'text' + type: 'text', + placeholder: placeholder }).appendTo($titleContainer).hide(); + $input.on('mousedown', function (e) { + if (!$input.is(":focus")) { + $input.focus(); + } + e.stopPropagation(); + return true; + }); $input.on('keyup', function (e) { if (e.which === 13) { - Cryptpad.renamePad(title, function (err, newtitle) { + var name = $input.val().trim(); + Cryptpad.renamePad($input.val(), function (err, newtitle) { if (err) { return; } $text.text(newtitle); - cb(null, newtitle); + callback(null, newtitle); $input.hide(); $text.show(); }); } }); $text.on('click', function () { - console.log('click'); $text.hide(); $input.val($text.text()); $input.show(); @@ -335,12 +346,13 @@ define([ var create = Bar.create = function ($container, myUserName, realtime, getLag, userList, config) { var readOnly = (typeof config.readOnly !== "undefined") ? (config.readOnly ? 1 : 0) : -1; + var Cryptpad = config.common; var toolbar = createRealtimeToolbar($container); var userListElement = createUserList(toolbar.find('.' + LEFTSIDE_CLS), readOnly); var spinner = createSpinner(toolbar.find('.' + RIGHTSIDE_CLS)); var lagElement = createLagElement(toolbar.find('.' + RIGHTSIDE_CLS)); - var $titleElement = createTitle(toolbar.find('.' + TOP_CLS), readOnly, config.onRename); + var $titleElement = createTitle(toolbar.find('.' + TOP_CLS), readOnly, config.title, Cryptpad); var userData = config.userData; // readOnly = 1 (readOnly enabled), 0 (disabled), -1 (old pad without readOnly mode) var saveElement; diff --git a/www/pad/main.js b/www/pad/main.js index d6f3fdef5..14f00ced0 100644 --- a/www/pad/main.js +++ b/www/pad/main.js @@ -86,6 +86,8 @@ define([ editor.on('instanceReady', function (Ckeditor) { var $bar = $('#pad-iframe')[0].contentWindow.$('#cke_1_toolbox'); + var parsedHash = Cryptpad.parsePadUrl(window.location.href); + var defaultName = Cryptpad.getDefaultName(parsedHash); if (readOnly) { $('#pad-iframe')[0].contentWindow.$('#cke_1_toolbox > .cke_toolbar').hide(); @@ -318,13 +320,10 @@ define([ }; var suggestName = function () { - var parsed = Cryptpad.parsePadUrl(window.location.href); - var name = Cryptpad.getDefaultName(parsed, []); - - if (Cryptpad.isDefaultName(parsed, document.title)) { - return getHeadingText() || document.title; + if (Cryptpad.isDefaultName(parsedHash, document.title)) { + return getHeadingText() || defaultName; } else { - return document.title || getHeadingText() || name; + return document.title || getHeadingText() || defaultName; } }; @@ -350,6 +349,8 @@ define([ }; if (!isDefaultTitle()) { hjson[3].metadata.title = document.title; + } else { + hjson[3].metadata.title = ""; } return stringify(hjson); }; @@ -396,14 +397,16 @@ define([ // Change the title now, and set it back to the old value if there is an error var oldTitle = document.title; document.title = newTitle; - Cryptpad.setPadTitle(newTitle, function (err, data) { + Cryptpad.renamePad(newTitle, function (err, data) { if (err) { console.log("Couldn't set pad title"); console.error(err); document.title = oldTitle; return; } - $bar.find('.' + Toolbar.constants.title).find('span').text(newTitle); + document.title = data; + $bar.find('.' + Toolbar.constants.title).find('span').text(data); + $bar.find('.' + Toolbar.constants.title).find('input').val(data); }); }; @@ -417,7 +420,7 @@ define([ // Update the local user data addToUserList(userData); } - if (peerMetadata.metadata.title) { + if (typeof peerMetadata.metadata.title !== "undefined") { updateTitle(peerMetadata.metadata.title); } } @@ -526,7 +529,11 @@ define([ userData: userList, readOnly: readOnly, ifrw: ifrw, - onRename: renameCb + title: { + onRename: renameCb, + defaultName: defaultName + }, + common: Cryptpad }; if (readOnly) {delete config.changeNameID; } toolbar = info.realtime.toolbar = Toolbar.create($bar, info.myID, info.realtime, info.getLag, info.userList, config);