From 55cd632f2d821f18d7759b487370d20940de94d2 Mon Sep 17 00:00:00 2001 From: Seyi Adebajo Date: Sun, 17 Jun 2018 03:51:10 -0700 Subject: [PATCH] adds error messages display for JSON parse and some issues with matching compliance metadata schema --- .../app/components/dataset-compliance.ts | 13 ++++++++--- .../app/styles/components/_navbar.scss | 8 +++++++ .../dataset-compliance/_compliance-table.scss | 4 ++++ .../components/dataset-compliance.hbs | 10 +++++++++ .../datasets/compliance/metadata-schema.ts | 22 +++++++++++++------ 5 files changed, 47 insertions(+), 10 deletions(-) diff --git a/wherehows-web/app/components/dataset-compliance.ts b/wherehows-web/app/components/dataset-compliance.ts index a776645a6d..8830a144e6 100644 --- a/wherehows-web/app/components/dataset-compliance.ts +++ b/wherehows-web/app/components/dataset-compliance.ts @@ -124,6 +124,13 @@ export default class DatasetCompliance extends Component { */ isManualApplyDisabled: boolean = false; + /** + * String representation of a parse error that may have occurred when validating manually entered compliance entities + * @type {string} + * @memberof DatasetCompliance + */ + manualParseError: string = ''; + /** * Flag indicating the current compliance policy edit-view mode * @type {boolean} @@ -994,13 +1001,13 @@ export default class DatasetCompliance extends Component { }; const isValid = validateMetadataObject(metadataObject, complianceEntitiesTaxonomy); - set(this, 'isManualApplyDisabled', !isValid); + setProperties(this, { isManualApplyDisabled: !isValid, manualParseError: '' }); if (isValid) { set(this, 'manuallyEnteredComplianceEntities', metadataObject); } - } catch { - set(this, 'isManualApplyDisabled', true); + } catch (e) { + setProperties(this, { isManualApplyDisabled: true, manualParseError: e.message }); } }, diff --git a/wherehows-web/app/styles/components/_navbar.scss b/wherehows-web/app/styles/components/_navbar.scss index dfdc24bef3..f507c487bc 100644 --- a/wherehows-web/app/styles/components/_navbar.scss +++ b/wherehows-web/app/styles/components/_navbar.scss @@ -93,6 +93,14 @@ $navbar-transition-speed: $banner-animation-speed; &__content { white-space: nowrap; vertical-align: top; + + &__error-messages { + display: inline-flex; + align-items: center; + color: get-color(red5); + margin-left: item-spacing(2); + padding-right: item-spacing(2); + } } &__item + &__item { diff --git a/wherehows-web/app/styles/components/dataset-compliance/_compliance-table.scss b/wherehows-web/app/styles/components/dataset-compliance/_compliance-table.scss index af6d8cdd25..4be5e4d782 100644 --- a/wherehows-web/app/styles/components/dataset-compliance/_compliance-table.scss +++ b/wherehows-web/app/styles/components/dataset-compliance/_compliance-table.scss @@ -321,6 +321,10 @@ width: 100%; overflow: hidden; } + + &__manual-entry-errors { + margin-left: item-spacing(2); + } } .dataset-compliance-editor { diff --git a/wherehows-web/app/templates/components/dataset-compliance.hbs b/wherehows-web/app/templates/components/dataset-compliance.hbs index d193e37764..4b72f4e4c4 100644 --- a/wherehows-web/app/templates/components/dataset-compliance.hbs +++ b/wherehows-web/app/templates/components/dataset-compliance.hbs @@ -89,6 +89,16 @@ Cancel {{/track-ui-event}} + + {{#if (and isInitialEditStep (and manualParseError (not showGuidedComplianceEditMode)))}} +
+ {{fa-icon "times-circle-o"}} + + + {{manualParseError}} + +
+ {{/if}} {{/if}} diff --git a/wherehows-web/app/utils/datasets/compliance/metadata-schema.ts b/wherehows-web/app/utils/datasets/compliance/metadata-schema.ts index 766fed31a6..f39d44667d 100644 --- a/wherehows-web/app/utils/datasets/compliance/metadata-schema.ts +++ b/wherehows-web/app/utils/datasets/compliance/metadata-schema.ts @@ -3,6 +3,7 @@ import { DatasetClassifiers } from 'wherehows-web/constants'; import { arrayEvery, arrayMap, arrayReduce } from 'wherehows-web/utils/array'; import { IObject } from 'wherehows-web/typings/generic'; import { isObject } from 'wherehows-web/utils/object'; +import { difference } from 'lodash'; /** * Defines the interface for an IDL that specifies the data types for properties on @@ -146,14 +147,21 @@ const keyValueHasMatch = (object: IObject) => (metadataType: IMetadataType) * @param {IObject} object * @param {Array} typeMaps * @return {boolean} + * @throws {Error} if object keys do not match type @names */ -const keysMatchNames = (object: IObject, typeMaps: Array): boolean => - Object.keys(object) - .sort() - .toString() === - arrayMap((typeMap: IMetadataType) => typeMap['@name'])(typeMaps) - .sort() - .toString(); +const keysMatchNames = (object: IObject, typeMaps: Array): boolean => { + const objectKeys = Object.keys(object).sort(); + const typeKeys = arrayMap((typeMap: IMetadataType) => typeMap['@name'])(typeMaps).sort(); + const objectKeysSerialized = objectKeys.toString(); + const typeKeysSerialized = typeKeys.toString(); + const match = objectKeysSerialized === typeKeysSerialized; + + if (!match) { + throw new Error(`Extra attributes found: ${difference(objectKeys, typeKeys).join(', ')}`); + } + + return match; +}; /** * Checks each key on an object matches the expected types in the typeMap