feat: preserve pagination offset after review delete
This commit is contained in:
@@ -30,6 +30,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% if ctx.is_current_user(entry.review().user_id().value()) %}
|
{% if ctx.is_current_user(entry.review().user_id().value()) %}
|
||||||
<form method="post" action="/reviews/{{ entry.review().id().value() }}/delete" class="delete-form">
|
<form method="post" action="/reviews/{{ entry.review().id().value() }}/delete" class="delete-form">
|
||||||
|
<input type="hidden" name="redirect_after" value="/?offset={{ current_offset }}">
|
||||||
<button type="submit">Delete</button>
|
<button type="submit">Delete</button>
|
||||||
</form>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -141,6 +141,7 @@
|
|||||||
<div class="watched-at">{{ entry.review().watched_at().format("%Y-%m-%d") }}</div>
|
<div class="watched-at">{{ entry.review().watched_at().format("%Y-%m-%d") }}</div>
|
||||||
{% if ctx.is_current_user(entry.review().user_id().value()) %}
|
{% if ctx.is_current_user(entry.review().user_id().value()) %}
|
||||||
<form method="post" action="/reviews/{{ entry.review().id().value() }}/delete" class="delete-form">
|
<form method="post" action="/reviews/{{ entry.review().id().value() }}/delete" class="delete-form">
|
||||||
|
<input type="hidden" name="redirect_after" value="?view={{ view }}&offset={{ current_offset }}">
|
||||||
<button type="submit">Delete</button>
|
<button type="submit">Delete</button>
|
||||||
</form>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -59,6 +59,12 @@ pub struct ErrorQuery {
|
|||||||
pub error: Option<String>,
|
pub error: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Default)]
|
||||||
|
pub struct DeleteRedirectForm {
|
||||||
|
#[serde(default)]
|
||||||
|
pub redirect_after: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
pub struct LogReviewRequest {
|
pub struct LogReviewRequest {
|
||||||
pub external_metadata_id: Option<String>,
|
pub external_metadata_id: Option<String>,
|
||||||
|
|||||||
@@ -219,13 +219,20 @@ pub mod html {
|
|||||||
State(state): State<AppState>,
|
State(state): State<AppState>,
|
||||||
RequiredCookieUser(user_id): RequiredCookieUser,
|
RequiredCookieUser(user_id): RequiredCookieUser,
|
||||||
Path(review_id): Path<Uuid>,
|
Path(review_id): Path<Uuid>,
|
||||||
|
Form(form): Form<crate::dtos::DeleteRedirectForm>,
|
||||||
) -> impl IntoResponse {
|
) -> impl IntoResponse {
|
||||||
let cmd = DeleteReviewCommand {
|
let cmd = DeleteReviewCommand {
|
||||||
review_id,
|
review_id,
|
||||||
requesting_user_id: user_id.value(),
|
requesting_user_id: user_id.value(),
|
||||||
};
|
};
|
||||||
match delete_review::execute(&state.app_ctx, cmd).await {
|
match delete_review::execute(&state.app_ctx, cmd).await {
|
||||||
Ok(()) => Redirect::to("/").into_response(),
|
Ok(()) => {
|
||||||
|
let redirect_url = form
|
||||||
|
.redirect_after
|
||||||
|
.filter(|url| url.starts_with('/') || url.starts_with('?'))
|
||||||
|
.unwrap_or_else(|| "/".to_string());
|
||||||
|
Redirect::to(&redirect_url).into_response()
|
||||||
|
}
|
||||||
Err(DomainError::NotFound(_)) => StatusCode::NOT_FOUND.into_response(),
|
Err(DomainError::NotFound(_)) => StatusCode::NOT_FOUND.into_response(),
|
||||||
Err(DomainError::Unauthorized(_)) => StatusCode::FORBIDDEN.into_response(),
|
Err(DomainError::Unauthorized(_)) => StatusCode::FORBIDDEN.into_response(),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user