PageRenderTime 109ms CodeModel.GetById 75ms RepoModel.GetById 0ms app.codeStats 0ms

/app/assets/javascripts/users_select.js

https://gitlab.com/effigies/gitlab-ce
JavaScript | 344 lines | 334 code | 10 blank | 0 comment | 54 complexity | 567aac83897b4aba585eb3664e35a7ac MD5 | raw file
  1. (function() {
  2. var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
  3. slice = [].slice;
  4. this.UsersSelect = (function() {
  5. function UsersSelect(currentUser) {
  6. this.users = bind(this.users, this);
  7. this.user = bind(this.user, this);
  8. this.usersPath = "/autocomplete/users.json";
  9. this.userPath = "/autocomplete/users/:id.json";
  10. if (currentUser != null) {
  11. this.currentUser = JSON.parse(currentUser);
  12. }
  13. $('.js-user-search').each((function(_this) {
  14. return function(i, dropdown) {
  15. var $block, $collapsedSidebar, $dropdown, $loading, $selectbox, $value, abilityName, assignTo, assigneeTemplate, collapsedAssigneeTemplate, defaultLabel, firstUser, issueURL, selectedId, showAnyUser, showNullUser;
  16. $dropdown = $(dropdown);
  17. _this.projectId = $dropdown.data('project-id');
  18. _this.showCurrentUser = $dropdown.data('current-user');
  19. showNullUser = $dropdown.data('null-user');
  20. showAnyUser = $dropdown.data('any-user');
  21. firstUser = $dropdown.data('first-user');
  22. _this.authorId = $dropdown.data('author-id');
  23. selectedId = $dropdown.data('selected');
  24. defaultLabel = $dropdown.data('default-label');
  25. issueURL = $dropdown.data('issueUpdate');
  26. $selectbox = $dropdown.closest('.selectbox');
  27. $block = $selectbox.closest('.block');
  28. abilityName = $dropdown.data('ability-name');
  29. $value = $block.find('.value');
  30. $collapsedSidebar = $block.find('.sidebar-collapsed-user');
  31. $loading = $block.find('.block-loading').fadeOut();
  32. $block.on('click', '.js-assign-yourself', function(e) {
  33. e.preventDefault();
  34. return assignTo(_this.currentUser.id);
  35. });
  36. assignTo = function(selected) {
  37. var data;
  38. data = {};
  39. data[abilityName] = {};
  40. data[abilityName].assignee_id = selected != null ? selected : null;
  41. $loading.fadeIn();
  42. $dropdown.trigger('loading.gl.dropdown');
  43. return $.ajax({
  44. type: 'PUT',
  45. dataType: 'json',
  46. url: issueURL,
  47. data: data
  48. }).done(function(data) {
  49. var user;
  50. $dropdown.trigger('loaded.gl.dropdown');
  51. $loading.fadeOut();
  52. $selectbox.hide();
  53. if (data.assignee) {
  54. user = {
  55. name: data.assignee.name,
  56. username: data.assignee.username,
  57. avatar: data.assignee.avatar_url
  58. };
  59. } else {
  60. user = {
  61. name: 'Unassigned',
  62. username: '',
  63. avatar: ''
  64. };
  65. }
  66. $value.html(assigneeTemplate(user));
  67. $collapsedSidebar.attr('title', user.name).tooltip('fixTitle');
  68. return $collapsedSidebar.html(collapsedAssigneeTemplate(user));
  69. });
  70. };
  71. collapsedAssigneeTemplate = _.template('<% if( avatar ) { %> <a class="author_link" href="/u/<%- username %>"> <img width="24" class="avatar avatar-inline s24" alt="" src="<%- avatar %>"> </a> <% } else { %> <i class="fa fa-user"></i> <% } %>');
  72. assigneeTemplate = _.template('<% if (username) { %> <a class="author_link bold" href="/u/<%- username %>"> <% if( avatar ) { %> <img width="32" class="avatar avatar-inline s32" alt="" src="<%- avatar %>"> <% } %> <span class="author"><%- name %></span> <span class="username"> @<%- username %> </span> </a> <% } else { %> <span class="no-value assign-yourself"> No assignee - <a href="#" class="js-assign-yourself"> assign yourself </a> </span> <% } %>');
  73. return $dropdown.glDropdown({
  74. data: function(term, callback) {
  75. var isAuthorFilter;
  76. isAuthorFilter = $('.js-author-search');
  77. return _this.users(term, function(users) {
  78. var anyUser, index, j, len, name, obj, showDivider;
  79. if (term.length === 0) {
  80. showDivider = 0;
  81. if (firstUser) {
  82. for (index = j = 0, len = users.length; j < len; index = ++j) {
  83. obj = users[index];
  84. if (obj.username === firstUser) {
  85. users.splice(index, 1);
  86. users.unshift(obj);
  87. break;
  88. }
  89. }
  90. }
  91. if (showNullUser) {
  92. showDivider += 1;
  93. users.unshift({
  94. beforeDivider: true,
  95. name: 'Unassigned',
  96. id: 0
  97. });
  98. }
  99. if (showAnyUser) {
  100. showDivider += 1;
  101. name = showAnyUser;
  102. if (name === true) {
  103. name = 'Any User';
  104. }
  105. anyUser = {
  106. beforeDivider: true,
  107. name: name,
  108. id: null
  109. };
  110. users.unshift(anyUser);
  111. }
  112. }
  113. if (showDivider) {
  114. users.splice(showDivider, 0, "divider");
  115. }
  116. return callback(users);
  117. });
  118. },
  119. filterable: true,
  120. filterRemote: true,
  121. search: {
  122. fields: ['name', 'username']
  123. },
  124. selectable: true,
  125. fieldName: $dropdown.data('field-name'),
  126. toggleLabel: function(selected) {
  127. if (selected && 'id' in selected) {
  128. if (selected.text) {
  129. return selected.text;
  130. } else {
  131. return selected.name;
  132. }
  133. } else {
  134. return defaultLabel;
  135. }
  136. },
  137. inputId: 'issue_assignee_id',
  138. hidden: function(e) {
  139. $selectbox.hide();
  140. return $value.css('display', '');
  141. },
  142. clicked: function(user) {
  143. var isIssueIndex, isMRIndex, page, selected;
  144. page = $('body').data('page');
  145. isIssueIndex = page === 'projects:issues:index';
  146. isMRIndex = (page === page && page === 'projects:merge_requests:index');
  147. if ($dropdown.hasClass('js-filter-bulk-update')) {
  148. return;
  149. }
  150. if ($dropdown.hasClass('js-filter-submit') && (isIssueIndex || isMRIndex)) {
  151. selectedId = user.id;
  152. return Issuable.filterResults($dropdown.closest('form'));
  153. } else if ($dropdown.hasClass('js-filter-submit')) {
  154. return $dropdown.closest('form').submit();
  155. } else {
  156. selected = $dropdown.closest('.selectbox').find("input[name='" + ($dropdown.data('field-name')) + "']").val();
  157. return assignTo(selected);
  158. }
  159. },
  160. renderRow: function(user) {
  161. var avatar, img, listClosingTags, listWithName, listWithUserName, selected, username;
  162. username = user.username ? "@" + user.username : "";
  163. avatar = user.avatar_url ? user.avatar_url : false;
  164. selected = user.id === selectedId ? "is-active" : "";
  165. img = "";
  166. if (user.beforeDivider != null) {
  167. "<li> <a href='#' class='" + selected + "'> " + user.name + " </a> </li>";
  168. } else {
  169. if (avatar) {
  170. img = "<img src='" + avatar + "' class='avatar avatar-inline' width='30' />";
  171. }
  172. }
  173. listWithName = "<li> <a href='#' class='dropdown-menu-user-link " + selected + "'> " + img + " <strong class='dropdown-menu-user-full-name'> " + user.name + " </strong>";
  174. listWithUserName = "<span class='dropdown-menu-user-username'> " + username + " </span>";
  175. listClosingTags = "</a> </li>";
  176. if (username === '') {
  177. listWithUserName = '';
  178. }
  179. return listWithName + listWithUserName + listClosingTags;
  180. }
  181. });
  182. };
  183. })(this));
  184. $('.ajax-users-select').each((function(_this) {
  185. return function(i, select) {
  186. var firstUser, showAnyUser, showEmailUser, showNullUser;
  187. _this.projectId = $(select).data('project-id');
  188. _this.groupId = $(select).data('group-id');
  189. _this.showCurrentUser = $(select).data('current-user');
  190. _this.authorId = $(select).data('author-id');
  191. _this.skipUsers = $(select).data('skip-users');
  192. showNullUser = $(select).data('null-user');
  193. showAnyUser = $(select).data('any-user');
  194. showEmailUser = $(select).data('email-user');
  195. firstUser = $(select).data('first-user');
  196. return $(select).select2({
  197. placeholder: "Search for a user",
  198. multiple: $(select).hasClass('multiselect'),
  199. minimumInputLength: 0,
  200. query: function(query) {
  201. return _this.users(query.term, function(users) {
  202. var anyUser, data, emailUser, index, j, len, name, nullUser, obj, ref;
  203. data = {
  204. results: users
  205. };
  206. if (query.term.length === 0) {
  207. if (firstUser) {
  208. ref = data.results;
  209. for (index = j = 0, len = ref.length; j < len; index = ++j) {
  210. obj = ref[index];
  211. if (obj.username === firstUser) {
  212. data.results.splice(index, 1);
  213. data.results.unshift(obj);
  214. break;
  215. }
  216. }
  217. }
  218. if (showNullUser) {
  219. nullUser = {
  220. name: 'Unassigned',
  221. id: 0
  222. };
  223. data.results.unshift(nullUser);
  224. }
  225. if (showAnyUser) {
  226. name = showAnyUser;
  227. if (name === true) {
  228. name = 'Any User';
  229. }
  230. anyUser = {
  231. name: name,
  232. id: null
  233. };
  234. data.results.unshift(anyUser);
  235. }
  236. }
  237. if (showEmailUser && data.results.length === 0 && query.term.match(/^[^@]+@[^@]+$/)) {
  238. emailUser = {
  239. name: "Invite \"" + query.term + "\"",
  240. username: query.term,
  241. id: query.term
  242. };
  243. data.results.unshift(emailUser);
  244. }
  245. return query.callback(data);
  246. });
  247. },
  248. initSelection: function() {
  249. var args;
  250. args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
  251. return _this.initSelection.apply(_this, args);
  252. },
  253. formatResult: function() {
  254. var args;
  255. args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
  256. return _this.formatResult.apply(_this, args);
  257. },
  258. formatSelection: function() {
  259. var args;
  260. args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
  261. return _this.formatSelection.apply(_this, args);
  262. },
  263. dropdownCssClass: "ajax-users-dropdown",
  264. escapeMarkup: function(m) {
  265. return m;
  266. }
  267. });
  268. };
  269. })(this));
  270. }
  271. UsersSelect.prototype.initSelection = function(element, callback) {
  272. var id, nullUser;
  273. id = $(element).val();
  274. if (id === "0") {
  275. nullUser = {
  276. name: 'Unassigned'
  277. };
  278. return callback(nullUser);
  279. } else if (id !== "") {
  280. return this.user(id, callback);
  281. }
  282. };
  283. UsersSelect.prototype.formatResult = function(user) {
  284. var avatar;
  285. if (user.avatar_url) {
  286. avatar = user.avatar_url;
  287. } else {
  288. avatar = gon.default_avatar_url;
  289. }
  290. return "<div class='user-result " + (!user.username ? 'no-username' : void 0) + "'> <div class='user-image'><img class='avatar s24' src='" + avatar + "'></div> <div class='user-name'>" + user.name + "</div> <div class='user-username'>" + (user.username || "") + "</div> </div>";
  291. };
  292. UsersSelect.prototype.formatSelection = function(user) {
  293. return user.name;
  294. };
  295. UsersSelect.prototype.user = function(user_id, callback) {
  296. var url;
  297. url = this.buildUrl(this.userPath);
  298. url = url.replace(':id', user_id);
  299. return $.ajax({
  300. url: url,
  301. dataType: "json"
  302. }).done(function(user) {
  303. return callback(user);
  304. });
  305. };
  306. UsersSelect.prototype.users = function(query, callback) {
  307. var url;
  308. url = this.buildUrl(this.usersPath);
  309. return $.ajax({
  310. url: url,
  311. data: {
  312. search: query,
  313. per_page: 20,
  314. active: true,
  315. project_id: this.projectId,
  316. group_id: this.groupId,
  317. current_user: this.showCurrentUser,
  318. author_id: this.authorId,
  319. skip_users: this.skipUsers
  320. },
  321. dataType: "json"
  322. }).done(function(users) {
  323. return callback(users);
  324. });
  325. };
  326. UsersSelect.prototype.buildUrl = function(url) {
  327. if (gon.relative_url_root != null) {
  328. url = gon.relative_url_root.replace(/\/$/, '') + url;
  329. }
  330. return url;
  331. };
  332. return UsersSelect;
  333. })();
  334. }).call(this);