UNPKG

@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
// © 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=