Commit 04eb97d7 by dongshufeng

refactor(all): add iesplan example

parent 792157d1
1
\ No newline at end of file
use wasm_bindgen::prelude::*; use wasm_bindgen::prelude::*;
use web_sys::Element; use web_sys::Element;
use crate::startpage::StartPage; use crate::startpage::StartPage;
use yew_bulma::layout::tiles::Tiles; use yew_bulma::layout::tiles::Tiles;
use eig_domain::excel::get_first_sheet_merged_cells; use eig_domain::excel::get_first_sheet_merged_cells;
...@@ -12,6 +11,7 @@ pub fn create_view(e: Element) { ...@@ -12,6 +11,7 @@ pub fn create_view(e: Element) {
yew::Renderer::<StartPage>::with_root(e).render(); yew::Renderer::<StartPage>::with_root(e).render();
} }
#[derive(Clone, Debug, PartialEq)]
pub enum ParaType { pub enum ParaType {
// show expresion, true expression, false expression // show expresion, true expression, false expression
Checkbox, Checkbox,
...@@ -22,6 +22,7 @@ pub enum ParaType { ...@@ -22,6 +22,7 @@ pub enum ParaType {
TextField, TextField,
} }
#[derive(Clone, Debug, PartialEq)]
pub struct Parameters { pub struct Parameters {
id: usize, id: usize,
name: String, name: String,
......
...@@ -10,27 +10,31 @@ pub enum Msg { ...@@ -10,27 +10,31 @@ pub enum Msg {
SetOption(usize, String), SetOption(usize, String),
} }
pub struct ParaCard { #[derive(Clone, Debug, PartialEq, Properties)]
paras: Parameters pub struct Props {
pub paras: Parameters
} }
pub struct ParaCard {}
impl Component for ParaCard { impl Component for ParaCard {
type Message = Msg; type Message = Msg;
type Properties = (); type Properties = Props;
fn create(ctx: &Context<Self>) -> Self { fn create(_: &Context<Self>) -> Self {
todo!() Self {}
} }
fn view(&self, ctx: &Context<Self>) -> Html { 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) self.create_input(ctx, i)
}).collect::<Html>(); }).collect::<Html>();
html! { html! {
<Card> <Card>
<CardHeader> <CardHeader>
<p class="card-header-title"> <p class="card-header-title">
{self.paras.name.clone()} {paras.name.clone()}
</p> </p>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
...@@ -43,10 +47,11 @@ impl Component for ParaCard { ...@@ -43,10 +47,11 @@ impl Component for ParaCard {
impl ParaCard { impl ParaCard {
fn create_input(&self, ctx: &Context<Self>, i: usize) -> Html { fn create_input(&self, ctx: &Context<Self>, i: usize) -> Html {
let point_id = &self.paras.points[i]; let paras = &ctx.props().paras;
let input_type = &self.paras.para_types[i]; let point_id = &paras.points[i];
let input_type = &paras.para_types[i];
let link = ctx.link(); 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() label.clone()
} else { } else {
"".to_string() "".to_string()
......
use std::collections::HashMap; use std::collections::HashMap;
use yew::prelude::*; use yew::prelude::*;
use yew_bulma::calendar::*;
use yew_bulma::*;
use yew_bulma::layout::tiles::Tiles; use yew_bulma::layout::tiles::Tiles;
use yew_bulma::*;
use crate::build_tiles; use crate::build_tiles;
pub enum Msg { pub enum Msg {
DateRangePicked(u64, u64), start,
} }
pub struct StartPage { pub struct StartPage {
tiles: Tiles, tiles: Tiles,
chart1: NodeRef,
chart2: NodeRef,
chart3: NodeRef,
chart4: NodeRef,
} }
impl Component for StartPage { impl Component for StartPage {
...@@ -25,177 +19,26 @@ impl Component for StartPage { ...@@ -25,177 +19,26 @@ impl Component for StartPage {
fn create(_: &Context<Self>) -> Self { fn create(_: &Context<Self>) -> Self {
let tiles = build_tiles(include_bytes!("../layout.xlsx").to_vec()).unwrap(); let tiles = build_tiles(include_bytes!("../layout.xlsx").to_vec()).unwrap();
Self { Self { tiles }
tiles,
chart1: Default::default(),
chart2: Default::default(),
chart3: Default::default(),
chart4: Default::default(),
}
} }
fn update(&mut self, _: &Context<Self>, msg: Self::Message) -> bool { fn update(&mut self, _: &Context<Self>, msg: Self::Message) -> bool {
match msg { match msg {
Msg::DateRangePicked(start, end) => { Msg::start => {
alert(&format!("{} - {}", start, end)); alert("start");
} }
} }
false false
} }
fn view(&self, ctx: &Context<Self>) -> Html { fn view(&self, ctx: &Context<Self>) -> Html {
let link = ctx.link(); let mut nodes = HashMap::with_capacity(22);
let mut date_picker_text = HashMap::new(); for i in 0..22 {
date_picker_text.insert("ok".to_string(), "确定".to_string()); let v = html! {
date_picker_text.insert("cancel".to_string(), "取消".to_string()); <p>{format!("{i}")}</p>
date_picker_text.insert("choose_date".to_string(), "选择日期".to_string()); };
date_picker_text.insert("now".to_string(), "当前时间".to_string()); nodes.insert(i, v);
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>
</>
} }
self.tiles.create_html(nodes)
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论