SQLpage icon indicating copy to clipboard operation
SQLpage copied to clipboard

Table Component - Sorting Does Not Work When Column is Markdown

Open amrutadotorg opened this issue 5 months ago • 0 comments

Hi, I have a table where the title is set using markdown and contains a link. In this case, sorting is based on the link rather than the title. See example here:

https://learnsahajayoga.org/all_talks_lang?lang=en thank you

SELECT 'dynamic' AS component,
	sqlpage.run_sql('shell.sql')
	AS properties;


------------------ TITLE ---------

-- Extract data from JSON and get the language value
WITH json_data AS (
    SELECT 
        key,
        value
    FROM 
        jsonb_each_text(sqlpage.variables('post')::jsonb)
    UNION ALL
    SELECT 
        key,
        value
    FROM 
        jsonb_each_text(sqlpage.variables('get')::jsonb)
),
lang_value AS (
    SELECT 
        COALESCE(
            MAX(CASE WHEN key = 'lang' THEN value END),
            MAX(CASE WHEN key = 'language' THEN value END)
        ) AS lang
    FROM 
        json_data
),
-- Get the English name of the language
language_name AS (
    SELECT
        english_name
    FROM
        languages
    WHERE
        code = (SELECT lang FROM lang_value)
),
-- Count the number of public talks in the selected language
talk_count AS (
    SELECT
        COUNT(post.id) AS count
    FROM
        post
    JOIN
        translations ON translations.element_id = post.id
        AND translations.element_type = 'post_post'
    WHERE
        translations.language_code = (SELECT lang FROM lang_value)
)
-- Construct the final output
SELECT 'title' AS component,
       3 AS level,
       'All Public Talks by Shri Mataji in ' || (SELECT english_name FROM language_name) || 
       ' (' || (SELECT count FROM talk_count) || ')' AS contents;



-- TABLE 

WITH json_data AS (
    SELECT 
        key,
        value
    FROM 
        jsonb_each_text(sqlpage.variables('post')::jsonb)
    UNION ALL
    SELECT 
        key,
        value
    FROM 
        jsonb_each_text(sqlpage.variables('get')::jsonb)
),
lang_value AS (
    SELECT 
        COALESCE(
            MAX(CASE WHEN key = 'lang' THEN value END),
            MAX(CASE WHEN key = 'language' THEN value END)
        ) AS lang
    FROM 
        json_data
),
language_name AS (
    SELECT
        english_name
    FROM
        languages
    WHERE
        code = (SELECT lang FROM lang_value)
),
talk_count AS (
    SELECT
        COUNT(post.id) AS count
    FROM
        post
    JOIN
        translations ON translations.element_id = post.id
        AND translations.element_type = 'post_post'
    WHERE
        translations.language_code = (SELECT lang FROM lang_value)
)

-- Main query for the TABLE description
SELECT 
    'table' AS component,
    'fit-content-table' AS class,
    TRUE AS hover,
    'title' AS markdown,
    TRUE AS search,
    TRUE AS sort,
    TRUE AS striped_rows,
    'All Public Talks by Shri Mataji in ' || (SELECT english_name FROM language_name) || ' (' || (SELECT count FROM talk_count) || ')' AS description,
    TRUE AS small;


-- MAIN query for the list of talks
WITH json_data AS (
    SELECT 
        value AS lang
    FROM 
        jsonb_each_text(sqlpage.variables('post')::jsonb)
    UNION ALL
    SELECT 
        value AS lang
    FROM 
        jsonb_each_text(sqlpage.variables('get')::jsonb)
),
selected_lang AS (
    SELECT 
        lang
    FROM 
        json_data
    LIMIT 1
)
SELECT 
    post.created_at::date as date,
    CASE
        WHEN (post_meta.meta_value->>'country')::text IS NULL OR (post_meta.meta_value->>'country')::text = '' THEN 
            '[' || post.title || '](' || 'post?id=' || post.id || ')'
        ELSE 
            '[' || post.title || ' | ' || COALESCE(NULLIF((post_meta.meta_value->>'city')::text, ''), '') || ' (' || (post_meta.meta_value->>'country')::text || ')](' || 'post?id=' || post.id || ')'
    END as title,
    COALESCE((
        SELECT string_agg(lang, ', ') 
        FROM (
            SELECT jsonb_array_elements_text(meta_value->'spoken_languages') as lang
            FROM post_meta pm
            WHERE pm.post_id = post.id
              AND pm.meta_key = 'meta'
              AND jsonb_typeof(pm.meta_value->'spoken_languages') = 'array'
        ) as "spoken languages"
    ), 'Not available') as "spoken languages",
    jsonb_extract_path_text(post_meta.meta_value::jsonb, 'category') AS category
FROM 
    post
JOIN 
    translations ON translations.element_id = post.id
    AND translations.element_type = 'post_post'
JOIN 
    languages ON languages.code = translations.language_code
LEFT JOIN 
    post_meta ON post_meta.post_id = post.id
    AND post_meta.meta_key = 'meta'
WHERE 
    languages.code = (SELECT lang FROM selected_lang)
ORDER BY 
    COALESCE((
        SELECT string_agg(lang, ', ') 
        FROM (
            SELECT jsonb_array_elements_text(meta_value->'spoken_languages') as lang
            FROM post_meta pm
            WHERE pm.post_id = post.id
              AND pm.meta_key = 'meta'
              AND jsonb_typeof(pm.meta_value->'spoken_languages') = 'array'
        ) as "spoken languages"
    ), 'Not available') ASC,
    post.created_at ASC;

amrutadotorg avatar Sep 08 '24 15:09 amrutadotorg