nova_forms/components/
toolbar.rs1use std::{fmt::Debug, str::FromStr};
2
3use leptos::*;
4use leptos_i18n::{I18nContext, Locale, LocaleKeys};
5
6use crate::{start_preview, stop_preview, use_translation, ButtonGroup, Button, SelectButton, FormContext, PagesContext, Translation};
7
8#[component]
9pub fn Toolbar(
10 children: Children,
11) -> impl IntoView {
12 view! { <aside id="toolbar"><ButtonGroup>{children()}</ButtonGroup></aside> }
13}
14
15#[component]
16pub fn ToolbarSubmitButton() -> impl IntoView {
17 let nova_form_context = expect_context::<FormContext>();
18
19 view! {
20 <Button
21 button_type="submit"
22 label=use_translation(Translation::Submit)
23 icon="send"
24 form=nova_form_context.form_id()
25 disabled=cfg!(feature = "csr")
26 />
27
28 }
29}
30
31#[component]
32pub fn ToolbarPreviewButton() -> impl IntoView {
33 let nova_form_context = expect_context::<FormContext>();
34
35 view! {
36 {move || {
37 if nova_form_context.is_preview_mode() {
38 view! {
39 <Button
40 label=use_translation(Translation::Edit)
41 icon="edit"
42 on:click=move |_| {
43 stop_preview(nova_form_context.form_id());
44 nova_form_context.edit_mode();
45 }
46 />
47 }
48 } else {
49 view! {
50 <Button
51 label=use_translation(Translation::Preview)
52 icon="visibility"
53 on:click=move |_| {
54 nova_form_context.preview_mode();
55 start_preview(nova_form_context.form_id());
56 }
57 />
58 }
59 }
60 }}
61 }
62}
63
64#[component]
65pub fn ToolbarLocaleSelect<L, K>(
66 i18n: I18nContext<L, K>,
67) -> impl IntoView
68where
69 L: Locale + 'static,
70 <L as FromStr>::Err: Debug,
71 K: LocaleKeys<Locale = L> + 'static,
72{
73 let nova_form_context = expect_context::<FormContext>();
74
75 let locales = L::get_all()
76 .iter()
77 .map(|locale| {
78 let id = &locale.as_icu_locale().id;
79 let language_str = match id.language.as_str() {
80 "en" => "English",
81 "de" => "Deutsch",
82 "fr" => "Franรงais",
83 "it" => "Italiano",
84 "es" => "Espaรฑol",
85 other => other,
86 };
87 let region = id.region.as_ref();
88 let region_str = match region {
89 Some(region) => match region.as_str() {
90 "US" => "๐บ๐ธ",
91 "GB" => "๐ฌ๐ง",
92 "DE" => "๐ฉ๐ช",
93 "CH" => "๐จ๐ญ",
94 "FR" => "๐ซ๐ท",
95 "IT" => "๐ฎ๐น",
96 "ES" => "๐ช๐ธ",
97 other => other,
98 },
99 None => match id.language.as_str() {
100 "en" => "๐บ๐ธ",
101 "de" => "๐ฉ๐ช",
102 "fr" => "๐ซ๐ท",
103 "it" => "๐ฎ๐น",
104 "es" => "๐ช๐ธ",
105 _ => "",
106 },
107 };
108 (
109 *locale,
110 if region_str.is_empty() {
111 format!("{}", language_str)
112 } else {
113 format!("{} {}", region_str, language_str)
114 }
115 .into(),
116 )
117 })
118 .collect::<Vec<_>>();
119
120 view! {
121 <SelectButton
122 id="language"
123 label=use_translation(Translation::Language)
124 icon="translate"
125 values=locales.clone()
126 value=move || i18n.get_locale()
127 on_change=move |locale| {
128 i18n.set_locale(locale);
129 start_preview(nova_form_context.form_id());
130 }
131 />
132 }
133}
134
135
136#[component]
137pub fn ToolbarPageSelect(
138) -> impl IntoView {
139 let pages_context = expect_context::<RwSignal<PagesContext>>();
140
141
142 let pages = pages_context
143 .get_untracked()
144 .pages()
145 .iter()
146 .map(|page| (page.id(), page.label().clone()))
147 .collect::<Vec<_>>();
148
149 view! {
150 <Show when=move || { pages_context.get().len() > 1 }>
151 <SelectButton
152 id="menu"
153 label=use_translation(Translation::Menu)
154 icon="menu"
155 values=pages.clone()
156 value=move || pages_context.get().selected().expect("page index out of bounds")
157 on_change=move |tab_id| {
158 pages_context.update(|pages_context| pages_context.select(tab_id))
159 }
160 />
161 </Show>
162 }
163
164}