share.vm.js 5.6 KB

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