adds support for compliance filter query param on compliance route

This commit is contained in:
Seyi Adebajo 2018-09-19 10:44:35 -07:00
parent cd94e5af6f
commit e6c61a9536
10 changed files with 89 additions and 16 deletions

View File

@ -50,4 +50,4 @@ const descendantDatasetRouteClassFactory = ({ selectedTab }: { selectedTab: Tabs
};
};
export { Tabs, descendantDatasetRouteClassFactory, setTabSelectedOnAncestorController };
export { Tabs, descendantDatasetRouteClassFactory };

View File

@ -5,7 +5,7 @@ import { 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 } from 'wherehows-web/constants';
import { DatasetPlatform, 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';
@ -135,6 +135,13 @@ export default class DatasetController extends Controller {
*/
requiresUserAction: ComputedProperty<boolean> = or('isNewComplianceInfo', 'compliancePolicyHasDrift');
/**
* Indicates the current query value for the compliance tags to be filtered by
* @type {(TagFilter | undefined)}
* @memberof DatasetController
*/
complianceTagFilter: TagFilter | undefined;
/**
* Converts the uri on a model to a usable URN format
* @type {ComputedProperty<string>}

View File

@ -0,0 +1,19 @@
import Controller from '@ember/controller';
import { TagFilter } from 'wherehows-web/constants';
export default class DatasetComplianceController extends Controller {
queryParams = [
{
fieldFilter: {
as: 'field_filter'
}
}
];
/**
* Binding for field_filter query parameter used to set the filter value for the compliance tags
* @type {(TagFilter | undefined)}
* @memberof DatasetComplianceController
*/
fieldFilter: TagFilter | undefined;
}

View File

@ -1,7 +1,7 @@
import Route from '@ember/routing/route';
import { setProperties } from '@ember/object';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
import { refreshModelQueryParams } from 'wherehows-web/utils/helpers/routes';
import { refreshModelForQueryParams } from 'wherehows-web/utils/helpers/routes';
import BrowseEntityController from 'wherehows-web/controllers/browse/entity';
const queryParamsKeys: Array<keyof IBrowserRouteParams> = ['page', 'prefix', 'platform', 'size'];
@ -27,7 +27,7 @@ export default class BrowseEntity extends Route.extend(AuthenticatedRouteMixin,
}
}
}) {
queryParams = refreshModelQueryParams(queryParamsKeys);
queryParams = refreshModelForQueryParams(queryParamsKeys);
setupController(this: BrowseEntity, controller: BrowseEntityController, model: IBrowserRouteParams) {
// sets the entity property on the controller in addition to the model

View File

@ -1,9 +1,8 @@
import Ember from 'ember'; // type import, no emit, access to Ember.Transition interface
import Route from '@ember/routing/route';
import { get, set, setProperties } from '@ember/object';
import Configurator from 'wherehows-web/services/configurator';
import Notifications, { NotificationEvent } from 'wherehows-web/services/notifications';
import { refreshModelQueryParams } from 'wherehows-web/utils/helpers/routes';
import { refreshModelForQueryParams } from 'wherehows-web/utils/helpers/routes';
import isUrn, {
convertWhUrnToLiUrn,
decodeUrn,
@ -34,7 +33,7 @@ export default class DatasetRoute extends Route {
@service
notifications: Notifications;
queryParams = refreshModelQueryParams(['urn']);
queryParams = refreshModelForQueryParams(['urn']);
/**
* Resolves an IDatasetView if params can be parsed into a valid urn
@ -73,7 +72,7 @@ export default class DatasetRoute extends Route {
throw new TypeError(`Could not parse identifier ${dataset_id}. Please ensure format is valid.`);
}
afterModel(resolvedModel: object, transition: Ember.Transition): void {
afterModel(resolvedModel: object, transition: import('ember').Ember.Transition): void {
const { dataset_id } = transition.params['datasets.dataset'];
// Check is dataset_id is a number, and replace with urn

View File

@ -1,3 +1,32 @@
import { set } from '@ember/object';
import { descendantDatasetRouteClassFactory, 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 DatasetController from 'wherehows-web/controllers/datasets/dataset';
export default descendantDatasetRouteClassFactory({ selectedTab: Tabs.Compliance });
export default class Compliance extends descendantDatasetRouteClassFactory({ selectedTab: Tabs.Compliance }) {
queryParams = refreshModelForQueryParams(['fieldFilter']);
setupController(controller: DatasetComplianceController, model: IDatasetView): void {
const { setPropOnAncestorController } = this;
super.setupController(controller, model);
// set the compliance tagFilter on the ancestor controller
setPropOnAncestorController('complianceTagFilter', controller.fieldFilter);
}
/**
* 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

@ -1,19 +1,19 @@
import Route from '@ember/routing/route';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
import createSearchEntries from 'wherehows-web/utils/datasets/create-search-entries';
import { refreshModelQueryParams } from 'wherehows-web/utils/helpers/routes';
import { refreshModelForQueryParams } from 'wherehows-web/utils/helpers/routes';
import { readSearch } from 'wherehows-web/utils/api/search';
import { action } from '@ember-decorators/object';
export default class SearchRoute extends Route.extend(AuthenticatedRouteMixin) {
// Set `refreshModel` for each queryParam to true
// so each url state change results in a full transition
queryParams = refreshModelQueryParams(['category', 'page', 'facets', 'keyword']);
queryParams = refreshModelForQueryParams(['category', 'page', 'facets', 'keyword']);
/**
* Makes an API call and process search entries
*/
async model(apiParams: any) {
async model(apiParams: any): Promise<{ keywords: string; data: Array<any> }> {
const { result } = await readSearch(apiParams);
const { keywords, data } = result || { keywords: '', data: [] };
createSearchEntries(data, keywords);
@ -24,7 +24,7 @@ export default class SearchRoute extends Route.extend(AuthenticatedRouteMixin) {
* Add spinner when model is loading
*/
@action
loading(transition: any) {
loading(transition: import('ember').Ember.Transition): void {
let controller = this.controllerFor('search');
controller.set('searchLoading', true);
transition.promise.finally(function() {

View File

@ -1,8 +1,12 @@
import SearchController from 'wherehows-web/controllers/search';
import DatasetController from 'wherehows-web/controllers/datasets/dataset';
import DatasetComplianceController from 'wherehows-web/controllers/datasets/dataset/compliance';
declare module '@ember/controller' {
// eslint-disable-next-line typescript/interface-name-prefix
interface Registry {
search: SearchController;
'datasets.dataset': DatasetController;
'datasets.dataset.compliance': DatasetComplianceController;
}
}

View File

@ -1,7 +1,10 @@
import { arrayReduce } from 'wherehows-web/utils/array';
/**
* For each given query param, creates an object with `refreshModel` set to true
* @param {Array<string>} [params=[]]
* @returns {{}}
* @returns {Record<string, { refreshModel: true }>}
*/
export const refreshModelQueryParams = (params: Array<string> = []): {} =>
params.reduce((queryParams, param) => ({ ...queryParams, [param]: { refreshModel: true } }), {});
export const refreshModelForQueryParams = (params: Array<string> = []): Record<string, { refreshModel: true }> =>
arrayReduce((queryParams, param: string) => ({ ...queryParams, [param]: { refreshModel: true } }), {})(params);

View File

@ -0,0 +1,12 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Controller | datasets/dataset/compliance', function(hooks): void {
setupTest(hooks);
test('it exists', function(assert): void {
let controller = this.owner.lookup('controller:datasets/dataset/compliance');
assert.ok(controller);
assert.ok(controller.hasOwnProperty('fieldFilter'), 'fieldFilter queryParam has binding to controller attribute');
});
});