From 96c0b5c35463387664db3fa69898d54a929eaa2a Mon Sep 17 00:00:00 2001 From: wei <> Date: Fri, 30 Mar 2007 07:11:11 +0000 Subject: Fixed #538 --- .gitattributes | 5 + HISTORY | 1 + framework/Web/Javascripts/js/compressed/prado.js | 18 +++- framework/Web/Javascripts/js/debug/prado.js | 52 ++++++++++- .../Web/Javascripts/prado/scriptaculous-adapter.js | 52 ++++++++++- .../UI/ActiveControls/TCallbackClientScript.php | 7 +- .../tickets/protected/pages/Ticket538.page | 25 +++++ .../tickets/protected/pages/Ticket538.php | 102 +++++++++++++++++++++ .../tickets/protected/pages/Ticket542.page | 16 ++++ .../tickets/protected/pages/Ticket542.php | 23 +++++ .../tickets/tests/Ticket538TestCase.php | 30 ++++++ 11 files changed, 321 insertions(+), 10 deletions(-) create mode 100644 tests/FunctionalTests/tickets/protected/pages/Ticket538.page create mode 100644 tests/FunctionalTests/tickets/protected/pages/Ticket538.php create mode 100644 tests/FunctionalTests/tickets/protected/pages/Ticket542.page create mode 100644 tests/FunctionalTests/tickets/protected/pages/Ticket542.php create mode 100644 tests/FunctionalTests/tickets/tests/Ticket538TestCase.php diff --git a/.gitattributes b/.gitattributes index ed9bb3a2..6a72c98d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2403,7 +2403,11 @@ tests/FunctionalTests/tickets/protected/pages/Ticket511.page -text tests/FunctionalTests/tickets/protected/pages/Ticket518.page -text tests/FunctionalTests/tickets/protected/pages/Ticket521.page -text tests/FunctionalTests/tickets/protected/pages/Ticket521.php -text +tests/FunctionalTests/tickets/protected/pages/Ticket538.page -text +tests/FunctionalTests/tickets/protected/pages/Ticket538.php -text tests/FunctionalTests/tickets/protected/pages/Ticket54.page -text +tests/FunctionalTests/tickets/protected/pages/Ticket542.page -text +tests/FunctionalTests/tickets/protected/pages/Ticket542.php -text tests/FunctionalTests/tickets/protected/pages/Ticket54Master.php -text tests/FunctionalTests/tickets/protected/pages/Ticket54Master.tpl -text tests/FunctionalTests/tickets/protected/pages/Ticket573.page -text @@ -2436,6 +2440,7 @@ tests/FunctionalTests/tickets/tests/Ticket477TestCase.php -text tests/FunctionalTests/tickets/tests/Ticket488TestCase.php -text tests/FunctionalTests/tickets/tests/Ticket507TestCase.php -text tests/FunctionalTests/tickets/tests/Ticket521TestCase.php -text +tests/FunctionalTests/tickets/tests/Ticket538TestCase.php -text tests/FunctionalTests/tickets/tests/Ticket54TestCase.php -text tests/FunctionalTests/tickets/tests/Ticket573TestCase.php -text tests/FunctionalTests/tickets/tests/Ticket578TestCase.php -text diff --git a/HISTORY b/HISTORY index ceca195a..ab680136 100644 --- a/HISTORY +++ b/HISTORY @@ -4,6 +4,7 @@ BUG: Ticket#278 - client-side validator enable/disable (conditional) (Wei) BUG: Ticket#492 - TDataGridPagerStyle not found error (Qiang) BUG: Ticket#517 - Quickstart I18N sample: conflicting module ID (Wei) BUG: Ticket#521 - comment tag on TActiveButton stop callback (Wei) +BUG: Ticket#538 - TActiveListBox doesn't support optgroup (Wei) BUG: Ticket#549 - set/get Timestamp on TDatePicker shound handle "null" values (Qiang) BUG: Ticket#550 - explicitly include TCallbackClientSide in TCallbackOptions (Qiang) BUG: Ticket#553 - I18N quickstart sample does not work (Qiang) diff --git a/framework/Web/Javascripts/js/compressed/prado.js b/framework/Web/Javascripts/js/compressed/prado.js index 9912b1fc..55651927 100644 --- a/framework/Web/Javascripts/js/compressed/prado.js +++ b/framework/Web/Javascripts/js/compressed/prado.js @@ -291,9 +291,21 @@ catch(e) {throw"Error in evaluating '"+value+"' for attribute "+attribute+" for element "+element.id;}} else el.setAttribute(attribute,value);},setOptions:function(element,options) -{var el=$(element);if(!el)return;if(el&&el.tagName.toLowerCase()=="select") -{el.options.length=options.length;for(var i=0;i0) +el.removeChild(el.lastChild);var optDom=Prado.Element.createOptions(options);for(var i=0;i2) +{var group=option[2];if(group!=previousGroup) +{if(previousGroup!=null&&optgroup!=null) +{result.push(optgroup);previousGroup=null;optgroup=null;} +optgroup=document.createElement('optgroup');optgroup.label=group;previousGroup=group;}} +var opt=document.createElement('option');opt.text=option[0];opt.innerText=option[0];opt.value=option[1];if(optgroup!=null) +optgroup.appendChild(opt);else +result.push(opt);} +if(optgroup!=null) +result.push(optgroup);return result;},focus:function(element) {var obj=$(element);if(typeof(obj)!="undefined"&&typeof(obj.focus)!="undefined") setTimeout(function(){obj.focus();},100);return false;},replace:function(element,method,content,boundary) {if(boundary) diff --git a/framework/Web/Javascripts/js/debug/prado.js b/framework/Web/Javascripts/js/debug/prado.js index 0e815b99..d1a04f4f 100644 --- a/framework/Web/Javascripts/js/debug/prado.js +++ b/framework/Web/Javascripts/js/debug/prado.js @@ -3648,12 +3648,58 @@ Prado.Element = { var el = $(element); if(!el) return; + var previousGroup = null; + var optGroup=null; if(el && el.tagName.toLowerCase() == "select") { - el.options.length = options.length; - for(var i = 0; i 0) + el.removeChild(el.lastChild); + + var optDom = Prado.Element.createOptions(options); + for(var i = 0; i < optDom.length; i++) + el.appendChild(optDom[i]); + } + }, + + /** + * Create opt-group options from an array of options[0]=text, options[1]=value, options[2]=group + */ + createOptions : function(options) + { + var previousGroup = null; + var optgroup=null; + var result = []; + for(var i = 0; i 2) + { + var group = option[2]; + if(group!=previousGroup) + { + if(previousGroup!=null && optgroup!=null) + { + result.push(optgroup); + previousGroup=null; + optgroup=null; + } + optgroup = document.createElement('optgroup'); + optgroup.label = group; + previousGroup = group; + } + } + var opt = document.createElement('option'); + opt.text = option[0]; + opt.innerText = option[0]; + opt.value = option[1]; + if(optgroup!=null) + optgroup.appendChild(opt); + else + result.push(opt); } + if(optgroup!=null) + result.push(optgroup); + return result; }, /** diff --git a/framework/Web/Javascripts/prado/scriptaculous-adapter.js b/framework/Web/Javascripts/prado/scriptaculous-adapter.js index f7971884..63b49600 100644 --- a/framework/Web/Javascripts/prado/scriptaculous-adapter.js +++ b/framework/Web/Javascripts/prado/scriptaculous-adapter.js @@ -236,12 +236,58 @@ Prado.Element = { var el = $(element); if(!el) return; + var previousGroup = null; + var optGroup=null; if(el && el.tagName.toLowerCase() == "select") { - el.options.length = options.length; - for(var i = 0; i 0) + el.removeChild(el.lastChild); + + var optDom = Prado.Element.createOptions(options); + for(var i = 0; i < optDom.length; i++) + el.appendChild(optDom[i]); + } + }, + + /** + * Create opt-group options from an array of options[0]=text, options[1]=value, options[2]=group + */ + createOptions : function(options) + { + var previousGroup = null; + var optgroup=null; + var result = []; + for(var i = 0; i 2) + { + var group = option[2]; + if(group!=previousGroup) + { + if(previousGroup!=null && optgroup!=null) + { + result.push(optgroup); + previousGroup=null; + optgroup=null; + } + optgroup = document.createElement('optgroup'); + optgroup.label = group; + previousGroup = group; + } + } + var opt = document.createElement('option'); + opt.text = option[0]; + opt.innerText = option[0]; + opt.value = option[1]; + if(optgroup!=null) + optgroup.appendChild(opt); + else + result.push(opt); } + if(optgroup!=null) + result.push(optgroup); + return result; }, /** diff --git a/framework/Web/UI/ActiveControls/TCallbackClientScript.php b/framework/Web/UI/ActiveControls/TCallbackClientScript.php index b10552e8..837b5b51 100644 --- a/framework/Web/UI/ActiveControls/TCallbackClientScript.php +++ b/framework/Web/UI/ActiveControls/TCallbackClientScript.php @@ -176,7 +176,12 @@ class TCallbackClientScript extends TApplicationComponent { $options = array(); foreach($items as $item) - $options[] = array($item->getText(),$item->getValue()); + { + if($item->getHasAttributes()) + $options[] = array($item->getText(),$item->getValue(), $item->getAttributes()->itemAt('Group')); + else + $options[] = array($item->getText(),$item->getValue()); + } $this->callClientFunction('Prado.Element.setOptions', array($control, $options)); } diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket538.page b/tests/FunctionalTests/tickets/protected/pages/Ticket538.page new file mode 100644 index 00000000..80ab5ff0 --- /dev/null +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket538.page @@ -0,0 +1,25 @@ + + + + + + + + + + + + + +
+ + +
$Id: Home.page 1650 2007-01-24 06:55:32Z wei $
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket538.php b/tests/FunctionalTests/tickets/protected/pages/Ticket538.php new file mode 100644 index 00000000..2ad9fd43 --- /dev/null +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket538.php @@ -0,0 +1,102 @@ +Text= $sender->ClientID . " clicked"; + } + + public function checkboxCallback($sender, $param) + { + $sender->Text .= ' using callback'; + } + + public function readData() + { + $data=array( + array('id'=>'001','name'=>'John','age'=>31), + array('id'=>'002','name'=>'Mary','age'=>30), + array('id'=>'003','name'=>'Cary','age'=>20), + array('id'=>'004','name'=>'Kevin','age'=>65), + array('id'=>'005','name'=>'Steven','age'=>10), + array('id'=>'006','name'=>'Josh','age'=>23), + array('id'=>'007','name'=>'Lary','age'=>54)); + return $data; + } + + //-------------------------------------------------------------------- + // TListBox + //-------------------------------------------------------------------- + + public function dataSelector2_Clicked($sender, $param) + { + $this->DataViewer2->DataTextField='name'; + $this->DataViewer2->Items->clear(); + foreach ($this->readData() as $index=>$person) + { + $item = new TListItem('G1: '.$person['name'].'=>'.$person['age'],$index); + $item->Attributes->Group = 'test1'; + $this->DataViewer2->Items->add($item); + } + foreach ($this->readData() as $index=>$person) + { + $item2 = new TListItem('G2: '.$person['name'].'=>'.$person['age'],$index+100); + $item2->Attributes->Group = 'test2'; + $this->DataViewer2->Items->add($item2); + } + $this->DataViewer2->dataBind(); + } + + public function selectBtn2_Clicked() + { + $text = ''; + foreach ($this->DataViewer2->SelectedIndices as $index) + { + $text .= '"'.$this->DataViewer2->Items[$index]->Attributes->Group.'", '; + } + $this->ALLog->setText($text); + } + + //-------------------------------------------------------------------- + // TActiveListBox + //-------------------------------------------------------------------- + + + public function dataSelector_Clicked($sender, $param) + { + $this->DataViewer->DataTextField='name'; + $this->DataViewer->Items->clear(); + foreach ($this->readData() as $index=>$person) + { + $item = new TListItem('G1: '.$person['name'].'=>'.$person['age'],$index); + $item->Attributes->Group = 'test1'; + $this->DataViewer->Items->add($item); + } + + foreach ($this->readData() as $index=>$person) + { + $item2 = new TListItem('G2: '.$person['name'].'=>'.$person['age'],$index+100); + $item2->Attributes->Group = 'test2'; + $this->DataViewer->Items->add($item2); + } + $this->DataViewer->dataBind(); + } + + public function selectBtn_Clicked() + { + $text = ''; + foreach ($this->DataViewer->SelectedIndices as $index) + { + if($this->DataViewer->Items[$index]->Attributes['Group']) + $text .= $index .'- "'.$this->DataViewer->Items[$index]->Attributes->Group.'", '; + else + $text .= $index.','; + } + $this->ALLog->setText($text); + } + +} + +?> \ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket542.page b/tests/FunctionalTests/tickets/protected/pages/Ticket542.page new file mode 100644 index 00000000..5c39c6b5 --- /dev/null +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket542.page @@ -0,0 +1,16 @@ + + +
+ Some content + Test + 123 + 456 +
+
+ + + + + + +
\ No newline at end of file diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket542.php b/tests/FunctionalTests/tickets/protected/pages/Ticket542.php new file mode 100644 index 00000000..bcd32a04 --- /dev/null +++ b/tests/FunctionalTests/tickets/protected/pages/Ticket542.php @@ -0,0 +1,23 @@ +CallbackClient->slideUp($this->TheBox); + } + + public function blindUp($sender, $param) { + $this->CallbackClient->blindUp($this->TheBox); + } + + public function slideDown($sender, $param) { + $this->CallbackClient->slideDown($this->TheBox); + } + + public function blindDown($sender, $param) { + $this->CallbackClient->blindDown($this->TheBox); + } + +} + +?> \ No newline at end of file diff --git a/tests/FunctionalTests/tickets/tests/Ticket538TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket538TestCase.php new file mode 100644 index 00000000..712ff24b --- /dev/null +++ b/tests/FunctionalTests/tickets/tests/Ticket538TestCase.php @@ -0,0 +1,30 @@ +open('tickets/index.php?page=Ticket538'); + $this->verifyTitle("Verifying Ticket 538", ""); + + $this->assertText("{$base}ALLog", 'waiting for response...'); + + $this->select("{$base}DataViewer", "empty :("); + $this->click("{$base}selectBtn"); + $this->pause(800); + + $this->assertText("{$base}ALLog", '0,'); + + $this->select("{$base}DataSelector", "select data set 2"); + $this->pause(800); + $this->select("{$base}DataViewer", "G1: Steven=>10"); + $this->addSelection("{$base}DataViewer", "G2: Kevin=>65"); + + $this->click("{$base}selectBtn"); + $this->pause(800); + $this->assertText("{$base}ALLog", '4- "test1", 10- "test2",'); + } +} + +?> \ No newline at end of file -- cgit v1.2.3