From f34e24aa02040741a0d4fe67c701ffa6ca8ebab1 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Mon, 16 Feb 2026 15:40:00 -0500 Subject: [PATCH] Standardized robust chronological sorting across modules. Updated '_process_generic_props' in multiple libraries to ensure 'updated' timestamp always falls back to 'created_on' or epoch start, preventing null values from breaking newest-first ordering in IndexedDB. Aligned Recovery Meetings and Archives list views to use these pre-computed sort keys for consistent UI behavior even when 'updated_on' is null. --- .../ae_events/ae_events__event_presenter.ts | 2 +- src/lib/ae_journals/ae_journals__journal.ts | 2 +- .../ae_journals/ae_journals__journal_entry.ts | 2 +- src/lib/ae_posts/ae_posts__post.ts | 2 +- src/lib/ae_posts/ae_posts__post_comment.ts | 2 +- .../ae_idaa_comp__archive_obj_li.svelte | 8 ++++--- .../(idaa)/recovery_meetings/+page.svelte | 21 ++++++++++--------- .../ae_idaa_comp__event_obj_li_wrapper.svelte | 20 ++++++++++-------- 8 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/lib/ae_events/ae_events__event_presenter.ts b/src/lib/ae_events/ae_events__event_presenter.ts index 6f91b1de..41bf6432 100644 --- a/src/lib/ae_events/ae_events__event_presenter.ts +++ b/src/lib/ae_events/ae_events__event_presenter.ts @@ -388,7 +388,7 @@ async function _process_generic_props>({ obj_li, o const group = processed_obj.group ?? '0'; const priority = processed_obj.priority ? 1 : 0; const sort = processed_obj.sort ?? '0'; - const updated = processed_obj.updated_on ?? processed_obj.created_on; + const updated = processed_obj.updated_on ?? processed_obj.created_on ?? new Date(0).toISOString(); const name = processed_obj.name ?? ''; (processed_obj as any).tmp_sort_1 = `${group}_${priority}_${sort}_${updated}`; (processed_obj as any).tmp_sort_2 = `${group}_${priority}_${sort}_${name}_${updated}`; diff --git a/src/lib/ae_journals/ae_journals__journal.ts b/src/lib/ae_journals/ae_journals__journal.ts index 457ce590..4eb0971f 100644 --- a/src/lib/ae_journals/ae_journals__journal.ts +++ b/src/lib/ae_journals/ae_journals__journal.ts @@ -814,7 +814,7 @@ async function _process_generic_props>({ const group = processed_obj.group ?? '0'; const priority = processed_obj.priority ? 1 : 0; const sort = processed_obj.sort ?? '0'; - const updated = processed_obj.updated_on ?? processed_obj.created_on; + const updated = processed_obj.updated_on ?? processed_obj.created_on ?? new Date(0).toISOString(); const name = processed_obj.name ?? ''; (processed_obj as any).tmp_sort_1 = diff --git a/src/lib/ae_journals/ae_journals__journal_entry.ts b/src/lib/ae_journals/ae_journals__journal_entry.ts index d529307e..49b31f5b 100644 --- a/src/lib/ae_journals/ae_journals__journal_entry.ts +++ b/src/lib/ae_journals/ae_journals__journal_entry.ts @@ -943,7 +943,7 @@ async function _process_generic_props>({ const group = processed_obj.group ?? '0'; const priority = processed_obj.priority ? 1 : 0; const sort = processed_obj.sort ?? '0'; - const updated = processed_obj.updated_on ?? processed_obj.created_on; + const updated = processed_obj.updated_on ?? processed_obj.created_on ?? new Date(0).toISOString(); const name = processed_obj.name ?? ''; (processed_obj as any).tmp_sort_1 = diff --git a/src/lib/ae_posts/ae_posts__post.ts b/src/lib/ae_posts/ae_posts__post.ts index 13f91a93..5e7cb2dd 100644 --- a/src/lib/ae_posts/ae_posts__post.ts +++ b/src/lib/ae_posts/ae_posts__post.ts @@ -512,7 +512,7 @@ async function _process_generic_props>({ const group = processed_obj.group ?? '0'; const priority = processed_obj.priority ? 1 : 0; const sort = processed_obj.sort ?? '0'; - const updated = processed_obj.updated_on ?? processed_obj.created_on; + const updated = processed_obj.updated_on ?? processed_obj.created_on ?? new Date(0).toISOString(); const name = processed_obj.username ?? processed_obj.name ?? ''; (processed_obj as any).tmp_sort_1 = `${group}_${priority}_${sort}_${updated}`; diff --git a/src/lib/ae_posts/ae_posts__post_comment.ts b/src/lib/ae_posts/ae_posts__post_comment.ts index b6f70e23..445f0758 100644 --- a/src/lib/ae_posts/ae_posts__post_comment.ts +++ b/src/lib/ae_posts/ae_posts__post_comment.ts @@ -336,7 +336,7 @@ async function _process_generic_props>({ const group = processed_obj.group ?? '0'; const priority = processed_obj.priority ? 1 : 0; const sort = processed_obj.sort ?? '0'; - const updated = processed_obj.updated_on ?? processed_obj.created_on; + const updated = processed_obj.updated_on ?? processed_obj.created_on ?? new Date(0).toISOString(); const name = processed_obj.name ?? ''; (processed_obj as any).tmp_sort_1 = `${group}_${priority}_${sort}_${updated}`; diff --git a/src/routes/idaa/(idaa)/archives/ae_idaa_comp__archive_obj_li.svelte b/src/routes/idaa/(idaa)/archives/ae_idaa_comp__archive_obj_li.svelte index e1dc53bb..c0e48d4b 100644 --- a/src/routes/idaa/(idaa)/archives/ae_idaa_comp__archive_obj_li.svelte +++ b/src/routes/idaa/(idaa)/archives/ae_idaa_comp__archive_obj_li.svelte @@ -43,9 +43,11 @@ const sortB = b.sort ?? 0; if (sortA !== sortB) return sortB - sortA; } else if (qry_sort_mode === 'updated_desc') { - const dateA = new Date(a.updated_on || a.created_on).getTime(); - const dateB = new Date(b.updated_on || b.created_on).getTime(); - return dateB - dateA; + // SORT: Most recently updated or created at the top (Refactored 2026-02-16) + // ROBUSTNESS: Ensure fallback to created_on then to 0 to prevent NaN comparison issues + const date_a = new Date(a.updated_on ?? a.created_on ?? 0).getTime() || 0; + const date_b = new Date(b.updated_on ?? b.created_on ?? 0).getTime() || 0; + return date_b - date_a; } // Default fallback: Name diff --git a/src/routes/idaa/(idaa)/recovery_meetings/+page.svelte b/src/routes/idaa/(idaa)/recovery_meetings/+page.svelte index 57c3b1fd..bf339014 100644 --- a/src/routes/idaa/(idaa)/recovery_meetings/+page.svelte +++ b/src/routes/idaa/(idaa)/recovery_meetings/+page.svelte @@ -143,21 +143,15 @@ }) .toArray(); - // Sort local results matching UI selection + // Sort local results matching UI selection (Refactored 2026-02-16) if ($idaa_loc.recovery_meetings.qry__order_by === 'name') { local_results.sort((a, b) => (a.name ?? '').localeCompare(b.name ?? '') ); } else { - local_results.sort((a, b) => { - const dateA = a.updated_on - ? new Date(a.updated_on).getTime() - : 0; - const dateB = b.updated_on - ? new Date(b.updated_on).getTime() - : 0; - return dateB - dateA; - }); + // Robust Chronological Sort using pre-computed tmp_sort_1 + // Handles Priority, Manual Sort, and the updated_on/created_on fallback + local_results.sort((a, b) => (b.tmp_sort_1 ?? '').localeCompare(a.tmp_sort_1 ?? '')); } local_ids = local_results @@ -226,6 +220,13 @@ return true; }); + // RE-SORT: Ensure perfect chronological order even if API puts NULLs last (Refactored 2026-02-16) + if ($idaa_loc.recovery_meetings.qry__order_by === 'name') { + api_results.sort((a, b) => (a.name ?? '').localeCompare(b.name ?? '')); + } else { + api_results.sort((a, b) => (b.tmp_sort_1 ?? '').localeCompare(a.tmp_sort_1 ?? '')); + } + const api_ids = api_results .map((e: any) => String(e.id)) .filter(Boolean); diff --git a/src/routes/idaa/(idaa)/recovery_meetings/ae_idaa_comp__event_obj_li_wrapper.svelte b/src/routes/idaa/(idaa)/recovery_meetings/ae_idaa_comp__event_obj_li_wrapper.svelte index aab13044..8bd505d6 100644 --- a/src/routes/idaa/(idaa)/recovery_meetings/ae_idaa_comp__event_obj_li_wrapper.svelte +++ b/src/routes/idaa/(idaa)/recovery_meetings/ae_idaa_comp__event_obj_li_wrapper.svelte @@ -78,17 +78,19 @@ .where(dq__where_type_id_val) .equals(link_to_id); - if (order_by == 'name') { - return await base_query - .and((ev) => !ev.hide && !!ev.enable) - .limit(limit > 0 ? limit : 500) - .sortBy('name'); + const results = await base_query + .and((ev) => !ev.hide && !!ev.enable) + .limit(limit > 0 ? limit : 500) + .toArray(); + + if (order_by === 'name') { + results.sort((a, b) => (a.name ?? '').localeCompare(b.name ?? '')); } else { - return await base_query - .and((ev) => !ev.hide && !!ev.enable) - .limit(limit > 0 ? limit : 500) - .sortBy('updated_on'); + // Robust Chronological Sort using pre-computed tmp_sort_1 (Refactored 2026-02-16) + // This handles Group > Priority > Manual Sort > Date (with updated_on fallback) + results.sort((a, b) => (b.tmp_sort_1 ?? '').localeCompare(a.tmp_sort_1 ?? '')); } + return results; } return null; });