14
14
use Ajax \semantic \html \base \HtmlSemDoubleElement ;
15
15
use Ajax \semantic \widgets \base \InstanceViewer ;
16
16
use Ajax \semantic \html \collections \table \traits \TableTrait ;
17
+ use Ajax \semantic \html \elements \HtmlLabel ;
17
18
18
19
/**
19
20
* DataTable widget for displaying list of objects
@@ -32,7 +33,9 @@ class DataTable extends Widget {
32
33
protected $ _hasDelete =false ;
33
34
protected $ _hasEdit =false ;
34
35
protected $ _visibleHover =false ;
36
+ protected $ _hasCheckedMessage =false ;
35
37
protected $ _targetSelector ;
38
+ protected $ _checkedMessage ;
36
39
37
40
public function __construct ($ identifier ,$ model ,$ modelInstance =NULL ) {
38
41
parent ::__construct ($ identifier , $ model ,$ modelInstance );
@@ -42,10 +45,7 @@ public function __construct($identifier,$model,$modelInstance=NULL) {
42
45
43
46
public function run (JsUtils $ js ){
44
47
if ($ this ->_hasCheckboxes && isset ($ js )){
45
- $ js ->execOn ("change " , "# " .$ this ->identifier ." [name='selection[]'] " , "
46
- var \$parentCheckbox= \$('#ck-main-ck- {$ this ->identifier }'), \$checkbox= \$('# {$ this ->identifier } [name= \"selection[] \"]'),allChecked=true,allUnchecked=true;
47
- \$checkbox.each(function() {if($(this).prop('checked')){allUnchecked = false;}else{allChecked = false;}});
48
- if(allChecked) { \$parentCheckbox.checkbox('set checked');}else if(allUnchecked){ \$parentCheckbox.checkbox('set unchecked');}else{ \$parentCheckbox.checkbox('set indeterminate');} " );
48
+ $ this ->_runCheckboxes ($ js );
49
49
}
50
50
if ($ this ->_visibleHover ){
51
51
$ js ->execOn ("mouseover " , "# " .$ this ->identifier ." tr " , "$(event.target).closest('tr').find('.visibleover').css('visibility', 'visible'); " ,["preventDefault " =>false ,"stopPropagation " =>true ]);
@@ -58,6 +58,24 @@ public function run(JsUtils $js){
58
58
return parent ::run ($ js );
59
59
}
60
60
61
+ protected function _runCheckboxes (JsUtils $ js ){
62
+ $ checkedMessageCall ="" ;
63
+ if ($ this ->_hasCheckedMessage ){
64
+ $ msg =$ this ->getCheckedMessage ();
65
+ $ checkedMessageFunction ="function updateChecked(){var msg=' " .$ msg [0 ]."',count= \$('# {$ this ->identifier } [name= \"selection[] \"]:checked').length,all= \$('# {$ this ->identifier } [name= \"selection[] \"]').length;
66
+ if(count==1) msg=' " .$ msg [1 ]."';
67
+ else if(count>1) msg=' " .$ msg ["other " ]."';
68
+ \$('#checked-count- " .$ this ->identifier ."').contents().filter(function() {return this.nodeType == 3;}).each(function(){this.textContent = msg.replace('{count}',count);});
69
+ \$('#toolbar- {$ this ->identifier } .visibleOnChecked').toggle(count>0);} \$('#toolbar- " .$ this ->identifier ." .visibleOnChecked').hide(); " ;
70
+ $ checkedMessageCall ="updateChecked(); " ;
71
+ $ js ->exec ($ checkedMessageFunction ,true );
72
+ }
73
+ $ js ->execOn ("change " , "# " .$ this ->identifier ." [name='selection[]'] " , "
74
+ var \$parentCheckbox= \$('#ck-main-ck- {$ this ->identifier }'), \$checkbox= \$('# {$ this ->identifier } [name= \"selection[] \"]'),allChecked=true,allUnchecked=true;
75
+ \$checkbox.each(function() {if($(this).prop('checked')){allUnchecked = false;}else{allChecked = false;}});
76
+ if(allChecked) { \$parentCheckbox.checkbox('set checked');}else if(allUnchecked){ \$parentCheckbox.checkbox('set unchecked');}else{ \$parentCheckbox.checkbox('set indeterminate');}; " .$ checkedMessageCall );
77
+ }
78
+
61
79
protected function _generateBehavior ($ op ,JsUtils $ js ){
62
80
if (isset ($ this ->_urls [$ op ]))
63
81
$ js ->getOnClick ("# " .$ this ->identifier ." . " .$ op , $ this ->_urls [$ op ],$ this ->getTargetSelector (),["preventDefault " =>false ,"attr " =>"data-ajax " ]);
@@ -114,8 +132,11 @@ public function compile(JsUtils $js=NULL,&$view=NULL){
114
132
115
133
private function _generateMainCheckbox (&$ captions ){
116
134
$ ck =new HtmlCheckbox ("main-ck- " .$ this ->identifier ,"" );
117
- $ ck ->setOnChecked ("$('# " .$ this ->identifier ." [name=%quote%selection[]%quote%]').prop('checked',true); " );
118
- $ ck ->setOnUnchecked ("$('# " .$ this ->identifier ." [name=%quote%selection[]%quote%]').prop('checked',false); " );
135
+ $ checkedMessageCall ="" ;
136
+ if ($ this ->_hasCheckedMessage )
137
+ $ checkedMessageCall ="updateChecked(); " ;
138
+ $ ck ->setOnChecked ("$('# " .$ this ->identifier ." [name=%quote%selection[]%quote%]').prop('checked',true); " .$ checkedMessageCall );
139
+ $ ck ->setOnUnchecked ("$('# " .$ this ->identifier ." [name=%quote%selection[]%quote%]').prop('checked',false); " .$ checkedMessageCall );
119
140
\array_unshift ($ captions , $ ck );
120
141
}
121
142
@@ -438,4 +459,38 @@ public function setTargetSelector($_targetSelector) {
438
459
return $ this ;
439
460
}
440
461
462
+ protected function getCheckedMessage () {
463
+ $ result = $ this ->_checkedMessage ;
464
+ if (!isset ($ result )){
465
+ $ result =[0 =>"none selected " ,1 =>"one item selected " ,"other " =>"{count} items selected " ];
466
+ }
467
+ return $ result ;
468
+ }
469
+
470
+ /**
471
+ * Defines the message displayed when checkboxes are checked or unchecked
472
+ * with an associative array 0=>no selection,1=>one item selected, other=>{count} items selected
473
+ * @param array $_checkedMessage
474
+ * @return \Ajax\semantic\widgets\datatable\DataTable
475
+ */
476
+ public function setCheckedMessage (array $ _checkedMessage ) {
477
+ $ this ->_checkedMessage =$ _checkedMessage ;
478
+ return $ this ;
479
+ }
480
+
481
+ /**
482
+ * @param array $checkedMessage
483
+ * @param callable $callback
484
+ */
485
+ public function addCountCheckedInToolbar (array $ checkedMessage =null ,$ callback =null ){
486
+ if (isset ($ checkedMessage ))
487
+ $ this ->_checkedMessage =$ checkedMessage ;
488
+ $ checkedMessage =$ this ->getCheckedMessage ();
489
+ $ this ->_hasCheckboxes =true ;
490
+ $ this ->_hasCheckedMessage =true ;
491
+ $ element =new HtmlLabel ("checked-count- " .$ this ->identifier ,$ checkedMessage [0 ]);
492
+ $ this ->addInToolbar ($ element ,$ callback );
493
+ }
494
+
495
+
441
496
}
0 commit comments