Completed
Push — master ( f99fed...57dceb )
by Jean-Christophe
03:29
created

HasCheckboxesTrait::_getCheckedMessageCall()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 12
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 12
rs 9.2
c 0
b 0
f 0
cc 4
eloc 9
nc 5
nop 1
1
<?php
2
namespace Ajax\semantic\widgets\datatable;
3
4
use Ajax\JsUtils;
5
use Ajax\semantic\html\modules\checkbox\HtmlCheckbox;
6
use Ajax\semantic\html\elements\HtmlLabel;
7
8
/**
9
 * used in DataTable
10
 * @author jc
11
 * @property string identifier
12
 * @property $_compileParts
13
 */
14
trait HasCheckboxesTrait{
15
	protected $_hasCheckboxes;
16
	protected $_hasCheckedMessage=false;
17
	protected $_checkedMessage;
18
	protected $_checkedClass;
19
20
	abstract public function addInToolbar($element,$callback=NULL);
21
22
	protected function _runCheckboxes(JsUtils $js){
23
		$js->execOn("change", "#".$this->identifier." [name='selection[]']:not(._jsonArrayChecked)", $this->_getCheckedChange($js));
24
		if(\sizeof($this->_compileParts)<3){
0 ignored issues
show
Bug introduced by
The property _compileParts does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
25
			$js->trigger("#".$this->identifier." [name='selection[]']","change",true);
26
		}
27
	}
28
29
	protected function _getCheckedChange(JsUtils $js=NULL){
30
		$callback="var \$parentCheckbox=\$('#ck-main-ck-{$this->identifier}'),\$checkbox=\$('#{$this->identifier} [name=\"selection[]\"]'),allChecked=true,allUnchecked=true;
31
				\$checkbox.each(function() {if($(this).prop('checked')){allUnchecked = false;}else{allChecked = false;}});
32
				if(allChecked) {\$parentCheckbox.checkbox('set checked');}else if(allUnchecked){\$parentCheckbox.checkbox('set unchecked');}else{\$parentCheckbox.checkbox('set indeterminate');};".$this->_getCheckedMessageCall($js);
33
		return $callback;
34
	}
35
36
	protected function _getCheckedMessageFunction(){
37
		$msg=$this->getCheckedMessage();
38
		$checkedMessageFunction="$('#{$this->identifier}').bind('updateChecked',function() {var msg='".$msg[0]."',count=\$('#{$this->identifier} [name=\"selection[]\"]:checked').length,all=\$('#{$this->identifier} [name=\"selection[]\"]').length;
39
		if(count==1) msg='".$msg[1]."';
40
						else if(count>1) msg='".$msg["other"]."';
41
						\$('#checked-count-".$this->identifier."').contents().filter(function() {return this.nodeType == 3;}).each(function(){this.textContent = msg.replace('{count}',count);});
42
								\$('#toolbar-{$this->identifier} .visibleOnChecked').toggle(count>0);});\$('#toolbar-".$this->identifier." .visibleOnChecked').hide();";
43
		return $checkedMessageFunction;
44
	}
45
46
	protected function _getCheckedMessageCall(JsUtils $js=NULL){
47
		$checkedMessageCall="";
48
		if($this->_hasCheckedMessage){
49
			$checkedMessageCall="$('#{$this->identifier}').trigger('updateChecked');";
50
			if(isset($this->_checkedClass)){
51
				$checkedMessageCall.="$(this).closest('tr').toggleClass('".$this->_checkedClass."',$(this).prop('checked'));";
52
			}
53
			if(isset($js))
54
				$js->exec($this->_getCheckedMessageFunction(),true);
55
		}
56
		return $checkedMessageCall;
57
	}
58
59
	protected function _generateMainCheckbox(&$captions){
60
		$ck=new HtmlCheckbox("main-ck-".$this->identifier,"");
61
		$checkedMessageCall="";
62
		if($this->_hasCheckedMessage)
63
			$checkedMessageCall="$('#{$this->identifier}').trigger('updateChecked');";
64
65
			$ck->setOnChecked($this->_setAllChecked("true").$checkedMessageCall);
66
			$ck->setOnUnchecked($this->_setAllChecked("false").$checkedMessageCall);
67
			\array_unshift($captions, $ck);
68
	}
69
70
	protected function _setAllChecked($checked){
71
		$result="$('#".$this->identifier." [name=%quote%selection[]%quote%]:not(._jsonArrayChecked)').prop('checked',".$checked.");";
72
		if(isset($this->_checkedClass)){
73
			$result.="$('#".$this->identifier." tr').toggleClass('".$this->_checkedClass."',".$checked.");";
74
		}
75
		return $result;
76
	}
77
78
	public function getHasCheckboxes() {
79
		return $this->_hasCheckboxes;
80
	}
81
82
	public function setHasCheckboxes($_hasCheckboxes) {
83
		$this->_hasCheckboxes=$_hasCheckboxes;
84
		return $this;
85
	}
86
87
	protected function getCheckedMessage() {
88
		$result= $this->_checkedMessage;
89
		if(!isset($result)){
90
			$result=[0=>"none selected",1=>"one item selected","other"=>"{count} items selected"];
91
		}
92
		return $result;
93
	}
94
95
	/**
96
	 * Defines the message displayed when checkboxes are checked or unchecked
97
	 * with an associative array 0=>no selection,1=>one item selected, other=>{count} items selected
98
	 * @param array $_checkedMessage
99
	 * @return \Ajax\semantic\widgets\datatable\DataTable
100
	 */
101
	public function setCheckedMessage(array $_checkedMessage) {
102
		$this->_checkedMessage=$_checkedMessage;
103
		return $this;
104
	}
105
106
	/**
107
	 * @param array $checkedMessage
108
	 * @param callable $callback
109
	 */
110
	public function addCountCheckedInToolbar(array $checkedMessage=null,$callback=null){
111
		if(isset($checkedMessage))
112
			$this->_checkedMessage=$checkedMessage;
113
			$checkedMessage=$this->getCheckedMessage();
114
			$this->_hasCheckboxes=true;
115
			$this->_hasCheckedMessage=true;
116
			$element=new HtmlLabel("checked-count-".$this->identifier,$checkedMessage[0]);
117
			$this->addInToolbar($element,$callback);
118
	}
119
120
	public function setCheckedClass($_checkedClass) {
121
		$this->_checkedClass=$_checkedClass;
122
		return $this;
123
	}
124
}