Skip to content

Commit 545bdcc

Browse files
authored
fix nested option changes in scheduler toolbar (DevExpress#29401)
Co-authored-by: Vladimir Bushmanov <vladimir.bushmanov@devexpress.com>
1 parent cf0ce56 commit 545bdcc

File tree

12 files changed

+148
-24
lines changed

12 files changed

+148
-24
lines changed
5.72 KB
Loading
1.88 KB
Loading
3.6 KB
Loading
5.72 KB
Loading
3.66 KB
Loading
9.1 KB
Loading
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { compareScreenshot, createScreenshotsComparer } from 'devextreme-screenshot-comparer';
2+
import Scheduler from 'devextreme-testcafe-models/scheduler';
3+
import { ClientFunction } from 'testcafe';
4+
import { createWidget } from '../../../../helpers/createWidget';
5+
import url from '../../../../helpers/getPageUrl';
6+
7+
fixture.disablePageReloads`Scheduler: Toolbar options change`
8+
.page(url(__dirname, '../../../container.html'));
9+
10+
const createScheduler = async () => createWidget('dxScheduler', {
11+
views: ['day'],
12+
currentView: 'day',
13+
currentDate: new Date(2021, 3, 27),
14+
height: 200,
15+
width: 500,
16+
});
17+
const buttons = Array.from({ length: 7 }).map((_, index) => ({
18+
location: 'before',
19+
locateInMenu: 'auto',
20+
widget: 'dxButton',
21+
options: { text: `Button ${index}` },
22+
}));
23+
const updateOption = ClientFunction((name, value) => {
24+
($('#container') as any).dxScheduler('instance').option(name, value);
25+
});
26+
27+
test('Scheduler should change toolbar item location', async (t) => {
28+
const scheduler = new Scheduler('#container');
29+
30+
await updateOption('toolbar.items[0].location', 'after');
31+
await t.expect(
32+
await compareScreenshot(t, 'scheduler-toolbar-location-changed.png', scheduler.toolbar.element),
33+
).ok();
34+
}).before(createScheduler);
35+
36+
test('Scheduler should change toolbar', async (t) => {
37+
const scheduler = new Scheduler('#container');
38+
39+
await updateOption('toolbar', { items: [{ template: 'Custom text' }] });
40+
await t.expect(
41+
await compareScreenshot(t, 'scheduler-toolbar-changed.png', scheduler.toolbar.element),
42+
).ok();
43+
}).before(createScheduler);
44+
45+
test('Scheduler should change toolbar items', async (t) => {
46+
const scheduler = new Scheduler('#container');
47+
48+
await updateOption('toolbar.items', buttons);
49+
await t.expect(
50+
await compareScreenshot(t, 'scheduler-toolbar-items-changed.png', scheduler.toolbar.element),
51+
).ok();
52+
}).before(createScheduler);
53+
54+
test('Scheduler should change toolbar item option', async (t) => {
55+
const scheduler = new Scheduler('#container');
56+
57+
await updateOption('toolbar.items[0].options.text', 'Changed text');
58+
await t.expect(
59+
await compareScreenshot(t, 'scheduler-toolbar-item-option-changed.png', scheduler.toolbar.element),
60+
).ok();
61+
}).before(createScheduler);
62+
63+
test('Scheduler should change toolbar options / integration', async (t) => {
64+
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);
65+
const scheduler = new Scheduler('#container');
66+
67+
await updateOption('toolbar.items', buttons);
68+
await updateOption('toolbar.multiline', true);
69+
await t
70+
.expect(await takeScreenshot('scheduler-toolbar-property-changed.png', scheduler.toolbar.element))
71+
.ok();
72+
73+
await updateOption('toolbar', { multiline: false });
74+
await t
75+
.expect(await takeScreenshot('scheduler-toolbar-changed-2.png', scheduler.toolbar.element))
76+
.ok();
77+
78+
await t
79+
.expect(compareResults.isValid())
80+
.ok(compareResults.errorMessages());
81+
}).before(createScheduler);

e2e/testcafe-devextreme/tests/scheduler/common/header/viewSwitcher.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import SelectBox from 'devextreme-testcafe-models/selectBox';
12
import Scheduler from 'devextreme-testcafe-models/scheduler';
23
import { createWidget } from '../../../../helpers/createWidget';
34
import url from '../../../../helpers/getPageUrl';
@@ -31,3 +32,37 @@ test('it should correctly switch a differently typed views (T1080992)', async (t
3132
},
3233
],
3334
}));
35+
36+
const defaultSelectBoxValue = 'Samantha Bright';
37+
38+
test('Changing view does not reset toolbar items state', async (t) => {
39+
const scheduler = new Scheduler('#container');
40+
const selectBox = new SelectBox('.dx-selectbox');
41+
42+
await selectBox.open();
43+
const list = await selectBox.getList();
44+
await t
45+
.click(list.getItem(0).element)
46+
.expect(selectBox.value)
47+
.eql(defaultSelectBoxValue);
48+
49+
await t.click(scheduler.toolbar.viewSwitcher.getButton('Month').element)
50+
.expect(scheduler.checkViewType('month'))
51+
.ok();
52+
53+
await t.expect(selectBox.value).eql(defaultSelectBoxValue);
54+
}).before(async () => createWidget('dxScheduler', {
55+
views: ['week', 'month'],
56+
currentView: 'week',
57+
currentDate: new Date(2021, 3, 27),
58+
toolbar: {
59+
items: [
60+
{
61+
location: 'before',
62+
widget: 'dxSelectBox',
63+
options: { items: [defaultSelectBoxValue] },
64+
},
65+
'viewSwitcher',
66+
],
67+
},
68+
}));

packages/devextreme/js/__internal/scheduler/header/m_header.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import registerComponent from '@js/core/component_registrator';
55
import devices from '@js/core/devices';
66
import errors from '@js/core/errors';
77
import $ from '@js/core/renderer';
8+
import { getPathParts } from '@js/core/utils/data';
89
import dateUtils from '@js/core/utils/date';
910
import { extend } from '@js/core/utils/extend';
1011
import type { dxSchedulerOptions, ViewType } from '@js/ui/scheduler';
@@ -44,7 +45,7 @@ export class SchedulerHeader extends Widget<dxSchedulerOptions> {
4445

4546
eventMap: any;
4647

47-
_toolbar: any;
48+
_toolbar!: Toolbar;
4849

4950
_calendar: any;
5051

@@ -83,7 +84,6 @@ export class SchedulerHeader extends Widget<dxSchedulerOptions> {
8384
this.option('views') as ViewType[],
8485
);
8586
}]],
86-
['toolbar', [this.repaint.bind(this)]],
8787
['views', [validateViews]],
8888
['currentDate', [this._getCalendarOptionUpdater('value')]],
8989
['min', [this._getCalendarOptionUpdater('min')]],
@@ -115,6 +115,32 @@ export class SchedulerHeader extends Widget<dxSchedulerOptions> {
115115
}
116116
}
117117

118+
onToolbarOptionChanged(fullName: string, value: unknown): void {
119+
const parts = getPathParts(fullName);
120+
const optionName = fullName.replace(/^toolbar\./, '');
121+
122+
this.option(fullName, value);
123+
switch (true) {
124+
case fullName === 'toolbar':
125+
this.repaint();
126+
break;
127+
case fullName === 'toolbar.items':
128+
this._toolbar.option(
129+
'items',
130+
(value as []).map((item) => this._parseItem(item)),
131+
);
132+
break;
133+
case parts[1] === 'items' && parts.length === 3:
134+
// `toolbar.items[i]` case
135+
this._toolbar.option(optionName, this._parseItem(value));
136+
break;
137+
default:
138+
// `toolbar.prop` case
139+
// `toolbar.items[i].prop` case
140+
this._toolbar.option(optionName, value);
141+
}
142+
}
143+
118144
_init() {
119145
// @ts-expect-error
120146
super._init();
@@ -175,7 +201,7 @@ export class SchedulerHeader extends Widget<dxSchedulerOptions> {
175201
}
176202
}
177203

178-
return item;
204+
return extend(true, {}, item);
179205
}
180206

181207
_callEvent(event, arg) {

packages/devextreme/js/__internal/scheduler/header/m_view_switcher.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,9 @@ export const getDropDownViewSwitcher = (header: SchedulerHeader, item) => {
8282
const viewSwitcher = e.component;
8383

8484
header._addEvent('currentView', (view) => {
85-
const views = formatViews(header.views);
86-
87-
if (isOneView(views, view)) {
88-
header.repaint();
89-
}
85+
const currentViews = formatViews(header.views);
9086

87+
viewSwitcher.option('showArrowIcon', !isOneView(currentViews, view));
9188
viewSwitcher.option('selectedItemKey', getViewName(view));
9289
});
9390
},

0 commit comments

Comments
 (0)