Merge pull request #2850 from nextcloud/downstream-26603

Fixed size issues on main detail view and disappearing of share recipients (#26603)
This commit is contained in:
Roeland Jago Douma 2017-01-02 21:19:43 +01:00 committed by GitHub
commit fdf10e242d
12 changed files with 175 additions and 62 deletions

View File

@ -9,7 +9,20 @@
*/
(function(OC, OCA) {
var NS_OWNCLOUD = 'http://owncloud.org/ns';
_.extend(OC.Files.Client, {
PROPERTY_FILEID: '{' + OC.Files.Client.NS_OWNCLOUD + '}id',
PROPERTY_MESSAGE: '{' + OC.Files.Client.NS_OWNCLOUD + '}message',
PROPERTY_ACTORTYPE: '{' + OC.Files.Client.NS_OWNCLOUD + '}actorType',
PROPERTY_ACTORID: '{' + OC.Files.Client.NS_OWNCLOUD + '}actorId',
PROPERTY_ISUNREAD: '{' + OC.Files.Client.NS_OWNCLOUD + '}isUnread',
PROPERTY_OBJECTID: '{' + OC.Files.Client.NS_OWNCLOUD + '}objectId',
PROPERTY_OBJECTTYPE: '{' + OC.Files.Client.NS_OWNCLOUD + '}objectType',
PROPERTY_ACTORDISPLAYNAME: '{' + OC.Files.Client.NS_OWNCLOUD + '}actorDisplayName',
PROPERTY_CREATIONDATETIME: '{' + OC.Files.Client.NS_OWNCLOUD + '}creationDateTime',
PROPERTY_MENTIONS: '{' + OC.Files.Client.NS_OWNCLOUD + '}mentions'
});
/**
* @class OCA.Comments.CommentModel
* @classdesc
@ -27,16 +40,16 @@
},
davProperties: {
'id': '{' + NS_OWNCLOUD + '}id',
'message': '{' + NS_OWNCLOUD + '}message',
'actorType': '{' + NS_OWNCLOUD + '}actorType',
'actorId': '{' + NS_OWNCLOUD + '}actorId',
'actorDisplayName': '{' + NS_OWNCLOUD + '}actorDisplayName',
'creationDateTime': '{' + NS_OWNCLOUD + '}creationDateTime',
'objectType': '{' + NS_OWNCLOUD + '}objectType',
'objectId': '{' + NS_OWNCLOUD + '}objectId',
'isUnread': '{' + NS_OWNCLOUD + '}isUnread',
'mentions': '{' + NS_OWNCLOUD + '}mentions'
'id': OC.Files.Client.PROPERTY_FILEID,
'message': OC.Files.Client.PROPERTY_MESSAGE,
'actorType': OC.Files.Client.PROPERTY_ACTORTYPE,
'actorId': OC.Files.Client.PROPERTY_ACTORID,
'actorDisplayName': OC.Files.Client.PROPERTY_ACTORDISPLAYNAME,
'creationDateTime': OC.Files.Client.PROPERTY_CREATIONDATETIME,
'objectType': OC.Files.Client.PROPERTY_OBJECTTYPE,
'objectId': OC.Files.Client.PROPERTY_OBJECTID,
'isUnread': OC.Files.Client.PROPERTY_ISUNREAD,
'mentions': OC.Files.Client.PROPERTY_MENTIONS
},
parse: function(data) {
@ -78,4 +91,3 @@
OCA.Comments.CommentModel = CommentModel;
})(OC, OCA);

View File

@ -9,13 +9,17 @@
*/
(function(OC, OCA) {
var NS_OWNCLOUD = 'http://owncloud.org/ns';
_.extend(OC.Files.Client, {
PROPERTY_READMARKER: '{' + OC.Files.Client.NS_OWNCLOUD + '}readMarker'
});
/**
* @class OCA.Comments.CommentSummaryModel
* @classdesc
*
* Model containing summary information related to comments
* like the read marker.
* like the read marker.
*
*/
var CommentSummaryModel = OC.Backbone.Model.extend(
@ -37,7 +41,7 @@
_objectId: null,
davProperties: {
'readMarker': '{' + NS_OWNCLOUD + '}readMarker'
'readMarker': OC.Files.Client.PROPERTY_READMARKER
},
/**
@ -62,4 +66,3 @@
OCA.Comments.CommentSummaryModel = CommentSummaryModel;
})(OC, OCA);

View File

@ -11,6 +11,11 @@
/* global Handlebars */
(function() {
_.extend(OC.Files.Client, {
PROPERTY_COMMENTS_UNREAD: '{' + OC.Files.Client.NS_OWNCLOUD + '}comments-unread'
});
var TEMPLATE_COMMENTS_UNREAD =
'<a class="action action-comment permanent" title="{{countMessage}}" href="#">' +
'<img class="svg" src="{{iconUrl}}"/>' +
@ -52,19 +57,17 @@
fileList.registerTabView(new OCA.Comments.CommentsTabView('commentsTabView'));
var NS_OC = 'http://owncloud.org/ns';
var oldGetWebdavProperties = fileList._getWebdavProperties;
fileList._getWebdavProperties = function() {
var props = oldGetWebdavProperties.apply(this, arguments);
props.push('{' + NS_OC + '}comments-unread');
props.push(OC.Files.Client.PROPERTY_COMMENTS_UNREAD);
return props;
};
fileList.filesClient.addFileInfoParser(function(response) {
var data = {};
var props = response.propStat[0].properties;
var commentsUnread = props['{' + NS_OC + '}comments-unread'];
var commentsUnread = props[OC.Files.Client.PROPERTY_COMMENTS_UNREAD];
if (!_.isUndefined(commentsUnread) && commentsUnread !== '') {
data.commentsUnread = parseInt(commentsUnread, 10);
}

View File

@ -328,6 +328,9 @@ class FilesPlugin extends ServerPlugin {
$propFind->handle(self::HAS_PREVIEW_PROPERTYNAME, function () use ($node) {
return json_encode($this->previewManager->isAvailable($node->getFileInfo()));
});
$propFind->handle(self::SIZE_PROPERTYNAME, function() use ($node) {
return $node->getSize();
});
}
if ($node instanceof \OCA\DAV\Connector\Sabre\Node) {

View File

@ -188,8 +188,6 @@ class FilesPluginTest extends TestCase {
$node->expects($this->exactly(2))
->method('getOwner')
->will($this->returnValue($user));
$node->expects($this->never())
->method('getSize');
$this->plugin->handleGetProperties(
$propFind,

View File

@ -36,10 +36,18 @@
path: ''
},
initialize: function(data) {
_filesClient: null,
initialize: function(data, options) {
if (!_.isUndefined(data.id)) {
data.id = parseInt(data.id, 10);
}
if( options ){
if (options.filesClient) {
this._filesClient = options.filesClient;
}
}
},
/**
@ -73,6 +81,42 @@
*/
getFullPath: function() {
return OC.joinPaths(this.get('path'), this.get('name'));
},
/**
* Reloads missing properties from server and set them in the model.
* @param properties array of properties to be reloaded
* @return ajax call object
*/
reloadProperties: function(properties) {
if( !this._filesClient ){
return;
}
var self = this;
var deferred = $.Deferred();
var targetPath = OC.joinPaths(this.get('path') + '/', this.get('name'));
this._filesClient.getFileInfo(targetPath, {
properties: properties
})
.then(function(status, data) {
// the following lines should be extracted to a mapper
if( properties.indexOf(OC.Files.Client.PROPERTY_GETCONTENTLENGTH) !== -1
|| properties.indexOf(OC.Files.Client.PROPERTY_SIZE) !== -1 ) {
self.set('size', data.size);
}
deferred.resolve(status, data);
})
.fail(function(status) {
OC.Notification.showTemporary(t('files', 'Could not load info for file "{file}"', {file: self.get('name')}));
deferred.reject(status);
});
return deferred.promise();
}
});
@ -82,4 +126,3 @@
OCA.Files.FileInfoModel = FileInfoModel;
})(OC, OCA);

View File

@ -442,7 +442,9 @@
// In the future the FileList should work with Backbone.Collection
// and contain existing models that can be used.
// This method would in the future simply retrieve the matching model from the collection.
var model = new OCA.Files.FileInfoModel(this.elementToFile($tr));
var model = new OCA.Files.FileInfoModel(this.elementToFile($tr), {
filesClient: this.filesClient
});
if (!model.get('path')) {
model.set('path', this.getCurrentDirectory(), {silent: true});
}
@ -891,11 +893,14 @@
mimetype: $el.attr('data-mime'),
mtime: parseInt($el.attr('data-mtime'), 10),
type: $el.attr('data-type'),
size: parseInt($el.attr('data-size'), 10),
etag: $el.attr('data-etag'),
permissions: parseInt($el.attr('data-permissions'), 10),
hasPreview: $el.attr('data-has-preview') === 'true'
};
var size = $el.attr('data-size');
if (size) {
data.size = parseInt(size, 10);
}
var icon = $el.attr('data-icon');
if (icon) {
data.icon = icon;
@ -1029,7 +1034,7 @@
* 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) {
@ -2828,7 +2833,6 @@
});
uploader.on('fail', function(e, data) {
self._uploader.log('filelist handle fileuploadfail', e, data);
self._uploads = [];
//if user pressed cancel hide upload chrome

View File

@ -130,6 +130,19 @@
if (this.model) {
this.model.on('change', this._onModelChanged, this);
}
if (this.model) {
var properties = [];
if( !this.model.has('size') ) {
properties.push(OC.Files.Client.PROPERTY_SIZE);
properties.push(OC.Files.Client.PROPERTY_GETCONTENTLENGTH);
}
if( properties.length > 0){
this.model.reloadProperties(properties);
}
}
this.render();
},

View File

@ -12,6 +12,11 @@
(function(OCA) {
_.extend(OC.Files.Client, {
PROPERTY_TAGS: '{' + OC.Files.Client.NS_OWNCLOUD + '}tags',
PROPERTY_FAVORITE: '{' + OC.Files.Client.NS_OWNCLOUD + '}favorite'
});
var TEMPLATE_FAVORITE_ACTION =
'<a href="#" ' +
'class="action action-favorite {{#isFavorite}}permanent{{/isFavorite}}">' +
@ -162,24 +167,22 @@
return fileInfo;
};
var NS_OC = 'http://owncloud.org/ns';
var oldGetWebdavProperties = fileList._getWebdavProperties;
fileList._getWebdavProperties = function() {
var props = oldGetWebdavProperties.apply(this, arguments);
props.push('{' + NS_OC + '}tags');
props.push('{' + NS_OC + '}favorite');
props.push(OC.Files.Client.PROPERTY_TAGS);
props.push(OC.Files.Client.PROPERTY_FAVORITE);
return props;
};
fileList.filesClient.addFileInfoParser(function(response) {
var data = {};
var props = response.propStat[0].properties;
var tags = props['{' + NS_OC + '}tags'];
var favorite = props['{' + NS_OC + '}favorite'];
var tags = props[OC.Files.Client.PROPERTY_TAGS];
var favorite = props[OC.Files.Client.PROPERTY_FAVORITE];
if (tags && tags.length) {
tags = _.chain(tags).filter(function(xmlvalue) {
return (xmlvalue.namespaceURI === NS_OC && xmlvalue.nodeName.split(':')[1] === 'tag');
return (xmlvalue.namespaceURI === OC.Files.Client.NS_OWNCLOUD && xmlvalue.nodeName.split(':')[1] === 'tag');
}).map(function(xmlvalue) {
return xmlvalue.textContent || xmlvalue.text;
}).value();

View File

@ -9,6 +9,12 @@
*/
(function() {
_.extend(OC.Files.Client, {
PROPERTY_SHARE_TYPES: '{' + OC.Files.Client.NS_OWNCLOUD + '}share-types',
PROPERTY_OWNER_DISPLAY_NAME: '{' + OC.Files.Client.NS_OWNCLOUD + '}owner-display-name'
});
if (!OCA.Sharing) {
OCA.Sharing = {};
}
@ -65,32 +71,38 @@
fileInfo.shareTypes = shareTypes;
}
if( $el.attr('data-expiration')){
var expirationTimestamp = parseInt($el.attr('data-expiration'));
fileInfo.shares = [];
fileInfo.shares.push({expiration: expirationTimestamp});
}
fileInfo.recipientsDisplayName = $el.attr('data-share-recipients') || undefined;
return fileInfo;
};
var NS_OC = 'http://owncloud.org/ns';
var oldGetWebdavProperties = fileList._getWebdavProperties;
fileList._getWebdavProperties = function() {
var props = oldGetWebdavProperties.apply(this, arguments);
props.push('{' + NS_OC + '}owner-display-name');
props.push('{' + NS_OC + '}share-types');
props.push(OC.Files.Client.PROPERTY_OWNER_DISPLAY_NAME);
props.push(OC.Files.Client.PROPERTY_SHARE_TYPES);
return props;
};
fileList.filesClient.addFileInfoParser(function(response) {
var data = {};
var props = response.propStat[0].properties;
var permissionsProp = props['{' + NS_OC + '}permissions'];
var permissionsProp = props[OC.Files.Client.PROPERTY_PERMISSIONS];
if (permissionsProp && permissionsProp.indexOf('S') >= 0) {
data.shareOwner = props['{' + NS_OC + '}owner-display-name'];
data.shareOwner = props[OC.Files.Client.PROPERTY_OWNER_DISPLAY_NAME];
}
var shareTypesProp = props['{' + NS_OC + '}share-types'];
var shareTypesProp = props[OC.Files.Client.PROPERTY_SHARE_TYPES];
if (shareTypesProp) {
data.shareTypes = _.chain(shareTypesProp).filter(function(xmlvalue) {
return (xmlvalue.namespaceURI === NS_OC && xmlvalue.nodeName.split(':')[1] === 'share-type');
return (xmlvalue.namespaceURI === OC.Files.Client.NS_OWNCLOUD && xmlvalue.nodeName.split(':')[1] === 'share-type');
}).map(function(xmlvalue) {
return parseInt(xmlvalue.textContent || xmlvalue.text, 10);
}).value();

View File

@ -31,9 +31,9 @@
this._root = this._root.substr(0, this._root.length - 1);
}
var url = 'http://';
var url = Client.PROTOCOL_HTTP + '://';
if (options.useHTTPS) {
url = 'https://';
url = Client.PROTOCOL_HTTPS + '://';
}
url += options.host + this._root;
@ -64,6 +64,19 @@
Client.NS_OWNCLOUD = 'http://owncloud.org/ns';
Client.NS_NEXTCLOUD = 'http://nextcloud.org/ns';
Client.NS_DAV = 'DAV:';
Client.PROPERTY_GETLASTMODIFIED = '{' + Client.NS_DAV + '}getlastmodified';
Client.PROPERTY_GETETAG = '{' + Client.NS_DAV + '}getetag';
Client.PROPERTY_GETCONTENTTYPE = '{' + Client.NS_DAV + '}getcontenttype';
Client.PROPERTY_RESOURCETYPE = '{' + Client.NS_DAV + '}resourcetype';
Client.PROPERTY_INTERNAL_FILEID = '{' + Client.NS_OWNCLOUD + '}fileid';
Client.PROPERTY_PERMISSIONS = '{' + Client.NS_OWNCLOUD + '}permissions';
Client.PROPERTY_SIZE = '{' + Client.NS_OWNCLOUD + '}size';
Client.PROPERTY_GETCONTENTLENGTH = '{' + Client.NS_DAV + '}getcontentlength';
Client.PROTOCOL_HTTP = 'http';
Client.PROTOCOL_HTTPS = 'https';
Client._PROPFIND_PROPERTIES = [
/**
* Modified time
@ -259,23 +272,23 @@
var props = response.propStat[0].properties;
var data = {
id: props['{' + Client.NS_OWNCLOUD + '}fileid'],
id: props[Client.PROPERTY_INTERNAL_FILEID],
path: OC.dirname(path) || '/',
name: OC.basename(path),
mtime: (new Date(props['{' + Client.NS_DAV + '}getlastmodified'])).getTime()
mtime: (new Date(props[Client.PROPERTY_GETLASTMODIFIED])).getTime()
};
var etagProp = props['{' + Client.NS_DAV + '}getetag'];
var etagProp = props[Client.PROPERTY_GETETAG];
if (!_.isUndefined(etagProp)) {
data.etag = this._parseEtag(etagProp);
}
var sizeProp = props['{' + Client.NS_DAV + '}getcontentlength'];
var sizeProp = props[Client.PROPERTY_GETCONTENTLENGTH];
if (!_.isUndefined(sizeProp)) {
data.size = parseInt(sizeProp, 10);
}
sizeProp = props['{' + Client.NS_OWNCLOUD + '}size'];
sizeProp = props[Client.PROPERTY_SIZE];
if (!_.isUndefined(sizeProp)) {
data.size = parseInt(sizeProp, 10);
}
@ -294,12 +307,12 @@
data.isFavorite = false;
}
var contentType = props['{' + Client.NS_DAV + '}getcontenttype'];
var contentType = props[Client.PROPERTY_GETCONTENTTYPE];
if (!_.isUndefined(contentType)) {
data.mimetype = contentType;
}
var resType = props['{' + Client.NS_DAV + '}resourcetype'];
var resType = props[Client.PROPERTY_RESOURCETYPE];
var isFile = true;
if (!data.mimetype && resType) {
var xmlvalue = resType[0];
@ -310,7 +323,7 @@
}
data.permissions = OC.PERMISSION_READ;
var permissionProp = props['{' + Client.NS_OWNCLOUD + '}permissions'];
var permissionProp = props[Client.PROPERTY_PERMISSIONS];
if (!_.isUndefined(permissionProp)) {
var permString = permissionProp || '';
data.mountType = null;
@ -752,7 +765,7 @@
},
/**
* Returns the password
* Returns the password
*
* @since 11.0.0
* @return {String} password
@ -816,4 +829,3 @@
OC.Files.Client = Client;
})(OC, OC.Files.FileInfo);

View File

@ -9,7 +9,15 @@
*/
(function(OC) {
var NS_OWNCLOUD = 'http://owncloud.org/ns';
_.extend(OC.Files.Client, {
PROPERTY_FILEID: '{' + OC.Files.Client.NS_OWNCLOUD + '}id',
PROPERTY_CAN_ASSIGN:'{' + OC.Files.Client.NS_OWNCLOUD + '}can-assign',
PROPERTY_DISPLAYNAME: '{' + OC.Files.Client.NS_OWNCLOUD + '}display-name',
PROPERTY_USERVISIBLE: '{' + OC.Files.Client.NS_OWNCLOUD + '}user-visible',
PROPERTY_USERASSIGNABLE:'{' + OC.Files.Client.NS_OWNCLOUD + '}user-assignable',
});
/**
* @class OCA.SystemTags.SystemTagsCollection
* @classdesc
@ -28,12 +36,12 @@
},
davProperties: {
'id': '{' + NS_OWNCLOUD + '}id',
'name': '{' + NS_OWNCLOUD + '}display-name',
'userVisible': '{' + NS_OWNCLOUD + '}user-visible',
'userAssignable': '{' + NS_OWNCLOUD + '}user-assignable',
'id': OC.Files.Client.PROPERTY_FILEID,
'name': OC.Files.Client.PROPERTY_DISPLAYNAME,
'userVisible': OC.Files.Client.PROPERTY_USERVISIBLE,
'userAssignable': OC.Files.Client.PROPERTY_USERASSIGNABLE,
// read-only, effective permissions computed by the server,
'canAssign': '{' + NS_OWNCLOUD + '}can-assign'
'canAssign': OC.Files.Client.PROPERTY_CAN_ASSIGN
},
parse: function(data) {
@ -50,4 +58,3 @@
OC.SystemTags = OC.SystemTags || {};
OC.SystemTags.SystemTagModel = SystemTagModel;
})(OC);