Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
2ce3709
improve suggestions
flash1293 Jul 26, 2019
9ae245e
Merge branch 'feature/lens' into lens/splitseries-suggestions
flash1293 Jul 26, 2019
c9699f2
Add global chart switcher
chrisdavies Jul 26, 2019
f4044b1
Merge upstream
chrisdavies Jul 26, 2019
ed234e0
Remove horizontal bars
chrisdavies Jul 26, 2019
9549e2c
Fix tests
chrisdavies Jul 26, 2019
c780993
Add chart switching confirmation dialog
chrisdavies Jul 26, 2019
a24956f
Fix tests
chrisdavies Jul 26, 2019
14c3a60
Minor tweaks
chrisdavies Jul 26, 2019
b9bf6c1
Add visualization switcher tests
chrisdavies Jul 26, 2019
5b2a81a
clean up
flash1293 Jul 29, 2019
e6e4884
Merge branch 'feature/lens' into lens/splitseries-suggestions
flash1293 Jul 29, 2019
9ae5966
Merge branch 'feature/lens' into lens/switch-charts
flash1293 Jul 29, 2019
f7a3ef4
remove duplicated imports
flash1293 Jul 29, 2019
87c143f
cleanup WIP
flash1293 Jul 29, 2019
2195b0e
cleanup #2
flash1293 Jul 30, 2019
c519aed
fix tests and add choose behavior
flash1293 Jul 30, 2019
04dc964
Merge branch 'feature/lens' into lens/splitseries-suggestions
flash1293 Jul 30, 2019
d67ed9b
Merge branch 'feature/lens' into lens/splitseries-suggestions
flash1293 Jul 30, 2019
0b5f4e6
Merge branch 'feature/lens' into lens/switch-charts
flash1293 Jul 30, 2019
2f5fdec
change user flow
flash1293 Jul 30, 2019
0f1a324
fix review comments and rename component
flash1293 Jul 31, 2019
4c31031
review fixes and code refactoring
flash1293 Jul 31, 2019
4c091e2
fix type errors
flash1293 Jul 31, 2019
5fc23ed
fix unit test
flash1293 Jul 31, 2019
bbb4f12
pull indexpatternid into the dragging context
flash1293 Aug 1, 2019
fcd8cea
fix tests
flash1293 Aug 1, 2019
b374390
fix metric column building
flash1293 Aug 1, 2019
5454503
initially focus chart switch popover
flash1293 Aug 1, 2019
9400d98
implement reduced suggestions
flash1293 Aug 1, 2019
6148bdf
actually drag new draggedfield object type
flash1293 Aug 1, 2019
e9ca734
Merge branch 'lens/splitseries-suggestions' into lens/reduced/suggest…
flash1293 Aug 1, 2019
c62fbeb
Merge branch 'lens/switch-charts' into lens/reduced/suggestions
flash1293 Aug 1, 2019
398b8e2
implement lossy switching on table level
flash1293 Aug 1, 2019
36f4d61
improve default series type
flash1293 Aug 2, 2019
66e5ab4
remove comment
flash1293 Aug 2, 2019
e11aed2
Merge branch 'lens/splitseries-suggestions' into lens/reduced/suggest…
flash1293 Aug 2, 2019
39e885a
Merge branch 'lens/switch-charts' into lens/reduced/suggestions
flash1293 Aug 2, 2019
95ef48d
refactor suggestion building and unify with chart switch
flash1293 Aug 2, 2019
74a2edf
Merge remote-tracking branch 'upstream/feature/lens' into lens/switch…
flash1293 Aug 2, 2019
6610ea7
fix type bug
flash1293 Aug 2, 2019
a10a769
fix tests
flash1293 Aug 2, 2019
3ca6961
fix tests
flash1293 Aug 2, 2019
13e8ace
Merge remote-tracking branch 'upstream/feature/lens' into lens/reduce…
flash1293 Aug 2, 2019
53ac7ff
remove console log
flash1293 Aug 2, 2019
d9431c1
pass correct field to suggestion helper
flash1293 Aug 2, 2019
df5e547
Merge branch 'feature/lens' into lens/reduced/suggestions
flash1293 Aug 5, 2019
3ebf611
Merge branch 'feature/lens' into lens/reduced/suggestions
flash1293 Aug 5, 2019
c56a93a
Merge branch 'feature/lens' into lens/reduced/suggestions
flash1293 Aug 5, 2019
7092362
add some tests
flash1293 Aug 5, 2019
0f7084d
fix case on undropped layers on change
flash1293 Aug 6, 2019
9d31a60
Merge branch 'feature/lens' into lens/reduced/suggestions
flash1293 Aug 12, 2019
1562cfc
fix bugs
flash1293 Aug 12, 2019
1a7a36e
code cleanup
flash1293 Aug 12, 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
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ export const datatableVisualization: Visualization<
}: SuggestionRequest<DatatableVisualizationState>): Array<
VisualizationSuggestion<DatatableVisualizationState>
> {
const maxColumnCount = Math.max.apply(undefined, tables.map(table => table.columns.length));
return tables.map(table => {
const title = i18n.translate('xpack.lens.datatable.visualizationOf', {
defaultMessage: 'Table: {operations}',
Expand All @@ -148,7 +149,8 @@ export const datatableVisualization: Visualization<

return {
title,
score: 1,
// largest possible table will have a score of 0.2, less columns reduce score
score: (table.columns.length / maxColumnCount) * 0.2,
datasourceSuggestionId: table.datasourceSuggestionId,
state: {
layers: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ const actual = jest.requireActual('../suggestion_helpers');

jest.spyOn(actual, 'getSuggestions');

export const { getSuggestions, toSwitchAction } = actual;
export const { getSuggestions, switchToSuggestion } = actual;
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
*/

import React from 'react';
import { createMockVisualization, createMockFramePublicAPI } from '../mocks';
import { createMockVisualization, createMockFramePublicAPI, createMockDatasource } from '../mocks';
import { mountWithIntl as mount } from 'test_utils/enzyme_helpers';
import { ReactWrapper } from 'enzyme';
import { ChartSwitch } from './chart_switch';
import { Visualization, FramePublicAPI, DatasourcePublicAPI } from '../../types';
import { EuiKeyPadMenuItemButton } from '@elastic/eui';
import { Action } from './state_management';

describe('chart_switch', () => {
function generateVisualization(id: string): jest.Mocked<Visualization> {
Expand Down Expand Up @@ -83,6 +84,33 @@ describe('chart_switch', () => {
} as FramePublicAPI;
}

function mockDatasourceMap() {
const datasource = createMockDatasource();
datasource.getDatasourceSuggestionsFromCurrentState.mockReturnValue([
{
state: {},
table: {
columns: [],
datasourceSuggestionId: 0,
isMultiRow: true,
layerId: 'a',
},
},
]);
return {
testDatasource: datasource,
};
}

function mockDatasourceStates() {
return {
testDatasource: {
state: {},
isLoading: false,
},
};
}

function showFlyout(component: ReactWrapper) {
component
.find('[data-test-subj="lnsChartSwitchPopover"]')
Expand Down Expand Up @@ -116,6 +144,8 @@ describe('chart_switch', () => {
visualizationMap={visualizations}
dispatch={dispatch}
framePublicAPI={mockFrame(['a'])}
datasourceMap={mockDatasourceMap()}
datasourceStates={mockDatasourceStates()}
/>
);

Expand All @@ -125,6 +155,8 @@ describe('chart_switch', () => {
initialState: 'suggestion visB',
newVisualizationId: 'visB',
type: 'SWITCH_VISUALIZATION',
datasourceId: 'testDatasource',
datasourceState: {},
});
});

Expand All @@ -142,6 +174,8 @@ describe('chart_switch', () => {
visualizationMap={visualizations}
dispatch={dispatch}
framePublicAPI={frame}
datasourceMap={mockDatasourceMap()}
datasourceStates={mockDatasourceStates()}
/>
);

Expand All @@ -154,6 +188,61 @@ describe('chart_switch', () => {
});
});

it('should indicate data loss if not all columns will be used', () => {
const dispatch = jest.fn();
const visualizations = mockVisualizations();
const frame = mockFrame(['a']);

const datasourceMap = mockDatasourceMap();
datasourceMap.testDatasource.getDatasourceSuggestionsFromCurrentState.mockReturnValue([
{
state: {},
table: {
columns: [
{
columnId: 'col1',
operation: {
label: '',
dataType: 'string',
isBucketed: true,
},
},
{
columnId: 'col2',
operation: {
label: '',
dataType: 'number',
isBucketed: false,
},
},
],
datasourceSuggestionId: 0,
layerId: 'first',
isMultiRow: true,
},
},
]);
datasourceMap.testDatasource.publicAPIMock.getTableSpec.mockReturnValue([
{ columnId: 'col1' },
{ columnId: 'col2' },
{ columnId: 'col3' },
]);

const component = mount(
<ChartSwitch
visualizationId="visA"
visualizationState={{}}
visualizationMap={visualizations}
dispatch={dispatch}
framePublicAPI={frame}
datasourceMap={mockDatasourceMap()}
datasourceStates={mockDatasourceStates()}
/>
);

expect(getMenuItem('subvisB', component).prop('betaBadgeIconType')).toEqual('alert');
});

it('should indicate data loss if not all layers will be used', () => {
const dispatch = jest.fn();
const visualizations = mockVisualizations();
Expand All @@ -166,6 +255,8 @@ describe('chart_switch', () => {
visualizationMap={visualizations}
dispatch={dispatch}
framePublicAPI={frame}
datasourceMap={mockDatasourceMap()}
datasourceStates={mockDatasourceStates()}
/>
);

Expand All @@ -185,6 +276,8 @@ describe('chart_switch', () => {
visualizationMap={visualizations}
dispatch={dispatch}
framePublicAPI={frame}
datasourceMap={mockDatasourceMap()}
datasourceStates={mockDatasourceStates()}
/>
);

Expand All @@ -205,6 +298,8 @@ describe('chart_switch', () => {
visualizationMap={visualizations}
dispatch={dispatch}
framePublicAPI={frame}
datasourceMap={mockDatasourceMap()}
datasourceStates={mockDatasourceStates()}
/>
);

Expand All @@ -230,6 +325,8 @@ describe('chart_switch', () => {
visualizationMap={visualizations}
dispatch={dispatch}
framePublicAPI={frame}
datasourceMap={mockDatasourceMap()}
datasourceStates={mockDatasourceStates()}
/>
);

Expand All @@ -249,6 +346,8 @@ describe('chart_switch', () => {
visualizationMap={mockVisualizations()}
dispatch={jest.fn()}
framePublicAPI={frame}
datasourceMap={mockDatasourceMap()}
datasourceStates={mockDatasourceStates()}
/>
);

Expand All @@ -258,6 +357,30 @@ describe('chart_switch', () => {
expect(removeLayers).toHaveBeenCalledWith(['b', 'c']);
});

it('should remove all layers if there is no suggestion', () => {
const dispatch = jest.fn();
const visualizations = mockVisualizations();
visualizations.visB.getSuggestions.mockReturnValueOnce([]);
const frame = mockFrame(['a', 'b', 'c']);

const component = mount(
<ChartSwitch
visualizationId="visA"
visualizationState={{}}
visualizationMap={visualizations}
dispatch={dispatch}
framePublicAPI={frame}
datasourceMap={mockDatasourceMap()}
datasourceStates={mockDatasourceStates()}
/>
);

switchTo('subvisB', component);

expect(frame.removeLayers).toHaveBeenCalledTimes(1);
expect(frame.removeLayers).toHaveBeenCalledWith(['a', 'b', 'c']);
});

it('should not remove layers if the visualization is not changing', () => {
const dispatch = jest.fn();
const removeLayers = jest.fn();
Expand All @@ -277,16 +400,78 @@ describe('chart_switch', () => {
visualizationMap={visualizations}
dispatch={dispatch}
framePublicAPI={frame}
datasourceMap={mockDatasourceMap()}
datasourceStates={mockDatasourceStates()}
/>
);

switchTo('subvisC2', component);
expect(removeLayers).not.toHaveBeenCalled();
expect(switchVisualizationType).toHaveBeenCalledWith('subvisC2', 'therebegriffins');
expect(dispatch).toHaveBeenCalledWith(
expect.objectContaining({
type: 'SWITCH_VISUALIZATION',
initialState: 'therebedragons',
})
);
});

it('should switch to the updated datasource state', () => {
const dispatch = jest.fn();
const visualizations = mockVisualizations();
const frame = mockFrame(['a', 'b']);

const datasourceMap = mockDatasourceMap();
datasourceMap.testDatasource.getDatasourceSuggestionsFromCurrentState.mockReturnValue([
{
state: 'testDatasource suggestion',
table: {
columns: [
{
columnId: 'col1',
operation: {
label: '',
dataType: 'string',
isBucketed: true,
},
},
{
columnId: 'col2',
operation: {
label: '',
dataType: 'number',
isBucketed: false,
},
},
],
datasourceSuggestionId: 0,
layerId: 'a',
isMultiRow: true,
},
},
]);

const component = mount(
<ChartSwitch
visualizationId="visA"
visualizationState={{}}
visualizationMap={visualizations}
dispatch={dispatch}
framePublicAPI={frame}
datasourceMap={datasourceMap}
datasourceStates={mockDatasourceStates()}
/>
);

switchTo('subvisB', component);

expect(dispatch).toHaveBeenCalledWith({
type: 'UPDATE_VISUALIZATION_STATE',
newState: 'therebedragons',
});
type: 'SWITCH_VISUALIZATION',
newVisualizationId: 'visB',
datasourceId: 'testDatasource',
datasourceState: 'testDatasource suggestion',
initialState: 'suggestion visB',
} as Action);
});

it('should ensure the new visualization has the proper subtype', () => {
Expand All @@ -305,6 +490,8 @@ describe('chart_switch', () => {
visualizationMap={visualizations}
dispatch={dispatch}
framePublicAPI={mockFrame(['a'])}
datasourceMap={mockDatasourceMap()}
datasourceStates={mockDatasourceStates()}
/>
);

Expand All @@ -314,6 +501,8 @@ describe('chart_switch', () => {
initialState: 'suggestion visB subvisB',
newVisualizationId: 'visB',
type: 'SWITCH_VISUALIZATION',
datasourceId: 'testDatasource',
datasourceState: {},
});
});

Expand All @@ -325,6 +514,8 @@ describe('chart_switch', () => {
visualizationMap={mockVisualizations()}
dispatch={jest.fn()}
framePublicAPI={mockFrame(['a', 'b'])}
datasourceMap={mockDatasourceMap()}
datasourceStates={mockDatasourceStates()}
/>
);

Expand Down
Loading