This is an automated email from the ASF dual-hosted git repository.

diegopucci pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/master by this push:
     new 19f840cde7 fix(Dashboard): DatePicker to not autoclose modal (#30702)
19f840cde7 is described below

commit 19f840cde7b4d529c9d9618034cb0bfcfc93a2eb
Author: Geido <[email protected]>
AuthorDate: Thu Oct 24 19:26:42 2024 +0300

    fix(Dashboard): DatePicker to not autoclose modal (#30702)
---
 .../controls/DateFilterControl/DateFilterLabel.tsx |  6 +-
 .../DateFilterControl/components/CustomFrame.tsx   | 15 ++++
 .../DateFilterControl/tests/CustomFrame.test.tsx   | 97 ++++++++++++++++++++++
 .../components/controls/DateFilterControl/types.ts |  1 +
 4 files changed, 118 insertions(+), 1 deletion(-)

diff --git 
a/superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx
 
b/superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx
index e5113d122c..ebdd716b91 100644
--- 
a/superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx
+++ 
b/superset-frontend/src/explore/components/controls/DateFilterControl/DateFilterLabel.tsx
@@ -307,7 +307,11 @@ export default function DateFilterLabel(props: 
DateFilterControlProps) {
         <AdvancedFrame value={timeRangeValue} onChange={setTimeRangeValue} />
       )}
       {frame === 'Custom' && (
-        <CustomFrame value={timeRangeValue} onChange={setTimeRangeValue} />
+        <CustomFrame
+          value={timeRangeValue}
+          onChange={setTimeRangeValue}
+          isOverflowingFilterBar={isOverflowingFilterBar}
+        />
       )}
       {frame === 'No filter' && <div data-test={DateFilterTestKey.NoFilter} />}
       <Divider />
diff --git 
a/superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx
 
b/superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx
index f046b7f030..7a880a8295 100644
--- 
a/superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx
+++ 
b/superset-frontend/src/explore/components/controls/DateFilterControl/components/CustomFrame.tsx
@@ -166,6 +166,11 @@ export function CustomFrame(props: FrameComponentProps) {
                 }
                 allowClear={false}
                 locale={datePickerLocale}
+                getPopupContainer={triggerNode =>
+                  props.isOverflowingFilterBar
+                    ? (triggerNode.parentNode as HTMLElement)
+                    : document.body
+                }
               />
             </Row>
           )}
@@ -219,6 +224,11 @@ export function CustomFrame(props: FrameComponentProps) {
                 }
                 allowClear={false}
                 locale={datePickerLocale}
+                getPopupContainer={triggerNode =>
+                  props.isOverflowingFilterBar
+                    ? (triggerNode.parentNode as HTMLElement)
+                    : document.body
+                }
               />
             </Row>
           )}
@@ -277,6 +287,11 @@ export function CustomFrame(props: FrameComponentProps) {
                   allowClear={false}
                   className="control-anchor-to-datetime"
                   locale={datePickerLocale}
+                  getPopupContainer={triggerNode =>
+                    props.isOverflowingFilterBar
+                      ? (triggerNode.parentNode as HTMLElement)
+                      : document.body
+                  }
                 />
               </Col>
             )}
diff --git 
a/superset-frontend/src/explore/components/controls/DateFilterControl/tests/CustomFrame.test.tsx
 
b/superset-frontend/src/explore/components/controls/DateFilterControl/tests/CustomFrame.test.tsx
index f566d4f0fe..e5ed701f32 100644
--- 
a/superset-frontend/src/explore/components/controls/DateFilterControl/tests/CustomFrame.test.tsx
+++ 
b/superset-frontend/src/explore/components/controls/DateFilterControl/tests/CustomFrame.test.tsx
@@ -28,7 +28,9 @@ import {
 import userEvent from '@testing-library/user-event';
 import { CustomFrame } from '../components';
 
+const TODAY = '2024-06-03';
 jest.useFakeTimers();
+jest.setSystemTime(new Date(TODAY).getTime());
 
 const emptyValue = '';
 const nowValue = 'now : now';
@@ -280,3 +282,98 @@ test('should translate Date Picker', async () => {
   expect(screen.getByText('sa')).toBeInTheDocument();
   expect(screen.getByText('di')).toBeInTheDocument();
 });
+
+test('calls onChange when START Specific Date/Time is selected', async () => {
+  const onChange = jest.fn();
+  render(
+    <Provider store={store}>
+      <CustomFrame
+        onChange={onChange}
+        value={specificValue}
+        isOverflowingFilterBar
+      />
+    </Provider>,
+  );
+
+  await waitForElementToBeRemoved(() => screen.queryByLabelText('Loading'));
+
+  const specificDateTimeOptions = screen.getAllByText('Specific Date/Time');
+  expect(specificDateTimeOptions.length).toBe(2);
+
+  const calendarIcons = screen.getAllByRole('img', { name: 'calendar' });
+  userEvent.click(calendarIcons[0]);
+
+  const randomDate = screen.getByTitle('2021-03-11');
+  userEvent.click(randomDate);
+
+  const okButton = screen.getByText('Ok');
+  userEvent.click(okButton);
+
+  expect(onChange).toHaveBeenCalled();
+});
+
+test('calls onChange when END Specific Date/Time is selected', async () => {
+  const onChange = jest.fn();
+  render(
+    <Provider store={store}>
+      <CustomFrame
+        onChange={onChange}
+        value={specificValue}
+        isOverflowingFilterBar
+      />
+    </Provider>,
+  );
+
+  await waitForElementToBeRemoved(() => screen.queryByLabelText('Loading'));
+
+  const specificDateTimeOptions = screen.getAllByText('Specific Date/Time');
+  expect(specificDateTimeOptions.length).toBe(2);
+
+  const calendarIcons = screen.getAllByRole('img', { name: 'calendar' });
+  userEvent.click(calendarIcons[1]);
+
+  const randomDate = screen.getByTitle('2021-03-28');
+  userEvent.click(randomDate);
+
+  const okButton = screen.getByText('Ok');
+  userEvent.click(okButton);
+
+  expect(onChange).toHaveBeenCalled();
+});
+
+test('calls onChange when a date is picked from anchor mode date picker', 
async () => {
+  const onChange = jest.fn();
+  render(
+    <Provider store={store}>
+      <CustomFrame
+        onChange={onChange}
+        value={relativeTodayValue}
+        isOverflowingFilterBar
+      />
+    </Provider>,
+  );
+
+  await waitForElementToBeRemoved(() => screen.queryByLabelText('Loading'));
+
+  const relativeDateTimeOptions = screen.getAllByText('Relative Date/Time');
+  expect(relativeDateTimeOptions.length).toBe(2);
+
+  await waitFor(() =>
+    expect(screen.getByText('Anchor to')).toBeInTheDocument(),
+  );
+
+  const dateTimeRadio = screen.getByRole('radio', { name: 'Date/Time' });
+
+  expect(dateTimeRadio).toBeChecked();
+
+  const calendarIcon = screen.getByRole('img', { name: 'calendar' });
+  userEvent.click(calendarIcon);
+
+  const randomDate = screen.getByTitle('2024-06-05');
+  userEvent.click(randomDate);
+
+  const okButton = screen.getByText('Ok');
+  userEvent.click(okButton);
+
+  expect(onChange).toHaveBeenCalled();
+});
diff --git 
a/superset-frontend/src/explore/components/controls/DateFilterControl/types.ts 
b/superset-frontend/src/explore/components/controls/DateFilterControl/types.ts
index 7062b48580..0d0fbb9724 100644
--- 
a/superset-frontend/src/explore/components/controls/DateFilterControl/types.ts
+++ 
b/superset-frontend/src/explore/components/controls/DateFilterControl/types.ts
@@ -101,6 +101,7 @@ export type CurrentRangeType =
 export type FrameComponentProps = {
   onChange: (timeRange: string) => void;
   value: string;
+  isOverflowingFilterBar?: boolean;
 };
 
 export interface DateFilterControlProps {

Reply via email to