Skip to content

Commit 0f58355

Browse files
Fix chart annotation rendering (T1124149) (#802)
* fix chart axis and annotation render (T1124149) + test In some cases template is rendered during forceUpdate (and scheduling is disabled in that case) therefore we need to call forceUpdate once more
1 parent dee492c commit 0f58355

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

.github/workflows/tests.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ jobs:
2626
- name: Clone devextreme repo
2727
run: test -d ../devextreme || git clone -b 23_1 https://github.com/devexpress/devextreme ../devextreme
2828

29-
- name: Use Node.js 16
30-
uses: actions/setup-node@v2
29+
- name: Use Node.js 15
30+
uses: actions/setup-node@v3
3131
with:
3232
node-version: '15'
3333

packages/devextreme-react/src/core/__tests__/template.test.tsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,4 +1200,33 @@ describe('async template', () => {
12001200
expect(renderSpy.mock.calls.length).toBe(1);
12011201
renderSpy.mockRestore();
12021202
});
1203+
1204+
/* T1124149 */
1205+
it('should render template if it is added while previous rendering', async () => {
1206+
const ref = React.createRef() as React.RefObject<HTMLDivElement>;
1207+
const elementOptions: Record<string, any> = {};
1208+
elementOptions.itemRender = (data: any) => (
1209+
<div className={`template ${data.cls}`}>
1210+
Template
1211+
</div>
1212+
);
1213+
1214+
const { container } = render(
1215+
<ComponentWithAsyncTemplates {...elementOptions}>
1216+
<div ref={ref} />
1217+
</ComponentWithAsyncTemplates>,
1218+
);
1219+
1220+
act(() => {
1221+
renderItemTemplate({ cls: 'data1' }, ref.current, 0, () => {
1222+
renderItemTemplate({ cls: 'data2' }, ref.current, 0);
1223+
});
1224+
});
1225+
1226+
await waitForceUpdateFromTemplateRenderer();
1227+
1228+
await waitForceUpdateFromTemplateRenderer(); // sometimes first call not helps
1229+
1230+
expect(container.querySelector('.template.data2')?.outerHTML).toBe('<div class="template data2">Template</div>');
1231+
});
12031232
});

packages/devextreme-react/src/core/templates-renderer.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ class TemplatesRenderer extends React.PureComponent<{
1111

1212
private mounted = false;
1313

14+
private shouldRepeatForceUpdate = false;
15+
16+
private isUpdateFuncLaunched = false;
17+
1418
componentDidMount(): void {
1519
this.mounted = true;
1620
}
@@ -21,19 +25,30 @@ class TemplatesRenderer extends React.PureComponent<{
2125

2226
public scheduleUpdate(useDeferUpdate: boolean, onRendered?: () => void): void {
2327
if (this.updateScheduled) {
28+
this.shouldRepeatForceUpdate = this.isUpdateFuncLaunched;
2429
return;
2530
}
2631

2732
this.updateScheduled = true;
2833

2934
const updateFunc = useDeferUpdate ? deferUpdate : requestAnimationFrame;
35+
3036
updateFunc(() => {
3137
if (this.mounted) {
38+
this.isUpdateFuncLaunched = true;
39+
3240
this.forceUpdate(() => {
3341
this.updateScheduled = false;
3442
onRendered?.();
43+
44+
if (this.shouldRepeatForceUpdate) {
45+
this.shouldRepeatForceUpdate = false;
46+
this.forceUpdate();
47+
}
3548
});
3649
}
50+
51+
this.isUpdateFuncLaunched = false;
3752
this.updateScheduled = false;
3853
});
3954
}

0 commit comments

Comments
 (0)