share.vm.js 6.6 KB

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