PageRenderTime 47ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/rave-portal-resources/src/main/webapp/static/script/portal/rave_models.js

https://gitlab.com/kidaa/rave
JavaScript | 287 lines | 202 code | 46 blank | 39 comment | 11 complexity | 5e237ac8575074d8720e7baf165d683b MD5 | raw file
Possible License(s): Apache-2.0, MPL-2.0-no-copyleft-exception, CPL-1.0
  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing,
  13. * software distributed under the License is distributed on an
  14. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. * KIND, either express or implied. See the License for the
  16. * specific language governing permissions and limitations
  17. * under the License.
  18. */
  19. define(["underscore", "portal/rave_backbone", "portal/rave_portal", "rave"], function(_, raveBackbone, ravePortal, rave){
  20. /*
  21. User model. Further implementation pending.
  22. */
  23. var User = raveBackbone.Model.extend({
  24. });
  25. /*
  26. Collection of users. Currently used for the share page users search.
  27. */
  28. var Users = raveBackbone.Collection.extend({
  29. model: User,
  30. pageSize: 10,
  31. //empty pagination data, is filled in on requests
  32. paginationData: {
  33. start:0,
  34. finish: 0,
  35. total: 0,
  36. prevLink: {},
  37. nextLink: {},
  38. pages: []
  39. },
  40. initialize: function(){
  41. //ensure that parse is always invoked in the context of this object
  42. _.bindAll(this, 'parse');
  43. },
  44. //filter collection with a search term
  45. filter: function (term) {
  46. this.searchTerm = term;
  47. if (this.searchTerm) {
  48. rave.api.rpc.searchUsers({searchTerm: this.searchTerm,
  49. offset: 0,
  50. successCallback: this.parse,
  51. alertEmptySearch: function(){alert(ravePortal.getClientMessage("api.rpc.empty.search.term"));}
  52. });
  53. }
  54. else {
  55. rave.api.rpc.getUsers({offset: 0, successCallback: this.parse });
  56. }
  57. },
  58. //used for pagination
  59. fetchPage: function (page) {
  60. var self = this;
  61. var offset = page?(page-1):0;
  62. offset *= this.pageSize;
  63. if (this.searchTerm) {
  64. rave.api.rpc.searchUsers({searchTerm: this.searchTerm,
  65. offset: offset,
  66. successCallback: this.parse,
  67. alertEmptySearch: function(){alert(ravePortal.getClientMessage("api.rpc.empty.search.term"));}
  68. });
  69. }
  70. else {
  71. rave.api.rpc.getUsers({offset: offset, successCallback: this.parse });
  72. }
  73. },
  74. //parse return data from the rpc call into a usable data model
  75. parse: function (data) {
  76. var result = data.result;
  77. this.pageSize = result.pageSize || 10;
  78. this.paginationData = {
  79. start: result.offset + 1,
  80. finish: result.resultSet.length + result.offset,
  81. total: result.totalResults,
  82. pageSize: result.pageSize,
  83. prevLink: {
  84. show: result.currentPage > 1 ? true : false,
  85. pageNumber: result.currentPage - 1
  86. },
  87. nextLink: {
  88. show: result.currentPage < result.numberOfPages ? true : false,
  89. pageNumber: result.currentPage + 1
  90. },
  91. //pages will be an array of objects from 1 to number of pages
  92. pages: _.map(_.range(1, result.numberOfPages + 1), function (pageNumber) {
  93. return {
  94. pageNumber: pageNumber,
  95. current: pageNumber == result.currentPage
  96. }
  97. })
  98. }
  99. this.reset(result.resultSet);
  100. },
  101. //When toViewModel is invoked, also provide pagination and filter data
  102. toViewModel: function () {
  103. return {
  104. searchTerm: this.searchTerm,
  105. pagination: this.paginationData,
  106. users: this.constructor.__super__.toViewModel.apply(this)
  107. }
  108. }
  109. });
  110. /*
  111. Page model. Used for managing most of the sharing functionality.
  112. */
  113. var Page = raveBackbone.Model.extend({
  114. defaults: {
  115. members: {}
  116. },
  117. addInitData: function (userId, isEditor) {
  118. var members = this.get('members');
  119. members[userId] = {
  120. userId: userId,
  121. editor: isEditor
  122. }
  123. this.set('members', members, {silent:true});
  124. },
  125. isUserOwner: function (userId) {
  126. return userId == this.get('ownerId');
  127. },
  128. isUserView: function(userId) {
  129. return userId == this.get('viewerId');
  130. },
  131. isUserMember: function (userId) {
  132. return this.get('members')[userId] ? true : false;
  133. },
  134. isUserEditor: function (userId) {
  135. var member = this.get('members')[userId];
  136. return member && member.editor;
  137. },
  138. addMember: function (userId) {
  139. var self = this;
  140. rave.api.rpc.addMemberToPage({pageId: self.get('id'), userId: userId,
  141. successCallback: function (result) {
  142. var members = self.get('members');
  143. members[userId] = {
  144. userId: userId,
  145. editor: false
  146. }
  147. self.set('members', members);
  148. /*
  149. The model does not manage or care about views. Instead it fires events
  150. that views can subscribe to for ui representation.
  151. */
  152. self.trigger('share', 'member:add', userId);
  153. }
  154. });
  155. },
  156. removeMember: function (userId) {
  157. var self = this;
  158. rave.api.rpc.removeMemberFromPage({pageId: self.get('id'), userId: userId,
  159. successCallback: function (result) {
  160. var members = self.get('members');
  161. delete members[userId];
  162. self.set('members', members);
  163. self.trigger('share', 'member:remove', userId);
  164. }
  165. });
  166. },
  167. removeForSelf: function(){
  168. var self = this;
  169. rave.api.rpc.removeMemberFromPage({pageId: self.get('id'), userId: self.get('viewerId'),
  170. successCallback: function () {
  171. self.trigger('declineShare', self.get('id'));
  172. }
  173. });
  174. },
  175. addEditor: function (userId) {
  176. var self = this;
  177. //updatePageEditingStatus
  178. rave.api.rpc.updatePageEditingStatus({pageId: self.get('id'), userId: userId, isEditor: true,
  179. successCallback: function () {
  180. var members = self.get('members');
  181. members[userId] = {
  182. userId: userId,
  183. editor: true
  184. }
  185. self.set('members', members);
  186. self.trigger('share', 'editor:add', userId);
  187. }
  188. });
  189. },
  190. removeEditor: function (userId) {
  191. var self = this;
  192. rave.api.rpc.updatePageEditingStatus({pageId: self.get('id'), userId: userId, isEditor: false,
  193. successCallback: function () {
  194. var members = self.get('members');
  195. members[userId] = {
  196. userId: userId,
  197. editor: false
  198. }
  199. self.set('members', members);
  200. self.trigger('share', 'editor:remove', userId);
  201. }
  202. });
  203. },
  204. cloneForUser: function (userId, pageName) {
  205. pageName = pageName || null;
  206. var self =this;
  207. rave.api.rpc.clonePageForUser({pageId: this.get('id'), userId: userId, pageName: pageName,
  208. successCallback: function(result){
  209. if(result.error) {
  210. return self.trigger('error', result.errorCode, userId);
  211. }
  212. self.trigger('share', 'clone', userId);
  213. }
  214. });
  215. },
  216. acceptShare: function(){
  217. var self = this;
  218. rave.api.rpc.updateSharedPageStatus({pageId: this.get('id'), shareStatus: 'accepted',
  219. successCallback: function (result) {
  220. self.trigger('acceptShare', self.get('id'));
  221. }
  222. });
  223. },
  224. declineShare: function(){
  225. var self = this;
  226. rave.api.rpc.updateSharedPageStatus({pageId: this.get('id'), shareStatus: 'refused',
  227. successCallback: function (result) {
  228. rave.api.rpc.removeMemberFromPage({pageId: self.get('id'), userId: self.get('viewerId'),
  229. successCallback: function (result) {
  230. self.trigger('declineShare', self.get('id'));
  231. }
  232. });
  233. }
  234. })
  235. }
  236. });
  237. return {
  238. currentPage: new Page(),
  239. users: new Users()
  240. }
  241. })