nextcloud-gallery/js/upload-helper.js

222 lines
5.5 KiB
JavaScript

/**
* Nextcloud - Gallery
*
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Olivier Paroz <galleryapps@oparoz.com>
*
* @copyright Olivier Paroz 2017
*/
/* global _, Gallery, Thumbnails */
/**
* OCA.FileList methods needed for file uploading
*
* This hack makes it possible to use the Files scripts as is, without having to import and
* maintain them in Gallery
*
* Empty methods are for the "new" button, if we want to implement that one day
*
* @type {{findFile: FileList.findFile, createFile: FileList.createFile,
* getCurrentDirectory: FileList.getCurrentDirectory, getUploadUrl:
* FileList.getUploadUrl}}
*/
var FileList = {
/**
* Makes sure the filename does not exist
*
* Gives an early chance to the user to abort the action, before uploading everything to the
* server.
* Albums are not supported as we don't have a full list of images contained in a sub-album
*
* @param fileName
* @returns {*}
*/
findFile: function (fileName) {
"use strict";
var path = Gallery.currentAlbum + '/' + fileName;
var galleryImage = Gallery.imageMap[path];
if (galleryImage) {
var fileInfo = {
name: fileName,
directory: Gallery.currentAlbum,
path: path,
etag: galleryImage.etag,
mtime: galleryImage.mTime * 1000, // Javascript gives the Epoch time in milliseconds
size: galleryImage.size
};
return fileInfo;
} else {
return null;
}
},
/**
* Create an empty file inside the current album.
*
* @param {string} name name of the file
*
* @return {Promise} promise that will be resolved after the
* file was created
*
*/
createFile: function(name) {
var self = this;
var deferred = $.Deferred();
var promise = deferred.promise();
OCA.Files.isFileNameValid(name);
var targetPath = this.getCurrentDirectory() + '/' + name;
//Check if file already exists
if(Gallery.imageMap[targetPath]) {
OC.Notification.showTemporary(
t('files', 'Could not create file "{file}" because it already exists', {file: name})
);
deferred.reject();
return promise;
}
Gallery.filesClient.putFileContents(
targetPath,
'',
{
contentType: 'text/plain',
overwrite: true
}
)
.done(function() {
// TODO: error handling / conflicts
Gallery.filesClient.getFileInfo(
targetPath, {
properties: self.findFile(targetPath)
}
)
.then(function(status, data) {
deferred.resolve(status, data);
})
.fail(function(status) {
OC.Notification.showTemporary(t('files', 'Could not create file "{file}"', {file: name}));
deferred.reject(status);
});
})
.fail(function(status) {
if (status === 412) {
OC.Notification.showTemporary(
t('files', 'Could not create file "{file}" because it already exists', {file: name})
);
} else {
OC.Notification.showTemporary(t('files', 'Could not create file "{file}"', {file: name}));
}
deferred.reject(status);
});
return promise;
},
/**
* Retrieves the current album
*
* @returns {string}
*/
getCurrentDirectory: function () {
"use strict";
// In Files, dirs start with a /
return '/' + Gallery.currentAlbum;
},
/**
* Retrieves the WebDAV upload URL
*
* @param {string} fileName
* @param {string} dir
*
* @returns {string}
*/
getUploadUrl: function (fileName, dir) {
if (_.isUndefined(dir)) {
dir = this.getCurrentDirectory();
}
var pathSections = dir.split('/');
if (!_.isUndefined(fileName)) {
pathSections.push(fileName);
}
var encodedPath = '';
_.each(pathSections, function (section) {
if (section !== '') {
encodedPath += '/' + encodeURIComponent(section);
}
});
return OC.linkToRemoteBase('webdav') + encodedPath;
}
};
/**
* OCA.Files methods needed for file uploading
*
* This hack makes it possible to use the Files scripts as is, without having to import and
* maintain them in Gallery
*
* @type {{isFileNameValid: Files.isFileNameValid, generatePreviewUrl: Files.generatePreviewUrl}}
*/
var Files = {
App: {fileList: {}},
isFileNameValid: function (name) {
"use strict";
var trimmedName = name.trim();
if (trimmedName === '.' || trimmedName === '..') {
throw t('files', '"{name}" is an invalid file name.', {name: name});
} else if (trimmedName.length === 0) {
throw t('files', 'File name cannot be empty.');
} else if (OC.fileIsBlacklisted(trimmedName)) {
throw t('files', '"{name}" is not an allowed filetype', {name: name});
}
return true;
},
/**
* Generates a preview for the conflict dialogue
*
* Since Gallery uses the fileId and Files uses the path, we have to use the preview endpoint
* of Files
*/
generatePreviewUrl: function (urlSpec) {
"use strict";
var previewUrl;
var path = urlSpec.file;
// In Files, root files start with //
if (path.indexOf('//') === 0) {
path = path.substring(2);
} else {
// Directories start with /
path = path.substring(1);
}
if (Gallery.imageMap[path]) {
var fileId = Gallery.imageMap[path].fileId;
var thumbnail = Thumbnails.map[fileId];
previewUrl = thumbnail.image.src;
} else {
var previewDimension = 96;
urlSpec.x = Math.ceil(previewDimension * window.devicePixelRatio);
urlSpec.y = Math.ceil(previewDimension * window.devicePixelRatio);
urlSpec.forceIcon = 0;
previewUrl = OC.generateUrl('/core/preview.png?') + $.param(urlSpec);
}
return previewUrl;
}
};
OCA.Files = Object.assign({}, OCA.Files, Files);
OCA.Files.App.fileList = Object.assign({}, OCA.Files.App.fileList, FileList);