From 1c04f5bf57a9efec8751fb04e6515befb1de86cc Mon Sep 17 00:00:00 2001 From: Gautam Gupta Date: Fri, 30 Dec 2011 16:14:47 +0000 Subject: [PATCH] Implement jqGrid for CPDB Attributes. GCI task #7232226. git-svn-id: file:///Users/Shitiz/Downloads/lssvn/source/limesurvey_yii@11810 b72ed6b6-b9f8-46b5-92b4-906544132732 --- .../controllers/admin/participantsaction.php | 169 +++++++++++------- .../models/ParticipantAttributeNames.php | 53 ++++-- .../participants/attributeControl_view.php | 114 ++---------- scripts/admin/attributeControl.js | 91 +++++++--- 4 files changed, 229 insertions(+), 198 deletions(-) diff --git a/application/controllers/admin/participantsaction.php b/application/controllers/admin/participantsaction.php index bb23f44882e..a7896e476f5 100644 --- a/application/controllers/admin/participantsaction.php +++ b/application/controllers/admin/participantsaction.php @@ -29,6 +29,29 @@ function run($sa = '') } } + /** + * Loads jqGrid for the view + * @param string $sScript Subaction + */ + private function _loadjqGrid($sScript = '', $aData = array()) + { + $this->getController()->_css_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jqGrid/css/ui.jqgrid.css'); + $this->getController()->_css_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jqGrid/css/jquery.ui.datepicker.css'); + $this->getController()->_js_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jquery.js'); + $this->getController()->_js_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jquery-ui.js'); + $this->getController()->_js_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jqGrid/js/i18n/grid.locale-en.js'); + $this->getController()->_js_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jqGrid/js/jquery.jqGrid.min.js'); + $this->getController()->_js_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jqGrid/plugins/jquery.searchFilter.js'); + $this->getController()->_js_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jqGrid/src/grid.celledit.js'); + $this->getController()->_js_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jqGrid/js/i18n/grid.locale-en.js'); + + if (!empty($sScript)) + { + $this->getController()->_js_admin_includes(Yii::app()->getConfig('adminscripts') . $sScript . '.js'); + $this->_renderWrappedTemplate(array('participantsPanel', $sScript), $aData); + } + } + /** * Renders template(s) wrapped in header and footer * @@ -135,20 +158,6 @@ function blacklistControl() $this->_renderWrappedTemplate('participantsPanel'); } - /** - * Loads the view 'attributeControl' - */ - function attributeControl() - { - $aData = array( - 'result' => ParticipantAttributeNames::getAttributes() - ); - - $this->getController()->_css_admin_includes(Yii::app()->getConfig('styleurl') . 'admin/default/participants.css'); - - $this->_renderWrappedTemplate(array('participantsPanel', 'attributeControl'), $aData); - } - /** * Loads the view 'userControl' */ @@ -166,16 +175,7 @@ function userControl() */ function sharePanel() { - $this->getController()->_js_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jqGrid/js/i18n/grid.locale-en.js'); - $this->getController()->_js_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jqGrid/js/jquery.jqGrid.min.js'); - $this->getController()->_js_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jqGrid/plugins/jquery.searchFilter.js'); - $this->getController()->_js_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jqGrid/src/grid.celledit.js'); - $this->getController()->_js_admin_includes(Yii::app()->getConfig('adminscripts') . 'sharePanel.js'); - $this->getController()->_js_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jqGrid/js/i18n/grid.locale-en.js'); - $this->getController()->_css_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jqGrid/css/ui.jqgrid.css'); - $this->getController()->_css_admin_includes(Yii::app()->getConfig('generalscripts') . 'jquery/jqGrid/css/jquery.ui.datepicker.css'); - - $this->_renderWrappedTemplate(array('participantsPanel', 'sharePanel')); + $this->_loadjqGrid('sharePanel'); } /** @@ -250,6 +250,86 @@ function editShareInfo() } } + /** + * Loads the view 'attributeControl' + */ + function attributeControl() + { + $this->_loadjqGrid('attributeControl'); + } + + /** + * Sends the attributes info using JSON encoding + * Called after the attribute control grid is loaded + * @return JSON encoded string containg sharing information + */ + function getAttributeInfo_json() + { + $clang = Yii::app()->lang; + $page = CHttpRequest::getPost('page'); + $limit = CHttpRequest::getPost('rows'); + $records = ParticipantAttributeNames::getAttributes(); + + $attribute_types = array( + 'DD' => $clang->gT("Drop-down list"), + 'DP' => $clang->gT("Date"), + 'TB' => $clang->gT("Text Box") + ); + + $aData->page = $page; + $aData->records = count($records); + $aData->total = ceil(ParticipantAttributeNames::getAttributes(true) / $limit); + + $i = 0; + foreach ($records as $row) + { + $aData->rows[$i]['id'] = $row['attribute_id']; + $aData->rows[$i]['cell'] = array('', $row['attribute_name'], $attribute_types[$row['attribute_type']], $row['visible']); + $i++; + } + + echo ls_json_encode($aData); + } + + /** + * Takes the edit call from the share panel, which either edits or deletes the share information + * Basically takes the call on can_edit + */ + function editAttributeInfo() + { + $operation = CHttpRequest::getPost('oper'); + if ($operation == 'del' && CHttpRequest::getPost('id')) + { + $aAttributeIds = (array) explode(',', CHttpRequest::getPost('id')); + $aAttributeIds = array_map('trim', $aAttributeIds); + $aAttributeIds = array_map('intval', $aAttributeIds); + + foreach ($aAttributeIds as $iAttributeId) + { + ParticipantAttributeNames::delAttribute($iAttributeId); + } + } + elseif ($operation == 'add' && CHttpRequest::getPost('attribute_name')) + { + $aData = array( + 'attribute_name' => CHttpRequest::getPost('attribute_name'), + 'attribute_type' => CHttpRequest::getPost('attribute_type'), + 'visible' => CHttpRequest::getPost('visible') == 'TRUE' ? 'TRUE' : 'FALSE' + ); + echo ParticipantAttributeNames::storeAttribute($aData); + } + elseif ($operation == 'edit' && CHttpRequest::getPost('id')) + { + $aData = array( + 'attribute_id' => CHttpRequest::getPost('id'), + 'attribute_name' => CHttpRequest::getPost('attribute_name'), + 'attribute_type' => CHttpRequest::getPost('attribute_type'), + 'visible' => CHttpRequest::getPost('visible') == 'TRUE' ? 'TRUE' : 'FALSE' + ); + ParticipantAttributeNames::saveAttribute($aData); + } + } + /** * Takes the delete call from the display participants and take appropriate action depending on the condition */ @@ -891,7 +971,6 @@ function getParticipants_json() if (Yii::app()->session['USER_RIGHT_SUPERADMIN']) { $records = Participants::getParticipants($page, $limit); - $aData = new Object(); $aData->page = $page; $aData->records = Participants::model()->count(); $aData->total = ceil($aData->records / $limit); @@ -959,7 +1038,6 @@ function subval_sort($a, $subkey, $order) { $iUserID = Yii::app()->session['loginID']; $records = Participants::getParticipantsOwner($iUserID); - $aData = new Object(); $aData->page = $page; $aData->records = count($records); $aData->total = ceil($aData->records / $limit); @@ -1217,16 +1295,6 @@ function saveAttribute() CController::redirect(Yii::app()->createUrl('admin/participants/sa/attributeControl')); } - /* - * Responsible for deleting the additional attribute. - */ - function delAttribute() - { - $iAttributeId = CHttpRequest::getQuery('aid'); - ParticipantAttributeNames::delAttribute($iAttributeId); - CController::redirect(Yii::app()->createUrl('/admin/participants/sa/attributeControl')); - } - /* * Responsible for deleting the additional attribute values in case of drop down. */ @@ -1238,30 +1306,6 @@ function delAttributeValues() CController::redirect(Yii::app()->createUrl('/admin/participants/sa/viewAttribute/aid/' . $iAttributeId)); } - /* - * Responsible for deleting the storing the additional attributes - */ - function storeAttributes() - { - $i = 1; - do - { - $attname = 'attribute_name_' . $i; - $atttype = 'attribute_type_' . $i; - $visible = 'visible_' . $i; - if (!empty($_POST[$attname])) - { - $aData = array('attribute_name' => CHttpRequest::getPost($attname), - 'attribute_type' => CHttpRequest::getPost($atttype), - 'visible' => CHttpRequest::getPost($visible)); - ParticipantAttributeNames::storeAttribute($aData); - } - $i++; - } while (isset($_POST[$attname])); - - CController::redirect('attributeControl'); - } - /* * Responsible for editing the additional attributes values */ @@ -1830,11 +1874,6 @@ function blacklistParticipant() } } - function saveVisible() - { - ParticipantAttributeNames::saveAttributeVisible(CHttpRequest::getPost('attid'), CHttpRequest::getPost('visiblevalue')); - } - } ?> diff --git a/application/models/ParticipantAttributeNames.php b/application/models/ParticipantAttributeNames.php index 6c846d4932c..2748a55ca99 100644 --- a/application/models/ParticipantAttributeNames.php +++ b/application/models/ParticipantAttributeNames.php @@ -135,9 +135,17 @@ function getAttributeValue($participantid,$attributeid) return $data; } - function getAttributes() + function getAttributes($count = false, $limit = -1, $offset = -1) { - return Yii::app()->db->createCommand()->select('{{participant_attribute_names}}.*,{{participant_attribute_names_lang}}.*')->from('{{participant_attribute_names}}')->join('{{participant_attribute_names_lang}}', '{{participant_attribute_names}}.attribute_id = {{participant_attribute_names_lang}}.attribute_id')->where('lang = "'.Yii::app()->session['adminlang'].'"')->queryAll(); + $command = Yii::app()->db->createCommand()->from('{{participant_attribute_names}}')->join('{{participant_attribute_names_lang}}', '{{participant_attribute_names}}.attribute_id = {{participant_attribute_names_lang}}.attribute_id')->where('lang = "'.Yii::app()->session['adminlang'].'"')->limit($limit, $offset); + if (empty($count)) + { + return $command->select('{{participant_attribute_names}}.*,{{participant_attribute_names_lang}}.*')->queryAll(); + } + else + { + return array_shift($command->select('count(*)')->queryColumn()); + } } function getAttributesValues($attribute_id) @@ -162,11 +170,14 @@ function storeAttribute($data) $insertnames = array('attribute_type' => $data['attribute_type'], 'visible' => $data['visible']); Yii::app()->db->createCommand()->insert('{{participant_attribute_names}}',$insertnames); - $insertnameslang = array('attribute_id' => Yii::app()->db->getLastInsertID(), + $attribute_id = Yii::app()->db->getLastInsertID(); + $insertnameslang = array('attribute_id' => $attribute_id, 'attribute_name'=>$data['attribute_name'], 'lang' => Yii::app()->session['adminlang']); Yii::app()->db->createCommand()->insert('{{participant_attribute_names_lang}}',$insertnameslang); + return $attribute_id; + } function editParticipantAttributeValue($data) @@ -208,7 +219,29 @@ function getAttribute($attribute_id) function saveAttribute($data) { - Yii::app()->db->createCommand()->update('{{participant_attribute_names}}',$data,'attribute_id = '.$data['attribute_id']); + if (empty($data['attribute_id'])) + { + return; + } + + $insertnames = array(); + if (!empty($data['attribute_type'])) + { + $insertnames['attribute_type'] = $data['attribute_type']; + } + if (!empty($data['visible'])) + { + $insertnames['visible'] = $data['visible']; + } + if (!empty($insertnames)) + { + Yii::app()->db->createCommand()->update('{{participant_attribute_names}}', $insertnames, 'attribute_id = '.$data['attribute_id']); + } + + if (!empty($data['attribute_name'])) + { + Yii::app()->db->createCommand()->update('{{participant_attribute_names_lang}}', array('attribute_name' => $data['attribute_name']), 'attribute_id = '.$data['attribute_id'].' AND lang="'.Yii::app()->session['adminlang'].'"'); + } } function saveAttributeLanguages($data) @@ -239,7 +272,7 @@ function storeAttributeCSV($data) $insertnames = array('attribute_type' => '\''.$data['attribute_type'], 'visible' => $data['visible']); Yii::app()->db->createCommand()->insert('{{participant_attribute_names}}', $insertnames); - + $insertid = Yii::app()->db->getLastInsertID(); $insertnameslang = array('attribute_id' => $insertid, 'attribute_name'=>$data['attribute_name'], @@ -247,7 +280,7 @@ function storeAttributeCSV($data) Yii::app()->db->createCommand()->insert('{{participant_attribute_names_lang}}', $insertnameslang); return $insertid; } - + //updates the attribute values in participant_attribute_values function saveAttributeValue($data) { @@ -263,16 +296,16 @@ function saveAttributeVisible($attid,$visiblecondition) { $data=array('visible'=>'FALSE'); } - Yii::app()->db->createCommand()->update('{{participant_attribute_names}}',$data,'attribute_id = '.$attribute_id[1]); + Yii::app()->db->createCommand()->update('{{participant_attribute_names}}',$data,'attribute_id = '.$attribute_id[1]); } - + function getAttributeID() { $query = Yii::app()->db->createCommand()->select('attribute_id')->from('{{participant_attribute_names}}')->order('attribute_id','desc')->queryAll(); return $query; } - - + + function saveParticipantAttributeValue($data) { Yii::app()->db->createCommand()->insert('{{participant_attribute_names}}', $data); diff --git a/application/views/admin/participants/attributeControl_view.php b/application/views/admin/participants/attributeControl_view.php index e656a244fe7..7e03a2f7f00 100644 --- a/application/views/admin/participants/attributeControl_view.php +++ b/application/views/admin/participants/attributeControl_view.php @@ -1,100 +1,20 @@ - - - -
- - eT("Attribute control"); ?> - -
- 'form44'); -echo CHtml::beginForm('storeAttributes', 'post', $attribute); -?> -

- + +
eT("Attribute control"); ?>
+
-

- + + + +
 
+ +
+ +
\ No newline at end of file diff --git a/scripts/admin/attributeControl.js b/scripts/admin/attributeControl.js index eb18d4d10e9..14bc77e42b3 100644 --- a/scripts/admin/attributeControl.js +++ b/scripts/admin/attributeControl.js @@ -1,28 +1,67 @@ $(document).ready(function() { - $(":checkbox").change(function(){ - var visibleid = $(this).attr('id'); - $.post(saveVisible, - { attid : $(this).attr('id'), - visiblevalue : $("#"+visibleid+":checked").val()}, - function(data) {}); - }); - - - - $(".attid").hide(); - $('#add').effect('pulsate', { times: 2 }, 1000); - var id = 1; - $('.add').click(function(){ - html = ""+ - ""+ - ""+ - " "; - $('.attid').fadeIn('slow'); - $('#atttable tr:last').after(html); - id++; + var CM = [ + {name: 'actions', width: 75, align: 'center', fixed: true, sortable: false, resize: false, formatter: 'actions', search: false}, + {name: 'attribute_name', index: 'attribute_name', width: 250, align:"center", editable: true, editrules: {"required":true}}, + {name: 'attribute_type', index: 'attribute_type', width: 250, align:"center", editable: true, edittype:"select", editoptions:{value:attributeTypeSelections}, stype: 'select', searchoptions: {sopt: ['eq', 'ne'], value:attributeTypeSearch}}, + {name: 'visible', index: 'visible', width: 250, align: 'center', editable: true, formatter: checkboxFormatter, edittype: 'checkbox', edittype: "checkbox", editoptions: {value: "TRUE"}, stype: 'select', searchoptions: {sopt: ['eq', 'ne'], value: "TRUE:Yes;FALSE:No"}} + ]; + + jQuery("#attributeControl").jqGrid({ + align:"center", + url: attributeInfoUrl, + editurl : editAttributeUrl, + datatype: "json", + mtype: "post", + editable : true, + colNames: jQuery.parseJSON(attributeControlCols), + colModel: CM, + height: "100%", + width: "100%", + rowNum: 25, + scrollOffset:0, + autowidth: true, + loadonce: true, + sortname : "attribute_name", + rowList: [25,50,100,250,500,1000,5000], + multiselect: true, + pager: "#pager", }); -}); \ No newline at end of file + + jQuery.extend($.fn.fmatter , { + rowactions : function(rid,gid,act) { + switch(act) + { + case 'edit' : + window.open(attributeEditUrl + '/' + rid, '_top'); + break; + case 'del': + $('#'+gid).jqGrid('delGridRow', rid); + break; + } + } + }); + + jQuery('#attributeControl').jqGrid('navGrid','#pager', {add:true, del:true, edit:true}, {width:400}, {width:400, reloadAfterSubmit: false, + afterSubmit: function (response) { return [true, '', response.responseText]; }}, {}, {multipleSearch:true, width:600}); + +}); + +function checkboxFormatter(cellvalue, options) { + cellvalue = cellvalue + ""; + var bchk = cellvalue.toLowerCase() == 'true' ? " checked=\"checked\"" : ""; + return "" +} + +function ajaxSave(rowid) { + var state; + + if($('#visible_'+rowid).is(':checked') == true) + { + state = "TRUE"; + } + else + { + state = "FALSE"; + } + $.post(editAttributeUrl, { id: rowid, visible: state, oper : 'edit' } ); +} \ No newline at end of file