Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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);
Comment on lines -207 to -210
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

none of these were used anywhere.


// 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