001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.juneau.bean.html5; 018 019import org.apache.juneau.annotation.*; 020import org.apache.juneau.common.utils.*; 021import org.apache.juneau.internal.*; 022 023/** 024 * DTO for an HTML <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#the-select-element"><select></a> 025 * element. 026 * 027 * <p> 028 * The select element represents a control that provides a menu of options. It creates a dropdown 029 * list that allows users to select one or more options from a list. The select element contains 030 * option elements that define the available choices, and can be organized into groups using 031 * optgroup elements. 032 * 033 * <h5 class='section'>Examples:</h5> 034 * <p class='bcode w800'> 035 * <jk>import static</jk> org.apache.juneau.bean.html5.HtmlBuilder.*; 036 * 037 * <jc>// Simple select dropdown</jc> 038 * Select <jv>select1</jv> = <jsm>select</jsm>(<js>"color"</js>, 039 * <jsm>option</jsm>(<js>"red"</js>, <js>"Red"</js>), 040 * <jsm>option</jsm>(<js>"green"</js>, <js>"Green"</js>), 041 * <jsm>option</jsm>(<js>"blue"</js>, <js>"Blue"</js>) 042 * ); 043 * 044 * <jc>// Multiple selection</jc> 045 * Select <jv>select2</jv> = <jsm>select</jsm>(<js>"hobbies"</js>, 046 * <jsm>option</jsm>(<js>"reading"</js>, <js>"Reading"</js>), 047 * <jsm>option</jsm>(<js>"gaming"</js>, <js>"Gaming"</js>), 048 * <jsm>option</jsm>(<js>"sports"</js>, <js>"Sports"</js>) 049 * ).multiple(<jk>true</jk>).size(4); 050 * 051 * <jc>// Select with option groups</jc> 052 * Select <jv>select3</jv> = <jsm>select</jsm>(<js>"food"</js>, 053 * <jsm>optgroup</jsm>(<js>"Fruits"</js>, 054 * <jsm>option</jsm>(<js>"apple"</js>, <js>"Apple"</js>), 055 * <jsm>option</jsm>(<js>"banana"</js>, <js>"Banana"</js>) 056 * ), 057 * <jsm>optgroup</jsm>(<js>"Vegetables"</js>, 058 * <jsm>option</jsm>(<js>"carrot"</js>, <js>"Carrot"</js>), 059 * <jsm>option</jsm>(<js>"broccoli"</js>, <js>"Broccoli"</js>) 060 * ) 061 * ); 062 * 063 * <jc>// Disabled select</jc> 064 * Select <jv>select4</jv> = <jsm>select</jsm>(<js>"disabled"</js>) 065 * .disabled(<jk>true</jk>) 066 * .children( 067 * option().value("option1").text("Option 1") 068 * ); 069 * </p> 070 * 071 * <p> 072 * The following convenience methods are provided for constructing instances of this bean: 073 * <ul class='javatree'> 074 * <li class='jc'>{@link HtmlBuilder} 075 * <ul class='javatree'> 076 * <li class='jm'>{@link HtmlBuilder#select() select()} 077 * <li class='jm'>{@link HtmlBuilder#select(Object, Object...) select(Object, Object...)} 078 * </ul> 079 * </ul> 080 * </p> 081 * 082 * <h5 class='section'>See Also:</h5><ul> 083 * <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/JuneauBeanHtml5">juneau-bean-html5</a> 084 * </ul> 085 */ 086@Bean(typeName="select") 087public class Select extends HtmlElementContainer { 088 089 /** 090 * Creates an empty {@link Select} element. 091 */ 092 public Select() {} 093 094 /** 095 * Creates a {@link Select} element with the specified {@link Select#name(String)} attribute and child nodes. 096 * 097 * @param name The {@link Select#name(String)} attribute. 098 * @param children The child nodes. 099 */ 100 public Select(String name, Object...children) { 101 name(name).children(children); 102 } 103 104 /** 105 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-fe-autofocus">autofocus</a> attribute. 106 * 107 * <p> 108 * Automatically focus the form control when the page is loaded. 109 * 110 * @param autofocus 111 * The new value for this attribute. 112 * Typically a {@link Boolean} or {@link String}. 113 * @return This object. 114 */ 115 public Select autofocus(Object value) { 116 attr("autofocus", value); 117 return this; 118 } 119 120 /** 121 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-fe-disabled">disabled</a> attribute. 122 * 123 * <p> 124 * Whether the form control is disabled. 125 * 126 * <p> 127 * This attribute uses deminimized values: 128 * <ul> 129 * <li><jk>false</jk> - Attribute is not added</li> 130 * <li><jk>true</jk> - Attribute is added as <js>"disabled"</js></li> 131 * <li>Other values - Passed through as-is</li> 132 * </ul> 133 * 134 * @param disabled 135 * The new value for this attribute. 136 * Typically a {@link Boolean} or {@link String}. 137 * @return This object. 138 */ 139 public Select disabled(Object value) { 140 attr("disabled", deminimize(value, "disabled")); 141 return this; 142 } 143 144 /** 145 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-fae-form">form</a> attribute. 146 * 147 * <p> 148 * Associates the select element with a form element by specifying the form's ID. This allows the select 149 * to be placed outside the form element while still being part of the form. 150 * 151 * <p> 152 * The value should match the ID of a form element in the same document. 153 * 154 * @param form The ID of the form element to associate with this select. 155 * @return This object. 156 */ 157 public Select form(String value) { 158 attr("form", value); 159 return this; 160 } 161 162 /** 163 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-select-multiple">multiple</a> attribute. 164 * 165 * <p> 166 * Whether to allow multiple values. 167 * 168 * <p> 169 * This attribute uses deminimized values: 170 * <ul> 171 * <li><jk>false</jk> - Attribute is not added</li> 172 * <li><jk>true</jk> - Attribute is added as <js>"multiple"</js></li> 173 * <li>Other values - Passed through as-is</li> 174 * </ul> 175 * 176 * @param multiple 177 * The new value for this attribute. 178 * Typically a {@link Boolean} or {@link String}. 179 * @return This object. 180 */ 181 public Select multiple(Object value) { 182 attr("multiple", deminimize(value, "multiple")); 183 return this; 184 } 185 186 /** 187 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-fe-name">name</a> attribute. 188 * 189 * <p> 190 * Specifies the name of the select element. This name is used when the form is submitted and 191 * can be used to access the element via the form.elements API. 192 * 193 * <p> 194 * The name should be unique within the form and should not contain spaces or special characters. 195 * 196 * @param name The name of the select element for submission and API access. 197 * @return This object. 198 */ 199 public Select name(String value) { 200 attr("name", value); 201 return this; 202 } 203 204 /** 205 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-select-required">required</a> attribute. 206 * 207 * <p> 208 * Whether the control is required for form submission. 209 * 210 * @param required 211 * The new value for this attribute. 212 * Typically a {@link Boolean} or {@link String}. 213 * @return This object. 214 */ 215 public Select required(Object value) { 216 attr("required", value); 217 return this; 218 } 219 220 /** 221 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-select-size">size</a> attribute. 222 * 223 * <p> 224 * Specifies the number of visible options in a select element. If greater than 1, 225 * the select becomes a scrollable list instead of a dropdown. 226 * 227 * @param size The number of visible options (1 for dropdown, >1 for list). 228 * @return This object. 229 */ 230 public Select size(Object value) { 231 attr("size", value); 232 return this; 233 } 234 235 /** 236 * Convenience method for selecting a child {@link Option} after the options have already been populated. 237 * 238 * @param optionValue The option value. 239 * @return This object. 240 */ 241 public Select choose(Object optionValue) { 242 if (optionValue != null) { 243 getChildren().forEach(x -> { 244 if (x instanceof Option o && Utils.eq(optionValue.toString(), o.getAttr(String.class, "value"))) 245 o.selected(true); 246 }); 247 } 248 return this; 249 } 250 251 //----------------------------------------------------------------------------------------------------------------- 252 // Overridden methods 253 //----------------------------------------------------------------------------------------------------------------- 254 @Override /* Overridden from HtmlElement */ 255 public Select _class(String value) { // NOSONAR - Intentional naming. 256 super._class(value); 257 return this; 258 } 259 260 @Override /* Overridden from HtmlElement */ 261 public Select accesskey(String value) { 262 super.accesskey(value); 263 return this; 264 } 265 266 @Override /* Overridden from HtmlElement */ 267 public Select contenteditable(Object value) { 268 super.contenteditable(value); 269 return this; 270 } 271 272 @Override /* Overridden from HtmlElement */ 273 public Select dir(String value) { 274 super.dir(value); 275 return this; 276 } 277 278 @Override /* Overridden from HtmlElement */ 279 public Select hidden(Object value) { 280 super.hidden(value); 281 return this; 282 } 283 284 @Override /* Overridden from HtmlElement */ 285 public Select id(String value) { 286 super.id(value); 287 return this; 288 } 289 290 @Override /* Overridden from HtmlElement */ 291 public Select lang(String value) { 292 super.lang(value); 293 return this; 294 } 295 296 @Override /* Overridden from HtmlElement */ 297 public Select onabort(String value) { 298 super.onabort(value); 299 return this; 300 } 301 302 @Override /* Overridden from HtmlElement */ 303 public Select onblur(String value) { 304 super.onblur(value); 305 return this; 306 } 307 308 @Override /* Overridden from HtmlElement */ 309 public Select oncancel(String value) { 310 super.oncancel(value); 311 return this; 312 } 313 314 @Override /* Overridden from HtmlElement */ 315 public Select oncanplay(String value) { 316 super.oncanplay(value); 317 return this; 318 } 319 320 @Override /* Overridden from HtmlElement */ 321 public Select oncanplaythrough(String value) { 322 super.oncanplaythrough(value); 323 return this; 324 } 325 326 @Override /* Overridden from HtmlElement */ 327 public Select onchange(String value) { 328 super.onchange(value); 329 return this; 330 } 331 332 @Override /* Overridden from HtmlElement */ 333 public Select onclick(String value) { 334 super.onclick(value); 335 return this; 336 } 337 338 @Override /* Overridden from HtmlElement */ 339 public Select oncuechange(String value) { 340 super.oncuechange(value); 341 return this; 342 } 343 344 @Override /* Overridden from HtmlElement */ 345 public Select ondblclick(String value) { 346 super.ondblclick(value); 347 return this; 348 } 349 350 @Override /* Overridden from HtmlElement */ 351 public Select ondurationchange(String value) { 352 super.ondurationchange(value); 353 return this; 354 } 355 356 @Override /* Overridden from HtmlElement */ 357 public Select onemptied(String value) { 358 super.onemptied(value); 359 return this; 360 } 361 362 @Override /* Overridden from HtmlElement */ 363 public Select onended(String value) { 364 super.onended(value); 365 return this; 366 } 367 368 @Override /* Overridden from HtmlElement */ 369 public Select onerror(String value) { 370 super.onerror(value); 371 return this; 372 } 373 374 @Override /* Overridden from HtmlElement */ 375 public Select onfocus(String value) { 376 super.onfocus(value); 377 return this; 378 } 379 380 @Override /* Overridden from HtmlElement */ 381 public Select oninput(String value) { 382 super.oninput(value); 383 return this; 384 } 385 386 @Override /* Overridden from HtmlElement */ 387 public Select oninvalid(String value) { 388 super.oninvalid(value); 389 return this; 390 } 391 392 @Override /* Overridden from HtmlElement */ 393 public Select onkeydown(String value) { 394 super.onkeydown(value); 395 return this; 396 } 397 398 @Override /* Overridden from HtmlElement */ 399 public Select onkeypress(String value) { 400 super.onkeypress(value); 401 return this; 402 } 403 404 @Override /* Overridden from HtmlElement */ 405 public Select onkeyup(String value) { 406 super.onkeyup(value); 407 return this; 408 } 409 410 @Override /* Overridden from HtmlElement */ 411 public Select onload(String value) { 412 super.onload(value); 413 return this; 414 } 415 416 @Override /* Overridden from HtmlElement */ 417 public Select onloadeddata(String value) { 418 super.onloadeddata(value); 419 return this; 420 } 421 422 @Override /* Overridden from HtmlElement */ 423 public Select onloadedmetadata(String value) { 424 super.onloadedmetadata(value); 425 return this; 426 } 427 428 @Override /* Overridden from HtmlElement */ 429 public Select onloadstart(String value) { 430 super.onloadstart(value); 431 return this; 432 } 433 434 @Override /* Overridden from HtmlElement */ 435 public Select onmousedown(String value) { 436 super.onmousedown(value); 437 return this; 438 } 439 440 @Override /* Overridden from HtmlElement */ 441 public Select onmouseenter(String value) { 442 super.onmouseenter(value); 443 return this; 444 } 445 446 @Override /* Overridden from HtmlElement */ 447 public Select onmouseleave(String value) { 448 super.onmouseleave(value); 449 return this; 450 } 451 452 @Override /* Overridden from HtmlElement */ 453 public Select onmousemove(String value) { 454 super.onmousemove(value); 455 return this; 456 } 457 458 @Override /* Overridden from HtmlElement */ 459 public Select onmouseout(String value) { 460 super.onmouseout(value); 461 return this; 462 } 463 464 @Override /* Overridden from HtmlElement */ 465 public Select onmouseover(String value) { 466 super.onmouseover(value); 467 return this; 468 } 469 470 @Override /* Overridden from HtmlElement */ 471 public Select onmouseup(String value) { 472 super.onmouseup(value); 473 return this; 474 } 475 476 @Override /* Overridden from HtmlElement */ 477 public Select onmousewheel(String value) { 478 super.onmousewheel(value); 479 return this; 480 } 481 482 @Override /* Overridden from HtmlElement */ 483 public Select onpause(String value) { 484 super.onpause(value); 485 return this; 486 } 487 488 @Override /* Overridden from HtmlElement */ 489 public Select onplay(String value) { 490 super.onplay(value); 491 return this; 492 } 493 494 @Override /* Overridden from HtmlElement */ 495 public Select onplaying(String value) { 496 super.onplaying(value); 497 return this; 498 } 499 500 @Override /* Overridden from HtmlElement */ 501 public Select onprogress(String value) { 502 super.onprogress(value); 503 return this; 504 } 505 506 @Override /* Overridden from HtmlElement */ 507 public Select onratechange(String value) { 508 super.onratechange(value); 509 return this; 510 } 511 512 @Override /* Overridden from HtmlElement */ 513 public Select onreset(String value) { 514 super.onreset(value); 515 return this; 516 } 517 518 @Override /* Overridden from HtmlElement */ 519 public Select onresize(String value) { 520 super.onresize(value); 521 return this; 522 } 523 524 @Override /* Overridden from HtmlElement */ 525 public Select onscroll(String value) { 526 super.onscroll(value); 527 return this; 528 } 529 530 @Override /* Overridden from HtmlElement */ 531 public Select onseeked(String value) { 532 super.onseeked(value); 533 return this; 534 } 535 536 @Override /* Overridden from HtmlElement */ 537 public Select onseeking(String value) { 538 super.onseeking(value); 539 return this; 540 } 541 542 @Override /* Overridden from HtmlElement */ 543 public Select onselect(String value) { 544 super.onselect(value); 545 return this; 546 } 547 548 @Override /* Overridden from HtmlElement */ 549 public Select onshow(String value) { 550 super.onshow(value); 551 return this; 552 } 553 554 @Override /* Overridden from HtmlElement */ 555 public Select onstalled(String value) { 556 super.onstalled(value); 557 return this; 558 } 559 560 @Override /* Overridden from HtmlElement */ 561 public Select onsubmit(String value) { 562 super.onsubmit(value); 563 return this; 564 } 565 566 @Override /* Overridden from HtmlElement */ 567 public Select onsuspend(String value) { 568 super.onsuspend(value); 569 return this; 570 } 571 572 @Override /* Overridden from HtmlElement */ 573 public Select ontimeupdate(String value) { 574 super.ontimeupdate(value); 575 return this; 576 } 577 578 @Override /* Overridden from HtmlElement */ 579 public Select ontoggle(String value) { 580 super.ontoggle(value); 581 return this; 582 } 583 584 @Override /* Overridden from HtmlElement */ 585 public Select onvolumechange(String value) { 586 super.onvolumechange(value); 587 return this; 588 } 589 590 @Override /* Overridden from HtmlElement */ 591 public Select onwaiting(String value) { 592 super.onwaiting(value); 593 return this; 594 } 595 596 @Override /* Overridden from HtmlElement */ 597 public Select spellcheck(Object value) { 598 super.spellcheck(value); 599 return this; 600 } 601 602 @Override /* Overridden from HtmlElement */ 603 public Select style(String value) { 604 super.style(value); 605 return this; 606 } 607 608 @Override /* Overridden from HtmlElement */ 609 public Select tabindex(Object value) { 610 super.tabindex(value); 611 return this; 612 } 613 614 @Override /* Overridden from HtmlElement */ 615 public Select title(String value) { 616 super.title(value); 617 return this; 618 } 619 620 @Override /* Overridden from HtmlElement */ 621 public Select translate(Object value) { 622 super.translate(value); 623 return this; 624 } 625 626 @Override /* Overridden from HtmlElementContainer */ 627 public Select child(Object value) { 628 super.child(value); 629 return this; 630 } 631 632 @Override /* Overridden from HtmlElementContainer */ 633 public Select children(Object...value) { 634 super.children(value); 635 return this; 636 } 637}