Merge pull request #20185 from azul/open-new_tab

Modify do_action so default ctrl-click opens tab
This commit is contained in:
John Molakvoæ 2020-04-11 08:23:11 +02:00 committed by GitHub
commit e5ac5c7f34
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 93 additions and 60 deletions

View File

@ -256,6 +256,19 @@
return undefined;
},
/**
* Returns the default file action handler for the current file
*
* @return {OCA.Files.FileActions~actionSpec} action spec
* @since 8.2
*/
getCurrentDefaultFileAction: function() {
var mime = this.getCurrentMimeType();
var type = this.getCurrentType();
var permissions = this.getCurrentPermissions();
return this.getDefaultFileAction(mime, type, permissions);
},
/**
* Returns the default file action handler for the given conditions
*
@ -263,7 +276,7 @@
* @param {string} type "dir" or "file"
* @param {int} permissions permissions
*
* @return {OCA.Files.FileActions~actionHandler} action handler
* @return {OCA.Files.FileActions~actionSpec} action spec
* @since 8.2
*/
getDefaultFileAction: function(mime, type, permissions) {

View File

@ -77,11 +77,7 @@
fileActions.getCurrentPermissions()
);
var defaultAction = fileActions.getDefaultFileAction(
fileActions.getCurrentMimeType(),
fileActions.getCurrentType(),
fileActions.getCurrentPermissions()
);
var defaultAction = fileActions.getCurrentDefaultFileAction();
var items = _.filter(actions, function(actionSpec) {
return !defaultAction || actionSpec.name !== defaultAction.name;

View File

@ -432,7 +432,7 @@
this.setupUploadEvents(this._uploader);
}
}
this.triedActionOnce = false;
OC.Plugins.attach('OCA.Files.FileList', this);
@ -874,16 +874,12 @@
if ($tr.hasClass('dragging')) {
return;
}
if (this._allowSelection && (event.ctrlKey || event.shiftKey)) {
if (this._allowSelection && event.shiftKey) {
event.preventDefault();
if (event.shiftKey) {
this._selectRange($tr);
} else {
this._selectSingle($tr);
}
this._selectRange($tr);
this._lastChecked = $tr;
this.updateSelectionSummary();
} else {
} else if (!event.ctrlKey) {
// clicked directly on the name
if (!this._detailsView || $(event.target).is('.nametext, .name, .thumbnail') || $(event.target).closest('.nametext').length) {
var filename = $tr.attr('data-file');
@ -892,13 +888,10 @@
event.preventDefault();
} else if (!renaming) {
this.fileActions.currentFile = $tr.find('td');
var mime = this.fileActions.getCurrentMimeType();
var type = this.fileActions.getCurrentType();
var permissions = this.fileActions.getCurrentPermissions();
var action = this.fileActions.getDefault(mime,type, permissions);
if (action) {
var spec = this.fileActions.getCurrentDefaultFileAction();
if (spec && spec.action) {
event.preventDefault();
action(filename, {
spec.action(filename, {
$file: $tr,
fileList: this,
fileActions: this.fileActions,
@ -1323,6 +1316,31 @@
}, 0);
}
if(!this.triedActionOnce) {
var id = OC.Util.History.parseUrlQuery().openfile;
if (id) {
var $tr = this.$fileList.children().filterAttr('data-id', '' + id);
var filename = $tr.attr('data-file');
this.fileActions.currentFile = $tr.find('td');
var dir = $tr.attr('data-path') || this.getCurrentDirectory();
var spec = this.fileActions.getCurrentDefaultFileAction();
if (spec && spec.action) {
spec.action(filename, {
$file: $tr,
fileList: this,
fileActions: this.fileActions,
dir: dir
});
}
else {
var url = this.getDownloadUrl(filename, dir, true);
OCA.Files.Files.handleDownload(url);
}
}
this.triedActionOnce = true;
}
return newTrs;
},
@ -1527,10 +1545,14 @@
td = $('<td class="filename"></td>');
var spec = this.fileActions.getDefaultFileAction(mime, type, permissions);
// linkUrl
if (mime === 'httpd/unix-directory') {
linkUrl = this.linkTo(path + '/' + name);
}
else if (spec && spec.action) {
linkUrl = this.getDefaultActionUrl(path, fileData.id);
}
else {
linkUrl = this.getDownloadUrl(name, path, type === 'dir');
}
@ -2149,6 +2171,10 @@
return OCA.Files.Files.getDownloadUrl(files, dir || this.getCurrentDirectory(), isDir);
},
getDefaultActionUrl: function(path, id) {
return this.linkTo(path) + "&openfile="+id;
},
getUploadUrl: function(fileName, dir) {
if (_.isUndefined(dir)) {
dir = this.getCurrentDirectory();

View File

@ -239,6 +239,33 @@ describe('OCA.Files.FileList tests', function() {
expect($tr.find('.date').text()).not.toEqual('?');
expect(fileList.findFileEl('testName.txt')[0]).toEqual($tr[0]);
});
it('generates file element with url for default action when one is defined', function() {
var actionStub = sinon.stub();
fileList.setFiles(testFiles);
fileList.fileActions.registerAction({
mime: 'text/plain',
name: 'Test',
type: OCA.Files.FileActions.TYPE_INLINE,
permissions: OC.PERMISSION_ALL,
icon: function() {
// Specify icon for hitory button
return OC.imagePath('core','actions/history');
},
actionHandler: actionStub
});
fileList.fileActions.setDefault('text/plain', 'Test');
var fileData = new FileInfo({
id: 18,
name: 'testName.txt',
mimetype: 'text/plain',
size: 1234,
etag: 'a01234c',
mtime: 123456
});
var $tr = fileList.add(fileData);
expect($tr.find('a.name').attr('href'))
.toEqual(OC.getRootPath() + '/index.php/apps/files?dir=&openfile=18');
});
it('generates dir element with correct attributes when calling add() with dir data', function() {
var fileData = new FileInfo({
id: 19,
@ -1906,36 +1933,6 @@ describe('OCA.Files.FileList tests', function() {
expect($tr.find('input:checkbox').prop('checked')).toEqual(true);
});
it('Selects/deselect a file when clicking on the name while holding Ctrl', function() {
var $tr = fileList.findFileEl('One.txt');
var $tr2 = fileList.findFileEl('Three.pdf');
var e;
expect($tr.find('input:checkbox').prop('checked')).toEqual(false);
expect($tr2.find('input:checkbox').prop('checked')).toEqual(false);
e = new $.Event('click');
e.ctrlKey = true;
$tr.find('td.filename .name').trigger(e);
expect($tr.find('input:checkbox').prop('checked')).toEqual(true);
expect($tr2.find('input:checkbox').prop('checked')).toEqual(false);
// click on second entry, does not clear the selection
e = new $.Event('click');
e.ctrlKey = true;
$tr2.find('td.filename .name').trigger(e);
expect($tr.find('input:checkbox').prop('checked')).toEqual(true);
expect($tr2.find('input:checkbox').prop('checked')).toEqual(true);
expect(_.pluck(fileList.getSelectedFiles(), 'name')).toEqual(['One.txt', 'Three.pdf']);
// deselect now
e = new $.Event('click');
e.ctrlKey = true;
$tr2.find('td.filename .name').trigger(e);
expect($tr.find('input:checkbox').prop('checked')).toEqual(true);
expect($tr2.find('input:checkbox').prop('checked')).toEqual(false);
expect(_.pluck(fileList.getSelectedFiles(), 'name')).toEqual(['One.txt']);
});
it('Selects a range when clicking on one file then Shift clicking on another one', function() {
var $tr = fileList.findFileEl('One.txt');
var $tr2 = fileList.findFileEl('Three.pdf');

View File

@ -113,9 +113,9 @@ OCA.Sharing.PublicApp = {
// Show file preview if previewer is available, images are already handled by the template
if (mimetype.substr(0, mimetype.indexOf('/')) !== 'image' && $('.publicpreview').length === 0) {
// Trigger default action if not download TODO
var action = FileActions.getDefault(mimetype, 'file', OC.PERMISSION_READ);
if (typeof action !== 'undefined') {
action($('#filename').val());
var spec = FileActions.getDefaultFileAction(mimetype, 'file', OC.PERMISSION_READ);
if (spec && spec.action) {
spec.action($('#filename').val());
}
}
}
@ -204,10 +204,6 @@ OCA.Sharing.PublicApp = {
var $tr = OCA.Files.FileList.prototype._createRow.apply(this, arguments);
if (hideDownload === 'true') {
this.fileActions.currentFile = $tr.find('td');
var mime = this.fileActions.getCurrentMimeType();
var type = this.fileActions.getCurrentType();
var permissions = this.fileActions.getCurrentPermissions();
var action = this.fileActions.getDefault(mime, type, permissions);
// Remove the link. This means that files without a default action fail hard
$tr.find('a.name').attr('href', '#');
@ -252,7 +248,7 @@ OCA.Sharing.PublicApp = {
};
this.fileList.linkTo = function (dir) {
return OC.generateUrl('/s/' + token + '', {dir: dir});
return OC.generateUrl('/s/' + token + '') + '?' + OC.buildQueryString({path: dir});
};
this.fileList.generatePreviewUrl = function (urlSpec) {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -241,6 +241,11 @@
return '#'
},
getDefaultActionUrl: function() {
// no default action
return '#'
},
updateStorageStatistics: function() {
// no op because the trashbin doesn't have
// storage info like free space / used space