forked from Hidde-Heijnen/dao-webapp-template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProposalActions.tsx
75 lines (69 loc) · 2.06 KB
/
ProposalActions.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/**
* This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course.
* © Copyright Utrecht University (Department of Information and Computing Sciences)
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @file ProposalActions.tsx - Display a proposal's actions in a MainCard, with a button to execute where applicable
*/
import CheckList from '@/src/components/icons/CheckList';
import { Accordion } from '@/src/components/ui/Accordion';
import {
DefaultMainCardHeader,
MainCard,
MainCardProps,
} from '@/src/components/ui/MainCard';
import ProposalActionFilter from '@/src/components/proposal/actions/ProposalActionFilter';
export interface IProposalAction {
interface: string;
method: string;
params: { [name: string]: any };
}
export interface ProposalActionsProps
extends Omit<MainCardProps, 'icon' | 'header'> {
actions: IProposalAction[] | undefined;
loading?: boolean;
}
/**
* Display a list of actions in an Accordion
* @param props.actions List of actions to display
* @param props.loading Whether the proposal is loading
* @returns An Accordion containter with items for each action
*/
const ProposalActions = ({
actions,
children,
loading,
...props
}: ProposalActionsProps) => {
return (
<MainCard
loading={loading}
icon={CheckList}
header={
<DefaultMainCardHeader value={actions?.length ?? 0} label="actions" />
}
{...props}
>
{!actions || actions.length === 0 ? (
<div className="italic text-popover-foreground/80">
No actions attached
</div>
) : (
<Accordion type="single" collapsible className="space-y-2">
{actions.map((action, i) => (
<ProposalActionFilter
key={i}
value={i.toString()}
action={action}
/>
))}
</Accordion>
)}
{children}
</MainCard>
);
};
export default ProposalActions;