@nova-ui/dashboards
Version:
Nova Dashboards is a framework designed to provide feature developers with a common solution for presenting data coming from various sources within a single view, as well as a set of predefined widget visualizations that are 100% configuration-driven and
56 lines • 8.25 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { FormArray, FormGroup } from "@angular/forms";
/**
* Checks whether given form has a field that should be visually marked as invalid.
* Form is not in an error state if it's untouched even if it's invalid at that moment,
* a user must first interact with the form before it can be considered as invalid.
* 'invalid' form property should not be used for the purpose of this function,
* it can be affected by its children form statuses, which can be considered as valid (untouched).
*
* @param parent
*/
export function hasControlInErrorState(parent) {
// FormGroup/FormArray/FormControl is not in an error state if it's either valid or untouched
if (parent.valid || parent.untouched) {
return false;
}
// FormGroup is considred valid if every child form is either valid or untouched
if (parent instanceof FormGroup) {
for (const key of Object.keys(parent.controls)) {
const control = parent.controls[key];
if (hasControlInErrorState(control)) {
return true;
}
}
}
// FormArray is considred valid if every child form is either valid or untouched
if (parent instanceof FormArray) {
for (let i = 0; i < parent.length; i++) {
const control = parent.at(i);
if (hasControlInErrorState(control)) {
return true;
}
}
}
// Errors property contains only errors related to the currecnt form and it's not affected by any child forms
return (parent.touched || parent.dirty) && !!parent.errors;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzLWNvbnRyb2wtaW4tZXJyb3Itc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbmZpZ3VyYXRvci9mdW5jdGlvbnMvaGFzLWNvbnRyb2wtaW4tZXJyb3Itc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLE1BQXVCO0lBQzFELDZGQUE2RjtJQUM3RixJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNsQyxPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUVELGdGQUFnRjtJQUNoRixJQUFJLE1BQU0sWUFBWSxTQUFTLEVBQUU7UUFDN0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXJDLElBQUksc0JBQXNCLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ2pDLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjtLQUNKO0lBRUQsZ0ZBQWdGO0lBQ2hGLElBQUksTUFBTSxZQUFZLFNBQVMsRUFBRTtRQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTdCLElBQUksc0JBQXNCLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ2pDLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjtLQUNKO0lBRUQsNkdBQTZHO0lBQzdHLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtR3JvdXAgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiBmb3JtIGhhcyBhIGZpZWxkIHRoYXQgc2hvdWxkIGJlIHZpc3VhbGx5IG1hcmtlZCBhcyBpbnZhbGlkLlxuICogRm9ybSBpcyBub3QgaW4gYW4gZXJyb3Igc3RhdGUgaWYgaXQncyB1bnRvdWNoZWQgZXZlbiBpZiBpdCdzIGludmFsaWQgYXQgdGhhdCBtb21lbnQsXG4gKiBhIHVzZXIgbXVzdCBmaXJzdCBpbnRlcmFjdCB3aXRoIHRoZSBmb3JtIGJlZm9yZSBpdCBjYW4gYmUgY29uc2lkZXJlZCBhcyBpbnZhbGlkLlxuICogJ2ludmFsaWQnIGZvcm0gcHJvcGVydHkgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciB0aGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uLFxuICogaXQgY2FuIGJlIGFmZmVjdGVkIGJ5IGl0cyBjaGlsZHJlbiBmb3JtIHN0YXR1c2VzLCB3aGljaCBjYW4gYmUgY29uc2lkZXJlZCBhcyB2YWxpZCAodW50b3VjaGVkKS5cbiAqXG4gKiBAcGFyYW0gcGFyZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDb250cm9sSW5FcnJvclN0YXRlKHBhcmVudDogQWJzdHJhY3RDb250cm9sKTogYm9vbGVhbiB7XG4gICAgLy8gRm9ybUdyb3VwL0Zvcm1BcnJheS9Gb3JtQ29udHJvbCBpcyBub3QgaW4gYW4gZXJyb3Igc3RhdGUgaWYgaXQncyBlaXRoZXIgdmFsaWQgb3IgdW50b3VjaGVkXG4gICAgaWYgKHBhcmVudC52YWxpZCB8fCBwYXJlbnQudW50b3VjaGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBGb3JtR3JvdXAgaXMgY29uc2lkcmVkIHZhbGlkIGlmIGV2ZXJ5IGNoaWxkIGZvcm0gaXMgZWl0aGVyIHZhbGlkIG9yIHVudG91Y2hlZFxuICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyZW50LmNvbnRyb2xzKSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IHBhcmVudC5jb250cm9sc1trZXldO1xuXG4gICAgICAgICAgICBpZiAoaGFzQ29udHJvbEluRXJyb3JTdGF0ZShjb250cm9sKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybUFycmF5IGlzIGNvbnNpZHJlZCB2YWxpZCBpZiBldmVyeSBjaGlsZCBmb3JtIGlzIGVpdGhlciB2YWxpZCBvciB1bnRvdWNoZWRcbiAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gcGFyZW50LmF0KGkpO1xuXG4gICAgICAgICAgICBpZiAoaGFzQ29udHJvbEluRXJyb3JTdGF0ZShjb250cm9sKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXJyb3JzIHByb3BlcnR5IGNvbnRhaW5zIG9ubHkgZXJyb3JzIHJlbGF0ZWQgdG8gdGhlIGN1cnJlY250IGZvcm0gYW5kIGl0J3Mgbm90IGFmZmVjdGVkIGJ5IGFueSBjaGlsZCBmb3Jtc1xuICAgIHJldHVybiAocGFyZW50LnRvdWNoZWQgfHwgcGFyZW50LmRpcnR5KSAmJiAhIXBhcmVudC5lcnJvcnM7XG59XG4iXX0=