Skip to content

Commit

Permalink
Merge pull request #20185 from azul/open-new_tab
Browse files Browse the repository at this point in the history
Modify do_action so default ctrl-click opens tab
  • Loading branch information
skjnldsv authored Apr 11, 2020
2 parents b5a30d5 + 43f0d2a commit e5ac5c7
Show file tree
Hide file tree
Showing 8 changed files with 93 additions and 60 deletions.
15 changes: 14 additions & 1 deletion apps/files/js/fileactions.js
Original file line number Diff line number Diff line change
Expand Up @@ -256,14 +256,27 @@
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
*
* @param {string} mime mime type
* @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) {
Expand Down
6 changes: 1 addition & 5 deletions apps/files/js/fileactionsmenu.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
54 changes: 40 additions & 14 deletions apps/files/js/filelist.js
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,7 @@
this.setupUploadEvents(this._uploader);
}
}

this.triedActionOnce = false;

OC.Plugins.attach('OCA.Files.FileList', this);

Expand Down Expand Up @@ -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');
Expand All @@ -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,
Expand Down Expand Up @@ -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;
},

Expand Down Expand Up @@ -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');
}
Expand Down Expand Up @@ -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();
Expand Down
57 changes: 27 additions & 30 deletions apps/files/tests/js/filelistSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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');
Expand Down
12 changes: 4 additions & 8 deletions apps/files_sharing/js/public.js
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
}
}
Expand Down Expand Up @@ -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', '#');
Expand Down Expand Up @@ -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) {
Expand Down
Loading

0 comments on commit e5ac5c7

Please sign in to comment.