diff --git a/wherehows-web/app/components/dataset-compliance.ts b/wherehows-web/app/components/dataset-compliance.ts index 9eeba4795c..9ed079cd50 100644 --- a/wherehows-web/app/components/dataset-compliance.ts +++ b/wherehows-web/app/components/dataset-compliance.ts @@ -74,6 +74,7 @@ import { isMetadataObject, jsonValuesMatch } from 'wherehows-web/utils/datasets/ import { typeOf } from '@ember/utils'; import { pick } from 'wherehows-web/utils/object'; import { service } from '@ember-decorators/service'; +import { IDatasetRetention } from 'wherehows-web/typings/api/datasets/retention'; const { complianceDataException, @@ -141,6 +142,12 @@ export default class DatasetCompliance extends Component { */ showGuidedComplianceEditMode: boolean = true; + /** + * Pass through object containing the retention policy + * @type {IDatasetRetention | null} + */ + retentionPolicy: IDatasetRetention | null; + /** * Pass through value for the dataset export policy, to be used by one of our child components on * this page @@ -1450,14 +1457,10 @@ export default class DatasetCompliance extends Component { onDatasetPurgePolicyChange( this: DatasetCompliance, purgePolicy: PurgePolicy - ): IComplianceInfo['complianceType'] | null { - const complianceInfo = get(this, 'complianceInfo'); + ): IDatasetRetention['purgeType'] | null { + const retentionPolicy = get(this, 'retentionPolicy'); - if (!complianceInfo) { - return null; - } - // directly set the complianceType to the updated value - return set(complianceInfo, 'complianceType', purgePolicy); + return retentionPolicy ? set(retentionPolicy, 'purgeType', purgePolicy) : null; }, /** diff --git a/wherehows-web/app/components/datasets/containers/dataset-compliance.ts b/wherehows-web/app/components/datasets/containers/dataset-compliance.ts index d678206c37..feb5522184 100644 --- a/wherehows-web/app/components/datasets/containers/dataset-compliance.ts +++ b/wherehows-web/app/components/datasets/containers/dataset-compliance.ts @@ -42,7 +42,6 @@ import { typeOf } from '@ember/utils'; import { service } from '@ember-decorators/service'; import { containerDataSource } from 'wherehows-web/utils/components/containers/data-source'; import { saveDatasetRetentionByUrn, readDatasetRetentionByUrn } from 'wherehows-web/utils/api/datasets/retention'; -import { extractRetentionFromComplianceInfo } from 'wherehows-web/utils/datasets/retention'; import { IDatasetRetention, IGetDatasetRetentionResponse } from 'wherehows-web/typings/api/datasets/retention'; import { readUpstreamDatasetsByUrn } from 'wherehows-web/utils/api/datasets/lineage'; import { LineageList } from 'wherehows-web/typings/api/datasets/relationships'; @@ -245,6 +244,14 @@ export default class DatasetComplianceContainer extends Component { }); } + /** + * Resets the retention policy to the persisted state + * @type {() => void} + */ + resetRetentionPolicy(): void { + get(this, 'getRetentionPolicyTask').perform(); + } + /** * Reads the compliance properties for the dataset * @type {Task, (a?: any) => TaskInstance>>} @@ -263,6 +270,19 @@ export default class DatasetComplianceContainer extends Component { setProperties(this, { isNewComplianceInfo, complianceInfo }); }); + /** + * Reads the retention policy for the dataset and saves items to a property on the container + * @type {Task, () => TaskInstance>>} + */ + getRetentionPolicyTask = task(function*( + this: DatasetComplianceContainer + ): IterableIterator> { + const retentionResponse = yield readDatasetRetentionByUrn(get(this, 'urn')); + + const retentionPolicy = retentionResponse && retentionResponse.retentionPolicy; + set(this, 'retentionPolicy', retentionPolicy); + }).restartable(); + /** * Reads the export policy properties for the dataset * @type {Task, (a?: any) => TaskInstance>>} @@ -366,22 +386,12 @@ export default class DatasetComplianceContainer extends Component { */ @action async saveRetentionPolicy(this: DatasetComplianceContainer): Promise { - const complianceInfo = get(this, 'complianceInfo'); - if (complianceInfo) { - const { complianceEntities } = complianceInfo; + const retentionPolicy = get(this, 'retentionPolicy'); - await this.notifyOnSave( - saveDatasetRetentionByUrn( - this.urn, - extractRetentionFromComplianceInfo({ - ...complianceInfo, - // filter out readonly entities, then omit readonly attribute from remaining entities before save - complianceEntities: removeReadonlyAttr(editableTags(complianceEntities)) - }) - ) - ); + if (retentionPolicy) { + await this.notifyOnSave(saveDatasetRetentionByUrn(this.urn, retentionPolicy)); - this.resetPrivacyCompliancePolicy.call(this); + this.resetRetentionPolicy(); } } @@ -405,6 +415,15 @@ export default class DatasetComplianceContainer extends Component { get(this, 'getComplianceTask').perform(); } + /** + * Calls the reset on all compliance related actions + */ + @action + resetAll(): void { + this.actions.resetPrivacyCompliancePolicy.call(this); + this.resetRetentionPolicy(); + } + /** * Invokes external action if compliance info is new or otherwise * @param {boolean} isNewComplianceInfo flag indicating the policy does not exist remotely diff --git a/wherehows-web/app/templates/components/dataset-compliance.hbs b/wherehows-web/app/templates/components/dataset-compliance.hbs index 1e19586b6c..2dc3f8a14a 100644 --- a/wherehows-web/app/templates/components/dataset-compliance.hbs +++ b/wherehows-web/app/templates/components/dataset-compliance.hbs @@ -158,7 +158,7 @@ missingPolicyText="This dataset does not have a current compliance purge policy." supportedPurgePolicies=supportedPurgePolicies purgeNote=complianceInfo.compliancePurgeNote - purgePolicy=(readonly (if retentionPolicy retentionPolicy.purgeType complianceInfo.complianceType)) + purgePolicy=(readonly retentionPolicy.purgeType) onPolicyChange=(action "onDatasetPurgePolicyChange") }} diff --git a/wherehows-web/app/templates/components/datasets/containers/dataset-compliance.hbs b/wherehows-web/app/templates/components/datasets/containers/dataset-compliance.hbs index 7dd7fd5b45..e6cf35072b 100644 --- a/wherehows-web/app/templates/components/datasets/containers/dataset-compliance.hbs +++ b/wherehows-web/app/templates/components/datasets/containers/dataset-compliance.hbs @@ -42,7 +42,7 @@ onSave=(action "savePrivacyCompliancePolicy") onSaveRetentionPolicy=(action "saveRetentionPolicy") onSaveExportPolicy=(action "saveExportPolicy") - onReset=(action "resetPrivacyCompliancePolicy") + onReset=(action "resetAll") onComplianceJsonUpdate=(action "onComplianceJsonUpdate") }} diff --git a/wherehows-web/app/utils/datasets/retention.ts b/wherehows-web/app/utils/datasets/retention.ts index 60dcfdf9d4..ad25ee5722 100644 --- a/wherehows-web/app/utils/datasets/retention.ts +++ b/wherehows-web/app/utils/datasets/retention.ts @@ -1,26 +1,5 @@ import { IComplianceInfo } from 'wherehows-web/typings/api/datasets/compliance'; -import { IDatasetRetention } from 'wherehows-web/typings/api/datasets/retention'; import { nullify, Nullify, Omit, pick } from 'wherehows-web/utils/object'; -import { isExempt } from 'wherehows-web/constants'; - -/** - * Extracts values from an IComplianceInfo instance to create an instance of IDatasetRetention - * @param {IComplianceInfo} complianceInfo the compliance info object - * @returns {IDatasetRetention} - */ -const extractRetentionFromComplianceInfo = (complianceInfo: IComplianceInfo): IDatasetRetention => { - let { datasetUrn, compliancePurgeNote, complianceType } = pick(complianceInfo, [ - 'complianceType', - 'compliancePurgeNote', - 'datasetUrn' - ]); - - return { - purgeNote: complianceType && isExempt(complianceType) ? compliancePurgeNote : '', - purgeType: complianceType, - datasetUrn: datasetUrn! - }; -}; /** * Makes values in IComplianceInfo that are present / have a corollary in IDatasetRetention type null i.e. keys @@ -38,4 +17,4 @@ const nullifyRetentionFieldsOnComplianceInfo = ( ...nullify(pick(complianceInfo, ['complianceType', 'compliancePurgeNote'])) }); -export { extractRetentionFromComplianceInfo, nullifyRetentionFieldsOnComplianceInfo }; +export { nullifyRetentionFieldsOnComplianceInfo };