import Dexie, { type Table } from 'dexie'; import type { key_val } from '../ae_stores'; // li = list // kv = key value list // Updated 2024-10-16 export interface Event { id: string; // id_random: string; event_id: string; event_id_random: string; code: string; account_id: string; account_id_random: string; conference: boolean; type: string; name: string; summary?: null|string; description?: null|string; start_datetime?: Date; end_datetime?: Date; timezone?: null|string; location_address_json?: null|string; location_text?: null|string; attend_json?: null|string; attend_text?: null|string; status?: null|string; // draft, active, inactive, archived, unknown; currently only used with IDAA // review?: null|boolean; // approve?: null|boolean; // ready?: null|boolean; // ready_on?: null|Date; // archive?: null|boolean; // archive_on?: null|Date; mod_abstracts_json?: null|key_val; mod_badges_json?: null|key_val; mod_exhibits_json?: null|key_val; mod_meetings_json?: null|key_val; mod_pres_mgmt_json?: null|key_val; cfg_json?: null|key_val; enable: null|boolean; hide?: null|boolean; priority?: null|boolean sort?: null|number; group?: null|string; notes?: null|string; created_on: Date; updated_on?: null|Date; // Generated fields for sorting locally only tmp_sort_1?: null|string; tmp_sort_2?: null|string; // IDAA Recovery Meetings: // Currently only really used for IDAA contact_li_json?: null|string[]; // full_name, email, phone_mobile, phone_home, phone_office, other_text // contact_li_json_ext?: null|string; external_person_id?: null|string; physical?: null|boolean; virtual?: null|boolean; recurring?: null|boolean; recurring_pattern?: null|string; recurring_start_time?: null|string; recurring_end_time?: null|string; recurring_text?: null|string; weekday_sunday?: null|boolean; weekday_monday?: null|boolean; weekday_tuesday?: null|boolean; weekday_wednesday?: null|boolean; weekday_thursday?: null|boolean; weekday_friday?: null|boolean; weekday_saturday?: null|boolean; attend_url?: null|string; attend_url_text?: null|string; attend_url_code?: null|string; // Meeting ID, Conference ID, etc. attend_url_passcode?: null|string; attend_phone?: null|string; attend_phone_passcode?: null|string; // Additional fields for convenience (database views) file_count?: null|number; file_count_all?: null|number; internal_use_count?: null|number; event_file_id_li_json?: null|string; } // Updated 2025-10-06 export interface Badge { id: number; // id_random: string; event_badge_id: string; event_badge_id_random: string; event_id: string; event_id_random: string; pronouns?: null|string; informal_name?: null|string; title_names?: null|string; given_name: string; middle_name?: null|string; family_name?: null|string; designations?: null|string; professional_title?: null|string; professional_title_override?: null|string; full_name?: string; full_name_override?: null|string; affiliations?: string; affiliations_override?: null|string; email?: string; email_override?: null|string; address_line_1?: null|string; address_line_2?: null|string; address_line_3?: null|string; city?: null|string; country_subdivision_code?: null|string; state_province?: null|string; state_province_abb?: null|string; postal_code?: null|string; country_alpha_2_code?: null|string; country?: null|string; full_address?: null|string; location?: null|string; location_override?: null|string; query_str?: null|string; badge_type?: string; badge_type_code?: string; badge_type_code_override?: null|string; badge_type_override?: null|string; external_event_id?: string; external_id?: string; external_person_id?: string; // passcode?: null|string; // data_json?: null|string; default_qry_string?: null|string; alert?: null|boolean; enable: null|boolean; hide?: null|boolean; priority?: null|boolean sort?: null|number; group?: null|string; notes?: null|string; created_on: Date; updated_on?: null|Date; // Generated fields for sorting locally only tmp_sort_1?: null|string; tmp_sort_2?: null|string; // Additional fields for convenience (database views) person_external_id?: null|string; // This may be semi-random or unique only withing the account. person_external_sys_id?: null|string; // Generated by an external system. Ideally this should be something like a UUID. It may be the same as the external_id if nothing given. person_given_name?: string; person_family_name?: null|string; person_full_name?: null|string; person_professional_title?: null|string; person_affiliations?: null|string; person_primary_email?: null|string; person_passcode?: null|string; } // Updated 2024-10-16 export interface Device { id: number; // id_random: string; event_device_id: string; // event_device_id_random: string; event_id: string; // event_id_random: string; event_location_id?: string; // event_location_id_random?: string; code?: string; name: string; description?: null|string; passcode?: null|string; local_file_cache_path?: null|string; host_file_temp_path?: null|string; recording_path?: null|string; record_audio?: null|boolean; record_video?: null|boolean; trigger_open_file_id?: null|string; trigger_open_session_id?: null|string; trigger_recording_start?: null|boolean; trigger_recording_stop?: null|boolean; trigger_reset?: null|boolean; trigger_show_admin?: null|boolean; trigger_show_hidden?: null|boolean; alert?: null|boolean; alert_msg?: null|string; alert_on?: null|string; status?: null|string; status_msg?: null|string; status_on?: null|Date; record_status?: null|string; record_status_msg?: null|string; record_status_on?: null|Date; heartbeat?: null|string; info_hostname?: null|string; info_ip_list?: null|string; // Semi-colon separated list of IP addresses meta_json?: null|string; other_json?: null|string; enable: null|boolean; hide?: null|boolean; priority?: null|boolean sort?: null|number; group?: null|string; notes?: null|string; created_on: Date; updated_on?: null|Date; // Generated fields for sorting locally only tmp_sort_1?: null|string; tmp_sort_2?: null|string; // Additional fields for convenience (database views) event_name?: string; event_location_code?: string; event_location_name?: string; } export interface Exhibit { id?: number; id_random: string; event_exhibit_id: string; event_exhibit_id_random: string; event_id: string; event_id_random: string; code: string; name: string; // tagline: null|string; description: null|string; staff_passcode: null data_json: null|string; leads_api_access: null|boolean; leads_custom_questions_json: null|string; leads_device_sm_qty: null|number; leads_device_lg_qty: null|number; license_max: number; license_li_json: null|string; cfg_json: string; enable: null|boolean; hide: null|boolean; priority: null|boolean sort: null|number; group: null|string; notes: null|string; created_on: Date; updated_on: null|Date; // Generated fields for sorting locally only // tmp_sort_1?: null|string; // tmp_sort_2?: null|string; } export interface Exhibit_tracking { id?: number; id_random: string; event_exhibit_tracking_id: string event_exhibit_tracking_id_random: string; event_exhibit_id: string; event_exhibit_id_random: string; event_badge_id: string; event_badge_id_random: string; event_person_id: string; event_person_id_random: null|string; // Is this needed? external_person_id: null|string; // This is an email address exhibitor_notes: null|string; responses_json: null|string; data_json: null|string; event_exhibit_name: string; // Extra field for convenience event_badge_title_names: null|string; event_badge_given_name: string; event_badge_family_name: null|string; event_badge_designations: null|string; event_badge_full_name: string; event_badge_full_name_override: null|string; event_badge_professional_title: null|string; event_badge_professional_title_override: null|string; event_badge_affiliations: null|string; event_badge_affiliations_override: null|string; event_badge_email: null|string; event_badge_email_override: null|string; event_badge_location: null|string; event_badge_location_override: null|string; event_badge_country: null|string; enable: null|boolean; hide: null|boolean; priority: null|boolean sort: null|number; group: null|string; notes: null|string; created_on: Date; updated_on: null|Date; // Generated fields for sorting locally only // tmp_sort_1?: null|string; // tmp_sort_2?: null|string; } export interface File { id: string; id_random: string; event_file_id: string; event_file_id_random: string; hosted_file_id: string; hosted_file_id_random: string; hash_sha256: string; for_type?: string; for_id?: string; for_id_random?: string; event_id: string; event_id_random: string; event_session_id?: string; event_session_id_random?: string; event_presentation_id?: string; event_presentation_id_random?: string; event_presenter_id?: string; event_presenter_id_random?: string; event_location_id?: string; event_location_id_random?: string; filename: string; extension: string; open_in_os?: null|string; // null, empty, 'mac', or 'win' lu_file_purpose_id: string; lu_event_file_purpose_name: string; file_purpose: string; enable: null|boolean; hide?: null|boolean; priority?: null|boolean sort?: null|number; group?: null|string; notes?: null|string; created_on: Date; updated_on?: null|Date; // Generated fields for sorting locally only tmp_sort_1?: null|string; tmp_sort_2?: null|string; // Additional fields for convenience (database views) filename_no_ext: string; filename_w_ext: string; hosted_file_content_type: string; file_size: number; // In bytes hosted_file_size?: number; // In bytes event_location_code?: null|string; event_location_name?: null|string; event_session_code?: null|string; event_session_type_code?: null|string; event_session_name?: string; event_session_start_datetime?: null|Date; event_session_end_datetime?: null|Date; event_presentation_code?: null|string; event_presentation_type_code?: null|string; event_presentation_name?: string; event_presentation_start_datetime?: null|Date; event_presentation_end_datetime?: null|Date; event_presenter_given_name?: null|string; event_presenter_family_name?: null|string; event_presenter_full_name?: null|string; event_presenter_email?: null|string; } // Updated 2024-06-25 export interface Location { id: string; // id_random: string; event_location_id: string; event_location_id_random: string; external_id?: null|string; code?: null|string; type_code?: string; event_id: string; event_id_random: string; name: string; description?: null|string; passcode?: null|string; hide_event_launcher?: null|boolean; alert?: null|boolean; alert_msg?: null|string; data_json?: null|string; enable: null|boolean; hide?: null|boolean; priority?: null|boolean sort?: null|number; group?: null|string; notes?: null|string; created_on: Date; updated_on?: null|Date; // Generated fields for sorting locally only tmp_sort_1?: null|string; tmp_sort_2?: null|string; // Additional fields for convenience (database views) file_count?: null|number; file_count_all?: null|number; internal_use_count?: null|number; event_file_id_li_json?: null|string; event_name?: null|string; // A key value list of the sessions event_session_kv?: null|key_val; // A key value list of the files event_file_kv?: null|key_val; } // Updated 2024-06-10 export interface Presentation { id: string; // id_random: string; event_presentation_id: string; event_presentation_id_random: string; external_id?: null|string; code?: null|string; for_type?: string; for_id?: string; for_id_random?: string; type_code?: string; event_id: string; event_id_random: string; event_session_id: string; event_session_id_random: string; event_abstract_id?: null|string; event_abstract_id_random?: null|string; abstract_code?: null|string; name: string; description?: null|string; start_datetime?: null|Date; end_datetime?: null|Date; passcode?: null|string; hide_event_launcher?: null|boolean; enable: null|boolean; hide?: null|boolean; priority?: null|boolean; sort?: null|number; group?: null|string; notes?: null|string; created_on: Date; updated_on?: null|Date; // Generated fields for sorting locally only tmp_sort_1?: null|string; tmp_sort_2?: null|string; // Additional fields for convenience (database views) // file_count: null|number; event_session_code?: null|string; event_session_name?: null|string; // A key value list of the presenters event_presenter_kv?: null|key_val; event_presenter_li?: null|Array; } // Updated 2024-06-10 export interface Presenter { id: string; // id_random: string; event_presenter_id: string; event_presenter_id_random: string; external_id?: string; code?: string; event_id: string; event_id_random: string; event_session_id: string; event_session_id_random: string; event_person_id?: null|string; event_person_id_random?: null|string; event_presentation_id: string; event_presentation_id_random: string; person_id?: null|string; person_id_random?: null|string; person_profile_id?: null|string; person_profile_id_random?: null|string; // The new table person_profile will be used soon... pronouns?: null|string; informal_name?: null|string; title_names?: null|string; given_name: string; middle_name?: null|string; family_name?: null|string; designations?: null|string; professional_title?: null|string; full_name?: string; full_name_override: null|string; affiliations?: null|string; email?: string; biography?: null|string; agree?: null|boolean; // General catchall for agreement or consent comments?: null|string; passcode?: null|string; hide_event_launcher?: null|boolean; data_json?: null|string; enable: null|boolean; hide?: null|boolean; priority?: null|boolean sort?: null|number; group?: null|string; notes?: null|string; created_on?: Date; updated_on?: null|Date; // Generated fields for sorting locally only tmp_sort_1?: null|string; tmp_sort_2?: null|string; // Additional fields for convenience (database views) file_count?: null|number; // file_count_all?: null|number; // internal_use_count?: null|number; event_file_id_li_json?: null|string; event_session_code?: null|string; event_session_name?: string; event_session_start_datetime?: null|Date; event_presentation_code?: null|string; event_presentation_name?: string; event_presentation_start_datetime?: null|Date; person_external_id?: null|string; // This may be semi-random or unique only withing the account. person_external_sys_id?: null|string; // Generated by an external system. Ideally this should be something like a UUID. It may be the same as the external_id if nothing given. person_given_name?: string; person_family_name?: null|string; person_full_name?: null|string; person_professional_title?: null|string; person_affiliations?: null|string; person_primary_email?: null|string; person_passcode?: null|string; // A key value list of the files event_file_kv?: null|key_val; } export interface Registration { // Nothing here yet } // Updated 2024-06-19 export interface Session { id: string; // id_random: string; event_session_id: string; event_session_id_random: string; external_id: null|string; code: null|string; for_type: string; for_id: string; for_id_random: string; type_code?: string; event_id: string; event_id_random: string; event_location_id?: null|string; event_location_id_random?: null|string; poc_person_id?: null|string; poc_person_id_random?: null|string; poc_agree?: null|boolean; // General catchall for agreement or consent by the POC poc_kv_json?: null|key_val; // Key value list of the POC by type (examples: 'advocate', 'chair', 'champion', 'moderator', 'organizer') name: string; description?: null|string; start_datetime?: null|Date; end_datetime?: null|Date; passcode?: null|string; hide_event_launcher?: null|boolean; alert?: null|boolean; alert_msg?: null|string; data_json?: null|string; ux_mode?: null|string; // 'colloquium', 'lecture', 'panel', 'poster', 'symposium', 'workshop' // colloquium - Specialists present on related topics with questions // symposium - A discussion, less formal enable: null|boolean; hide: null|boolean; priority: null|boolean sort: null|number; group: null|string; notes: null|string; created_on: Date; updated_on: null|Date; // Generated fields for sorting locally only tmp_sort_1?: null|string; tmp_sort_2?: null|string; // Additional fields for convenience (database views) file_count?: null|number; // Only files directly under a session file_count_all?: null|number; // All files under a session internal_use_count?: null|number; // Files marked for internal use event_file_id_li_json?: null|string; poc_person_given_name?: null|string; poc_person_family_name?: null|string; poc_person_full_name?: null|string; poc_person_primary_email?: null|string; poc_person_passcode?: null|string; event_name?: null|string; event_location_code?: null|string; event_location_name?: null|string; // A key value list of the presentations event_presentation_kv?: null|key_val; event_presentation_li?: null|[any]; // A key value list of the files event_file_kv?: null|key_val; event_file_li?: null|[any]; } // Updated 2024-10-16 export class MySubClassedDexie extends Dexie { // 'badge' is added by dexie when declaring the stores() // We just tell the typing system this is the case event!: Table; badge!: Table; device!: Table; exhibit!: Table; exhibit_tracking!: Table; file!: Table; location!: Table; presentation!: Table; presenter!: Table; session!: Table; constructor() { super('ae_events_db'); this.version(6).stores({ event: ` id, event_id, event_id_random, code, account_id, account_id_random, conference, type, name, start_datetime, end_datetime, timezone, cfg_json, tmp_sort_1, tmp_sort_2, enable, hide, priority, sort, group, notes, created_on, updated_on`, // badge: '++id, full_name, email' // Primary key and indexed props badge: ` id, id_random, event_badge_id, event_badge_id_random, event_id, event_id_random, full_name, full_name_override, email, email_override, affiliations, affiliations_override, badge_type, badge_type_code, badge_type_code_override, badge_type_override, external_event_id, external_id, external_person_id, default_qry_string, alert, tmp_sort_1, tmp_sort_2, enable, hide, priority, sort, group, notes, created_on, updated_on`, device: ` id, id_random, event_device_id_random, event_device_id, event_id, event_id_random, event_location_id, event_location_id_random, code, name, for_type, for_id, for_id_random, alert, tmp_sort_1, tmp_sort_2, enable, hide, priority, sort, group, notes, created_on, updated_on`, exhibit: ` id, id_random, event_exhibit_id, event_exhibit_id_random, event_id, event_id_random, code, name, description, staff_passcode, data_json, license_max, license_li_json, cfg_json, enable, hide, priority, sort, group, notes, created_on, updated_on, [priority+name]`, exhibit_tracking: ` id, id_random, event_exhibit_tracking_id, event_exhibit_tracking_id_random, event_exhibit_id, event_exhibit_id_random, event_badge_id, event_badge_id_random, event_person_id, event_person_id_random, exhibitor_notes, responses_json, data_json, event_badge_full_name, event_badge_email, enable, hide, priority, sort, group, notes, created_on, updated_on`, file: ` id, id_random, event_file_id, event_file_id_random, hosted_file_id, hosted_file_id_random, hash_sha256, for_type, for_id, for_id_random, event_id, event_session_id, event_presentation_id, event_presenter_id, event_location_id, event_id_random, event_session_id_random, event_presentation_id_random, event_presenter_id_random, event_location_id_random, filename, extension, lu_file_purpose_id, lu_event_file_purpose_name, file_purpose, tmp_sort_1, tmp_sort_2, enable, hide, priority, sort, group, created_on, updated_on`, location: ` id, event_location_id, event_location_id_random, external_id, code, event_id, event_id_random, name, description, passcode, hide_event_launcher, alert, alert_msg, data_json, tmp_sort_1, tmp_sort_2, enable, hide, priority, sort, group, created_on, updated_on`, presentation: ` id, event_presentation_id, event_presentation_id_random, external_id, code, for_type, for_id, for_id_random, type_code, event_id, event_session_id, event_abstract_id, event_id_random, event_session_id_random, event_abstract_id_random, abstract_code, name, description, start_datetime, end_datetime, hide_event_launcher, tmp_sort_1, tmp_sort_2, enable, hide, priority, sort, group, created_on, updated_on`, presenter: ` id, event_presenter_id, event_presenter_id_random, external_id, code, event_id, event_session_id, event_person_id, event_presentation_id, event_id_random, event_session_id_random, event_person_id_random, event_presentation_id_random, person_id, person_profile_id, person_id_random, person_profile_id_random, given_name, family_name, full_name, affiliations, email, agree, hide_event_launcher, tmp_sort_1, tmp_sort_2, enable, hide, priority, sort, group, created_on, updated_on`, session: ` id, event_session_id, event_session_id_random, external_id, code, for_type, for_id, for_id_random, type_code, event_id, event_location_id, poc_person_id, event_id_random, event_location_id_random, poc_person_id_random, name, start_datetime, end_datetime, hide_event_launcher, ux_mode, alert, tmp_sort_1, tmp_sort_2, enable, hide, priority, sort, group, created_on, updated_on`, }); } } export const db_events = new MySubClassedDexie();