Completed
Push — master ( 5c7ff3...abc246 )
by Jean-Christophe
03:41
created

HasCheckboxesTrait::_generateMainCheckbox()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

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