diff --git a/customize.dist/main.css b/customize.dist/main.css index 72190a3a1..0c063e6e8 100644 --- a/customize.dist/main.css +++ b/customize.dist/main.css @@ -154,6 +154,9 @@ tr { margin-bottom: 12px; white-space: nowrap; } +.alertify button { + margin: 3px 0px; +} /* Tables */ table { border-collapse: collapse; diff --git a/customize.dist/src/cryptpad.less b/customize.dist/src/cryptpad.less index 16448646f..c41af4de9 100644 --- a/customize.dist/src/cryptpad.less +++ b/customize.dist/src/cryptpad.less @@ -187,6 +187,9 @@ p, pre, td, a, table, tr { margin-bottom: 2 * 6px; white-space: nowrap; } +.alertify button { + margin: 3px 0px; +} /* Tables */ table { diff --git a/customize.dist/translations/messages.fr.js b/customize.dist/translations/messages.fr.js index bbff1822c..744eff569 100644 --- a/customize.dist/translations/messages.fr.js +++ b/customize.dist/translations/messages.fr.js @@ -74,7 +74,10 @@ define(function () { out.getViewButton = 'LECTURE SEULE'; out.getViewButtonTitle = "Obtenir l'adresse d'accès à ce document en lecture seule"; - out.readonlyUrl = 'URL de lecture seule'; + out.readonlyUrl = 'Document en lecture seule'; + out.copyReadOnly = "Copier l'URL dans le presse-papiers"; + out.openReadOnly = "Ouvrir dans un nouvel onglet"; + out.disconnectAlert = 'Perte de la connexion au réseau !'; diff --git a/customize.dist/translations/messages.js b/customize.dist/translations/messages.js index 3d4ba85c6..09c044481 100644 --- a/customize.dist/translations/messages.js +++ b/customize.dist/translations/messages.js @@ -75,7 +75,9 @@ define(function () { out.getViewButton = 'READ-ONLY URL'; out.getViewButtonTitle = 'Get the read-only URL for this document'; - out.readonlyUrl = 'Read only URL'; + out.readonlyUrl = 'Read only document'; + out.copyReadOnly = "Copy URL to clipboard"; + out.openReadOnly = "Open in a new tab"; out.disconnectAlert = 'Network connection lost!'; diff --git a/www/code/main.js b/www/code/main.js index fc10fd7c9..e02335579 100644 --- a/www/code/main.js +++ b/www/code/main.js @@ -271,6 +271,32 @@ define([ saveAs(blob, filename); }); }; + var importText = function (content, file) { + var $bar = $('#pad-iframe')[0].contentWindow.$('#cme_toolbox'); + var mode; + var mime = CodeMirror.findModeByMIME(file.type); + + if (!mime) { + var ext = /.+\.([^.]+)$/.exec(file.name); + if (ext[1]) { + mode = CodeMirror.findModeByExtension(ext[1]); + } + } else { + mode = mime && mime.mode || null; + } + + if (mode && Modes.list.some(function (o) { return o.mode === mode; })) { + setMode(mode); + $bar.find('#language-mode').val(mode); + } else { + console.log("Couldn't find a suitable highlighting mode: %s", mode); + setMode('text'); + $bar.find('#language-mode').val('text'); + } + + editor.setValue(content); + onLocal(); + }; var onInit = config.onInit = function (info) { var $bar = $('#pad-iframe')[0].contentWindow.$('#cme_toolbox'); @@ -291,113 +317,44 @@ define([ editHash = Cryptpad.getEditHashFromKeys(info.channel, secret.keys); } + /* add a "change username" button */ getLastName(function (err, lastName) { - var $username = Cryptpad.createButton('username', true) - .click(function() { - Cryptpad.prompt(Messages.changeNamePrompt, lastName, function (newName) { - setName(newName); - }); - }); + var usernameCb = function (newName) { + setName (newName); + }; + var $username = Cryptpad.createButton('username', true, {lastName: lastName}, usernameCb); $rightside.append($username); }); /* add an export button */ - var $export = Cryptpad.createButton('export', true).click(exportText); + var $export = Cryptpad.createButton('export', true, {}, exportText); $rightside.append($export); if (!readOnly) { /* add an import button */ - var $import = Cryptpad.createButton('import', true) - .click(Cryptpad.importContent('text/plain', function (content, file) { - var mode; - var mime = CodeMirror.findModeByMIME(file.type); - - if (!mime) { - var ext = /.+\.([^.]+)$/.exec(file.name); - if (ext[1]) { - mode = CodeMirror.findModeByExtension(ext[1]); - } - } else { - mode = mime && mime.mode || null; - } - - if (mode && Modes.list.some(function (o) { return o.mode === mode; })) { - setMode(mode); - $bar.find('#language-mode').val(mode); - } else { - console.log("Couldn't find a suitable highlighting mode: %s", mode); - setMode('text'); - $bar.find('#language-mode').val('text'); - } - - editor.setValue(content); - onLocal(); - })); + var $import = Cryptpad.createButton('import', true, {}, importText); $rightside.append($import); - /* add a rename button */ - var $setTitle = Cryptpad.createButton('rename', true) - .click(function () { - var suggestion = suggestName(); - - Cryptpad.prompt(Messages.renamePrompt, - suggestion, function (title, ev) { - if (title === null) { return; } - - Cryptpad.causesNamingConflict(title, function (err, conflicts) { - if (err) { - console.log("Unable to determine if name caused a conflict"); - console.error(err); - return; - } - - if (conflicts) { - Cryptpad.alert(Messages.renameConflict); - return; - } - - Cryptpad.setPadTitle(title, function (err, data) { - if (err) { - console.log("unable to set pad title"); - console.log(err); - return; - } - document.title = title; - onLocal(); - }); - }); - }); - }); - $rightside.append($setTitle); - } + /* add a rename button */ + var renameCb = function (err, title) { + if (err) { return; } + document.title = title; + onLocal(); + }; + var $setTitle = Cryptpad.createButton('rename', true, {suggestName: suggestName}, renameCb); + $rightside.append($setTitle); /* add a forget button */ - var $forgetPad = Cryptpad.createButton('forget', true) - .click(function () { - var href = window.location.href; - Cryptpad.confirm(Messages.forgetPrompt, function (yes) { - if (!yes) { return; } - Cryptpad.forgetPad(href, function (err, data) { - if (err) { - console.log("unable to forget pad"); - console.error(err); - return; - } - var parsed = Cryptpad.parsePadUrl(href); - document.title = Cryptpad.getDefaultName(parsed, []); - }); - }); - }); + var forgetCb = function (err, title) { + if (err) { return; } + document.title = title; + }; + var $forgetPad = Cryptpad.createButton('forget', true, {}, forgetCb); $rightside.append($forgetPad); if (!readOnly && viewHash) { /* add a 'links' button */ - var $links = Cryptpad.createButton('readonly', true) - .click(function () { - var baseUrl = window.location.origin + window.location.pathname + '#'; - var content = '' + Messages.readonlyUrl + '' + baseUrl + viewHash + ''; - Cryptpad.alert(content); - }); + var $links = Cryptpad.createButton('readonly', true, {viewHash: viewHash}); $rightside.append($links); } diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js index 519c5014e..be886517b 100644 --- a/www/common/cryptpad-common.js +++ b/www/common/cryptpad-common.js @@ -5,11 +5,12 @@ define([ '/bower_components/chainpad-crypto/crypto.js', '/bower_components/alertifyjs/dist/js/alertify.js', '/bower_components/spin.js/spin.min.js', + '/common/clipboard.js', '/customize/user.js', '/bower_components/jquery/dist/jquery.min.js', -], function (Config, Messages, Store, Crypto, Alertify, Spinner, User) { +], function (Config, Messages, Store, Crypto, Alertify, Spinner, Clipboard, User) { /* This file exposes functionality which is specific to Cryptpad, but not to any particular pad type. This includes functions for committing metadata about pads to your local storage for future use and improved usability. @@ -627,7 +628,7 @@ define([ /* * Buttons */ - var createButton = common.createButton = function (type, rightside) { + var createButton = common.createButton = function (type, rightside, data, callback) { var button; var size = "17px"; switch (type) { @@ -637,6 +638,9 @@ define([ 'class': "fa fa-download", style: 'font:'+size+' FontAwesome' }); + if (callback) { + button.click(callback); + } break; case 'import': button = $('', { @@ -644,6 +648,11 @@ define([ 'class': "fa fa-upload", style: 'font:'+size+' FontAwesome' }); + if (callback) { + button.click(common.importContent('text/plain', function (content, file) { + callback(content, file); + })); + } break; case 'rename': button = $('', { @@ -652,6 +661,40 @@ define([ 'class': "fa fa-bookmark cryptpad-rename", style: 'font:'+size+' FontAwesome' }); + if (data && data.suggestName && callback) { + var suggestName = data.suggestName; + button.click(function() { + var suggestion = suggestName(); + + common.prompt(Messages.renamePrompt, + suggestion, function (title, ev) { + if (title === null) { return; } + + common.causesNamingConflict(title, function (err, conflicts) { + if (err) { + console.log("Unable to determine if name caused a conflict"); + console.error(err); + callback(err, title); + return; + } + + if (conflicts) { + common.alert(Messages.renameConflict); + return; + } + + common.setPadTitle(title, function (err, data) { + if (err) { + console.log("unable to set pad title"); + console.log(err); + return; + } + callback(null, title); + }); + }); + }); + }); + } break; case 'forget': button = $('', { @@ -660,6 +703,25 @@ define([ 'class': "fa fa-trash cryptpad-forget", style: 'font:'+size+' FontAwesome' }); + if (callback) { + button.click(function() { + var href = window.location.href; + common.confirm(Messages.forgetPrompt, function (yes) { + if (!yes) { return; } + common.forgetPad(href, function (err, data) { + if (err) { + console.log("unable to forget pad"); + console.error(err); + callback(err, null); + return; + } + var parsed = common.parsePadUrl(href); + callback(null, common.getDefaultName(parsed, [])); + }); + }); + + }); + } break; case 'username': button = $('', { @@ -667,6 +729,14 @@ define([ 'class': "fa fa-user", style: 'font:'+size+' FontAwesome' }); + if (data && data.lastName && callback) { + var lastName = data.lastName; + button.click(function() { + common.prompt(Messages.changeNamePrompt, lastName, function (newName) { + callback(newName); + }); + }); + } break; case 'readonly': button = $('', { @@ -674,6 +744,37 @@ define([ 'class': "fa fa-eye", style: 'font:'+size+' FontAwesome' }); + if (data && data.viewHash) { + var viewHash = data.viewHash; + button.click(function() { + var baseUrl = window.location.origin + window.location.pathname + '#'; + var url = baseUrl + viewHash; + var $content = $('').text(Messages.readonlyUrl); + var $copy = $('', { + id: "cryptpad-readonly-copy", + 'class': "button action" + }).text(Messages.copyReadOnly); + var $open = $('', { + id: "cryptpad-readonly-open", + 'class': "button action" + }).text(Messages.openReadOnly); + $content.append('').append($copy).append($open); + common.alert($content.html()); + $("#cryptpad-readonly-copy").click(function() { + var success = Clipboard.copy(url); + if (success) { + common.log(Messages.shareSuccess); + common.findOKButton().click(); + return; + } + }); + $("#cryptpad-readonly-open").click(function() { + window.open(url); + }); + + if (callback) { callback(); } + }); + } break; case 'present': button = $('', { diff --git a/www/pad/main.js b/www/pad/main.js index 7b74ae67f..e243f3e0a 100644 --- a/www/pad/main.js +++ b/www/pad/main.js @@ -498,6 +498,11 @@ define([ saveAs(blob, filename); }); }; + var importFile = function (content, file) { + var shjson = stringify(Hyperjson.fromDOM(domFromHTML(content).body)); + applyHjson(shjson); + realtimeOptions.onLocal(); + }; var onInit = realtimeOptions.onInit = function (info) { var $bar = $('#pad-iframe')[0].contentWindow.$('#cke_1_toolbox'); @@ -518,80 +523,44 @@ define([ editHash = Cryptpad.getEditHashFromKeys(info.channel, secret.keys); } + /* add a "change username" button */ getLastName(function (err, lastName) { - var $username = Cryptpad.createButton('username', true) - .click(function() { - Cryptpad.prompt(Messages.changeNamePrompt, lastName, function (newName) { - setName(newName); - }); - }); + var usernameCb = function (newName) { + setName (newName); + }; + var $username = Cryptpad.createButton('username', true, {lastName: lastName}, usernameCb); $rightside.append($username); }); /* add an export button */ - var $export = Cryptpad.createButton('export', true).click(exportFile); + var $export = Cryptpad.createButton('export', true, {}, exportFile); $rightside.append($export); if (!readOnly) { /* add an import button */ - var $import = Cryptpad.createButton('import', true) - .click(Cryptpad.importContent('text/plain', function (content) { - var shjson = stringify(Hyperjson.fromDOM(domFromHTML(content).body)); - applyHjson(shjson); - realtimeOptions.onLocal(); - })); + var $import = Cryptpad.createButton('import', true, {}, importFile); $rightside.append($import); - /* add a rename button */ - var $rename = Cryptpad.createButton('rename', true) - .click(function () { - var suggestion = suggestName(); - - Cryptpad.prompt(Messages.renamePrompt, suggestion, function (title) { - if (title === null) { return; } - Cryptpad.causesNamingConflict(title, function (err, conflicts) { - if (conflicts) { - Cryptpad.alert(Messages.renameConflict); - return; - } - - Cryptpad.setPadTitle(title, function (err, data) { - if (err) { - console.log("Couldn't set pad title"); - console.error(err); - return; - } - document.title = title; - editor.fire('change'); - }); - }); - }); - }); - $rightside.append($rename); - } + /* add a rename button */ + var renameCb = function (err, title) { + if (err) { return; } + document.title = title; + editor.fire('change'); + }; + var $setTitle = Cryptpad.createButton('rename', true, {suggestName: suggestName}, renameCb); + $rightside.append($setTitle); /* add a forget button */ - var $forgetPad = Cryptpad.createButton('forget', true) - .click(function () { - var href = window.location.href; - Cryptpad.confirm(Messages.forgetPrompt, function (yes) { - if (!yes) { return; } - Cryptpad.forgetPad(href, function (err, data) { - var parsed = Cryptpad.parsePadUrl(href); - document.title = Cryptpad.getDefaultName(parsed, []); - }); - }); - }); + var forgetCb = function (err, title) { + if (err) { return; } + document.title = title; + }; + var $forgetPad = Cryptpad.createButton('forget', true, {}, forgetCb); $rightside.append($forgetPad); if (!readOnly && viewHash) { /* add a 'links' button */ - var $links = Cryptpad.createButton('readonly', true) - .click(function () { - var baseUrl = window.location.origin + window.location.pathname + '#'; - var content = '' + Messages.readonlyUrl + '' + baseUrl + viewHash + ''; - Cryptpad.alert(content); - }); + var $links = Cryptpad.createButton('readonly', true, {viewHash: viewHash}); $rightside.append($links); } diff --git a/www/poll/main.js b/www/poll/main.js index 05c452f5a..8c8c540c6 100644 --- a/www/poll/main.js +++ b/www/poll/main.js @@ -456,6 +456,21 @@ define([ module.tabNotification = Notify.tab(1000, 10); }; + var updateTitle = function (newTitle) { + if (newTitle === document.title) { return; } + // 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) { + if (err) { + console.log("Couldn't set pad title"); + console.error(err); + document.title = oldTitle; + return; + } + }); + }; + // don't make changes until the interface is ready setEditable(false); @@ -464,9 +479,12 @@ define([ module.ready = true; var proxy = module.rt.proxy; - var First = false; + if (proxy.metadata && proxy.metadata.title) { + updateTitle(proxy.metadata.title); + } + // ensure that proxy.info and proxy.table exist ['info', 'table'].forEach(function (k) { if (typeof(proxy[k]) === 'undefined') { @@ -627,19 +645,8 @@ define([ } }) .on('change', ['metadata'], function (o, n, p) { - var newTitle = n.title; - if (newTitle === document.title) { return; } - // 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) { - if (err) { - console.log("Couldn't set pad title"); - console.error(err); - document.title = oldTitle; - return; - } - }); + var newTitle = proxy.metadata.title; + updateTitle(newTitle); }) .on('remove', [], function (o, p, root) { //console.log("remove: (%s, [%s])", o, p.join(', ')); @@ -704,60 +711,35 @@ define([ } }; - $toolbar.append(Button({ - id: 'forget', - 'class': 'forget button action', - title: Messages.forgetButtonTitle, - }).text(Messages.forgetButton).click(function () { - var href = window.location.href; - Cryptpad.confirm(Messages.forgetPrompt, function (yes) { - if (!yes) { return; } - Cryptpad.forgetPad(href, function (err, data) { - if (err) { - console.log("unable to forget pad"); - console.error(err); - return; - } - var parsed = Cryptpad.parsePadUrl(href); - document.title = Cryptpad.getDefaultName(parsed, []); - }); - }); - })); - - $toolbar.append(Button({ - id: 'rename', - 'class': 'rename button action', - title: Messages.renameButtonTitle, - }).text(Messages.renameButton).click(function () { - var suggestion = suggestName(); - Cryptpad.prompt(Messages.renamePrompt, - suggestion, function (title, ev) { - if (title === null) { return; } - - Cryptpad.causesNamingConflict(title, function (err, conflicts) { - if (conflicts) { - Cryptpad.alert(Messages.renameConflict); - return; - } - Cryptpad.setPadTitle(title, function (err, data) { - if (err) { - console.log("unable to set pad title"); - console.error(err); - return; - } - document.title = title; - module.tabNotification.update(title); - var proxy = module.rt.proxy; - if (proxy.metadata) { - proxy.metadata.title = title; - } - else { - proxy.metadata = {title: title}; - } - }); - }); - }); - })); + /* add a forget button */ + var forgetCb = function (err, title) { + if (err) { return; } + document.title = title; + }; + var $forgetPad = Cryptpad.createButton('forget', false, {}, forgetCb) + .text(Messages.forgetButton) + .removeAttr('style') + .attr('class', 'action button forget'); + $toolbar.append($forgetPad); + + /* add a rename button */ + var renameCb = function (err, title) { + if (err) { return; } + document.title = title; + module.tabNotification && module.tabNotification.update(title); + var proxy = module.rt.proxy; + if (proxy.metadata) { + proxy.metadata.title = title; + } + else { + proxy.metadata = {title: title}; + } + }; + var $setTitle = Cryptpad.createButton('rename', true, {suggestName: suggestName}, renameCb) + .text(Messages.renameButton) + .removeAttr('style') + .attr('class', 'action button rename'); + $toolbar.append($setTitle); if (!readOnly) { $toolbar.append(Button({ @@ -774,16 +756,10 @@ define([ if (!readOnly && module.viewHash) { /* add a 'links' button */ - var $links = $('', { - title: Messages.getViewButtonTitle - }) + var $links = Cryptpad.createButton('readonly', true, {viewHash: module.viewHash}) .text(Messages.getViewButton) - .addClass('button action') - .click(function () { - var baseUrl = window.location.origin + window.location.pathname + '#'; - var content = '' + Messages.readonlyUrl + '' + baseUrl + module.viewHash + ''; - Cryptpad.alert(content); - }); + .removeAttr('style') + .attr('class', 'action button readonly'); $toolbar.append($links); } diff --git a/www/slide/main.js b/www/slide/main.js index f0f139a6a..fd1835355 100644 --- a/www/slide/main.js +++ b/www/slide/main.js @@ -14,11 +14,10 @@ define([ '/common/visible.js', '/common/notify.js', '/slide/slide.js', - '/common/clipboard.js', '/bower_components/file-saver/FileSaver.min.js', '/bower_components/jquery/dist/jquery.min.js', '/customize/pad.js' -], function (Config, /*RTCode,*/ Messages, Crypto, Realtime, TextPatcher, Toolbar, JSONSortify, JsonOT, Cryptpad, Modes, Themes, Visible, Notify, Slide, Clipboard) { +], function (Config, /*RTCode,*/ Messages, Crypto, Realtime, TextPatcher, Toolbar, JSONSortify, JsonOT, Cryptpad, Modes, Themes, Visible, Notify, Slide) { var $ = window.jQuery; var saveAs = window.saveAs; @@ -285,6 +284,32 @@ define([ saveAs(blob, filename); }); }; + var importText = function (content, file) { + var $bar = $('#pad-iframe')[0].contentWindow.$('#cme_toolbox'); + var mode; + var mime = CodeMirror.findModeByMIME(file.type); + + if (!mime) { + var ext = /.+\.([^.]+)$/.exec(file.name); + if (ext[1]) { + mode = CodeMirror.findModeByExtension(ext[1]); + } + } else { + mode = mime && mime.mode || null; + } + + if (mode && Modes.list.some(function (o) { return o.mode === mode; })) { + setMode(mode); + $bar.find('#language-mode').val(mode); + } else { + console.log("Couldn't find a suitable highlighting mode: %s", mode); + setMode('text'); + $bar.find('#language-mode').val('text'); + } + + editor.setValue(content); + onLocal(); + }; var onInit = config.onInit = function (info) { var $bar = $('#pad-iframe')[0].contentWindow.$('#cme_toolbox'); @@ -305,116 +330,46 @@ define([ editHash = Cryptpad.getEditHashFromKeys(info.channel, secret.keys); } + /* add a "change username" button */ getLastName(function (err, lastName) { - var $username = Cryptpad.createButton('username', true) - .click(function() { - Cryptpad.prompt(Messages.changeNamePrompt, lastName, function (newName) { - setName(newName); - }); - }); + var usernameCb = function (newName) { + setName (newName); + }; + var $username = Cryptpad.createButton('username', true, {lastName: lastName}, usernameCb); $rightside.append($username); }); /* add an export button */ - var $export = Cryptpad.createButton('export', true).click(exportText); + var $export = Cryptpad.createButton('export', true, {}, exportText); $rightside.append($export); if (!readOnly) { /* add an import button */ - var $import = Cryptpad.createButton('import', true) - .click(Cryptpad.importContent('text/plain', function (content, file) { - var mode; - var mime = CodeMirror.findModeByMIME(file.type); - - if (!mime) { - var ext = /.+\.([^.]+)$/.exec(file.name); - if (ext[1]) { - mode = CodeMirror.findModeByExtension(ext[1]); - } - } else { - mode = mime && mime.mode || null; - } - - if (mode && Modes.list.some(function (o) { return o.mode === mode; })) { - setMode(mode); - $bar.find('#language-mode').val(mode); - } else { - console.log("Couldn't find a suitable highlighting mode: %s", mode); - setMode('text'); - $bar.find('#language-mode').val('text'); - } - - editor.setValue(content); - onLocal(); - })); + var $import = Cryptpad.createButton('import', true, {}, importText); $rightside.append($import); - /* add a rename button */ - var $setTitle = Cryptpad.createButton('rename', true) - .click(function () { - var suggestion = suggestName(); - - Cryptpad.prompt(Messages.renamePrompt, - suggestion, function (title, ev) { - if (title === null) { return; } - - Cryptpad.causesNamingConflict(title, function (err, conflicts) { - if (err) { - console.log("Unable to determine if name caused a conflict"); - console.error(err); - return; - } - - if (conflicts) { - Cryptpad.alert(Messages.renameConflict); - return; - } - - Cryptpad.setPadTitle(title, function (err, data) { - if (err) { - console.log("unable to set pad title"); - console.log(err); - return; - } - APP.title = title; - setTabTitle(); - onLocal(); - }); - }); - }); - }); - $rightside.append($setTitle); - } + /* add a rename button */ + var renameCb = function (err, title) { + if (err) { return; } + APP.title = title; + setTabTitle(); + onLocal(); + }; + var $setTitle = Cryptpad.createButton('rename', true, {suggestName: suggestName}, renameCb); + $rightside.append($setTitle); /* add a forget button */ - var $forgetPad = Cryptpad.createButton('forget', true) - .click(function () { - var href = window.location.href; - Cryptpad.confirm(Messages.forgetPrompt, function (yes) { - if (!yes) { return; } - Cryptpad.forgetPad(href, function (err, data) { - if (err) { - console.log("unable to forget pad"); - console.error(err); - return; - } - var parsed = Cryptpad.parsePadUrl(href); - APP.title = Cryptpad.getDefaultName(parsed, []); - setTabTitle(); - }); - }); - }); + var forgetCb = function (err, title) { + if (err) { return; } + APP.title = title; + setTabTitle(); + }; + var $forgetPad = Cryptpad.createButton('forget', true, {}, forgetCb); $rightside.append($forgetPad); if (!readOnly && viewHash) { /* add a 'links' button */ - var $links = Cryptpad.createButton('readonly', true) - .click(function () { - var baseUrl = window.location.origin + window.location.pathname + '#'; - var url = baseUrl + viewHash + '/present'; - var content = '' + Messages.readonlyUrl + '' + url + ''; - Cryptpad.alert(content); - }); + var $links = Cryptpad.createButton('readonly', true, {viewHash: viewHash + '/present'}); $rightside.append($links); }