/admin/javascript/MemberTableField.js
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
- /**
- * File: MemberTableField.js
- */
- (function($) {
- $.entwine('ss', function($){
- /**
- * Class: #Permissions .checkbox[value=ADMIN]
- *
- * Automatically check and disable all checkboxes if ADMIN permissions are selected.
- * As they're disabled, any changes won't be submitted (which is intended behaviour),
- * checking all boxes is purely presentational.
- */
- $('#Permissions .checkbox[value=ADMIN]').entwine({
- onmatch: function() {
- this.toggleCheckboxes();
- this._super();
- },
- /**
- * Function: onclick
- */
- onclick: function(e) {
- this.toggleCheckboxes();
- },
- /**
- * Function: toggleCheckboxes
- */
- toggleCheckboxes: function() {
- var self = this, checkboxes = this.parents('.field:eq(0)').find('.checkbox').not(this);
-
- if(this.is(':checked')) {
- checkboxes.each(function() {
- $(this).data('SecurityAdmin.oldChecked', $(this).attr('checked'));
- $(this).data('SecurityAdmin.oldDisabled', $(this).attr('disabled'));
- $(this).attr('disabled', 'disabled');
- $(this).attr('checked', 'checked');
- });
- } else {
- checkboxes.each(function() {
- $(this).attr('checked', $(this).data('SecurityAdmin.oldChecked'));
- $(this).attr('disabled', $(this).data('SecurityAdmin.oldDisabled'));
- });
- }
- }
- });
- });
- }(jQuery));
- /**
- * Modified 2006-10-05, Ingo Schommer
- * This is more or less a copy of Member.js, with additions and changes
- * to match the switch from Member.php to MemberTableField.php all over the UI.
- * Eventually it will replace Member.js (please remove this message then).
- */
-
- // no confirm message for removal from a group
- if(typeof(ComplexTableField) != 'undefined') {
- ComplexTableField.prototype.deleteConfirmMessage = null;
- }
- /**
- * Class: AjaxMemberLookup
- *
- * Auto-lookup on ajax fields
- */
- AjaxMemberLookup = {
- initialise : function() {
- var div = document.createElement('div');
- div.id = this.id + '_ac';
- div.className = 'autocomplete';
- this.parentNode.appendChild(div);
- if(this.id) {
- new Ajax.Autocompleter(this.id, div.id, 'admin/security/autocomplete/' + this.name, {
- afterUpdateElement : this.afterAutocomplete.bind(this)
- });
-
- }
- },
- afterAutocomplete : function(field, selectedItem) {
- var items = jQuery(selectedItem).data('fields'), form = jQuery(selectedItem).parents('form:first');
- for(name in items) {
- jQuery(form).find('input[name='+name+']').val(items[name]);
- }
- }
- }
- /**
- * Class: MemberTableField
- */
- MemberTableField = Class.create();
- MemberTableField.applyTo('.cms-edit-form div.MemberTableField');
- MemberTableField.prototype = {
-
- initialize: function() {
- Behaviour.register({
- '.cms-edit-form div.MemberFilter input' : {
- onkeypress : this.prepareSearch.bind(this)
- },
- '.cms-edit-form div.MemberTableField table.data tr.addtogrouprow input' : {
- onkeypress : this.prepareAddToGroup.bind(this)
- },
- '.cms-edit-form div.MemberTableField table.data tr.addtogrouprow #Form_AddRecordForm_action_addtogroup' : {
- onclick : this.prepareAddToGroup.bind(this)
- },
- '.cms-edit-form div.MemberTableField table.data tr.addtogrouprow td.actions input' : {
- initialise: function() {
- data = this.parentNode.parentNode.getElementsByTagName('input');
- var i,item,error = [];
- for(i=0;item=data[i];i++) {
- item.originalSerialized = Form.Element.serialize(item);
- }
- },
- onclick : this.addToGroup.bind(this)
- },
-
- //'.cms-edit-form div.MemberTableField input' : AjaxMemberLookup,
-
- '.cms-edit-form' : {
- changeDetection_fieldsToIgnore : {
- 'ctf[start]' : true,
- 'ctf[ID]' : true,
- 'MemberOrderByField' : true,
- 'MemberOrderByOrder' : true,
- 'MemberGroup' : true,
- 'MemberFilterButton' : true,
- 'MemberFieldName' : true,
- 'MemberDontShowPassword' : true,
- 'MemberSearch' : true
- }
- }
- });
- },
-
- // prevent submission of wrong form-button (MemberFilterButton)
- prepareAddToGroup: function(e) {
- // IE6 doesnt send an event-object with onkeypress
- var event = (e) ? e : window.event;
- var keyCode = (event.keyCode) ? event.keyCode : event.which;
- if(keyCode == Event.KEY_RETURN) {
- var el = Event.element(event);
- this.addToGroup(event);
- Event.stop(event);
- return false;
- }
- },
- // prevent submission of wrong form-button (MemberFilterButton)
- prepareSearch: function(e) {
- // IE6 doesnt send an event-object with onkeypress
- var event = (e) ? e : window.event;
- var keyCode = (event.keyCode) ? event.keyCode : event.which;
-
- if(keyCode == Event.KEY_RETURN) {
- var el = Event.element(event);
- $('MemberFilterButton').onclick(event);
- Event.stop(event);
- return false;
- }
- },
-
- addToGroup: function(e) {
- // only submit parts of the form
- var data = this.parentNode.parentNode.getElementsByTagName('input');
- var i,item,error = [];
- var form = Event.findElement(e,"form");
-
- for(i=0;item=data[i];i++) {
- if(item.name == 'Email' && !item.value) error[error.length] = "Email";
- if(item.name == 'Password' && !item.value) error[error.length] = "Password";
- }
-
- if(error.length > 0) {
- alert('Please enter a ' + error.join(' and a ') + ' to add a member.');
- } else {
- updateURL = "";
- updateURL += Event.findElement(e,"form").action;
- // we can't set "fieldName" as a HiddenField because there might be multiple ComplexTableFields in a single EditForm-container
- updateURL += "?fieldName="+$('MemberFieldName').value;
- updateURL += "&action_callfieldmethod&methodName=addtogroup";
- ajaxSubmitFieldSet(updateURL, data);
- }
-
- return false;
- }
-
- /*
- initialise : function() {
- this.headerMap = [];
-
- var i, item, headers = this.getElementsByTagName('thead')[0].getElementsByTagName('tr')[0].getElementsByTagName('td');
- for(i=0;item=headers[i];i++) {
- this.headerMap[i] = item.className;
- }
- },
-
- setRecordDetails : function(id, details, groupID) {
- var row = document.getElementById('member-' + id);
- if(row) {
- var i, item, cells = row.getElementsByTagName('td');
- for(i=0;item=cells[i];i++) {
- if(details[this.headerMap[i]]) {
- item.innerHTML = details[this.headerMap[i]];
- }
- }
- } else {
- this.createRecord(id, details, groupID);
- }
- },
- createRecord : function (id, details, groupId) {
- var row = document.createElement('tr');
- row.id = 'member-' + id;
- var i, cell, cellField;
- for(i=0;cellField=this.headerMap[i];i++) {
- cell = document.createElement('td')
- if(details[cellField]) {
- cell.innerHTML = details[cellField];
- }
- row.appendChild(cell);
- }
-
- // Add the delete icon
- if(typeof groupId == 'undefined')
- var groupId = $('Form_EditForm').elements.ID.value;
- cell = document.createElement('td')
- cell.innerHTML = '<a class="deletelink" href="admin/security/removememberfromgroup/' + groupId + '/' + id + '"><img src="sapphire/images/delete.gif" alt="delete" /></a>';
- cell.getElementsByTagName('0');
- row.appendChild(cell);
-
- var tbody = this.getElementsByTagName('tbody')[0];
- var addRow = document.getElementsByClassName('addrow',tbody)[0];
- if(addRow) tbody.insertBefore(row, addRow);
- else tbody.appendChild(row);
- Behaviour.apply(row, true);
- },
- clearAddForm : function() {
- var tbody = this.getElementsByTagName('tbody')[0];
- var addRow = document.getElementsByClassName('addrow',tbody)[0];
- if(addRow) {
- var i,field,fields = addRow.getElementsByTagName('input');
- for(i=0;field=fields[i];i++) {
- if(field.type != 'hidden' && field.type != 'submit') field.value = '';
- }
- }
- },
- removeMember : function(memberID) {
- var record;
- if(record = $('member-' + memberID)) {
- record.parentNode.removeChild(record);
- }
- }
- */
- }
- /**
- * Class: MemberFilterButton
- */
- MemberFilterButton = Class.create();
- MemberFilterButton.applyTo('#MemberFilterButton');
- MemberFilterButton.prototype = {
- initialize: function() {
- this.inputFields = new Array();
-
- var childNodes = this.parentNode.parentNode.getElementsByTagName('input');
-
- for( var index = 0; index < childNodes.length; index++ ) {
- if( childNodes[index].tagName ) {
- childNodes[index].resetChanged = function() { return false; }
- childNodes[index].isChanged = function() { return false; }
- this.inputFields.push( childNodes[index] );
- }
- }
-
- childNodes = this.parentNode.getElementsByTagName('select');
-
- for( var index = 0; index < childNodes.length; index++ ) {
- if( childNodes[index].tagName ) {
- childNodes[index].resetChanged = function() { return false; }
- childNodes[index].field_changed = function() { return false; }
- this.inputFields.push( childNodes[index] );
- }
- }
- },
-
- isChanged: function() {
- return false;
- },
-
- onclick: function(e) {
- if(!$('ctf-ID') || !$('MemberFieldName')) {
- return false;
- }
- try {
- var form = Event.findElement(e,"form");
- var fieldName = $('MemberFieldName').value;
- var fieldID = form.id + '_' + fieldName;
-
- var updateURL = form.action + '/field/' + fieldName + '?ajax=1';
- for( var index = 0; index < this.inputFields.length; index++ ) {
- if( this.inputFields[index].tagName ) {
- updateURL += '&' + this.inputFields[index].name + '=' + encodeURIComponent( this.inputFields[index].value );
- }
- }
- jQuery($(fieldID)).get(updateURL, null, function() {Behaviour.apply($(fieldID), true);});
- } catch(er) {
- errorMessage('Error searching');
- }
- return false;
- }
- }
- // has to be external from initialize() because otherwise request will double on each reload - WTF
- Behaviour.register({
- '.cms-edit-form div.MemberTableField table.data input.text' : AjaxMemberLookup
- });
- /**
- * Post the given fields to the given url
- */
- function ajaxSubmitFieldSet(href, fieldSet, extraData) {
- // Build data
- var i,field,data = "ajax=1";
- for(i=0;field=fieldSet[i];i++) {
- data += '&' + Form.Element.serialize(field);
- }
- if(extraData){
- data += '&'+extraData;
- }
- // Send request
- jQuery.ajax({
- 'url': href,
- 'method' : 'post',
- 'data' : data,
- 'success' : function(response) {
- eval(response);
- },
- 'error' : function(response) {
- alert(response.responseText);
- }
- });
- }