Completed
Push — master ( 7ebf5f...c286d3 )
by Jean-Christophe
02:51
created

HtmlDropdown::addDividerItem()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
namespace Ajax\semantic\html\modules;
4
5
use Ajax\semantic\html\base\HtmlSemDoubleElement;
6
use Ajax\semantic\html\content\HtmlDropdownItem;
7
use Ajax\semantic\html\elements\HtmlIcon;
8
use Ajax\common\html\html5\HtmlInput;
9
use Ajax\service\JArray;
10
use Ajax\semantic\html\base\constants\Direction;
11
use Ajax\semantic\html\base\traits\LabeledIconTrait;
12
use Ajax\JsUtils;
13
use Ajax\semantic\html\collections\form\traits\FieldTrait;
14
15
class HtmlDropdown extends HtmlSemDoubleElement {
16
	use FieldTrait,LabeledIconTrait {
17
		addIcon as addIconP;
18
	}
19
	protected $mClass="menu";
20
	protected $mTagName="div";
21
	protected $items=array ();
22
	protected $_params=array("action"=>"nothing","on"=>"hover");
23
	protected $input;
24
	protected $value;
25
	protected $_associative;
26
	protected $_multiple;
27
28
	public function __construct($identifier, $value="", $items=array(),$associative=true) {
29
		parent::__construct($identifier, "div");
30
		$this->_template=include dirname(__FILE__).'/../templates/tplDropdown.php';
31
		$this->setProperty("class", "ui dropdown");
32
		$this->_multiple=false;
33
		$content=[];
34
		if(isset($value)){
35
			if($value instanceof HtmlSemDoubleElement){
36
				$text=$value;
37
			}else{
38
				$text=new HtmlSemDoubleElement("text-".$this->identifier,"div");
39
				$text->setClass("text");
40
				$this->setValue($value);
41
			}
42
			$content=["text"=>$text];
43
		}
44
		$content["arrow"]=new HtmlIcon($identifier."-icon", "dropdown");
45
		$this->content=$content;
46
		$this->tagName="div";
47
		$this->_associative=$associative;
48
		$this->addItems($items);
49
	}
50
51
	public function getField(){
52
		return $this->input;
53
	}
54
55
	public function getDataField(){
56
		return $this->input;
57
	}
58
59
	public function addItem($item,$value=NULL,$image=NULL,$description=NULL){
60
		$itemO=$this->beforeAddItem($item,$value,$image,$description);
61
		$this->items[]=$itemO;
62
		return $itemO;
63
	}
64
65
	public function addIcon($icon,$before=true,$labeled=false){
66
		$this->removeArrow();
67
		$this->addIconP($icon,$before,$labeled);
68
		return $this->getElementById("text-".$this->identifier, $this->content)->setWrapAfter("");
69
	}
70
71
	public function addIcons($icons){
72
		$count=$this->count();
73
		for ($i=0;$i<\sizeof($icons) && $i<$count;$i++){
74
			$this->getItem($i)->addIcon($icons[$i]);
75
		}
76
	}
77
78
	/**
79
	 * Insert an item at a position
80
	 * @param mixed $item
81
	 * @param number $position
82
	 * @return \Ajax\semantic\html\content\HtmlDropdownItem|unknown
83
	 */
84
	public function insertItem($item,$position=0){
85
		$itemO=$this->beforeAddItem($item);
86
		 $start = array_slice($this->items, 0, $position);
87
		 $end = array_slice($this->items, $position);
88
		 $start[] = $item;
89
		 $this->items=array_merge($start, $end);
90
		 return $itemO;
91
	}
92
93
	protected function removeArrow(){
94
		if(\sizeof($this->content)>1){
95
			unset($this->content["arrow"]);
96
			$this->content=\array_values($this->content);
97
		}
98
	}
99
100
	protected function beforeAddItem($item,$value=NULL,$image=NULL,$description=NULL){
101
		$itemO=$item;
102
		if(\is_array($item)){
103
			$description=JArray::getValue($item, "description", 3);
104
			$value=JArray::getValue($item, "value", 1);
105
			$image=JArray::getValue($item, "image", 2);
106
			$item=JArray::getValue($item, "item", 0);
107
		}
108
		if(!$item instanceof HtmlDropdownItem){
109
			$itemO=new HtmlDropdownItem("dd-item-".$this->identifier."-".\sizeof($this->items),$item,$value,$image,$description);
110
		}elseif($itemO instanceof HtmlDropdownItem){
111
			$this->addToProperty("class", "vertical");
112
		}
113
		return $itemO;
114
	}
115
116
	/* (non-PHPdoc)
117
	 * @see \Ajax\bootstrap\html\base\BaseHtml::fromDatabaseObject()
118
	 */
119
	public function fromDatabaseObject($object, $function) {
120
		$this->addItem($function($object));
121
	}
122
123
	public function addInput($name){
124
		if(!isset($name))
125
			$name="input-".$this->identifier;
126
		$this->setAction("activate");
127
		$this->input=new HtmlInput($name,"hidden");
128
	}
129
130
	/**
131
	 * Adds a search input item
132
	 * @param string $placeHolder
133
	 * @param string $icon
134
	 * @return \Ajax\semantic\html\content\HtmlDropdownItem
135
	 */
136
	public function addSearchInputItem($placeHolder=NULL,$icon=NULL){
137
		return $this->addItem(HtmlDropdownItem::searchInput($placeHolder,$icon));
138
	}
139
140
	/**
141
	 * Adds a divider item
142
	 * @return \Ajax\semantic\html\content\HtmlDropdownItem
143
	 */
144
	public function addDividerItem(){
145
		return $this->addItem(HtmlDropdownItem::divider());
146
	}
147
148
	/**
149
	 * Adds an header item
150
	 * @param string $caption
151
	 * @param string $icon
152
	 * @return \Ajax\semantic\html\content\HtmlDropdownItem|unknown
153
	 */
154
	public function addHeaderItem($caption=NULL,$icon=NULL){
155
		return $this->addItem(HtmlDropdownItem::header($caption,$icon));
156
	}
157
158
	/**
159
	 * Adds an item with a circular label
160
	 * @param string $caption
161
	 * @param string $color
162
	 * @return \Ajax\semantic\html\content\HtmlDropdownItem|unknown
163
	 */
164
	public function addCircularLabelItem($caption,$color){
165
		return $this->addItem(HtmlDropdownItem::circular($caption, $color));
166
	}
167
168
	/**
169
	 * @param string $caption
170
	 * @param string $image
171
	 * @return \Ajax\semantic\html\content\HtmlDropdownItem
172
	 */
173
	public function addMiniAvatarImageItem($caption,$image){
174
		return $this->addItem(HtmlDropdownItem::avatar($caption, $image));
0 ignored issues
show
Documentation introduced by
$caption is of type string, but the function expects a object<Ajax\semantic\html\content\unknown>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
Documentation introduced by
$image is of type string, but the function expects a object<Ajax\semantic\html\content\unknown>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
175
	}
176
177
	public function addItems($items){
178
		if(\is_array($items) && $this->_associative){
179
			foreach ($items as $k=>$v){
180
				$this->addItem($v)->setData($k);
181
			}
182
		}else{
183
			foreach ($items as $item){
184
				$this->addItem($item);
185
			}
186
		}
187
	}
188
189
	/**
190
	 * Sets the values of a property for each item in the collection
191
	 * @param string $property
192
	 * @param array $values
193
	 * @return HtmlCollection
194
	 */
195 View Code Duplication
	public function setPropertyValues($property,$values){
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
196
		$i=0;
197
		if(\is_array($values)===false){
198
			$values=\array_fill(0, $this->count(),$values);
199
		}
200
		foreach ($values as $value){
201
			$c=$this->items[$i++];
202
			if(isset($c)){
203
				$c->setProperty($property,$value);
204
			}
205
			else{
206
				return $this;
207
			}
208
		}
209
		return $this;
210
	}
211
212
	public function getItem($index){
213
		return $this->items[$index];
214
	}
215
216
	/**
217
	 * @return int
218
	 */
219
	public function count(){
220
		return \sizeof($this->items);
221
	}
222
	/**
223
	 * @param boolean $dropdown
224
	 */
225
	public function asDropdown($dropdown){
226
		if($dropdown===false){
227
			$this->_template=include dirname(__FILE__).'/../templates/tplDropdownMenu.php';
228
			$dropdown="menu";
229
		}else{
230
			$dropdown="dropdown";
231
			$this->mClass="menu";
232
		}
233
		return $this->addToPropertyCtrl("class", $dropdown,array("menu","dropdown"));
234
	}
235
236
	public function setVertical(){
237
		return $this->addToPropertyCtrl("class", "vertical",array("vertical"));
238
	}
239
240
	public function setInline(){
241
		return $this->addToPropertyCtrl("class", "inline",["inline"]);
242
	}
243
244
	public function setSimple(){
245
		return $this->addToPropertyCtrl("class", "simple",array("simple"));
246
	}
247
248
	public function asButton($floating=false){
249
		$this->removeArrow();
250
		if($floating)
251
			$this->addToProperty("class", "floating");
252
		$this->removePropertyValue("class", "selection");
253
		return $this->addToProperty("class", "button");
254
	}
255
256
	public function asSelect($name=NULL,$multiple=false,$selection=true){
257
		$this->_multiple=$multiple;
258
		if(isset($name))
259
			$this->addInput($name);
260
		if($multiple){
261
			$this->addToProperty("class", "multiple");
262
		}
263
		if ($selection){
264
			if($this->propertyContains("class", "button")===false)
265
				$this->addToPropertyCtrl("class", "selection",array("selection"));
266
		}
267
		return $this;
268
	}
269
270
	public function asSearch($name=NULL,$multiple=false,$selection=true){
271
		$this->asSelect($name,$multiple,$selection);
272
		return $this->addToProperty("class", "search");
273
	}
274
275
	public function setSelect($name=NULL,$multiple=false){
276
		if(!isset($name))
277
			$name="select-".$this->identifier;
278
		$this->input=null;
279
		if($multiple){
280
			$this->setProperty("multiple", true);
281
			$this->addToProperty("class", "multiple");
282
		}
283
		$this->setAction("activate");
284
		$this->tagName="select";
285
		$this->setProperty("name", $name);
286
		$this->content=null;
287
		foreach ($this->items as $item){
288
			$item->asOption();
289
		}
290
		return $this;
291
	}
292
293
	public function asSubmenu($pointing=NULL){
294
		$this->setClass("ui dropdown link item");
295
		if(isset($pointing)){
296
			$this->setPointing($pointing);
297
		}
298
		return $this;
299
	}
300
301
	public function setPointing($value=Direction::NONE){
302
		return $this->addToPropertyCtrl("class", $value." pointing",Direction::getConstantValues("pointing"));
303
	}
304
305
	public function setValue($value){
306
		$this->value=$value;
307
		return $this;
308
	}
309
	private function applyValue(){
310
		$value=$this->value;
311
		if(isset($this->input) && isset($value)){
312
			$this->input->setProperty("value", $value);
313
		}else{
314
			$this->setProperty("value", $value);
315
		}
316
			$textElement=$this->getElementById("text-".$this->identifier, $this->content);
317
			if(isset($textElement) && !$this->_multiple)
318
				$textElement->setContent($value);
319
		return $this;
320
	}
321
322
	/*
323
	 * (non-PHPdoc)
324
	 * @see BaseHtml::run()
325
	 */
326
	public function run(JsUtils $js) {
327
		if($this->propertyContains("class", "simple")===false){
328 View Code Duplication
			if(isset($this->_bsComponent)===false){
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
329
				$this->_bsComponent=$js->semantic()->dropdown("#".$this->identifier,$this->_params);
330
				$this->_bsComponent->setItemSelector(".item");
331
			}
332
			$this->addEventsOnRun($js);
333
			return $this->_bsComponent;
334
		}
335
	}
336
337
	public function setCompact(){
338
		return $this->addToPropertyCtrl("class", "compact", array("compact"));
339
	}
340
341
	public function setAction($action){
342
		$this->_params["action"]=$action;
343
	}
344
345
	public function setFullTextSearch($value){
346
		$this->_params["fullTextSearch"]=$value;
347
	}
348
349
	public function compile(JsUtils $js=NULL, &$view=NULL) {
350
		$this->applyValue();
351
		return parent::compile($js,$view);
352
	}
353
354
	public function getInput() {
355
		return $this->input;
356
	}
357
	public function addAction($action, $direction=Direction::RIGHT, $icon=NULL, $labeled=false) {
358
		return $this->_addAction($this, $action,$direction,$icon,$labeled);
0 ignored issues
show
Bug introduced by
The method _addAction() does not exist on Ajax\semantic\html\modules\HtmlDropdown. Did you maybe mean addAction()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
359
	}
360
361
	public function setIcon($icon="dropdown"){
362
		$this->content["arrow"]=new HtmlIcon($this->identifier."-icon", $icon);
363
		return $this;
364
	}
365
366
	public function jsAddItem($caption){
367
		$js="var first=$('#{$this->identifier} .item').first();if(first!=undefined){var new =first.clone();first.parent().append(new);first.html('{$caption}};')";
368
		return $js;
369
	}
370
}
371