mirror of
https://github.com/adoyle0/thaw.git
synced 2025-03-13 05:59:49 -04:00
feat: upload component
This commit is contained in:
parent
6ab369718f
commit
85714c528c
4 changed files with 92 additions and 17 deletions
|
@ -5,23 +5,65 @@ use prisms::highlight_str;
|
||||||
|
|
||||||
#[component]
|
#[component]
|
||||||
pub fn UploadPage() -> impl IntoView {
|
pub fn UploadPage() -> impl IntoView {
|
||||||
|
let message = use_message();
|
||||||
|
let custom_request = move |file_list: FileList| {
|
||||||
|
message.create(
|
||||||
|
format!("Number of uploaded files: {}", file_list.length()),
|
||||||
|
MessageVariant::Success,
|
||||||
|
Default::default(),
|
||||||
|
);
|
||||||
|
};
|
||||||
view! {
|
view! {
|
||||||
<div style="width: 896px; margin: 0 auto;">
|
<div style="width: 896px; margin: 0 auto;">
|
||||||
<h1>"Upload(TODO)"</h1>
|
<h1>"Upload"</h1>
|
||||||
<Demo>
|
<Demo>
|
||||||
<Upload>
|
<Upload custom_request>
|
||||||
<Button>
|
<Button>
|
||||||
"upload"
|
"Upload"
|
||||||
</Button>
|
</Button>
|
||||||
</Upload>
|
</Upload>
|
||||||
|
<DemoCode
|
||||||
|
slot
|
||||||
|
html=highlight_str!(
|
||||||
|
r#"
|
||||||
|
let message = use_message();
|
||||||
|
let custom_request = move |file_list: FileList| {
|
||||||
|
message.create(
|
||||||
|
format!("Number of uploaded files: {}", file_list.length()),
|
||||||
|
MessageVariant::Success,
|
||||||
|
Default::default(),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
view!{
|
||||||
|
<Upload>
|
||||||
|
<Button>
|
||||||
|
"upload"
|
||||||
|
</Button>
|
||||||
|
</Upload>
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
"rust"
|
||||||
|
)
|
||||||
|
>
|
||||||
|
|
||||||
|
""
|
||||||
|
</DemoCode>
|
||||||
|
</Demo>
|
||||||
|
<h3>"Drag to upload"</h3>
|
||||||
|
<Demo>
|
||||||
|
<Upload>
|
||||||
|
<UploadDragger>
|
||||||
|
"Click or drag a file to this area to upload"
|
||||||
|
</UploadDragger>
|
||||||
|
</Upload>
|
||||||
<DemoCode
|
<DemoCode
|
||||||
slot
|
slot
|
||||||
html=highlight_str!(
|
html=highlight_str!(
|
||||||
r#"
|
r#"
|
||||||
<Upload>
|
<Upload>
|
||||||
<Button>
|
<UploadDragger>
|
||||||
"upload"
|
"Click or drag a file to this area to upload"
|
||||||
</Button>
|
</UploadDragger>
|
||||||
</Upload>
|
</Upload>
|
||||||
"#,
|
"#,
|
||||||
"rust"
|
"rust"
|
||||||
|
|
|
@ -1,25 +1,23 @@
|
||||||
use crate::{mount_style, utils::AsyncCallback};
|
mod upload_dragger;
|
||||||
|
|
||||||
|
use crate::mount_style;
|
||||||
use leptos::*;
|
use leptos::*;
|
||||||
use web_sys::FileList;
|
pub use upload_dragger::UploadDragger;
|
||||||
|
pub use web_sys::FileList;
|
||||||
|
|
||||||
#[component]
|
#[component]
|
||||||
pub fn Upload(
|
pub fn Upload(
|
||||||
#[prop(optional, into)] accept: MaybeSignal<String>,
|
#[prop(optional, into)] accept: MaybeSignal<String>,
|
||||||
#[prop(optional, into)] multiple: MaybeSignal<bool>,
|
#[prop(optional, into)] multiple: MaybeSignal<bool>,
|
||||||
#[prop(optional, into)] on_before_upload: Option<AsyncCallback<FileList, bool>>,
|
#[prop(optional, into)] custom_request: Option<Callback<FileList, ()>>,
|
||||||
children: Children,
|
children: Children,
|
||||||
) -> impl IntoView {
|
) -> impl IntoView {
|
||||||
mount_style("upload", include_str!("./upload.css"));
|
mount_style("upload", include_str!("./upload.css"));
|
||||||
|
|
||||||
let on_file_addition = move |files: FileList| {
|
let on_file_addition = move |files: FileList| {
|
||||||
spawn_local(async move {
|
if let Some(custom_request) = custom_request {
|
||||||
if let Some(on_before_upload) = on_before_upload {
|
custom_request.call(files);
|
||||||
let is_allow = on_before_upload.call(files).await;
|
}
|
||||||
if is_allow {
|
|
||||||
//TODO submit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
let input_ref = create_node_ref::<html::Input>();
|
let input_ref = create_node_ref::<html::Input>();
|
||||||
let on_change = move |_| {
|
let on_change = move |_| {
|
||||||
|
|
14
src/upload/upload-dragger.css
Normal file
14
src/upload/upload-dragger.css
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
.melt-upload-dragger {
|
||||||
|
padding: 20px;
|
||||||
|
background-color: #fafbfc;
|
||||||
|
color: #24292e;
|
||||||
|
border: 1px solid #e0e0e6;
|
||||||
|
border-radius: 3px;
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: border 0.3s;
|
||||||
|
}
|
||||||
|
.melt-upload-dragger:hover,
|
||||||
|
.melt-upload--drag-over .melt-upload-dragger {
|
||||||
|
border: 1px dashed var(--border-color-hover);
|
||||||
|
}
|
21
src/upload/upload_dragger.rs
Normal file
21
src/upload/upload_dragger.rs
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
use crate::{use_theme, utils::mount_style::mount_style, Theme};
|
||||||
|
use leptos::*;
|
||||||
|
|
||||||
|
#[component]
|
||||||
|
pub fn UploadDragger(children: Children) -> impl IntoView {
|
||||||
|
mount_style("upload-dragger", include_str!("./upload-dragger.css"));
|
||||||
|
let theme = use_theme(Theme::light);
|
||||||
|
let css_vars = create_memo(move |_| {
|
||||||
|
let mut css_vars = String::new();
|
||||||
|
theme.with(|theme| {
|
||||||
|
let border_color_hover = theme.common.color_primary.clone();
|
||||||
|
css_vars.push_str(&format!("--border-color-hover: {border_color_hover};"));
|
||||||
|
});
|
||||||
|
css_vars
|
||||||
|
});
|
||||||
|
view! {
|
||||||
|
<div class="melt-upload-dragger" style=css_vars>
|
||||||
|
{children()}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue