Skip to main content

edc_web_components/components/
list_verifiable_credentials.rs

1use crate::components::DidLabel;
2use crate::models::VerifiableCredential;
3use patternfly_yew::prelude::*;
4use std::rc::Rc;
5use yew::prelude::*;
6
7#[derive(Clone, Debug, PartialEq, Properties)]
8pub struct ListVerifiableCredentialsProps {
9  pub verifiable_credential_items: Vec<VerifiableCredential>,
10  pub ondelete: Callback<String>,
11  pub onshow: Callback<String>,
12}
13
14#[component]
15pub fn ListVerifiableCredentials(props: &ListVerifiableCredentialsProps) -> Html {
16  let header = html_nested! {
17    <TableHeader<Columns>>
18      <TableColumn<Columns> label="Issuer" index={Columns::IssuerId} />
19      <TableColumn<Columns> label="Holder" index={Columns::HolderId} />
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  InsuranceDate,
53  ExpirationDate,
54  Actions,
55}
56
57#[derive(Clone, Debug)]
58struct VerifiableCredentialRenderer {
59  verifiable_credential: VerifiableCredential,
60  onshow: Callback<String>,
61  ondelete: Callback<String>,
62}
63
64impl TableEntryRenderer<Columns> for VerifiableCredentialRenderer {
65  fn render_cell(&self, context: CellContext<'_, Columns>) -> Cell {
66    match context.column {
67      Columns::IssuerId => html! {
68        <DidLabel did={self.verifiable_credential.issuer_id.to_string()} />
69      },
70      Columns::HolderId => html! {
71        <DidLabel did={self.verifiable_credential.holder_id.to_string()} />
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}