SQLpage icon indicating copy to clipboard operation
SQLpage copied to clipboard

Redirect Handling in a Dynamic Form Component

Open amrutadotorg opened this issue 9 months ago • 4 comments

https://github.com/user-attachments/assets/454b749d-84b2-4489-b5b3-f6686a479e21

Hi, I would like to know if my redirect implementation in the form component with dynamic options is correct. In the attached video, you can see that when I abort the form submission, I get redirected to handle_redirect.sql. Is this expected behavior, or could this be a bug?

thank you

see live https://coolbreeze.org/

select 'form' as component,
    TRUE as auto_submit;
    'handle_redirect.sql' as action;  -- This is where the form submits

select 
    'selected_country' as name,
    'select' as type,
    (
        SELECT COALESCE(
            (SELECT translation_value FROM language 
             WHERE language_code = $lang 
             AND translation_key = 'country.form_label'),
            (SELECT translation_value FROM language 
             WHERE language_code = 'en' 
             AND translation_key = 'country.form_label')
        )
    ) as label,
    'options_source.sql' as options_source,
    TRUE as searchable;


-- handle_redirect.sql
select 'redirect' as component,
    -- Use the selected URL from the form submission
    COALESCE(:selected_country, 'index.sql') as link;

-- options_source.sql
select 'json' as component;
set sahaj_links = sqlpage.fetch('https://amrutasahajmaterials.amruta.org/map_json/sahaj_links.json');
select 
    json_extract(value, '$.url') as value,
    CASE
        WHEN json_extract(value, '$.native_country_name') = json_extract(value, '$.country_name')
        THEN json_extract(value, '$.country_name') || ' ⤿ ' || json_extract(value, '$.clean_url')
        ELSE json_extract(value, '$.native_country_name') || ' (' || json_extract(value, '$.country_name') || ')' || ' ⤿ ' || json_extract(value, '$.clean_url')
    END as label
from json_each($sahaj_links->'links')
where lower(json_extract(value, '$.country_name')) like '%' || lower($search) || '%'
   or lower(json_extract(value, '$.native_country_name')) like '%' || lower($search) || '%';

amrutadotorg avatar Feb 27 '25 10:02 amrutadotorg

Hello ! I think your implementation is fine. When you manually abort the loading just at the right time, then you end up on the intermediate handle_redirect page, but I don't think this is an issue for your users, is it ?

lovasoa avatar Feb 27 '25 10:02 lovasoa

It’s hard to say how many users will not click the link. The timing does not matter; the redirection to handle_redirect.sql happens whenever a user does not select an option from the dropdown menu. I think in such a case, COALESCE(:selected_country, 'index.sql') should be triggered to index,sql, but it isn’t.

amrutadotorg avatar Feb 27 '25 11:02 amrutadotorg

Oh, I see, sorry ! Indeed, the change is triggered even when the value did not actually change.

lovasoa avatar Feb 27 '25 12:02 lovasoa

In the meantime, you can redirect back to the home page from handle_redirect.sql when no value was submitted.

select 'redirect' as component, '/' as link where COALESCE(:selected_country, '') = '';

lovasoa avatar Feb 27 '25 13:02 lovasoa