You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
5.5 KiB
222 lines
5.5 KiB
5 years ago
|
/**
|
||
|
* 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);
|