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 java.net.*; 020 021import org.apache.juneau.*; 022import org.apache.juneau.annotation.*; 023 024/** 025 * DTO for an HTML <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#the-button-element"><button></a> 026 * element. 027 * 028 * <p> 029 * The button element represents a clickable button that can be used to submit forms, trigger actions, 030 * or perform other interactive functions. Unlike input elements, buttons can contain rich content 031 * including text, images, and other HTML elements. 032 * 033 * <h5 class='section'>Examples:</h5> 034 * <p class='bcode w800'> 035 * <jc>// Simple submit button</jc> 036 * Button <jv>btn1</jv> = <jsm>button</jsm>().type(<js>"submit"</js>).text(<js>"Submit Form"</js>); 037 * 038 * <jc>// Button with custom styling and click handler</jc> 039 * Button <jv>btn2</jv> = <jsm>button</jsm>() 040 * .type(<js>"button"</js>) 041 * ._class(<js>"btn btn-primary"</js>) 042 * .onclick(<js>"handleClick()"</js>) 043 * .text(<js>"Click Me"</js>); 044 * 045 * <jc>// Button with form override attributes</jc> 046 * Button <jv>btn3</jv> = <jsm>button</jsm>() 047 * .type(<js>"submit"</js>) 048 * .formaction(<js>"https://api.example.com/submit"</js>) 049 * .formmethod(<js>"post"</js>) 050 * .formtarget(<js>"_blank"</js>) 051 * .text(<js>"Submit to API"</js>); 052 * 053 * <jc>// Button with icon and text</jc> 054 * Button <jv>btn4</jv> = <jsm>button</jsm>() 055 * .type(<js>"button"</js>) 056 * .children( 057 * <jsm>span</jsm>()._class(<js>"icon"</js>).text(<js>"📧"</js>), 058 * <jsm>span</jsm>().text(<js>"Send Email"</js>) 059 * ); 060 * </p> 061 * 062 * <p> 063 * The following convenience methods are provided for constructing instances of this bean: 064 * <ul class='javatree'> 065 * <li class='jc'>{@link HtmlBuilder} 066 * <ul class='javatree'> 067 * <li class='jm'>{@link HtmlBuilder#button() button()} 068 * <li class='jm'>{@link HtmlBuilder#button(String, Object...) button(String, Object...)} 069 * </ul> 070 * </ul> 071 * </p> 072 * 073 * <h5 class='section'>See Also:</h5><ul> 074 * <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/JuneauBeanHtml5">juneau-bean-html5</a> 075 * </ul> 076 */ 077@Bean(typeName = "button") 078public class Button extends HtmlElementMixed { 079 080 /** 081 * Creates an empty {@link Button} element. 082 */ 083 public Button() {} 084 085 /** 086 * Creates a {@link Button} element with the specified {@link Button#type(String)} attribute. 087 * 088 * @param type The {@link Button#type(String)} attribute. 089 */ 090 public Button(String type) { 091 type(type); 092 } 093 094 /** 095 * Creates a {@link Button} element with the specified {@link Button#type(String)} attribute and 096 * {@link Button#children(Object[])} nodes. 097 * 098 * @param type The {@link Button#type(String)} attribute. 099 * @param children The {@link Button#children(Object[])} nodes. 100 */ 101 public Button(String type, Object...children) { 102 type(type).children(children); 103 } 104 105 @Override /* Overridden from HtmlElement */ 106 public Button _class(String value) { // NOSONAR - Intentional naming. 107 super._class(value); 108 return this; 109 } 110 111 @Override /* Overridden from HtmlElement */ 112 public Button accesskey(String value) { 113 super.accesskey(value); 114 return this; 115 } 116 117 @Override /* Overridden from HtmlElement */ 118 public Button attr(String key, Object val) { 119 super.attr(key, val); 120 return this; 121 } 122 123 @Override /* Overridden from HtmlElement */ 124 public Button attrUri(String key, Object val) { 125 super.attrUri(key, val); 126 return this; 127 } 128 129 /** 130 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-fe-autofocus">autofocus</a> attribute. 131 * 132 * <p> 133 * Automatically focus the form control when the page is loaded. 134 * 135 * @param value 136 * The new value for this attribute. 137 * Typically a {@link Boolean} or {@link String}. 138 * @return This object. 139 */ 140 public Button autofocus(Object value) { 141 attr("autofocus", value); 142 return this; 143 } 144 145 @Override /* Overridden from HtmlElementMixed */ 146 public Button child(Object value) { 147 super.child(value); 148 return this; 149 } 150 151 @Override /* Overridden from HtmlElementMixed */ 152 public Button children(Object...value) { 153 super.children(value); 154 return this; 155 } 156 157 @Override /* Overridden from HtmlElement */ 158 public Button contenteditable(Object value) { 159 super.contenteditable(value); 160 return this; 161 } 162 163 @Override /* Overridden from HtmlElement */ 164 public Button dir(String value) { 165 super.dir(value); 166 return this; 167 } 168 169 /** 170 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-fe-disabled">disabled</a> attribute. 171 * 172 * <p> 173 * Whether the form control is disabled. 174 * 175 * <p> 176 * This attribute uses deminimized values: 177 * <ul> 178 * <li><jk>false</jk> - Attribute is not added</li> 179 * <li><jk>true</jk> - Attribute is added as <js>"disabled"</js></li> 180 * <li>Other values - Passed through as-is</li> 181 * </ul> 182 * 183 * @param value 184 * The new value for this attribute. 185 * Typically a {@link Boolean} or {@link String}. 186 * @return This object. 187 */ 188 public Button disabled(Object value) { 189 attr("disabled", deminimize(value, "disabled")); 190 return this; 191 } 192 193 /** 194 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-fae-form">form</a> attribute. 195 * 196 * <p> 197 * Associates the button with a form element by specifying the form's ID. This allows the button 198 * to be placed outside the form element while still being part of the form submission. 199 * 200 * <p> 201 * The value should match the ID of a form element in the same document. 202 * 203 * @param value The ID of the form element to associate with this button. 204 * @return This object. 205 */ 206 public Button form(String value) { 207 attr("form", value); 208 return this; 209 } 210 211 /** 212 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-fs-formaction">formaction</a> attribute. 213 * 214 * <p> 215 * Specifies the URL where the form data will be submitted when this button is clicked. 216 * Overrides the form's action attribute. 217 * 218 * <p> 219 * The value can be of any of the following types: {@link URI}, {@link URL}, {@link String}. 220 * Strings must be valid URIs. 221 * 222 * <p> 223 * URIs defined by {@link UriResolver} can be used for values. 224 * 225 * @param value The URL where the form data will be submitted. 226 * @return This object. 227 */ 228 public Button formaction(String value) { 229 attrUri("formaction", value); 230 return this; 231 } 232 233 /** 234 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-fs-formenctype">formenctype</a> attribute. 235 * 236 * <p> 237 * Specifies how form data should be encoded when submitted. Overrides the form's enctype attribute. 238 * 239 * <p> 240 * Possible values: 241 * <ul> 242 * <li><js>"application/x-www-form-urlencoded"</js> - Default encoding (default)</li> 243 * <li><js>"multipart/form-data"</js> - For file uploads</li> 244 * <li><js>"text/plain"</js> - Plain text encoding</li> 245 * </ul> 246 * 247 * @param value The encoding type for form submission. 248 * @return This object. 249 */ 250 public Button formenctype(String value) { 251 attr("formenctype", value); 252 return this; 253 } 254 255 /** 256 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-fs-formmethod">formmethod</a> attribute. 257 * 258 * <p> 259 * Specifies the HTTP method to use for form submission. Overrides the form's method attribute. 260 * 261 * <p> 262 * Possible values: 263 * <ul> 264 * <li><js>"get"</js> - Form data is sent as URL parameters</li> 265 * <li><js>"post"</js> - Form data is sent in the request body (default)</li> 266 * <li><js>"dialog"</js> - Used for forms within dialog elements</li> 267 * </ul> 268 * 269 * @param value The HTTP method for form submission. 270 * @return This object. 271 */ 272 public Button formmethod(String value) { 273 attr("formmethod", value); 274 return this; 275 } 276 277 /** 278 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-fs-formnovalidate">formnovalidate</a> 279 * attribute. 280 * 281 * <p> 282 * Specifies that form validation should be bypassed when this button submits the form. 283 * Overrides the form's novalidate attribute. 284 * 285 * <p> 286 * This attribute uses deminimized values: 287 * <ul> 288 * <li><jk>false</jk> - Form validation is performed (default)</li> 289 * <li><jk>true</jk> - Form validation is bypassed</li> 290 * <li>Other values - Passed through as-is</li> 291 * </ul> 292 * 293 * @param value Whether to bypass form validation. 294 * @return This object. 295 */ 296 public Button formnovalidate(String value) { 297 attr("formnovalidate", value); 298 return this; 299 } 300 301 /** 302 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-fs-formtarget">formtarget</a> attribute. 303 * 304 * <p> 305 * Specifies where to display the form response after submission. Overrides the form's target attribute. 306 * 307 * <p> 308 * Common values: 309 * <ul> 310 * <li><js>"_blank"</js> - Open in a new window/tab</li> 311 * <li><js>"_self"</js> - Open in the same frame (default)</li> 312 * <li><js>"_parent"</js> - Open in the parent frame</li> 313 * <li><js>"_top"</js> - Open in the full body of the window</li> 314 * <li><js>"framename"</js> - Open in a named frame</li> 315 * </ul> 316 * 317 * @param value Where to display the form response. 318 * @return This object. 319 */ 320 public Button formtarget(String value) { 321 attr("formtarget", value); 322 return this; 323 } 324 325 @Override /* Overridden from HtmlElement */ 326 public Button hidden(Object value) { 327 super.hidden(value); 328 return this; 329 } 330 331 @Override /* Overridden from HtmlElement */ 332 public Button id(String value) { 333 super.id(value); 334 return this; 335 } 336 337 @Override /* Overridden from HtmlElement */ 338 public Button lang(String value) { 339 super.lang(value); 340 return this; 341 } 342 343 /** 344 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-fs-menu">menu</a> attribute. 345 * 346 * <p> 347 * Specifies the ID of a menu element that should be displayed as a pop-up menu 348 * when the button is activated. 349 * 350 * <p> 351 * The value should match the ID of a menu element in the same document. 352 * 353 * @param value The ID of the menu element to display as a pop-up. 354 * @return This object. 355 */ 356 public Button menu(String value) { 357 attr("menu", value); 358 return this; 359 } 360 361 /** 362 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-fe-name">name</a> attribute. 363 * 364 * <p> 365 * Specifies the name of the button. This name is used when the form is submitted and 366 * can be used to access the element via the form.elements API. 367 * 368 * <p> 369 * The name should be unique within the form and should not contain spaces or special characters. 370 * 371 * @param value The name of the button for submission and API access. 372 * @return This object. 373 */ 374 public Button name(String value) { 375 attr("name", value); 376 return this; 377 } 378 379 @Override /* Overridden from HtmlElement */ 380 public Button onabort(String value) { 381 super.onabort(value); 382 return this; 383 } 384 385 @Override /* Overridden from HtmlElement */ 386 public Button onblur(String value) { 387 super.onblur(value); 388 return this; 389 } 390 391 @Override /* Overridden from HtmlElement */ 392 public Button oncancel(String value) { 393 super.oncancel(value); 394 return this; 395 } 396 397 @Override /* Overridden from HtmlElement */ 398 public Button oncanplay(String value) { 399 super.oncanplay(value); 400 return this; 401 } 402 403 @Override /* Overridden from HtmlElement */ 404 public Button oncanplaythrough(String value) { 405 super.oncanplaythrough(value); 406 return this; 407 } 408 409 @Override /* Overridden from HtmlElement */ 410 public Button onchange(String value) { 411 super.onchange(value); 412 return this; 413 } 414 415 @Override /* Overridden from HtmlElement */ 416 public Button onclick(String value) { 417 super.onclick(value); 418 return this; 419 } 420 421 @Override /* Overridden from HtmlElement */ 422 public Button oncuechange(String value) { 423 super.oncuechange(value); 424 return this; 425 } 426 427 @Override /* Overridden from HtmlElement */ 428 public Button ondblclick(String value) { 429 super.ondblclick(value); 430 return this; 431 } 432 433 @Override /* Overridden from HtmlElement */ 434 public Button ondurationchange(String value) { 435 super.ondurationchange(value); 436 return this; 437 } 438 439 @Override /* Overridden from HtmlElement */ 440 public Button onemptied(String value) { 441 super.onemptied(value); 442 return this; 443 } 444 445 @Override /* Overridden from HtmlElement */ 446 public Button onended(String value) { 447 super.onended(value); 448 return this; 449 } 450 451 @Override /* Overridden from HtmlElement */ 452 public Button onerror(String value) { 453 super.onerror(value); 454 return this; 455 } 456 457 @Override /* Overridden from HtmlElement */ 458 public Button onfocus(String value) { 459 super.onfocus(value); 460 return this; 461 } 462 463 @Override /* Overridden from HtmlElement */ 464 public Button oninput(String value) { 465 super.oninput(value); 466 return this; 467 } 468 469 @Override /* Overridden from HtmlElement */ 470 public Button oninvalid(String value) { 471 super.oninvalid(value); 472 return this; 473 } 474 475 @Override /* Overridden from HtmlElement */ 476 public Button onkeydown(String value) { 477 super.onkeydown(value); 478 return this; 479 } 480 481 @Override /* Overridden from HtmlElement */ 482 public Button onkeypress(String value) { 483 super.onkeypress(value); 484 return this; 485 } 486 487 @Override /* Overridden from HtmlElement */ 488 public Button onkeyup(String value) { 489 super.onkeyup(value); 490 return this; 491 } 492 493 @Override /* Overridden from HtmlElement */ 494 public Button onload(String value) { 495 super.onload(value); 496 return this; 497 } 498 499 @Override /* Overridden from HtmlElement */ 500 public Button onloadeddata(String value) { 501 super.onloadeddata(value); 502 return this; 503 } 504 505 @Override /* Overridden from HtmlElement */ 506 public Button onloadedmetadata(String value) { 507 super.onloadedmetadata(value); 508 return this; 509 } 510 511 @Override /* Overridden from HtmlElement */ 512 public Button onloadstart(String value) { 513 super.onloadstart(value); 514 return this; 515 } 516 517 @Override /* Overridden from HtmlElement */ 518 public Button onmousedown(String value) { 519 super.onmousedown(value); 520 return this; 521 } 522 523 @Override /* Overridden from HtmlElement */ 524 public Button onmouseenter(String value) { 525 super.onmouseenter(value); 526 return this; 527 } 528 529 @Override /* Overridden from HtmlElement */ 530 public Button onmouseleave(String value) { 531 super.onmouseleave(value); 532 return this; 533 } 534 535 @Override /* Overridden from HtmlElement */ 536 public Button onmousemove(String value) { 537 super.onmousemove(value); 538 return this; 539 } 540 541 @Override /* Overridden from HtmlElement */ 542 public Button onmouseout(String value) { 543 super.onmouseout(value); 544 return this; 545 } 546 547 @Override /* Overridden from HtmlElement */ 548 public Button onmouseover(String value) { 549 super.onmouseover(value); 550 return this; 551 } 552 553 @Override /* Overridden from HtmlElement */ 554 public Button onmouseup(String value) { 555 super.onmouseup(value); 556 return this; 557 } 558 559 @Override /* Overridden from HtmlElement */ 560 public Button onmousewheel(String value) { 561 super.onmousewheel(value); 562 return this; 563 } 564 565 @Override /* Overridden from HtmlElement */ 566 public Button onpause(String value) { 567 super.onpause(value); 568 return this; 569 } 570 571 @Override /* Overridden from HtmlElement */ 572 public Button onplay(String value) { 573 super.onplay(value); 574 return this; 575 } 576 577 @Override /* Overridden from HtmlElement */ 578 public Button onplaying(String value) { 579 super.onplaying(value); 580 return this; 581 } 582 583 @Override /* Overridden from HtmlElement */ 584 public Button onprogress(String value) { 585 super.onprogress(value); 586 return this; 587 } 588 589 @Override /* Overridden from HtmlElement */ 590 public Button onratechange(String value) { 591 super.onratechange(value); 592 return this; 593 } 594 595 @Override /* Overridden from HtmlElement */ 596 public Button onreset(String value) { 597 super.onreset(value); 598 return this; 599 } 600 601 @Override /* Overridden from HtmlElement */ 602 public Button onresize(String value) { 603 super.onresize(value); 604 return this; 605 } 606 607 @Override /* Overridden from HtmlElement */ 608 public Button onscroll(String value) { 609 super.onscroll(value); 610 return this; 611 } 612 613 @Override /* Overridden from HtmlElement */ 614 public Button onseeked(String value) { 615 super.onseeked(value); 616 return this; 617 } 618 619 @Override /* Overridden from HtmlElement */ 620 public Button onseeking(String value) { 621 super.onseeking(value); 622 return this; 623 } 624 625 @Override /* Overridden from HtmlElement */ 626 public Button onselect(String value) { 627 super.onselect(value); 628 return this; 629 } 630 631 @Override /* Overridden from HtmlElement */ 632 public Button onshow(String value) { 633 super.onshow(value); 634 return this; 635 } 636 637 @Override /* Overridden from HtmlElement */ 638 public Button onstalled(String value) { 639 super.onstalled(value); 640 return this; 641 } 642 643 @Override /* Overridden from HtmlElement */ 644 public Button onsubmit(String value) { 645 super.onsubmit(value); 646 return this; 647 } 648 649 @Override /* Overridden from HtmlElement */ 650 public Button onsuspend(String value) { 651 super.onsuspend(value); 652 return this; 653 } 654 655 @Override /* Overridden from HtmlElement */ 656 public Button ontimeupdate(String value) { 657 super.ontimeupdate(value); 658 return this; 659 } 660 661 @Override /* Overridden from HtmlElement */ 662 public Button ontoggle(String value) { 663 super.ontoggle(value); 664 return this; 665 } 666 667 @Override /* Overridden from HtmlElement */ 668 public Button onvolumechange(String value) { 669 super.onvolumechange(value); 670 return this; 671 } 672 673 @Override /* Overridden from HtmlElement */ 674 public Button onwaiting(String value) { 675 super.onwaiting(value); 676 return this; 677 } 678 679 @Override /* Overridden from HtmlElement */ 680 public Button spellcheck(Object value) { 681 super.spellcheck(value); 682 return this; 683 } 684 685 @Override /* Overridden from HtmlElement */ 686 public Button style(String value) { 687 super.style(value); 688 return this; 689 } 690 691 @Override /* Overridden from HtmlElement */ 692 public Button tabindex(Object value) { 693 super.tabindex(value); 694 return this; 695 } 696 697 @Override /* Overridden from HtmlElement */ 698 public Button title(String value) { 699 super.title(value); 700 return this; 701 } 702 703 @Override /* Overridden from HtmlElement */ 704 public Button translate(Object value) { 705 super.translate(value); 706 return this; 707 } 708 709 /** 710 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-button-type">type</a> attribute. 711 * 712 * <p> 713 * Specifies the type of button and its behavior when clicked. 714 * 715 * <p> 716 * Possible values: 717 * <ul> 718 * <li><js>"submit"</js> - Submits the form (default)</li> 719 * <li><js>"reset"</js> - Resets the form to its initial state</li> 720 * <li><js>"button"</js> - Generic button with no default behavior</li> 721 * </ul> 722 * 723 * @param value The type of button and its behavior. 724 * @return This object. 725 */ 726 public Button type(String value) { 727 attr("type", value); 728 return this; 729 } 730 731 /** 732 * <a class="doclink" href="https://www.w3.org/TR/html5/forms.html#attr-button-value">value</a> attribute. 733 * 734 * <p> 735 * Value to be used for form submission. 736 * 737 * @param value 738 * The new value for this attribute. 739 * Typically a {@link Number} or {@link String}. 740 * @return This object. 741 */ 742 public Button value(Object value) { 743 attr("value", value); 744 return this; 745 } 746}