From 10b822d010ba40eeebabeaffea96efd2ed6d5188 Mon Sep 17 00:00:00 2001 From: TzeYiing Date: Tue, 2 May 2023 03:11:55 +0900 Subject: [PATCH] feat: add expandable prop to ReportWidget --- .../interfaces/Reports/ReportWidget.tsx | 17 ++++++- .../components/Reports/ReportWidget.test.js | 46 +++++-------------- 2 files changed, 27 insertions(+), 36 deletions(-) diff --git a/studio/components/interfaces/Reports/ReportWidget.tsx b/studio/components/interfaces/Reports/ReportWidget.tsx index 45b55aef2a4..ccb1edc4cc7 100644 --- a/studio/components/interfaces/Reports/ReportWidget.tsx +++ b/studio/components/interfaces/Reports/ReportWidget.tsx @@ -1,11 +1,12 @@ import { NextRouter, useRouter } from 'next/router' import * as Tooltip from '@radix-ui/react-tooltip' -import { Button, IconExternalLink, IconHelpCircle } from 'ui' +import { Button, Collapsible, IconExternalLink, IconHelpCircle } from 'ui' import { BaseReportParams } from './Reports.types' import { LogsEndpointParams } from '../Settings/Logs' import Panel from 'components/ui/Panel' import LoadingOpacity from 'components/ui/LoadingOpacity' +import { useState } from 'react' export interface ReportWidgetProps { data: T[] @@ -14,6 +15,8 @@ export interface ReportWidgetProps { tooltip?: string className?: string renderer: (props: ReportWidgetRendererProps) => React.ReactNode + expandable?: (props: ReportWidgetRendererProps) => React.ReactNode + expandableText?: string // omitting params will hide the "View in logs explorer" button params?: BaseReportParams | LogsEndpointParams isLoading: boolean @@ -28,7 +31,6 @@ const ReportWidget: React.FC = (props) => { const router = useRouter() const { ref } = router.query const projectRef = ref as string - return ( = (props) => { {props.data === undefined ? null : props.renderer({ ...props, router, projectRef })} + + {props.expandable && ( + + + + + + {props.expandable && props.expandable({ ...props, router, projectRef })} + + + )} ) diff --git a/studio/tests/components/Reports/ReportWidget.test.js b/studio/tests/components/Reports/ReportWidget.test.js index b657ec2d897..2eacef40e45 100644 --- a/studio/tests/components/Reports/ReportWidget.test.js +++ b/studio/tests/components/Reports/ReportWidget.test.js @@ -1,41 +1,8 @@ -// mock the fetch function -jest.mock('lib/common/fetch') import { get } from 'lib/common/fetch' - -// mock mobx -jest.mock('mobx-react-lite') -import { observer } from 'mobx-react-lite' -observer.mockImplementation((v) => v) - -// mock the router -jest.mock('next/router') import { useRouter } from 'next/router' -const defaultRouterMock = () => { - const router = jest.fn() - router.query = {} - router.push = jest.fn() - router.pathname = 'logs/path' - return router -} -useRouter.mockReturnValue(defaultRouterMock()) - -// mock usage flags -jest.mock('components/ui/Flag/Flag') -import Flag from 'components/ui/Flag/Flag' -Flag.mockImplementation(({ children }) => <>{children}) -jest.mock('hooks') -import { useFlag } from 'hooks' -useFlag.mockReturnValue(true) - -import { fireEvent, waitFor, screen, act } from '@testing-library/react' +import { screen } from '@testing-library/react' import { render } from '../../helpers' -import userEvent from '@testing-library/user-event' -import { wait } from '@testing-library/user-event/dist/utils' -import { logDataFixture } from '../../fixtures' -import { LogsTableName } from 'components/interfaces/Settings/Logs' -import { Presets } from 'components/interfaces/Reports/Reports.types' import ReportWidget from 'components/interfaces/Reports/ReportWidget' -import { clickDropdown } from 'tests/helpers' beforeEach(() => { // reset mocks between tests get.mockReset() @@ -48,3 +15,14 @@ test('static elements', async () => { await screen.findByText(/Some chart/) await screen.findByText(/something/) }) + +test("lazy load component expandable", async ()=>{ + const Expandable = ()=> "expanded" + render( null} expandable={Expandable} />) + await screen.findByText(/Expand/) +}) + +test("customize expandable text", async ()=>{ + render( null} expandable={()=> null} expandableText="open_me"/>) + await screen.findByText(/open_me/) +}) \ No newline at end of file