123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- /**
- * ownCloud
- *
- * @author Vincent Petry
- * @copyright 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- (function() {
- var INFO_TEMPLATE =
- '<span class="info">' +
- '<span class="dirinfo"></span>' +
- '<span class="connector">{{connectorLabel}}</span>' +
- '<span class="fileinfo"></span>' +
- '<span class="hiddeninfo"></span>' +
- '<span class="filter"></span>' +
- '</span>';
- /**
- * The FileSummary class encapsulates the file summary values and
- * the logic to render it in the given container
- *
- * @constructs FileSummary
- * @memberof OCA.Files
- *
- * @param $tr table row element
- * @param {OC.Backbone.Model} [options.filesConfig] files app configuration
- */
- var FileSummary = function($tr, options) {
- options = options || {};
- var self = this;
- this.$el = $tr;
- var filesConfig = options.config;
- if (filesConfig) {
- this._showHidden = !!filesConfig.get('showhidden');
- filesConfig.on('change:showhidden', function() {
- self._showHidden = !!this.get('showhidden');
- self.update();
- });
- }
- this.clear();
- this.render();
- };
- FileSummary.prototype = {
- _showHidden: null,
- summary: {
- totalFiles: 0,
- totalDirs: 0,
- totalHidden: 0,
- totalSize: 0,
- filter:'',
- sumIsPending:false
- },
- /**
- * Returns whether the given file info must be hidden
- *
- * @param {OC.Files.FileInfo} fileInfo file info
- *
- * @return {boolean} true if the file is a hidden file, false otherwise
- */
- _isHiddenFile: function(file) {
- return file.name && file.name.charAt(0) === '.';
- },
- /**
- * Adds file
- * @param {OC.Files.FileInfo} file file to add
- * @param {boolean} update whether to update the display
- */
- add: function(file, update) {
- if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) {
- return;
- }
- if (file.type === 'dir' || file.mime === 'httpd/unix-directory') {
- this.summary.totalDirs++;
- }
- else {
- this.summary.totalFiles++;
- }
- if (this._isHiddenFile(file)) {
- this.summary.totalHidden++;
- }
- var size = parseInt(file.size, 10) || 0;
- if (size >=0) {
- this.summary.totalSize += size;
- } else {
- this.summary.sumIsPending = true;
- }
- if (!!update) {
- this.update();
- }
- },
- /**
- * Removes file
- * @param {OC.Files.FileInfo} file file to remove
- * @param {boolean} update whether to update the display
- */
- remove: function(file, update) {
- if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) {
- return;
- }
- if (file.type === 'dir' || file.mime === 'httpd/unix-directory') {
- this.summary.totalDirs--;
- }
- else {
- this.summary.totalFiles--;
- }
- if (this._isHiddenFile(file)) {
- this.summary.totalHidden--;
- }
- var size = parseInt(file.size, 10) || 0;
- if (size >=0) {
- this.summary.totalSize -= size;
- }
- if (!!update) {
- this.update();
- }
- },
- setFilter: function(filter, files){
- this.summary.filter = filter.toLowerCase();
- this.calculate(files);
- },
- /**
- * Returns the total of files and directories
- */
- getTotal: function() {
- return this.summary.totalDirs + this.summary.totalFiles;
- },
- /**
- * Recalculates the summary based on the given files array
- * @param files array of files
- */
- calculate: function(files) {
- var file;
- var summary = {
- totalDirs: 0,
- totalFiles: 0,
- totalHidden: 0,
- totalSize: 0,
- filter: this.summary.filter,
- sumIsPending: false
- };
- for (var i = 0; i < files.length; i++) {
- file = files[i];
- if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) {
- continue;
- }
- if (file.type === 'dir' || file.mime === 'httpd/unix-directory') {
- summary.totalDirs++;
- }
- else {
- summary.totalFiles++;
- }
- if (this._isHiddenFile(file)) {
- summary.totalHidden++;
- }
- var size = parseInt(file.size, 10) || 0;
- if (size >=0) {
- summary.totalSize += size;
- } else {
- summary.sumIsPending = true;
- }
- }
- this.setSummary(summary);
- },
- /**
- * Clears the summary
- */
- clear: function() {
- this.calculate([]);
- },
- /**
- * Sets the current summary values
- * @param summary map
- */
- setSummary: function(summary) {
- this.summary = summary;
- if (typeof this.summary.filter === 'undefined') {
- this.summary.filter = '';
- }
- this.update();
- },
- _infoTemplate: function(data) {
- if (!this._infoTemplateCompiled) {
- this._infoTemplateCompiled = Handlebars.compile(INFO_TEMPLATE);
- }
- return this._infoTemplateCompiled(_.extend({
- connectorLabel: t('files', '{dirs} and {files}', {dirs: '', files: ''})
- }, data));
- },
- /**
- * Renders the file summary element
- */
- update: function() {
- if (!this.$el) {
- return;
- }
- if (!this.summary.totalFiles && !this.summary.totalDirs) {
- this.$el.addClass('hidden');
- return;
- }
- // There's a summary and data -> Update the summary
- this.$el.removeClass('hidden');
- var $dirInfo = this.$el.find('.dirinfo');
- var $fileInfo = this.$el.find('.fileinfo');
- var $connector = this.$el.find('.connector');
- var $filterInfo = this.$el.find('.filter');
- var $hiddenInfo = this.$el.find('.hiddeninfo');
- // Substitute old content with new translations
- $dirInfo.html(n('files', '%n folder', '%n folders', this.summary.totalDirs));
- $fileInfo.html(n('files', '%n file', '%n files', this.summary.totalFiles));
- $hiddenInfo.html(' (' + n('files', 'including %n hidden', 'including %n hidden', this.summary.totalHidden) + ')');
- var fileSize = this.summary.sumIsPending ? t('files', 'Pending') : OC.Util.humanFileSize(this.summary.totalSize);
- this.$el.find('.filesize').html(fileSize);
- // Show only what's necessary (may be hidden)
- if (this.summary.totalDirs === 0) {
- $dirInfo.addClass('hidden');
- $connector.addClass('hidden');
- } else {
- $dirInfo.removeClass('hidden');
- }
- if (this.summary.totalFiles === 0) {
- $fileInfo.addClass('hidden');
- $connector.addClass('hidden');
- } else {
- $fileInfo.removeClass('hidden');
- }
- if (this.summary.totalDirs > 0 && this.summary.totalFiles > 0) {
- $connector.removeClass('hidden');
- }
- $hiddenInfo.toggleClass('hidden', this.summary.totalHidden === 0 || this._showHidden)
- if (this.summary.filter === '') {
- $filterInfo.html('');
- $filterInfo.addClass('hidden');
- } else {
- $filterInfo.html(' ' + n('files', 'matches \'{filter}\'', 'match \'{filter}\'', this.summary.totalDirs + this.summary.totalFiles, {filter: this.summary.filter}));
- $filterInfo.removeClass('hidden');
- }
- },
- render: function() {
- if (!this.$el) {
- return;
- }
- var summary = this.summary;
- // don't show the filesize column, if filesize is NaN (e.g. in trashbin)
- var fileSize = '';
- if (!isNaN(summary.totalSize)) {
- fileSize = summary.sumIsPending ? t('files', 'Pending') : OC.Util.humanFileSize(summary.totalSize);
- fileSize = '<td class="filesize">' + fileSize + '</td>';
- }
- var $summary = $(
- '<td>' + this._infoTemplate() + '</td>' +
- fileSize +
- '<td class="date"></td>'
- );
- this.$el.addClass('hidden');
- this.$el.append($summary);
- this.update();
- }
- };
- OCA.Files.FileSummary = FileSummary;
- })();
|