Commit 04eb97d7 by dongshufeng

refactor(all): add iesplan example

parent 792157d1
1
\ No newline at end of file
use wasm_bindgen::prelude::*;
use web_sys::Element;
use crate::startpage::StartPage;
use yew_bulma::layout::tiles::Tiles;
use eig_domain::excel::get_first_sheet_merged_cells;
......@@ -12,6 +11,7 @@ pub fn create_view(e: Element) {
yew::Renderer::<StartPage>::with_root(e).render();
}
#[derive(Clone, Debug, PartialEq)]
pub enum ParaType {
// show expresion, true expression, false expression
Checkbox,
......@@ -22,6 +22,7 @@ pub enum ParaType {
TextField,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Parameters {
id: usize,
name: String,
......
......@@ -10,27 +10,31 @@ pub enum Msg {
SetOption(usize, String),
}
pub struct ParaCard {
paras: Parameters
#[derive(Clone, Debug, PartialEq, Properties)]
pub struct Props {
pub paras: Parameters
}
pub struct ParaCard {}
impl Component for ParaCard {
type Message = Msg;
type Properties = ();
type Properties = Props;
fn create(ctx: &Context<Self>) -> Self {
todo!()
fn create(_: &Context<Self>) -> Self {
Self {}
}
fn view(&self, ctx: &Context<Self>) -> Html {
let input_html = (0..self.paras.points.len()).map(|i| {
let paras = &ctx.props().paras;
let input_html = (0..paras.points.len()).map(|i| {
self.create_input(ctx, i)
}).collect::<Html>();
html! {
<Card>
<CardHeader>
<p class="card-header-title">
{self.paras.name.clone()}
{paras.name.clone()}
</p>
</CardHeader>
<CardContent>
......@@ -43,10 +47,11 @@ impl Component for ParaCard {
impl ParaCard {
fn create_input(&self, ctx: &Context<Self>, i: usize) -> Html {
let point_id = &self.paras.points[i];
let input_type = &self.paras.para_types[i];
let paras = &ctx.props().paras;
let point_id = &paras.points[i];
let input_type = &paras.para_types[i];
let link = ctx.link();
let label = if let Some(label) = self.paras.labels.get(i) {
let label = if let Some(label) = paras.labels.get(i) {
label.clone()
} else {
"".to_string()
......
use std::collections::HashMap;
use yew::prelude::*;
use yew_bulma::calendar::*;
use yew_bulma::*;
use yew_bulma::layout::tiles::Tiles;
use yew_bulma::*;
use crate::build_tiles;
pub enum Msg {
DateRangePicked(u64, u64),
start,
}
pub struct StartPage {
tiles: Tiles,
chart1: NodeRef,
chart2: NodeRef,
chart3: NodeRef,
chart4: NodeRef,
}
impl Component for StartPage {
......@@ -25,177 +19,26 @@ impl Component for StartPage {
fn create(_: &Context<Self>) -> Self {
let tiles = build_tiles(include_bytes!("../layout.xlsx").to_vec()).unwrap();
Self {
tiles,
chart1: Default::default(),
chart2: Default::default(),
chart3: Default::default(),
chart4: Default::default(),
}
Self { tiles }
}
fn update(&mut self, _: &Context<Self>, msg: Self::Message) -> bool {
match msg {
Msg::DateRangePicked(start, end) => {
alert(&format!("{} - {}", start, end));
Msg::start => {
alert("start");
}
}
false
}
fn view(&self, ctx: &Context<Self>) -> Html {
let link = ctx.link();
let mut date_picker_text = HashMap::new();
date_picker_text.insert("ok".to_string(), "确定".to_string());
date_picker_text.insert("cancel".to_string(), "取消".to_string());
date_picker_text.insert("choose_date".to_string(), "选择日期".to_string());
date_picker_text.insert("now".to_string(), "当前时间".to_string());
date_picker_text.insert("today".to_string(), "今日".to_string());
date_picker_text.insert("clear".to_string(), "清除".to_string());
date_picker_text.insert("validate".to_string(), "验证".to_string());
html! {
<>
<Level>
<LevelLeft>
<LevelItem>
<Title classes={classes!("has-text-primary")}>
<Icon classes ={classes!("icon-title")} size={Size::Small} awesome_icon={"fa fa-tachometer"} />
<span>{"Dashboard"}</span>
</Title>
</LevelItem>
</LevelLeft>
<LevelRight>
<LevelItem>
<DatePicker on_date_picked={link.callback(|(t1,t2)|Msg::DateRangePicked(t1,t2))}
text_map={date_picker_text.clone()} />
</LevelItem>
<LevelItem>
<DatePicker on_date_picked={link.callback(|(t1,t2)|Msg::DateRangePicked(t1, t2))}
text_map={date_picker_text} is_range={true} picker_type={PickerType::Datetime} is_button={true}/>
</LevelItem>
</LevelRight>
</Level>
<Columns multiline={true}>
<Column>
<Notification classes={Classes::from("is-primary")}>
<div class={"heading"}>{"Top Seller Total"}</div>
<Title>{"56,950"}</Title>
<Level>
<LevelItem>
<div>
<div class={"heading"}>{"Sales $"}</div>
<Title size={HeaderSize::Is5}>{"250K"}</Title>
</div>
</LevelItem>
<LevelItem>
<div>
<div class={"heading"}>{"Overall $"}</div>
<Title size={HeaderSize::Is5}>{"750K"}</Title>
</div>
</LevelItem>
<LevelItem>
<div>
<div class={"heading"}>{"Sales $"}</div>
<Title size={HeaderSize::Is5}>{"25%"}</Title>
</div>
</LevelItem>
</Level>
</Notification>
</Column>
<Column>
<Notification classes={Classes::from("is-warning")}>
<div class={"heading"}>{"Revenue / Expenses"}</div>
<Title>{"55% / 45%"}</Title>
<Level>
<LevelItem>
<div>
<div class={"heading"}>{"Rev Prod $"}</div>
<Title size={HeaderSize::Is5}>{"30%"}</Title>
</div>
</LevelItem>
<LevelItem>
<div>
<div class={"heading"}>{"Rev Serv $"}</div>
<Title size={HeaderSize::Is5}>{"25%"}</Title>
</div>
</LevelItem>
<LevelItem>
<div>
<div class={"heading"}>{"Exp %"}</div>
<Title size={HeaderSize::Is5}>{"45%"}</Title>
</div>
</LevelItem>
</Level>
</Notification>
</Column>
<Column>
<Notification classes={Classes::from("is-info")}>
<div class={"heading"}>{"Revenue / Expenses"}</div>
<Title>{"55% / 45%"}</Title>
<Level>
<LevelItem>
<div>
<div class={"heading"}>{"Pos"}</div>
<Title size={HeaderSize::Is5}>{"1560"}</Title>
</div>
</LevelItem>
<LevelItem>
<div>
<div class={"heading"}>{"Neg"}</div>
<Title size={HeaderSize::Is5}>{"368"}</Title>
</div>
</LevelItem>
<LevelItem>
<div>
<div class={"heading"}>{"Pos/Neg %"}</div>
<Title size={HeaderSize::Is5}>{"77%"}</Title>
</div>
</LevelItem>
</Level>
</Notification>
</Column>
<Column>
<Notification classes={Classes::from("is-danger")}>
<div class={"heading"}>{"Orders / Returns"}</div>
<Title>{"75% / 25%"}</Title>
<Level>
<LevelItem>
<div>
<div class={"heading"}>{"Orders $"}</div>
<Title size={HeaderSize::Is5}>{"425K"}</Title>
</div>
</LevelItem>
<LevelItem>
<div>
<div class={"heading"}>{"Returns $"}</div>
<Title size={HeaderSize::Is5}>{"106K"}</Title>
</div>
</LevelItem>
<LevelItem>
<div>
<div class={"heading"}>{"Success %"}</div>
<Title size={HeaderSize::Is5}>{"+ 28,5%"}</Title>
</div>
</LevelItem>
</Level>
</Notification>
</Column>
</Columns>
<Columns multiline={true}>
<Column classes={Classes::from("is-6")}>
<Message classes={Classes::from("is-dark")}>
<MessageHeader><p>{"Chart1"}</p></MessageHeader>
<MessageBody><div ref={self.chart1.clone()} style={"width: 100%"}/></MessageBody>
</Message>
</Column>
<Column classes={Classes::from("is-6")}>
<Message classes={Classes::from("is-dark")}>
<MessageHeader><p>{"Chart2"}</p></MessageHeader>
<MessageBody><div ref={self.chart2.clone()} style={"width: 100%"}/></MessageBody>
</Message>
</Column>
</Columns>
</>
let mut nodes = HashMap::with_capacity(22);
for i in 0..22 {
let v = html! {
<p>{format!("{i}")}</p>
};
nodes.insert(i, v);
}
self.tiles.create_html(nodes)
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论