From 06d19d295830d89a35655576b7b48a2072390108 Mon Sep 17 00:00:00 2001
From: Seyi Adebajo
Date: Mon, 10 Feb 2020 18:51:15 -0800
Subject: [PATCH] Misc. bug fixes related to search and person entity display
attributes, and lost picture url for person entity
---
.../addon/entity/person/person-entity.ts | 10 +-
.../addon/entity/person/render-props.ts | 2 +-
.../addon/components/entity-deprecation.ts | 31 --
.../components/entity-deprecation.hbs | 16 +-
.../components/entity-deprecation-test.ts | 56 +---
.../types/entity/person/person-entity.d.ts | 2 +
.../app/components/dataset-authors.ts | 12 +-
.../search/containers/search-box.ts | 46 ++-
.../app/components/search/search-result.ts | 30 +-
.../templates/components/dataset-author.hbs | 4 +-
.../app/typings/app/search/fields.d.ts | 15 +
.../app/utils/parsers/autocomplete/index.ts | 4 +-
.../parsers/autocomplete/processors/entity.ts | 18 +-
.../parsers/autocomplete/processors/facets.ts | 3 +-
.../autocomplete/steps/generate-groups.ts | 3 +-
.../app/utils/parsers/autocomplete/types.ts | 2 +-
.../data-portal/app/utils/parsers/helpers.ts | 11 +-
.../components/search/search-result-test.ts | 28 +-
.../unit/utils/parsers/autocomplete-test.ts | 311 ------------------
19 files changed, 128 insertions(+), 476 deletions(-)
create mode 100644 datahub-web/packages/data-portal/app/typings/app/search/fields.d.ts
delete mode 100644 datahub-web/packages/data-portal/tests/unit/utils/parsers/autocomplete-test.ts
diff --git a/datahub-web/@datahub/data-models/addon/entity/person/person-entity.ts b/datahub-web/@datahub/data-models/addon/entity/person/person-entity.ts
index e17b152792..d32204683b 100644
--- a/datahub-web/@datahub/data-models/addon/entity/person/person-entity.ts
+++ b/datahub-web/@datahub/data-models/addon/entity/person/person-entity.ts
@@ -11,7 +11,7 @@ import { BaseEntity, statics, IBaseEntityStatics } from '@datahub/data-models/en
import { IEntityRenderProps } from '@datahub/data-models/types/entity/rendering/entity-render-props';
import { DataModelEntity } from '@datahub/data-models/constants/entity';
import { IPersonEntityEditableProperties } from '@datahub/data-models/types/entity/person/props';
-import { ICorpUserInfo } from '@datahub/metadata-types/types/entity/person/person-entity';
+import { ICorpUserEditableInfo, ICorpUserInfo } from '@datahub/metadata-types/types/entity/person/person-entity';
import { readPerson, saveEditablePersonalInfo } from '@datahub/data-models/api/person/entity';
import { alias, not } from '@ember/object/computed';
@@ -164,6 +164,11 @@ export class PersonEntity extends BaseEntity {
@alias('entity.info.email')
email!: string;
+ /**
+ * References the pictureLink on the editableInfo for the Person Entity
+ */
+ @alias('entity.editableInfo.pictureLink')
+ pictureLink!: ICorpUserEditableInfo['pictureLink'];
/**
* A list of skills that this particular person entity has declared to own.
*/
@@ -287,7 +292,8 @@ export class PersonEntity extends BaseEntity {
return saveEditablePersonalInfo(this.urn, {
teams: props.teamTags,
aboutMe: props.focusArea,
- skills: props.skills
+ skills: props.skills,
+ pictureLink: this.pictureLink
});
}
}
diff --git a/datahub-web/@datahub/data-models/addon/entity/person/render-props.ts b/datahub-web/@datahub/data-models/addon/entity/person/render-props.ts
index 4a9860a86c..66a8aab428 100644
--- a/datahub-web/@datahub/data-models/addon/entity/person/render-props.ts
+++ b/datahub-web/@datahub/data-models/addon/entity/person/render-props.ts
@@ -58,7 +58,7 @@ export const getRenderProps = (): IEntityRenderProps => {
searchResultEntityFields: {
description: 'title',
pictureUrl: 'editableInfo.pictureLink',
- name: 'username'
+ name: 'info.fullName'
},
showFacets: false,
placeholder: 'Search for People...',
diff --git a/datahub-web/@datahub/entity-deprecation/addon/components/entity-deprecation.ts b/datahub-web/@datahub/entity-deprecation/addon/components/entity-deprecation.ts
index 9642f06f82..e09c4dfffb 100644
--- a/datahub-web/@datahub/entity-deprecation/addon/components/entity-deprecation.ts
+++ b/datahub-web/@datahub/entity-deprecation/addon/components/entity-deprecation.ts
@@ -70,13 +70,6 @@ export default class EntityDeprecation extends Component {
*/
centeredDate: Date = this.selectedDate;
- /**
- * Before a user can update the deprecation status to deprecated, they must acknowledge that even if the
- * entity is deprecated they must still keep it compliant.
- * @type {boolean}
- */
- isDeprecationAcknowledged: boolean = false;
-
/**
* Expected to be passed in if we plan on using the default entity deprecation acknowledgement template,
* leads to a more info link for the user about deprecation of such entity
@@ -84,14 +77,6 @@ export default class EntityDeprecation extends Component {
*/
entityDecommissionWikiLink?: string;
- /**
- * Optionally passed in if the entity should have an acknowledgement message/structure that differs from
- * our default provided partial. If not passed in, constructor will automatically populate this with the
- * default acknowledgement
- * @type {string}
- */
- deprecationAcknowledgementTemplate!: string;
-
/**
* The earliest date a user can select as a decommission date
* @type {Date}
@@ -116,13 +101,6 @@ export default class EntityDeprecation extends Component {
@reads('deprecationNote')
deprecationNoteAlias!: EntityDeprecation['deprecationNote'];
- didInsertElement(): void {
- super.didInsertElement();
-
- typeof this.deprecationAcknowledgementTemplate === 'string' ||
- set(this, 'deprecationAcknowledgementTemplate', 'partials/entity-deprecation/default-acknowledgement');
- }
-
/**
* Invokes the save action with the updated values for deprecated status, decommission time, and
* deprecation note. The actual save functionality should be handled by
@@ -155,13 +133,4 @@ export default class EntityDeprecation extends Component {
onDecommissionDateChange(decommissionTime: Date): void {
set(this, 'decommissionTime', new Date(decommissionTime).getTime());
}
-
- /**
- * When a user clicks the checkbox to acknolwedge or cancel the acknolwedgement of the notice for
- * deprecating an entity
- */
- @action
- onAcknowledgeDeprecationNotice(): void {
- this.toggleProperty('isDeprecationAcknowledged');
- }
}
diff --git a/datahub-web/@datahub/entity-deprecation/addon/templates/components/entity-deprecation.hbs b/datahub-web/@datahub/entity-deprecation/addon/templates/components/entity-deprecation.hbs
index a5f0daa22e..04c03666bd 100644
--- a/datahub-web/@datahub/entity-deprecation/addon/templates/components/entity-deprecation.hbs
+++ b/datahub-web/@datahub/entity-deprecation/addon/templates/components/entity-deprecation.hbs
@@ -80,27 +80,13 @@
{{if decommissionTime (concat 'Will be decommissioned on ' (moment-format decommissionTime 'MMMM DD YYYY')) ''}}
-
-
- {{input
- type="checkbox"
- name="deprecated.acknowledge"
- id="acknowledge-deprecation"
- checked=(readonly isDeprecationAcknowledged)
- change=(action "onAcknowledgeDeprecationNotice")}}
-
-
- {{partial deprecationAcknowledgementTemplate}}
-
-
-
{{/if}}
+ disabled={{and isDeprecatedAlias (not decommissionTime)}}>
Update Deprecation Status
diff --git a/datahub-web/@datahub/entity-deprecation/tests/integration/components/entity-deprecation-test.ts b/datahub-web/@datahub/entity-deprecation/tests/integration/components/entity-deprecation-test.ts
index e961f878c6..95d80a1c51 100644
--- a/datahub-web/@datahub/entity-deprecation/tests/integration/components/entity-deprecation-test.ts
+++ b/datahub-web/@datahub/entity-deprecation/tests/integration/components/entity-deprecation-test.ts
@@ -1,6 +1,6 @@
import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
-import { render, find, findAll, click, fillIn } from '@ember/test-helpers';
+import { render, find, findAll } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
const findInput = (selector: string): HTMLInputElement => {
@@ -67,7 +67,6 @@ module('Integration | Component | entity-deprecation', function(hooks): void {
test('decommissionTime', async function(assert): Promise {
let isDisabled;
- assert.expect(3);
this.setProperties({
...defaultProperties,
@@ -83,58 +82,5 @@ module('Integration | Component | entity-deprecation', function(hooks): void {
isDisabled = findInput('.entity-deprecation__actions [type=submit]').disabled;
assert.ok(isDisabled, 'submit button is disabled');
-
- this.setProperties({ decommissionTime: new Date(), isDirty: true });
- await render(hbs`{{entity-deprecation
- entityName=entityName
- isDeprecated=deprecated
- decommissionTime=decommissionTime
- updateDeprecation=(action updateDeprecation)}}`);
-
- await fillIn('.entity-deprecation__note-editor .medium-editor-element', 'text');
-
- isDisabled = findInput('.entity-deprecation__actions [type=submit]').disabled;
- assert.ok(isDisabled, 'submit button is disabled if we only fill in decomissionTime');
-
- await click('#acknowledge-deprecation');
-
- isDisabled = findInput('.entity-deprecation__actions [type=submit]').disabled;
- assert.notOk(isDisabled, 'submit button is disabled if we only fill in decomissionTime');
- });
-
- test('triggers the onUpdateDeprecation action when submitted', async function(assert): Promise {
- let submitActionCallCount = 0;
-
- this.setProperties({
- ...defaultProperties,
- submit(deprecated: boolean, note: string): void {
- submitActionCallCount++;
- assert.equal(deprecated, true, 'action is called with deprecation value of true');
- assert.equal(note, '', 'action is called with an empty deprecation note');
- },
- decommissionTime: new Date()
- });
-
- await render(hbs`{{entity-deprecation
- entityName=entityName
- isDeprecated=deprecated
- decommissionTime=decommissionTime
- updateDeprecation=(action submit)}}`);
-
- assert.equal(submitActionCallCount, 0, 'action is not called on render');
- assert.equal(
- (find('#dataset-is-deprecated') as HTMLInputElement).checked,
- false,
- 'deprecation checkbox is unchecked'
- );
-
- await click('#dataset-is-deprecated');
-
- assert.equal((find('#dataset-is-deprecated') as HTMLInputElement).checked, true, 'deprecation checkbox is checked');
-
- await click('#acknowledge-deprecation');
- await click('.entity-deprecation__actions [type=submit]');
-
- assert.equal(submitActionCallCount, 1, 'action is called once');
});
});
diff --git a/datahub-web/@datahub/metadata-types/types/entity/person/person-entity.d.ts b/datahub-web/@datahub/metadata-types/types/entity/person/person-entity.d.ts
index 2039a5da1b..d9d88a473c 100644
--- a/datahub-web/@datahub/metadata-types/types/entity/person/person-entity.d.ts
+++ b/datahub-web/@datahub/metadata-types/types/entity/person/person-entity.d.ts
@@ -8,6 +8,8 @@ export interface ICorpUserEditableInfo {
teams: Array;
// A self-assigned list of skills that the person claims to own
skills: Array;
+ // Reference to the picture URL for the person
+ pictureLink: string;
}
/**
diff --git a/datahub-web/packages/data-portal/app/components/dataset-authors.ts b/datahub-web/packages/data-portal/app/components/dataset-authors.ts
index 26ed559abd..447a3f4491 100644
--- a/datahub-web/packages/data-portal/app/components/dataset-authors.ts
+++ b/datahub-web/packages/data-portal/app/components/dataset-authors.ts
@@ -26,6 +26,7 @@ import { NotificationEvent } from '@datahub/utils/constants/notifications';
import { PersonEntity } from '@datahub/data-models/entity/person/person-entity';
import { task } from 'ember-concurrency';
import { ETaskPromise } from '@datahub/utils/types/concurrency';
+import DataModelsService from '@datahub/data-models/services/data-models';
type Comparator = -1 | 0 | 1;
@@ -89,6 +90,12 @@ export default class DatasetAuthors extends Component {
@service('user-lookup')
userLookup: UserLookup;
+ /**
+ * Injected service for our data models getter to access the PersonEntity class
+ */
+ @service('data-models')
+ dataModels!: DataModelsService;
+
/**
* If there are no changes to the ownership tab, we want to keep the save button disabled. Rather than
* try to compare two sets of prev vs new data, we just have a flag here that short stops the validation
@@ -187,14 +194,15 @@ export default class DatasetAuthors extends Component {
* @returns {OwnerWithAvatarRecord}
*/
datasetAuthorsOwnersAugmentedWithAvatars = (owner: IOwner): OwnerWithAvatarRecord => {
- const { avatarProperties } = this;
+ const { avatarProperties, dataModels } = this;
+ const PersonEntityClass = dataModels.getModel('people') as typeof PersonEntity;
return {
owner,
avatar: avatarProperties
? makeAvatar(avatarProperties)(owner)
: { imageUrl: '', imageUrlFallback: '/assets/images/default_avatar.png' },
- profile: PersonEntity.profileLinkFromUsername(owner.userName)
+ profile: PersonEntityClass.urnFromUsername(owner.userName)
};
};
diff --git a/datahub-web/packages/data-portal/app/components/search/containers/search-box.ts b/datahub-web/packages/data-portal/app/components/search/containers/search-box.ts
index 999899cc4f..b0b6aa6bec 100644
--- a/datahub-web/packages/data-portal/app/components/search/containers/search-box.ts
+++ b/datahub-web/packages/data-portal/app/components/search/containers/search-box.ts
@@ -16,6 +16,7 @@ import { facetToParamUrl } from 'wherehows-web/utils/api/search/search';
import RouterService from '@ember/routing/router-service';
import { task } from 'ember-concurrency';
import { ETaskPromise } from '@datahub/utils/types/concurrency';
+import DataModelsService from '@datahub/data-models/services/data-models';
/**
* Search box container that handle all the data part for
@@ -29,6 +30,9 @@ export default class SearchBoxContainer extends Component {
@service
search: SearchService;
+ @service('data-models')
+ dataModels!: DataModelsService;
+
@alias('search.entity')
entity?: DataModelName;
@@ -44,9 +48,9 @@ export default class SearchBoxContainer extends Component {
*/
@computed('entity')
get dataModelEntity(): DataModelEntity | undefined {
- const { entity } = this;
- if (entity) {
- return DataModelEntity[entity];
+ const { entity, dataModels } = this;
+ if (entity && dataModels) {
+ return dataModels.getModel(entity);
}
return;
}
@@ -58,8 +62,15 @@ export default class SearchBoxContainer extends Component {
* @returns {(IterableIterator>>)}
* @memberof SearchBoxContainer
*/
- @task(function*(query: string = '', entity?: DataModelName): IterableIterator>> {
- return yield typeaheadQueryProcessor(query, entity, grammarProcessingSteps);
+ @task(function*(
+ this: SearchBoxContainer,
+ query: string = '',
+ entity?: DataModelName
+ ): IterableIterator>> {
+ const { dataModels } = this;
+ if (entity) {
+ return yield typeaheadQueryProcessor(query, dataModels.getModel(entity), grammarProcessingSteps);
+ }
})
onSearchInputTask: ETaskPromise>;
@@ -71,17 +82,20 @@ export default class SearchBoxContainer extends Component {
*/
onSearch(text: string = '', entity: DataModelName = DatasetEntity.displayName): void {
// entity (dropdown value) might be different than this.entity (Page that you are in)
- const dataModelEntity = DataModelEntity[entity];
- const { attributes } = dataModelEntity.renderProps.search;
- const defaultFacets = facetToParamUrl(transformDefaultsIntoSelections(getFacetDefaultValueForEntity(attributes)));
+ const { dataModels } = this;
+ if (entity) {
+ const dataModelEntity = dataModels.getModel(entity);
+ const { attributes } = dataModelEntity.renderProps.search;
+ const defaultFacets = facetToParamUrl(transformDefaultsIntoSelections(getFacetDefaultValueForEntity(attributes)));
- this.router.transitionTo('search', {
- queryParams: {
- entity,
- keyword: text,
- page: 1,
- facets: defaultFacets
- }
- });
+ this.router.transitionTo('search', {
+ queryParams: {
+ entity,
+ keyword: text,
+ page: 1,
+ facets: defaultFacets
+ }
+ });
+ }
}
}
diff --git a/datahub-web/packages/data-portal/app/components/search/search-result.ts b/datahub-web/packages/data-portal/app/components/search/search-result.ts
index 4b453cf8d6..75db6cfd5f 100644
--- a/datahub-web/packages/data-portal/app/components/search/search-result.ts
+++ b/datahub-web/packages/data-portal/app/components/search/search-result.ts
@@ -36,26 +36,38 @@ export default class SearchResult extends Component {
/**
* Result used in template
*/
- result?: DataModelEntityInstance;
+ result!: DataModelEntityInstance;
/**
* Config for search for this entity
*/
- searchConfig?: IEntityRenderCommonPropsSearch;
+ searchConfig!: IEntityRenderCommonPropsSearch;
/**
* Will return the name of the entity. By default it will use
* 'name' as field to fetch the name, otherwise it should be
* specified in 'entityNameField'
*/
@computed('searchConfig.entityNameField', 'entity')
- get name(): string | void {
- const { result, searchConfig = { searchResultEntityFields: { name: 'name' } } } = this;
- if (result) {
- const { searchResultEntityFields = { name: 'name' } } = searchConfig;
- const { name = 'name' } = searchResultEntityFields;
+ get name(): string | undefined {
+ const { result, searchConfig } = this;
+ const { searchResultEntityFields = {} } = searchConfig;
+ const { name = 'name' } = searchResultEntityFields || {};
- return result[name as CompatibleKeysThatReturnString];
- }
+ return get(result, name as CompatibleKeysThatReturnString);
+ }
+
+ /**
+ * Will return the description of the entity. By default it will use
+ * 'description' as field to fetch the description, otherwise it should be
+ * specified in 'entityDescriptionField'
+ */
+ @computed('searchConfig.descriptionField', 'entity')
+ get description(): string | undefined {
+ const { result, searchConfig } = this;
+ const { searchResultEntityFields = {} } = searchConfig;
+ const { description = 'description' } = searchResultEntityFields || {};
+
+ return result[description as CompatibleKeysThatReturnString];
}
/**
diff --git a/datahub-web/packages/data-portal/app/templates/components/dataset-author.hbs b/datahub-web/packages/data-portal/app/templates/components/dataset-author.hbs
index cad13a2c99..eecb3dc21c 100644
--- a/datahub-web/packages/data-portal/app/templates/components/dataset-author.hbs
+++ b/datahub-web/packages/data-portal/app/templates/components/dataset-author.hbs
@@ -4,9 +4,9 @@
{{avatars/avatar-image avatar=@owner.avatar}}
{{/unless}}
-
+
{{ownerRecord.userName}}
-
+
{{#if isOwnerInActive}}
diff --git a/datahub-web/packages/data-portal/app/typings/app/search/fields.d.ts b/datahub-web/packages/data-portal/app/typings/app/search/fields.d.ts
new file mode 100644
index 0000000000..e1c1d4d3d1
--- /dev/null
+++ b/datahub-web/packages/data-portal/app/typings/app/search/fields.d.ts
@@ -0,0 +1,15 @@
+/**
+ * Api expected request params for suggestion values autocomplete
+ */
+export interface IFieldValuesRequest {
+ input: string;
+ facet?: string;
+}
+
+/**
+ * Api expected response for suggestion values autocomplete
+ */
+export interface IFieldValuesResponse {
+ input: string;
+ source: Array;
+}
diff --git a/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/index.ts b/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/index.ts
index 215c2b4467..11c76169cf 100644
--- a/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/index.ts
+++ b/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/index.ts
@@ -13,7 +13,7 @@ import { generateGroups } from 'wherehows-web/utils/parsers/autocomplete/steps/g
import { arrayReduce } from 'wherehows-web/utils/array';
import { createSuggestionsFromError } from 'wherehows-web/utils/parsers/helpers';
import { DatasetEntity } from '@datahub/data-models/entity/dataset/dataset-entity';
-import { DataModelName } from '@datahub/data-models/constants/entity';
+import { DataModelEntity } from '@datahub/data-models/constants/entity';
/**
* Steps of the grammar process
@@ -40,7 +40,7 @@ export const grammarProcessingSteps: Array = [
*/
export const typeaheadQueryProcessor = async (
query: string,
- entity: DataModelName = DatasetEntity.displayName,
+ entity: DataModelEntity = DatasetEntity,
steps: Array
): Promise> => {
const initArgs: Pick = { text: query, entity };
diff --git a/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/processors/entity.ts b/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/processors/entity.ts
index b8c901609e..b88b499f4f 100644
--- a/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/processors/entity.ts
+++ b/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/processors/entity.ts
@@ -1,7 +1,8 @@
import {
INodeProcessor,
AutocompleteRuleNames,
- ISuggestionBuilder
+ ISuggestionBuilder,
+ ISuggestion
} from 'wherehows-web/utils/parsers/autocomplete/types';
import { fetchFacetValue } from 'wherehows-web/utils/parsers/helpers';
@@ -12,17 +13,20 @@ import { fetchFacetValue } from 'wherehows-web/utils/parsers/helpers';
export const entityProcessor: INodeProcessor = {
[AutocompleteRuleNames.EntityName]: async (builder: ISuggestionBuilder): Promise => {
const input = builder.textLastWord || '';
- const suggestions = await fetchFacetValue('name', input, builder.entity);
+ const nameField = builder.entity.renderProps.search.autocompleteNameField || 'name';
+ const suggestions = await fetchFacetValue(nameField, input, builder.entity);
return {
...builder,
datasets: [
...builder.datasets,
- ...(suggestions || []).map(entityName => ({
- title: entityName,
- text: `${builder.textPrevious}${entityName} `,
- description: ''
- }))
+ ...(suggestions || []).map(
+ (entityName): ISuggestion => ({
+ title: entityName,
+ text: `${builder.textPrevious}${entityName} `,
+ description: ''
+ })
+ )
]
};
}
diff --git a/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/processors/facets.ts b/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/processors/facets.ts
index 4d22c9dd71..12bf2e1663 100644
--- a/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/processors/facets.ts
+++ b/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/processors/facets.ts
@@ -7,7 +7,6 @@ import {
} from 'wherehows-web/utils/parsers/autocomplete/types';
import { dataToString } from 'wherehows-web/utils/parsers/autocomplete/utils';
import { ISearchEntityRenderProps } from '@datahub/data-models/types/entity/rendering/search-entity-render-prop';
-import { DataModelEntity } from '@datahub/data-models/constants/entity';
import { fetchFacetValue } from 'wherehows-web/utils/parsers/helpers';
/**
@@ -52,7 +51,7 @@ export const facetsProcessor: INodeProcessor = {
* When 'name' is expected we just return 'name:' as suggestion
*/
[AutocompleteRuleNames.FacetName]: (builder: ISuggestionBuilder, ruleState: IState): Promise => {
- const allFields: Array = DataModelEntity[builder.entity].renderProps.search.attributes;
+ const allFields: Array = builder.entity.renderProps.search.attributes;
const facetName = getFacetNameFromStateRule(ruleState);
const fields = allFields.filter(
(field): boolean => field.fieldName.indexOf(facetName) >= 0 && field.showInAutoCompletion
diff --git a/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/steps/generate-groups.ts b/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/steps/generate-groups.ts
index e5cd693484..172ef2ecac 100644
--- a/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/steps/generate-groups.ts
+++ b/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/steps/generate-groups.ts
@@ -14,7 +14,8 @@ export const generateGroups = (builder: ISuggestionBuilder): ISuggestionBuilder
const isEntityNamesEmpty = builder.datasets.length === 0;
const expectedEntityName = !!builder.wantedRulesMap[AutocompleteRuleNames.EntityName];
const lastWordLength = typeof builder.textLastWord === 'string' ? builder.textLastWord.trim().length : -1;
- const entityDisplayName = capitalize(builder.entity);
+ const entityModel = builder.entity;
+ const entityDisplayName = capitalize(entityModel.displayName);
if (isEntityNamesEmpty && expectedEntityName && lastWordLength < 3) {
groups.push({
diff --git a/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/types.ts b/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/types.ts
index d818db3068..c11d65168d 100644
--- a/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/types.ts
+++ b/datahub-web/packages/data-portal/app/utils/parsers/autocomplete/types.ts
@@ -43,7 +43,7 @@ export type INodeFacetProcessor = Record<
* The structure is not intented to be mutated, redux like approach
*/
export interface ISuggestionBuilder {
- entity: DataModelEntity['displayName'];
+ entity: DataModelEntity;
logicalOperators: Array;
facetNames: Array;
datasets: Array;
diff --git a/datahub-web/packages/data-portal/app/utils/parsers/helpers.ts b/datahub-web/packages/data-portal/app/utils/parsers/helpers.ts
index cbb50fe3f8..1be239b75e 100644
--- a/datahub-web/packages/data-portal/app/utils/parsers/helpers.ts
+++ b/datahub-web/packages/data-portal/app/utils/parsers/helpers.ts
@@ -1,5 +1,5 @@
import { ISuggestionGroup } from 'wherehows-web/utils/parsers/autocomplete/types';
-import { DataModelEntity, DataModelName } from '@datahub/data-models/constants/entity';
+import { DataModelEntity } from '@datahub/data-models/constants/entity';
import { IFieldValuesResponseV2, FieldValuesRequestV2 } from 'wherehows-web/typings/app/search/fields-v2';
import { facetValuesApiEntities } from 'wherehows-web/utils/parsers/autocomplete/utils';
@@ -24,12 +24,13 @@ export const createSuggestionsFromError = (error: string): Array> => {
// otherwise lets invoke api to fetch values
let suggestions: Array = [];
- const { apiName, attributes } = DataModelEntity[entity].renderProps.search;
- const fieldMeta = attributes.find((attr): boolean => attr.fieldName === facetName);
+ const searchRenderProps = entity.renderProps.search;
+ const searchAttributes = searchRenderProps.attributes;
+ const fieldMeta = searchAttributes.find((attr): boolean => attr.fieldName === facetName);
const { minAutocompleteFetchLength } = fieldMeta || { minAutocompleteFetchLength: undefined };
const cacheKey = `${facetName}:${facetValue}`;
@@ -38,7 +39,7 @@ export const fetchFacetValue = async (
const request: FieldValuesRequestV2> = {
field: facetName,
input: facetValue,
- type: apiName
+ type: searchRenderProps.apiName
};
const facetValueReturn: IFieldValuesResponseV2 | undefined = await facetValuesApiEntities({
query: facetValue,
diff --git a/datahub-web/packages/data-portal/tests/integration/components/search/search-result-test.ts b/datahub-web/packages/data-portal/tests/integration/components/search/search-result-test.ts
index f288c0ce1e..283ffd3b3e 100644
--- a/datahub-web/packages/data-portal/tests/integration/components/search/search-result-test.ts
+++ b/datahub-web/packages/data-portal/tests/integration/components/search/search-result-test.ts
@@ -34,32 +34,32 @@ module('Integration | Component | search/search-result', function(hooks) {
}
});
- test('it renders', async function(assert) {
+ test('it renders', async function(assert): Promise {
assert.expect(1);
const result = createEntity();
- this.setProperties({ fields: [], result });
- await render(hbs`{{search/search-result
- result=result.data
- meta=result.meta
- resultFields=fields
- }}`);
+ this.setProperties({ searchConfig: { attributes: [] }, result });
+ await render(hbs` `);
assert.ok(find('.search-result'), 'expected component to have a class `search-result`');
});
- test('search-result properties', async function(assert) {
+ test('search-result properties', async function(assert): Promise {
assert.expect(1);
const result = createEntity();
- this.setProperties({ fields: [], result });
- await render(hbs`{{search/search-result
- result=result.data
- meta=result.meta
- resultFields=fields
- }}`);
+ this.setProperties({ searchConfig: { attributes: [] }, result });
+ await render(hbs` `);
const searchResultElement: Element | null = find('.search-result');
const title = searchResultElement && searchResultElement.querySelector('.search-result__title');
diff --git a/datahub-web/packages/data-portal/tests/unit/utils/parsers/autocomplete-test.ts b/datahub-web/packages/data-portal/tests/unit/utils/parsers/autocomplete-test.ts
deleted file mode 100644
index 0a5ab241ae..0000000000
--- a/datahub-web/packages/data-portal/tests/unit/utils/parsers/autocomplete-test.ts
+++ /dev/null
@@ -1,311 +0,0 @@
-import { module, test } from 'qunit';
-import { grammarProcessingSteps, typeaheadQueryProcessor } from 'wherehows-web/utils/parsers/autocomplete';
-import { startMirage } from 'wherehows-web/initializers/ember-cli-mirage';
-import { IMirageServer } from '@datahub/utils/types/vendor/ember-cli-mirage-deprecated';
-import { IMirageWherehows } from 'wherehows-web/typings/ember-cli-mirage';
-import { ISuggestionGroup } from 'wherehows-web/utils/parsers/autocomplete/types';
-import { DatasetEntity } from '@datahub/data-models/entity/dataset/dataset-entity';
-import { DataModelName } from '@datahub/data-models/constants/entity';
-
-interface ITestSet {
- entity: DataModelName;
- description: string;
- text: string;
- results: Array;
-}
-
-const createTests = (server: IMirageWherehows): Array => {
- server.create('datasetView', { name: 'platform' });
- server.create('datasetView', { name: 'pageviewevent' });
- server.create('platform', { name: 'hive' });
- server.create('platform', { name: 'mysql' });
-
- return [
- {
- entity: DatasetEntity.displayName,
- description: 'Initial suggestions',
- text: '',
- results: [
- {
- groupName: 'Datasets',
- options: [
- {
- disabled: true,
- text: '',
- title: 'type at least 3 more characters to see Datasets names'
- }
- ]
- },
- {
- groupName: 'Filter By',
- options: [
- {
- description: 'The origin of the dataset, e.g.: origin:PROD',
- text: 'origin:',
- title: 'origin:'
- },
- {
- description: 'The name of the dataset, e.g.: name:TRACKING.PageViewEvent',
- text: 'name:',
- title: 'name:'
- },
- {
- description: 'The confirmed owners for the dataset, e.g.: owners:sweaver',
- text: 'owners:',
- title: 'owners:'
- },
- {
- description: 'The platform of the dataset, e.g.: platform:kafka',
- text: 'platform:',
- title: 'platform:'
- }
- ]
- }
- ]
- },
- {
- entity: DatasetEntity.displayName,
- description: '1 Dataset',
- text: 'pageview',
- results: [
- {
- groupName: 'Datasets',
- options: [
- {
- description: '',
- text: 'pageviewevent ',
- title: 'pageviewevent'
- }
- ]
- }
- ]
- },
- {
- entity: DatasetEntity.displayName,
- description: 'Dataset with filter 1',
- text: 'pageview AND platfo',
- results: [
- {
- groupName: 'Filter By',
- options: [
- {
- description: 'The platform of the dataset, e.g.: platform:kafka',
- text: 'pageview AND platform:',
- title: 'platform:'
- }
- ]
- },
- {
- groupName: 'Datasets',
- options: [
- {
- description: '',
- text: 'pageview AND platform ',
- title: 'platform'
- }
- ]
- }
- ]
- },
- {
- entity: DatasetEntity.displayName,
- description: 'Dataset with filter 2',
- text: 'pageview AND platform',
- results: [
- {
- groupName: 'Filter By',
- options: [
- {
- description: 'The platform of the dataset, e.g.: platform:kafka',
- text: 'pageview AND platform:',
- title: 'platform:'
- }
- ]
- },
- {
- groupName: 'Datasets',
- options: [
- {
- description: '',
- text: 'pageview AND platform ',
- title: 'platform'
- }
- ]
- }
- ]
- },
- {
- entity: DatasetEntity.displayName,
- description: 'Dataset with filter 3',
- text: 'pageview AND name:pageview',
- results: [
- {
- groupName: 'Filter By',
- options: [
- {
- text: 'pageview AND name:pageviewevent ',
- title: 'name:pageviewevent'
- }
- ]
- }
- ]
- },
- // TODO: update tests with sample api response data for "text: 'platform:'", "text: 'platform:my'", and "text: 'origin:co'"
- {
- entity: DatasetEntity.displayName,
- description: 'Dataset with filter platform',
- text: 'platform:',
- results: []
- },
- {
- entity: DatasetEntity.displayName,
- description: 'Dataset with filter platform my',
- text: 'platform:my',
- results: []
- },
- {
- entity: DatasetEntity.displayName,
- description: 'Dataset with filter fabric',
- text: 'origin:co',
- results: []
- },
- {
- entity: DatasetEntity.displayName,
- description: 'Logical Operators',
- text: 'something AN',
- results: [
- {
- groupName: 'Datasets',
- options: [
- {
- disabled: true,
- text: '',
- title: 'type at least 1 more characters to see Datasets names'
- }
- ]
- },
- {
- groupName: 'Operators',
- options: [
- {
- text: 'something AND ',
- title: 'AND'
- }
- ]
- }
- ]
- },
- {
- entity: DatasetEntity.displayName,
- description: 'Logical Operators',
- text: 'something O',
- results: [
- {
- groupName: 'Datasets',
- options: [
- {
- disabled: true,
- text: '',
- title: 'type at least 2 more characters to see Datasets names'
- }
- ]
- },
- {
- groupName: 'Operators',
- options: [
- {
- text: 'something OR ',
- title: 'OR'
- }
- ]
- }
- ]
- },
- {
- entity: DatasetEntity.displayName,
- description: 'Invalid Syntax',
- text: 'notreallyafacet:',
- results: []
- },
- {
- entity: DatasetEntity.displayName,
- description: 'Next things',
- text: 'something ',
- results: [
- {
- groupName: 'Datasets',
- options: [
- {
- disabled: true,
- text: '',
- title: 'type at least 3 more characters to see Datasets names'
- }
- ]
- },
- {
- groupName: 'Operators',
- options: [
- {
- text: 'something AND ',
- title: 'AND'
- },
- {
- text: 'something OR ',
- title: 'OR'
- }
- ]
- },
- {
- groupName: 'Filter By',
- options: [
- {
- description: 'The origin of the dataset, e.g.: origin:PROD',
- text: 'something origin:',
- title: 'origin:'
- },
- {
- description: 'The name of the dataset, e.g.: name:TRACKING.PageViewEvent',
- text: 'something name:',
- title: 'name:'
- },
- {
- description: 'The confirmed owners for the dataset, e.g.: owners:sweaver',
- text: 'something owners:',
- title: 'owners:'
- },
- {
- description: 'The platform of the dataset, e.g.: platform:kafka',
- text: 'something platform:',
- title: 'platform:'
- }
- ]
- }
- ]
- }
- ];
-};
-
-module('Unit | Utility | Autocomplete Suggestions', function(hooks) {
- let server: IMirageServer;
- hooks.beforeEach(function() {
- server = startMirage();
- });
-
- hooks.afterEach(function() {
- server.shutdown();
- });
-
- test('Suggestions returns as expected', async function(assert) {
- const tests = createTests(server);
-
- assert.expect(tests.length);
-
- // tests must be resolved in sequence since processing includes some debouncing
- await tests.reduce(async (previousResolution: Promise, myTest: ITestSet): Promise => {
- await previousResolution;
- const result = await typeaheadQueryProcessor(myTest.text, myTest.entity, grammarProcessingSteps);
-
- assert.deepEqual(result, myTest.results, myTest.description);
- }, Promise.resolve());
- });
-});