Skip to content
This repository has been archived by the owner on Dec 7, 2023. It is now read-only.

Commit

Permalink
feat(ui): group queues by prefix
Browse files Browse the repository at this point in the history
  • Loading branch information
s-r-x committed Jul 21, 2021
1 parent 7fd7bce commit 60ab12b
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 29 deletions.
13 changes: 12 additions & 1 deletion packages/ui/src/components/Drawer/Queues/hooks.ts
Original file line number Diff line number Diff line change
@@ -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(() => {
Expand All @@ -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<GetQueuesQuery['queues']>,
) => {
const shouldGroup = usePreferencesStore((state) => state.groupQueuesByPrefix);
if (!shouldGroup) {
return null;
}
return groupBy(queues, 'keyPrefix');
};
50 changes: 33 additions & 17 deletions packages/ui/src/components/Drawer/Queues/index.tsx
Original file line number Diff line number Diff line change
@@ -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<GetQueuesQuery['queues']>;
};
export default function DrawerQueuesList({ queues }: TProps) {
const groupedQueues = useMaybeGroupQueuesByPrefix(queues);
const [activeQueue, changeActiveQueue] = useAtom(activeQueueAtom);
const [collapseMap, toggleCollapse] = useQueuesCollapseStore(
(state) => [state.queues, state.toggle],
Expand All @@ -28,20 +31,33 @@ export default function DrawerQueuesList({ queues }: TProps) {
changeActiveStatus(status);
closeDrawer();
}, []);
return (
<List>
{queues?.map((queue) => (
<Queue
isExpanded={Boolean(collapseMap[queue.name])}
activeStatus={activeStatus}
onSelect={onSelect}
onStatusSelect={onStatusSelect}
toggleCollapse={toggleCollapse}
isSelected={activeQueue === queue.name}
key={queue.name}
queue={queue}
/>
))}
</List>
);
const renderQueue = (queue: TProps['queues'][0]) => {
return (
<Queue
isExpanded={Boolean(collapseMap[queue.name])}
activeStatus={activeStatus}
onSelect={onSelect}
onStatusSelect={onStatusSelect}
toggleCollapse={toggleCollapse}
isSelected={activeQueue === queue.name}
key={queue.name}
queue={queue}
/>
);
};
if (groupedQueues) {
return (
<List>
{Object.entries(groupedQueues).map(([prefix, queues]) => (
<List
key={prefix}
subheader={<ListSubheader>{prefix}</ListSubheader>}
>
{queues.map(renderQueue)}
</List>
))}
</List>
);
}
return <List>{queues.map(renderQueue)}</List>;
}
2 changes: 1 addition & 1 deletion packages/ui/src/components/Drawer/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ export default function Drawer() {
) : (
<>
<QueuesFilter className={cls.filter} />
<QueuesList queues={filteredQueues} />
{filteredQueues && <QueuesList queues={filteredQueues} />}
{queues && <Footer queues={queues} className={cls.footer} />}
</>
)}
Expand Down
24 changes: 15 additions & 9 deletions packages/ui/src/components/Settings/Preferences/index.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
import React from 'react';
import shallow from 'zustand/shallow';
import FormControlLabel from '@material-ui/core/FormControlLabel';
import Switch from '@material-ui/core/Switch';
import FormControl from '@material-ui/core/FormControl';
import { usePreferencesStore } from '@/stores/preferences';

export default function Preferences() {
const [
const {
confirmDangerousActions,
toggleConfirmDangerousActions,
] = usePreferencesStore(
(state) => [
state.confirmDangerousActions,
state.toggleConfirmDangerousActions,
],
shallow,
);
groupQueuesByPrefix,
toggleGroupQueuesByPrefix,
} = usePreferencesStore();
return (
<div>
<FormControl margin="dense">
Expand All @@ -29,6 +24,17 @@ export default function Preferences() {
label="Confirm dangerous actions"
/>
</FormControl>
<FormControl margin="dense">
<FormControlLabel
control={
<Switch
checked={groupQueuesByPrefix}
onChange={toggleGroupQueuesByPrefix}
/>
}
label="Group queues by prefix"
/>
</FormControl>
</div>
);
}
1 change: 1 addition & 0 deletions packages/ui/src/network/queries/get-queues.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export const getQueues = (): Promise<GetQueuesQuery> =>
query GetQueues {
queues {
name
keyPrefix
isPaused
jobsCounts {
waiting
Expand Down
8 changes: 8 additions & 0 deletions packages/ui/src/stores/preferences.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,32 @@ import { StorageConfig } from '@/config/storage';

type TState = {
confirmDangerousActions: boolean;
groupQueuesByPrefix: boolean;

changeConfirmDangerousActions: (value: boolean) => void;
toggleConfirmDangerousActions: () => void;
toggleGroupQueuesByPrefix: () => void;
};
export const usePreferencesStore = createStore<TState>(
persist(
(set) => ({
confirmDangerousActions: true,
groupQueuesByPrefix: false,

changeConfirmDangerousActions: (confirmDangerousActions) =>
set({ confirmDangerousActions }),
toggleConfirmDangerousActions: () =>
set((state) => ({
confirmDangerousActions: !state.confirmDangerousActions,
})),
toggleGroupQueuesByPrefix: () =>
set((state) => ({
groupQueuesByPrefix: !state.groupQueuesByPrefix,
})),
}),
{
name: `${StorageConfig.persistNs}prefs`,
version: 2,
},
),
);
3 changes: 2 additions & 1 deletion packages/ui/src/typings/gql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@ export type QueryJobArgs = {

export type Queue = {
name: Scalars['String'];
keyPrefix?: Maybe<Scalars['String']>;
/** https://github.com/OptimalBits/bull/blob/develop/REFERENCE.md#queuecount */
count: Scalars['Int'];
/** https://github.com/OptimalBits/bull/blob/develop/REFERENCE.md#queuegetjobcounts */
Expand Down Expand Up @@ -547,7 +548,7 @@ export type GetQueuesQueryVariables = Exact<{ [key: string]: never; }>;


export type GetQueuesQuery = { queues?: Maybe<Array<(
Pick<Queue, 'name' | 'isPaused'>
Pick<Queue, 'name' | 'keyPrefix' | 'isPaused'>
& { jobsCounts: Pick<QueueJobsCounts, 'waiting' | 'active' | 'completed' | 'failed' | 'delayed' | 'paused'> }
)>> };

Expand Down

0 comments on commit 60ab12b

Please sign in to comment.