@brightspace-ui/core 3.42.0 → 3.43.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -76,6 +76,7 @@ export const DialogMixin = superclass => class extends RtlMixin(superclass) {
76
76
  this._handleDropdownOpenClose = this._handleDropdownOpenClose.bind(this);
77
77
  this._handleMvcDialogOpen = this._handleMvcDialogOpen.bind(this);
78
78
  this._inIframe = false;
79
+ this._isDialogMixin = true;
79
80
  this._isFullHeight = false;
80
81
  this._height = 0;
81
82
  this._left = 0;
@@ -71,6 +71,7 @@ class FormNestedDemo extends LitElement {
71
71
  </div>
72
72
  <d2l-floating-buttons always-float>
73
73
  <d2l-button primary @click=${this._submit}>Save</d2l-button>
74
+ <d2l-button @click=${this._reset}>Reset</d2l-button>
74
75
  </d2l-floating-buttons>
75
76
  </d2l-form>
76
77
  `;
@@ -85,6 +86,10 @@ class FormNestedDemo extends LitElement {
85
86
  e.preventDefault();
86
87
  }
87
88
 
89
+ _reset() {
90
+ if (this.shadowRoot) this.shadowRoot.querySelector('#root').resetValidation();
91
+ }
92
+
88
93
  _submit() {
89
94
  if (this.shadowRoot) this.shadowRoot.querySelector('#root').submit();
90
95
  }
@@ -18,6 +18,7 @@ invalid state.
18
18
  | `name` | String | The name of the form control. Submitted with the form as part of a name/value pair. |
19
19
 
20
20
  **Methods:**
21
+ - `resetValidation()`: Resets any validation errors on the form element. Note that this does not reset any form element value.
21
22
  - `setFormValue(value)`: Sets the current value of the form control. Submitted with the form as part of a name/value pair. `value` may be a:
22
23
  1. An `Object`: `{ 'key1': val, 'key2': val }`
23
24
  - When an `Object` is provided, all keys-value pairs will be submitted. To avoid collision it is recommended that you prefix each key with the component's `name` property value.
@@ -114,6 +114,7 @@ If you're looking to emulate native form element submission, `d2l-form-native` m
114
114
  ### Methods
115
115
  - `submit()`: Submits the form. This will first perform validation on all elements within the form including nested `d2l-form` elements.
116
116
  - **Note:** If validation succeeds, the form data will be aggregated and passed back to the caller via the `d2l-form-submit` event. It will not be submitted by the form itself.
117
+ - `resetValidation()`: Resets the validation errors. Note that this does not reset any form values. Daylight dialog components (e.g., `d2l-dialog`) will automatically run this method on close.
117
118
  - `async validate()`: Validates the form and any nested `d2l-form` elements without submitting even if validation succeeds for all elements. Returns a `Map` mapping from an element to the list of error messages associated with it.
118
119
  - **Note:** The return value will include elements and errors from both the root form and any nested descendant forms.
119
120
 
@@ -227,6 +227,18 @@ export const FormElementMixin = superclass => class extends LocalizeCoreElement(
227
227
  await this.updatedComplete;
228
228
  }
229
229
 
230
+ resetValidation() {
231
+ this.invalid = false;
232
+ this.validationError = null;
233
+ this._errors = [];
234
+
235
+ this.childErrors.forEach((_, ele) => {
236
+ if (!isCustomFormElement(ele)) return;
237
+ ele.resetValidation();
238
+ });
239
+ this.childErrors = new Map();
240
+ }
241
+
230
242
  setFormValue(formValue) {
231
243
  this.formValue = formValue;
232
244
  }
@@ -1,5 +1,6 @@
1
1
  import { css, html, LitElement } from 'lit';
2
2
  import { findFormElements, flattenMap, getFormElementData, isCustomFormElement, isNativeFormElement } from './form-helper.js';
3
+ import { findComposedAncestor } from '../../helpers/dom.js';
3
4
  import { FormMixin } from './form-mixin.js';
4
5
 
5
6
  /**
@@ -55,6 +56,12 @@ class Form extends FormMixin(LitElement) {
55
56
  this._isSubForm = false;
56
57
  }
57
58
 
59
+ firstUpdated(changedProperties) {
60
+ super.firstUpdated(changedProperties);
61
+
62
+ this._setupDialogValidationReset();
63
+ }
64
+
58
65
  render() {
59
66
  let errorSummary = null;
60
67
  if (this._isRootForm()) {
@@ -77,6 +84,26 @@ class Form extends FormMixin(LitElement) {
77
84
  this._submitData(submitter);
78
85
  }
79
86
 
87
+ resetValidation() {
88
+ const formElements = this._findFormElements();
89
+ for (const ele of formElements) {
90
+ if (this._hasSubForms(ele)) {
91
+ const forms = this._getSubForms(ele);
92
+ for (const form of forms) {
93
+ form.resetValidation();
94
+ }
95
+ } else {
96
+ if (isCustomFormElement(ele)) {
97
+ ele.resetValidation();
98
+ } else if (isNativeFormElement(ele)) {
99
+ this._displayValid(ele);
100
+ }
101
+ }
102
+ }
103
+ this._errors = new Map();
104
+ this._tooltips = new Map();
105
+ }
106
+
80
107
  async submit() {
81
108
  return this.requestSubmit(null);
82
109
  }
@@ -165,6 +192,21 @@ class Form extends FormMixin(LitElement) {
165
192
 
166
193
  }
167
194
 
195
+ _setupDialogValidationReset() {
196
+ const flag = window.D2L?.LP?.Web?.UI?.Flags.Flag('GAUD-6979-dialog-close-reset-validation', true) ?? true;
197
+ if (!flag) return;
198
+
199
+ const dialogAncestor = findComposedAncestor(
200
+ this,
201
+ node => node?._isDialogMixin
202
+ );
203
+ if (!dialogAncestor) return;
204
+
205
+ dialogAncestor.addEventListener('d2l-dialog-close', () => {
206
+ this.resetValidation();
207
+ });
208
+ }
209
+
168
210
  async _submitData(submitter) {
169
211
  this._dirty = false;
170
212
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightspace-ui/core",
3
- "version": "3.42.0",
3
+ "version": "3.43.0",
4
4
  "description": "A collection of accessible, free, open-source web components for building Brightspace applications",
5
5
  "type": "module",
6
6
  "repository": "https://github.com/BrightspaceUI/core.git",