Remove _random ID references and fix hosted file download ID

- Fix download button to use hosted_file_id instead of id (which resolved
  to event_file_id via _process_generic_props, hitting the wrong endpoint)
- Fix Dexie file table query in event_file_obj_tbl_wrapper to use _id
  fields (the indexed ones) instead of _id_random variants
- Remove _random fields from properties_to_save in event, event_session
- Drop _id_random fallbacks from launcher device ID resolution and
  background sync heartbeat
- Clean up dead comments and old FA anchor in post edit component
- Update TODO__Agents.md: BGH section removed, CMSC/Axonius shows added,
  download button fix marked complete

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Idem
2026-05-11 12:26:21 -04:00
parent 1ef9080cda
commit 611b1e6b51
11 changed files with 38 additions and 97 deletions

View File

@@ -9,6 +9,7 @@
"autofetch", "autofetch",
"Axonius", "Axonius",
"displayplacer", "displayplacer",
"elif",
"filelist", "filelist",
"gsettings", "gsettings",
"onsave" "onsave"

View File

@@ -3,38 +3,22 @@
> **Status:** Stable — ongoing development. > **Status:** Stable — ongoing development.
## 🔴 BGH Conference — April 21 (Must Fix Before Event) ## 🔴 CMSC Charlotte — May 27 (Presentation Management)
**Drive down:** May 25 | **Setup:** May 26 morning | **Show:** May 27+
- [x] **[Locations] Event Locations list does not auto-load** — added `+page.ts` to trigger - [ ] **[Electron/Launcher] Clean up presentation file launch scripts** — BGH show revealed
`load_ae_obj_li__event_location` on page load. Also fixed session query using stale issues with the scripts used to open/launch presentation files through the Electron Launcher.
`event_location_id_random` index (should be `event_location_id`). (2026-04-19) Audit and improve the launch/open flow (script reliability, error handling, file path resolution).
Must be tested and ready before May 26 setup day.
- [x] **[Files] Warn/error on `.ppt`/`.doc` upload** — warning rows shown per-file in upload table; ---
non-trusted users are fully blocked (`file_list_status = 'blocked_legacy'`); trusted users see
warnings but can still upload. Covers `.ppt`, `.doc` (block) and other legacy exts (warn-only).
(2026-04-19)
- [x] **[Files] Hide internal-purpose files from Launcher by default** — renamed `hide_draft` prop ## 🔴 Axonius DC — June 9 (Badge Printing)
to `show_internal_purpose_files` in `launcher_file_cont.svelte`; logic flipped so `false` (the **Setup/Registration:** June 8 | **Show:** June 9
default) hides files with `file_purpose == 'outline'`, `'draft'`, or `'admin'`. Store key renamed
from `hide_content__draft_files` (inverted, misleading) to `show_content__internal_files: false`
(show-on-opt-in, consistent with all other `show_content__*` flags). Updated across all 8 Launcher
templates that pass this prop. (2026-04-19, revised 2026-04-20)
- [x] **[Launcher] Remove duplicate session API call on session select** — `menu_session_list.svelte` - [ ] **[Badges] Epson C3500 fanfold badge layout** — Axonius is using Epson C3500 printers
was calling `load_ae_obj_id__event_session` directly AND then `goto()` triggered `+page.ts` which with fanfold (continuous) badge stock. Create/configure a fanfold badge layout compatible
also called it — two concurrent calls per session click. Removed the direct call entirely; with the C3500 format. Must be ready before the June 8 setup/registration day.
`+page.ts` is now the sole owner of session data loading. `goto()` promise assigned to
`ae_promises.slct__event_session_id` to drive the existing `{#await}` spinner. (2026-04-20)
- [ ] **[Electron/Launcher] Deploy + test Aether Native Electron app on Mac laptops** — build,
deploy, and verify on onsite Mac laptops. Additional testing of cache/launch flow still needed
before April 21.
- [x] **[Pres Mgmt] POC column shown in "Sessions at this Location"** — wired
`hide__session_poc={!pres_mgmt_loc.current.show__session_li_poc_field}` in
`ae_comp__event_location_obj_li.svelte`; also set `hide__session_location={true}` since
location is implicit in that context. (2026-04-19)
--- ---
@@ -268,28 +252,10 @@ Firefox unaffected. Production unaffected (public IPs only).
### [Files] Download button — wrong ID used in `handle_click()` (2026-04-22) ### [Files] Download button — wrong ID used in `handle_click()` (2026-04-22)
`ae_comp__hosted_files_download_button.svelte` resolves `file_id` for the download call as - [x] **Fixed (2026-05-11):** All 5 spots in `ae_comp__hosted_files_download_button.svelte` updated
`hosted_file_obj?.id || hosted_file_obj?.hosted_file_id || hosted_file_id`. When called from to use `hosted_file_obj?.hosted_file_id ?? hosted_file_id` instead of the old
Manage Files with an `event_file_obj`, `hosted_file_obj.id` = `event_file_id` (set by `hosted_file_obj?.id || ...` chain that stopped at `event_file_id`. Needs live re-test to
`_process_generic_props` via the `_random` strip logic), so the chain stops at the wrong value. confirm downloads still work correctly from Manage Files.
The download call goes to `/v3/action/hosted_file/{event_file_id}/download` instead of using the
correct `hosted_file_id`. May work if the backend accepts event_file_id at that endpoint —
needs live verification.
**Status (2026-04-22):** Tested — downloads ARE working despite the wrong ID. The backend
V3 action endpoint appears to silently accept `event_file_id` at the `hosted_file` download
path (or maps between the two). Working by accident, not by design. Needs proper fix before
it breaks — if the backend ever tightens that endpoint, all Manage Files downloads will 404.
**Fix:** In `handle_click()` and both `$effect` blocks and the `content` snippet, replace:
```ts
const file_id = hosted_file_obj?.id || hosted_file_obj?.hosted_file_id || hosted_file_id;
```
with:
```ts
const file_id = hosted_file_obj?.hosted_file_id ?? hosted_file_id;
```
The direct-download `<a>` path is unaffected (already uses `event_file_id` → correct endpoint).
### [Files] `db_events.file.clear()` on upload clears all cached files (2026-04-22) ### [Files] `db_events.file.clear()` on upload clears all cached files (2026-04-22)
In `ae_comp__event_files_upload.svelte` line 114, `db_events.file.clear()` wipes the entire In `ae_comp__event_files_upload.svelte` line 114, `db_events.file.clear()` wipes the entire

View File

@@ -128,10 +128,7 @@ $effect(() => {
let ae_promises: key_val = $state({}); let ae_promises: key_val = $state({});
$effect(() => { $effect(() => {
const file_id = const file_id = hosted_file_obj?.hosted_file_id ?? hosted_file_id;
hosted_file_obj?.id ||
hosted_file_obj?.hosted_file_id ||
hosted_file_id;
if (file_id && $ae_sess?.api_download_kv[file_id]?.percent_completed) { if (file_id && $ae_sess?.api_download_kv[file_id]?.percent_completed) {
download_percent = $ae_sess.api_download_kv[file_id].percent_completed; download_percent = $ae_sess.api_download_kv[file_id].percent_completed;
} }
@@ -139,10 +136,7 @@ $effect(() => {
// Reactive timer to alternate views during active download // Reactive timer to alternate views during active download
$effect(() => { $effect(() => {
const file_id = const file_id = hosted_file_obj?.hosted_file_id ?? hosted_file_id;
hosted_file_obj?.id ||
hosted_file_obj?.hosted_file_id ||
hosted_file_id;
const is_actively_downloading = const is_actively_downloading =
ae_promises[file_id] && download_complete === undefined; ae_promises[file_id] && download_complete === undefined;
@@ -193,10 +187,7 @@ let direct_download_url = $derived.by(() => {
}); });
async function handle_click() { async function handle_click() {
const file_id = const file_id = hosted_file_obj?.hosted_file_id ?? hosted_file_id;
hosted_file_obj?.id ||
hosted_file_obj?.hosted_file_id ||
hosted_file_id;
download_complete = undefined; download_complete = undefined;
download_status_msg = 'Downloading...'; download_status_msg = 'Downloading...';
@@ -238,10 +229,7 @@ async function handle_click() {
</script> </script>
{#snippet content()} {#snippet content()}
{@const file_id = {@const file_id = hosted_file_obj?.hosted_file_id ?? hosted_file_id}
hosted_file_obj?.id ||
hosted_file_obj?.hosted_file_id ||
hosted_file_id}
{#await ae_promises[file_id]} {#await ae_promises[file_id]}
<div class="flex min-h-[1.5rem] w-full items-center"> <div class="flex min-h-[1.5rem] w-full items-center">
<div <div
@@ -316,8 +304,7 @@ async function handle_click() {
{/snippet} {/snippet}
{#if hosted_file_id && hosted_file_obj} {#if hosted_file_id && hosted_file_obj}
{@const file_id = {@const file_id = hosted_file_obj.hosted_file_id ?? hosted_file_id}
hosted_file_obj.id || hosted_file_obj.hosted_file_id || hosted_file_id}
{#if show_direct_download} {#if show_direct_download}
<a <a

View File

@@ -787,7 +787,7 @@ export const properties_to_save = [
'event_id', 'event_id',
'code', 'code',
'account_id', 'account_id',
'account_id_random', // 'account_id_random',
'conference', 'conference',
'type', 'type',
'name', 'name',

View File

@@ -359,7 +359,7 @@ export async function create_event_file_obj_from_hosted_file_async({
}); });
if (return_obj) return result; if (return_obj) return result;
return result?.event_file_id || result?.id || result?.event_file_id_random; return result?.event_file_id || result?.id;
} }
export async function delete_ae_obj_id__event_file({ export async function delete_ae_obj_id__event_file({

View File

@@ -836,12 +836,12 @@ export async function email_sign_in__event_session({
export const properties_to_save = [ export const properties_to_save = [
'id', 'id',
'event_session_id', 'event_session_id',
'event_session_id_random', // 'event_session_id_random',
'external_id', 'external_id',
'code', 'code',
'for_type', 'for_type',
'for_id', 'for_id',
'for_id_random', // 'for_id_random',
'type_code', 'type_code',
'event_id', 'event_id',
'event_location_id', 'event_location_id',

View File

@@ -197,9 +197,7 @@ $effect(() => {
untrack(() => { untrack(() => {
$events_slct.event_device_id = $events_slct.event_device_id =
native_dev.event_device_id || native_dev.event_device_id ||
native_dev.id || native_dev.id;
native_dev.event_device_id_random ||
native_dev.id_random;
}); });
} }
}); });

View File

@@ -370,9 +370,7 @@ async function run_device_heartbeat() {
// String-Only ID Vision: Prioritize semantic string IDs, then generic, then legacy random strings // String-Only ID Vision: Prioritize semantic string IDs, then generic, then legacy random strings
const device_id = const device_id =
dev?.event_device_id || dev?.event_device_id ||
dev?.id || dev?.id;
dev?.event_device_id_random ||
dev?.id_random;
if (!device_id) { if (!device_id) {
// Only log warning if we are actually supposed to be in native mode // Only log warning if we are actually supposed to be in native mode

View File

@@ -77,10 +77,10 @@ let lq__event_obj = $derived(
); );
// It is important that these not be set to a value! It messes with the Dexie LiveQuery. // It is important that these not be set to a value! It messes with the Dexie LiveQuery.
// let event_file_id_random_li: Array<string> = $state(); // let event_file_id_li: Array<string> = $state();
// let event_session_id_random_li: Array<string> = $state(); // let event_session_id_li: Array<string> = $state();
// let event_presentation_id_random_li: Array<string>; // let event_presentation_id_li: Array<string>;
// let event_presenter_id_random_li: Array<string> = $state(); // let event_presenter_id_li: Array<string> = $state();
// let load_obj_li_results: Promise<any>|key_val; // let load_obj_li_results: Promise<any>|key_val;
// let search_submit_results: Promise<any>|key_val; // let search_submit_results: Promise<any>|key_val;
@@ -142,9 +142,11 @@ $effect(() => {
</span> </span>
<!-- Reports for: --> <!-- Reports for: -->
{#if $lq__event_obj?.cfg_json?.short_name} {#if $lq__event_obj?.cfg_json?.short_name}
<!-- eslint-disable-next-line svelte/no-at-html-tags -->
{@html $lq__event_obj?.cfg_json.short_name ?? {@html $lq__event_obj?.cfg_json.short_name ??
ae_snip.html__not_set} ae_snip.html__not_set}
{:else} {:else}
<!-- eslint-disable-next-line svelte/no-at-html-tags -->
{@html $lq__event_obj?.name ?? ae_snip.html__not_set} {@html $lq__event_obj?.name ?? ae_snip.html__not_set}
{/if} {/if}
</h2> </h2>

View File

@@ -18,7 +18,7 @@ interface Props {
let { let {
container_class_li = [], container_class_li = [],
// display_mode = 'default', // display_mode = 'default',
// event_file_id_random_li = $bindable(), // event_file_id_li = $bindable(),
event_file_obj_li = $bindable(), event_file_obj_li = $bindable(),
link_to_type, link_to_type,
link_to_id, link_to_id,
@@ -55,9 +55,9 @@ $effect(() => {
// let ae_tmp: key_val = {}; // let ae_tmp: key_val = {};
// let ae_triggers: key_val = {}; // let ae_triggers: key_val = {};
let event_file_id_random_li: Array<string> = $state([]); // let event_file_id_li: Array<string> = $state([]);
let dq__where_type_id_val = $derived(`${link_to_type}_id_random`); let dq__where_type_id_val = $derived(`${link_to_type}_id`);
let dq__where_eq_id_val = $derived(link_to_id ?? ''); let dq__where_eq_id_val = $derived(link_to_id ?? '');
// *** Functions and Logic // *** Functions and Logic
@@ -122,7 +122,7 @@ let lq__event_file_obj_li = $derived(
</script> </script>
{#if event_file_obj_li && event_file_obj_li?.length} {#if event_file_obj_li && event_file_obj_li?.length}
<!-- {#if event_file_id_random_li && event_file_id_random_li?.length} --> <!-- {#if event_file_id_li && event_file_id_li?.length} -->
<Comp_event_file_obj_tbl <Comp_event_file_obj_tbl
{container_class_li} {container_class_li}
{lq__event_file_obj_li} {lq__event_file_obj_li}

View File

@@ -595,15 +595,6 @@ $effect(() => {
{#each $idaa_slct.post_obj.linked_li_json as linked_obj, index (linked_obj.hosted_file_id ?? index)} {#each $idaa_slct.post_obj.linked_li_json as linked_obj, index (linked_obj.hosted_file_id ?? index)}
<span <span
class="flex flex-col items-center gap-1 rounded-lg border bg-white/50 p-1"> class="flex flex-col items-center gap-1 rounded-lg border bg-white/50 p-1">
<!-- <a
href={linked_obj.url}
target="_blank"
class="badge badge-info variant-filled-info"
>
<span class="fas fa-paperclip m-1"></span>
{linked_obj.filename}
({linked_obj.hosted_file_id})
</a> -->
{#if $ae_loc.authenticated_access} {#if $ae_loc.authenticated_access}
{@const file_id = {@const file_id =
@@ -650,8 +641,6 @@ $effect(() => {
return false; return false;
} }
// ae_promises[linked_obj.event_file_id] = handle_delete__event_file({event_file_id: linked_obj.event_file_id});
// First - Attempt to delete the hosted file // First - Attempt to delete the hosted file
ae_promises.delete__linked_obj = ae_promises.delete__linked_obj =
await core_func await core_func