Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Lens] Editor state 2 #36513

Merged
merged 60 commits into from
May 27, 2019
Merged
Changes from 1 commit
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
6d6f304
add nativerenderer component
flash1293 May 7, 2019
44894df
use native renderer in app and editor frame
flash1293 May 7, 2019
943fca8
remove prop types
flash1293 May 7, 2019
731e264
add unit test and fix linting issues
flash1293 May 8, 2019
cc1a0db
rename test suite
flash1293 May 8, 2019
18f9d83
rename prop and adjust shallow comparison function
flash1293 May 9, 2019
60cd891
add documentation
flash1293 May 9, 2019
0eb1f31
move native renderer to top level directory
flash1293 May 9, 2019
0f652c3
Merge remote-tracking branch 'upstream/feature/lens' into lens/native…
flash1293 May 10, 2019
a21b0ea
add test, fix linting error and improve shallow equal comparison
flash1293 May 10, 2019
34e9328
Merge remote-tracking branch 'upstream/feature/lens' into lens/native…
flash1293 May 10, 2019
b124f88
Merge branch 'feature/lens' into lens/native-renderer
flash1293 May 10, 2019
36de942
Implement basic editor frame state handling
wylieconlon May 3, 2019
7445372
Merge remote-tracking branch 'upstream/feature/lens' into lens/native…
flash1293 May 10, 2019
0395e9a
Merge branch 'feature/lens' into lens/editor-state
flash1293 May 10, 2019
8147aaa
fix linting errors
flash1293 May 10, 2019
4baf6b1
fix native renderer tests
flash1293 May 10, 2019
d33576e
Merge branch 'lens/native-renderer' into lens/editor-state
flash1293 May 10, 2019
033a632
re structure editor frame
flash1293 May 10, 2019
345e20f
fix tests
flash1293 May 10, 2019
48203dd
move layout to a separate component
flash1293 May 10, 2019
dece47f
Merge remote-tracking branch 'upstream/feature/lens' into lens/native…
flash1293 May 12, 2019
7469315
Merge branch 'lens/native-renderer' into lens/editor-state
flash1293 May 12, 2019
ee6fdbc
clean up and improve typings
flash1293 May 12, 2019
396cf1c
add tests for plugin itself
flash1293 May 12, 2019
5a21a43
Merge branch 'feature/lens' into lens/native-renderer
flash1293 May 12, 2019
c383c3e
Merge branch 'lens/native-renderer' into lens/editor-state
flash1293 May 12, 2019
6f8c295
start implementing suggestion control flow
flash1293 May 12, 2019
b61008c
refactor control flow and add visualization switch action dispatch
flash1293 May 12, 2019
cae9fe0
move mock builder into separate file and fix tests
flash1293 May 12, 2019
3f48c98
remove unused import
flash1293 May 13, 2019
7cdea68
add tests for suggestions
flash1293 May 13, 2019
d63d2f9
correct typo
flash1293 May 13, 2019
52cad4f
rework suggestion stuff
flash1293 May 14, 2019
d776b54
Merge branch 'feature/lens' into lens/editor-state
flash1293 May 20, 2019
3221830
Merge branch 'lens/editor-state' into lens/editor-state-2
flash1293 May 20, 2019
f05024b
resolve conflicts
flash1293 May 20, 2019
1c24cb5
Merge branch 'lens/editor-state' into lens/editor-state-2
flash1293 May 20, 2019
bc0c85a
start implementing drop fiel control flow
flash1293 May 20, 2019
fe1356e
Merge branch 'feature/lens' into lens/editor-state
flash1293 May 21, 2019
a562914
Merge branch 'feature/lens' into lens/editor-state
flash1293 May 21, 2019
3d055ee
adress review and restructure state
flash1293 May 21, 2019
7c3a2c8
align naming
flash1293 May 21, 2019
849f3a1
add comment
flash1293 May 21, 2019
ff5092b
Merge branch 'lens/editor-state' into lens/editor-state-2
flash1293 May 21, 2019
7540916
fix merge conflict
flash1293 May 21, 2019
7b8c21a
refactor and add tests
flash1293 May 21, 2019
0c721a7
more refactoring
flash1293 May 21, 2019
21c8756
only save single visualization state
flash1293 May 21, 2019
b31032b
Merge branch 'lens/editor-state' into lens/editor-state-2
flash1293 May 21, 2019
fc47428
add comment
flash1293 May 21, 2019
eb8f2e8
start adding tests for suggestion helpers and improve mock typing
flash1293 May 21, 2019
e0be753
improve getSuggestions tests
flash1293 May 22, 2019
e464ce2
add i18n
flash1293 May 22, 2019
7f1d66d
use jest types
flash1293 May 22, 2019
0bfb2d3
Merge remote-tracking branch 'upstream/feature/lens' into lens/editor…
flash1293 May 22, 2019
0e6fd91
Merge branch 'feature/lens' into lens/editor-state-2
flash1293 May 23, 2019
1b1c9b7
review fixes
flash1293 May 23, 2019
8652dd2
remove roles from API
flash1293 May 23, 2019
082a2d3
simplify API and fix i18n context in tests
flash1293 May 24, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
simplify API and fix i18n context in tests
flash1293 committed May 24, 2019

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
commit 082a2d3c57d18155c460106bfb829f1c5aec4520
Original file line number Diff line number Diff line change
@@ -5,7 +5,8 @@
*/

import React from 'react';
import { mount, ReactWrapper } from 'enzyme';
import { ReactWrapper } from 'enzyme';
import { mountWithIntl as mount } from 'test_utils/enzyme_helpers';
import { EditorFrame } from './editor_frame';
import { Visualization, Datasource, DatasourcePublicAPI } from '../../types';
import { act } from 'react-dom/test-utils';
@@ -474,13 +475,13 @@ describe('editor_frame', () => {
...mockVisualization,
getSuggestions: () => [
{
datasourceSuggestionId: 0,
tableIndex: 0,
score: 0.5,
state: {},
title: 'Suggestion2',
},
{
datasourceSuggestionId: 0,
tableIndex: 0,
score: 0.8,
state: {},
title: 'Suggestion1',
@@ -491,13 +492,13 @@ describe('editor_frame', () => {
...mockVisualization,
getSuggestions: () => [
{
datasourceSuggestionId: 0,
tableIndex: 0,
score: 0.4,
state: {},
title: 'Suggestion4',
},
{
datasourceSuggestionId: 0,
tableIndex: 0,
score: 0.45,
state: {},
title: 'Suggestion3',
@@ -539,7 +540,7 @@ describe('editor_frame', () => {
...mockVisualization,
getSuggestions: () => [
{
datasourceSuggestionId: 0,
tableIndex: 0,
score: 0.8,
state: suggestionVisState,
title: 'Suggestion1',
@@ -594,13 +595,13 @@ describe('editor_frame', () => {
...mockVisualization,
getSuggestions: () => [
{
datasourceSuggestionId: 0,
tableIndex: 0,
score: 0.2,
state: {},
title: 'Suggestion1',
},
{
datasourceSuggestionId: 0,
tableIndex: 0,
score: 0.8,
state: suggestionVisState,
title: 'Suggestion2',
@@ -647,13 +648,13 @@ describe('editor_frame', () => {
...mockVisualization,
getSuggestions: () => [
{
datasourceSuggestionId: 0,
tableIndex: 0,
score: 0.2,
state: {},
title: 'Suggestion1',
},
{
datasourceSuggestionId: 0,
tableIndex: 0,
score: 0.6,
state: {},
title: 'Suggestion2',
@@ -664,7 +665,7 @@ describe('editor_frame', () => {
...mockVisualization2,
getSuggestions: () => [
{
datasourceSuggestionId: 0,
tableIndex: 0,
score: 0.8,
state: suggestionVisState,
title: 'Suggestion3',
Original file line number Diff line number Diff line change
@@ -105,7 +105,6 @@ export function EditorFrame(props: EditorFrameProps) {
<SuggestionPanel
activeDatasource={props.datasourceMap[state.datasource.activeId]}
activeVisualizationId={state.visualization.activeId}
datasourcePublicAPI={datasourcePublicAPI!}
datasourceState={state.datasource.state}
visualizationState={state.visualization.state}
visualizationMap={props.visualizationMap}
Original file line number Diff line number Diff line change
@@ -5,27 +5,25 @@
*/

import { getSuggestions } from './suggestion_helpers';
import { createMockVisualization, createMockDatasource } from '../mock_extensions';
import { createMockVisualization } from '../mock_extensions';
import { TableColumn } from '../../types';

describe('suggestion helpers', () => {
it('should return suggestions array', () => {
const mockVisualization = createMockVisualization();
const mockDatasource = createMockDatasource();
const suggestedState = {};
const suggestions = getSuggestions(
[{ state: {}, tableColumns: [] }],
{
vis1: {
...mockVisualization,
getSuggestions: () => [
{ datasourceSuggestionId: 0, score: 0.5, title: 'Test', state: suggestedState },
{ tableIndex: 0, score: 0.5, title: 'Test', state: suggestedState },
],
},
},
'vis1',
{},
mockDatasource.publicAPIMock
{}
);
expect(suggestions.length).toBe(1);
expect(suggestions[0].state).toBe(suggestedState);
@@ -34,55 +32,47 @@ describe('suggestion helpers', () => {
it('should concatenate suggestions from all visualizations', () => {
const mockVisualization1 = createMockVisualization();
const mockVisualization2 = createMockVisualization();
const mockDatasource = createMockDatasource();
const suggestions = getSuggestions(
[{ state: {}, tableColumns: [] }],
{
vis1: {
...mockVisualization1,
getSuggestions: () => [
{ datasourceSuggestionId: 0, score: 0.5, title: 'Test', state: {} },
{ datasourceSuggestionId: 0, score: 0.5, title: 'Test2', state: {} },
{ tableIndex: 0, score: 0.5, title: 'Test', state: {} },
{ tableIndex: 0, score: 0.5, title: 'Test2', state: {} },
],
},
vis2: {
...mockVisualization2,
getSuggestions: () => [
{ datasourceSuggestionId: 0, score: 0.5, title: 'Test3', state: {} },
],
getSuggestions: () => [{ tableIndex: 0, score: 0.5, title: 'Test3', state: {} }],
},
},
'vis1',
{},
mockDatasource.publicAPIMock
{}
);
expect(suggestions.length).toBe(3);
});

it('should rank the visualizations by score', () => {
const mockVisualization1 = createMockVisualization();
const mockVisualization2 = createMockVisualization();
const mockDatasource = createMockDatasource();
const suggestions = getSuggestions(
[{ state: {}, tableColumns: [] }],
{
vis1: {
...mockVisualization1,
getSuggestions: () => [
{ datasourceSuggestionId: 0, score: 0.2, title: 'Test', state: {} },
{ datasourceSuggestionId: 0, score: 0.8, title: 'Test2', state: {} },
{ tableIndex: 0, score: 0.2, title: 'Test', state: {} },
{ tableIndex: 0, score: 0.8, title: 'Test2', state: {} },
],
},
vis2: {
...mockVisualization2,
getSuggestions: () => [
{ datasourceSuggestionId: 0, score: 0.6, title: 'Test3', state: {} },
],
getSuggestions: () => [{ tableIndex: 0, score: 0.6, title: 'Test3', state: {} }],
},
},
'vis1',
{},
mockDatasource.publicAPIMock
{}
);
expect(suggestions[0].score).toBe(0.8);
expect(suggestions[1].score).toBe(0.6);
@@ -92,7 +82,6 @@ describe('suggestion helpers', () => {
it('should call all suggestion getters with all available data tables', () => {
const mockVisualization1 = createMockVisualization();
const mockVisualization2 = createMockVisualization();
const mockDatasource = createMockDatasource();
const table1: TableColumn[] = [];
const table2: TableColumn[] = [];
getSuggestions(
@@ -102,19 +91,17 @@ describe('suggestion helpers', () => {
vis2: mockVisualization2,
},
'vis1',
{},
mockDatasource.publicAPIMock
{}
);
expect(mockVisualization1.getSuggestions.mock.calls[0][0].tableColumns[0]).toBe(table1);
expect(mockVisualization1.getSuggestions.mock.calls[0][0].tableColumns[1]).toBe(table2);
expect(mockVisualization2.getSuggestions.mock.calls[0][0].tableColumns[0]).toBe(table1);
expect(mockVisualization2.getSuggestions.mock.calls[0][0].tableColumns[1]).toBe(table2);
expect(mockVisualization1.getSuggestions.mock.calls[0][0].tables[0]).toBe(table1);
expect(mockVisualization1.getSuggestions.mock.calls[0][0].tables[1]).toBe(table2);
expect(mockVisualization2.getSuggestions.mock.calls[0][0].tables[0]).toBe(table1);
expect(mockVisualization2.getSuggestions.mock.calls[0][0].tables[1]).toBe(table2);
});

it('should map the suggestion ids back to the correct datasource states', () => {
const mockVisualization1 = createMockVisualization();
const mockVisualization2 = createMockVisualization();
const mockDatasource = createMockDatasource();
const tableState1 = {};
const tableState2 = {};
const suggestions = getSuggestions(
@@ -123,20 +110,17 @@ describe('suggestion helpers', () => {
vis1: {
...mockVisualization1,
getSuggestions: () => [
{ datasourceSuggestionId: 0, score: 0.3, title: 'Test', state: {} },
{ datasourceSuggestionId: 1, score: 0.2, title: 'Test2', state: {} },
{ tableIndex: 0, score: 0.3, title: 'Test', state: {} },
{ tableIndex: 1, score: 0.2, title: 'Test2', state: {} },
],
},
vis2: {
...mockVisualization2,
getSuggestions: () => [
{ datasourceSuggestionId: 1, score: 0.1, title: 'Test3', state: {} },
],
getSuggestions: () => [{ tableIndex: 1, score: 0.1, title: 'Test3', state: {} }],
},
},
'vis1',
{},
mockDatasource.publicAPIMock
{}
);
expect(suggestions[0].datasourceState).toBe(tableState1);
expect(suggestions[1].datasourceState).toBe(tableState2);
@@ -146,7 +130,6 @@ describe('suggestion helpers', () => {
it('should pass the state of the currently active visualization to getSuggestions', () => {
const mockVisualization1 = createMockVisualization();
const mockVisualization2 = createMockVisualization();
const mockDatasource = createMockDatasource();
const currentState = {};
getSuggestions(
[{ state: {}, tableColumns: [] }, { state: {}, tableColumns: [] }],
@@ -155,8 +138,7 @@ describe('suggestion helpers', () => {
vis2: mockVisualization2,
},
'vis1',
currentState,
mockDatasource.publicAPIMock
currentState
);
expect(mockVisualization1.getSuggestions).toHaveBeenCalledWith(
expect.objectContaining({
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/

import { DatasourcePublicAPI, TableColumn, Visualization, DatasourceSuggestion } from '../../types';
import { Visualization, DatasourceSuggestion } from '../../types';
import { Action } from './state_management';

export interface Suggestion {
@@ -27,23 +27,19 @@ export function getSuggestions(
datasourceTableSuggestions: DatasourceSuggestion[],
visualizationMap: Record<string, Visualization>,
activeVisualizationId: string | null,
visualizationState: unknown,
datasourcePublicAPI: DatasourcePublicAPI
visualizationState: unknown
): Suggestion[] {
const datasourceTableMetas: Record<string, TableColumn[]> = {};
datasourceTableSuggestions.map(({ tableColumns }, datasourceSuggestionId) => {
datasourceTableMetas[datasourceSuggestionId] = tableColumns;
});
const datasourceTables = datasourceTableSuggestions.map(({ tableColumns }) => tableColumns);

return (
Object.entries(visualizationMap)
.map(([visualizationId, visualization]) => {
return visualization
.getSuggestions({
tableColumns: datasourceTableMetas,
tables: datasourceTables,
state: visualizationId === activeVisualizationId ? visualizationState : undefined,
})
.map(({ datasourceSuggestionId, ...suggestion }) => ({
.map(({ tableIndex: datasourceSuggestionId, ...suggestion }) => ({
...suggestion,
visualizationId,
datasourceState: datasourceTableSuggestions[datasourceSuggestionId].state,
Original file line number Diff line number Diff line change
@@ -8,7 +8,7 @@ import React from 'react';
import { FormattedMessage } from '@kbn/i18n/react';

import { Action } from './state_management';
import { Datasource, Visualization, DatasourcePublicAPI } from '../../types';
import { Datasource, Visualization } from '../../types';
import { getSuggestions, toSwitchAction } from './suggestion_helpers';

export interface SuggestionPanelProps {
@@ -17,7 +17,6 @@ export interface SuggestionPanelProps {
activeVisualizationId: string | null;
visualizationMap: Record<string, Visualization>;
visualizationState: unknown;
datasourcePublicAPI: DatasourcePublicAPI;
dispatch: (action: Action) => void;
}

@@ -27,7 +26,6 @@ export function SuggestionPanel({
activeVisualizationId,
visualizationMap,
visualizationState,
datasourcePublicAPI,
dispatch,
}: SuggestionPanelProps) {
const datasourceSuggestions = activeDatasource.getDatasourceSuggestionsFromCurrentState(
@@ -38,8 +36,7 @@ export function SuggestionPanel({
datasourceSuggestions,
visualizationMap,
activeVisualizationId,
visualizationState,
datasourcePublicAPI
visualizationState
);

return (
Original file line number Diff line number Diff line change
@@ -50,8 +50,7 @@ export function WorkspacePanel({
datasourceSuggestions,
visualizationMap,
activeVisualizationId,
visualizationState,
datasourcePublicAPI
visualizationState
);

if (suggestions.length === 0) {
4 changes: 2 additions & 2 deletions x-pack/plugins/lens/public/types.ts
Original file line number Diff line number Diff line change
@@ -122,15 +122,15 @@ export interface VisualizationProps<T = unknown> {

export interface SuggestionRequest<T = unknown> {
// It is up to the Visualization to rank these tables
tableColumns: Record<number, TableColumn[]>;
tables: TableColumn[][];
state?: T; // State is only passed if the visualization is active
}

export interface VisualizationSuggestion<T = unknown> {
score: number;
title: string;
state: T;
datasourceSuggestionId: number;
tableIndex: number;
}

export interface Visualization<T = unknown, P = unknown> {