diff --git a/packages/clay-autocomplete/src/ClayAutocomplete.js b/packages/clay-autocomplete/src/ClayAutocomplete.js index 508f818ea5..780c6e7105 100644 --- a/packages/clay-autocomplete/src/ClayAutocomplete.js +++ b/packages/clay-autocomplete/src/ClayAutocomplete.js @@ -70,7 +70,7 @@ class ClayAutocomplete extends ClayComponent { const item = this.filteredItems[Number(index)]; return !this.emit({ - data: item, + data: item.data, name: 'itemSelected', originalEvent: event, }); @@ -155,6 +155,7 @@ class ClayAutocomplete extends ClayComponent { data: { value: this.refs.input.value, key: event.key, + eventFromInput: event.delegateTarget.tagName === 'INPUT', }, name: 'inputOnKeydown', originalEvent: event, @@ -268,9 +269,11 @@ ClayAutocomplete.STATE = { * @instance * @default (elem) => elem * @memberof ClayAutocomplete - * @type {?(function|undefined)} + * @type {?(function|string)} */ - extractData: Config.func(), + extractData: Config.oneOfType([Config.func(), Config.string()]).value( + elem => elem + ), /** * List of filtered items for suggestion or autocomplete. diff --git a/packages/clay-autocomplete/src/__tests__/ClayAutocomplete.js b/packages/clay-autocomplete/src/__tests__/ClayAutocomplete.js index ae4d23fcf7..66f5b651cd 100644 --- a/packages/clay-autocomplete/src/__tests__/ClayAutocomplete.js +++ b/packages/clay-autocomplete/src/__tests__/ClayAutocomplete.js @@ -151,8 +151,9 @@ describe('ClayAutocomplete', function() { expect(spy).toHaveBeenCalledWith( expect.objectContaining({ data: { - value: 'foo', + eventFromInput: true, key: 'o', + value: 'foo', }, name: 'inputOnKeydown', originalEvent: expect.any(Object), @@ -205,7 +206,7 @@ describe('ClayAutocomplete', function() { expect(spy).toHaveBeenCalled(); expect(spy).toHaveBeenCalledWith( expect.objectContaining({ - data: expect.any(Object), + data: 'Bread', name: 'itemSelected', originalEvent: expect.any(Object), }) @@ -238,7 +239,7 @@ describe('ClayAutocomplete', function() { expect(spy).toHaveBeenCalled(); expect(spy).toHaveBeenCalledWith( expect.objectContaining({ - data: expect.any(Object), + data: 'Bread', name: 'itemSelected', originalEvent: expect.any(Object), }) @@ -262,7 +263,7 @@ describe('ClayAutocomplete', function() { expect(spy).not.toHaveBeenCalledWith( expect.objectContaining({ - data: expect.any(Object), + data: 'Bread', name: 'itemSelected', originalEvent: expect.any(Object), }) diff --git a/packages/clay-data-provider/src/ClayDataProvider.js b/packages/clay-data-provider/src/ClayDataProvider.js index 130848fd97..84c2f739fd 100644 --- a/packages/clay-data-provider/src/ClayDataProvider.js +++ b/packages/clay-data-provider/src/ClayDataProvider.js @@ -104,6 +104,25 @@ class ClayDataProvider extends ClayComponent { } } + /** + * Handles data mapping. + * @param {!(function|string)} param + * @param {!Array} data + * @protected + * @return {!(string|number)} + */ + _performCall(param, data) { + if (typeof param === 'function') { + return param(data); + } + + if (typeof data === 'string') { + return data; + } + + return data[param]; + } + /** * @inheritDoc */ @@ -131,7 +150,7 @@ class ClayDataProvider extends ClayComponent { /** * Helper method to filter a list based on a string. * @param {!string} query - * @param {?function} extract + * @param {?(function|string)} extract * @public * @return {Array} A list of items containing the corresponding characters */ @@ -142,15 +161,16 @@ class ClayDataProvider extends ClayComponent { return this._dataSource .reduce((prev, element, index) => { - let string = extract(element); + let string = this._performCall(extract, element); let result = match(query, string); if (result != null) { prev[prev.length] = { + data: element, index, matches: result.values, - originalString: string, score: result.score, + value: string, }; } diff --git a/packages/clay-data-provider/src/__tests__/ClayDataProvider.js b/packages/clay-data-provider/src/__tests__/ClayDataProvider.js index d351cca273..2f3b11acdc 100644 --- a/packages/clay-data-provider/src/__tests__/ClayDataProvider.js +++ b/packages/clay-data-provider/src/__tests__/ClayDataProvider.js @@ -75,6 +75,7 @@ describe('ClayDataProvider', function() { expect(filteredItem).toEqual([ { + data: 'Bread', index: 0, matches: [ {match: true, value: 'B'}, @@ -83,7 +84,7 @@ describe('ClayDataProvider', function() { {match: true, value: 'a'}, {value: 'd'}, ], - originalString: 'Bread', + value: 'Bread', score: 26, }, ]); diff --git a/packages/clay-multi-select/demos/a11y.html b/packages/clay-multi-select/demos/a11y.html index d9a860165a..8f57d6483a 100644 --- a/packages/clay-multi-select/demos/a11y.html +++ b/packages/clay-multi-select/demos/a11y.html @@ -33,15 +33,8 @@