Passed
Push — master ( ef609f...421c61 )
by Jean-Christophe
02:48
created

HtmlDropdown::each()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 3
nc 2
nop 1
dl 0
loc 5
rs 9.4285
c 0
b 0
f 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","showOnFocus"=>false);
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);
1 ignored issue
show
Bug introduced by
The method addIconP() does not exist on Ajax\semantic\html\modules\HtmlDropdown. Did you maybe mean addIcon()? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

67
		$this->/** @scrutinizer ignore-call */ 
68
         addIconP($icon,$before,$labeled);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
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
0 ignored issues
show
Bug introduced by
The type Ajax\semantic\html\modules\unknown was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
83
	 */
84
	public function insertItem($item,$position=0){
85
		$itemO=$this->beforeAddItem($item);
86
		 $start = array_slice($this->items, 0, $position);
0 ignored issues
show
Bug introduced by
It seems like $position can also be of type double; however, parameter $length of array_slice() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

86
		 $start = array_slice($this->items, 0, /** @scrutinizer ignore-type */ $position);
Loading history...
87
		 $end = array_slice($this->items, $position);
0 ignored issues
show
Bug introduced by
It seems like $position can also be of type double; however, parameter $offset of array_slice() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

87
		 $end = array_slice($this->items, /** @scrutinizer ignore-type */ $position);
Loading history...
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
Bug introduced by
$image of type string is incompatible with the type Ajax\semantic\html\content\unknown expected by parameter $image of Ajax\semantic\html\conte...lDropdownItem::avatar(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

174
		return $this->addItem(HtmlDropdownItem::avatar($caption, /** @scrutinizer ignore-type */ $image));
Loading history...
Bug introduced by
$caption of type string is incompatible with the type Ajax\semantic\html\content\unknown expected by parameter $caption of Ajax\semantic\html\conte...lDropdownItem::avatar(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

174
		return $this->addItem(HtmlDropdownItem::avatar(/** @scrutinizer ignore-type */ $caption, $image));
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
0 ignored issues
show
Bug introduced by
The type Ajax\semantic\html\modules\HtmlCollection was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
194
	 */
195
	public function setPropertyValues($property,$values){
196
		$i=0;
197
		if(\is_array($values)===false){
0 ignored issues
show
introduced by
The condition is_array($values) === false can never be true.
Loading history...
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;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this returns the type Ajax\semantic\html\modules\HtmlDropdown which is incompatible with the documented return type Ajax\semantic\html\modules\HtmlCollection.
Loading history...
207
			}
208
		}
209
		return $this;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this returns the type Ajax\semantic\html\modules\HtmlDropdown which is incompatible with the documented return type Ajax\semantic\html\modules\HtmlCollection.
Loading history...
210
	}
211
212
	public function each($callBack){
213
		foreach ($this->items as $index=>$value){
214
			$callBack($index,$value);
215
		}
216
		return $this;
217
	}
218
219
	public function getItem($index){
220
		return $this->items[$index];
221
	}
222
223
	/**
224
	 * @return int
225
	 */
226
	public function count(){
227
		return \sizeof($this->items);
228
	}
229
	/**
230
	 * @param boolean $dropdown
231
	 */
232
	public function asDropdown($dropdown){
233
		if($dropdown===false){
234
			$this->_template=include dirname(__FILE__).'/../templates/tplDropdownMenu.php';
235
			$dropdown="menu";
236
		}else{
237
			$dropdown="dropdown";
238
			$this->mClass="menu";
239
		}
240
		return $this->addToPropertyCtrl("class", $dropdown,array("menu","dropdown"));
241
	}
242
243
	public function setVertical(){
244
		return $this->addToPropertyCtrl("class", "vertical",array("vertical"));
245
	}
246
247
	public function setInline(){
248
		return $this->addToPropertyCtrl("class", "inline",["inline"]);
249
	}
250
251
	public function setSimple(){
252
		return $this->addToPropertyCtrl("class", "simple",array("simple"));
253
	}
254
255
	public function asButton($floating=false){
256
		$this->removeArrow();
257
		if($floating)
258
			$this->addToProperty("class", "floating");
259
		$this->removePropertyValue("class", "selection");
260
		return $this->addToProperty("class", "button");
261
	}
262
263
	public function asSelect($name=NULL,$multiple=false,$selection=true){
264
		$this->_multiple=$multiple;
265
		if(isset($name))
266
			$this->addInput($name);
267
		if($multiple){
268
			$this->addToProperty("class", "multiple");
269
		}
270
		if ($selection){
271
			if($this->propertyContains("class", "button")===false)
272
				$this->addToPropertyCtrl("class", "selection",array("selection"));
273
		}
274
		return $this;
275
	}
276
277
	public function asSearch($name=NULL,$multiple=false,$selection=true){
278
		$this->asSelect($name,$multiple,$selection);
279
		return $this->addToProperty("class", "search");
280
	}
281
282
	public function setSelect($name=NULL,$multiple=false){
283
		if(!isset($name))
284
			$name="select-".$this->identifier;
285
		$this->input=null;
286
		if($multiple){
287
			$this->setProperty("multiple", true);
288
			$this->addToProperty("class", "multiple");
289
		}
290
		$this->setAction("activate");
291
		$this->tagName="select";
292
		$this->setProperty("name", $name);
293
		$this->content=null;
294
		foreach ($this->items as $item){
295
			$item->asOption();
296
		}
297
		return $this;
298
	}
299
300
	public function asSubmenu($pointing=NULL){
301
		$this->setClass("ui dropdown link item");
302
		if(isset($pointing)){
303
			$this->setPointing($pointing);
304
		}
305
		return $this;
306
	}
307
308
	public function setPointing($value=Direction::NONE){
309
		return $this->addToPropertyCtrl("class", $value." pointing",Direction::getConstantValues("pointing"));
310
	}
311
312
	public function setValue($value){
313
		$this->value=$value;
314
		return $this;
315
	}
316
	private function applyValue(){
317
		$value=$this->value;
318
		if(isset($this->input) && isset($value)){
319
			$this->input->setProperty("value", $value);
320
		}else{
321
			$this->setProperty("value", $value);
322
		}
323
			$textElement=$this->getElementById("text-".$this->identifier, $this->content);
324
			if(isset($textElement) && !$this->_multiple)
325
				$textElement->setContent($value);
0 ignored issues
show
Bug introduced by
The method setContent() does not exist on Ajax\common\html\BaseHtml. It seems like you code against a sub-type of Ajax\common\html\BaseHtml such as Ajax\bootstrap\html\HtmlModal or Ajax\common\html\HtmlDoubleElement. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

325
				$textElement->/** @scrutinizer ignore-call */ 
326
                  setContent($value);
Loading history...
326
		return $this;
327
	}
328
329
	/*
330
	 * (non-PHPdoc)
331
	 * @see BaseHtml::run()
332
	 */
333
	public function run(JsUtils $js) {
334
		if($this->propertyContains("class", "simple")===false){
335
			if(isset($this->_bsComponent)===false){
336
				$this->_bsComponent=$js->semantic()->dropdown("#".$this->identifier,$this->_params);
337
				$this->_bsComponent->setItemSelector(".item");
338
			}
339
			$this->addEventsOnRun($js);
340
			return $this->_bsComponent;
341
		}
342
	}
343
344
	public function setCompact(){
345
		return $this->addToPropertyCtrl("class", "compact", array("compact"));
346
	}
347
348
	public function setAction($action){
349
		$this->_params["action"]=$action;
350
	}
351
352
	public function setOn($on){
353
		$this->_params["on"]=$on;
354
	}
355
356
	public function setShowOnFocus($value){
357
		$this->_params["showOnFocus"]=$value;
358
	}
359
360
	public function setFullTextSearch($value){
361
		$this->_params["fullTextSearch"]=$value;
362
	}
363
364
	public function compile(JsUtils $js=NULL, &$view=NULL) {
365
		$this->applyValue();
366
		return parent::compile($js,$view);
367
	}
368
369
	public function getInput() {
370
		return $this->input;
371
	}
372
	public function addAction($action, $direction=Direction::RIGHT, $icon=NULL, $labeled=false) {
373
		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()? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

373
		return $this->/** @scrutinizer ignore-call */ _addAction($this, $action,$direction,$icon,$labeled);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
374
	}
375
376
	public function setIcon($icon="dropdown"){
377
		$this->content["arrow"]=new HtmlIcon($this->identifier."-icon", $icon);
378
		return $this;
379
	}
380
381
	public function jsAddItem($caption){
382
		$js="var first=$('#{$this->identifier} .item').first();if(first!=undefined){var new =first.clone();first.parent().append(new);first.html('{$caption}};')";
383
		return $js;
384
	}
385
}
386