Completed
Push — master ( 23beed...cfc18c )
by Jean-Christophe
04:01 queued 01:12
created

HtmlDropdown::setSimple()   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 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);
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 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...
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 setFullTextSearch($value){
353
		$this->_params["fullTextSearch"]=$value;
354
	}
355
356
	public function compile(JsUtils $js=NULL, &$view=NULL) {
357
		$this->applyValue();
358
		return parent::compile($js,$view);
359
	}
360
361
	public function getInput() {
362
		return $this->input;
363
	}
364
	public function addAction($action, $direction=Direction::RIGHT, $icon=NULL, $labeled=false) {
365
		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...
366
	}
367
368
	public function setIcon($icon="dropdown"){
369
		$this->content["arrow"]=new HtmlIcon($this->identifier."-icon", $icon);
370
		return $this;
371
	}
372
373
	public function jsAddItem($caption){
374
		$js="var first=$('#{$this->identifier} .item').first();if(first!=undefined){var new =first.clone();first.parent().append(new);first.html('{$caption}};')";
375
		return $js;
376
	}
377
}
378