From 60ab12b191e19911a8083d267aad1156e77236af Mon Sep 17 00:00:00 2001 From: s-r-x Date: Wed, 21 Jul 2021 07:12:59 +0500 Subject: [PATCH] feat(ui): group queues by prefix --- .../ui/src/components/Drawer/Queues/hooks.ts | 13 ++++- .../ui/src/components/Drawer/Queues/index.tsx | 50 ++++++++++++------- packages/ui/src/components/Drawer/index.tsx | 2 +- .../components/Settings/Preferences/index.tsx | 24 +++++---- packages/ui/src/network/queries/get-queues.ts | 1 + packages/ui/src/stores/preferences.ts | 8 +++ packages/ui/src/typings/gql.ts | 3 +- 7 files changed, 72 insertions(+), 29 deletions(-) diff --git a/packages/ui/src/components/Drawer/Queues/hooks.ts b/packages/ui/src/components/Drawer/Queues/hooks.ts index a13bc3b..9c7e1a0 100644 --- a/packages/ui/src/components/Drawer/Queues/hooks.ts +++ b/packages/ui/src/components/Drawer/Queues/hooks.ts @@ -1,5 +1,7 @@ -import type { JobStatus, QueueJobsCounts } from '@/typings/gql'; +import { usePreferencesStore } from '@/stores/preferences'; +import type { GetQueuesQuery, JobStatus, QueueJobsCounts } from '@/typings/gql'; import { useMemo } from 'react'; +import groupBy from 'lodash/groupBy'; export const useJobsCountArray = (count: QueueJobsCounts) => { return useMemo(() => { @@ -12,3 +14,12 @@ export const useJobsCountArray = (count: QueueJobsCounts) => { export const useAliveJobsCount = (count: QueueJobsCounts) => { return count.active + count.delayed + count.waiting; }; +export const useMaybeGroupQueuesByPrefix = ( + queues: NonNullable, +) => { + const shouldGroup = usePreferencesStore((state) => state.groupQueuesByPrefix); + if (!shouldGroup) { + return null; + } + return groupBy(queues, 'keyPrefix'); +}; diff --git a/packages/ui/src/components/Drawer/Queues/index.tsx b/packages/ui/src/components/Drawer/Queues/index.tsx index ee0f230..6357ed3 100644 --- a/packages/ui/src/components/Drawer/Queues/index.tsx +++ b/packages/ui/src/components/Drawer/Queues/index.tsx @@ -1,17 +1,20 @@ import React, { useCallback } from 'react'; import type { GetQueuesQuery, JobStatus } from '@/typings/gql'; import List from '@material-ui/core/List'; +import ListSubheader from '@material-ui/core/ListSubheader'; import { useDrawerState } from '@/stores/drawer'; import shallow from 'zustand/shallow'; import Queue from './Queue'; import { useQueuesCollapseStore } from '@/stores/queues-collapse'; import { useAtom } from 'jotai'; import { activeQueueAtom, activeStatusAtom } from '@/atoms/workspaces'; +import { useMaybeGroupQueuesByPrefix } from './hooks'; type TProps = { - queues?: GetQueuesQuery['queues']; + queues: NonNullable; }; export default function DrawerQueuesList({ queues }: TProps) { + const groupedQueues = useMaybeGroupQueuesByPrefix(queues); const [activeQueue, changeActiveQueue] = useAtom(activeQueueAtom); const [collapseMap, toggleCollapse] = useQueuesCollapseStore( (state) => [state.queues, state.toggle], @@ -28,20 +31,33 @@ export default function DrawerQueuesList({ queues }: TProps) { changeActiveStatus(status); closeDrawer(); }, []); - return ( - - {queues?.map((queue) => ( - - ))} - - ); + const renderQueue = (queue: TProps['queues'][0]) => { + return ( + + ); + }; + if (groupedQueues) { + return ( + + {Object.entries(groupedQueues).map(([prefix, queues]) => ( + {prefix}} + > + {queues.map(renderQueue)} + + ))} + + ); + } + return {queues.map(renderQueue)}; } diff --git a/packages/ui/src/components/Drawer/index.tsx b/packages/ui/src/components/Drawer/index.tsx index fb593a8..5791611 100755 --- a/packages/ui/src/components/Drawer/index.tsx +++ b/packages/ui/src/components/Drawer/index.tsx @@ -92,7 +92,7 @@ export default function Drawer() { ) : ( <> - + {filteredQueues && } {queues &&