propagates qps to container

This commit is contained in:
Seyi Adebajo 2018-09-20 09:24:45 -07:00
parent 37802e280b
commit f3c6b8fdaa
9 changed files with 84 additions and 54 deletions

View File

@ -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<ISecurityClassificationOption> = 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);
},
/**

View File

@ -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);
}

View File

@ -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,

View File

@ -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 = <K extends keyof DatasetController>(
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 = <DatasetController>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 };

View File

@ -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;
}
}

View File

@ -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'),

View File

@ -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<DatasetController['model'] | object> {
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 = <K extends keyof DatasetController>(
prop: K,
value: DatasetController[K]
): DatasetController[K] => set(this.controllerFor('datasets.dataset'), prop, value);
}

View File

@ -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")

View File

@ -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}}