Display a button to open the editing link while in read-only mode if we know it
This commit is contained in:
parent
27241488a5
commit
2a1b241592
@ -76,9 +76,11 @@ define(function () {
|
|||||||
out.backgroundButtonTitle = 'Changer la couleur de fond de la présentation';
|
out.backgroundButtonTitle = 'Changer la couleur de fond de la présentation';
|
||||||
out.colorButtonTitle = 'Changer la couleur du texte en mode présentation';
|
out.colorButtonTitle = 'Changer la couleur du texte en mode présentation';
|
||||||
|
|
||||||
out.editShare = "Partager le lien d'édition";
|
out.editShare = "Lien d'édition";
|
||||||
out.editShareTitle = "Copier le lien d'édition dans le presse-papiers";
|
out.editShareTitle = "Copier le lien d'édition dans le presse-papiers";
|
||||||
out.viewShare = "Partager lien de lecture-seule";
|
out.editOpen = "Éditer dans un nouvel onglet";
|
||||||
|
out.editOpenTitle = "Ouvrir le lien d'édition dans un nouvel onglet";
|
||||||
|
out.viewShare = "Lien de lecture-seule";
|
||||||
out.viewShareTitle = "Copier lien d'accès en lecture seule dans le presse-papiers";
|
out.viewShareTitle = "Copier lien d'accès en lecture seule dans le presse-papiers";
|
||||||
out.viewOpen = "Voir dans un nouvel onglet";
|
out.viewOpen = "Voir dans un nouvel onglet";
|
||||||
out.viewOpenTitle = "Ouvrir le lien en lecture seule dans un nouvel onglet";
|
out.viewOpenTitle = "Ouvrir le lien en lecture seule dans un nouvel onglet";
|
||||||
|
|||||||
@ -80,9 +80,11 @@ define(function () {
|
|||||||
|
|
||||||
out.editShare = "Editing link";
|
out.editShare = "Editing link";
|
||||||
out.editShareTitle = "Copy the editing link to clipboard";
|
out.editShareTitle = "Copy the editing link to clipboard";
|
||||||
|
out.editOpen = "Open editing link in a new tab";
|
||||||
|
out.editOpenTitle = "Open this pad in editing mode in a new tab";
|
||||||
out.viewShare = "Read-only link";
|
out.viewShare = "Read-only link";
|
||||||
out.viewShareTitle = "Copy the read-only link to clipboard";
|
out.viewShareTitle = "Copy the read-only link to clipboard";
|
||||||
out.viewOpen = "Open read-only link in new tab";
|
out.viewOpen = "Open read-only link in a new tab";
|
||||||
out.viewOpenTitle = "Open this pad in read-only mode in a new tab";
|
out.viewOpenTitle = "Open this pad in read-only mode in a new tab";
|
||||||
|
|
||||||
out.notifyJoined = "{0} has joined the collaborative session";
|
out.notifyJoined = "{0} has joined the collaborative session";
|
||||||
|
|||||||
@ -374,6 +374,10 @@ define([
|
|||||||
userData: userData,
|
userData: userData,
|
||||||
readOnly: readOnly,
|
readOnly: readOnly,
|
||||||
ifrw: ifrw,
|
ifrw: ifrw,
|
||||||
|
share: {
|
||||||
|
secret: secret,
|
||||||
|
channel: info.channel
|
||||||
|
},
|
||||||
title: {
|
title: {
|
||||||
onRename: renameCb,
|
onRename: renameCb,
|
||||||
defaultName: defaultName,
|
defaultName: defaultName,
|
||||||
@ -386,8 +390,6 @@ define([
|
|||||||
|
|
||||||
var $rightside = $bar.find('.' + Toolbar.constants.rightside);
|
var $rightside = $bar.find('.' + Toolbar.constants.rightside);
|
||||||
var $userBlock = $bar.find('.' + Toolbar.constants.username);
|
var $userBlock = $bar.find('.' + Toolbar.constants.username);
|
||||||
var $editShare = $bar.find('.' + Toolbar.constants.editShare);
|
|
||||||
var $viewShare = $bar.find('.' + Toolbar.constants.viewShare);
|
|
||||||
var $usernameButton = module.$userNameButton = $($bar.find('.' + Toolbar.constants.changeUsername));
|
var $usernameButton = module.$userNameButton = $($bar.find('.' + Toolbar.constants.changeUsername));
|
||||||
|
|
||||||
var editHash;
|
var editHash;
|
||||||
@ -419,17 +421,6 @@ define([
|
|||||||
var $forgetPad = Cryptpad.createButton('forget', true, {}, forgetCb);
|
var $forgetPad = Cryptpad.createButton('forget', true, {}, forgetCb);
|
||||||
$rightside.append($forgetPad);
|
$rightside.append($forgetPad);
|
||||||
|
|
||||||
if (!readOnly) {
|
|
||||||
$editShare.append(Cryptpad.createButton('editshare', false, {editHash: editHash}));
|
|
||||||
}
|
|
||||||
if (viewHash) {
|
|
||||||
/* add a 'links' button */
|
|
||||||
$viewShare.append(Cryptpad.createButton('viewshare', false, {viewHash: viewHash}));
|
|
||||||
if (!readOnly) {
|
|
||||||
$viewShare.append(Cryptpad.createButton('viewopen', false, {viewHash: viewHash}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var configureLanguage = function (cb) {
|
var configureLanguage = function (cb) {
|
||||||
// FIXME this is async so make it happen as early as possible
|
// FIXME this is async so make it happen as early as possible
|
||||||
var options = [];
|
var options = [];
|
||||||
|
|||||||
@ -22,6 +22,7 @@ define([
|
|||||||
var common = window.Cryptpad = {
|
var common = window.Cryptpad = {
|
||||||
Messages: Messages,
|
Messages: Messages,
|
||||||
Alertify: Alertify,
|
Alertify: Alertify,
|
||||||
|
Clipboard: Clipboard
|
||||||
};
|
};
|
||||||
|
|
||||||
var store;
|
var store;
|
||||||
@ -223,6 +224,7 @@ define([
|
|||||||
if (typeof keys === 'string') {
|
if (typeof keys === 'string') {
|
||||||
return chanKey + keys;
|
return chanKey + keys;
|
||||||
}
|
}
|
||||||
|
if (!keys.editKeyStr) { return; }
|
||||||
return '/1/edit/' + hexToBase64(chanKey) + '/' + Crypto.b64RemoveSlashes(keys.editKeyStr);
|
return '/1/edit/' + hexToBase64(chanKey) + '/' + Crypto.b64RemoveSlashes(keys.editKeyStr);
|
||||||
};
|
};
|
||||||
var getViewHashFromKeys = common.getViewHashFromKeys = function (chanKey, keys) {
|
var getViewHashFromKeys = common.getViewHashFromKeys = function (chanKey, keys) {
|
||||||
@ -304,6 +306,18 @@ define([
|
|||||||
return secret;
|
return secret;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var getHashes = common.getHashes = function (channel, secret) {
|
||||||
|
var hashes = {};
|
||||||
|
if (secret.keys.editKeyStr) {
|
||||||
|
hashes.editHash = getEditHashFromKeys(channel, secret.keys);
|
||||||
|
}
|
||||||
|
if (secret.keys.viewKeyStr) {
|
||||||
|
hashes.viewHash = getViewHashFromKeys(channel, secret.keys);
|
||||||
|
}
|
||||||
|
return hashes;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
var uint8ArrayToHex = common.uint8ArrayToHex = function (a) {
|
var uint8ArrayToHex = common.uint8ArrayToHex = function (a) {
|
||||||
// call slice so Uint8Arrays work as expected
|
// call slice so Uint8Arrays work as expected
|
||||||
return Array.prototype.slice.call(a).map(function (e, i) {
|
return Array.prototype.slice.call(a).map(function (e, i) {
|
||||||
@ -607,22 +621,30 @@ define([
|
|||||||
};
|
};
|
||||||
|
|
||||||
// STORAGE
|
// STORAGE
|
||||||
var isNotStrongestStored = common.isNotStrongestStored = function (href, recents) {
|
var findStronger = common.findStronger = function (href, recents) {
|
||||||
var parsed = parsePadUrl(href);
|
var rHref = href || getRelativeHref(window.location.href);
|
||||||
|
var parsed = parsePadUrl(rHref);
|
||||||
if (!parsed.hash) { return false; }
|
if (!parsed.hash) { return false; }
|
||||||
return recents.some(function (pad) {
|
var stronger;
|
||||||
|
recents.some(function (pad) {
|
||||||
var p = parsePadUrl(pad.href);
|
var p = parsePadUrl(pad.href);
|
||||||
if (p.type !== parsed.type) { return false; } // Not the same type
|
if (p.type !== parsed.type) { return; } // Not the same type
|
||||||
if (p.hash === parsed.hash) { return false; } // Same hash, not stronger
|
if (p.hash === parsed.hash) { return; } // Same hash, not stronger
|
||||||
var pHash = parseHash(p.hash);
|
var pHash = parseHash(p.hash);
|
||||||
var parsedHash = parseHash(parsed.hash);
|
var parsedHash = parseHash(parsed.hash);
|
||||||
if (!parsedHash || !pHash) { return; }
|
if (!parsedHash || !pHash) { return; }
|
||||||
if (pHash.version !== parsedHash.version) { return false; }
|
if (pHash.version !== parsedHash.version) { return; }
|
||||||
if (pHash.channel !== parsedHash.channel) { return false; }
|
if (pHash.channel !== parsedHash.channel) { return; }
|
||||||
if (pHash.mode === 'edit' && parsedHash.mode === 'view') { return true; }
|
if (pHash.mode === 'edit' && parsedHash.mode === 'view') {
|
||||||
if (pHash.mode === parsedHash.mode && parsedHash.present) { return true; }
|
stronger = pad.href;
|
||||||
return false;
|
return true;
|
||||||
|
}
|
||||||
|
return;
|
||||||
});
|
});
|
||||||
|
return stronger;
|
||||||
|
};
|
||||||
|
var isNotStrongestStored = common.isNotStrongestStored = function (href, recents) {
|
||||||
|
return findStronger(href, recents);
|
||||||
};
|
};
|
||||||
var setPadTitle = common.setPadTitle = function (name, cb) {
|
var setPadTitle = common.setPadTitle = function (name, cb) {
|
||||||
var href = window.location.href;
|
var href = window.location.href;
|
||||||
@ -986,6 +1008,7 @@ define([
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
// TODO remove editshare, viewshare, and viewopen
|
||||||
case 'editshare':
|
case 'editshare':
|
||||||
button = $('<a>', {
|
button = $('<a>', {
|
||||||
title: Messages.editShareTitle,
|
title: Messages.editShareTitle,
|
||||||
|
|||||||
@ -123,16 +123,89 @@ define([
|
|||||||
|
|
||||||
// Share button
|
// Share button
|
||||||
if (config.displayed.indexOf('share') !== -1) {
|
if (config.displayed.indexOf('share') !== -1) {
|
||||||
|
var secret = Cryptpad.find(config, ['share', 'secret']);
|
||||||
|
var channel = Cryptpad.find(config, ['share', 'channel']);
|
||||||
|
if (!secret || !channel) {
|
||||||
|
throw new Error("Unable to display the share button: share.secret and share.channel required");
|
||||||
|
}
|
||||||
|
Cryptpad.getRecentPads(function (err, recent) {
|
||||||
var $shareIcon = $('<span>', {'class': 'fa fa-share-alt'});
|
var $shareIcon = $('<span>', {'class': 'fa fa-share-alt'});
|
||||||
var $span = $('<span>', {'class': 'large'}).append(' ' +Messages.shareButton);
|
var $span = $('<span>', {'class': 'large'}).append(' ' +Messages.shareButton);
|
||||||
|
var hashes = Cryptpad.getHashes(channel, secret);
|
||||||
|
var options = [];
|
||||||
|
|
||||||
|
// If we have a stronger version in drive, add it and add a redirect button
|
||||||
|
var stronger = recent && Cryptpad.findStronger(null, recent);
|
||||||
|
if (stronger) {
|
||||||
|
var parsed = Cryptpad.parsePadUrl(stronger);
|
||||||
|
hashes.editHash = parsed.hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hashes.editHash) {
|
||||||
|
options.push({
|
||||||
|
tag: 'a',
|
||||||
|
attributes: {title: Messages.editShareTitle, 'class': 'editShare'},
|
||||||
|
content: '<span class="fa fa-users"></span> ' + Messages.editShare
|
||||||
|
});
|
||||||
|
if (stronger) {
|
||||||
|
// We're in view mode, display the "open editing link" button
|
||||||
|
options.push({
|
||||||
|
tag: 'a',
|
||||||
|
attributes: {
|
||||||
|
title: Messages.editOpenTitle,
|
||||||
|
'class': 'editOpen',
|
||||||
|
href: window.location.pathname + '#' + hashes.editHash,
|
||||||
|
target: '_blank'
|
||||||
|
},
|
||||||
|
content: '<span class="fa fa-users"></span> ' + Messages.editOpen
|
||||||
|
});
|
||||||
|
}
|
||||||
|
options.push({tag: 'hr'});
|
||||||
|
}
|
||||||
|
if (hashes.viewHash) {
|
||||||
|
options.push({
|
||||||
|
tag: 'a',
|
||||||
|
attributes: {title: Messages.viewShareTitle, 'class': 'viewShare'},
|
||||||
|
content: '<span class="fa fa-eye"></span> ' + Messages.viewShare
|
||||||
|
});
|
||||||
|
if (hashes.editHash && !stronger) {
|
||||||
|
// We're in edit mode, display the "open readonly" button
|
||||||
|
options.push({
|
||||||
|
tag: 'a',
|
||||||
|
attributes: {
|
||||||
|
title: Messages.viewOpenTitle,
|
||||||
|
'class': 'viewOpen',
|
||||||
|
href: window.location.pathname + '#' + hashes.viewHash,
|
||||||
|
target: '_blank'
|
||||||
|
},
|
||||||
|
content: '<span class="fa fa-eye"></span> ' + Messages.viewOpen
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
var dropdownConfigShare = {
|
var dropdownConfigShare = {
|
||||||
text: $('<div>').append($shareIcon).append($span).html(),
|
text: $('<div>').append($shareIcon).append($span).html(),
|
||||||
options: []
|
options: options
|
||||||
};
|
};
|
||||||
var $shareBlock = Cryptpad.createDropdown(dropdownConfigShare);
|
var $shareBlock = Cryptpad.createDropdown(dropdownConfigShare);
|
||||||
$shareBlock.find('button').attr('id', 'shareButton');
|
$shareBlock.find('button').attr('id', 'shareButton');
|
||||||
$shareBlock.find('.dropdown-bar-content').addClass(SHARE_CLS).addClass(EDITSHARE_CLS).addClass(VIEWSHARE_CLS);
|
$shareBlock.find('.dropdown-bar-content').addClass(SHARE_CLS).addClass(EDITSHARE_CLS).addClass(VIEWSHARE_CLS);
|
||||||
$userlistElement.append($shareBlock);
|
$userlistElement.append($shareBlock);
|
||||||
|
|
||||||
|
if (hashes.editHash) {
|
||||||
|
$shareBlock.find('a.editShare').click(function () {
|
||||||
|
var url = window.location.origin + window.location.pathname + '#' + hashes.editHash;
|
||||||
|
var success = Cryptpad.Clipboard.copy(url);
|
||||||
|
if (success) { Cryptpad.log(Messages.shareSuccess); }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (hashes.viewHash) {
|
||||||
|
$shareBlock.find('a.viewShare').click(function () {
|
||||||
|
var url = window.location.origin + window.location.pathname + '#' + hashes.viewHash;
|
||||||
|
var success = Cryptpad.Clipboard.copy(url);
|
||||||
|
if (success) { Cryptpad.log(Messages.shareSuccess); }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -561,6 +561,10 @@ define([
|
|||||||
userData: userData,
|
userData: userData,
|
||||||
readOnly: readOnly,
|
readOnly: readOnly,
|
||||||
ifrw: ifrw,
|
ifrw: ifrw,
|
||||||
|
share: {
|
||||||
|
secret: secret,
|
||||||
|
channel: info.channel
|
||||||
|
},
|
||||||
title: {
|
title: {
|
||||||
onRename: renameCb,
|
onRename: renameCb,
|
||||||
defaultName: defaultName,
|
defaultName: defaultName,
|
||||||
@ -573,8 +577,6 @@ define([
|
|||||||
|
|
||||||
var $rightside = $bar.find('.' + Toolbar.constants.rightside);
|
var $rightside = $bar.find('.' + Toolbar.constants.rightside);
|
||||||
var $userBlock = $bar.find('.' + Toolbar.constants.username);
|
var $userBlock = $bar.find('.' + Toolbar.constants.username);
|
||||||
var $editShare = $bar.find('.' + Toolbar.constants.editShare);
|
|
||||||
var $viewShare = $bar.find('.' + Toolbar.constants.viewShare);
|
|
||||||
var $usernameButton = module.$userNameButton = $($bar.find('.' + Toolbar.constants.changeUsername));
|
var $usernameButton = module.$userNameButton = $($bar.find('.' + Toolbar.constants.changeUsername));
|
||||||
|
|
||||||
var editHash;
|
var editHash;
|
||||||
@ -624,20 +626,6 @@ define([
|
|||||||
var $forgetPad = Cryptpad.createButton('forget', true, {}, forgetCb);
|
var $forgetPad = Cryptpad.createButton('forget', true, {}, forgetCb);
|
||||||
$rightside.append($forgetPad);
|
$rightside.append($forgetPad);
|
||||||
|
|
||||||
if (!readOnly) {
|
|
||||||
$editShare.append(Cryptpad.createButton('editshare', false, {editHash: editHash}));
|
|
||||||
if (viewHash) {
|
|
||||||
$editShare.append($('<hr>'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (viewHash) {
|
|
||||||
/* add a 'links' button */
|
|
||||||
$viewShare.append(Cryptpad.createButton('viewshare', false, {viewHash: viewHash}));
|
|
||||||
if (!readOnly) {
|
|
||||||
$viewShare.append(Cryptpad.createButton('viewopen', false, {viewHash: viewHash}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the hash
|
// set the hash
|
||||||
if (!readOnly) { Cryptpad.replaceHash(editHash); }
|
if (!readOnly) { Cryptpad.replaceHash(editHash); }
|
||||||
|
|
||||||
|
|||||||
@ -687,6 +687,10 @@ define([
|
|||||||
displayed: ['useradmin', 'language', 'spinner', 'lag', 'state', 'share', 'userlist', 'newpad'],
|
displayed: ['useradmin', 'language', 'spinner', 'lag', 'state', 'share', 'userlist', 'newpad'],
|
||||||
userData: userData,
|
userData: userData,
|
||||||
readOnly: readOnly,
|
readOnly: readOnly,
|
||||||
|
share: {
|
||||||
|
secret: secret,
|
||||||
|
channel: info.channel
|
||||||
|
},
|
||||||
title: {
|
title: {
|
||||||
onRename: renameCb,
|
onRename: renameCb,
|
||||||
defaultName: defaultName,
|
defaultName: defaultName,
|
||||||
@ -712,17 +716,6 @@ define([
|
|||||||
var $forgetPad = Cryptpad.createButton('forget', true, {}, forgetCb);
|
var $forgetPad = Cryptpad.createButton('forget', true, {}, forgetCb);
|
||||||
$rightside.append($forgetPad);
|
$rightside.append($forgetPad);
|
||||||
|
|
||||||
if (!readOnly) {
|
|
||||||
$editShare.append(Cryptpad.createButton('editshare', false, {editHash: editHash}));
|
|
||||||
}
|
|
||||||
if (viewHash) {
|
|
||||||
/* add a 'links' button */
|
|
||||||
$viewShare.append(Cryptpad.createButton('viewshare', false, {viewHash: viewHash}));
|
|
||||||
if (!readOnly) {
|
|
||||||
$viewShare.append(Cryptpad.createButton('viewopen', false, {viewHash: viewHash}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the hash
|
// set the hash
|
||||||
if (!readOnly) { Cryptpad.replaceHash(editHash); }
|
if (!readOnly) { Cryptpad.replaceHash(editHash); }
|
||||||
|
|
||||||
|
|||||||
@ -417,6 +417,10 @@ define([
|
|||||||
userData: userData,
|
userData: userData,
|
||||||
readOnly: readOnly,
|
readOnly: readOnly,
|
||||||
ifrw: ifrw,
|
ifrw: ifrw,
|
||||||
|
share: {
|
||||||
|
secret: secret,
|
||||||
|
channel: info.channel
|
||||||
|
},
|
||||||
title: {
|
title: {
|
||||||
onRename: renameCb,
|
onRename: renameCb,
|
||||||
defaultName: defaultName,
|
defaultName: defaultName,
|
||||||
@ -429,8 +433,6 @@ define([
|
|||||||
|
|
||||||
var $rightside = $bar.find('.' + Toolbar.constants.rightside);
|
var $rightside = $bar.find('.' + Toolbar.constants.rightside);
|
||||||
var $userBlock = $bar.find('.' + Toolbar.constants.username);
|
var $userBlock = $bar.find('.' + Toolbar.constants.username);
|
||||||
var $editShare = $bar.find('.' + Toolbar.constants.editShare);
|
|
||||||
var $viewShare = $bar.find('.' + Toolbar.constants.viewShare);
|
|
||||||
var $usernameButton = module.$userNameButton = $($bar.find('.' + Toolbar.constants.changeUsername));
|
var $usernameButton = module.$userNameButton = $($bar.find('.' + Toolbar.constants.changeUsername));
|
||||||
|
|
||||||
var editHash;
|
var editHash;
|
||||||
@ -462,17 +464,6 @@ define([
|
|||||||
var $forgetPad = Cryptpad.createButton('forget', true, {}, forgetCb);
|
var $forgetPad = Cryptpad.createButton('forget', true, {}, forgetCb);
|
||||||
$rightside.append($forgetPad);
|
$rightside.append($forgetPad);
|
||||||
|
|
||||||
if (!readOnly) {
|
|
||||||
$editShare.append(Cryptpad.createButton('editshare', false, {editHash: editHash}));
|
|
||||||
}
|
|
||||||
if (viewHash) {
|
|
||||||
/* add a 'links' button */
|
|
||||||
$viewShare.append(Cryptpad.createButton('viewshare', false, {viewHash: viewHash + '/present'}));
|
|
||||||
if (!readOnly) {
|
|
||||||
$viewShare.append(Cryptpad.createButton('viewopen', false, {viewHash: viewHash + '/present'}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var $present = Cryptpad.createButton('present', true)
|
var $present = Cryptpad.createButton('present', true)
|
||||||
.click(function () {
|
.click(function () {
|
||||||
enterPresentationMode(true);
|
enterPresentationMode(true);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user