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