edc_web_components/components/
list_verifiable_credentials.rs1use crate::models::VerifiableCredential;
2use patternfly_yew::prelude::*;
3use std::rc::Rc;
4use yew::prelude::*;
5
6#[derive(Clone, Debug, PartialEq, Properties)]
7pub struct ListVerifiableCredentialsProps {
8 pub verifiable_credential_items: Vec<VerifiableCredential>,
9 pub ondelete: Callback<String>,
10 pub onshow: Callback<String>,
11}
12
13#[component]
14pub fn ListVerifiableCredentials(props: &ListVerifiableCredentialsProps) -> Html {
15 let header = html_nested! {
16 <TableHeader<Columns>>
17 <TableColumn<Columns> label="Issuer ID" index={Columns::IssuerId} />
18 <TableColumn<Columns> label="Holder ID" index={Columns::HolderId} />
19 <TableColumn<Columns> label="Created at" index={Columns::CreatedAt} />
20 <TableColumn<Columns> label="Insurance Date" index={Columns::InsuranceDate} />
21 <TableColumn<Columns> label="Expiration Date" index={Columns::ExpirationDate} />
22 <TableColumn<Columns> label="" index={Columns::Actions} />
23 </TableHeader<Columns>>
24 };
25
26 let (entries, _) = use_table_data(MemoizedTableModel::new(Rc::new(
27 props
28 .verifiable_credential_items
29 .clone()
30 .into_iter()
31 .map(|verifiable_credential| VerifiableCredentialRenderer {
32 verifiable_credential,
33 onshow: props.onshow.clone(),
34 ondelete: props.ondelete.clone(),
35 })
36 .collect::<Vec<_>>(),
37 )));
38
39 html!(
40 <Table<Columns, UseTableData<Columns, MemoizedTableModel<VerifiableCredentialRenderer>>>
41 mode={TableMode::Compact}
42 {header}
43 {entries}
44 />
45 )
46}
47
48#[derive(Clone, Debug, Eq, PartialEq)]
49enum Columns {
50 IssuerId,
51 HolderId,
52 CreatedAt,
53 InsuranceDate,
54 ExpirationDate,
55 Actions,
56}
57
58#[derive(Clone, Debug)]
59struct VerifiableCredentialRenderer {
60 verifiable_credential: VerifiableCredential,
61 onshow: Callback<String>,
62 ondelete: Callback<String>,
63}
64
65impl TableEntryRenderer<Columns> for VerifiableCredentialRenderer {
66 fn render_cell(&self, context: CellContext<'_, Columns>) -> Cell {
67 match context.column {
68 Columns::IssuerId => html! { self.verifiable_credential.issuer_id.to_string() },
69 Columns::HolderId => html! { self.verifiable_credential.holder_id.to_string() },
70 Columns::CreatedAt => html! {
71 chrono::DateTime::from_timestamp_millis(self.verifiable_credential.created_at as i64).unwrap().format("%Y-%m-%d %H:%M:%S")
72 },
73 Columns::InsuranceDate => html!{
74 self.verifiable_credential.issuance_date.format("%Y-%m-%d %H:%M:%S")
75 },
76 Columns::ExpirationDate => html!{
77 self.verifiable_credential.expiration_date.format("%Y-%m-%d %H:%M:%S")
78 },
79 Columns::Actions => html!{
80 <Split gutter=true>
81 <SplitItem>
82 <ShowVerifiableCredential
83 verifiable_credential_id={self.verifiable_credential.id.clone()}
84 onshow={self.onshow.clone()}
85 />
86 </SplitItem>
87 <SplitItem>
88 <DeleteVerifiableCredential
89 verifiable_credential_id={self.verifiable_credential.id.clone()}
90 ondelete={self.ondelete.clone()}
91 />
92 </SplitItem>
93 </Split>
94 }
95 }
96 .into()
97 }
98}
99
100#[derive(Clone, PartialEq, Properties)]
101pub struct ShowVerifiableCredentialProps {
102 pub verifiable_credential_id: String,
103 pub onshow: Callback<String>,
104}
105
106#[function_component]
107pub fn ShowVerifiableCredential(props: &ShowVerifiableCredentialProps) -> Html {
108 let onclick = use_callback(
109 (props.onshow.clone(), props.verifiable_credential_id.clone()),
110 move |_, (onshow, verifiable_credential_id)| {
111 onshow.emit(verifiable_credential_id.to_string());
112 },
113 );
114
115 html!(<Button variant={ButtonVariant::Primary} icon={Icon::Eye} {onclick}>{ "Show" }</Button>)
116}
117
118#[derive(Clone, PartialEq, Properties)]
119pub struct DeleteVerifiableCredentialProps {
120 pub verifiable_credential_id: String,
121 pub ondelete: Callback<String>,
122}
123
124#[function_component]
125pub fn DeleteVerifiableCredential(props: &DeleteVerifiableCredentialProps) -> Html {
126 let onclick = use_callback(
127 (
128 props.ondelete.clone(),
129 props.verifiable_credential_id.clone(),
130 ),
131 move |_, (ondelete, verifiable_credential_id)| {
132 ondelete.emit(verifiable_credential_id.to_string());
133 },
134 );
135
136 html!(<Button variant={ButtonVariant::Danger} icon={Icon::Trash} {onclick}>{ "Delete" }</Button>)
137}