From 5d9eba912d58fe84a549d2ad67954ea769288f1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABlle=20Huisman?= Date: Wed, 28 Jan 2026 15:40:06 +0100 Subject: [PATCH] feat(core): add query parameter to input value --- packages/core/shield/src/form.rs | 1 + .../shield-oauth/src/actions/sign_in.rs | 38 +++++++++++++------ .../shield-oidc/src/actions/sign_in.rs | 8 ++++ .../shield-bootstrap/src/dioxus/input.rs | 3 +- .../shield-bootstrap/src/leptos/input.rs | 3 +- 5 files changed, 40 insertions(+), 13 deletions(-) diff --git a/packages/core/shield/src/form.rs b/packages/core/shield/src/form.rs index b60982d..4a7c606 100644 --- a/packages/core/shield/src/form.rs +++ b/packages/core/shield/src/form.rs @@ -22,6 +22,7 @@ pub struct Input { #[serde(tag = "type", rename_all = "kebab-case")] pub enum InputValue { Origin, + Query { key: String }, String { value: String }, } diff --git a/packages/methods/shield-oauth/src/actions/sign_in.rs b/packages/methods/shield-oauth/src/actions/sign_in.rs index 145a272..035cf3e 100644 --- a/packages/methods/shield-oauth/src/actions/sign_in.rs +++ b/packages/methods/shield-oauth/src/actions/sign_in.rs @@ -2,9 +2,9 @@ use async_trait::async_trait; use oauth2::{CsrfToken, PkceCodeChallenge, Scope, url::form_urlencoded::parse}; use serde::Deserialize; use shield::{ - Action, ActionMethod, ConfigurationError, Form, Input, InputType, InputTypeSubmit, InputValue, - MethodSession, Provider, Request, Response, ResponseType, SessionAction, ShieldError, - SignInAction, erased_action, + Action, ActionMethod, ConfigurationError, Form, Input, InputType, InputTypeHidden, + InputTypeSubmit, InputValue, MethodSession, Provider, Request, Response, ResponseType, + SessionAction, ShieldError, SignInAction, erased_action, }; use url::Url; @@ -55,14 +55,30 @@ impl Action for OauthSignInAction { async fn forms(&self, provider: OauthProvider) -> Result, ShieldError> { Ok(vec![Form { - inputs: vec![Input { - name: "submit".to_owned(), - label: None, - r#type: InputType::Submit(InputTypeSubmit::default()), - value: Some(InputValue::String { - value: format!("Sign in with {}", provider.name()), - }), - }], + inputs: vec![ + Input { + name: "redirectOrigin".to_owned(), + label: None, + r#type: InputType::Hidden(InputTypeHidden::default()), + value: Some(InputValue::Origin), + }, + Input { + name: "redirectUrl".to_owned(), + label: None, + r#type: InputType::Hidden(InputTypeHidden::default()), + value: Some(InputValue::Query { + key: "redirectUrl".to_owned(), + }), + }, + Input { + name: "submit".to_owned(), + label: None, + r#type: InputType::Submit(InputTypeSubmit::default()), + value: Some(InputValue::String { + value: format!("Sign in with {}", provider.name()), + }), + }, + ], }]) } diff --git a/packages/methods/shield-oidc/src/actions/sign_in.rs b/packages/methods/shield-oidc/src/actions/sign_in.rs index 8d087e8..592cd24 100644 --- a/packages/methods/shield-oidc/src/actions/sign_in.rs +++ b/packages/methods/shield-oidc/src/actions/sign_in.rs @@ -65,6 +65,14 @@ impl Action for OidcSignInAction { r#type: InputType::Hidden(InputTypeHidden::default()), value: Some(InputValue::Origin), }, + Input { + name: "redirectUrl".to_owned(), + label: None, + r#type: InputType::Hidden(InputTypeHidden::default()), + value: Some(InputValue::Query { + key: "redirectUrl".to_owned(), + }), + }, Input { name: "submit".to_owned(), label: None, diff --git a/packages/styles/shield-bootstrap/src/dioxus/input.rs b/packages/styles/shield-bootstrap/src/dioxus/input.rs index 1be9dca..c2043e8 100644 --- a/packages/styles/shield-bootstrap/src/dioxus/input.rs +++ b/packages/styles/shield-bootstrap/src/dioxus/input.rs @@ -27,7 +27,8 @@ pub fn FormInput(props: FormInputProps) -> Element { name: props.input.name, type: props.input.r#type.as_str(), value: props.input.value.map(|value| match value { - InputValue::Origin => todo!(), + InputValue::Origin => todo!("origin"), + InputValue::Query {key} => todo!("query parameter `{key}`"), InputValue::String { value } => value.clone(), }), placeholder: props.input.label, diff --git a/packages/styles/shield-bootstrap/src/leptos/input.rs b/packages/styles/shield-bootstrap/src/leptos/input.rs index a6f016d..c80b813 100644 --- a/packages/styles/shield-bootstrap/src/leptos/input.rs +++ b/packages/styles/shield-bootstrap/src/leptos/input.rs @@ -29,7 +29,8 @@ fn Control(input: Input) -> impl IntoView { name=format!("data[{}]", input.name) r#type=input.r#type.as_str() value=input.value.map(|value| match value { - InputValue::Origin => todo!(), + InputValue::Origin => todo!("origin"), + InputValue::Query {key} => todo!("query parameter `{key}`"), InputValue::String { value } => value.clone(), }) placeholder=input.label