Skip to content

Commit d9f38f6

Browse files
authored
fix(DatePickerPro): 解决弹出面板为加到body层,导致被父元素隐藏的问题 (DevCloudFE#1162)
* fix(DatePickerPro): 解决弹出面板为加到body层,导致被父元素隐藏的问题
1 parent e21110a commit d9f38f6

File tree

10 files changed

+285
-278
lines changed

10 files changed

+285
-278
lines changed

packages/devui-vue/devui/date-picker-pro/__tests__/date-picker-pro.spec.tsx

Lines changed: 76 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,15 @@ describe('date-picker-pro test', () => {
4747
await input.trigger('focus');
4848
await nextTick();
4949
await nextTick();
50-
const pickerPanel = container.find(pickerPanelClass);
51-
expect(pickerPanel.exists()).toBeTruthy();
52-
53-
const yearActiveItem = pickerPanel.find(yearActiveClass);
54-
expect(yearActiveItem.exists()).toBeTruthy();
55-
const weekHeader = pickerPanel.find(weekHeaderClass);
56-
expect(weekHeader.findAll('td').length).toBe(7);
57-
const activeTody = pickerPanel.find(ns.e('table-date-today'));
58-
expect(activeTody.exists()).toBeTruthy();
50+
const pickerPanel = document.querySelector(pickerPanelClass);
51+
expect(pickerPanel).toBeTruthy();
52+
53+
const yearActiveItem = pickerPanel?.querySelector(yearActiveClass);
54+
expect(yearActiveItem).toBeTruthy();
55+
const weekHeader = pickerPanel?.querySelector(weekHeaderClass);
56+
expect(weekHeader?.getElementsByTagName('td').length).toBe(7);
57+
const activeTody = pickerPanel?.querySelector(ns.e('table-date-today'));
58+
expect(activeTody).toBeTruthy();
5959
wrapper.unmount();
6060
});
6161

@@ -73,18 +73,18 @@ describe('date-picker-pro test', () => {
7373
await input.trigger('focus');
7474
await nextTick();
7575
await nextTick();
76-
const pickerPanel = container.find(pickerPanelClass);
77-
expect(pickerPanel.exists()).toBeTruthy();
78-
const tableMonthItems = pickerPanel.findAll(tableMonthClass);
76+
const pickerPanel = document.querySelector(pickerPanelClass);
77+
expect(pickerPanel).toBeTruthy();
78+
const tableMonthItems = pickerPanel?.querySelectorAll(tableMonthClass);
7979

8080
const date = new Date();
8181
const todayIndex = getDateIndex(date);
8282

8383
const selectIndex = getSelectedIndex(todayIndex);
8484
// 虚拟列表 当前面板呈现月为虚拟列表的第二个tableMonthItem
85-
const monthContentContainer = tableMonthItems[1].find(ns.e('table-month-content'));
86-
const Items = monthContentContainer.findAll('td');
87-
await Items[selectIndex].trigger('click');
85+
const monthContentContainer = tableMonthItems?.[1].querySelector(ns.e('table-month-content'));
86+
const Items = monthContentContainer?.querySelectorAll('td');
87+
await Items?.[selectIndex].dispatchEvent(new Event('click'));
8888
expect(dayjs(datePickerProValue.value).format(DATE_FORMAT)).toBe(getSelectedDate(todayIndex, date));
8989

9090
const pickerPanelNew = container.find(pickerPanelClass);
@@ -109,16 +109,16 @@ describe('date-picker-pro test', () => {
109109
await input.trigger('focus');
110110
await nextTick();
111111
await nextTick();
112-
const pickerPanel = container.find(pickerPanelClass);
113-
expect(pickerPanel.exists()).toBeTruthy();
114-
const tableMonthItems = pickerPanel.findAll(tableMonthClass);
112+
const pickerPanel = document.querySelector(pickerPanelClass);
113+
expect(pickerPanel).toBeTruthy();
114+
const tableMonthItems = pickerPanel?.querySelectorAll(tableMonthClass);
115115

116116
const date = new Date();
117117
const selectIndex = getDateIndex(date);
118118
// 虚拟列表 当前面板呈现月为虚拟列表的第二个tableMonthItem
119-
const monthContentContainer = tableMonthItems[1].find(ns.e('table-month-content'));
120-
const Items = monthContentContainer.findAll('td');
121-
expect(Items[selectIndex].classes().includes(noDotNs.e('table-date-selected'))).toBe(true);
119+
const monthContentContainer = tableMonthItems?.[1].querySelector(ns.e('table-month-content'));
120+
const Items = monthContentContainer?.querySelectorAll('td');
121+
expect(Items?.[selectIndex].classList).toContain(noDotNs.e('table-date-selected'));
122122

123123
wrapper.unmount();
124124
});
@@ -138,17 +138,17 @@ describe('date-picker-pro test', () => {
138138
await input.trigger('focus');
139139
await nextTick();
140140
await nextTick();
141-
const pickerPanel = container.find(pickerPanelClass);
142-
expect(pickerPanel.exists()).toBeTruthy();
143-
const tableMonthItems = pickerPanel.findAll(tableMonthClass);
141+
const pickerPanel = document.querySelector(pickerPanelClass);
142+
expect(pickerPanel).toBeTruthy();
143+
const tableMonthItems = pickerPanel?.querySelectorAll(tableMonthClass);
144144

145145
const date = new Date();
146146
const todayIndex = getDateIndex(date);
147147
const selectIndex = getSelectedIndex(todayIndex);
148148
// 虚拟列表 当前面板呈现月为虚拟列表的第二个tableMonthItem
149-
const monthContentContainer = tableMonthItems[1].find(ns.e('table-month-content'));
150-
const Items = monthContentContainer.findAll('td');
151-
await Items[selectIndex].trigger('click');
149+
const monthContentContainer = tableMonthItems?.[1].querySelector(ns.e('table-month-content'));
150+
const Items = monthContentContainer?.querySelectorAll('td');
151+
await Items?.[selectIndex].dispatchEvent(new Event('click'));
152152
const vm = wrapper.vm;
153153
const inputNew = vm.$el.querySelector('input');
154154
expect(dayjs(inputNew.value).format(DATE_FORMAT)).toBe(getSelectedDate(todayIndex, date));
@@ -171,37 +171,33 @@ describe('date-picker-pro test', () => {
171171
await input.trigger('focus');
172172
await nextTick();
173173
await nextTick();
174-
const pickerPanel = container.find(pickerPanelClass);
175-
expect(pickerPanel.exists()).toBeTruthy();
176-
const tableMonthItems = pickerPanel.findAll(tableMonthClass);
174+
const pickerPanel = document.querySelector(pickerPanelClass);
175+
expect(pickerPanel).toBeTruthy();
176+
const tableMonthItems = pickerPanel?.querySelectorAll(tableMonthClass);
177177

178-
const timePicker = pickerPanel.find(ns.e('panel-time'));
179-
expect(timePicker.exists()).toBeTruthy();
180-
const timeUl = timePicker.findAll('.time-ul');
181-
expect(timeUl[0].element.childElementCount).toBe(24);
182-
expect(timeUl[1].element.childElementCount).toBe(60);
183-
expect(timeUl[2].element.childElementCount).toBe(60);
178+
const timePicker = pickerPanel?.querySelector(ns.e('panel-time'));
179+
expect(timePicker).toBeTruthy();
180+
const timeUl = timePicker?.querySelectorAll('.time-ul');
181+
expect(timeUl?.[0].childElementCount).toBe(24);
182+
expect(timeUl?.[1].childElementCount).toBe(60);
183+
expect(timeUl?.[2].childElementCount).toBe(60);
184184

185185
const date = new Date();
186186
const todayIndex = getDateIndex(date);
187187
const selectIndex = getSelectedIndex(todayIndex);
188188
// 虚拟列表 当前面板呈现月为虚拟列表的第二个tableMonthItem
189-
const monthContentContainer = tableMonthItems[1].find(ns.e('table-month-content'));
190-
const Items = monthContentContainer.findAll('td');
191-
await Items[selectIndex].trigger('click');
192-
expect(dayjs(datePickerProValue.value).format(TIME_FORMAT)).toBe(
193-
`${getSelectedDate(todayIndex, date)} 12:00:00`
194-
);
195-
196-
const liItems = timeUl[0].findAll('.time-li');
197-
await liItems[3].trigger('click');
198-
expect(dayjs(datePickerProValue.value).format(TIME_FORMAT)).toBe(
199-
`${getSelectedDate(todayIndex, date)} 03:00:00`
200-
);
201-
202-
const pickerPanelFooter = container.find(ns.e('panel-footer'));
203-
const button = pickerPanelFooter.find('button');
204-
await button.trigger('click');
189+
const monthContentContainer = tableMonthItems?.[1].querySelector(ns.e('table-month-content'));
190+
const Items = monthContentContainer?.getElementsByTagName('td');
191+
await Items?.[selectIndex].dispatchEvent(new Event('click'));
192+
expect(dayjs(datePickerProValue.value).format(TIME_FORMAT)).toBe(`${getSelectedDate(todayIndex, date)} 12:00:00`);
193+
194+
const liItems = timeUl?.[0].querySelectorAll('.time-li');
195+
await liItems?.[3].dispatchEvent(new Event('click'));
196+
expect(dayjs(datePickerProValue.value).format(TIME_FORMAT)).toBe(`${getSelectedDate(todayIndex, date)} 03:00:00`);
197+
198+
const pickerPanelFooter = document.querySelector(ns.e('panel-footer'));
199+
const button = pickerPanelFooter?.getElementsByTagName('button')[0];
200+
await button?.dispatchEvent(new Event('click'));
205201
const pickerPanelNew = container.find(pickerPanelClass);
206202
expect(pickerPanelNew.exists()).toBeFalsy();
207203

@@ -237,15 +233,15 @@ describe('date-picker-pro test', () => {
237233
expect(onToggleChange).toBeCalledTimes(1);
238234
expect(onFocus).toBeCalledTimes(1);
239235

240-
const pickerPanel = container.find(pickerPanelClass);
241-
const tableMonthItems = pickerPanel.findAll(tableMonthClass);
236+
const pickerPanel = document.querySelector(pickerPanelClass);
237+
const tableMonthItems = pickerPanel?.querySelectorAll(tableMonthClass);
242238
const date = new Date();
243239
const todayIndex = 7 - ((date.getDate() - date.getDay()) % 7) + date.getDate();
244240
const selectIndex = todayIndex > 20 ? todayIndex - 1 : todayIndex + 1;
245241
// 虚拟列表 当前面板呈现月为虚拟列表的第二个tableMonthItem
246-
const monthContentContainer = tableMonthItems[1].find(ns.e('table-month-content'));
247-
const Items = monthContentContainer.findAll('td');
248-
await Items[selectIndex].trigger('click');
242+
const monthContentContainer = tableMonthItems?.[1].querySelector(ns.e('table-month-content'));
243+
const Items = monthContentContainer?.querySelectorAll('td');
244+
await Items?.[selectIndex].dispatchEvent(new Event('click'));
249245
expect(onConfirmEvent).toBeCalledTimes(1);
250246
expect(onToggleChange).toBeCalledTimes(2);
251247
expect(onBlur).toBeCalledTimes(1);
@@ -335,13 +331,13 @@ describe('date-picker-pro test', () => {
335331
await input.trigger('focus');
336332
await nextTick();
337333
await nextTick();
338-
const pickerPanel = container.find(pickerPanelClass);
339-
const rightArea = pickerPanel.find(ns.e('panel-right-area'));
340-
expect(rightArea.exists()).toBeTruthy();
334+
const pickerPanel = document.querySelector(pickerPanelClass);
335+
const rightArea = pickerPanel?.querySelector(ns.e('panel-right-area'));
336+
expect(rightArea).toBeTruthy();
341337

342-
const button = rightArea.find('button');
343-
expect(button.exists()).toBeTruthy();
344-
await button.trigger('click');
338+
const button = rightArea?.getElementsByTagName('button')[0];
339+
expect(button).toBeTruthy();
340+
await button?.dispatchEvent(new Event('click'));
345341

346342
await nextTick();
347343
const vm = wrapper.vm;
@@ -382,13 +378,12 @@ describe('date-picker-pro test', () => {
382378
await input.trigger('focus');
383379
await nextTick();
384380
await nextTick();
385-
const pickerPanel = container.find(pickerPanelClass);
386-
const footer = pickerPanel.find(ns.e('panel-footer'));
387-
expect(footer.exists()).toBeTruthy();
381+
const footer = document.querySelector(ns.e('panel-footer'));
382+
expect(footer).toBeTruthy();
388383

389-
const button = footer.find('button');
390-
expect(button.exists()).toBeTruthy();
391-
await button.trigger('click');
384+
const button = footer?.getElementsByTagName('button')[0];
385+
expect(button).toBeTruthy();
386+
await button?.dispatchEvent(new Event('click'));
392387

393388
await nextTick();
394389
const vm = wrapper.vm;
@@ -425,24 +420,24 @@ describe('date-picker-pro test', () => {
425420
await input.trigger('focus');
426421
await nextTick();
427422
await nextTick();
428-
const pickerPanel = container.find(pickerPanelClass);
429-
expect(pickerPanel.exists()).toBeTruthy();
423+
const pickerPanel = document.querySelector(pickerPanelClass);
424+
expect(pickerPanel).toBeTruthy();
430425

431-
const yearListItems = pickerPanel.findAll(yearListItemClass);
432-
expect(yearListItems.length).toBe(13);
433-
const weekHeader = pickerPanel.find(weekHeaderClass);
434-
expect(weekHeader.findAll('td').length).toBe(7);
435-
const tableMonthItems = pickerPanel.findAll(tableMonthClass);
436-
expect(tableMonthItems.length).toBe(12);
426+
const yearListItems = pickerPanel?.querySelectorAll(yearListItemClass);
427+
expect(yearListItems?.length).toBe(13);
428+
const weekHeader = pickerPanel?.querySelector(weekHeaderClass);
429+
expect(weekHeader?.getElementsByTagName('td').length).toBe(7);
430+
const tableMonthItems = pickerPanel?.querySelectorAll(tableMonthClass);
431+
expect(tableMonthItems?.length).toBe(12);
437432

438433
const date = new Date();
439434
const todayIndex = 7 - ((date.getDate() - date.getDay()) % 7) + date.getDate();
440435
const selectIndex = todayIndex > 20 ? todayIndex - 2 : todayIndex + 2;
441436
// 虚拟列表 当前面板呈现月为虚拟列表的第二个tableMonthItem
442-
const monthContentContainer = tableMonthItems[1].find(ns.e('table-month-content'));
443-
const Items = monthContentContainer.findAll('td');
444-
expect(Items[selectIndex].classes().includes(noDotNs.e('table-date-disabled'))).toBe(true);
445-
await Items[selectIndex].trigger('click');
437+
const monthContentContainer = tableMonthItems?.[1].querySelector(ns.e('table-month-content'));
438+
const Items = monthContentContainer?.getElementsByTagName('td');
439+
expect(Items?.[selectIndex].classList).toContain(noDotNs.e('table-date-disabled'));
440+
await Items?.[selectIndex].dispatchEvent(new Event('click'));
446441
expect(datePickerProValue.value).toBe('');
447442

448443
wrapper.unmount();

0 commit comments

Comments
 (0)