Restore Event Session search stability and advance platform-wide string ID standardization
- Restored Event Session search by standardizing on 'event_id' for Dexie queries and implementing dual-layer filtering (local + API guard) to prevent broad results from clobbering filtered views. - Advanced String-Only ID Standardization (Phase 2) by updating generic object processors across all event library modules to support both base IDs and legacy '_random' variants. - Refactored Event Presenter and Presentation components to support standardized '_id_li' props while maintaining backward compatibility. - Standardized common helper identifiers to snake_case (e.g., 'prevent_default') in the Events module. - Verified Staff and Poster email notification logic in the Bulletin Board module. - Updated .gitignore and cleaned up test artifacts.
This commit is contained in:
@@ -91,7 +91,7 @@
|
||||
if (event_id && !$events_loc.pres_mgmt.fulltext_search_qry_str && !$events_loc.pres_mgmt.location_name_qry_str) {
|
||||
if (log_lvl) console.log(`Session Page LQ: Fallback search for event: ${event_id}`);
|
||||
return await db_events.session
|
||||
.where('event_id_random')
|
||||
.where('event_id')
|
||||
.equals(event_id)
|
||||
.limit(50)
|
||||
.sortBy('name');
|
||||
@@ -124,9 +124,7 @@
|
||||
const params = search_params;
|
||||
if (search_debounce_timer) clearTimeout(search_debounce_timer);
|
||||
search_debounce_timer = setTimeout(() => {
|
||||
untrack(() => {
|
||||
handle_search_refresh(params);
|
||||
});
|
||||
handle_search_refresh(params);
|
||||
}, 300);
|
||||
return () => {
|
||||
if (search_debounce_timer) clearTimeout(search_debounce_timer);
|
||||
@@ -157,7 +155,7 @@
|
||||
try {
|
||||
if (event_id) {
|
||||
let local_results = await db_events.session
|
||||
.where('event_id_random')
|
||||
.where('event_id')
|
||||
.equals(event_id)
|
||||
.filter(session => {
|
||||
if (location_name && session.event_location_name !== location_name) return false;
|
||||
@@ -180,7 +178,7 @@
|
||||
.toArray();
|
||||
|
||||
local_results.sort((a, b) => (a.name ?? '').localeCompare(b.name ?? ''));
|
||||
const local_ids = local_results.map(s => s.id || s.event_session_id_random).filter(Boolean);
|
||||
const local_ids = local_results.map(s => s.id || s.event_session_id).filter(Boolean);
|
||||
|
||||
if (current_search_id === last_search_id) {
|
||||
if (log_lvl) console.log(`[Session Search #${current_search_id}] Fast Path found ${local_ids.length} items locally.`);
|
||||
@@ -215,8 +213,26 @@
|
||||
});
|
||||
|
||||
if (current_search_id === last_search_id) {
|
||||
const api_results = results || [];
|
||||
const api_ids = api_results.map((s: any) => s.id || s.event_session_id_random).filter(Boolean);
|
||||
let api_results = results || [];
|
||||
|
||||
// Client-side Filter Guard: Ensure API results match local criteria (Backup filter)
|
||||
api_results = api_results.filter(session => {
|
||||
if (location_name && session.event_location_name !== location_name) return false;
|
||||
if (qry_str) {
|
||||
const name = (session.name ?? '').toLowerCase();
|
||||
const code = (session.code ?? '').toLowerCase();
|
||||
const description = (session.description ?? '').toLowerCase();
|
||||
const qry_string = (session.default_qry_str ?? '').toLowerCase();
|
||||
const match = name.includes(qry_str) ||
|
||||
code.includes(qry_str) ||
|
||||
description.includes(qry_str) ||
|
||||
qry_string.includes(qry_str);
|
||||
if (!match) return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
const api_ids = api_results.map((s: any) => s.id || s.event_session_id).filter(Boolean);
|
||||
|
||||
untrack(() => {
|
||||
$events_slct.event_session_obj_li = api_results;
|
||||
@@ -251,7 +267,7 @@
|
||||
$events_loc.pres_mgmt.search_version++;
|
||||
}
|
||||
|
||||
function preventDefault<T extends Event>(fn: (event: T) => void) {
|
||||
function prevent_default<T extends Event>(fn: (event: T) => void) {
|
||||
return function (event: T) {
|
||||
event.preventDefault();
|
||||
fn(event);
|
||||
@@ -325,7 +341,7 @@
|
||||
{#if !$events_loc.pres_mgmt.show_content__event_view || $events_loc.pres_mgmt.show_content__event_view == 'default'}
|
||||
<div class="ae_container_actions">
|
||||
<form
|
||||
onsubmit={preventDefault(() => handle_search_trigger())}
|
||||
onsubmit={prevent_default(() => handle_search_trigger())}
|
||||
autocomplete="off"
|
||||
class="form grow flex flex-row flex-wrap gap-1 justify-center items-center w-full"
|
||||
>
|
||||
@@ -487,9 +503,9 @@
|
||||
<div class="overflow-x-auto w-max max-w-full">
|
||||
<Element_manage_event_file_li_wrap
|
||||
link_to_type={'event'}
|
||||
link_to_id={$lq__event_obj?.event_id_random}
|
||||
allow_basic={$events_loc.auth__kv.session[$lq__event_obj?.event_id_random]}
|
||||
allow_moderator={$events_loc.auth__kv.session[$lq__event_obj?.event_id_random]}
|
||||
link_to_id={$lq__event_obj?.event_id}
|
||||
allow_basic={$events_loc.auth__kv.session[$lq__event_obj?.event_id]}
|
||||
allow_moderator={$events_loc.auth__kv.session[$lq__event_obj?.event_id]}
|
||||
container_class_li={''}
|
||||
/>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user