diff --git a/js/legacy/commentcollection.js b/js/legacy/commentcollection.js new file mode 100644 index 000000000..e4faf4e5b --- /dev/null +++ b/js/legacy/commentcollection.js @@ -0,0 +1,161 @@ +/** + * @licence + */ + +import CommentModel from './commentmodel.js'; +import CommentSummaryModel from './commentsummarymodel.js'; + +/** + * @class CommentCollection + * @classdesc + * + * Collection of comments assigned to a file + * + */ +var CommentCollection = OC.Backbone.Collection.extend( + /** @lends OCA.AnnouncementCenter.Comments.CommentCollection.prototype */ { + + sync: OC.Backbone.davSync, + + model: CommentModel, + + /** + * Object type + * + * @type string + */ + _objectType: 'deckCard', + + /** + * Object id + * + * @type string + */ + _objectId: null, + + /** + * True if there are no more page results left to fetch + * + * @type bool + */ + _endReached: false, + + /** + * Number of comments to fetch per page + * + * @type int + */ + _limit : 2, + + /** + * Initializes the collection + * + * @param {string} [options.objectType] object type + * @param {string} [options.objectId] object id + */ + initialize: function(models, options) { + options = options || {}; + if (options.objectType) { + this._objectType = options.objectType; + } + if (options.objectId) { + this._objectId = options.objectId; + } + }, + + url: function() { + return OC.linkToRemote('dav') + '/comments/' + + encodeURIComponent(this._objectType) + '/' + + encodeURIComponent(this._objectId) + '/'; + }, + + setObjectId: function(objectId) { + this._objectId = objectId; + }, + + hasMoreResults: function() { + return !this._endReached; + }, + + reset: function() { + this._endReached = false; + this._summaryModel = null; + return OC.Backbone.Collection.prototype.reset.apply(this, arguments); + }, + + /** + * Fetch the next set of results + */ + fetchNext: function(options) { + var self = this; + if (!this.hasMoreResults()) { + return null; + } + + var body = '\n' + + '\n' + + // load one more so we know there is more + ' ' + (this._limit + 1) + '\n' + + ' ' + this.length + '\n' + + '\n'; + + options = options || {}; + var success = options.success; + options = _.extend({ + remove: false, + parse: true, + data: body, + davProperties: CommentCollection.prototype.model.prototype.davProperties, + success: function(resp) { + if (resp.length <= self._limit) { + // no new entries, end reached + self._endReached = true; + } else { + // remove last entry, for next page load + resp = _.initial(resp); + } + if (!self.set(resp, options)) { + return false; + } + if (success) { + success.apply(null, arguments); + } + self.trigger('sync', 'REPORT', self, options); + } + }, options); + + return this.sync('REPORT', this, options); + }, + + /** + * Returns the matching summary model + * + * @return {OCA.AnnouncementCenter.Comments.CommentSummaryModel} summary model + */ + getSummaryModel: function() { + if (!this._summaryModel) { + this._summaryModel = new CommentSummaryModel({ + id: this._objectId, + objectType: this._objectType + }); + } + return this._summaryModel; + }, + + /** + * Updates the read marker for this comment thread + * + * @param {Date} [date] optional date, defaults to now + * @param {Object} [options] backbone options + */ + updateReadMarker: function(date, options) { + options = options || {}; + + return this.getSummaryModel().save({ + readMarker: (date || new Date()).toUTCString() + }, options); + } +}); + +export default CommentCollection; + diff --git a/js/legacy/commentmodel.js b/js/legacy/commentmodel.js new file mode 100644 index 000000000..3f9b72e08 --- /dev/null +++ b/js/legacy/commentmodel.js @@ -0,0 +1,72 @@ + +var NS_OWNCLOUD = 'http://owncloud.org/ns'; +/** + * @class OCA.AnnouncementCenter.Comments.CommentModel + * @classdesc + * + * Comment + * + */ +var CommentModel = OC.Backbone.Model.extend( + /** @lends OCA.Comments.CommentModel.prototype */ { + sync: OC.Backbone.davSync, + + /** + * Object type + * + * @type string + */ + _objectType: 'deckCard', + + /** + * Object id + * + * @type string + */ + _objectId: null, + + initialize: function(model, options) { + options = options || {}; + if (options.objectType) { + this._objectType = options.objectType; + } + if (options.objectId) { + this._objectId = options.objectId; + } + }, + + defaults: { + actorType: 'users', + objectType: 'deckCard' + }, + + 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' + }, + + parse: function(data) { + return { + id: data.id, + message: data.message, + actorType: data.actorType, + actorId: data.actorId, + actorDisplayName: data.actorDisplayName, + creationDateTime: data.creationDateTime, + objectType: data.objectType, + objectId: data.objectId, + isUnread: (data.isUnread === 'true') + }; + }, + +}); + +export default CommentModel; + diff --git a/js/legacy/commentsummarymodel.js b/js/legacy/commentsummarymodel.js new file mode 100644 index 000000000..ca80d329c --- /dev/null +++ b/js/legacy/commentsummarymodel.js @@ -0,0 +1,54 @@ + +var NS_OWNCLOUD = 'http://owncloud.org/ns'; +/** + * @class OCA.AnnouncementCenter.Comments.CommentSummaryModel + * @classdesc + * + * Model containing summary information related to comments + * like the read marker. + * + */ +var CommentSummaryModel = OC.Backbone.Model.extend( + /** @lends OCA.AnnouncementCenter.Comments.CommentSummaryModel.prototype */ { + sync: OC.Backbone.davSync, + + /** + * Object type + * + * @type string + */ + _objectType: 'deckCard', + + /** + * Object id + * + * @type string + */ + _objectId: null, + + davProperties: { + 'readMarker': '{' + NS_OWNCLOUD + '}readMarker' + }, + + /** + * Initializes the summary model + * + * @param {string} [options.objectType] object type + * @param {string} [options.objectId] object id + */ + initialize: function(attrs, options) { + options = options || {}; + if (options.objectType) { + this._objectType = options.objectType; + } + }, + + url: function() { + return OC.linkToRemote('dav') + '/comments/' + + encodeURIComponent(this._objectType) + '/' + + encodeURIComponent(this.id) + '/'; + } +}); + +export default CommentSummaryModel; +