nova_forms/components/
toolbar.rs

1use 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}