@aurodesignsystem-dev/auro-formkit 0.0.0-pr593.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +314 -0
- package/components/bibtemplate/dist/auro-bibtemplate.d.ts +39 -0
- package/components/bibtemplate/dist/headerVersion.d.ts +2 -0
- package/components/bibtemplate/dist/iconVersion.d.ts +2 -0
- package/components/bibtemplate/dist/index.d.ts +2 -0
- package/components/bibtemplate/dist/index.js +709 -0
- package/components/bibtemplate/dist/registered.js +709 -0
- package/components/bibtemplate/dist/styles/color-css.d.ts +2 -0
- package/components/bibtemplate/dist/styles/style-css.d.ts +2 -0
- package/components/bibtemplate/dist/styles/tokens-css.d.ts +2 -0
- package/components/checkbox/README.md +142 -0
- package/components/checkbox/demo/api.html +55 -0
- package/components/checkbox/demo/api.js +17 -0
- package/components/checkbox/demo/api.md +401 -0
- package/components/checkbox/demo/api.min.js +1833 -0
- package/components/checkbox/demo/index.html +51 -0
- package/components/checkbox/demo/index.js +8 -0
- package/components/checkbox/demo/index.md +327 -0
- package/components/checkbox/demo/index.min.js +1808 -0
- package/components/checkbox/demo/readme.html +50 -0
- package/components/checkbox/demo/readme.md +142 -0
- package/components/checkbox/dist/auro-checkbox-group.d.ts +166 -0
- package/components/checkbox/dist/auro-checkbox.d.ts +129 -0
- package/components/checkbox/dist/helptextVersion.d.ts +2 -0
- package/components/checkbox/dist/index.d.ts +3 -0
- package/components/checkbox/dist/index.js +1757 -0
- package/components/checkbox/dist/registered.js +1758 -0
- package/components/checkbox/dist/styles/auro-checkbox-css.d.ts +2 -0
- package/components/checkbox/dist/styles/auro-checkbox-group-css.d.ts +2 -0
- package/components/checkbox/dist/styles/color-css.d.ts +2 -0
- package/components/checkbox/dist/styles/colorGroup-css.d.ts +2 -0
- package/components/checkbox/dist/styles/tokens-css.d.ts +2 -0
- package/components/combobox/README.md +152 -0
- package/components/combobox/demo/api.html +57 -0
- package/components/combobox/demo/api.js +36 -0
- package/components/combobox/demo/api.md +1209 -0
- package/components/combobox/demo/api.min.js +15117 -0
- package/components/combobox/demo/index.html +56 -0
- package/components/combobox/demo/index.js +26 -0
- package/components/combobox/demo/index.md +621 -0
- package/components/combobox/demo/index.min.js +14971 -0
- package/components/combobox/demo/readme.html +50 -0
- package/components/combobox/demo/readme.md +152 -0
- package/components/combobox/dist/auro-combobox.d.ts +384 -0
- package/components/combobox/dist/bibtemplateVersion.d.ts +2 -0
- package/components/combobox/dist/dropdownVersion.d.ts +2 -0
- package/components/combobox/dist/index.d.ts +2 -0
- package/components/combobox/dist/index.js +13554 -0
- package/components/combobox/dist/inputVersion.d.ts +2 -0
- package/components/combobox/dist/registered.js +13556 -0
- package/components/combobox/dist/styles/style-css.d.ts +2 -0
- package/components/counter/README.md +146 -0
- package/components/counter/demo/api.html +54 -0
- package/components/counter/demo/api.js +20 -0
- package/components/counter/demo/api.md +584 -0
- package/components/counter/demo/api.min.js +7111 -0
- package/components/counter/demo/index.html +54 -0
- package/components/counter/demo/index.js +21 -0
- package/components/counter/demo/index.md +244 -0
- package/components/counter/demo/index.min.js +7075 -0
- package/components/counter/demo/readme.html +50 -0
- package/components/counter/demo/readme.md +146 -0
- package/components/counter/dist/auro-counter-button.d.ts +12 -0
- package/components/counter/dist/auro-counter-group.d.ts +235 -0
- package/components/counter/dist/auro-counter-wrapper.d.ts +22 -0
- package/components/counter/dist/auro-counter.d.ts +97 -0
- package/components/counter/dist/bibtemplateVersion.d.ts +2 -0
- package/components/counter/dist/dropdownVersion.d.ts +2 -0
- package/components/counter/dist/iconVersion.d.ts +2 -0
- package/components/counter/dist/index.d.ts +3 -0
- package/components/counter/dist/index.js +7018 -0
- package/components/counter/dist/registered.js +7019 -0
- package/components/counter/dist/styles/color-css.d.ts +2 -0
- package/components/counter/dist/styles/counter-button-color-css.d.ts +2 -0
- package/components/counter/dist/styles/counter-button-css.d.ts +2 -0
- package/components/counter/dist/styles/counter-group-css.d.ts +2 -0
- package/components/counter/dist/styles/counter-wrapper-color-css.d.ts +2 -0
- package/components/counter/dist/styles/counter-wrapper-css.d.ts +2 -0
- package/components/counter/dist/styles/style-css.d.ts +2 -0
- package/components/counter/dist/styles/tokens-css.d.ts +2 -0
- package/components/datepicker/README.md +140 -0
- package/components/datepicker/demo/api.html +57 -0
- package/components/datepicker/demo/api.js +35 -0
- package/components/datepicker/demo/api.md +1479 -0
- package/components/datepicker/demo/api.min.js +24534 -0
- package/components/datepicker/demo/index.html +56 -0
- package/components/datepicker/demo/index.js +19 -0
- package/components/datepicker/demo/index.md +112 -0
- package/components/datepicker/demo/index.min.js +24255 -0
- package/components/datepicker/demo/readme.html +50 -0
- package/components/datepicker/demo/readme.md +140 -0
- package/components/datepicker/dist/auro-calendar-cell.d.ts +163 -0
- package/components/datepicker/dist/auro-calendar-month.d.ts +20 -0
- package/components/datepicker/dist/auro-calendar.d.ts +133 -0
- package/components/datepicker/dist/auro-datepicker.d.ts +466 -0
- package/components/datepicker/dist/bibtemplateVersion.d.ts +2 -0
- package/components/datepicker/dist/buttonVersion.d.ts +2 -0
- package/components/datepicker/dist/dropdownVersion.d.ts +2 -0
- package/components/datepicker/dist/index.d.ts +2 -0
- package/components/datepicker/dist/index.js +24185 -0
- package/components/datepicker/dist/inputVersion.d.ts +2 -0
- package/components/datepicker/dist/popoverVersion.d.ts +2 -0
- package/components/datepicker/dist/registered.js +24185 -0
- package/components/datepicker/dist/styles/color-calendar-css.d.ts +2 -0
- package/components/datepicker/dist/styles/color-cell-css.d.ts +2 -0
- package/components/datepicker/dist/styles/color-css.d.ts +2 -0
- package/components/datepicker/dist/styles/color-month-css.d.ts +2 -0
- package/components/datepicker/dist/styles/style-auro-calendar-cell-css.d.ts +2 -0
- package/components/datepicker/dist/styles/style-auro-calendar-css.d.ts +2 -0
- package/components/datepicker/dist/styles/style-auro-calendar-month-css.d.ts +2 -0
- package/components/datepicker/dist/styles/style-css.d.ts +2 -0
- package/components/datepicker/dist/styles/tokens-css.d.ts +2 -0
- package/components/datepicker/dist/utilities.d.ts +78 -0
- package/components/datepicker/dist/utilitiesCalendar.d.ts +38 -0
- package/components/datepicker/dist/utilitiesCalendarRender.d.ts +50 -0
- package/components/datepicker/dist/vendor/wc-range-datepicker/day.d.ts +5 -0
- package/components/datepicker/dist/vendor/wc-range-datepicker/range-datepicker-calendar.d.ts +60 -0
- package/components/datepicker/dist/vendor/wc-range-datepicker/range-datepicker-cell.d.ts +1 -0
- package/components/datepicker/dist/vendor/wc-range-datepicker/range-datepicker.d.ts +57 -0
- package/components/dropdown/README.md +144 -0
- package/components/dropdown/demo/api.html +57 -0
- package/components/dropdown/demo/api.js +21 -0
- package/components/dropdown/demo/api.md +1434 -0
- package/components/dropdown/demo/api.min.js +3826 -0
- package/components/dropdown/demo/index.html +55 -0
- package/components/dropdown/demo/index.js +19 -0
- package/components/dropdown/demo/index.md +510 -0
- package/components/dropdown/demo/index.min.js +3789 -0
- package/components/dropdown/demo/readme.html +50 -0
- package/components/dropdown/demo/readme.md +144 -0
- package/components/dropdown/dist/auro-dropdown.d.ts +406 -0
- package/components/dropdown/dist/auro-dropdownBib.d.ts +46 -0
- package/components/dropdown/dist/dropdownVersion.d.ts +2 -0
- package/components/dropdown/dist/helptextVersion.d.ts +2 -0
- package/components/dropdown/dist/iconVersion.d.ts +2 -0
- package/components/dropdown/dist/index.d.ts +2 -0
- package/components/dropdown/dist/index.js +3734 -0
- package/components/dropdown/dist/registered.js +3734 -0
- package/components/dropdown/dist/styles/bibColors-css.d.ts +2 -0
- package/components/dropdown/dist/styles/bibStyles-css.d.ts +2 -0
- package/components/dropdown/dist/styles/color-css.d.ts +2 -0
- package/components/dropdown/dist/styles/style-css.d.ts +2 -0
- package/components/dropdown/dist/styles/tokens-css.d.ts +2 -0
- package/components/form/README.md +142 -0
- package/components/form/demo/api.html +49 -0
- package/components/form/demo/api.js +3 -0
- package/components/form/demo/api.md +51 -0
- package/components/form/demo/api.min.js +638 -0
- package/components/form/demo/autocomplete.html +15 -0
- package/components/form/demo/index.html +50 -0
- package/components/form/demo/index.js +4 -0
- package/components/form/demo/index.md +403 -0
- package/components/form/demo/index.min.js +639 -0
- package/components/form/demo/readme.html +50 -0
- package/components/form/demo/readme.md +142 -0
- package/components/form/demo/registerDemoDeps.js +23 -0
- package/components/form/demo/working.html +118 -0
- package/components/form/dist/auro-form.d.ts +223 -0
- package/components/form/dist/index.d.ts +2 -0
- package/components/form/dist/index.js +614 -0
- package/components/form/dist/registered.d.ts +1 -0
- package/components/form/dist/registered.js +614 -0
- package/components/form/dist/styles/style-css.d.ts +2 -0
- package/components/helptext/dist/auro-helptext.d.ts +61 -0
- package/components/helptext/dist/index.d.ts +2 -0
- package/components/helptext/dist/index.js +209 -0
- package/components/helptext/dist/registered.js +209 -0
- package/components/helptext/dist/styles/color-css.d.ts +2 -0
- package/components/helptext/dist/styles/style-css.d.ts +2 -0
- package/components/helptext/dist/styles/tokens-css.d.ts +2 -0
- package/components/input/README.md +135 -0
- package/components/input/demo/api.html +42 -0
- package/components/input/demo/api.js +29 -0
- package/components/input/demo/api.md +1252 -0
- package/components/input/demo/api.min.js +7238 -0
- package/components/input/demo/index.html +43 -0
- package/components/input/demo/index.js +20 -0
- package/components/input/demo/index.md +202 -0
- package/components/input/demo/index.min.js +7157 -0
- package/components/input/demo/readme.html +50 -0
- package/components/input/demo/readme.md +135 -0
- package/components/input/dist/auro-input.d.ts +31 -0
- package/components/input/dist/base-input.d.ts +512 -0
- package/components/input/dist/buttonVersion.d.ts +2 -0
- package/components/input/dist/helptextVersion.d.ts +2 -0
- package/components/input/dist/i18n.d.ts +18 -0
- package/components/input/dist/iconVersion.d.ts +2 -0
- package/components/input/dist/index.d.ts +2 -0
- package/components/input/dist/index.js +7063 -0
- package/components/input/dist/registered.js +7063 -0
- package/components/input/dist/styles/borders-css.d.ts +2 -0
- package/components/input/dist/styles/color-css.d.ts +2 -0
- package/components/input/dist/styles/input-css.d.ts +2 -0
- package/components/input/dist/styles/label-css.d.ts +2 -0
- package/components/input/dist/styles/mixins-css.d.ts +2 -0
- package/components/input/dist/styles/notificationIcons-css.d.ts +2 -0
- package/components/input/dist/styles/style-css.d.ts +2 -0
- package/components/input/dist/styles/tokens-css.d.ts +2 -0
- package/components/input/dist/utilities.d.ts +25 -0
- package/components/menu/README.md +145 -0
- package/components/menu/demo/api.html +55 -0
- package/components/menu/demo/api.js +27 -0
- package/components/menu/demo/api.md +954 -0
- package/components/menu/demo/api.min.js +1538 -0
- package/components/menu/demo/index.html +52 -0
- package/components/menu/demo/index.js +28 -0
- package/components/menu/demo/index.md +61 -0
- package/components/menu/demo/index.min.js +1484 -0
- package/components/menu/demo/readme.html +50 -0
- package/components/menu/demo/readme.md +145 -0
- package/components/menu/dist/auro-menu-utils.d.ts +42 -0
- package/components/menu/dist/auro-menu.d.ts +205 -0
- package/components/menu/dist/auro-menuoption.d.ts +63 -0
- package/components/menu/dist/dropdownVersion.d.ts +2 -0
- package/components/menu/dist/iconVersion.d.ts +2 -0
- package/components/menu/dist/index.d.ts +4 -0
- package/components/menu/dist/index.js +1426 -0
- package/components/menu/dist/registered.js +1427 -0
- package/components/menu/dist/styles/color-menu-css.d.ts +2 -0
- package/components/menu/dist/styles/color-menuoption-css.d.ts +2 -0
- package/components/menu/dist/styles/style-menu-css.d.ts +2 -0
- package/components/menu/dist/styles/style-menuoption-css.d.ts +2 -0
- package/components/menu/dist/styles/tokens-css.d.ts +2 -0
- package/components/radio/README.md +137 -0
- package/components/radio/demo/api.html +53 -0
- package/components/radio/demo/api.js +19 -0
- package/components/radio/demo/api.md +562 -0
- package/components/radio/demo/api.min.js +1944 -0
- package/components/radio/demo/index.html +50 -0
- package/components/radio/demo/index.js +8 -0
- package/components/radio/demo/index.md +150 -0
- package/components/radio/demo/index.min.js +1901 -0
- package/components/radio/demo/readme.html +50 -0
- package/components/radio/demo/readme.md +137 -0
- package/components/radio/dist/auro-radio-group.d.ts +194 -0
- package/components/radio/dist/auro-radio.d.ts +144 -0
- package/components/radio/dist/helptextVersion.d.ts +2 -0
- package/components/radio/dist/index.d.ts +3 -0
- package/components/radio/dist/index.js +1850 -0
- package/components/radio/dist/registered.js +1851 -0
- package/components/radio/dist/styles/auro-radio-group-css.d.ts +2 -0
- package/components/radio/dist/styles/color-css.d.ts +2 -0
- package/components/radio/dist/styles/groupColor-css.d.ts +2 -0
- package/components/radio/dist/styles/style-css.d.ts +2 -0
- package/components/radio/dist/styles/tokens-css.d.ts +2 -0
- package/components/select/README.md +144 -0
- package/components/select/demo/api.html +71 -0
- package/components/select/demo/api.js +35 -0
- package/components/select/demo/api.md +1313 -0
- package/components/select/demo/api.min.js +7763 -0
- package/components/select/demo/index.html +66 -0
- package/components/select/demo/index.js +9 -0
- package/components/select/demo/index.md +815 -0
- package/components/select/demo/index.min.js +7651 -0
- package/components/select/demo/readme.html +50 -0
- package/components/select/demo/readme.md +144 -0
- package/components/select/dist/auro-select.d.ts +359 -0
- package/components/select/dist/bibtemplateVersion.d.ts +2 -0
- package/components/select/dist/dropdownVersion.d.ts +2 -0
- package/components/select/dist/index.d.ts +2 -0
- package/components/select/dist/index.js +6300 -0
- package/components/select/dist/registered.js +6300 -0
- package/components/select/dist/styles/style-css.d.ts +2 -0
- package/package.json +217 -0
- package/packages/build-tools/src/postinstall.mjs +12 -0
|
@@ -0,0 +1,614 @@
|
|
|
1
|
+
import { css, LitElement, html } from 'lit';
|
|
2
|
+
|
|
3
|
+
var styleCss = css`:focus:not(:focus-visible){outline:3px solid transparent}`;
|
|
4
|
+
|
|
5
|
+
// Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
|
|
6
|
+
// See LICENSE in the project root for license information.
|
|
7
|
+
|
|
8
|
+
// ---------------------------------------------------------------------
|
|
9
|
+
|
|
10
|
+
/* eslint-disable line-comment-position, no-inline-comments, no-confusing-arrow, no-nested-ternary, implicit-arrow-linebreak */
|
|
11
|
+
|
|
12
|
+
class AuroLibraryRuntimeUtils {
|
|
13
|
+
|
|
14
|
+
/* eslint-disable jsdoc/require-param */
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* This will register a new custom element with the browser.
|
|
18
|
+
* @param {String} name - The name of the custom element.
|
|
19
|
+
* @param {Object} componentClass - The class to register as a custom element.
|
|
20
|
+
* @returns {void}
|
|
21
|
+
*/
|
|
22
|
+
registerComponent(name, componentClass) {
|
|
23
|
+
if (!customElements.get(name)) {
|
|
24
|
+
customElements.define(name, class extends componentClass {});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Finds and returns the closest HTML Element based on a selector.
|
|
30
|
+
* @returns {void}
|
|
31
|
+
*/
|
|
32
|
+
closestElement(
|
|
33
|
+
selector, // selector like in .closest()
|
|
34
|
+
base = this, // extra functionality to skip a parent
|
|
35
|
+
__Closest = (el, found = el && el.closest(selector)) =>
|
|
36
|
+
!el || el === document || el === window
|
|
37
|
+
? null // standard .closest() returns null for non-found selectors also
|
|
38
|
+
: found
|
|
39
|
+
? found // found a selector INside this element
|
|
40
|
+
: __Closest(el.getRootNode().host) // recursion!! break out to parent DOM
|
|
41
|
+
) {
|
|
42
|
+
return __Closest(base);
|
|
43
|
+
}
|
|
44
|
+
/* eslint-enable jsdoc/require-param */
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* If the element passed is registered with a different tag name than what is passed in, the tag name is added as an attribute to the element.
|
|
48
|
+
* @param {Object} elem - The element to check.
|
|
49
|
+
* @param {String} tagName - The name of the Auro component to check for or add as an attribute.
|
|
50
|
+
* @returns {void}
|
|
51
|
+
*/
|
|
52
|
+
handleComponentTagRename(elem, tagName) {
|
|
53
|
+
const tag = tagName.toLowerCase();
|
|
54
|
+
const elemTag = elem.tagName.toLowerCase();
|
|
55
|
+
|
|
56
|
+
if (elemTag !== tag) {
|
|
57
|
+
elem.setAttribute(tag, true);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Validates if an element is a specific Auro component.
|
|
63
|
+
* @param {Object} elem - The element to validate.
|
|
64
|
+
* @param {String} tagName - The name of the Auro component to check against.
|
|
65
|
+
* @returns {Boolean} - Returns true if the element is the specified Auro component.
|
|
66
|
+
*/
|
|
67
|
+
elementMatch(elem, tagName) {
|
|
68
|
+
const tag = tagName.toLowerCase();
|
|
69
|
+
const elemTag = elem.tagName.toLowerCase();
|
|
70
|
+
|
|
71
|
+
return elemTag === tag || elem.hasAttribute(tag);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* eslint-disable no-underscore-dangle,max-lines */
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @typedef {Object} FormStateMember - The form state member.
|
|
80
|
+
* @property {string | number | boolean | string[] | null} value - The value of the form element.
|
|
81
|
+
* @property {ValidityState} validity - The validity state of the form element, stored when fired from the form element.
|
|
82
|
+
* @property {boolean} required - Whether the form element is required or not.
|
|
83
|
+
* @property {HTMLElement} element - Whether the form element is required or not.
|
|
84
|
+
*/
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @typedef {Object.<string, FormStateMember>} FormState - The form state.
|
|
88
|
+
*/
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
// See https://git.io/JJ6SJ for "How to document your components using JSDoc"
|
|
92
|
+
/**
|
|
93
|
+
* The auro-form element provides users a way to ... (it would be great if you fill this out).
|
|
94
|
+
*
|
|
95
|
+
* @attr {Boolean} fixed - Uses fixed pixel values for element shape
|
|
96
|
+
* @attr {String} cssClass - Applies designated CSS class to demo element - you want to delete me!
|
|
97
|
+
* @event {Event} change - Fires when form state changes.
|
|
98
|
+
*/
|
|
99
|
+
|
|
100
|
+
// build the component class
|
|
101
|
+
class AuroForm extends LitElement {
|
|
102
|
+
static get properties() {
|
|
103
|
+
return {
|
|
104
|
+
formState: { attribute: false },
|
|
105
|
+
_validity: { attribute: false },
|
|
106
|
+
_isInitialState: { attribute: false },
|
|
107
|
+
_elements: { attribute: false },
|
|
108
|
+
_submitElements: { attribute: false },
|
|
109
|
+
_resetElements: { attribute: false },
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
constructor() {
|
|
114
|
+
super();
|
|
115
|
+
|
|
116
|
+
/** @type {FormState} */
|
|
117
|
+
this.formState = {};
|
|
118
|
+
|
|
119
|
+
/** @type {"valid" | "invalid" | null} */
|
|
120
|
+
this._validity = null;
|
|
121
|
+
this._isInitialState = true;
|
|
122
|
+
|
|
123
|
+
/** @type {(HTMLElement & {reset: () => void})[]} */
|
|
124
|
+
this._elements = [];
|
|
125
|
+
|
|
126
|
+
/** @type {HTMLButtonElement[]} */
|
|
127
|
+
this._submitelements = [];
|
|
128
|
+
|
|
129
|
+
/** @type {HTMLButtonElement[]} */
|
|
130
|
+
this._resetElements = [];
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* @private
|
|
134
|
+
* @type {MutationObserver[]}
|
|
135
|
+
*/
|
|
136
|
+
this.mutationObservers = [];
|
|
137
|
+
|
|
138
|
+
// Bind listeners
|
|
139
|
+
this.reset = this.reset.bind(this);
|
|
140
|
+
this.submit = this.submit.bind(this);
|
|
141
|
+
this.sharedInputListener = this.sharedInputListener.bind(this);
|
|
142
|
+
this.sharedValidationListener = this.sharedValidationListener.bind(this);
|
|
143
|
+
this.mutationEventListener = this.mutationEventListener.bind(this);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Note: button is NOT considered a form element in this context
|
|
147
|
+
// as it does not have a .value property.
|
|
148
|
+
static get formElementTags() {
|
|
149
|
+
return [
|
|
150
|
+
'auro-input',
|
|
151
|
+
'auro-select',
|
|
152
|
+
'auro-datepicker',
|
|
153
|
+
'auro-combobox',
|
|
154
|
+
// checkbox and radio are grouped elements
|
|
155
|
+
'auro-checkbox-group',
|
|
156
|
+
'auro-radio-group',
|
|
157
|
+
// while counter is groupable, the group is for min/max values and not for grouped values
|
|
158
|
+
'auro-counter-group'
|
|
159
|
+
];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Compare tag name with element to identify it (for API purposes).
|
|
164
|
+
* @param {string} elementTag - The HTML tag name like `auro-datepicker`.
|
|
165
|
+
* @param {HTMLElement} element - The actual HTML element to compare.
|
|
166
|
+
* @returns {boolean}
|
|
167
|
+
* @private
|
|
168
|
+
*/
|
|
169
|
+
_isElementTag(elementTag, element) {
|
|
170
|
+
return element.tagName.toLowerCase() === elementTag || element.hasAttribute(elementTag.toLowerCase());
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Shared code for determining if an element is something we care about (submit, form element, etc.).
|
|
175
|
+
* @param {string[]} collection - The array to use for tag name search.
|
|
176
|
+
* @param {HTMLElement} element - The element to compare against the master list.
|
|
177
|
+
* @returns {boolean}
|
|
178
|
+
* @private
|
|
179
|
+
*/
|
|
180
|
+
_isInElementCollection(collection, element) {
|
|
181
|
+
return collection.some((elementTag) => this._isElementTag(elementTag, element));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Check if the tag name is a form element.
|
|
186
|
+
* @param {HTMLElement} element - The element to check (attr or tag name).
|
|
187
|
+
* @returns {boolean}
|
|
188
|
+
*/
|
|
189
|
+
isFormElement(element) {
|
|
190
|
+
return this._isInElementCollection(AuroForm.formElementTags, element);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Validates if an event is from a valid form element with a name.
|
|
195
|
+
* @param {Event} event - The event to validate.
|
|
196
|
+
* @returns {boolean} - True if event is valid for processing.
|
|
197
|
+
* @private
|
|
198
|
+
*/
|
|
199
|
+
_eventIsValidFormEvent(event) {
|
|
200
|
+
const targetName = event.target.getAttribute("name");
|
|
201
|
+
return this.isFormElement(event.target) && targetName;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
static get buttonElementTags() {
|
|
206
|
+
return [
|
|
207
|
+
'button',
|
|
208
|
+
'auro-button',
|
|
209
|
+
];
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Check if the tag name is a button element.
|
|
214
|
+
* @param {HTMLElement} element - The element to check.
|
|
215
|
+
* @returns {boolean}
|
|
216
|
+
*/
|
|
217
|
+
isButtonElement(element) {
|
|
218
|
+
return this._isInElementCollection(AuroForm.buttonElementTags, element);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
static get styles() {
|
|
222
|
+
return [styleCss];
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Reduce the form value into a key-value pair.
|
|
227
|
+
*
|
|
228
|
+
* NOTE: form keys use `name` first, and `id` second if `name` is not available.
|
|
229
|
+
* This follows standard HTML5 form behavior - submission uses `name` by default when creating
|
|
230
|
+
* the FormData object.
|
|
231
|
+
*
|
|
232
|
+
* @returns {Record<string, string | number | boolean | string[] | null>} The form value.
|
|
233
|
+
*/
|
|
234
|
+
get value() {
|
|
235
|
+
return Object.keys(this.formState).reduce((acc, key) => {
|
|
236
|
+
acc[key] = this.formState[key].value;
|
|
237
|
+
return acc;
|
|
238
|
+
}, {});
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Getter for internal _submitElements.
|
|
243
|
+
* @returns {HTMLButtonElement[]}
|
|
244
|
+
*/
|
|
245
|
+
get submitElements() {
|
|
246
|
+
return this._submitelements;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Returns a collection of elements that will reset the form
|
|
251
|
+
* @returns {HTMLButtonElement[]}
|
|
252
|
+
*/
|
|
253
|
+
get resetElements() {
|
|
254
|
+
return this._resetElements;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Infer validity status based on current formState.
|
|
259
|
+
* @private
|
|
260
|
+
*/
|
|
261
|
+
_calculateValidity() {
|
|
262
|
+
if (this.isInitialState) {
|
|
263
|
+
this._validity = null;
|
|
264
|
+
} else {
|
|
265
|
+
// go through validity states and return the first invalid state (if any)
|
|
266
|
+
const invalidKey = Object.keys(this.formState).
|
|
267
|
+
find((key) => {
|
|
268
|
+
const formKey = this.formState[key];
|
|
269
|
+
// these are NOT extra parens
|
|
270
|
+
// eslint-disable-next-line no-extra-parens
|
|
271
|
+
return (formKey.validity !== 'valid' && formKey.required) || (formKey.validity !== 'valid' && formKey.value !== null);
|
|
272
|
+
});
|
|
273
|
+
this._validity = invalidKey ? 'invalid' : 'valid';
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Current validity state of the form, based on form element events.
|
|
279
|
+
* @returns {"valid" | "invalid"}
|
|
280
|
+
*/
|
|
281
|
+
get validity() {
|
|
282
|
+
// Force calculate, as sometimes validity won't reflect
|
|
283
|
+
// the latest value while in-between renders.
|
|
284
|
+
this._calculateValidity();
|
|
285
|
+
return this._validity;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
_setInitialState() {
|
|
289
|
+
const anyTainted = Object.keys(this.formState).some((key) => this.formState[key].validity !== null || this.formState[key].value !== null);
|
|
290
|
+
|
|
291
|
+
this._isInitialState = !anyTainted;
|
|
292
|
+
|
|
293
|
+
this._resetElements.forEach((resetElement) => {
|
|
294
|
+
if (resetElement.hasAttribute("disabled")) {
|
|
295
|
+
resetElement.removeAttribute("disabled");
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Mostly internal way to determine if a form is in the initial state.
|
|
302
|
+
* @returns {boolean}
|
|
303
|
+
*/
|
|
304
|
+
get isInitialState() {
|
|
305
|
+
return this._isInitialState;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
setDisabledStateOnButtons() {
|
|
309
|
+
this._resetElements.forEach((element) => {
|
|
310
|
+
if (this.isInitialState) {
|
|
311
|
+
element.setAttribute("disabled", "");
|
|
312
|
+
} else {
|
|
313
|
+
element.removeAttribute("disabled");
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
this._submitelements.forEach((element) => {
|
|
318
|
+
if (this.isInitialState || this.validity !== "valid") {
|
|
319
|
+
element.setAttribute("disabled", "");
|
|
320
|
+
} else {
|
|
321
|
+
element.removeAttribute("disabled");
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Construct the query strings from elements, append them together, execute, and return the NodeList.
|
|
328
|
+
* @returns {NodeList}
|
|
329
|
+
*/
|
|
330
|
+
queryAuroElements() {
|
|
331
|
+
const queries = [
|
|
332
|
+
[
|
|
333
|
+
AuroForm.formElementTags,
|
|
334
|
+
'[name]'
|
|
335
|
+
],
|
|
336
|
+
[
|
|
337
|
+
AuroForm.buttonElementTags,
|
|
338
|
+
'[type=submit]'
|
|
339
|
+
],
|
|
340
|
+
[
|
|
341
|
+
AuroForm.buttonElementTags,
|
|
342
|
+
'[type=reset]'
|
|
343
|
+
]
|
|
344
|
+
];
|
|
345
|
+
|
|
346
|
+
return this.querySelectorAll(queries.flatMap(([
|
|
347
|
+
tags,
|
|
348
|
+
extraAttributes
|
|
349
|
+
]) => tags.map((tag) => `${tag}${extraAttributes}, [${tag}]${extraAttributes}`)).join(', '));
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Store an element in state and on the _elements array.
|
|
354
|
+
* @param {HTMLElement} element - The element to add to our state.
|
|
355
|
+
* @private
|
|
356
|
+
*/
|
|
357
|
+
_addElementToState(element) {
|
|
358
|
+
const targetName = element.getAttribute('name');
|
|
359
|
+
if (this.formState[targetName]) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
this.formState[targetName] = {
|
|
364
|
+
value: element.value || element.getAttribute('value'),
|
|
365
|
+
validity: element.validity || null,
|
|
366
|
+
required: element.hasAttribute('required'),
|
|
367
|
+
// element
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
this._elements.push(element);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Initialize (or reinitialize) the form state.
|
|
375
|
+
*/
|
|
376
|
+
initializeState() {
|
|
377
|
+
this.formState = {};
|
|
378
|
+
this._submitelements = [];
|
|
379
|
+
this._resetElements = [];
|
|
380
|
+
this._elements = [];
|
|
381
|
+
|
|
382
|
+
this.queryAuroElements().forEach((element) => {
|
|
383
|
+
if (this.isFormElement(element)) {
|
|
384
|
+
this._addElementToState(element);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
if (this.isButtonElement(element) && element.getAttribute('type') === 'submit') {
|
|
388
|
+
element.removeEventListener('click', this.submit);
|
|
389
|
+
element.addEventListener('click', this.submit);
|
|
390
|
+
|
|
391
|
+
// Keep record of this element, so we can enable/disable as needed
|
|
392
|
+
this._submitelements.push(element);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
if (this.isButtonElement(element) && element.getAttribute('type') === 'reset') {
|
|
396
|
+
// Keep record of this element, so we can enable/disable as needed
|
|
397
|
+
element.removeEventListener('click', this.reset);
|
|
398
|
+
element.addEventListener('click', this.reset);
|
|
399
|
+
|
|
400
|
+
this._resetElements.push(element);
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
this.dispatchEvent(new Event('change', {
|
|
405
|
+
bubbles: true,
|
|
406
|
+
composed: true,
|
|
407
|
+
cancelable: true
|
|
408
|
+
}));
|
|
409
|
+
|
|
410
|
+
// Set enabled/disabled states on buttons
|
|
411
|
+
this.setDisabledStateOnButtons();
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Reset fires an event called `reset` - just as you would expect from a normal form.
|
|
416
|
+
*/
|
|
417
|
+
reset() {
|
|
418
|
+
const previousValue = this.value;
|
|
419
|
+
this._elements.forEach((element) => element.reset());
|
|
420
|
+
|
|
421
|
+
this.updateComplete.then(() => {
|
|
422
|
+
this.initializeState();
|
|
423
|
+
// Initial state must come first - validity can only be null if initial state is true
|
|
424
|
+
this._setInitialState();
|
|
425
|
+
this._calculateValidity();
|
|
426
|
+
|
|
427
|
+
// Wait for the above changes to run through, then disable submit/reset
|
|
428
|
+
this.updateComplete.then(() => {
|
|
429
|
+
this.setDisabledStateOnButtons();
|
|
430
|
+
|
|
431
|
+
this.dispatchEvent(new CustomEvent('reset', {
|
|
432
|
+
bubbles: true,
|
|
433
|
+
composed: true,
|
|
434
|
+
detail: {
|
|
435
|
+
previousValue
|
|
436
|
+
}
|
|
437
|
+
}));
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Submit fires an event called `submit` - just as you would expect from a normal form.
|
|
444
|
+
*/
|
|
445
|
+
submit() {
|
|
446
|
+
// Steps required to get out of beta:
|
|
447
|
+
// 1. Submit triggers a forced validation on ALL elements
|
|
448
|
+
// 2. Wait for validation to complete (this.updateComplete.then or similar)
|
|
449
|
+
// 3. If still valid, go ahead with submit.
|
|
450
|
+
this._elements.forEach((element) => {
|
|
451
|
+
if (element.tagName.toLowerCase() !== "auro-datepicker") {
|
|
452
|
+
// Next line currently does NOT force
|
|
453
|
+
element.validate();
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
this.dispatchEvent(new CustomEvent('submit', {
|
|
458
|
+
bubbles: true,
|
|
459
|
+
composed: true,
|
|
460
|
+
detail: {
|
|
461
|
+
value: this.value
|
|
462
|
+
}
|
|
463
|
+
}));
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* This will register this element with the browser.
|
|
468
|
+
* @param {string} [name="auro-form"] - The name of element that you want to register to.
|
|
469
|
+
*
|
|
470
|
+
* @example
|
|
471
|
+
* AuroForm.register("custom-form") // this will register this element to <custom-form/>
|
|
472
|
+
*
|
|
473
|
+
*/
|
|
474
|
+
static register(name = "auro-form") {
|
|
475
|
+
AuroLibraryRuntimeUtils.prototype.registerComponent(name, AuroForm);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* Shared input listener for all form elements.
|
|
480
|
+
* @private
|
|
481
|
+
* @param {Event} event - The event that is fired from the form element.
|
|
482
|
+
*/
|
|
483
|
+
sharedInputListener(event) {
|
|
484
|
+
const targetName = event.target.getAttribute("name");
|
|
485
|
+
|
|
486
|
+
// This should only happen if some bubble-up event is fired from inside a form element.
|
|
487
|
+
if (!this._eventIsValidFormEvent(event)) {
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// Occasionally, a form element will emit their event before the form can read data about the form element.
|
|
492
|
+
if (!this.formState[targetName] && this.isFormElement(event.target)) {
|
|
493
|
+
this._addElementToState(event.target);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
// Check special input types and handle their edge cases
|
|
497
|
+
if (this._isElementTag('auro-datepicker', event.target) && event.target.hasAttribute('range')) {
|
|
498
|
+
this.formState[targetName].value = event.target.values;
|
|
499
|
+
} else {
|
|
500
|
+
this.formState[targetName].value = event.target.value;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
this.requestUpdate('formState');
|
|
504
|
+
this.dispatchEvent(new CustomEvent('change', {
|
|
505
|
+
bubbles: true,
|
|
506
|
+
composed: true,
|
|
507
|
+
cancelable: true
|
|
508
|
+
}));
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* Shared validation listener for all form elements.
|
|
513
|
+
* @private
|
|
514
|
+
* @param {Event} event - The event that is fired from the form element.
|
|
515
|
+
*/
|
|
516
|
+
sharedValidationListener(event) {
|
|
517
|
+
const targetName = event.target.getAttribute("name");
|
|
518
|
+
if (!this._eventIsValidFormEvent(event)) {
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
if (!this.formState[targetName]) {
|
|
523
|
+
this._addElementToState(event.target);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
this.formState[targetName].validity = event.detail.validity;
|
|
527
|
+
this._calculateValidity();
|
|
528
|
+
this.requestUpdate('formState');
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
_attachEventListeners() {
|
|
532
|
+
this.queryAuroElements().forEach((element) => {
|
|
533
|
+
// remove any existing event listeners (in case of re-initialization)
|
|
534
|
+
element.removeEventListener('input', this.sharedInputListener);
|
|
535
|
+
element.removeEventListener('auroFormElement-validated', this.sharedValidationListener);
|
|
536
|
+
|
|
537
|
+
// add new event listeners
|
|
538
|
+
element.addEventListener('input', this.sharedInputListener);
|
|
539
|
+
element.addEventListener('auroFormElement-validated', this.sharedValidationListener);
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
firstUpdated(_changedProperties) {
|
|
544
|
+
super.firstUpdated(_changedProperties);
|
|
545
|
+
|
|
546
|
+
this._attachEventListeners();
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
updated(_changedProperties) {
|
|
550
|
+
super.updated(_changedProperties);
|
|
551
|
+
|
|
552
|
+
if (_changedProperties.has("formState")) {
|
|
553
|
+
this._setInitialState();
|
|
554
|
+
|
|
555
|
+
// Automatically infer disabled state now
|
|
556
|
+
this.setDisabledStateOnButtons();
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
if (_changedProperties.has("_validity")) {
|
|
560
|
+
this._setInitialState();
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/**
|
|
565
|
+
* Mutation observer for form elements. Slot change does not trigger unless
|
|
566
|
+
* root-level elements are added/removed. This is a workaround to ensure
|
|
567
|
+
* nested form elements are also observed.
|
|
568
|
+
*
|
|
569
|
+
* @private
|
|
570
|
+
* @returns {void}
|
|
571
|
+
*/
|
|
572
|
+
mutationEventListener() {
|
|
573
|
+
this.initializeState();
|
|
574
|
+
this._attachEventListeners();
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
/**
|
|
578
|
+
* Slot change event listener. This is the main entry point for the form element.
|
|
579
|
+
* @param {Event} event - The slot change event.
|
|
580
|
+
* @returns {void}
|
|
581
|
+
*/
|
|
582
|
+
onSlotChange(event) {
|
|
583
|
+
this.initializeState();
|
|
584
|
+
// Safe to call as we remove and re-add event listeners
|
|
585
|
+
this._attachEventListeners();
|
|
586
|
+
|
|
587
|
+
// Get rid of old observers - we'll create new ones in a moment
|
|
588
|
+
this.mutationObservers.forEach((mo) => mo.disconnect());
|
|
589
|
+
this.mutationObservers = [];
|
|
590
|
+
|
|
591
|
+
const slotNodes = event.currentTarget.assignedNodes();
|
|
592
|
+
slotNodes.forEach((node) => {
|
|
593
|
+
if (node.tagName && !this.isFormElement(node)) {
|
|
594
|
+
const mo = new MutationObserver(this.mutationEventListener);
|
|
595
|
+
mo.observe(node, {
|
|
596
|
+
subtree: true,
|
|
597
|
+
childList: true
|
|
598
|
+
});
|
|
599
|
+
this.mutationObservers.push(mo);
|
|
600
|
+
}
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
// function that renders the HTML and CSS into the scope of the component
|
|
605
|
+
render() {
|
|
606
|
+
return html`
|
|
607
|
+
<form>
|
|
608
|
+
<slot @slotchange="${this.onSlotChange}"></slot>
|
|
609
|
+
</form>
|
|
610
|
+
`;
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
export { AuroForm };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|