Skip to content

Commit 436ef07

Browse files
committed
wip!: refactor frender-form-control
1 parent 882804c commit 436ef07

File tree

43 files changed

+1778
-953
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1778
-953
lines changed

packages/frender-common/src/reactive_value/non_reactive.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ impl<T: CachedNonReactiveValueRenderInit<VK, Cache>, VK: ?Sized + ValueKind, Cac
158158
type RenderInitPinned<R: FnOnce(<VK as ValueKind>::Value<'_>) -> Out, Out> = Self;
159159
}
160160

161+
// TODO: proxy SsrStr
161162
#[derive(Debug)]
162163
pub struct Uncached<T>(pub T);
163164

packages/frender-common/src/reactive_value/non_reactive/temp_str.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,11 @@ impl<S: ToAsRefStr> UncachedNonReactiveValue<str> for TempStr<S> {
2020
Provide(self.0)
2121
}
2222
}
23+
24+
impl UncachedNonReactiveValue<str> for &str {
25+
type UncachedIntoProvideValue = Provide<Self>;
26+
27+
fn uncached_into_provide_value(self) -> Self::UncachedIntoProvideValue {
28+
Provide(self)
29+
}
30+
}

packages/frender-common/src/strings.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,6 @@ use crate::{
55

66
pub mod csr;
77

8-
pub(crate) mod known {
9-
crate::define_trait_known_str!(
10-
pub(crate) trait Ssr = KnownSsrStr;
11-
pub(crate) trait Csr = KnownCsrStr;
12-
);
13-
}
14-
158
pub trait IsNonReactiveStr {
169
fn into_reactive_value(self) -> NonReactiveStr<Self>
1710
where
@@ -190,30 +183,45 @@ pub mod define_trait_known_str {
190183
#[macro_export]
191184
macro_rules! define_trait_known_str {
192185
(
186+
$(
187+
pub(crate) trait IsNonReactiveStr = $KnownIsNonReactiveStr:ident;
188+
)?
193189
pub(crate) trait Ssr = $KnownSsrStr:ident;
194190
pub(crate) trait Csr = $KnownCsrStr:ident;
195191
) => {
196-
pub(crate) trait $KnownSsrStr: $crate::strings::SsrStr {}
197-
pub(crate) trait $KnownCsrStr: $crate::strings::CsrStr {}
192+
$(
193+
pub(crate) trait $KnownIsNonReactiveStr: $crate::strings::IsNonReactiveStr {}
194+
)?
195+
pub(crate) trait $KnownSsrStr: $crate::strings::SsrStr $(+ $KnownIsNonReactiveStr)? {}
196+
pub(crate) trait $KnownCsrStr: $crate::strings::CsrStr $(+ $KnownIsNonReactiveStr)? {}
198197

199198
const _: () = {
200199
use std::convert::AsRef;
201200

202201
use $crate::{
203-
strings::{CsrStr, SsrStr},
202+
strings::{IsNonReactiveStr, CsrStr, SsrStr},
204203
IntoStaticStr, IntoStaticStrCache,
205204
};
206205

207206
trait KnownStaticStr: 'static + AsRef<str> + SsrStr + CsrStr {}
208207

209208
$crate::__define_trait_known_str_impl_static! {KnownStaticStr}
210209

210+
$(
211+
impl<S: KnownStaticStr> $KnownIsNonReactiveStr for S {}
212+
)?
211213
impl<S: KnownStaticStr> $KnownSsrStr for S {}
212214
impl<S: KnownStaticStr> $KnownCsrStr for S {}
213215

216+
$(
217+
impl<S> $KnownIsNonReactiveStr for $crate::TempStr<S> {}
218+
)?
214219
impl<S: IntoStaticStr> $KnownSsrStr for $crate::TempStr<S> {}
215220
impl<S: IntoStaticStrCache> $KnownCsrStr for $crate::TempStr<S> {}
216221

222+
$(
223+
impl<S: IsNonReactiveStr> $KnownIsNonReactiveStr for $crate::strings::NonReactiveStr<S> {}
224+
)?
217225
impl<S: SsrStr> $KnownSsrStr for $crate::strings::NonReactiveStr<S> {}
218226
impl<S: CsrStr> $KnownCsrStr for $crate::strings::NonReactiveStr<S> {}
219227
};

packages/frender-form-control/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ frender-events = { version = "0.1.0", path = "../frender-events" }
1414
frender-macro-rules = { version = "0.1.0", path = "../frender-macro-rules" }
1515
frender-ssr = { version = "0.1.0", path = "../frender-ssr", optional = true }
1616

17-
1817
[dependencies.web-sys]
1918
version = "0.3.60"
2019
optional = true

packages/frender-form-control/src/element.rs renamed to packages/frender-form-control/src/csr/element.rs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,26 @@ use std::marker::PhantomData;
22

33
use frender_events::event::Event;
44

5-
use frender_dom::{behaviors, HandleEvent, RegisterUpdate};
5+
use frender_dom::csr::{behaviors, HandleEvent, RegisterUpdate};
66

7-
use super::value::{FormControlValueKind, HandleFormControlValue};
7+
use crate::{
8+
value::{KindOfChecked, KindOfValue, KindOfValueAsNumber},
9+
FormControlValueKind,
10+
};
811

9-
pub trait FormControlElement<V: ?Sized + FormControlValueKind, Renderer: ?Sized>:
12+
use super::value::HandleFormControlValue;
13+
14+
pub trait FormControlElement<VK: ?Sized + FormControlValueKind, Renderer: ?Sized>:
1015
behaviors::HtmlElement<Renderer>
1116
{
12-
fn set_default_value(&mut self, renderer: &mut Renderer, value: &V);
13-
fn set_value(&mut self, renderer: &mut Renderer, value: &V);
17+
fn set_default_value(&mut self, renderer: &mut Renderer, value: VK::Value<'_>);
18+
fn remove_default_value(&mut self, renderer: &mut Renderer);
19+
20+
fn set_value(&mut self, renderer: &mut Renderer, value: VK::Value<'_>);
1421

1522
fn remove_value(&mut self, renderer: &mut Renderer);
1623

17-
type OnValueChangeEventListenerUnpinned<F: HandleFormControlValue<V> + 'static>: RegisterUpdate<
24+
type OnValueChangeEventListenerUnpinned<F: HandleFormControlValue<VK> + 'static>: RegisterUpdate<
1825
Self::OnValueChangeElementUnpinned,
1926
Renderer,
2027
Self::OnValueChangeFUnpinned<F>,
@@ -24,7 +31,7 @@ pub trait FormControlElement<V: ?Sized + FormControlValueKind, Renderer: ?Sized>
2431

2532
fn on_value_change_element_unpinned(&mut self) -> &mut Self::OnValueChangeElementUnpinned;
2633

27-
type OnValueChangeFUnpinned<F: HandleFormControlValue<V> + 'static>: From<F>;
34+
type OnValueChangeFUnpinned<F: HandleFormControlValue<VK> + 'static>: From<F>;
2835
}
2936

3037
#[derive(Debug)]
@@ -59,19 +66,19 @@ pub trait HandleFormControlValueKind: FormControlValueKind {
5966
fn event_form_control_value<E: ?Sized + Event>(e: &E) -> Option<Self::FormControlValue<'_>>;
6067
}
6168

62-
impl HandleFormControlValueKind for str {
69+
impl HandleFormControlValueKind for KindOfValue {
6370
fn event_form_control_value<E: ?Sized + Event>(e: &E) -> Option<Self::FormControlValue<'_>> {
6471
e.target_form_control_value()
6572
}
6673
}
6774

68-
impl HandleFormControlValueKind for bool {
75+
impl HandleFormControlValueKind for KindOfChecked {
6976
fn event_form_control_value<E: ?Sized + Event>(e: &E) -> Option<Self::FormControlValue<'_>> {
7077
e.target_input_checked()
7178
}
7279
}
7380

74-
impl HandleFormControlValueKind for f64 {
81+
impl HandleFormControlValueKind for KindOfValueAsNumber {
7582
fn event_form_control_value<E: ?Sized + Event>(e: &E) -> Option<Self::FormControlValue<'_>> {
7683
e.target_input_value_as_number()
7784
}

packages/frender-form-control/src/element/web.rs renamed to packages/frender-form-control/src/csr/element/web.rs

Lines changed: 61 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use frender_events::{
44

55
use frender_dom::csr::{self, web::event_listener::unpinned};
66

7+
use crate::value::{KindOfChecked, KindOfValue, KindOfValueAsNumber};
8+
79
use super::{
810
super::value::HandleFormControlValue, FormControlElement, HandleFormControlValueChange,
911
};
@@ -46,7 +48,7 @@ impl JsCastEventType for Change {
4648
}
4749
}
4850

49-
impl<Renderer: ?Sized + csr::web::Renderer> FormControlElement<str, Renderer>
51+
impl<Renderer: ?Sized + csr::web::Renderer> FormControlElement<KindOfValue, Renderer>
5052
for csr::web::Node<
5153
//
5254
web_sys::HtmlTextAreaElement,
@@ -64,116 +66,137 @@ impl<Renderer: ?Sized + csr::web::Renderer> FormControlElement<str, Renderer>
6466
.unwrap_throw()
6567
}
6668

69+
fn remove_default_value(&mut self, renderer: &mut Renderer) {
70+
self.set_default_value(renderer, "")
71+
}
72+
6773
fn remove_value(&mut self, renderer: &mut Renderer) {
6874
self.set_default_value(renderer, "");
6975
self.set_value(renderer, "");
7076
}
7177

72-
type OnValueChangeEventListenerUnpinned<F: HandleFormControlValue<str> + 'static> =
73-
unpinned::EventListenerOfType<HandleFormControlValueChange<str, F>, Input>;
78+
type OnValueChangeEventListenerUnpinned<F: HandleFormControlValue<KindOfValue> + 'static> =
79+
unpinned::EventListenerOfType<HandleFormControlValueChange<KindOfValue, F>, Input>;
7480

7581
type OnValueChangeElementUnpinned = Self;
7682

7783
fn on_value_change_element_unpinned(&mut self) -> &mut Self::OnValueChangeElementUnpinned {
7884
self
7985
}
8086

81-
type OnValueChangeFUnpinned<F: HandleFormControlValue<str> + 'static> =
82-
HandleFormControlValueChange<str, F>;
87+
type OnValueChangeFUnpinned<F: HandleFormControlValue<KindOfValue> + 'static> =
88+
HandleFormControlValueChange<KindOfValue, F>;
8389
}
8490

85-
impl<Renderer: ?Sized + csr::web::Renderer> FormControlElement<str, Renderer>
91+
impl<Renderer: ?Sized + csr::web::Renderer> FormControlElement<KindOfValue, Renderer>
8692
for csr::web::Node<
8793
//
8894
web_sys::HtmlInputElement,
8995
>
9096
{
91-
fn set_value(&mut self, _: &mut Renderer, value: &str) {
92-
self.0.set_value(value)
93-
}
94-
9597
fn set_default_value(&mut self, _: &mut Renderer, value: &str) {
9698
self.0.set_default_value(value)
9799
}
98100

101+
fn remove_default_value(&mut self, renderer: &mut Renderer) {
102+
<Self as FormControlElement<KindOfValue, Renderer>>::set_default_value(self, renderer, "");
103+
}
104+
105+
fn set_value(&mut self, _: &mut Renderer, value: &str) {
106+
self.0.set_value(value)
107+
}
108+
99109
fn remove_value(&mut self, renderer: &mut Renderer) {
100-
self.set_default_value(renderer, "");
101-
self.set_value(renderer, "");
110+
<Self as FormControlElement<KindOfValue, Renderer>>::set_default_value(self, renderer, "");
111+
<Self as FormControlElement<KindOfValue, Renderer>>::set_value(self, renderer, "");
102112
}
103113

104-
type OnValueChangeEventListenerUnpinned<F: HandleFormControlValue<str> + 'static> =
105-
unpinned::EventListenerOfType<HandleFormControlValueChange<str, F>, Input>;
114+
type OnValueChangeEventListenerUnpinned<F: HandleFormControlValue<KindOfValue> + 'static> =
115+
unpinned::EventListenerOfType<HandleFormControlValueChange<KindOfValue, F>, Input>;
106116

107117
type OnValueChangeElementUnpinned = Self;
108118

109119
fn on_value_change_element_unpinned(&mut self) -> &mut Self::OnValueChangeElementUnpinned {
110120
self
111121
}
112122

113-
type OnValueChangeFUnpinned<F: HandleFormControlValue<str> + 'static> =
114-
HandleFormControlValueChange<str, F>;
123+
type OnValueChangeFUnpinned<F: HandleFormControlValue<KindOfValue> + 'static> =
124+
HandleFormControlValueChange<KindOfValue, F>;
115125
}
116126

117-
impl<Renderer: ?Sized + csr::web::Renderer> FormControlElement<bool, Renderer>
127+
impl<Renderer: ?Sized + csr::web::Renderer> FormControlElement<KindOfChecked, Renderer>
118128
for csr::web::Node<
119129
//
120130
web_sys::HtmlInputElement,
121131
>
122132
{
123-
fn set_value(&mut self, _: &mut Renderer, &value: &bool) {
124-
self.0.set_checked(value)
133+
fn set_default_value(&mut self, _: &mut Renderer, value: bool) {
134+
self.0.set_default_checked(value)
125135
}
126136

127-
fn set_default_value(&mut self, _: &mut Renderer, &value: &bool) {
128-
self.0.set_default_checked(value)
137+
fn remove_default_value(&mut self, renderer: &mut Renderer) {
138+
<Self as FormControlElement<KindOfChecked, Renderer>>::set_default_value(
139+
self, renderer, false,
140+
)
141+
}
142+
143+
fn set_value(&mut self, _: &mut Renderer, value: bool) {
144+
self.0.set_checked(value)
129145
}
130146

131147
fn remove_value(&mut self, renderer: &mut Renderer) {
132-
self.set_default_value(renderer, &false);
133-
self.set_value(renderer, &false);
148+
<Self as FormControlElement<KindOfChecked, Renderer>>::set_default_value(
149+
self, renderer, false,
150+
);
151+
<Self as FormControlElement<KindOfChecked, Renderer>>::set_value(self, renderer, false);
134152
}
135153

136-
type OnValueChangeEventListenerUnpinned<F: HandleFormControlValue<bool> + 'static> =
137-
unpinned::EventListenerOfType<HandleFormControlValueChange<bool, F>, Change>;
154+
type OnValueChangeEventListenerUnpinned<F: HandleFormControlValue<KindOfChecked> + 'static> =
155+
unpinned::EventListenerOfType<HandleFormControlValueChange<KindOfChecked, F>, Change>;
138156

139157
type OnValueChangeElementUnpinned = Self;
140158

141159
fn on_value_change_element_unpinned(&mut self) -> &mut Self::OnValueChangeElementUnpinned {
142160
self
143161
}
144162

145-
type OnValueChangeFUnpinned<F: HandleFormControlValue<bool> + 'static> =
146-
HandleFormControlValueChange<bool, F>;
163+
type OnValueChangeFUnpinned<F: HandleFormControlValue<KindOfChecked> + 'static> =
164+
HandleFormControlValueChange<KindOfChecked, F>;
147165
}
148166

149-
impl<Renderer: ?Sized + csr::web::Renderer> FormControlElement<f64, Renderer>
167+
impl<Renderer: ?Sized + csr::web::Renderer> FormControlElement<KindOfValueAsNumber, Renderer>
150168
for csr::web::Node<
151169
//
152170
web_sys::HtmlInputElement,
153171
>
154172
{
155-
fn set_value(&mut self, _: &mut Renderer, &value: &f64) {
156-
self.0.set_value_as_number(value) // TODO: this might throw exception if input.type does not support number values
173+
fn set_default_value(&mut self, _: &mut Renderer, value: f64) {
174+
crate::input::web::set_default_value(&self.0, value);
157175
}
158176

159-
fn set_default_value(&mut self, _: &mut Renderer, &value: &f64) {
160-
super::super::input::web::set_default_value(&self.0, value);
177+
fn remove_default_value(&mut self, _: &mut Renderer) {
178+
self.0.set_default_value("")
161179
}
162180

163-
fn remove_value(&mut self, renderer: &mut Renderer) {
181+
fn set_value(&mut self, _: &mut Renderer, value: f64) {
182+
self.0.set_value_as_number(value) // TODO: this might throw exception if input.type does not support number values
183+
}
184+
185+
fn remove_value(&mut self, _: &mut Renderer) {
164186
self.0.set_default_value("");
165-
self.set_value(renderer, &f64::NAN);
187+
self.0.set_value_as_number(f64::NAN);
166188
}
167189

168-
type OnValueChangeEventListenerUnpinned<F: HandleFormControlValue<f64> + 'static> =
169-
unpinned::EventListenerOfType<HandleFormControlValueChange<f64, F>, Input>;
190+
type OnValueChangeEventListenerUnpinned<
191+
F: HandleFormControlValue<KindOfValueAsNumber> + 'static,
192+
> = unpinned::EventListenerOfType<HandleFormControlValueChange<KindOfValueAsNumber, F>, Input>;
170193

171194
type OnValueChangeElementUnpinned = Self;
172195

173196
fn on_value_change_element_unpinned(&mut self) -> &mut Self::OnValueChangeElementUnpinned {
174197
self
175198
}
176199

177-
type OnValueChangeFUnpinned<F: HandleFormControlValue<f64> + 'static> =
178-
HandleFormControlValueChange<f64, F>;
200+
type OnValueChangeFUnpinned<F: HandleFormControlValue<KindOfValueAsNumber> + 'static> =
201+
HandleFormControlValueChange<KindOfValueAsNumber, F>;
179202
}

0 commit comments

Comments
 (0)