PageRenderTime 43ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/admin/javascript/MemberTableField.js

http://github.com/silverstripe/sapphire
JavaScript | 347 lines | 199 code | 35 blank | 113 comment | 30 complexity | 270ec067fdc41ab86f58983f248862f4 MD5 | raw file
Possible License(s): BSD-3-Clause, MIT, CC-BY-3.0, GPL-2.0, AGPL-1.0, LGPL-2.1
  1. /**
  2. * File: MemberTableField.js
  3. */
  4. (function($) {
  5. $.entwine('ss', function($){
  6. /**
  7. * Class: #Permissions .checkbox[value=ADMIN]
  8. *
  9. * Automatically check and disable all checkboxes if ADMIN permissions are selected.
  10. * As they're disabled, any changes won't be submitted (which is intended behaviour),
  11. * checking all boxes is purely presentational.
  12. */
  13. $('#Permissions .checkbox[value=ADMIN]').entwine({
  14. onmatch: function() {
  15. this.toggleCheckboxes();
  16. this._super();
  17. },
  18. /**
  19. * Function: onclick
  20. */
  21. onclick: function(e) {
  22. this.toggleCheckboxes();
  23. },
  24. /**
  25. * Function: toggleCheckboxes
  26. */
  27. toggleCheckboxes: function() {
  28. var self = this, checkboxes = this.parents('.field:eq(0)').find('.checkbox').not(this);
  29. if(this.is(':checked')) {
  30. checkboxes.each(function() {
  31. $(this).data('SecurityAdmin.oldChecked', $(this).attr('checked'));
  32. $(this).data('SecurityAdmin.oldDisabled', $(this).attr('disabled'));
  33. $(this).attr('disabled', 'disabled');
  34. $(this).attr('checked', 'checked');
  35. });
  36. } else {
  37. checkboxes.each(function() {
  38. $(this).attr('checked', $(this).data('SecurityAdmin.oldChecked'));
  39. $(this).attr('disabled', $(this).data('SecurityAdmin.oldDisabled'));
  40. });
  41. }
  42. }
  43. });
  44. });
  45. }(jQuery));
  46. /**
  47. * Modified 2006-10-05, Ingo Schommer
  48. * This is more or less a copy of Member.js, with additions and changes
  49. * to match the switch from Member.php to MemberTableField.php all over the UI.
  50. * Eventually it will replace Member.js (please remove this message then).
  51. */
  52. // no confirm message for removal from a group
  53. if(typeof(ComplexTableField) != 'undefined') {
  54. ComplexTableField.prototype.deleteConfirmMessage = null;
  55. }
  56. /**
  57. * Class: AjaxMemberLookup
  58. *
  59. * Auto-lookup on ajax fields
  60. */
  61. AjaxMemberLookup = {
  62. initialise : function() {
  63. var div = document.createElement('div');
  64. div.id = this.id + '_ac';
  65. div.className = 'autocomplete';
  66. this.parentNode.appendChild(div);
  67. if(this.id) {
  68. new Ajax.Autocompleter(this.id, div.id, 'admin/security/autocomplete/' + this.name, {
  69. afterUpdateElement : this.afterAutocomplete.bind(this)
  70. });
  71. }
  72. },
  73. afterAutocomplete : function(field, selectedItem) {
  74. var items = jQuery(selectedItem).data('fields'), form = jQuery(selectedItem).parents('form:first');
  75. for(name in items) {
  76. jQuery(form).find('input[name='+name+']').val(items[name]);
  77. }
  78. }
  79. }
  80. /**
  81. * Class: MemberTableField
  82. */
  83. MemberTableField = Class.create();
  84. MemberTableField.applyTo('.cms-edit-form div.MemberTableField');
  85. MemberTableField.prototype = {
  86. initialize: function() {
  87. Behaviour.register({
  88. '.cms-edit-form div.MemberFilter input' : {
  89. onkeypress : this.prepareSearch.bind(this)
  90. },
  91. '.cms-edit-form div.MemberTableField table.data tr.addtogrouprow input' : {
  92. onkeypress : this.prepareAddToGroup.bind(this)
  93. },
  94. '.cms-edit-form div.MemberTableField table.data tr.addtogrouprow #Form_AddRecordForm_action_addtogroup' : {
  95. onclick : this.prepareAddToGroup.bind(this)
  96. },
  97. '.cms-edit-form div.MemberTableField table.data tr.addtogrouprow td.actions input' : {
  98. initialise: function() {
  99. data = this.parentNode.parentNode.getElementsByTagName('input');
  100. var i,item,error = [];
  101. for(i=0;item=data[i];i++) {
  102. item.originalSerialized = Form.Element.serialize(item);
  103. }
  104. },
  105. onclick : this.addToGroup.bind(this)
  106. },
  107. //'.cms-edit-form div.MemberTableField input' : AjaxMemberLookup,
  108. '.cms-edit-form' : {
  109. changeDetection_fieldsToIgnore : {
  110. 'ctf[start]' : true,
  111. 'ctf[ID]' : true,
  112. 'MemberOrderByField' : true,
  113. 'MemberOrderByOrder' : true,
  114. 'MemberGroup' : true,
  115. 'MemberFilterButton' : true,
  116. 'MemberFieldName' : true,
  117. 'MemberDontShowPassword' : true,
  118. 'MemberSearch' : true
  119. }
  120. }
  121. });
  122. },
  123. // prevent submission of wrong form-button (MemberFilterButton)
  124. prepareAddToGroup: function(e) {
  125. // IE6 doesnt send an event-object with onkeypress
  126. var event = (e) ? e : window.event;
  127. var keyCode = (event.keyCode) ? event.keyCode : event.which;
  128. if(keyCode == Event.KEY_RETURN) {
  129. var el = Event.element(event);
  130. this.addToGroup(event);
  131. Event.stop(event);
  132. return false;
  133. }
  134. },
  135. // prevent submission of wrong form-button (MemberFilterButton)
  136. prepareSearch: function(e) {
  137. // IE6 doesnt send an event-object with onkeypress
  138. var event = (e) ? e : window.event;
  139. var keyCode = (event.keyCode) ? event.keyCode : event.which;
  140. if(keyCode == Event.KEY_RETURN) {
  141. var el = Event.element(event);
  142. $('MemberFilterButton').onclick(event);
  143. Event.stop(event);
  144. return false;
  145. }
  146. },
  147. addToGroup: function(e) {
  148. // only submit parts of the form
  149. var data = this.parentNode.parentNode.getElementsByTagName('input');
  150. var i,item,error = [];
  151. var form = Event.findElement(e,"form");
  152. for(i=0;item=data[i];i++) {
  153. if(item.name == 'Email' && !item.value) error[error.length] = "Email";
  154. if(item.name == 'Password' && !item.value) error[error.length] = "Password";
  155. }
  156. if(error.length > 0) {
  157. alert('Please enter a ' + error.join(' and a ') + ' to add a member.');
  158. } else {
  159. updateURL = "";
  160. updateURL += Event.findElement(e,"form").action;
  161. // we can't set "fieldName" as a HiddenField because there might be multiple ComplexTableFields in a single EditForm-container
  162. updateURL += "?fieldName="+$('MemberFieldName').value;
  163. updateURL += "&action_callfieldmethod&methodName=addtogroup";
  164. ajaxSubmitFieldSet(updateURL, data);
  165. }
  166. return false;
  167. }
  168. /*
  169. initialise : function() {
  170. this.headerMap = [];
  171. var i, item, headers = this.getElementsByTagName('thead')[0].getElementsByTagName('tr')[0].getElementsByTagName('td');
  172. for(i=0;item=headers[i];i++) {
  173. this.headerMap[i] = item.className;
  174. }
  175. },
  176. setRecordDetails : function(id, details, groupID) {
  177. var row = document.getElementById('member-' + id);
  178. if(row) {
  179. var i, item, cells = row.getElementsByTagName('td');
  180. for(i=0;item=cells[i];i++) {
  181. if(details[this.headerMap[i]]) {
  182. item.innerHTML = details[this.headerMap[i]];
  183. }
  184. }
  185. } else {
  186. this.createRecord(id, details, groupID);
  187. }
  188. },
  189. createRecord : function (id, details, groupId) {
  190. var row = document.createElement('tr');
  191. row.id = 'member-' + id;
  192. var i, cell, cellField;
  193. for(i=0;cellField=this.headerMap[i];i++) {
  194. cell = document.createElement('td')
  195. if(details[cellField]) {
  196. cell.innerHTML = details[cellField];
  197. }
  198. row.appendChild(cell);
  199. }
  200. // Add the delete icon
  201. if(typeof groupId == 'undefined')
  202. var groupId = $('Form_EditForm').elements.ID.value;
  203. cell = document.createElement('td')
  204. cell.innerHTML = '<a class="deletelink" href="admin/security/removememberfromgroup/' + groupId + '/' + id + '"><img src="sapphire/images/delete.gif" alt="delete" /></a>';
  205. cell.getElementsByTagName('0');
  206. row.appendChild(cell);
  207. var tbody = this.getElementsByTagName('tbody')[0];
  208. var addRow = document.getElementsByClassName('addrow',tbody)[0];
  209. if(addRow) tbody.insertBefore(row, addRow);
  210. else tbody.appendChild(row);
  211. Behaviour.apply(row, true);
  212. },
  213. clearAddForm : function() {
  214. var tbody = this.getElementsByTagName('tbody')[0];
  215. var addRow = document.getElementsByClassName('addrow',tbody)[0];
  216. if(addRow) {
  217. var i,field,fields = addRow.getElementsByTagName('input');
  218. for(i=0;field=fields[i];i++) {
  219. if(field.type != 'hidden' && field.type != 'submit') field.value = '';
  220. }
  221. }
  222. },
  223. removeMember : function(memberID) {
  224. var record;
  225. if(record = $('member-' + memberID)) {
  226. record.parentNode.removeChild(record);
  227. }
  228. }
  229. */
  230. }
  231. /**
  232. * Class: MemberFilterButton
  233. */
  234. MemberFilterButton = Class.create();
  235. MemberFilterButton.applyTo('#MemberFilterButton');
  236. MemberFilterButton.prototype = {
  237. initialize: function() {
  238. this.inputFields = new Array();
  239. var childNodes = this.parentNode.parentNode.getElementsByTagName('input');
  240. for( var index = 0; index < childNodes.length; index++ ) {
  241. if( childNodes[index].tagName ) {
  242. childNodes[index].resetChanged = function() { return false; }
  243. childNodes[index].isChanged = function() { return false; }
  244. this.inputFields.push( childNodes[index] );
  245. }
  246. }
  247. childNodes = this.parentNode.getElementsByTagName('select');
  248. for( var index = 0; index < childNodes.length; index++ ) {
  249. if( childNodes[index].tagName ) {
  250. childNodes[index].resetChanged = function() { return false; }
  251. childNodes[index].field_changed = function() { return false; }
  252. this.inputFields.push( childNodes[index] );
  253. }
  254. }
  255. },
  256. isChanged: function() {
  257. return false;
  258. },
  259. onclick: function(e) {
  260. if(!$('ctf-ID') || !$('MemberFieldName')) {
  261. return false;
  262. }
  263. try {
  264. var form = Event.findElement(e,"form");
  265. var fieldName = $('MemberFieldName').value;
  266. var fieldID = form.id + '_' + fieldName;
  267. var updateURL = form.action + '/field/' + fieldName + '?ajax=1';
  268. for( var index = 0; index < this.inputFields.length; index++ ) {
  269. if( this.inputFields[index].tagName ) {
  270. updateURL += '&' + this.inputFields[index].name + '=' + encodeURIComponent( this.inputFields[index].value );
  271. }
  272. }
  273. jQuery($(fieldID)).get(updateURL, null, function() {Behaviour.apply($(fieldID), true);});
  274. } catch(er) {
  275. errorMessage('Error searching');
  276. }
  277. return false;
  278. }
  279. }
  280. // has to be external from initialize() because otherwise request will double on each reload - WTF
  281. Behaviour.register({
  282. '.cms-edit-form div.MemberTableField table.data input.text' : AjaxMemberLookup
  283. });
  284. /**
  285. * Post the given fields to the given url
  286. */
  287. function ajaxSubmitFieldSet(href, fieldSet, extraData) {
  288. // Build data
  289. var i,field,data = "ajax=1";
  290. for(i=0;field=fieldSet[i];i++) {
  291. data += '&' + Form.Element.serialize(field);
  292. }
  293. if(extraData){
  294. data += '&'+extraData;
  295. }
  296. // Send request
  297. jQuery.ajax({
  298. 'url': href,
  299. 'method' : 'post',
  300. 'data' : data,
  301. 'success' : function(response) {
  302. eval(response);
  303. },
  304. 'error' : function(response) {
  305. alert(response.responseText);
  306. }
  307. });
  308. }