SQLpage
SQLpage copied to clipboard
Table Component - Sorting Does Not Work When Column is Markdown
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;