share.vm.js 5.6 KB

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