Passed
Push — master ( 399ae9...6e76cc )
by Jean-Christophe
01:59
created

HasCheckboxesTrait::setCheckedCallback()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 2
rs 10
c 0
b 0
f 0
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 array $_compileParts
13
 */
14
trait HasCheckboxesTrait{
15
	protected $_hasCheckboxes;
16
	protected $_hasCheckedMessage=false;
17
	protected $_checkedMessage;
18
	protected $_checkedClass;
19
	protected $_checkedCallback;
20
21
	abstract public function addInToolbar($element,$callback=NULL);
22
23
	protected function _runCheckboxes(JsUtils $js){
24
		$js->execOn("change", "#".$this->identifier." [name='selection[]']:not(._jsonArrayChecked)", $this->_getCheckedChange($js));
25
		if(\sizeof($this->_compileParts)<3){
26
			$js->trigger("#".$this->identifier." [name='selection[]']","change",true);
27
		}
28
	}
29
30
	protected function _getCheckedChange(JsUtils $js=NULL){
31
		$callback="var \$parentCheckbox=\$('#ck-main-ck-{$this->identifier}'),\$checkbox=\$('#{$this->identifier} [name=\"selection[]\"]'),allChecked=true,allUnchecked=true;
32
				\$checkbox.each(function() {if($(this).prop('checked')){allUnchecked = false;}else{allChecked = false;}});
33
				if(allChecked) {\$parentCheckbox.checkbox('set checked');}else if(allUnchecked){\$parentCheckbox.checkbox('set unchecked');}else{\$parentCheckbox.checkbox('set indeterminate');};".$this->_getCheckedMessageCall($js);
34
		return $callback;
35
	}
36
37
	protected function _getCheckedMessageFunction(){
38
		$msg=$this->getCheckedMessage();
39
		$checkedMessageFunction="$('#{$this->identifier}').bind('updateChecked',function() {var msg='".$msg[0]."',count=\$('#{$this->identifier} [name=\"selection[]\"]:checked').length,all=\$('#{$this->identifier} [name=\"selection[]\"]').length;
40
		if(count==1) msg='".$msg[1]."';
41
						else if(count>1) msg='".$msg["other"]."';
42
						\$('#checked-count-".$this->identifier."').contents().filter(function() {return this.nodeType == 3;}).each(function(){this.textContent = msg.replace('{count}',count);});
43
								\$('#toolbar-{$this->identifier} .visibleOnChecked').toggle(count>0);});\$('#toolbar-".$this->identifier." .visibleOnChecked').hide();";
44
		return $checkedMessageFunction;
45
	}
46
47
	protected function _getCheckedMessageCall(JsUtils $js=NULL){
48
		$checkedMessageCall="";
49
		if($this->_hasCheckedMessage){
50
			$checkedMessageCall="$('#{$this->identifier}').trigger('updateChecked');";
51
			if(isset($this->_checkedClass)){
52
				$checkedMessageCall.="$(this).closest('tr').toggleClass('".$this->_checkedClass."',$(this).prop('checked'));";
53
			}
54
			if(isset($js))
55
				$js->exec($this->_getCheckedMessageFunction(),true);
56
		}
57
		return $checkedMessageCall;
58
	}
59
60
	protected function _generateMainCheckbox(&$captions){
61
		$ck=new HtmlCheckbox("main-ck-".$this->identifier,"");
62
		$checkedMessageCall="";
63
		if($this->_hasCheckedMessage)
64
			$checkedMessageCall="$('#{$this->identifier}').trigger('updateChecked');";
65
66
			$ck->setOnChecked($this->_setAllChecked("true").$checkedMessageCall);
67
			$ck->setOnUnchecked($this->_setAllChecked("false").$checkedMessageCall);
68
			\array_unshift($captions, $ck);
69
	}
70
71
	protected function _setAllChecked($checked){
72
		$result="$('#".$this->identifier." [name=%quote%selection[]%quote%]:not(._jsonArrayChecked)').prop('checked',".$checked.");";
73
		if(isset($this->_checkedClass)){
74
			$result.="$('#".$this->identifier." tr').toggleClass('".$this->_checkedClass."',".$checked.");";
75
		}
76
		return $result;
77
	}
78
79
	public function getHasCheckboxes() {
80
		return $this->_hasCheckboxes;
81
	}
82
83
	public function setHasCheckboxes($_hasCheckboxes) {
84
		$this->_hasCheckboxes=$_hasCheckboxes;
85
		return $this;
86
	}
87
88
	protected function getCheckedMessage() {
89
		$result= $this->_checkedMessage;
90
		if(!isset($result)){
91
			$result=[0=>"none selected",1=>"one item selected","other"=>"{count} items selected"];
92
		}
93
		return $result;
94
	}
95
96
	/**
97
	 * Defines the message displayed when checkboxes are checked or unchecked
98
	 * with an associative array 0=>no selection,1=>one item selected, other=>{count} items selected
99
	 * @param array $_checkedMessage
100
	 * @return \Ajax\semantic\widgets\datatable\DataTable
101
	 */
102
	public function setCheckedMessage(array $_checkedMessage) {
103
		$this->_checkedMessage=$_checkedMessage;
104
		return $this;
105
	}
106
107
	/**
108
	 * @param array $checkedMessage
109
	 * @param callable $callback
110
	 */
111
	public function addCountCheckedInToolbar(array $checkedMessage=null,$callback=null){
112
		if(isset($checkedMessage))
113
			$this->_checkedMessage=$checkedMessage;
114
			$checkedMessage=$this->getCheckedMessage();
115
			$this->_hasCheckboxes=true;
116
			$this->_hasCheckedMessage=true;
117
			$element=new HtmlLabel("checked-count-".$this->identifier,$checkedMessage[0]);
118
			$this->addInToolbar($element,$callback);
119
	}
120
121
	public function setCheckedClass($_checkedClass) {
122
		$this->_checkedClass=$_checkedClass;
123
		return $this;
124
	}
125
	/**
126
	 * Set the callback function that determines whether the checkbox should be checked for an object
127
	 * @param callable $checkedCallback a callback like function($object) that returns true or false
128
	 */
129
	public function setCheckedCallback($checkedCallback) {
130
		$this->_checkedCallback = $checkedCallback;
131
	}
132
133
}
134