diff --git a/public/language/en-GB/admin/manage/uploads.json b/public/language/en-GB/admin/manage/uploads.json index 13e69cafa7..33d9914403 100644 --- a/public/language/en-GB/admin/manage/uploads.json +++ b/public/language/en-GB/admin/manage/uploads.json @@ -1,6 +1,7 @@ { "upload-file": "Upload File", "filename": "Filename", + "usage": "Post Usage", "size/filecount": "Size / Filecount", "confirm-delete": "Do you really want to delete this file?", "filecount": "%1 files" diff --git a/src/controllers/admin/uploads.js b/src/controllers/admin/uploads.js index 61d98960c6..7a71ccf617 100644 --- a/src/controllers/admin/uploads.js +++ b/src/controllers/admin/uploads.js @@ -8,6 +8,7 @@ var fs = require('fs'); var jimp = require('jimp'); var meta = require('../../meta'); +var posts = require('../../posts'); var file = require('../../file'); var image = require('../../image'); var plugins = require('../../plugins'); @@ -41,7 +42,7 @@ uploadsController.get = function (req, res, next) { filesToData(currentFolder, files, next); }, - function (files) { + function (files, next) { files.sort(function (a, b) { if (a.isDirectory && !b.isDirectory) { return -1; @@ -50,14 +51,33 @@ uploadsController.get = function (req, res, next) { } return 0; }); - res.render('admin/manage/uploads', { - currentFolder: currentFolder.replace(nconf.get('upload_path'), ''), - files: files, - breadcrumbs: buildBreadcrumbs(currentFolder), - pagination: pagination.create(page, Math.ceil(itemCount / itemsPerPage), req.query), - }); + + // Add post usage info if in /files + if (req.query.dir === '/files') { + posts.uploads.getUsage(files, function (err, usage) { + files.forEach(function (file, idx) { + file.inPids = usage[idx].map(pid => parseInt(pid, 10)); + }); + + next(err, files); + }); + } else { + setImmediate(next, null, files); + } }, - ], next); + ], function (err, files) { + if (err) { + return next(err); + } + + res.render('admin/manage/uploads', { + currentFolder: currentFolder.replace(nconf.get('upload_path'), ''), + showPids: files[0].hasOwnProperty('inPids'), + files: files, + breadcrumbs: buildBreadcrumbs(currentFolder), + pagination: pagination.create(page, Math.ceil(itemCount / itemsPerPage), req.query), + }); + }); }; function buildBreadcrumbs(currentFolder) { diff --git a/src/posts/uploads.js b/src/posts/uploads.js index cd2520ea3d..a84088ecc4 100644 --- a/src/posts/uploads.js +++ b/src/posts/uploads.js @@ -26,7 +26,7 @@ module.exports = function (Posts) { let match = searchRegex.exec(data.content); const uploads = []; while (match) { - uploads.push(match[1]); + uploads.push(match[1].replace('-resized', '')); match = searchRegex.exec(data.content); } @@ -56,6 +56,18 @@ module.exports = function (Posts) { }); }; + Posts.uploads.getUsage = function (filePaths, callback) { + // Given an array of file names, determines which pids they are used in + if (!Array.isArray(filePaths)) { + filePaths = [filePaths]; + } + + const keys = filePaths.map(fileObj => 'upload:' + md5(fileObj.name.replace('-resized', '')) + ':pids'); + async.map(keys, function (key, next) { + db.getSortedSetRange(key, 0, -1, next); + }, callback); + }; + Posts.uploads.associate = function (pid, filePaths, callback) { // Adds an upload to a post's sorted set of uploads const now = Date.now(); diff --git a/src/views/admin/manage/uploads.tpl b/src/views/admin/manage/uploads.tpl index dbddede2ef..9751504b50 100644 --- a/src/views/admin/manage/uploads.tpl +++ b/src/views/admin/manage/uploads.tpl @@ -8,6 +8,7 @@ [[admin/manage/uploads:filename]] + [[admin/manage/uploads:usage]] [[admin/manage/uploads:size/filecount]] @@ -16,17 +17,28 @@ - + {files.name} - + {files.name} + + + + @value + + + [[admin/manage/uploads:orphaned]] + + + + {files.sizeHumanReadable}[[admin/manage/uploads:filecount, {files.fileCount}]]