rustimate-client 0.1.0

WASM web client sources for rustimate
use crate::ctx::ClientContext;

use crate::poll_result::ResultSummary;
use maud::{html, Markup};
use rustimate_core::member::Member;
use rustimate_core::poll::Poll;
use uuid::Uuid;

pub(crate) fn polls(ctx: &ClientContext, ps: Vec<&Poll>) -> Markup {
  html! {
    @if ps.is_empty() {
      li { "No polls" }
    } else {
      @for p in ps {
        (poll_summary(ctx, p))
      }
    }
  }
}

pub(crate) fn poll_summary(ctx: &ClientContext, p: &Poll) -> Markup {
  html! {
    li {
      a.(ctx.user_profile().link_class()) onclick=(crate::html::onclick_event("poll-detail", &p.id().to_string(), "")) {
        (p.title())
      }
    }
  }
}

pub(crate) fn vote_status(members: Vec<&Member>, votes: Vec<(Uuid, String)>) -> Markup {
  html! {
    div {
      @for member in members {
        div.vote-member {
          @if votes.iter().any(|x| &x.0 == member.user_id()) {
            div {
              (member.name())
              div {
                div.icon data-uk-icon="icon: check; ratio: 2" {}
              }
            }
          } @else {
            div {
              (member.name())
              div {
                div.icon data-uk-icon="icon: minus; ratio: 2" {}
              }
            }
          }
        }
      }
    }
    div.clear {}
  }
}

pub(crate) fn vote_choices(choices: &[String], current: Option<String>) -> Markup {
  html! {
    div {
      @for choice in choices {
        @if current.contains(choice) {
          div.vote-choice.active { (choice) }
        } @else {
          div.vote-choice onclick=(crate::html::onclick_event("select-choice", choice, "")) { (choice) }
        }
      }
    }
    div.clear {}
  }
}

pub(crate) fn vote_results(members: &[&Member], votes: &[(Uuid, String)]) -> Markup {
  html! {
    div {
      @for member in members {
        div.vote-member {
          div {
            (member.name())
            div {
              div.large-text {
                (votes.iter().find_map(|v| if &v.0 == member.user_id() { Some(v.1.clone()) } else { None }).unwrap_or_else(|| "---".into()))
              }
            }
          }
        }
      }
    }
    div.clear {}
  }
}

pub(crate) fn vote_stats(summary: ResultSummary) -> Markup {
  html! {
    div {
      div {
        (format!("[{}/{}] votes counted", summary.valid_votes().len(), summary.valid_votes().len() + summary.invalid_votes().len()))
      }
      div {
        "Mean: "
        (summary.mean())
      }
      div {
        "Median: "
        (summary.median())
      }
      div {
        "Mode: "
        (summary.mode())
      }
    }
    div.clear {}
  }
}