ant-http/build/htdocs/dist/packages/default/FileManager/combined.js

1144 lines
38 KiB
JavaScript
Raw Normal View History

2016-10-29 14:34:29 +02:00
/*!
* OS.js - JavaScript Cloud/Web Desktop Platform
*
* Copyright (c) 2011-2016, Anders Evenrud <andersevenrud@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @author Anders Evenrud <andersevenrud@gmail.com>
* @licence Simplified BSD License
*/
(function(Application, Window, Utils, API, VFS, GUI) {
'use strict';
function getSelected(view) {
var selected = [];
(view.get('value') || []).forEach(function(sub) {
selected.push(sub.data);
});
return selected;
}
var notificationWasDisplayed = {};
/////////////////////////////////////////////////////////////////////////////
// WINDOWS
/////////////////////////////////////////////////////////////////////////////
function ApplicationFileManagerWindow(app, metadata, scheme, path, settings) {
Window.apply(this, ['ApplicationFileManagerWindow', {
icon: metadata.icon,
title: metadata.name,
allow_drop: true,
width: 650,
height: 420
}, app, scheme]);
this.wasFileDropped = false;
this.currentPath = path;
this.currentSummary = {};
this.viewOptions = Utils.argumentDefaults(settings || {}, {
ViewNavigation: true,
ViewSide: true
}, true);
this.history = [];
this.historyIndex = -1;
var self = this;
this.settingsWatch = OSjs.Core.getSettingsManager().watch('VFS', function() {
if ( self._loaded ) {
self.changePath();
}
});
this._on('drop:upload', function(ev, item) {
app.upload(self.currentPath, item, self);
});
this._on('drop:file', function(ev, src) {
if ( Utils.dirname(src.path) !== self.currentPath ) {
var dst = new VFS.File(Utils.pathJoin(self.currentPath, src.filename));
self.wasFileDropped = dst;
app.copy(src, dst, self);
}
});
this._on('keydown', function(ev, keyCode, shiftKey, ctrlKey, altKey) {
if ( Utils.keyCombination(ev, 'CTRL+V') ) {
var clip = API.getClipboard();
if ( clip && (clip instanceof Array) ) {
clip.forEach(function(c) {
if ( c && (c instanceof VFS.File) ) {
var dst = new VFS.File(Utils.pathJoin(self.currentPath, c.filename));
app.copy(c, dst, self);
}
});
}
} else if ( ev.keyCode === Utils.Keys.DELETE ) {
app.rm(getSelected(self._find('FileView')), self);
}
});
this._on('destroy', function() {
try {
OSjs.Core.getSettingsManager().unwatch(self.settingsWatch);
} catch ( e ) {}
});
}
ApplicationFileManagerWindow.prototype = Object.create(Window.prototype);
ApplicationFileManagerWindow.constructor = Window.prototype;
ApplicationFileManagerWindow.prototype.init = function(wm, app, scheme) {
var root = Window.prototype.init.apply(this, arguments);
var self = this;
var view;
var viewType = this.viewOptions.ViewType || 'gui-list-view';
var viewSide = this.viewOptions.ViewSide === true;
var viewNav = this.viewOptions.ViewNavigation === true;
var vfsOptions = Utils.cloneObject(OSjs.Core.getSettingsManager().get('VFS') || {});
var scandirOptions = vfsOptions.scandir || {};
var viewHidden = scandirOptions.showHiddenFiles === true;
var viewExtension = scandirOptions.showFileExtensions === true;
// Load and set up scheme (GUI) here
scheme.render(this, 'FileManagerWindow', root, null, null, {
_: OSjs.Applications.ApplicationFileManager._
});
if ( (API.getConfig('Connection.Type') !== 'nw') && window.location.protocol.match(/^file/) ) { // FIXME: Translation
this._setWarning('VFS does not work when in standalone mode');
}
//
// Menus
//
var menuMap = {
MenuClose: function() {
self._close();
},
MenuCreateFile: function() {
app.mkfile(self.currentPath, self);
},
MenuCreateDirectory:function() {
app.mkdir(self.currentPath, self);
},
MenuUpload: function() {
app.upload(self.currentPath, null, self);
},
MenuRename: function() {
app.rename(getSelected(view), self);
},
MenuDelete: function() {
app.rm(getSelected(view), self);
},
MenuInfo: function() {
app.info(getSelected(view), self);
},
MenuOpen: function() {
app.open(getSelected(view), self);
},
MenuDownload: function() {
app.download(getSelected(view), self);
},
MenuRefresh: function() {
self.changePath();
},
MenuViewList: function() {
self.changeView('gui-list-view', true);
},
MenuViewTree: function() {
self.changeView('gui-tree-view', true);
},
MenuViewIcon: function() {
self.changeView('gui-icon-view', true);
},
MenuShowSidebar: function() {
viewSide = self.toggleSidebar(!viewSide, true);
},
MenuShowNavigation: function() {
viewNav = self.toggleNavbar(!viewNav, true);
},
MenuShowHidden: function() {
viewHidden = self.toggleHidden(!viewHidden, true);
},
MenuShowExtension: function() {
viewExtension = self.toggleExtension(!viewExtension, true);
},
MenuColumnFilename: function() {
self.toggleColumn('filename', true);
},
MenuColumnMIME: function() {
self.toggleColumn('mime', true);
},
MenuColumnCreated: function() {
self.toggleColumn('ctime', true);
},
MenuColumnModified: function() {
self.toggleColumn('mtime', true);
},
MenuColumnSize: function() {
self.toggleColumn('size', true);
}
};
function menuEvent(ev) {
var f = ev.detail.func || ev.detail.id;
if ( menuMap[f] ) {
menuMap[f]();
}
}
scheme.find(this, 'SubmenuFile').on('select', menuEvent);
var contextMenu = scheme.find(this, 'SubmenuContext').on('select', menuEvent);
scheme.find(this, 'SubmenuEdit').on('select', menuEvent);
var viewMenu = scheme.find(this, 'SubmenuView').on('select', menuEvent);
viewMenu.set('checked', 'MenuViewList', viewType === 'gui-list-view');
viewMenu.set('checked', 'MenuViewTree', viewType === 'gui-tree-view');
viewMenu.set('checked', 'MenuViewIcon', viewType === 'gui-icon-view');
viewMenu.set('checked', 'MenuShowSidebar', viewSide);
viewMenu.set('checked', 'MenuShowNavigation', viewNav);
viewMenu.set('checked', 'MenuShowHidden', viewHidden);
viewMenu.set('checked', 'MenuShowExtension', viewExtension);
//
// Toolbar
//
scheme.find(this, 'GoLocation').on('enter', function(ev) {
self.changePath(ev.detail, null, false, true);
});
scheme.find(this, 'GoBack').on('click', function(ev) {
self.changeHistory(-1);
});
scheme.find(this, 'GoNext').on('click', function(ev) {
self.changeHistory(1);
});
//
// Side View
//
var side = scheme.find(this, 'SideView');
side.on('activate', function(ev) {
if ( ev && ev.detail && ev.detail.entries ) {
var entry = ev.detail.entries[0];
if ( entry ) {
self.changePath(entry.data.root);
}
}
});
//
// File View
//
view = this._scheme.find(this, 'FileView');
view.on('activate', function(ev) {
if ( ev && ev.detail && ev.detail.entries ) {
self.checkActivation(ev.detail.entries);
}
});
view.on('select', function(ev) {
if ( ev && ev.detail && ev.detail.entries ) {
self.checkSelection(ev.detail.entries);
}
});
view.on('contextmenu', function(ev) {
if ( ev && ev.detail && ev.detail.entries ) {
self.checkSelection(ev.detail.entries);
}
contextMenu.show(ev);
});
//
// Init
//
this.renderSideView();
this.changeView(viewType, false);
this.toggleHidden(viewHidden, false);
this.toggleExtension(viewExtension, false);
this.toggleSidebar(viewSide, false);
this.toggleNavbar(viewNav, false);
this.changePath(this.currentPath);
this.toggleColumn();
return root;
};
ApplicationFileManagerWindow.prototype.checkSelection = function(files) {
var scheme = this._scheme;
if ( !scheme ) {
return;
}
var self = this;
var content = '';
var statusbar = scheme.find(this, 'Statusbar');
var doTranslate = OSjs.Applications.ApplicationFileManager._;
var sum, label;
function toggleMenuItems(isFile, isDirectory) {
/*
* Toggling MenuItems with the bit MODE_F or MODE_FD set by type of selected items
* MODE_F : Selected items consist of ONLY files
* MODE_FD : One or many items are selected (type doesn't matter)
*/
var MODE_F = !isFile || !!isDirectory;
var MODE_FD = !(isFile || isDirectory);
scheme.find(self, 'MenuRename').set('disabled', MODE_FD);
scheme.find(self, 'MenuDelete').set('disabled', MODE_FD);
scheme.find(self, 'MenuInfo').set('disabled', MODE_FD); // TODO: Directory info must be supported
scheme.find(self, 'MenuDownload').set('disabled', MODE_F);
scheme.find(self, 'MenuOpen').set('disabled', MODE_F);
scheme.find(self, 'ContextMenuRename').set('disabled', MODE_FD);
scheme.find(self, 'ContextMenuDelete').set('disabled', MODE_FD);
scheme.find(self, 'ContextMenuInfo').set('disabled', MODE_FD); // TODO: Directory info must be supported
scheme.find(self, 'ContextMenuDownload').set('disabled', MODE_F);
scheme.find(self, 'ContextMenuOpen').set('disabled', MODE_F);
}
if ( files && files.length ) {
sum = {files: 0, directories: 0, size: 0};
(files || []).forEach(function(f) {
if ( f.data.type === 'dir' ) {
sum.directories++;
} else {
sum.files++;
sum.size += f.data.size;
}
});
label = 'Selected {0} files, {1} dirs, {2}';
content = doTranslate(label, sum.files, sum.directories, Utils.humanFileSize(sum.size));
toggleMenuItems(sum.files, sum.directories);
} else {
sum = this.currentSummary;
if ( sum ) {
label = 'Showing {0} files ({1} hidden), {2} dirs, {3}';
content = doTranslate(label, sum.files, sum.hidden, sum.directories, Utils.humanFileSize(sum.size));
}
toggleMenuItems(false, false);
}
statusbar.set('value', content);
};
ApplicationFileManagerWindow.prototype.checkActivation = function(files) {
var self = this;
(files || []).forEach(function(f) {
if ( f.data.type === 'dir' ) {
self.changePath(f.data.path);
return false;
}
API.open(new VFS.File(f.data));
return true;
});
};
ApplicationFileManagerWindow.prototype.updateSideView = function(updateModule) {
if ( this._destroyed || !this._scheme ) {
return;
}
var found = null;
var path = this.currentPath || '/';
if ( updateModule ) {
this.renderSideView();
}
OSjs.Core.getMountManager().getModules({special: true}).forEach(function(m, i) {
if ( path.match(m.module.match) ) {
found = m.module.root;
}
});
var view = this._scheme.find(this, 'SideView');
view.set('selected', found, 'root');
};
ApplicationFileManagerWindow.prototype.renderSideView = function() {
if ( this._destroyed || !this._scheme ) {
return;
}
var sideViewItems = [];
OSjs.Core.getMountManager().getModules({special: true}).forEach(function(m, i) {
if ( m.module.dynamic && !m.module.mounted() ) {
return;
}
var classNames = [m.module.mounted() ? 'mounted' : 'unmounted'];
if ( m.module.readOnly ) {
classNames.push('readonly gui-has-emblem');
}
sideViewItems.push({
value: m.module,
className: classNames.join(' '),
columns: [
{
label: m.module.description,
icon: API.getIcon(m.module.icon)
}
],
onCreated: function(nel) {
if ( m.module.readOnly ) {
nel.style.backgroundImage = 'url(' + API.getIcon('emblems/emblem-readonly.png', '16x16') + ')';
}
}
});
});
var side = this._scheme.find(this, 'SideView');
side.clear();
side.add(sideViewItems);
};
ApplicationFileManagerWindow.prototype.onMountEvent = function(module, msg) {
var m = OSjs.Core.getMountManager().getModule(module);
if ( m ) {
if ( msg === 'vfs:unmount' ) {
if ( this.currentPath.match(m.match) ) {
this.changePath(API.getDefaultPath());
}
}
this.updateSideView(m);
}
};
ApplicationFileManagerWindow.prototype.onFileEvent = function(chk, isDest) {
if ( (this.currentPath === Utils.dirname(chk.path)) || (this.currentPath === chk.path) ) {
this.changePath(null, this.wasFileDropped, false, false, !this.wasFileDroped);
}
};
ApplicationFileManagerWindow.prototype.changeHistory = function(dir) {
if ( this.historyIndex !== -1 ) {
if ( dir < 0 ) {
if ( this.historyIndex > 0 ) {
this.historyIndex--;
}
} else if ( dir > 0 ) {
if ( this.historyIndex < this.history.length - 1 ) {
this.historyIndex++;
}
}
this.changePath(this.history[this.historyIndex], null, true);
}
};
ApplicationFileManagerWindow.prototype.changePath = function(dir, selectFile, isNav, isInput, applyScroll) {
if ( this._destroyed || !this._scheme ) {
return;
}
this.wasFileDropped = false;
//if ( dir === this.currentPath ) { return; }
dir = dir || this.currentPath;
var self = this;
var view = this._scheme.find(this, 'FileView');
function updateNavigation() {
self._scheme.find(self, 'GoLocation').set('value', dir);
self._scheme.find(self, 'GoBack').set('disabled', self.historyIndex <= 0);
self._scheme.find(self, 'GoNext').set('disabled', self.historyIndex < 0 || self.historyIndex >= (self.history.length - 1));
}
function updateHistory(dir) {
if ( !isNav ) {
if ( self.historyIndex >= 0 && self.historyIndex < self.history.length - 1 ) {
self.history = [];
}
var current = self.history[self.history.length - 1];
if ( current !== dir ) {
self.history.push(dir);
}
if ( self.history.length > 1 ) {
self.historyIndex = self.history.length - 1;
} else {
self.historyIndex = -1;
}
}
if ( isInput ) {
self.history = [dir];
self.historyIndex = 0;
}
self._setTitle(dir, true);
}
this._toggleLoading(true);
view._call('chdir', {
path: dir,
done: function(error, summary) {
if ( self._destroyed || !self._scheme ) {
return;
}
if ( dir && !error ) {
self.currentPath = dir;
self.currentSummary = summary;
if ( self._app ) {
self._app._setArgument('path', dir);
}
updateHistory(dir);
}
self._toggleLoading(false);
self.checkSelection([]);
self.updateSideView();
if ( selectFile && view ) {
view.set('selected', selectFile.filename, 'filename', {
scroll: applyScroll
});
}
updateNavigation();
}
});
};
ApplicationFileManagerWindow.prototype.changeView = function(viewType, set) {
if ( this._destroyed || !this._scheme ) {
return;
}
var view = this._scheme.find(this, 'FileView');
view.set('type', viewType, !!set);
if ( set ) {
this._app._setSetting('ViewType', viewType, true);
}
};
ApplicationFileManagerWindow.prototype.toggleSidebar = function(toggle, set) {
if ( this._destroyed || !this._scheme ) {
return;
}
this.viewOptions.ViewSide = toggle;
var container = this._scheme.find(this, 'SideContainer');
var handle = new GUI.Element(container.$element.parentNode.querySelector('gui-paned-view-handle'));
if ( toggle ) {
container.show();
handle.show();
} else {
container.hide();
handle.hide();
}
if ( set ) {
this._app._setSetting('ViewSide', toggle, true);
}
return toggle;
};
ApplicationFileManagerWindow.prototype.toggleVFSOption = function(opt, key, toggle, set) {
if ( this._destroyed || !this._scheme ) {
return;
}
var view = this._scheme.find(this, 'FileView');
var vfsOptions = OSjs.Core.getSettingsManager().instance('VFS');
var opts = {scandir: {}};
opts.scandir[opt] = toggle;
vfsOptions.set(null, opts, null, set); // set triggers refresh because of watch
view.set(key, toggle);
return toggle;
};
ApplicationFileManagerWindow.prototype.toggleHidden = function(toggle, set) {
if ( this._destroyed || !this._scheme ) {
return;
}
return this.toggleVFSOption('showHiddenFiles', 'dotfiles', toggle, set);
};
ApplicationFileManagerWindow.prototype.toggleExtension = function(toggle, set) {
if ( this._destroyed || !this._scheme ) {
return;
}
return this.toggleVFSOption('showFileExtensions', 'extensions', toggle, set);
};
ApplicationFileManagerWindow.prototype.toggleNavbar = function(toggle, set) {
if ( this._destroyed || !this._scheme ) {
return;
}
this.viewOptions.ViewNavigation = toggle;
var viewNav = this._scheme.find(this, 'ToolbarContainer');
if ( toggle ) {
viewNav.show();
} else {
viewNav.hide();
}
if ( set ) {
this._app._setSetting('ViewNavigation', toggle, true);
}
return toggle;
};
ApplicationFileManagerWindow.prototype.toggleColumn = function(col, set) {
if ( this._destroyed || !this._scheme ) {
return;
}
var vfsOptions = Utils.cloneObject(OSjs.Core.getSettingsManager().get('VFS') || {});
var scandirOptions = vfsOptions.scandir || {};
var viewColumns = scandirOptions.columns || ['filename', 'mime', 'size'];
if ( col ) {
var found = viewColumns.indexOf(col);
if ( found >= 0 ) {
viewColumns.splice(found, 1);
} else {
viewColumns.push(col);
}
scandirOptions.columns = viewColumns;
OSjs.Core.getSettingsManager().set('VFS', 'scandir', scandirOptions, set);
}
var viewMenu = this._scheme.find(this, 'SubmenuView');
viewMenu.set('checked', 'MenuColumnFilename', viewColumns.indexOf('filename') >= 0);
viewMenu.set('checked', 'MenuColumnMIME', viewColumns.indexOf('mime') >= 0);
viewMenu.set('checked', 'MenuColumnCreated', viewColumns.indexOf('ctime') >= 0);
viewMenu.set('checked', 'MenuColumnModified', viewColumns.indexOf('mtime') >= 0);
viewMenu.set('checked', 'MenuColumnSize', viewColumns.indexOf('size') >= 0);
};
/////////////////////////////////////////////////////////////////////////////
// APPLICATION
/////////////////////////////////////////////////////////////////////////////
var ApplicationFileManager = function(args, metadata) {
Application.apply(this, ['ApplicationFileManager', args, metadata]);
};
ApplicationFileManager.prototype = Object.create(Application.prototype);
ApplicationFileManager.constructor = Application;
ApplicationFileManager.prototype.destroy = function() {
return Application.prototype.destroy.apply(this, arguments);
};
ApplicationFileManager.prototype.init = function(settings, metadata, scheme) {
Application.prototype.init.apply(this, arguments);
var self = this;
var path = this._getArgument('path') || API.getDefaultPath();
this._on('vfs', function(msg, obj) {
var win = self._getMainWindow();
if ( win ) {
if ( msg === 'vfs:mount' || msg === 'vfs:unmount' ) {
win.onMountEvent(obj, msg);
} else {
if ( obj.destination ) {
win.onFileEvent(obj.destination, true);
win.onFileEvent(obj.source);
} else {
win.onFileEvent(obj);
}
}
}
});
this._addWindow(new ApplicationFileManagerWindow(this, metadata, scheme, path, settings));
};
ApplicationFileManager.prototype.download = function(items) {
items.forEach(function(item) {
VFS.url(new VFS.File(item), function(error, result) {
if ( result ) {
window.open(result);
}
});
});
};
ApplicationFileManager.prototype.rm = function(items, win) {
var self = this;
// TODO: These must be async
var files = [];
items.forEach(function(i) {
files.push(i.filename);
});
files = files.join(', ');
win._toggleDisabled(true);
API.createDialog('Confirm', {
buttons: ['yes', 'no'],
message: Utils.format(OSjs.Applications.ApplicationFileManager._('Delete **{0}** ?'), files)
}, function(ev, button) {
win._toggleDisabled(false);
if ( button !== 'ok' && button !== 'yes' ) {
return;
}
items.forEach(function(item) {
item = new VFS.File(item);
self._action('delete', [item], function() {
win.changePath(null);
});
});
}, win);
};
ApplicationFileManager.prototype.info = function(items, win) {
items.forEach(function(item) {
if ( item.type === 'file' ) {
API.createDialog('FileInfo', {
file: new VFS.File(item)
}, null, win);
}
});
};
ApplicationFileManager.prototype.open = function(items) {
items.forEach(function(item) {
if ( item.type === 'file' ) {
API.open(new VFS.File(item), {forceList: true});
}
});
};
ApplicationFileManager.prototype.rename = function(items, win) {
// TODO: These must be async
var self = this;
function rename(item, newName) {
item = new VFS.File(item);
var newitem = new VFS.File(item);
newitem.filename = newName;
newitem.path = Utils.replaceFilename(item.path, newName);
self._action('move', [item, newitem], function(error) {
if ( !error ) {
win.changePath(null, newitem);
}
});
}
items.forEach(function(item) {
var dialog = API.createDialog('Input', {
message: OSjs.Applications.ApplicationFileManager._('Rename **{0}**', item.filename),
value: item.filename
}, function(ev, button, result) {
if ( button === 'ok' && result ) {
rename(item, result);
}
}, win);
dialog.setRange(Utils.getFilenameRange(item.filename));
});
};
ApplicationFileManager.prototype.mkfile = function(dir, win) {
var self = this;
win._toggleDisabled(true);
function finished(write, item) {
win._toggleDisabled(false);
if ( item ) {
VFS.write(item, '', function() {
win.changePath(null, item);
}, {}, self);
}
}
API.createDialog('Input', {
value: 'My new File',
message: OSjs.Applications.ApplicationFileManager._('Create a new file in **{0}**', dir)
}, function(ev, button, result) {
if ( !result ) {
win._toggleDisabled(false);
return;
}
var item = new VFS.File(dir + '/' + result);
VFS.exists(item, function(error, result) {
if ( result ) {
win._toggleDisabled(true);
API.createDialog('Confirm', {
buttons: ['yes', 'no'],
message: API._('DIALOG_FILE_OVERWRITE', item.filename)
}, function(ev, button) {
finished(button === 'yes' || button === 'ok', item);
}, self);
} else {
finished(true, item);
}
});
}, win);
};
ApplicationFileManager.prototype.mkdir = function(dir, win) {
var self = this;
win._toggleDisabled(true);
API.createDialog('Input', {
message: OSjs.Applications.ApplicationFileManager._('Create a new directory in **{0}**', dir)
}, function(ev, button, result) {
if ( !result ) {
win._toggleDisabled(false);
return;
}
var item = new VFS.File(dir + '/' + result);
self._action('mkdir', [item], function() {
win._toggleDisabled(false);
win.changePath(null, item);
});
}, win);
};
ApplicationFileManager.prototype.copy = function(src, dest, win) {
var self = this;
var dialog = API.createDialog('FileProgress', {
message: OSjs.Applications.ApplicationFileManager._('Copying **{0}** to **{1}**', src.filename, dest.path)
}, function() {
}, win);
win._toggleLoading(true);
VFS.copy(src, dest, function(error, result) {
win._toggleLoading(false);
try {
dialog._close();
} catch ( e ) {}
if ( error ) {
API.error(API._('ERR_GENERIC_APP_FMT', self.__label), API._('ERR_GENERIC_APP_REQUEST'), error);
return;
}
}, {dialog: dialog}, this._app);
};
ApplicationFileManager.prototype.upload = function(dest, files, win) {
var self = this;
function upload() {
win._toggleLoading(true);
VFS.upload({
files: files,
destination: dest,
win: win,
app: self
}, function(error, file) {
win._toggleLoading(false);
if ( error ) {
API.error(API._('ERR_GENERIC_APP_FMT', self.__label), API._('ERR_GENERIC_APP_REQUEST'), error);
return;
}
win.changePath(null, file, false, false, true);
});
}
if ( files ) {
upload();
} else {
API.createDialog('FileUpload', {
dest: dest
}, function(ev, button, result) {
if ( result ) {
win.changePath(null, result);
}
}, win);
}
};
ApplicationFileManager.prototype.showStorageNotification = function(type) {
if ( notificationWasDisplayed[type] ) {
return;
}
notificationWasDisplayed[type] = true;
var wm = OSjs.Core.getWindowManager();
if ( wm ) {
wm.notification({
title: 'External Storage',
message: 'Using external services requires authorization. A popup-window may appear.',
icon: 'status/dialog-information.png'
});
}
};
ApplicationFileManager.prototype._action = function(name, args, callback) {
callback = callback || function() {};
var self = this;
var _onError = function(error) {
API.error(API._('ERR_GENERIC_APP_FMT', self.__label), API._('ERR_GENERIC_APP_REQUEST'), error);
callback(false);
};
VFS[name].apply(VFS, args.concat(function(error, result) {
if ( error ) {
_onError(error);
return;
}
callback(error, result);
}, null, this));
};
/////////////////////////////////////////////////////////////////////////////
// EXPORTS
/////////////////////////////////////////////////////////////////////////////
OSjs.Applications = OSjs.Applications || {};
OSjs.Applications.ApplicationFileManager = OSjs.Applications.ApplicationFileManager || {};
OSjs.Applications.ApplicationFileManager.Class = Object.seal(ApplicationFileManager);
})(OSjs.Core.Application, OSjs.Core.Window, OSjs.Utils, OSjs.API, OSjs.VFS, OSjs.GUI);
/*!
* OS.js - JavaScript Cloud/Web Desktop Platform
*
* Copyright (c) 2011-2016, Anders Evenrud <andersevenrud@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @author Anders Evenrud <andersevenrud@gmail.com>
* @licence Simplified BSD License
*/
(function(Application, Window, GUI, Utils, API, VFS) {
// jscs:disable validateQuoteMarks
'use strict';
/////////////////////////////////////////////////////////////////////////////
// LOCALES
/////////////////////////////////////////////////////////////////////////////
var _Locales = {
bg_BG : {
'Copying file...' : 'Копиране на файл...',
"Copying **{0}** to **{1}**" : "Копиране **{0}** към **{1}**",
"Refreshing..." : "Опресняване...",
"Loading..." : "Зареждане...",
"Create a new directory in **{0}**" : "Създаване на нова директория в **{0}**",
"Rename **{0}**" : "преименуване на **{0}**",
"Delete **{0}** ?" : "Изтриване на **{0}**?"
},
de_DE : {
'Copying file...' : 'Kopiere Datei...',
"Copying **{0}** to **{1}**" : "Kopiere **{0}** nach **{1}**",
"Refreshing..." : "Aktualisiere...",
"Loading..." : "Lade...",
"Create a new directory in **{0}**" : "Erstelle ein neues Verzeichnis in **{0}**",
"Rename **{0}**" : "**{0}** umbenennen",
"Delete **{0}** ?" : "**{0}** löschen?"
},
fr_FR : {
'Copying file...' : 'Copie de fichier...',
"Copying **{0}** to **{1}**" : "Copie de **{0}** à **{1}**",
"Refreshing..." : "Rafraichissement...",
"Loading..." : "Chargement...",
"Create a new file in **{0}**" : "Créer un nouveau fichier dans **{0}**",
"Create a new directory in **{0}**" : "Créer un nouveau dossier dans **{0}**",
"Rename **{0}**" : "Renommer **{0}**",
"Delete **{0}** ?" : "Supprimer **{0}** ?",
'Selected {0} files, {1} dirs, {2}' : '{0} fichier(s) selectionné(s), {1} dossier(s), {2}',
'Showing {0} files ({1} hidden), {2} dirs, {3}' : '{0} fichier(s) affiché(s) ({1} caché(s)), {2} dossier(s), {3}'
},
ar_DZ : {
'Copying file...' : 'جاري نسخ الملف...',
"Copying **{0}** to **{1}**" : "نسخ من **{0}** إلى **{1}**",
"Refreshing..." : "جاري التحديث...",
"Loading..." : "جاري التحميل...",
"Create a new file in **{0}**" : "إنشاء ملف جديد في **{0}**",
"Create a new directory in **{0}**" : "إنشاء مجلد جديد في **{0}**",
"Rename **{0}**" : "إعادة التسمية **{0}**",
"Delete **{0}** ?" : "حذف **{0}** ?",
'Selected {0} files, {1} dirs, {2}' : '{0} ملف مختار, {1} مجلد, {2}',
'Showing {0} files ({1} hidden), {2} dirs, {3}' : '{0} ملف مرئي ({1} مخفي(s)), {2} مجلد, {3}'
},
it_IT : {
'Copying file...' : 'Copiamento file...',
"Copying **{0}** to **{1}**" : "Copia **{0}** in **{1}**",
"Refreshing..." : "Ricarica...",
"Loading..." : "Caricamento...",
"Create a new file in **{0}**" : "Creazione nuovo file in **{0}**",
"Create a new directory in **{0}**" : "Creazione nuova cartella in **{0}**",
"Rename **{0}**" : "Rinomina **{0}**",
"Delete **{0}** ?" : "Cancellare **{0}** ?",
'Selected {0} files, {1} dirs, {2}' : '{0} file selezionati, {1} cartelle, {2}',
'Showing {0} files ({1} hidden), {2} dirs, {3}' : 'Mostrando {0} file(s) ({1} nascosti), {2} cartelle, {3}'
},
ko_KR : {
'Copying file...' : '파일 복사...',
"Copying **{0}** to **{1}**" : "**{0}**를 **{1}**으로 복사",
"Refreshing..." : "새로고치는 중...",
"Loading..." : "기다려주세요...",
"Create a new file in **{0}**" : "**{0}**에 새 파일 만들기",
"Create a new directory in **{0}**" : "**{0}**에 새 디렉토리 만들기",
"Rename **{0}**" : "**{0}**의 이름 바꾸기",
"Delete **{0}** ?" : "**{0}**을 삭제하시겠습니까?",
'Selected {0} files, {1} dirs, {2}' : '{0} 개의 파일, {1} 개의 디렉토리가 선택됨, {2}',
'Showing {0} files ({1} hidden), {2} dirs, {3}' : '{0} 개의 파일({1} 개의 숨긴 파일), {2} 개의 디렉토리가 존재, {3}'
},
nl_NL : {
'Copying file...' : 'Bestand kopieren...',
"Copying **{0}** to **{1}**" : "Kopieer **{0}** naar **{1}**",
"Refreshing..." : "Vernieuwen...",
"Loading..." : "Laden...",
"Create a new directory in **{0}**" : "Maak een nieuwe map in **{0}**",
"Rename **{0}**" : "Hernoem **{0}**",
"Delete **{0}** ?" : "**{0}** verwijderen?"
},
no_NO : {
'Copying file...' : 'Kopierer fil...',
"Copying **{0}** to **{1}**" : "Kopierer **{0}** to **{1}**",
"Refreshing..." : "Gjenoppfrisker...",
"Loading..." : "Laster...",
"Create a new file in **{0}**" : "Opprett ny fil i **{0}**",
"Create a new directory in **{0}**" : "Opprett ny mappe i **{0}**",
"Rename **{0}**" : "Navngi **{0}**",
"Delete **{0}** ?" : "Slette **{0}** ?"
},
pl_PL : {
'Copying file...' : 'Kopiowanie pliku...',
"Copying **{0}** to **{1}**" : "Kopiowanie **{0}** do **{1}**",
"Refreshing..." : "Odświeżanie...",
"Loading..." : "Ładowanie...",
"Create a new file in **{0}**" : "Utwórz nowy plik w **{0}**",
"Create a new directory in **{0}**" : "Utwórz nowy folder w **{0}**",
"Rename **{0}**" : "Zmień nazwę **{0}**",
"Delete **{0}** ?" : "Usunąć **{0}** ?",
'Selected {0} files, {1} dirs, {2}' : 'Wybrane pliki: {0}, foldery: {1}, {2}',
'Showing {0} files ({1} hidden), {2} dirs, {3}' : 'Pokazywane pliki: {0} /(ukryte: {1}, foldery: {2}, {3}'
},
ru_RU : {
'Copying file...' : 'Копирование файла...',
"Copying **{0}** to **{1}**" : "Копирование **{0}** в **{1}**",
"Refreshing..." : "Обновление...",
"Loading..." : "Загрузка...",
"Create a new directory in **{0}**" : "Создать новый каталог в **{0}**",
"Rename **{0}**" : "Переименовать **{0}**",
"Delete **{0}** ?" : "Удалить **{0}** ?"
},
sk_SK : {
'Copying file...' : 'Kopírujem súbor...',
"Copying **{0}** to **{1}**" : "Kopírujem **{0}** do **{1}**",
"Refreshing..." : "Obnovujem...",
"Loading..." : "Nahrávam...",
"Create a new file in **{0}**" : "Vytvor nový súbor v **{0}**",
"Create a new directory in **{0}**" : "Vytvor nový adresár v **{0}**",
"Rename **{0}**" : "Premenuj **{0}**",
"Delete **{0}** ?" : "Zmazať **{0}** ?"
},
tr_TR : {
'Copying file...' : 'kopyalanıyor...',
"Copying **{0}** to **{1}**" : "**{0}** dosyası **{1}**e kopyalanıyor",
"Refreshing..." : "yenileniyor...",
"Loading..." : "yükleniyor...",
"Create a new directory in **{0}**" : " **{0}** içinde yeni bir klasör aç",
"Rename **{0}**" : "yeniden adlandır **{0}**",
"Delete **{0}** ?" : "sil **{0}**?"
},
vi_VN : {
'Copying file...' : 'Đang sao chép...',
"Copying **{0}** to **{1}**" : "Đang chép **{0}** tới **{1}**",
"Refreshing..." : "Đang làm mới...",
"Loading..." : "Đang tải...",
"Create a new file in **{0}**" : "Tạo một tập tin mới trong **{0}**",
"Create a new directory in **{0}**" : "Tạo một thư mục mới trong **{0}**",
"Rename **{0}**" : "Đổi tên **{0}**",
"Delete **{0}** ?" : "Xóa **{0}**?",
'Selected {0} files, {1} dirs, {2}' : 'Đã chọn {0} tập tin, {1} thư mục, {2}',
'Showing {0} files ({1} hidden), {2} dirs, {3}' : 'Đang hiển thị {0} tập tin({1} bị ẩn), {2} thư mục, {3}'
}
};
function _() {
var args = Array.prototype.slice.call(arguments, 0);
args.unshift(_Locales);
return API.__.apply(this, args);
}
/////////////////////////////////////////////////////////////////////////////
// EXPORTS
/////////////////////////////////////////////////////////////////////////////
OSjs.Applications = OSjs.Applications || {};
OSjs.Applications.ApplicationFileManager = OSjs.Applications.ApplicationFileManager || {};
OSjs.Applications.ApplicationFileManager._ = _;
})(OSjs.Core.Application, OSjs.Core.Window, OSjs.GUI, OSjs.Utils, OSjs.API, OSjs.VFS);