share.vm.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. var shareViewModel;
  2. function ShareViewModel(updateDocF) {
  3. var self = this;
  4. self.hasInitBeenCalled = false;
  5. self.hasSetupBeenCalled = false;
  6. self.selectedPerm = ko.observable('read');
  7. self.selectedPermLabel = ko.computed(function() {
  8. if (self.selectedPerm() == 'write') {
  9. return 'Modify';
  10. } else {
  11. return 'Read';
  12. }
  13. });
  14. self.selectedDoc = ko.observable(ko.mapping.fromJS({
  15. perms: {
  16. read: {
  17. users: [],
  18. groups: []
  19. },
  20. write: {
  21. users: [],
  22. groups: []
  23. }
  24. }
  25. }))
  26. self.updateDoc = updateDocF
  27. self.setDocId = function(docId) {
  28. if (docId == -1) { return false; }
  29. $.get('/desktop/api/doc/get', { id : docId },
  30. function (data) {
  31. shareViewModel.selectedDoc(data)
  32. });
  33. }
  34. }
  35. function openShareModal() {
  36. $("#documentShareModal").modal("show");
  37. setupSharing(function(){
  38. $("#documentShareAddBtn").removeClass("disabled");
  39. $("#documentShareCaret").removeClass("disabled");
  40. $("#documentShareTypeahead").removeAttr("disabled");
  41. });
  42. }
  43. function isShared() {
  44. if (!shareViewModel) { return false; }
  45. read = shareViewModel.selectedDoc().perms.read;
  46. return read.users.length + read.groups.length > 0
  47. }
  48. function prettifyUsername(userId) {
  49. var _user = null;
  50. for (var i = 0; i < JSON_USERS_GROUPS.users.length; i++) {
  51. if (JSON_USERS_GROUPS.users[i].id == userId) {
  52. _user = JSON_USERS_GROUPS.users[i];
  53. }
  54. }
  55. if (_user != null) {
  56. return (_user.first_name != "" ? _user.first_name + " " : "") + (_user.last_name != "" ? _user.last_name + " " : "") + ((_user.first_name != "" || _user.last_name != "") ? "(" : "") + _user.username + ((_user.first_name != "" || _user.last_name != "") ? ")" : "");
  57. }
  58. return "";
  59. }
  60. function initSharing(id, updateFunc) {
  61. if(!updateFunc) {
  62. updateFunc = function () {}
  63. }
  64. shareViewModel = new ShareViewModel(updateFunc);
  65. ko.applyBindings(shareViewModel, $(id)[0]);
  66. shareViewModel.hasInitBeenCalled = true;
  67. return shareViewModel;
  68. }
  69. function setupSharing(id, updateFunc) {
  70. if (shareViewModel == null || !shareViewModel.hasInitBeenCalled) {
  71. shareViewModel = initSharing(id, updateFunc);
  72. }
  73. if (! self.hasSetupBeenCalled){
  74. $.getJSON('/desktop/api/users/autocomplete', function (data) {
  75. self.hasSetupBeenCalled = true;
  76. JSON_USERS_GROUPS = data;
  77. dropdown = [];
  78. map = {};
  79. $.each(JSON_USERS_GROUPS.users, function (i, user) {
  80. var _display = prettifyUsername(user.id);
  81. map[_display] = user;
  82. dropdown.push(_display);
  83. });
  84. $.each(JSON_USERS_GROUPS.groups, function (i, group) {
  85. map[group.name] = group;
  86. dropdown.push(group.name);
  87. });
  88. $("#documentShareTypeahead").typeahead({
  89. source: function (query, process) {
  90. process(dropdown);
  91. },
  92. matcher: function (item) {
  93. if (item.toLowerCase().indexOf(this.query.trim().toLowerCase()) != -1) {
  94. return true;
  95. }
  96. },
  97. sorter: function (items) {
  98. return items.sort();
  99. },
  100. highlighter: function (item) {
  101. var _icon = "fa";
  102. var _display = "";
  103. if (map[item].hasOwnProperty("username")) {
  104. _icon += " fa-user";
  105. }
  106. else {
  107. _icon += " fa-users";
  108. }
  109. var regex = new RegExp('(' + this.query + ')', 'gi');
  110. return "<i class='" + _icon + "'></i> " + item.replace(regex, "<strong>$1</strong>");
  111. },
  112. updater: function (item) {
  113. selectedUserOrGroup = map[item];
  114. return item;
  115. }
  116. });
  117. $("#documentShareTypeahead").on("keyup", function (e) {
  118. var _code = (e.keyCode ? e.keyCode : e.which);
  119. if (_code == 13) {
  120. handleTypeaheadSelection();
  121. }
  122. });
  123. if (typeof id == "function"){
  124. id();
  125. }
  126. });
  127. $("#documentShareAddBtn").on("click", function () {
  128. if (! $(this).hasClass("disabled")){
  129. handleTypeaheadSelection();
  130. }
  131. });
  132. }
  133. else {
  134. if (typeof id == "function"){
  135. id();
  136. }
  137. }
  138. return shareViewModel;
  139. }
  140. function updateSharePerm(perms, user) {
  141. $(perms).each(function (cnt, item) {
  142. if (item.id == user.id) {
  143. perms.splice(cnt, 1);
  144. }
  145. });
  146. shareViewModel.selectedDoc.valueHasMutated();
  147. shareDocFinal();
  148. }
  149. function removeUserReadShare(user) {
  150. updateSharePerm(shareViewModel.selectedDoc().perms.read.users, user);
  151. }
  152. function removeUserWriteShare(user) {
  153. updateSharePerm(shareViewModel.selectedDoc().perms.write.users, user);
  154. }
  155. function removeGroupReadShare(group) {
  156. updateSharePerm(shareViewModel.selectedDoc().perms.read.groups, group);
  157. }
  158. function removeGroupWriteShare(group) {
  159. updateSharePerm(shareViewModel.selectedDoc().perms.write.groups, group);
  160. }
  161. function changeDocumentSharePerm(perm) {
  162. shareViewModel.selectedPerm(perm);
  163. }
  164. function handleTypeaheadSelection() {
  165. if (selectedUserOrGroup != null) {
  166. if (selectedUserOrGroup.hasOwnProperty("username")) {
  167. shareViewModel.selectedDoc().perms[shareViewModel.selectedPerm()].users.push(selectedUserOrGroup);
  168. }
  169. else {
  170. shareViewModel.selectedDoc().perms[shareViewModel.selectedPerm()].groups.push(selectedUserOrGroup);
  171. }
  172. shareViewModel.selectedDoc.valueHasMutated();
  173. shareDocFinal();
  174. }
  175. selectedUserOrGroup = null;
  176. $("#documentShareTypeahead").val("");
  177. }
  178. function shareDocFinal() {
  179. var _postPerms = {
  180. read: {
  181. user_ids: [],
  182. group_ids: []
  183. },
  184. write: {
  185. user_ids: [],
  186. group_ids: []
  187. }
  188. }
  189. $(shareViewModel.selectedDoc().perms.read.users).each(function (cnt, item) {
  190. _postPerms.read.user_ids.push(item.id);
  191. });
  192. $(shareViewModel.selectedDoc().perms.read.groups).each(function (cnt, item) {
  193. _postPerms.read.group_ids.push(item.id);
  194. });
  195. $(shareViewModel.selectedDoc().perms.write.users).each(function (cnt, item) {
  196. _postPerms.write.user_ids.push(item.id);
  197. });
  198. $(shareViewModel.selectedDoc().perms.write.groups).each(function (cnt, item) {
  199. _postPerms.write.group_ids.push(item.id);
  200. });
  201. $.post("/desktop/api/doc/update_permissions", {
  202. doc_id: shareViewModel.selectedDoc().id,
  203. data: JSON.stringify(_postPerms)
  204. }, function (response) {
  205. if (response != null) {
  206. if (response.status != 0) {
  207. $(document).trigger("error", "There was an error processing your action: " + response.message);
  208. }
  209. else {
  210. shareViewModel.updateDoc(response.doc);
  211. }
  212. }
  213. });
  214. }