2019-04-29 19:16:15 +03:00
|
|
|
/* global alert */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
|
|
|
|
*
|
|
|
|
* @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
|
2012-02-29 02:02:02 +04:00
|
|
|
*
|
2019-04-29 19:16:15 +03:00
|
|
|
* @license GNU AGPL version 3 or any later version
|
2012-02-29 02:02:02 +04:00
|
|
|
*
|
2019-04-29 19:16:15 +03:00
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Affero General Public License as
|
|
|
|
* published by the Free Software Foundation, either version 3 of the
|
|
|
|
* License, or (at your option) any later version.
|
2012-02-29 02:02:02 +04:00
|
|
|
*
|
2019-04-29 19:16:15 +03:00
|
|
|
* This program is distributed in the hope that it will be useful,
|
2012-02-29 02:02:02 +04:00
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2019-04-29 19:16:15 +03:00
|
|
|
* GNU Affero General Public License for more details.
|
2012-02-29 02:02:02 +04:00
|
|
|
*
|
2019-04-29 19:16:15 +03:00
|
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
2012-02-29 02:02:02 +04:00
|
|
|
*/
|
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
import _ from 'underscore'
|
|
|
|
import $ from 'jquery'
|
|
|
|
|
|
|
|
import OC from './index'
|
|
|
|
import OCA from '../OCA/index'
|
2014-04-04 13:52:15 +04:00
|
|
|
|
2012-02-29 02:02:02 +04:00
|
|
|
/**
|
2012-05-05 15:48:12 +04:00
|
|
|
* this class to ease the usage of jquery dialogs
|
2012-02-29 02:02:02 +04:00
|
|
|
*/
|
2019-04-29 19:16:15 +03:00
|
|
|
const Dialogs = {
|
2013-05-17 09:14:43 +04:00
|
|
|
// dialog button types
|
2019-04-29 19:16:15 +03:00
|
|
|
YES_NO_BUTTONS: 70,
|
|
|
|
OK_BUTTONS: 71,
|
2017-08-27 18:39:22 +03:00
|
|
|
|
|
|
|
FILEPICKER_TYPE_CHOOSE: 1,
|
|
|
|
FILEPICKER_TYPE_MOVE: 2,
|
|
|
|
FILEPICKER_TYPE_COPY: 3,
|
|
|
|
FILEPICKER_TYPE_COPY_MOVE: 4,
|
|
|
|
|
2013-05-17 09:14:43 +04:00
|
|
|
// used to name each dialog
|
2014-04-14 21:29:00 +04:00
|
|
|
dialogsCounter: 0,
|
2012-05-05 15:48:12 +04:00
|
|
|
/**
|
2019-04-29 19:16:15 +03:00
|
|
|
* displays alert dialog
|
|
|
|
* @param text content of dialog
|
|
|
|
* @param title dialog title
|
|
|
|
* @param callback which will be triggered when user presses OK
|
|
|
|
* @param modal make the dialog modal
|
|
|
|
*/
|
|
|
|
alert: function (text, title, callback, modal) {
|
2014-03-01 05:46:27 +04:00
|
|
|
this.message(
|
|
|
|
text,
|
|
|
|
title,
|
|
|
|
'alert',
|
2019-04-29 19:16:15 +03:00
|
|
|
Dialogs.OK_BUTTON,
|
2014-03-01 05:46:27 +04:00
|
|
|
callback,
|
|
|
|
modal
|
|
|
|
);
|
2012-05-05 15:48:12 +04:00
|
|
|
},
|
|
|
|
/**
|
2019-04-29 19:16:15 +03:00
|
|
|
* displays info dialog
|
|
|
|
* @param text content of dialog
|
|
|
|
* @param title dialog title
|
|
|
|
* @param callback which will be triggered when user presses OK
|
|
|
|
* @param modal make the dialog modal
|
|
|
|
*/
|
|
|
|
info: function (text, title, callback, modal) {
|
|
|
|
this.message(text, title, 'info', Dialogs.OK_BUTTON, callback, modal);
|
2012-05-05 15:48:12 +04:00
|
|
|
},
|
|
|
|
/**
|
2019-04-29 19:16:15 +03:00
|
|
|
* displays confirmation dialog
|
|
|
|
* @param text content of dialog
|
|
|
|
* @param title dialog title
|
|
|
|
* @param callback which will be triggered when user presses YES or NO
|
|
|
|
* (true or false would be passed to callback respectively)
|
|
|
|
* @param modal make the dialog modal
|
|
|
|
*/
|
|
|
|
confirm: function (text, title, callback, modal) {
|
2014-07-03 16:38:40 +04:00
|
|
|
return this.message(
|
2014-03-01 05:46:27 +04:00
|
|
|
text,
|
|
|
|
title,
|
|
|
|
'notice',
|
2019-04-29 19:16:15 +03:00
|
|
|
Dialogs.YES_NO_BUTTONS,
|
2014-03-01 05:46:27 +04:00
|
|
|
callback,
|
|
|
|
modal
|
|
|
|
);
|
2012-05-05 15:48:12 +04:00
|
|
|
},
|
2016-10-31 14:22:21 +03:00
|
|
|
/**
|
2019-04-29 19:16:15 +03:00
|
|
|
* displays confirmation dialog
|
|
|
|
* @param text content of dialog
|
|
|
|
* @param title dialog title
|
|
|
|
* @param callback which will be triggered when user presses YES or NO
|
|
|
|
* (true or false would be passed to callback respectively)
|
|
|
|
* @param modal make the dialog modal
|
|
|
|
*/
|
|
|
|
confirmHtml: function (text, title, callback, modal) {
|
2016-10-31 14:22:21 +03:00
|
|
|
return this.message(
|
|
|
|
text,
|
|
|
|
title,
|
|
|
|
'notice',
|
2019-04-29 19:16:15 +03:00
|
|
|
Dialogs.YES_NO_BUTTONS,
|
2016-10-31 14:22:21 +03:00
|
|
|
callback,
|
|
|
|
modal,
|
|
|
|
true
|
|
|
|
);
|
|
|
|
},
|
2014-05-09 19:09:06 +04:00
|
|
|
/**
|
|
|
|
* displays prompt dialog
|
|
|
|
* @param text content of dialog
|
|
|
|
* @param title dialog title
|
|
|
|
* @param callback which will be triggered when user presses YES or NO
|
|
|
|
* (true or false would be passed to callback respectively)
|
|
|
|
* @param modal make the dialog modal
|
|
|
|
* @param name name of the input field
|
2014-05-11 12:55:00 +04:00
|
|
|
* @param password whether the input should be a password input
|
2014-05-09 19:09:06 +04:00
|
|
|
*/
|
|
|
|
prompt: function (text, title, callback, modal, name, password) {
|
2014-07-03 16:38:40 +04:00
|
|
|
return $.when(this._getMessageTemplate()).then(function ($tmpl) {
|
2019-04-29 19:16:15 +03:00
|
|
|
var dialogName = 'oc-dialog-' + Dialogs.dialogsCounter + '-content';
|
2014-05-09 19:09:06 +04:00
|
|
|
var dialogId = '#' + dialogName;
|
|
|
|
var $dlg = $tmpl.octemplate({
|
|
|
|
dialog_name: dialogName,
|
2019-04-29 19:16:15 +03:00
|
|
|
title: title,
|
|
|
|
message: text,
|
|
|
|
type: 'notice'
|
2014-05-09 19:09:06 +04:00
|
|
|
});
|
|
|
|
var input = $('<input/>');
|
2018-05-24 15:02:25 +03:00
|
|
|
input.attr('type', password ? 'password' : 'text').attr('id', dialogName + '-input').attr('placeholder', name);
|
2014-05-09 19:09:06 +04:00
|
|
|
var label = $('<label/>').attr('for', dialogName + '-input').text(name + ': ');
|
|
|
|
$dlg.append(label);
|
|
|
|
$dlg.append(input);
|
|
|
|
if (modal === undefined) {
|
|
|
|
modal = false;
|
|
|
|
}
|
|
|
|
$('body').append($dlg);
|
2016-12-09 12:47:40 +03:00
|
|
|
|
|
|
|
// wrap callback in _.once():
|
|
|
|
// only call callback once and not twice (button handler and close
|
|
|
|
// event) but call it for the close event, if ESC or the x is hit
|
|
|
|
if (callback !== undefined) {
|
|
|
|
callback = _.once(callback);
|
|
|
|
}
|
|
|
|
|
2014-07-03 16:38:40 +04:00
|
|
|
var buttonlist = [{
|
2019-04-29 19:16:15 +03:00
|
|
|
text: t('core', 'No'),
|
|
|
|
click: function () {
|
|
|
|
if (callback !== undefined) {
|
|
|
|
callback(false, input.val());
|
2014-07-03 16:38:40 +04:00
|
|
|
}
|
2019-04-29 19:16:15 +03:00
|
|
|
$(dialogId).ocdialog('close');
|
2014-05-09 19:09:06 +04:00
|
|
|
}
|
2019-04-29 19:16:15 +03:00
|
|
|
}, {
|
|
|
|
text: t('core', 'Yes'),
|
|
|
|
click: function () {
|
|
|
|
if (callback !== undefined) {
|
|
|
|
callback(true, input.val());
|
|
|
|
}
|
|
|
|
$(dialogId).ocdialog('close');
|
|
|
|
},
|
|
|
|
defaultButton: true
|
|
|
|
}
|
2014-05-09 19:09:06 +04:00
|
|
|
];
|
|
|
|
|
|
|
|
$(dialogId).ocdialog({
|
|
|
|
closeOnEscape: true,
|
2019-04-29 19:16:15 +03:00
|
|
|
modal: modal,
|
|
|
|
buttons: buttonlist,
|
|
|
|
close: function () {
|
2016-12-09 12:47:40 +03:00
|
|
|
// callback is already fired if Yes/No is clicked directly
|
|
|
|
if (callback !== undefined) {
|
|
|
|
callback(false, input.val());
|
|
|
|
}
|
|
|
|
}
|
2014-05-09 19:09:06 +04:00
|
|
|
});
|
2016-11-24 14:35:59 +03:00
|
|
|
input.focus();
|
2019-04-29 19:16:15 +03:00
|
|
|
Dialogs.dialogsCounter++;
|
2014-05-09 19:09:06 +04:00
|
|
|
});
|
|
|
|
},
|
2013-04-06 12:07:12 +04:00
|
|
|
/**
|
|
|
|
* show a file picker to pick a file from
|
2018-08-30 15:40:12 +03:00
|
|
|
*
|
|
|
|
* In order to pick several types of mime types they need to be passed as an
|
|
|
|
* array of strings.
|
|
|
|
*
|
|
|
|
* When no mime type filter is given only files can be selected. In order to
|
|
|
|
* be able to select both files and folders "['*', 'httpd/unix-directory']"
|
|
|
|
* should be used instead.
|
|
|
|
*
|
2013-04-06 12:07:12 +04:00
|
|
|
* @param title dialog title
|
|
|
|
* @param callback which will be triggered when user presses Choose
|
|
|
|
* @param multiselect whether it should be possible to select multiple files
|
2015-04-13 11:35:45 +03:00
|
|
|
* @param mimetypeFilter mimetype to filter by - directories will always be included
|
2013-04-06 12:07:12 +04:00
|
|
|
* @param modal make the dialog modal
|
2017-08-27 18:39:22 +03:00
|
|
|
* @param type Type of file picker : Choose, copy, move, copy and move
|
2018-11-09 14:23:51 +03:00
|
|
|
* @param path path to the folder that the the file can be picket from
|
2019-08-21 17:59:49 +03:00
|
|
|
* @param options additonal options that need to be set
|
2019-04-29 19:16:15 +03:00
|
|
|
*/
|
2019-08-21 17:59:49 +03:00
|
|
|
filepicker: function (title, callback, multiselect, mimetypeFilter, modal, type, path, options) {
|
2013-05-17 06:54:08 +04:00
|
|
|
var self = this;
|
2018-11-08 15:30:39 +03:00
|
|
|
|
|
|
|
this.filepicker.sortField = 'name';
|
|
|
|
this.filepicker.sortOrder = 'asc';
|
2014-06-20 15:39:46 +04:00
|
|
|
// avoid opening the picker twice
|
|
|
|
if (this.filepicker.loading) {
|
|
|
|
return;
|
|
|
|
}
|
2017-08-27 18:39:22 +03:00
|
|
|
|
|
|
|
if (type === undefined) {
|
|
|
|
type = this.FILEPICKER_TYPE_CHOOSE;
|
|
|
|
}
|
|
|
|
|
2018-07-31 23:49:01 +03:00
|
|
|
var emptyText = t('core', 'No files in here');
|
2018-12-20 16:34:26 +03:00
|
|
|
var newText = t('files', 'New folder');
|
2018-07-31 23:49:01 +03:00
|
|
|
if (type === this.FILEPICKER_TYPE_COPY || type === this.FILEPICKER_TYPE_MOVE || type === this.FILEPICKER_TYPE_COPY_MOVE) {
|
|
|
|
emptyText = t('core', 'No more subfolders in here');
|
|
|
|
}
|
|
|
|
|
2014-06-20 15:39:46 +04:00
|
|
|
this.filepicker.loading = true;
|
2019-04-29 19:16:15 +03:00
|
|
|
this.filepicker.filesClient = (OCA.Sharing && OCA.Sharing.PublicApp && OCA.Sharing.PublicApp.fileList) ? OCA.Sharing.PublicApp.fileList.filesClient : OC.Files.getClient();
|
2018-10-23 11:38:00 +03:00
|
|
|
|
2018-12-20 16:34:26 +03:00
|
|
|
this.filelist = null;
|
2019-01-08 00:07:16 +03:00
|
|
|
path = path || '';
|
2019-08-21 17:59:49 +03:00
|
|
|
options = Object.assign({
|
|
|
|
allowDirectoryChooser: false
|
|
|
|
}, options)
|
2018-12-20 16:34:26 +03:00
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
$.when(this._getFilePickerTemplate()).then(function ($tmpl) {
|
2014-06-20 15:39:46 +04:00
|
|
|
self.filepicker.loading = false;
|
2014-04-14 21:29:00 +04:00
|
|
|
var dialogName = 'oc-dialog-filepicker-content';
|
2019-04-29 19:16:15 +03:00
|
|
|
if (self.$filePicker) {
|
2013-06-02 23:52:59 +04:00
|
|
|
self.$filePicker.ocdialog('close');
|
2013-05-17 06:54:08 +04:00
|
|
|
}
|
2018-08-30 15:23:47 +03:00
|
|
|
|
|
|
|
if (mimetypeFilter === undefined || mimetypeFilter === null) {
|
|
|
|
mimetypeFilter = [];
|
|
|
|
}
|
2019-04-29 19:16:15 +03:00
|
|
|
if (typeof (mimetypeFilter) === "string") {
|
2018-08-30 15:23:47 +03:00
|
|
|
mimetypeFilter = [mimetypeFilter];
|
|
|
|
}
|
|
|
|
|
2013-05-17 06:54:08 +04:00
|
|
|
self.$filePicker = $tmpl.octemplate({
|
2014-04-14 21:29:00 +04:00
|
|
|
dialog_name: dialogName,
|
2016-10-21 17:35:55 +03:00
|
|
|
title: title,
|
2018-12-20 16:34:26 +03:00
|
|
|
emptytext: emptyText,
|
2019-03-22 12:22:07 +03:00
|
|
|
newtext: newText,
|
|
|
|
nameCol: t('core', 'Name'),
|
|
|
|
sizeCol: t('core', 'Size'),
|
|
|
|
modifiedCol: t('core', 'Modified')
|
2019-08-21 17:59:49 +03:00
|
|
|
}).data('path', path).data('multiselect', multiselect).data('mimetype', mimetypeFilter).data('allowDirectoryChooser', options.allowDirectoryChooser)
|
2013-04-06 12:07:12 +04:00
|
|
|
|
2013-08-01 20:44:01 +04:00
|
|
|
if (modal === undefined) {
|
|
|
|
modal = false;
|
|
|
|
}
|
|
|
|
if (multiselect === undefined) {
|
|
|
|
multiselect = false;
|
|
|
|
}
|
2013-04-06 12:07:12 +04:00
|
|
|
|
2018-11-30 17:15:52 +03:00
|
|
|
// No grid for IE!
|
2018-11-05 19:27:09 +03:00
|
|
|
if (OC.Util.isIE()) {
|
|
|
|
self.$filePicker.find('#picker-view-toggle').remove();
|
2018-11-29 16:05:10 +03:00
|
|
|
self.$filePicker.find('#picker-filestable').removeClass('view-grid');
|
2018-11-05 19:27:09 +03:00
|
|
|
}
|
|
|
|
|
2013-05-17 06:54:08 +04:00
|
|
|
$('body').append(self.$filePicker);
|
2013-04-06 12:07:12 +04:00
|
|
|
|
2018-10-23 11:38:00 +03:00
|
|
|
self.$showGridView = $('input#picker-showgridview');
|
|
|
|
self.$showGridView.on('change', _.bind(self._onGridviewChange, self));
|
|
|
|
|
2018-11-05 19:27:09 +03:00
|
|
|
if (!OC.Util.isIE()) {
|
|
|
|
self._getGridSettings();
|
|
|
|
}
|
2018-10-23 11:38:00 +03:00
|
|
|
|
2018-12-20 16:34:26 +03:00
|
|
|
var newButton = self.$filePicker.find('.actions.creatable .button-add');
|
2019-03-28 15:06:06 +03:00
|
|
|
if (type === self.FILEPICKER_TYPE_CHOOSE) {
|
|
|
|
newButton.hide();
|
|
|
|
}
|
2019-04-29 19:16:15 +03:00
|
|
|
newButton.on('focus', function () {
|
|
|
|
self.$filePicker.ocdialog('setEnterCallback', function () {
|
2018-12-22 14:23:59 +03:00
|
|
|
event.stopImmediatePropagation();
|
|
|
|
event.preventDefault();
|
|
|
|
newButton.click();
|
|
|
|
});
|
|
|
|
});
|
2019-04-29 19:16:15 +03:00
|
|
|
newButton.on('blur', function () {
|
2018-12-22 14:23:59 +03:00
|
|
|
self.$filePicker.ocdialog('unsetEnterCallback');
|
|
|
|
});
|
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
OC.registerMenu(newButton, self.$filePicker.find('.menu'), function () {
|
2018-12-20 16:34:26 +03:00
|
|
|
$input.focus();
|
2019-04-29 19:16:15 +03:00
|
|
|
self.$filePicker.ocdialog('setEnterCallback', function () {
|
2018-12-22 14:06:56 +03:00
|
|
|
event.stopImmediatePropagation();
|
|
|
|
event.preventDefault();
|
2018-12-20 16:34:26 +03:00
|
|
|
self.$form.submit();
|
|
|
|
});
|
|
|
|
var newName = $input.val();
|
2019-01-19 01:53:10 +03:00
|
|
|
var lastPos = newName.lastIndexOf('.');
|
2018-12-20 16:34:26 +03:00
|
|
|
if (lastPos === -1) {
|
|
|
|
lastPos = newName.length;
|
|
|
|
}
|
|
|
|
$input.selectRange(0, lastPos);
|
|
|
|
});
|
|
|
|
var $form = self.$filePicker.find('.filenameform');
|
|
|
|
var $input = $form.find('input[type=\'text\']');
|
|
|
|
var $submit = $form.find('input[type=\'submit\']');
|
2019-04-29 19:16:15 +03:00
|
|
|
$submit.on('click', function (event) {
|
2018-12-22 14:06:56 +03:00
|
|
|
event.stopImmediatePropagation();
|
2018-12-20 16:34:26 +03:00
|
|
|
event.preventDefault();
|
|
|
|
$form.submit();
|
|
|
|
});
|
|
|
|
|
|
|
|
var checkInput = function () {
|
|
|
|
var filename = $input.val();
|
|
|
|
try {
|
|
|
|
if (!Files.isFileNameValid(filename)) {
|
|
|
|
// Files.isFileNameValid(filename) throws an exception itself
|
2019-04-29 19:16:15 +03:00
|
|
|
} else if (self.filelist.find(function (file) {
|
|
|
|
return file.name === this;
|
|
|
|
}, filename)) {
|
2018-12-20 16:34:26 +03:00
|
|
|
throw t('files', '{newName} already exists', {newName: filename}, undefined, {
|
|
|
|
escape: false
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
} catch (error) {
|
|
|
|
$input.attr('title', error);
|
2019-04-29 19:16:15 +03:00
|
|
|
$input.tooltip({
|
|
|
|
placement: 'right',
|
|
|
|
trigger: 'manual',
|
|
|
|
'container': '.newFolderMenu'
|
|
|
|
});
|
2018-12-20 16:34:26 +03:00
|
|
|
$input.tooltip('fixTitle');
|
|
|
|
$input.tooltip('show');
|
|
|
|
$input.addClass('error');
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
$form.on('submit', function (event) {
|
2018-12-20 16:34:26 +03:00
|
|
|
event.stopPropagation();
|
|
|
|
event.preventDefault();
|
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
if (checkInput()) {
|
2018-12-20 16:34:26 +03:00
|
|
|
var newname = $input.val();
|
|
|
|
self.filepicker.filesClient.createDirectory(self.$filePicker.data('path') + "/" + newname).always(function (status) {
|
2019-09-26 18:21:38 +03:00
|
|
|
self._fillFilePicker(self.$filePicker.data('path') + "/" + newname);
|
2018-12-20 16:34:26 +03:00
|
|
|
});
|
|
|
|
OC.hideMenus();
|
|
|
|
self.$filePicker.ocdialog('unsetEnterCallback');
|
|
|
|
self.$filePicker.click();
|
2018-12-22 14:06:56 +03:00
|
|
|
$input.val(newText);
|
2018-12-20 16:34:26 +03:00
|
|
|
}
|
|
|
|
});
|
2019-04-29 19:16:15 +03:00
|
|
|
$input.keypress(function (event) {
|
2018-12-31 21:10:41 +03:00
|
|
|
if (event.keyCode === 13 || event.which === 13) {
|
2018-12-22 14:06:56 +03:00
|
|
|
event.stopImmediatePropagation();
|
|
|
|
event.preventDefault();
|
2018-12-20 16:34:26 +03:00
|
|
|
$form.submit();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
self.$filePicker.ready(function () {
|
2018-11-08 15:30:39 +03:00
|
|
|
self.$fileListHeader = self.$filePicker.find('.filelist thead tr');
|
2016-10-17 15:26:25 +03:00
|
|
|
self.$filelist = self.$filePicker.find('.filelist tbody');
|
2018-11-16 16:50:40 +03:00
|
|
|
self.$filelistContainer = self.$filePicker.find('.filelist-container');
|
2013-05-17 06:54:08 +04:00
|
|
|
self.$dirTree = self.$filePicker.find('.dirtree');
|
2017-08-27 18:39:22 +03:00
|
|
|
self.$dirTree.on('click', 'div:not(:last-child)', self, function (event) {
|
|
|
|
self._handleTreeListSelect(event, type);
|
|
|
|
});
|
2019-04-29 19:16:15 +03:00
|
|
|
self.$filelist.on('click', 'tr', function (event) {
|
2017-08-27 18:39:22 +03:00
|
|
|
self._handlePickerClick(event, $(this), type);
|
2013-05-16 02:23:05 +04:00
|
|
|
});
|
2019-04-29 19:16:15 +03:00
|
|
|
self.$fileListHeader.on('click', 'a', function (event) {
|
2018-11-08 15:30:39 +03:00
|
|
|
var dir = self.$filePicker.data('path');
|
|
|
|
self.filepicker.sortField = $(event.currentTarget).data('sort');
|
|
|
|
self.filepicker.sortOrder = self.filepicker.sortOrder === 'asc' ? 'desc' : 'asc';
|
|
|
|
self._fillFilePicker(dir);
|
|
|
|
});
|
2018-11-09 14:23:51 +03:00
|
|
|
self._fillFilePicker(path);
|
2013-09-03 01:53:45 +04:00
|
|
|
});
|
2013-04-06 12:07:12 +04:00
|
|
|
|
2013-05-16 02:23:05 +04:00
|
|
|
// build buttons
|
2019-04-29 19:16:15 +03:00
|
|
|
var functionToCall = function (returnType) {
|
2013-05-16 02:23:05 +04:00
|
|
|
if (callback !== undefined) {
|
|
|
|
var datapath;
|
|
|
|
if (multiselect === true) {
|
|
|
|
datapath = [];
|
2019-04-29 19:16:15 +03:00
|
|
|
self.$filelist.find('tr.filepicker_element_selected').each(function (index, element) {
|
2016-10-17 15:26:25 +03:00
|
|
|
datapath.push(self.$filePicker.data('path') + '/' + $(element).data('entryname'));
|
2013-05-16 02:23:05 +04:00
|
|
|
});
|
|
|
|
} else {
|
2013-07-31 23:21:02 +04:00
|
|
|
datapath = self.$filePicker.data('path');
|
2016-10-20 16:42:57 +03:00
|
|
|
var selectedName = self.$filelist.find('tr.filepicker_element_selected').data('entryname');
|
|
|
|
if (selectedName) {
|
|
|
|
datapath += '/' + selectedName;
|
|
|
|
}
|
2013-05-16 02:23:05 +04:00
|
|
|
}
|
2017-08-27 18:39:22 +03:00
|
|
|
callback(datapath, returnType);
|
2013-06-02 23:52:59 +04:00
|
|
|
self.$filePicker.ocdialog('close');
|
2012-05-05 15:48:12 +04:00
|
|
|
}
|
2013-05-16 02:23:05 +04:00
|
|
|
};
|
2017-08-27 18:39:22 +03:00
|
|
|
|
|
|
|
var chooseCallback = function () {
|
2019-04-29 19:16:15 +03:00
|
|
|
functionToCall(Dialogs.FILEPICKER_TYPE_CHOOSE);
|
2017-08-27 18:39:22 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
var copyCallback = function () {
|
2019-04-29 19:16:15 +03:00
|
|
|
functionToCall(Dialogs.FILEPICKER_TYPE_COPY);
|
2017-08-27 18:39:22 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
var moveCallback = function () {
|
2019-04-29 19:16:15 +03:00
|
|
|
functionToCall(Dialogs.FILEPICKER_TYPE_MOVE);
|
2017-08-27 18:39:22 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
var buttonlist = [];
|
2019-04-29 19:16:15 +03:00
|
|
|
if (type === Dialogs.FILEPICKER_TYPE_CHOOSE) {
|
2017-08-27 18:39:22 +03:00
|
|
|
buttonlist.push({
|
|
|
|
text: t('core', 'Choose'),
|
|
|
|
click: chooseCallback,
|
|
|
|
defaultButton: true
|
|
|
|
});
|
|
|
|
} else {
|
2019-04-29 19:16:15 +03:00
|
|
|
if (type === Dialogs.FILEPICKER_TYPE_COPY || type === Dialogs.FILEPICKER_TYPE_COPY_MOVE) {
|
2017-08-27 18:39:22 +03:00
|
|
|
buttonlist.push({
|
|
|
|
text: t('core', 'Copy'),
|
|
|
|
click: copyCallback,
|
|
|
|
defaultButton: false
|
|
|
|
});
|
|
|
|
}
|
2019-04-29 19:16:15 +03:00
|
|
|
if (type === Dialogs.FILEPICKER_TYPE_MOVE || type === Dialogs.FILEPICKER_TYPE_COPY_MOVE) {
|
2017-08-27 18:39:22 +03:00
|
|
|
buttonlist.push({
|
|
|
|
text: t('core', 'Move'),
|
|
|
|
click: moveCallback,
|
|
|
|
defaultButton: true
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2013-04-06 12:07:12 +04:00
|
|
|
|
2013-06-02 23:52:59 +04:00
|
|
|
self.$filePicker.ocdialog({
|
2013-05-17 09:14:43 +04:00
|
|
|
closeOnEscape: true,
|
2015-05-06 12:15:48 +03:00
|
|
|
// max-width of 600
|
2016-11-28 16:05:46 +03:00
|
|
|
width: 600,
|
|
|
|
height: 500,
|
2013-05-16 02:23:05 +04:00
|
|
|
modal: modal,
|
2013-05-17 06:54:08 +04:00
|
|
|
buttons: buttonlist,
|
2017-08-27 18:39:22 +03:00
|
|
|
style: {
|
|
|
|
buttons: 'aside',
|
|
|
|
},
|
2019-04-29 19:16:15 +03:00
|
|
|
close: function () {
|
2013-06-03 05:19:35 +04:00
|
|
|
try {
|
|
|
|
$(this).ocdialog('destroy').remove();
|
2019-04-29 19:16:15 +03:00
|
|
|
} catch (e) {
|
|
|
|
}
|
2013-05-17 06:54:08 +04:00
|
|
|
self.$filePicker = null;
|
|
|
|
}
|
2013-05-16 02:23:05 +04:00
|
|
|
});
|
2016-08-22 15:21:47 +03:00
|
|
|
|
|
|
|
// We can access primary class only from oc-dialog.
|
|
|
|
// Hence this is one of the approach to get the choose button.
|
|
|
|
var getOcDialog = self.$filePicker.closest('.oc-dialog');
|
|
|
|
var buttonEnableDisable = getOcDialog.find('.primary');
|
2019-08-21 17:59:49 +03:00
|
|
|
if (self.$filePicker.data('mimetype').indexOf("httpd/unix-directory") !== -1 && !self.$filePicker.data('.allowDirectoryChooser')) {
|
2016-10-17 14:08:55 +03:00
|
|
|
buttonEnableDisable.prop("disabled", false);
|
|
|
|
} else {
|
|
|
|
buttonEnableDisable.prop("disabled", true);
|
|
|
|
}
|
2013-05-16 02:23:05 +04:00
|
|
|
})
|
2019-04-29 19:16:15 +03:00
|
|
|
.fail(function (status, error) {
|
|
|
|
// If the method is called while navigating away
|
|
|
|
// from the page, it is probably not needed ;)
|
|
|
|
self.filepicker.loading = false;
|
|
|
|
if (status !== 0) {
|
|
|
|
alert(t('core', 'Error loading file picker template: {error}', {error: error}));
|
|
|
|
}
|
|
|
|
});
|
2012-05-05 15:48:12 +04:00
|
|
|
},
|
2013-04-06 12:07:12 +04:00
|
|
|
/**
|
|
|
|
* Displays raw dialog
|
|
|
|
* You better use a wrapper instead ...
|
2019-04-29 19:16:15 +03:00
|
|
|
*/
|
|
|
|
message: function (content, title, dialogType, buttons, callback, modal, allowHtml) {
|
|
|
|
return $.when(this._getMessageTemplate()).then(function ($tmpl) {
|
|
|
|
var dialogName = 'oc-dialog-' + Dialogs.dialogsCounter + '-content';
|
2014-04-14 21:29:00 +04:00
|
|
|
var dialogId = '#' + dialogName;
|
2013-05-16 02:23:05 +04:00
|
|
|
var $dlg = $tmpl.octemplate({
|
2014-04-14 21:29:00 +04:00
|
|
|
dialog_name: dialogName,
|
2013-05-16 02:23:05 +04:00
|
|
|
title: title,
|
|
|
|
message: content,
|
2014-04-14 21:29:00 +04:00
|
|
|
type: dialogType
|
2016-10-31 14:22:21 +03:00
|
|
|
}, allowHtml ? {escapeFunction: ''} : {});
|
2013-08-01 20:44:01 +04:00
|
|
|
if (modal === undefined) {
|
|
|
|
modal = false;
|
|
|
|
}
|
2013-05-16 02:23:05 +04:00
|
|
|
$('body').append($dlg);
|
|
|
|
var buttonlist = [];
|
|
|
|
switch (buttons) {
|
2019-04-29 19:16:15 +03:00
|
|
|
case Dialogs.YES_NO_BUTTONS:
|
|
|
|
buttonlist = [{
|
|
|
|
text: t('core', 'No'),
|
|
|
|
click: function () {
|
|
|
|
if (callback !== undefined) {
|
|
|
|
callback(false);
|
|
|
|
}
|
|
|
|
$(dialogId).ocdialog('close');
|
2014-04-14 21:29:00 +04:00
|
|
|
}
|
2019-04-29 19:16:15 +03:00
|
|
|
},
|
|
|
|
{
|
|
|
|
text: t('core', 'Yes'),
|
|
|
|
click: function () {
|
|
|
|
if (callback !== undefined) {
|
|
|
|
callback(true);
|
|
|
|
}
|
|
|
|
$(dialogId).ocdialog('close');
|
|
|
|
},
|
|
|
|
defaultButton: true
|
|
|
|
}];
|
|
|
|
break;
|
|
|
|
case Dialogs.OK_BUTTON:
|
|
|
|
var functionToCall = function () {
|
2014-04-14 21:29:00 +04:00
|
|
|
$(dialogId).ocdialog('close');
|
|
|
|
if (callback !== undefined) {
|
2019-04-29 19:16:15 +03:00
|
|
|
callback();
|
2013-05-16 02:23:05 +04:00
|
|
|
}
|
2019-04-29 19:16:15 +03:00
|
|
|
};
|
|
|
|
buttonlist[0] = {
|
|
|
|
text: t('core', 'OK'),
|
|
|
|
click: functionToCall,
|
|
|
|
defaultButton: true
|
|
|
|
};
|
|
|
|
break;
|
2013-07-31 23:21:02 +04:00
|
|
|
}
|
2013-04-06 12:07:12 +04:00
|
|
|
|
2014-04-14 21:29:00 +04:00
|
|
|
$(dialogId).ocdialog({
|
2013-05-17 09:14:43 +04:00
|
|
|
closeOnEscape: true,
|
2013-05-16 02:23:05 +04:00
|
|
|
modal: modal,
|
|
|
|
buttons: buttonlist
|
|
|
|
});
|
2019-04-29 19:16:15 +03:00
|
|
|
Dialogs.dialogsCounter++;
|
2013-05-16 02:23:05 +04:00
|
|
|
})
|
2019-04-29 19:16:15 +03:00
|
|
|
.fail(function (status, error) {
|
|
|
|
// If the method is called while navigating away from
|
|
|
|
// the page, we still want to deliver the message.
|
|
|
|
if (status === 0) {
|
|
|
|
alert(title + ': ' + content);
|
|
|
|
} else {
|
|
|
|
alert(t('core', 'Error loading message template: {error}', {error: error}));
|
|
|
|
}
|
|
|
|
});
|
2013-08-12 14:33:22 +04:00
|
|
|
},
|
2013-08-22 16:29:00 +04:00
|
|
|
_fileexistsshown: false,
|
2013-08-12 14:33:22 +04:00
|
|
|
/**
|
|
|
|
* Displays file exists dialog
|
2013-08-22 16:29:00 +04:00
|
|
|
* @param {object} data upload object
|
|
|
|
* @param {object} original file with name, size and mtime
|
|
|
|
* @param {object} replacement file with name, size and mtime
|
|
|
|
* @param {object} controller with onCancel, onSkip, onReplace and onRename methods
|
2015-10-02 10:55:43 +03:00
|
|
|
* @return {Promise} jquery promise that resolves after the dialog template was loaded
|
2019-04-29 19:16:15 +03:00
|
|
|
*/
|
|
|
|
fileexists: function (data, original, replacement, controller) {
|
2013-08-22 16:29:00 +04:00
|
|
|
var self = this;
|
2015-10-02 10:55:43 +03:00
|
|
|
var dialogDeferred = new $.Deferred();
|
2013-09-07 16:52:56 +04:00
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
var getCroppedPreview = function (file) {
|
2013-09-07 16:52:56 +04:00
|
|
|
var deferred = new $.Deferred();
|
|
|
|
// Only process image files.
|
2013-10-10 17:54:00 +04:00
|
|
|
var type = file.type && file.type.split('/').shift();
|
2013-09-07 16:52:56 +04:00
|
|
|
if (window.FileReader && type === 'image') {
|
|
|
|
var reader = new FileReader();
|
|
|
|
reader.onload = function (e) {
|
2013-09-19 11:47:51 +04:00
|
|
|
var blob = new Blob([e.target.result]);
|
2013-09-07 16:52:56 +04:00
|
|
|
window.URL = window.URL || window.webkitURL;
|
|
|
|
var originalUrl = window.URL.createObjectURL(blob);
|
|
|
|
var image = new Image();
|
|
|
|
image.src = originalUrl;
|
|
|
|
image.onload = function () {
|
|
|
|
var url = crop(image);
|
|
|
|
deferred.resolve(url);
|
2014-04-14 21:29:00 +04:00
|
|
|
};
|
2013-09-07 16:52:56 +04:00
|
|
|
};
|
|
|
|
reader.readAsArrayBuffer(file);
|
|
|
|
} else {
|
|
|
|
deferred.reject();
|
|
|
|
}
|
|
|
|
return deferred;
|
|
|
|
};
|
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
var crop = function (img) {
|
2013-09-07 16:52:56 +04:00
|
|
|
var canvas = document.createElement('canvas'),
|
2019-04-29 19:16:15 +03:00
|
|
|
targetSize = 96,
|
|
|
|
width = img.width,
|
|
|
|
height = img.height,
|
|
|
|
x, y, size;
|
2013-09-07 16:52:56 +04:00
|
|
|
|
2015-09-29 17:32:43 +03:00
|
|
|
// Calculate the width and height, constraining the proportions
|
2013-09-07 16:52:56 +04:00
|
|
|
if (width > height) {
|
|
|
|
y = 0;
|
|
|
|
x = (width - height) / 2;
|
|
|
|
} else {
|
|
|
|
y = (height - width) / 2;
|
|
|
|
x = 0;
|
|
|
|
}
|
|
|
|
size = Math.min(width, height);
|
|
|
|
|
2015-09-29 17:32:43 +03:00
|
|
|
// Set canvas size to the cropped area
|
|
|
|
canvas.width = size;
|
|
|
|
canvas.height = size;
|
2013-09-07 16:52:56 +04:00
|
|
|
var ctx = canvas.getContext("2d");
|
2015-09-29 17:32:43 +03:00
|
|
|
ctx.drawImage(img, x, y, size, size, 0, 0, size, size);
|
|
|
|
|
|
|
|
// Resize the canvas to match the destination (right size uses 96px)
|
|
|
|
resampleHermite(canvas, size, size, targetSize, targetSize);
|
|
|
|
|
2013-09-07 16:52:56 +04:00
|
|
|
return canvas.toDataURL("image/png", 0.7);
|
|
|
|
};
|
|
|
|
|
2015-09-29 17:32:43 +03:00
|
|
|
/**
|
|
|
|
* Fast image resize/resample using Hermite filter with JavaScript.
|
|
|
|
*
|
|
|
|
* @author: ViliusL
|
|
|
|
*
|
|
|
|
* @param {*} canvas
|
|
|
|
* @param {number} W
|
|
|
|
* @param {number} H
|
|
|
|
* @param {number} W2
|
|
|
|
* @param {number} H2
|
|
|
|
*/
|
|
|
|
var resampleHermite = function (canvas, W, H, W2, H2) {
|
|
|
|
W2 = Math.round(W2);
|
|
|
|
H2 = Math.round(H2);
|
|
|
|
var img = canvas.getContext("2d").getImageData(0, 0, W, H);
|
|
|
|
var img2 = canvas.getContext("2d").getImageData(0, 0, W2, H2);
|
|
|
|
var data = img.data;
|
|
|
|
var data2 = img2.data;
|
|
|
|
var ratio_w = W / W2;
|
|
|
|
var ratio_h = H / H2;
|
|
|
|
var ratio_w_half = Math.ceil(ratio_w / 2);
|
|
|
|
var ratio_h_half = Math.ceil(ratio_h / 2);
|
|
|
|
|
|
|
|
for (var j = 0; j < H2; j++) {
|
|
|
|
for (var i = 0; i < W2; i++) {
|
|
|
|
var x2 = (i + j * W2) * 4;
|
|
|
|
var weight = 0;
|
|
|
|
var weights = 0;
|
|
|
|
var weights_alpha = 0;
|
|
|
|
var gx_r = 0;
|
|
|
|
var gx_g = 0;
|
|
|
|
var gx_b = 0;
|
|
|
|
var gx_a = 0;
|
|
|
|
var center_y = (j + 0.5) * ratio_h;
|
|
|
|
for (var yy = Math.floor(j * ratio_h); yy < (j + 1) * ratio_h; yy++) {
|
|
|
|
var dy = Math.abs(center_y - (yy + 0.5)) / ratio_h_half;
|
|
|
|
var center_x = (i + 0.5) * ratio_w;
|
|
|
|
var w0 = dy * dy; //pre-calc part of w
|
|
|
|
for (var xx = Math.floor(i * ratio_w); xx < (i + 1) * ratio_w; xx++) {
|
|
|
|
var dx = Math.abs(center_x - (xx + 0.5)) / ratio_w_half;
|
|
|
|
var w = Math.sqrt(w0 + dx * dx);
|
|
|
|
if (w >= -1 && w <= 1) {
|
|
|
|
//hermite filter
|
|
|
|
weight = 2 * w * w * w - 3 * w * w + 1;
|
|
|
|
if (weight > 0) {
|
|
|
|
dx = 4 * (xx + yy * W);
|
|
|
|
//alpha
|
|
|
|
gx_a += weight * data[dx + 3];
|
|
|
|
weights_alpha += weight;
|
|
|
|
//colors
|
|
|
|
if (data[dx + 3] < 255)
|
|
|
|
weight = weight * data[dx + 3] / 250;
|
|
|
|
gx_r += weight * data[dx];
|
|
|
|
gx_g += weight * data[dx + 1];
|
|
|
|
gx_b += weight * data[dx + 2];
|
|
|
|
weights += weight;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
data2[x2] = gx_r / weights;
|
|
|
|
data2[x2 + 1] = gx_g / weights;
|
|
|
|
data2[x2 + 2] = gx_b / weights;
|
|
|
|
data2[x2 + 3] = gx_a / weights_alpha;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
canvas.getContext("2d").clearRect(0, 0, Math.max(W, W2), Math.max(H, H2));
|
|
|
|
canvas.width = W2;
|
|
|
|
canvas.height = H2;
|
|
|
|
canvas.getContext("2d").putImageData(img2, 0, 0);
|
|
|
|
};
|
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
var addConflict = function ($conflicts, original, replacement) {
|
2013-09-07 16:52:56 +04:00
|
|
|
|
2014-12-08 17:26:31 +03:00
|
|
|
var $conflict = $conflicts.find('.template').clone().removeClass('template').addClass('conflict');
|
|
|
|
var $originalDiv = $conflict.find('.original');
|
|
|
|
var $replacementDiv = $conflict.find('.replacement');
|
2013-09-07 16:52:56 +04:00
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
$conflict.data('data', data);
|
2013-09-07 16:52:56 +04:00
|
|
|
|
2014-12-08 17:26:31 +03:00
|
|
|
$conflict.find('.filename').text(original.name);
|
|
|
|
$originalDiv.find('.size').text(humanFileSize(original.size));
|
|
|
|
$originalDiv.find('.mtime').text(formatDate(original.mtime));
|
2013-09-18 19:58:15 +04:00
|
|
|
// ie sucks
|
|
|
|
if (replacement.size && replacement.lastModifiedDate) {
|
2014-12-08 17:26:31 +03:00
|
|
|
$replacementDiv.find('.size').text(humanFileSize(replacement.size));
|
|
|
|
$replacementDiv.find('.mtime').text(formatDate(replacement.lastModifiedDate));
|
2013-09-18 19:58:15 +04:00
|
|
|
}
|
2019-04-29 19:16:15 +03:00
|
|
|
var path = original.directory + '/' + original.name;
|
2015-05-29 14:49:51 +03:00
|
|
|
var urlSpec = {
|
2019-04-29 19:16:15 +03:00
|
|
|
file: path,
|
|
|
|
x: 96,
|
|
|
|
y: 96,
|
|
|
|
c: original.etag,
|
|
|
|
forceIcon: 0
|
2015-05-29 14:49:51 +03:00
|
|
|
};
|
2015-07-20 17:51:28 +03:00
|
|
|
var previewpath = Files.generatePreviewUrl(urlSpec);
|
2015-05-29 19:34:38 +03:00
|
|
|
// Escaping single quotes
|
2015-07-20 17:51:28 +03:00
|
|
|
previewpath = previewpath.replace(/'/g, "%27");
|
2019-04-29 19:16:15 +03:00
|
|
|
$originalDiv.find('.icon').css({"background-image": "url('" + previewpath + "')"});
|
2013-09-18 19:58:15 +04:00
|
|
|
getCroppedPreview(replacement).then(
|
2019-04-29 19:16:15 +03:00
|
|
|
function (path) {
|
|
|
|
$replacementDiv.find('.icon').css('background-image', 'url(' + path + ')');
|
|
|
|
}, function () {
|
2015-07-08 15:55:11 +03:00
|
|
|
path = OC.MimeType.getIconUrl(replacement.type);
|
2019-04-29 19:16:15 +03:00
|
|
|
$replacementDiv.find('.icon').css('background-image', 'url(' + path + ')');
|
2013-08-22 16:29:00 +04:00
|
|
|
}
|
2013-09-18 19:58:15 +04:00
|
|
|
);
|
2015-09-19 16:44:49 +03:00
|
|
|
// connect checkboxes with labels
|
|
|
|
var checkboxId = $conflicts.find('.conflict').length;
|
2019-04-29 19:16:15 +03:00
|
|
|
$originalDiv.find('input:checkbox').attr('id', 'checkbox_original_' + checkboxId);
|
|
|
|
$replacementDiv.find('input:checkbox').attr('id', 'checkbox_replacement_' + checkboxId);
|
2015-09-19 16:44:49 +03:00
|
|
|
|
2014-12-08 17:26:31 +03:00
|
|
|
$conflicts.append($conflict);
|
2013-09-07 16:52:56 +04:00
|
|
|
|
2013-09-18 19:58:15 +04:00
|
|
|
//set more recent mtime bold
|
|
|
|
// ie sucks
|
2014-05-21 15:19:02 +04:00
|
|
|
if (replacement.lastModifiedDate && replacement.lastModifiedDate.getTime() > original.mtime) {
|
2014-12-08 17:26:31 +03:00
|
|
|
$replacementDiv.find('.mtime').css('font-weight', 'bold');
|
2014-05-21 15:19:02 +04:00
|
|
|
} else if (replacement.lastModifiedDate && replacement.lastModifiedDate.getTime() < original.mtime) {
|
2014-12-08 17:26:31 +03:00
|
|
|
$originalDiv.find('.mtime').css('font-weight', 'bold');
|
2013-09-18 19:58:15 +04:00
|
|
|
} else {
|
|
|
|
//TODO add to same mtime collection?
|
|
|
|
}
|
|
|
|
|
|
|
|
// set bigger size bold
|
|
|
|
if (replacement.size && replacement.size > original.size) {
|
2014-12-08 17:26:31 +03:00
|
|
|
$replacementDiv.find('.size').css('font-weight', 'bold');
|
2013-09-18 19:58:15 +04:00
|
|
|
} else if (replacement.size && replacement.size < original.size) {
|
2014-12-08 17:26:31 +03:00
|
|
|
$originalDiv.find('.size').css('font-weight', 'bold');
|
2013-09-18 19:58:15 +04:00
|
|
|
} else {
|
|
|
|
//TODO add to same size collection?
|
|
|
|
}
|
2013-09-07 16:52:56 +04:00
|
|
|
|
2013-09-18 19:58:15 +04:00
|
|
|
//TODO show skip action for files with same size and mtime in bottom row
|
2013-09-07 16:52:56 +04:00
|
|
|
|
2014-12-08 17:26:31 +03:00
|
|
|
// always keep readonly files
|
|
|
|
|
|
|
|
if (original.status === 'readonly') {
|
|
|
|
$originalDiv
|
|
|
|
.addClass('readonly')
|
|
|
|
.find('input[type="checkbox"]')
|
2019-04-29 19:16:15 +03:00
|
|
|
.prop('checked', true)
|
|
|
|
.prop('disabled', true);
|
2014-12-08 17:26:31 +03:00
|
|
|
$originalDiv.find('.message')
|
2019-04-29 19:16:15 +03:00
|
|
|
.text(t('core', 'read-only'));
|
2014-12-08 17:26:31 +03:00
|
|
|
}
|
2013-09-04 17:24:25 +04:00
|
|
|
};
|
2013-09-07 00:40:10 +04:00
|
|
|
//var selection = controller.getSelection(data.originalFiles);
|
|
|
|
//if (selection.defaultAction) {
|
|
|
|
// controller[selection.defaultAction](data);
|
|
|
|
//} else {
|
2014-04-14 21:29:00 +04:00
|
|
|
var dialogName = 'oc-dialog-fileexists-content';
|
|
|
|
var dialogId = '#' + dialogName;
|
|
|
|
if (this._fileexistsshown) {
|
|
|
|
// add conflict
|
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
var $conflicts = $(dialogId + ' .conflicts');
|
2014-12-08 17:26:31 +03:00
|
|
|
addConflict($conflicts, original, replacement);
|
2014-04-14 21:29:00 +04:00
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
var count = $(dialogId + ' .conflict').length;
|
2014-04-14 21:29:00 +04:00
|
|
|
var title = n('core',
|
2019-04-29 19:16:15 +03:00
|
|
|
'{count} file conflict',
|
|
|
|
'{count} file conflicts',
|
|
|
|
count,
|
|
|
|
{count: count}
|
|
|
|
);
|
2014-04-14 21:29:00 +04:00
|
|
|
$(dialogId).parent().children('.oc-dialog-title').text(title);
|
|
|
|
|
|
|
|
//recalculate dimensions
|
|
|
|
$(window).trigger('resize');
|
2015-10-02 10:55:43 +03:00
|
|
|
dialogDeferred.resolve();
|
2014-04-14 21:29:00 +04:00
|
|
|
} else {
|
|
|
|
//create dialog
|
|
|
|
this._fileexistsshown = true;
|
2019-04-29 19:16:15 +03:00
|
|
|
$.when(this._getFileExistsTemplate()).then(function ($tmpl) {
|
|
|
|
var title = t('core', 'One file conflict');
|
2014-04-14 21:29:00 +04:00
|
|
|
var $dlg = $tmpl.octemplate({
|
|
|
|
dialog_name: dialogName,
|
|
|
|
title: title,
|
|
|
|
type: 'fileexists',
|
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
allnewfiles: t('core', 'New Files'),
|
|
|
|
allexistingfiles: t('core', 'Already existing files'),
|
2014-04-14 21:29:00 +04:00
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
why: t('core', 'Which files do you want to keep?'),
|
|
|
|
what: t('core', 'If you select both versions, the copied file will have a number added to its name.')
|
2014-04-14 21:29:00 +04:00
|
|
|
});
|
|
|
|
$('body').append($dlg);
|
2013-09-07 16:52:56 +04:00
|
|
|
|
2015-10-02 10:55:43 +03:00
|
|
|
if (original && replacement) {
|
|
|
|
var $conflicts = $dlg.find('.conflicts');
|
|
|
|
addConflict($conflicts, original, replacement);
|
|
|
|
}
|
2013-09-07 16:52:56 +04:00
|
|
|
|
2014-04-14 21:29:00 +04:00
|
|
|
var buttonlist = [{
|
2019-04-29 19:16:15 +03:00
|
|
|
text: t('core', 'Cancel'),
|
|
|
|
classes: 'cancel',
|
|
|
|
click: function () {
|
|
|
|
if (typeof controller.onCancel !== 'undefined') {
|
|
|
|
controller.onCancel(data);
|
2014-04-14 21:29:00 +04:00
|
|
|
}
|
2019-04-29 19:16:15 +03:00
|
|
|
$(dialogId).ocdialog('close');
|
|
|
|
}
|
|
|
|
},
|
2014-04-14 21:29:00 +04:00
|
|
|
{
|
|
|
|
text: t('core', 'Continue'),
|
|
|
|
classes: 'continue',
|
2019-04-29 19:16:15 +03:00
|
|
|
click: function () {
|
|
|
|
if (typeof controller.onContinue !== 'undefined') {
|
2014-04-14 21:29:00 +04:00
|
|
|
controller.onContinue($(dialogId + ' .conflict'));
|
2013-08-16 13:40:55 +04:00
|
|
|
}
|
2014-04-14 21:29:00 +04:00
|
|
|
$(dialogId).ocdialog('close');
|
|
|
|
}
|
|
|
|
}];
|
|
|
|
|
|
|
|
$(dialogId).ocdialog({
|
|
|
|
width: 500,
|
|
|
|
closeOnEscape: true,
|
|
|
|
modal: true,
|
|
|
|
buttons: buttonlist,
|
|
|
|
closeButton: null,
|
2019-04-29 19:16:15 +03:00
|
|
|
close: function () {
|
|
|
|
self._fileexistsshown = false;
|
|
|
|
$(this).ocdialog('destroy').remove();
|
|
|
|
}
|
2014-04-14 21:29:00 +04:00
|
|
|
});
|
2013-09-07 16:52:56 +04:00
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
$(dialogId).css('height', 'auto');
|
2013-08-12 14:33:22 +04:00
|
|
|
|
2015-10-08 13:27:33 +03:00
|
|
|
var $primaryButton = $dlg.closest('.oc-dialog').find('button.continue');
|
|
|
|
$primaryButton.prop('disabled', true);
|
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
function updatePrimaryButton () {
|
2015-10-08 18:13:28 +03:00
|
|
|
var checkedCount = $dlg.find('.conflicts .checkbox:checked').length;
|
2015-10-08 13:27:33 +03:00
|
|
|
$primaryButton.prop('disabled', checkedCount === 0);
|
|
|
|
}
|
|
|
|
|
2014-04-14 21:29:00 +04:00
|
|
|
//add checkbox toggling actions
|
2019-04-29 19:16:15 +03:00
|
|
|
$(dialogId).find('.allnewfiles').on('click', function () {
|
2014-12-08 17:26:31 +03:00
|
|
|
var $checkboxes = $(dialogId).find('.conflict .replacement input[type="checkbox"]');
|
|
|
|
$checkboxes.prop('checked', $(this).prop('checked'));
|
2014-04-14 21:29:00 +04:00
|
|
|
});
|
2019-04-29 19:16:15 +03:00
|
|
|
$(dialogId).find('.allexistingfiles').on('click', function () {
|
2014-12-08 17:26:31 +03:00
|
|
|
var $checkboxes = $(dialogId).find('.conflict .original:not(.readonly) input[type="checkbox"]');
|
|
|
|
$checkboxes.prop('checked', $(this).prop('checked'));
|
2014-04-14 21:29:00 +04:00
|
|
|
});
|
2019-04-29 19:16:15 +03:00
|
|
|
$(dialogId).find('.conflicts').on('click', '.replacement,.original:not(.readonly)', function () {
|
2014-12-08 17:26:31 +03:00
|
|
|
var $checkbox = $(this).find('input[type="checkbox"]');
|
|
|
|
$checkbox.prop('checked', !$checkbox.prop('checked'));
|
2014-04-14 21:29:00 +04:00
|
|
|
});
|
2019-04-29 19:16:15 +03:00
|
|
|
$(dialogId).find('.conflicts').on('click', '.replacement input[type="checkbox"],.original:not(.readonly) input[type="checkbox"]', function () {
|
2014-12-08 17:26:31 +03:00
|
|
|
var $checkbox = $(this);
|
2015-10-02 10:55:43 +03:00
|
|
|
$checkbox.prop('checked', !$checkbox.prop('checked'));
|
2014-04-14 21:29:00 +04:00
|
|
|
});
|
2013-09-07 16:52:56 +04:00
|
|
|
|
2014-04-14 21:29:00 +04:00
|
|
|
//update counters
|
2019-04-29 19:16:15 +03:00
|
|
|
$(dialogId).on('click', '.replacement,.allnewfiles', function () {
|
2014-04-14 21:29:00 +04:00
|
|
|
var count = $(dialogId).find('.conflict .replacement input[type="checkbox"]:checked').length;
|
2019-04-29 19:16:15 +03:00
|
|
|
if (count === $(dialogId + ' .conflict').length) {
|
2014-04-14 21:29:00 +04:00
|
|
|
$(dialogId).find('.allnewfiles').prop('checked', true);
|
2019-04-29 19:16:15 +03:00
|
|
|
$(dialogId).find('.allnewfiles + .count').text(t('core', '(all selected)'));
|
2014-04-14 21:29:00 +04:00
|
|
|
} else if (count > 0) {
|
|
|
|
$(dialogId).find('.allnewfiles').prop('checked', false);
|
2019-04-29 19:16:15 +03:00
|
|
|
$(dialogId).find('.allnewfiles + .count').text(t('core', '({count} selected)', {count: count}));
|
2014-04-14 21:29:00 +04:00
|
|
|
} else {
|
|
|
|
$(dialogId).find('.allnewfiles').prop('checked', false);
|
|
|
|
$(dialogId).find('.allnewfiles + .count').text('');
|
|
|
|
}
|
2015-10-08 13:27:33 +03:00
|
|
|
updatePrimaryButton();
|
2013-08-22 16:29:00 +04:00
|
|
|
});
|
2019-04-29 19:16:15 +03:00
|
|
|
$(dialogId).on('click', '.original,.allexistingfiles', function () {
|
2014-04-14 21:29:00 +04:00
|
|
|
var count = $(dialogId).find('.conflict .original input[type="checkbox"]:checked').length;
|
2019-04-29 19:16:15 +03:00
|
|
|
if (count === $(dialogId + ' .conflict').length) {
|
2014-04-14 21:29:00 +04:00
|
|
|
$(dialogId).find('.allexistingfiles').prop('checked', true);
|
2019-04-29 19:16:15 +03:00
|
|
|
$(dialogId).find('.allexistingfiles + .count').text(t('core', '(all selected)'));
|
2014-04-14 21:29:00 +04:00
|
|
|
} else if (count > 0) {
|
|
|
|
$(dialogId).find('.allexistingfiles').prop('checked', false);
|
|
|
|
$(dialogId).find('.allexistingfiles + .count')
|
2019-04-29 19:16:15 +03:00
|
|
|
.text(t('core', '({count} selected)', {count: count}));
|
2014-04-14 21:29:00 +04:00
|
|
|
} else {
|
|
|
|
$(dialogId).find('.allexistingfiles').prop('checked', false);
|
|
|
|
$(dialogId).find('.allexistingfiles + .count').text('');
|
|
|
|
}
|
2015-10-08 13:27:33 +03:00
|
|
|
updatePrimaryButton();
|
2014-04-14 21:29:00 +04:00
|
|
|
});
|
2015-10-08 13:27:33 +03:00
|
|
|
|
2015-10-02 10:55:43 +03:00
|
|
|
dialogDeferred.resolve();
|
2014-04-14 21:29:00 +04:00
|
|
|
})
|
2019-04-29 19:16:15 +03:00
|
|
|
.fail(function () {
|
|
|
|
dialogDeferred.reject();
|
|
|
|
alert(t('core', 'Error loading file exists template'));
|
|
|
|
});
|
2014-04-14 21:29:00 +04:00
|
|
|
}
|
2013-09-07 00:40:10 +04:00
|
|
|
//}
|
2015-10-02 10:55:43 +03:00
|
|
|
return dialogDeferred.promise();
|
2012-05-05 15:48:12 +04:00
|
|
|
},
|
2018-10-23 11:38:00 +03:00
|
|
|
// get the gridview setting and set the input accordingly
|
2019-04-29 19:16:15 +03:00
|
|
|
_getGridSettings: function () {
|
2018-10-23 11:38:00 +03:00
|
|
|
var self = this;
|
2019-04-29 19:16:15 +03:00
|
|
|
$.get(OC.generateUrl('/apps/files/api/v1/showgridview'), function (response) {
|
2018-11-29 16:05:10 +03:00
|
|
|
self.$showGridView.get(0).checked = response.gridview;
|
2018-10-23 11:38:00 +03:00
|
|
|
self.$showGridView.next('#picker-view-toggle')
|
|
|
|
.removeClass('icon-toggle-filelist icon-toggle-pictures')
|
|
|
|
.addClass(response.gridview ? 'icon-toggle-filelist' : 'icon-toggle-pictures')
|
|
|
|
$('.list-container').toggleClass('view-grid', response.gridview);
|
|
|
|
});
|
|
|
|
},
|
2019-04-29 19:16:15 +03:00
|
|
|
_onGridviewChange: function () {
|
2018-10-23 11:38:00 +03:00
|
|
|
var show = this.$showGridView.is(':checked');
|
|
|
|
// only save state if user is logged in
|
|
|
|
if (OC.currentUser) {
|
|
|
|
$.post(OC.generateUrl('/apps/files/api/v1/showgridview'), {
|
|
|
|
show: show
|
|
|
|
});
|
|
|
|
}
|
|
|
|
this.$showGridView.next('#picker-view-toggle')
|
|
|
|
.removeClass('icon-toggle-filelist icon-toggle-pictures')
|
|
|
|
.addClass(show ? 'icon-toggle-filelist' : 'icon-toggle-pictures')
|
|
|
|
$('.list-container').toggleClass('view-grid', show);
|
|
|
|
},
|
2019-04-29 19:16:15 +03:00
|
|
|
_getFilePickerTemplate: function () {
|
2013-05-17 10:42:15 +04:00
|
|
|
var defer = $.Deferred();
|
2019-04-29 19:16:15 +03:00
|
|
|
if (!this.$filePickerTemplate) {
|
2013-05-17 10:42:15 +04:00
|
|
|
var self = this;
|
2019-04-29 19:16:15 +03:00
|
|
|
$.get(OC.filePath('core', 'templates', 'filepicker.html'), function (tmpl) {
|
2013-05-17 10:42:15 +04:00
|
|
|
self.$filePickerTemplate = $(tmpl);
|
2018-11-08 15:30:39 +03:00
|
|
|
self.$listTmpl = self.$filePickerTemplate.find('.filelist tbody tr:first-child').detach();
|
2013-05-17 10:42:15 +04:00
|
|
|
defer.resolve(self.$filePickerTemplate);
|
|
|
|
})
|
2019-04-29 19:16:15 +03:00
|
|
|
.fail(function (jqXHR, textStatus, errorThrown) {
|
|
|
|
defer.reject(jqXHR.status, errorThrown);
|
|
|
|
});
|
2013-05-17 10:42:15 +04:00
|
|
|
} else {
|
|
|
|
defer.resolve(this.$filePickerTemplate);
|
|
|
|
}
|
|
|
|
return defer.promise();
|
|
|
|
},
|
2019-04-29 19:16:15 +03:00
|
|
|
_getMessageTemplate: function () {
|
2013-05-17 10:42:15 +04:00
|
|
|
var defer = $.Deferred();
|
2019-04-29 19:16:15 +03:00
|
|
|
if (!this.$messageTemplate) {
|
2013-05-17 10:42:15 +04:00
|
|
|
var self = this;
|
2019-04-29 19:16:15 +03:00
|
|
|
$.get(OC.filePath('core', 'templates', 'message.html'), function (tmpl) {
|
2013-05-17 10:42:15 +04:00
|
|
|
self.$messageTemplate = $(tmpl);
|
|
|
|
defer.resolve(self.$messageTemplate);
|
|
|
|
})
|
2019-04-29 19:16:15 +03:00
|
|
|
.fail(function (jqXHR, textStatus, errorThrown) {
|
|
|
|
defer.reject(jqXHR.status, errorThrown);
|
|
|
|
});
|
2013-05-17 10:42:15 +04:00
|
|
|
} else {
|
|
|
|
defer.resolve(this.$messageTemplate);
|
|
|
|
}
|
|
|
|
return defer.promise();
|
|
|
|
},
|
2013-08-12 14:33:22 +04:00
|
|
|
_getFileExistsTemplate: function () {
|
|
|
|
var defer = $.Deferred();
|
|
|
|
if (!this.$fileexistsTemplate) {
|
|
|
|
var self = this;
|
|
|
|
$.get(OC.filePath('files', 'templates', 'fileexists.html'), function (tmpl) {
|
|
|
|
self.$fileexistsTemplate = $(tmpl);
|
|
|
|
defer.resolve(self.$fileexistsTemplate);
|
|
|
|
})
|
2019-04-29 19:16:15 +03:00
|
|
|
.fail(function () {
|
|
|
|
defer.reject();
|
|
|
|
});
|
2013-08-12 14:33:22 +04:00
|
|
|
} else {
|
|
|
|
defer.resolve(this.$fileexistsTemplate);
|
|
|
|
}
|
|
|
|
return defer.promise();
|
|
|
|
},
|
2019-04-29 19:16:15 +03:00
|
|
|
_getFileList: function (dir, mimeType) { //this is only used by the spreedme app atm
|
|
|
|
if (typeof (mimeType) === "string") {
|
2013-09-06 15:33:17 +04:00
|
|
|
mimeType = [mimeType];
|
2013-09-05 18:54:12 +04:00
|
|
|
}
|
2013-09-05 20:40:55 +04:00
|
|
|
|
2013-05-17 10:42:15 +04:00
|
|
|
return $.getJSON(
|
2013-10-28 23:22:06 +04:00
|
|
|
OC.filePath('files', 'ajax', 'list.php'),
|
2013-09-05 20:40:55 +04:00
|
|
|
{
|
|
|
|
dir: dir,
|
|
|
|
mimetypes: JSON.stringify(mimeType)
|
|
|
|
}
|
2013-05-17 10:42:15 +04:00
|
|
|
);
|
|
|
|
},
|
2013-04-06 12:07:12 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* fills the filepicker with files
|
2019-04-29 19:16:15 +03:00
|
|
|
*/
|
|
|
|
_fillFilePicker: function (dir) {
|
2013-05-16 02:23:05 +04:00
|
|
|
var self = this;
|
2018-11-16 16:50:40 +03:00
|
|
|
this.$filelist.empty();
|
|
|
|
this.$filePicker.find('.emptycontent').hide();
|
|
|
|
this.$filelistContainer.addClass('icon-loading');
|
2013-05-17 06:54:08 +04:00
|
|
|
this.$filePicker.data('path', dir);
|
2016-10-17 14:35:59 +03:00
|
|
|
var filter = this.$filePicker.data('mimetype');
|
2019-04-29 19:16:15 +03:00
|
|
|
if (typeof (filter) === "string") {
|
2016-10-17 14:35:59 +03:00
|
|
|
filter = [filter];
|
|
|
|
}
|
2018-11-08 15:30:39 +03:00
|
|
|
self.$fileListHeader.find('.sort-indicator').addClass('hidden').removeClass('icon-triangle-n').removeClass('icon-triangle-s');
|
|
|
|
self.$fileListHeader.find('[data-sort=' + self.filepicker.sortField + '] .sort-indicator').removeClass('hidden');
|
|
|
|
if (self.filepicker.sortOrder === 'asc') {
|
|
|
|
self.$fileListHeader.find('[data-sort=' + self.filepicker.sortField + '] .sort-indicator').addClass('icon-triangle-n');
|
2018-11-08 15:32:10 +03:00
|
|
|
} else {
|
|
|
|
self.$fileListHeader.find('[data-sort=' + self.filepicker.sortField + '] .sort-indicator').addClass('icon-triangle-s');
|
2018-11-08 15:30:39 +03:00
|
|
|
}
|
2019-04-29 19:16:15 +03:00
|
|
|
self.filepicker.filesClient.getFolderContents(dir).then(function (status, files) {
|
2018-12-20 16:34:26 +03:00
|
|
|
self.filelist = files;
|
2018-08-30 15:40:12 +03:00
|
|
|
if (filter && filter.length > 0 && filter.indexOf('*') === -1) {
|
2016-10-19 15:22:33 +03:00
|
|
|
files = files.filter(function (file) {
|
2018-08-30 15:02:50 +03:00
|
|
|
return file.type === 'dir' || filter.indexOf(file.mimetype) !== -1;
|
2016-10-19 15:22:33 +03:00
|
|
|
});
|
|
|
|
}
|
2018-11-08 15:30:39 +03:00
|
|
|
|
|
|
|
var Comparators = {
|
2019-04-29 19:16:15 +03:00
|
|
|
name: function (fileInfo1, fileInfo2) {
|
2018-11-08 15:30:39 +03:00
|
|
|
if (fileInfo1.type === 'dir' && fileInfo2.type !== 'dir') {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (fileInfo1.type !== 'dir' && fileInfo2.type === 'dir') {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return OC.Util.naturalSortCompare(fileInfo1.name, fileInfo2.name);
|
|
|
|
},
|
2019-04-29 19:16:15 +03:00
|
|
|
size: function (fileInfo1, fileInfo2) {
|
2018-11-08 15:30:39 +03:00
|
|
|
return fileInfo1.size - fileInfo2.size;
|
|
|
|
},
|
2019-04-29 19:16:15 +03:00
|
|
|
mtime: function (fileInfo1, fileInfo2) {
|
2018-11-08 15:30:39 +03:00
|
|
|
return fileInfo1.mtime - fileInfo2.mtime;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
var comparator = Comparators[self.filepicker.sortField] || Comparators.name;
|
2019-04-29 19:16:15 +03:00
|
|
|
files = files.sort(function (file1, file2) {
|
|
|
|
var isFavorite = function (fileInfo) {
|
2018-11-08 15:30:39 +03:00
|
|
|
return fileInfo.tags && fileInfo.tags.indexOf(OC.TAG_FAVORITE) >= 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
if (isFavorite(file1) && !isFavorite(file2)) {
|
2016-10-17 14:35:59 +03:00
|
|
|
return -1;
|
2018-11-08 15:30:39 +03:00
|
|
|
} else if (!isFavorite(file1) && isFavorite(file2)) {
|
2016-10-17 14:35:59 +03:00
|
|
|
return 1;
|
2013-05-17 06:54:08 +04:00
|
|
|
}
|
2018-11-08 15:30:39 +03:00
|
|
|
|
|
|
|
return self.filepicker.sortOrder === 'asc' ? comparator(file1, file2) : -comparator(file1, file2);
|
2013-05-16 02:23:05 +04:00
|
|
|
});
|
|
|
|
|
2013-05-17 10:42:15 +04:00
|
|
|
self._fillSlug();
|
2013-05-16 02:23:05 +04:00
|
|
|
|
2016-10-21 17:35:55 +03:00
|
|
|
if (files.length === 0) {
|
|
|
|
self.$filePicker.find('.emptycontent').show();
|
2018-11-16 16:50:40 +03:00
|
|
|
self.$fileListHeader.hide();
|
2016-10-21 17:35:55 +03:00
|
|
|
} else {
|
|
|
|
self.$filePicker.find('.emptycontent').hide();
|
2018-11-16 16:50:40 +03:00
|
|
|
self.$fileListHeader.show();
|
2016-10-21 17:35:55 +03:00
|
|
|
}
|
|
|
|
|
2019-04-29 19:16:15 +03:00
|
|
|
$.each(files, function (idx, entry) {
|
2015-12-24 10:59:32 +03:00
|
|
|
entry.icon = OC.MimeType.getIconUrl(entry.mimetype);
|
2017-05-01 07:09:29 +03:00
|
|
|
var simpleSize, sizeColor;
|
2019-04-29 19:16:15 +03:00
|
|
|
if (typeof (entry.size) !== 'undefined' && entry.size >= 0) {
|
2017-05-01 07:09:29 +03:00
|
|
|
simpleSize = humanFileSize(parseInt(entry.size, 10), true);
|
|
|
|
sizeColor = Math.round(160 - Math.pow((entry.size / (1024 * 1024)), 2));
|
2016-10-17 15:26:25 +03:00
|
|
|
} else {
|
|
|
|
simpleSize = t('files', 'Pending');
|
2017-05-01 07:09:29 +03:00
|
|
|
sizeColor = 80;
|
2016-10-17 15:26:25 +03:00
|
|
|
}
|
2019-03-30 12:28:42 +03:00
|
|
|
|
|
|
|
// split the filename in half if the size is bigger than 20 char
|
|
|
|
// for ellipsis
|
|
|
|
if (entry.name.length >= 10) {
|
|
|
|
// leave maximum 10 letters
|
|
|
|
var split = Math.min(Math.floor(entry.name.length / 2), 10)
|
|
|
|
var filename1 = entry.name.substr(0, entry.name.length - split)
|
|
|
|
var filename2 = entry.name.substr(entry.name.length - split)
|
|
|
|
} else {
|
|
|
|
var filename1 = entry.name
|
|
|
|
var filename2 = ''
|
|
|
|
}
|
|
|
|
|
2016-10-17 15:26:25 +03:00
|
|
|
var $row = self.$listTmpl.octemplate({
|
2013-05-17 06:54:08 +04:00
|
|
|
type: entry.type,
|
|
|
|
dir: dir,
|
|
|
|
filename: entry.name,
|
2019-03-30 12:28:42 +03:00
|
|
|
filename1: filename1,
|
|
|
|
filename2: filename2,
|
2016-10-17 15:26:25 +03:00
|
|
|
date: OC.Util.relativeModifiedDate(entry.mtime),
|
|
|
|
size: simpleSize,
|
|
|
|
sizeColor: sizeColor,
|
|
|
|
icon: entry.icon
|
2013-05-17 06:54:08 +04:00
|
|
|
});
|
2015-07-13 18:38:13 +03:00
|
|
|
if (entry.type === 'file') {
|
2013-10-28 23:22:06 +04:00
|
|
|
var urlSpec = {
|
2016-10-14 18:29:36 +03:00
|
|
|
file: dir + '/' + entry.name,
|
2018-10-23 11:04:03 +03:00
|
|
|
x: 100,
|
|
|
|
y: 100
|
2013-10-28 23:22:06 +04:00
|
|
|
};
|
2016-10-14 18:29:36 +03:00
|
|
|
var img = new Image();
|
2013-10-28 23:22:06 +04:00
|
|
|
var previewUrl = OC.generateUrl('/core/preview.png?') + $.param(urlSpec);
|
2019-04-29 19:16:15 +03:00
|
|
|
img.onload = function () {
|
2016-10-14 18:29:36 +03:00
|
|
|
if (img.width > 5) {
|
2016-10-17 15:26:25 +03:00
|
|
|
$row.find('td.filename').attr('style', 'background-image:url(' + previewUrl + ')');
|
2016-10-14 18:29:36 +03:00
|
|
|
}
|
|
|
|
};
|
|
|
|
img.src = previewUrl;
|
2013-10-28 23:22:06 +04:00
|
|
|
}
|
2016-10-17 15:26:25 +03:00
|
|
|
self.$filelist.append($row);
|
2013-05-17 06:54:08 +04:00
|
|
|
});
|
2013-04-06 21:21:15 +04:00
|
|
|
|
2018-11-16 16:50:40 +03:00
|
|
|
self.$filelistContainer.removeClass('icon-loading');
|
2013-05-17 06:54:08 +04:00
|
|
|
});
|
2012-05-05 15:48:12 +04:00
|
|
|
},
|
2013-04-06 12:07:12 +04:00
|
|
|
/**
|
|
|
|
* fills the tree list with directories
|
2019-04-29 19:16:15 +03:00
|
|
|
*/
|
|
|
|
_fillSlug: function () {
|
2013-05-17 06:54:08 +04:00
|
|
|
this.$dirTree.empty();
|
2013-08-12 14:33:22 +04:00
|
|
|
var self = this;
|
2016-10-14 18:31:10 +03:00
|
|
|
var dir;
|
2013-05-17 06:54:08 +04:00
|
|
|
var path = this.$filePicker.data('path');
|
2016-10-14 18:31:10 +03:00
|
|
|
var $template = $('<div data-dir="{dir}"><a>{name}</a></div>').addClass('crumb');
|
2019-04-29 19:16:15 +03:00
|
|
|
if (path) {
|
2013-05-17 09:14:43 +04:00
|
|
|
var paths = path.split('/');
|
2019-04-29 19:16:15 +03:00
|
|
|
$.each(paths, function (index, dir) {
|
2013-07-31 23:21:02 +04:00
|
|
|
dir = paths.pop();
|
2019-04-29 19:16:15 +03:00
|
|
|
if (dir === '') {
|
2013-05-17 09:14:43 +04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
self.$dirTree.prepend($template.octemplate({
|
|
|
|
dir: paths.join('/') + '/' + dir,
|
|
|
|
name: dir
|
|
|
|
}));
|
|
|
|
});
|
|
|
|
}
|
2013-05-17 18:18:40 +04:00
|
|
|
$template.octemplate({
|
2013-05-17 06:54:08 +04:00
|
|
|
dir: '',
|
2016-10-14 18:31:10 +03:00
|
|
|
name: '' // Ugly but works ;)
|
|
|
|
}, {escapeFunction: null}).prependTo(this.$dirTree);
|
2013-04-06 12:07:12 +04:00
|
|
|
},
|
2013-04-06 18:44:13 +04:00
|
|
|
/**
|
|
|
|
* handle selection made in the tree list
|
2019-04-29 19:16:15 +03:00
|
|
|
*/
|
|
|
|
_handleTreeListSelect: function (event, type) {
|
2013-05-17 06:54:08 +04:00
|
|
|
var self = event.data;
|
2017-11-07 17:52:41 +03:00
|
|
|
var dir = $(event.target).closest('.crumb').data('dir');
|
2013-05-17 10:42:15 +04:00
|
|
|
self._fillFilePicker(dir);
|
2016-10-14 18:31:10 +03:00
|
|
|
var getOcDialog = (event.target).closest('.oc-dialog');
|
2016-08-22 15:21:47 +03:00
|
|
|
var buttonEnableDisable = $('.primary', getOcDialog);
|
2017-08-27 18:39:22 +03:00
|
|
|
this._changeButtonsText(type, dir.split(/[/]+/).pop());
|
2018-08-30 15:23:47 +03:00
|
|
|
if (this.$filePicker.data('mimetype').indexOf("httpd/unix-directory") !== -1) {
|
2016-09-07 16:17:52 +03:00
|
|
|
buttonEnableDisable.prop("disabled", false);
|
|
|
|
} else {
|
|
|
|
buttonEnableDisable.prop("disabled", true);
|
|
|
|
}
|
2013-04-06 12:07:12 +04:00
|
|
|
},
|
2013-04-06 18:44:13 +04:00
|
|
|
/**
|
|
|
|
* handle clicks made in the filepicker
|
2019-04-29 19:16:15 +03:00
|
|
|
*/
|
|
|
|
_handlePickerClick: function (event, $element, type) {
|
2016-08-22 15:21:47 +03:00
|
|
|
var getOcDialog = this.$filePicker.closest('.oc-dialog');
|
|
|
|
var buttonEnableDisable = getOcDialog.find('.primary');
|
2013-05-17 06:54:08 +04:00
|
|
|
if ($element.data('type') === 'file') {
|
|
|
|
if (this.$filePicker.data('multiselect') !== true || !event.ctrlKey) {
|
|
|
|
this.$filelist.find('.filepicker_element_selected').removeClass('filepicker_element_selected');
|
2012-05-05 15:48:12 +04:00
|
|
|
}
|
2013-05-17 06:54:08 +04:00
|
|
|
$element.toggleClass('filepicker_element_selected');
|
2016-08-22 15:21:47 +03:00
|
|
|
buttonEnableDisable.prop("disabled", false);
|
2019-04-29 19:16:15 +03:00
|
|
|
} else if ($element.data('type') === 'dir') {
|
2013-07-31 23:21:02 +04:00
|
|
|
this._fillFilePicker(this.$filePicker.data('path') + '/' + $element.data('entryname'));
|
2017-08-27 18:39:22 +03:00
|
|
|
this._changeButtonsText(type, $element.data('entryname'));
|
2019-08-21 17:59:49 +03:00
|
|
|
if (this.$filePicker.data('mimetype').indexOf("httpd/unix-directory") !== -1 || this.$filePicker.data('allowDirectoryChooser')) {
|
2016-09-07 16:17:52 +03:00
|
|
|
buttonEnableDisable.prop("disabled", false);
|
|
|
|
} else {
|
|
|
|
buttonEnableDisable.prop("disabled", true);
|
|
|
|
}
|
2012-05-05 15:48:12 +04:00
|
|
|
}
|
2017-08-27 18:39:22 +03:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handle
|
|
|
|
* @param type of action
|
|
|
|
* @param dir on which to change buttons text
|
|
|
|
* @private
|
|
|
|
*/
|
2019-04-29 19:16:15 +03:00
|
|
|
_changeButtonsText: function (type, dir) {
|
2017-08-27 18:39:22 +03:00
|
|
|
var copyText = dir === '' ? t('core', 'Copy') : t('core', 'Copy to {folder}', {folder: dir});
|
|
|
|
var moveText = dir === '' ? t('core', 'Move') : t('core', 'Move to {folder}', {folder: dir});
|
|
|
|
var buttons = $('.oc-dialog-buttonrow button');
|
|
|
|
switch (type) {
|
|
|
|
case this.FILEPICKER_TYPE_CHOOSE:
|
|
|
|
break;
|
|
|
|
case this.FILEPICKER_TYPE_COPY:
|
|
|
|
buttons.text(copyText);
|
|
|
|
break;
|
|
|
|
case this.FILEPICKER_TYPE_MOVE:
|
|
|
|
buttons.text(moveText);
|
|
|
|
break;
|
|
|
|
case this.FILEPICKER_TYPE_COPY_MOVE:
|
|
|
|
buttons.eq(0).text(copyText);
|
|
|
|
buttons.eq(1).text(moveText);
|
|
|
|
break;
|
|
|
|
}
|
2012-05-05 15:48:12 +04:00
|
|
|
}
|
2019-04-29 19:16:15 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
export default Dialogs
|