Merge remote-tracking branch 'origin/staging' into staging
This commit is contained in:
commit
1c9132adcb
@ -16,11 +16,14 @@ module.exports.create = function (config) {
|
|||||||
.on('channelOpen', historyKeeper.channelOpen)
|
.on('channelOpen', historyKeeper.channelOpen)
|
||||||
.on('sessionClose', function (userId, reason) {
|
.on('sessionClose', function (userId, reason) {
|
||||||
if (['BAD_MESSAGE', 'SOCKET_ERROR', 'SEND_MESSAGE_FAIL_2'].indexOf(reason) !== -1) {
|
if (['BAD_MESSAGE', 'SOCKET_ERROR', 'SEND_MESSAGE_FAIL_2'].indexOf(reason) !== -1) {
|
||||||
|
if (reason && reason.code === 'ECONNRESET') { return; }
|
||||||
return void log.error('SESSION_CLOSE_WITH_ERROR', {
|
return void log.error('SESSION_CLOSE_WITH_ERROR', {
|
||||||
userId: userId,
|
userId: userId,
|
||||||
reason: reason,
|
reason: reason,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (reason && reason === 'SOCKET_CLOSED') { return; }
|
||||||
log.verbose('SESSION_CLOSE_ROUTINE', {
|
log.verbose('SESSION_CLOSE_ROUTINE', {
|
||||||
userId: userId,
|
userId: userId,
|
||||||
reason: reason,
|
reason: reason,
|
||||||
|
|||||||
@ -1175,14 +1175,10 @@ define([
|
|||||||
} else if ($element.is('.cp-app-drive-element-noreadonly')) {
|
} else if ($element.is('.cp-app-drive-element-noreadonly')) {
|
||||||
hide.push('openro'); // Remove open 'view' mode
|
hide.push('openro'); // Remove open 'view' mode
|
||||||
}
|
}
|
||||||
// if it's not a plain text file
|
|
||||||
// XXX: there is a bug with this code in anon shared folder, so we disable it
|
|
||||||
if (APP.loggedIn || !APP.newSharedFolder) {
|
|
||||||
var metadata = manager.getFileData(manager.find(path));
|
var metadata = manager.getFileData(manager.find(path));
|
||||||
if (!metadata || !Util.isPlainTextFile(metadata.fileType, metadata.title)) {
|
if (!metadata || !Util.isPlainTextFile(metadata.fileType, metadata.title)) {
|
||||||
hide.push('openincode');
|
hide.push('openincode');
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else if ($element.is('.cp-app-drive-element-sharedf')) {
|
} else if ($element.is('.cp-app-drive-element-sharedf')) {
|
||||||
if (containsFolder) {
|
if (containsFolder) {
|
||||||
// More than 1 folder selected: cannot create a new subfolder
|
// More than 1 folder selected: cannot create a new subfolder
|
||||||
@ -1204,6 +1200,7 @@ define([
|
|||||||
hide.push('collapseall');
|
hide.push('collapseall');
|
||||||
}
|
}
|
||||||
containsFolder = true;
|
containsFolder = true;
|
||||||
|
hide.push('savelocal');
|
||||||
hide.push('openro');
|
hide.push('openro');
|
||||||
hide.push('openincode');
|
hide.push('openincode');
|
||||||
hide.push('properties');
|
hide.push('properties');
|
||||||
@ -1939,6 +1936,44 @@ define([
|
|||||||
};
|
};
|
||||||
var getIcon = UI.getIcon;
|
var getIcon = UI.getIcon;
|
||||||
|
|
||||||
|
var createShareButton = function (id, $container) {
|
||||||
|
var $shareBlock = $('<button>', {
|
||||||
|
'class': 'cp-toolbar-share-button',
|
||||||
|
title: Messages.shareButton
|
||||||
|
});
|
||||||
|
$sharedIcon.clone().appendTo($shareBlock);
|
||||||
|
$('<span>').text(Messages.shareButton).appendTo($shareBlock);
|
||||||
|
var data = manager.getSharedFolderData(id);
|
||||||
|
var parsed = (data.href && data.href.indexOf('#') !== -1) ? Hash.parsePadUrl(data.href) : {};
|
||||||
|
var roParsed = Hash.parsePadUrl(data.roHref) || {};
|
||||||
|
if (!parsed.hash && !roParsed.hash) { return void console.error("Invalid href: "+(data.href || data.roHref)); }
|
||||||
|
var friends = common.getFriends();
|
||||||
|
var ro = folders[id] && folders[id].version >= 2;
|
||||||
|
var modal = UIElements.createShareModal({
|
||||||
|
teamId: APP.team,
|
||||||
|
origin: APP.origin,
|
||||||
|
pathname: "/drive/",
|
||||||
|
friends: friends,
|
||||||
|
title: data.title,
|
||||||
|
password: data.password,
|
||||||
|
sharedFolder: true,
|
||||||
|
common: common,
|
||||||
|
hashes: {
|
||||||
|
editHash: parsed.hash,
|
||||||
|
viewHash: ro && roParsed.hash,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// If we're a viewer and this is an old shared folder (no read-only mode), we
|
||||||
|
// can't share the read-only URL and we don't have access to the edit one.
|
||||||
|
// We should hide the share button.
|
||||||
|
if (!modal) { return; }
|
||||||
|
$shareBlock.click(function () {
|
||||||
|
UI.openCustomModal(modal);
|
||||||
|
});
|
||||||
|
$container.append($shareBlock);
|
||||||
|
return $shareBlock;
|
||||||
|
};
|
||||||
|
|
||||||
// Create the "li" element corresponding to the file/folder located in "path"
|
// Create the "li" element corresponding to the file/folder located in "path"
|
||||||
var createElement = function (path, elPath, root, isFolder) {
|
var createElement = function (path, elPath, root, isFolder) {
|
||||||
// Forbid drag&drop inside the trash
|
// Forbid drag&drop inside the trash
|
||||||
@ -2019,6 +2054,15 @@ define([
|
|||||||
});
|
});
|
||||||
delete APP.newFolder;
|
delete APP.newFolder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isSharedFolder && APP.convertedFolder === element) {
|
||||||
|
setTimeout(function () {
|
||||||
|
var $fakeButton = createShareButton(element, $('<div>'));
|
||||||
|
if (!$fakeButton) { return; }
|
||||||
|
$fakeButton.click();
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
|
|
||||||
return $element;
|
return $element;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2556,43 +2600,6 @@ define([
|
|||||||
$container.append($block);
|
$container.append($block);
|
||||||
};
|
};
|
||||||
|
|
||||||
var createShareButton = function (id, $container) {
|
|
||||||
var $shareBlock = $('<button>', {
|
|
||||||
'class': 'cp-toolbar-share-button',
|
|
||||||
title: Messages.shareButton
|
|
||||||
});
|
|
||||||
$sharedIcon.clone().appendTo($shareBlock);
|
|
||||||
$('<span>').text(Messages.shareButton).appendTo($shareBlock);
|
|
||||||
var data = manager.getSharedFolderData(id);
|
|
||||||
var parsed = (data.href && data.href.indexOf('#') !== -1) ? Hash.parsePadUrl(data.href) : {};
|
|
||||||
var roParsed = Hash.parsePadUrl(data.roHref) || {};
|
|
||||||
if (!parsed.hash && !roParsed.hash) { return void console.error("Invalid href: "+(data.href || data.roHref)); }
|
|
||||||
var friends = common.getFriends();
|
|
||||||
var ro = folders[id] && folders[id].version >= 2;
|
|
||||||
var modal = UIElements.createShareModal({
|
|
||||||
teamId: APP.team,
|
|
||||||
origin: APP.origin,
|
|
||||||
pathname: "/drive/",
|
|
||||||
friends: friends,
|
|
||||||
title: data.title,
|
|
||||||
password: data.password,
|
|
||||||
sharedFolder: true,
|
|
||||||
common: common,
|
|
||||||
hashes: {
|
|
||||||
editHash: parsed.hash,
|
|
||||||
viewHash: ro && roParsed.hash,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// If we're a viewer and this is an old shared folder (no read-only mode), we
|
|
||||||
// can't share the read-only URL and we don't have access to the edit one.
|
|
||||||
// We should hide the share button.
|
|
||||||
if (!modal) { return; }
|
|
||||||
$shareBlock.click(function () {
|
|
||||||
UI.openCustomModal(modal);
|
|
||||||
});
|
|
||||||
$container.append($shareBlock);
|
|
||||||
};
|
|
||||||
|
|
||||||
var SORT_FOLDER_DESC = 'sortFoldersDesc';
|
var SORT_FOLDER_DESC = 'sortFoldersDesc';
|
||||||
var SORT_FILE_BY = 'sortFilesBy';
|
var SORT_FILE_BY = 'sortFilesBy';
|
||||||
var SORT_FILE_DESC = 'sortFilesDesc';
|
var SORT_FILE_DESC = 'sortFilesDesc';
|
||||||
@ -3237,21 +3244,23 @@ define([
|
|||||||
var path = currentPath.slice(1);
|
var path = currentPath.slice(1);
|
||||||
var root = Util.find(data, path);
|
var root = Util.find(data, path);
|
||||||
|
|
||||||
|
var realPath = [ROOT, SHARED_FOLDER].concat(path);
|
||||||
|
|
||||||
if (manager.hasSubfolder(root)) { $list.append($folderHeader); }
|
if (manager.hasSubfolder(root)) { $list.append($folderHeader); }
|
||||||
// display sub directories
|
// display sub directories
|
||||||
var keys = Object.keys(root);
|
var keys = Object.keys(root);
|
||||||
var sortedFolders = sortElements(true, currentPath, keys, null, !getSortFolderDesc());
|
var sortedFolders = sortElements(true, realPath, keys, null, !getSortFolderDesc());
|
||||||
var sortedFiles = sortElements(false, currentPath, keys, APP.store[SORT_FILE_BY], !getSortFileDesc());
|
var sortedFiles = sortElements(false, realPath, keys, APP.store[SORT_FILE_BY], !getSortFileDesc());
|
||||||
sortedFolders.forEach(function (key) {
|
sortedFolders.forEach(function (key) {
|
||||||
if (manager.isFile(root[key])) { return; }
|
if (manager.isFile(root[key])) { return; }
|
||||||
var $element = createElement(currentPath, key, root, true);
|
var $element = createElement(realPath, key, root, true);
|
||||||
$element.appendTo($list);
|
$element.appendTo($list);
|
||||||
});
|
});
|
||||||
if (manager.hasFile(root)) { $list.append($fileHeader); }
|
if (manager.hasFile(root)) { $list.append($fileHeader); }
|
||||||
// display files
|
// display files
|
||||||
sortedFiles.forEach(function (key) {
|
sortedFiles.forEach(function (key) {
|
||||||
if (manager.isFolder(root[key])) { return; }
|
if (manager.isFolder(root[key])) { return; }
|
||||||
var $element = createElement(currentPath, key, root, false);
|
var $element = createElement(realPath, key, root, false);
|
||||||
if (!$element) { return; }
|
if (!$element) { return; }
|
||||||
$element.appendTo($list);
|
$element.appendTo($list);
|
||||||
});
|
});
|
||||||
@ -3486,6 +3495,9 @@ define([
|
|||||||
} else {
|
} else {
|
||||||
$content.scrollTop(s);
|
$content.scrollTop(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delete APP.convertedFolder;
|
||||||
|
|
||||||
appStatus.ready(true);
|
appStatus.ready(true);
|
||||||
};
|
};
|
||||||
var displayDirectory = APP.displayDirectory = function (path, force) {
|
var displayDirectory = APP.displayDirectory = function (path, force) {
|
||||||
@ -3973,6 +3985,14 @@ define([
|
|||||||
common.sessionStorage.put(Constants.newPadTeamKey, APP.team, waitFor());
|
common.sessionStorage.put(Constants.newPadTeamKey, APP.team, waitFor());
|
||||||
}).nThen(function () {
|
}).nThen(function () {
|
||||||
common.openURL('/code/');
|
common.openURL('/code/');
|
||||||
|
// We need to restore sessionStorage for the next time we want to create a pad from this tab
|
||||||
|
// NOTE: the 100ms timeout is to fix a race condition in firefox where sessionStorage
|
||||||
|
// would be deleted before the new tab was created
|
||||||
|
setTimeout(function () {
|
||||||
|
common.sessionStorage.put(Constants.newPadFileData, '', function () {});
|
||||||
|
common.sessionStorage.put(Constants.newPadPathKey, '', function () {});
|
||||||
|
common.sessionStorage.put(Constants.newPadTeamKey, '', function () {});
|
||||||
|
}, 100);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4080,10 +4100,14 @@ define([
|
|||||||
if (!res) { return; }
|
if (!res) { return; }
|
||||||
var password = $(convertContent).find('#cp-upload-password').val() || undefined;
|
var password = $(convertContent).find('#cp-upload-password').val() || undefined;
|
||||||
var owned = Util.isChecked($(convertContent).find('#cp-upload-owned'));
|
var owned = Util.isChecked($(convertContent).find('#cp-upload-owned'));
|
||||||
manager.convertFolderToSharedFolder(paths[0].path, owned, password, refresh);
|
manager.convertFolderToSharedFolder(paths[0].path, owned, password, function (err, obj) {
|
||||||
|
if (err || obj && obj.error) { return void console.error(err || obj.error); }
|
||||||
|
if (obj && obj.fId) { APP.convertedFolder = obj.fId; }
|
||||||
|
refresh();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else { // File
|
} else { // File or shared folder
|
||||||
var sf = manager.isSharedFolder(el);
|
var sf = manager.isSharedFolder(el);
|
||||||
data = sf ? manager.getSharedFolderData(el) : manager.getFileData(el);
|
data = sf ? manager.getSharedFolderData(el) : manager.getFileData(el);
|
||||||
parsed = (data.href && data.href.indexOf('#') !== -1) ? Hash.parsePadUrl(data.href) : {};
|
parsed = (data.href && data.href.indexOf('#') !== -1) ? Hash.parsePadUrl(data.href) : {};
|
||||||
|
|||||||
@ -689,7 +689,9 @@ define([
|
|||||||
|
|
||||||
// remove folder
|
// remove folder
|
||||||
Env.user.userObject.delete([path], function () {
|
Env.user.userObject.delete([path], function () {
|
||||||
cb();
|
cb({
|
||||||
|
fId: SFId
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@ -96,7 +96,11 @@ define([
|
|||||||
var updateObject = function (sframeChan, obj, cb) {
|
var updateObject = function (sframeChan, obj, cb) {
|
||||||
sframeChan.query('Q_DRIVE_GETOBJECT', null, function (err, newObj) {
|
sframeChan.query('Q_DRIVE_GETOBJECT', null, function (err, newObj) {
|
||||||
copyObjectValue(obj, newObj);
|
copyObjectValue(obj, newObj);
|
||||||
|
// If anon shared folder, make a virtual drive containing this folder
|
||||||
if (!APP.loggedIn && APP.newSharedFolder) {
|
if (!APP.loggedIn && APP.newSharedFolder) {
|
||||||
|
obj.drive.root = {
|
||||||
|
sf: APP.newSharedFolder
|
||||||
|
};
|
||||||
obj.drive.sharedFolders = obj.drive.sharedFolders || {};
|
obj.drive.sharedFolders = obj.drive.sharedFolders || {};
|
||||||
obj.drive.sharedFolders[APP.newSharedFolder] = {
|
obj.drive.sharedFolders[APP.newSharedFolder] = {
|
||||||
href: APP.anonSFHref,
|
href: APP.anonSFHref,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user