diff --git a/dashboard/src/components/Accordion/Accordion.stories.tsx b/dashboard/src/components/Accordion/Accordion.stories.tsx deleted file mode 100644 index ef8ebec..0000000 --- a/dashboard/src/components/Accordion/Accordion.stories.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import Accordion, { IAccordionItems } from './Accordion'; - -const meta = { - title: 'Accordion', - component: Accordion, - parameters: { - layout: 'centered', - }, - tags: ['autodocs'], -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -const itemsBuild: IAccordionItems[] = [ - { - trigger: { - config: 'config', - compiler: 'compiler', - date: 'dd/mm/yyyy', - buildErrors: 5, - buildTime: '500 seconds', - status: 'valid', - }, - content: AAAAa, - }, - { - trigger: { - config: 'config', - compiler: 'compiler', - date: 'dd/mm/yyyy', - buildErrors: 5, - buildTime: '500 seconds', - status: 'valid', - }, - content: AAAAa, - }, - { - trigger: { - config: 'config', - compiler: 'compiler', - date: 'dd/mm/yyyy', - buildErrors: 5, - buildTime: '500 seconds', - status: 'valid', - }, - content: AAAAa, - }, -]; - -const headersBuild = [ - 'config', - 'compiler', - 'date', - 'build errors', - 'build time', - 'status', -]; - -const itemsTest: IAccordionItems[] = [ - { - trigger: { - testPlans: 'aaaaaaa', - testErrors: 5, - testSuccessfull: 12, - status: 'invalid', - }, - content: AAAAa, - }, - { - trigger: { - testPlans: 'aaaaaaasdkjmla', - testErrors: 5, - testSuccessfull: 12, - status: 'valid', - }, - content: BBB, - }, -]; -const headersTest = ['test plan', 'test results', 'status']; - -export const Builds: Story = { - args: { - items: itemsBuild, - headers: headersBuild, - type: 'build', - }, -}; - -export const Tests: Story = { - args: { - items: itemsTest, - headers: headersTest, - type: 'test', - }, -}; diff --git a/dashboard/src/components/Accordion/Accordion.tsx b/dashboard/src/components/Accordion/Accordion.tsx index 1193964..6114ecc 100644 --- a/dashboard/src/components/Accordion/Accordion.tsx +++ b/dashboard/src/components/Accordion/Accordion.tsx @@ -1,7 +1,9 @@ -import { ReactNode, useMemo } from 'react'; +import { ReactElement, ReactNode, useMemo } from 'react'; import { MdCheck, MdClose } from 'react-icons/md'; +import { FormattedMessage } from 'react-intl'; + import { TableBody, TableCell, TableRow } from '../ui/table'; import BaseTable from '../Table/BaseTable'; import { @@ -13,7 +15,7 @@ import ColoredCircle from '../ColoredCircle/ColoredCircle'; import { ItemType } from '../ListingItem/ListingItem'; export interface IAccordion { - headers: string[]; + headers?: ReactElement[]; items: IAccordionItems[]; type: 'build' | 'test'; } @@ -44,11 +46,20 @@ export type AccordionItemTestsTrigger = { status?: 'valid' | 'invalid'; }; -const Accordion = ({ headers, items, type }: IAccordion): JSX.Element => { - const accordionTableHeader = useMemo( - () => headers.map(header => {header}), - [headers], - ); +const headersBuilds = [ + , + , + , + , + , + , +]; + +const Accordion = ({ items, type }: IAccordion): JSX.Element => { + const accordionTableHeader = type === 'build' ? headersBuilds : []; return ( { - return ( -
- {buildsData && ( - - )} -
- ); -}; - -export default BuildsTable; diff --git a/dashboard/src/components/Tabs/TreeDetails/TreeDetailsBuildTab.tsx b/dashboard/src/components/Tabs/TreeDetails/TreeDetailsBuildTab.tsx index f1ffd78..733a983 100644 --- a/dashboard/src/components/Tabs/TreeDetails/TreeDetailsBuildTab.tsx +++ b/dashboard/src/components/Tabs/TreeDetails/TreeDetailsBuildTab.tsx @@ -1,13 +1,14 @@ import { FormattedMessage } from 'react-intl'; -import { useMemo } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import CardsGroup from '@/components/CardsGroup/CardsGroup'; import { Colors } from '@/components/StatusChart/StatusCharts'; import { ITreeDetails } from '@/routes/TreeDetails/TreeDetails'; -import BuildsTable from '@/components/Table/BuildsTable'; import { usePagination } from '@/hooks/usePagination'; import { TableInfo } from '@/components/Table/TableInfo'; +import Accordion from '@/components/Accordion/Accordion'; +import { Button } from '@/components/ui/button'; interface ITreeDetailsBuildTab { treeDetailsData?: ITreeDetails; @@ -16,20 +17,45 @@ interface ITreeDetailsBuildTab { const TreeDetailsBuildTab = ({ treeDetailsData, }: ITreeDetailsBuildTab): JSX.Element => { + const [filterBy, setFilterBy] = useState<'error' | 'success' | 'all'>('all'); const accordionContent = useMemo(() => { return treeDetailsData?.builds.map(row => ({ trigger: { ...row, - buildTime: `${row.buildTime?.split('.')[0]} ${()}`, + config: row.config ?? '-', + compiler: row.compiler ?? '-', + buildTime: row.buildTime ? ( + + {row.buildTime?.split('.')[0]}{' '} + + + ) : ( + '-' + ), date: row.date?.split(' ')[0], }, content: <>, })); }, [treeDetailsData?.builds]); + const filteredContent = + filterBy === 'error' + ? accordionContent?.filter( + row => row.trigger.buildErrors && row.trigger.buildErrors > 0, + ) + : filterBy === 'success' + ? accordionContent?.filter( + row => row.trigger.status && row.trigger.status === 'valid', + ) + : accordionContent; + const { startIndex, endIndex, onClickGoForward, onClickGoBack } = usePagination(accordionContent?.length ?? 0, ITEMS_PER_PAGE); + const onClickFilter = useCallback((type: 'error' | 'success' | 'all') => { + setFilterBy(type); + }, []); + return (
- {accordionContent && ( + {filteredContent && (
-
+
+
+ + + +
-