Skip to main content

edc_web_components/components/
list_verifiable_credentials.rs

1use 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}