From f3c6b8fdaab489db46861d75ed459430253d4dfc Mon Sep 17 00:00:00 2001 From: Seyi Adebajo Date: Thu, 20 Sep 2018 09:24:45 -0700 Subject: [PATCH] propagates qps to container --- .../app/components/dataset-compliance.ts | 19 ++++++---- .../datasets/containers/dataset-compliance.ts | 8 ++-- .../app/constants/dataset-compliance.ts | 7 ++++ .../app/constants/datasets/shared.ts | 33 +++++++++------- .../app/controllers/datasets/dataset.ts | 25 +++++++++--- wherehows-web/app/routes/datasets/dataset.ts | 4 +- .../app/routes/datasets/dataset/compliance.ts | 38 +++++++++---------- .../containers/dataset-compliance.hbs | 2 + .../app/templates/datasets/dataset.hbs | 2 + 9 files changed, 84 insertions(+), 54 deletions(-) diff --git a/wherehows-web/app/components/dataset-compliance.ts b/wherehows-web/app/components/dataset-compliance.ts index f89cc98c0c..9eeba4795c 100644 --- a/wherehows-web/app/components/dataset-compliance.ts +++ b/wherehows-web/app/components/dataset-compliance.ts @@ -258,6 +258,12 @@ export default class DatasetCompliance extends Component { notifyOnChangeSetRequiresReview: (hasChangeSetDrift: boolean) => void; + /** + * External action to handle compliance filter change + * @type {(tagFilter: TagFilter) => TagFilter} + */ + onComplianceTagFilterChange: (tagFilter: TagFilter) => TagFilter; + classNames = ['compliance-container']; classNameBindings = ['isEditing:compliance-container--edit-mode']; @@ -302,11 +308,11 @@ export default class DatasetCompliance extends Component { classifiers: Array = getSecurityClassificationDropDownOptions(); /** - * Default to show all fields to review - * @type {string} + * Specifies the filter to be applied on the list of fields shown in the compliance policy table + * @type {TagFilter} * @memberof DatasetCompliance */ - fieldReviewOption: TagFilter = TagFilter.showAll; + fieldReviewOption!: TagFilter; /** * Computes a cta string for the selected field review filter option @@ -1327,15 +1333,12 @@ export default class DatasetCompliance extends Component { }, /** - * Updates the fieldReviewOption with the user selected value + * Invokes the external action to update the tagFilter query * @param {{value: TagFilter}} { value } * @returns {TagFilter} */ onFieldReviewChange(this: DatasetCompliance, { value }: { value: TagFilter }): TagFilter { - const option = set(this, 'fieldReviewOption', value); - get(this, 'foldChangeSetTask').perform(); - - return option; + return this.onComplianceTagFilterChange(value); }, /** diff --git a/wherehows-web/app/components/datasets/containers/dataset-compliance.ts b/wherehows-web/app/components/datasets/containers/dataset-compliance.ts index 243ce2bade..98e70ce0b6 100644 --- a/wherehows-web/app/components/datasets/containers/dataset-compliance.ts +++ b/wherehows-web/app/components/datasets/containers/dataset-compliance.ts @@ -378,7 +378,7 @@ export default class DatasetComplianceContainer extends Component { * Resets the compliance information for the dataset with the previously persisted properties */ @action - resetPrivacyCompliancePolicy() { + resetPrivacyCompliancePolicy(): void { get(this, 'getComplianceTask').perform(); } @@ -394,7 +394,7 @@ export default class DatasetComplianceContainer extends Component { }: { isNewComplianceInfo: boolean; fromUpstream: boolean; - }) { + }): void { this.setOnComplianceType({ isNewComplianceInfo, fromUpstream }); } @@ -403,7 +403,7 @@ export default class DatasetComplianceContainer extends Component { * @param {boolean} hasDrift */ @action - onCompliancePolicyChangeSetDrift(hasDrift: boolean) { + onCompliancePolicyChangeSetDrift(hasDrift: boolean): void { this.setOnChangeSetDrift(hasDrift); } @@ -413,7 +413,7 @@ export default class DatasetComplianceContainer extends Component { * @param {SuggestionIntent} feedback */ @action - onSuggestionsComplianceFeedback(uid: string | null = null, feedback: SuggestionIntent) { + onSuggestionsComplianceFeedback(uid: string | null = null, feedback: SuggestionIntent): void { saveDatasetComplianceSuggestionFeedbackByUrn(get(this, 'urn'), uid, feedback); } diff --git a/wherehows-web/app/constants/dataset-compliance.ts b/wherehows-web/app/constants/dataset-compliance.ts index a36d7c8ee6..fea47785f9 100644 --- a/wherehows-web/app/constants/dataset-compliance.ts +++ b/wherehows-web/app/constants/dataset-compliance.ts @@ -68,6 +68,12 @@ enum TagFilter { showCompleted = 'show-completed' } +/** + * TagFilter type guard that narrows to a TagFilter type if compatible + * @param {any} candidate + * @returns {candidate is TagFilter} + */ +const isTagFilter = (candidate: any): candidate is TagFilter => Object.values(TagFilter).includes(candidate); /** * Takes a compliance data type and transforms it into a compliance field identifier option * @param {IComplianceDataType} complianceDataType @@ -684,6 +690,7 @@ export { complianceSteps, getComplianceSteps, editableTags, + isTagFilter, isAutoGeneratedPolicy, removeReadonlyAttr, tagNeedsReview, diff --git a/wherehows-web/app/constants/datasets/shared.ts b/wherehows-web/app/constants/datasets/shared.ts index ab73208978..2ef5300195 100644 --- a/wherehows-web/app/constants/datasets/shared.ts +++ b/wherehows-web/app/constants/datasets/shared.ts @@ -21,17 +21,23 @@ enum Tabs { } /** - * Sets the tab selection property on the provided route with the currently selected tab + * Sets a DatasetController property K to the supplied value + * @template K keyof DatasetController * @param {Route} route the route instance to update - * @param {Tabs} tabSelected identifier for the selected tab - * @returns {Tabs} + * @param {K} prop the property on the DatasetController to be set + * @param {DatasetController[K]} value value to be applied to prop + * @returns {DatasetController[K]} */ -const setTabSelectedOnAncestorController = (route: Route, tabSelected: Tabs): Tabs => { +const setPropertyOnAncestorController = ( + route: Route, + prop: K, + value: DatasetController[K] +): DatasetController[K] => { const { routeName, controllerFor } = route; assert('route should be a descendant of datasets.dataset', !routeName.indexOf('datasets.dataset.')); const ancestorController = controllerFor.call(route, 'datasets.dataset'); - return set(ancestorController, 'tabSelected', tabSelected); + return set(ancestorController, prop, value); }; /** @@ -39,15 +45,14 @@ const setTabSelectedOnAncestorController = (route: Route, tabSelected: Tabs): Ta * @param {{ selectedTab: Tabs }} { selectedTab } options bag contains identifier for the current tab * @returns {typeof Route} the descendant route class */ -const descendantDatasetRouteClassFactory = ({ selectedTab }: { selectedTab: Tabs }): typeof Route => { - return class DatasetDescendantRoute extends Route { - actions = { - didTransition(this: DatasetDescendantRoute) { +const descendantDatasetRouteClassFactory = ({ selectedTab }: { selectedTab: Tabs }): typeof Route => + class DatasetDescendantRoute extends Route.extend({ + actions: { + didTransition(this: DatasetDescendantRoute): void { // on successful route transition - setTabSelectedOnAncestorController(this, selectedTab); + setPropertyOnAncestorController(this, 'tabSelected', selectedTab); } - }; - }; -}; + } + }) {}; -export { Tabs, descendantDatasetRouteClassFactory }; +export { Tabs, descendantDatasetRouteClassFactory, setPropertyOnAncestorController }; diff --git a/wherehows-web/app/controllers/datasets/dataset.ts b/wherehows-web/app/controllers/datasets/dataset.ts index 5768f73d37..8f341548d4 100644 --- a/wherehows-web/app/controllers/datasets/dataset.ts +++ b/wherehows-web/app/controllers/datasets/dataset.ts @@ -1,11 +1,10 @@ import Controller from '@ember/controller'; -import { computed, set, get, setProperties, getWithDefault } from '@ember/object'; -import ComputedProperty from '@ember/object/computed'; -import { or } from '@ember/object/computed'; +import { computed, get, getWithDefault, set, setProperties } from '@ember/object'; +import ComputedProperty, { or } from '@ember/object/computed'; import { encodeUrn } from 'wherehows-web/utils/validators/urn'; import { Tabs } from 'wherehows-web/constants/datasets/shared'; import { action } from '@ember-decorators/object'; -import { DatasetPlatform, TagFilter } from 'wherehows-web/constants'; +import { DatasetPlatform, isTagFilter, TagFilter } from 'wherehows-web/constants'; import { IDatasetView } from 'wherehows-web/typings/api/datasets/dataset'; import { next } from '@ember/runloop'; import { IAppConfig } from 'wherehows-web/typings/api/configurator/configurator'; @@ -137,10 +136,10 @@ export default class DatasetController extends Controller { /** * Indicates the current query value for the compliance tags to be filtered by - * @type {(TagFilter | undefined)} + * @type {(TagFilter)} * @memberof DatasetController */ - complianceTagFilter: TagFilter | undefined; + complianceTagFilter: TagFilter; /** * Converts the uri on a model to a usable URN format @@ -175,6 +174,7 @@ export default class DatasetController extends Controller { this.tabSelected || (this.tabSelected = Tabs.Ownership); this.jitAclAccessWhitelist || (this.jitAclAccessWhitelist = []); this.wikiLinks || (this.wikiLinks = {}); + isTagFilter(this.complianceTagFilter) || (this.complianceTagFilter = TagFilter.showAll); } /** @@ -250,4 +250,17 @@ export default class DatasetController extends Controller { setOwnershipRuleChange(ownersNotConfirmed: boolean) { next(this, () => set(this, 'datasetOwnersRequiredNotMet', ownersNotConfirmed)); } + + /** + * Transitions to queryParams when the compliance filter has been changed + * @param {TagFilter} fieldFilter the new filter to apply + * @returns {TagFilter} + * @memberof DatasetController + */ + @action + onComplianceTagFilterChange(fieldFilter: TagFilter): TagFilter { + // @ts-ignore types not updated to reflect passing only QPs to transitionToRoute + this.transitionToRoute({ queryParams: { fieldFilter } }); + return fieldFilter; + } } diff --git a/wherehows-web/app/routes/datasets/dataset.ts b/wherehows-web/app/routes/datasets/dataset.ts index 7e95fa462f..4cd2920bcf 100644 --- a/wherehows-web/app/routes/datasets/dataset.ts +++ b/wherehows-web/app/routes/datasets/dataset.ts @@ -87,9 +87,9 @@ export default class DatasetRoute extends Route { return { dataset_id: uri }; } - async setupController(this: DatasetRoute, controller: DatasetController, model: IDatasetView) { + setupController(this: DatasetRoute, controller: DatasetController, model: IDatasetView): void { const { getConfig } = Configurator; - set(controller, 'model', model); + super.setupController(controller, model); setProperties(controller, { isInternal: !!getConfig('isInternal'), diff --git a/wherehows-web/app/routes/datasets/dataset/compliance.ts b/wherehows-web/app/routes/datasets/dataset/compliance.ts index 004048dfc1..bc719a66c5 100644 --- a/wherehows-web/app/routes/datasets/dataset/compliance.ts +++ b/wherehows-web/app/routes/datasets/dataset/compliance.ts @@ -1,32 +1,30 @@ -import { set } from '@ember/object'; -import { descendantDatasetRouteClassFactory, Tabs } from 'wherehows-web/constants/datasets/shared'; +import { + descendantDatasetRouteClassFactory, + setPropertyOnAncestorController, + Tabs +} from 'wherehows-web/constants/datasets/shared'; import DatasetComplianceController from 'wherehows-web/controllers/datasets/dataset/compliance'; import { refreshModelForQueryParams } from 'wherehows-web/utils/helpers/routes'; -import { IDatasetView } from 'wherehows-web/typings/api/datasets/dataset'; +import { isTagFilter, TagFilter } from 'wherehows-web/constants'; import DatasetController from 'wherehows-web/controllers/datasets/dataset'; export default class Compliance extends descendantDatasetRouteClassFactory({ selectedTab: Tabs.Compliance }) { queryParams = refreshModelForQueryParams(['fieldFilter']); - setupController(controller: DatasetComplianceController, model: IDatasetView): void { - const { setPropOnAncestorController } = this; + async model(): Promise { + return { ...this.controllerFor('datasets.dataset').model }; + } + + setupController(controller: DatasetComplianceController, model: object): void { + const { fieldFilter } = controller; super.setupController(controller, model); - // set the compliance tagFilter on the ancestor controller - setPropOnAncestorController('complianceTagFilter', controller.fieldFilter); + // set the complianceTagFilter property on the ancestor controller + setPropertyOnAncestorController( + this, + 'complianceTagFilter', + isTagFilter(fieldFilter) ? fieldFilter : TagFilter.showAll + ); } - - /** - * Sets a DatasetController property K to the supplied value - * @template K keyof DatasetController - * @param {K} prop the property on the DatasetController to be set - * @param {DatasetController[K]} value value to be applied to prop - * @returns {DatasetController[K]} - * @memberof Compliance - */ - setPropOnAncestorController = ( - prop: K, - value: DatasetController[K] - ): DatasetController[K] => set(this.controllerFor('datasets.dataset'), prop, value); } 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 82acf067f8..5879aaccdd 100644 --- a/wherehows-web/app/templates/components/datasets/containers/dataset-compliance.hbs +++ b/wherehows-web/app/templates/components/datasets/containers/dataset-compliance.hbs @@ -25,6 +25,7 @@ schemaless=schemaless platform=platform wikiLinks=@wikiLinks + fieldReviewOption=@complianceTagFilter complianceInfo=complianceInfo exportPolicy=exportPolicy complianceSuggestion=complianceSuggestion @@ -32,6 +33,7 @@ isNewComplianceInfo=isNewComplianceInfo schemaFieldNamesMappedToDataTypes=schemaFieldNamesMappedToDataTypes complianceDataTypes=complianceDataTypes + onComplianceTagFilterChange=@onComplianceTagFilterChange notifyOnComplianceSuggestionFeedback=(action "onSuggestionsComplianceFeedback") notifyOnChangeSetRequiresReview=(action "onCompliancePolicyChangeSetDrift") onSave=(action "savePrivacyCompliancePolicy") diff --git a/wherehows-web/app/templates/datasets/dataset.hbs b/wherehows-web/app/templates/datasets/dataset.hbs index 4b712a9b7f..c6efdcec92 100644 --- a/wherehows-web/app/templates/datasets/dataset.hbs +++ b/wherehows-web/app/templates/datasets/dataset.hbs @@ -158,9 +158,11 @@ platform=model.platform wikiLinks=wikiLinks datasetName=model.nativeName + complianceTagFilter=complianceTagFilter notifyPiiStatus=(action "onNotifyPiiStatus") setOnChangeSetDrift=(action "setOnChangeSetDrift") setOnComplianceType=(action "setOnComplianceTypeChange") + onComplianceTagFilterChange=(action "onComplianceTagFilterChange") }} {{/tabs.tabpanel}}