Skip to content

Commit f205367

Browse files
[Canvas] Fix elements not being updated properly when filter is changed on workpad (#81863) (#82866)
* Update renderer handlers when element is changed * Update handlers before render * Add canvas functional test for filters * Update snapshot and remove log Co-authored-by: Kibana Machine <[email protected]> # Conflicts: # x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/dropdown_filter/component/dropdown_filter.tsx
1 parent eaa2236 commit f205367

File tree

11 files changed

+2559
-21
lines changed

11 files changed

+2559
-21
lines changed

x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/dropdown_filter/component/__stories__/__snapshots__/dropdown_filter.stories.storyshot

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/dropdown_filter/component/dropdown_filter.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,12 @@ export const DropdownFilter: FunctionComponent<Props> = ({
6262
return (
6363
<div className="canvasDropdownFilter">
6464
{/* eslint-disable-next-line jsx-a11y/no-onchange */}
65-
<select className="canvasDropdownFilter__select" value={value} onChange={changeHandler}>
65+
<select
66+
className="canvasDropdownFilter__select"
67+
value={value}
68+
onChange={changeHandler}
69+
data-test-subj="canvasDropdownFilter__select"
70+
>
6671
{dropdownOptions}
6772
</select>
6873
<EuiIcon className="canvasDropdownFilter__icon" type="arrowDown" />

x-pack/plugins/canvas/public/components/debug/__stories__/__snapshots__/debug.stories.storyshot

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugins/canvas/public/components/debug/debug.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ const LimitRows = (key: string, value: any) => {
1717

1818
export const Debug = ({ payload }: any) => (
1919
<EuiCode className="canvasDebug">
20-
<pre className="canvasDebug__content">{JSON.stringify(payload, LimitRows, 2)}</pre>
20+
<pre className="canvasDebug__content" data-test-subj="canvasDebug__content">
21+
{JSON.stringify(payload, LimitRows, 2)}
22+
</pre>
2123
</EuiCode>
2224
);
2325

x-pack/plugins/canvas/public/components/element_content/element_content.js

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import { getType } from '@kbn/interpreter/common';
1212
import { Loading } from '../loading';
1313
import { RenderWithFn } from '../render_with_fn';
1414
import { ElementShareContainer } from '../element_share_container';
15-
import { assignHandlers } from '../../lib/create_handlers';
1615
import { InvalidExpression } from './invalid_expression';
1716
import { InvalidElementType } from './invalid_element_type';
1817

@@ -48,15 +47,7 @@ export const ElementContent = compose(
4847
pure,
4948
...branches
5049
)(({ renderable, renderFunction, width, height, handlers }) => {
51-
const {
52-
getFilter,
53-
setFilter,
54-
done,
55-
onComplete,
56-
onEmbeddableInputChange,
57-
onEmbeddableDestroyed,
58-
getElementId,
59-
} = handlers;
50+
const { onComplete } = handlers;
6051

6152
return Style.it(
6253
renderable.css,
@@ -79,14 +70,7 @@ export const ElementContent = compose(
7970
css={renderable.css} // This is an actual CSS stylesheet string, it will be scoped by RenderElement
8071
width={width}
8172
height={height}
82-
handlers={assignHandlers({
83-
getFilter,
84-
setFilter,
85-
done,
86-
onEmbeddableInputChange,
87-
onEmbeddableDestroyed,
88-
getElementId,
89-
})}
73+
handlers={handlers}
9074
/>
9175
</ElementShareContainer>
9276
</div>

x-pack/plugins/canvas/public/components/render_with_fn/render_with_fn.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import React, { useState, useEffect, useRef, FC, useCallback } from 'react';
88

9+
import { isEqual } from 'lodash';
10+
911
import { useNotifyService } from '../../services';
1012
import { RenderToDom } from '../render_to_dom';
1113
import { ErrorStrings } from '../../../i18n';
@@ -82,8 +84,12 @@ export const RenderWithFn: FC<Props> = ({
8284
);
8385

8486
const render = useCallback(() => {
87+
if (!isEqual(handlers.current, incomingHandlers)) {
88+
handlers.current = incomingHandlers;
89+
}
90+
8591
renderFn(renderTarget.current!, config, handlers.current);
86-
}, [renderTarget, config, renderFn]);
92+
}, [renderTarget, config, renderFn, incomingHandlers]);
8793

8894
useEffect(() => {
8995
if (!domNode) {
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
import expect from '@kbn/expect';
8+
9+
import { FtrProviderContext } from '../../ftr_provider_context';
10+
11+
export default function canvasFiltersTest({ getService, getPageObjects }: FtrProviderContext) {
12+
const testSubjects = getService('testSubjects');
13+
const retry = getService('retry');
14+
const PageObjects = getPageObjects(['canvas', 'common']);
15+
const find = getService('find');
16+
const esArchiver = getService('esArchiver');
17+
18+
describe('filters', function () {
19+
// there is an issue with FF not properly clicking on workpad elements
20+
this.tags('skipFirefox');
21+
22+
before(async () => {
23+
await esArchiver.load('canvas/filter');
24+
// load test workpad
25+
await PageObjects.common.navigateToApp('canvas', {
26+
hash: '/workpad/workpad-b5618217-56d2-47fa-b756-1be2306cda68/page/1',
27+
});
28+
});
29+
30+
it('filter updates when dropdown is changed', async () => {
31+
// wait for all our elements to load up
32+
await retry.try(async () => {
33+
const elements = await testSubjects.findAll(
34+
'canvasWorkpadPage > canvasWorkpadPageElementContent'
35+
);
36+
expect(elements).to.have.length(3);
37+
});
38+
39+
// Double check that the filter has the correct time range and default filter value
40+
const startingMatchFilters = await PageObjects.canvas.getMatchFiltersFromDebug();
41+
expect(startingMatchFilters[0].value).to.equal('apm');
42+
expect(startingMatchFilters[0].column).to.equal('project');
43+
44+
// Change dropdown value
45+
await testSubjects.selectValue('canvasDropdownFilter__select', 'beats');
46+
47+
await retry.try(async () => {
48+
const matchFilters = await PageObjects.canvas.getMatchFiltersFromDebug();
49+
expect(matchFilters[0].value).to.equal('beats');
50+
expect(matchFilters[0].column).to.equal('project');
51+
});
52+
});
53+
54+
it('filter updates when time range is changed', async () => {
55+
// wait for all our elements to load up
56+
await retry.try(async () => {
57+
const elements = await testSubjects.findAll(
58+
'canvasWorkpadPage > canvasWorkpadPageElementContent'
59+
);
60+
expect(elements).to.have.length(3);
61+
});
62+
63+
const startingTimeFilters = await PageObjects.canvas.getTimeFiltersFromDebug();
64+
expect(startingTimeFilters[0].column).to.equal('@timestamp');
65+
expect(new Date(startingTimeFilters[0].from).toDateString()).to.equal('Sun Oct 18 2020');
66+
expect(new Date(startingTimeFilters[0].to).toDateString()).to.equal('Sat Oct 24 2020');
67+
68+
await testSubjects.click('superDatePickerstartDatePopoverButton');
69+
await find.clickByCssSelector('.react-datepicker [aria-label="day-19"]', 20000);
70+
71+
await retry.try(async () => {
72+
const timeFilters = await PageObjects.canvas.getTimeFiltersFromDebug();
73+
expect(timeFilters[0].column).to.equal('@timestamp');
74+
expect(new Date(timeFilters[0].from).toDateString()).to.equal('Mon Oct 19 2020');
75+
expect(new Date(timeFilters[0].to).toDateString()).to.equal('Sat Oct 24 2020');
76+
});
77+
78+
await testSubjects.click('superDatePickerendDatePopoverButton');
79+
await find.clickByCssSelector('.react-datepicker [aria-label="day-23"]', 20000);
80+
81+
await retry.try(async () => {
82+
const timeFilters = await PageObjects.canvas.getTimeFiltersFromDebug();
83+
expect(timeFilters[0].column).to.equal('@timestamp');
84+
expect(new Date(timeFilters[0].from).toDateString()).to.equal('Mon Oct 19 2020');
85+
expect(new Date(timeFilters[0].to).toDateString()).to.equal('Fri Oct 23 2020');
86+
});
87+
});
88+
});
89+
}

x-pack/test/functional/apps/canvas/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export default function canvasApp({ loadTestFile, getService }) {
2222
this.tags('ciGroup2'); // CI requires tags ヽ(゜Q。)ノ?
2323
loadTestFile(require.resolve('./smoke_test'));
2424
loadTestFile(require.resolve('./expression'));
25+
loadTestFile(require.resolve('./filters'));
2526
loadTestFile(require.resolve('./custom_elements'));
2627
loadTestFile(require.resolve('./feature_controls/canvas_security'));
2728
loadTestFile(require.resolve('./feature_controls/canvas_spaces'));
958 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)