From 1d7c14dedbf27dd063536bc173a73255268bde89 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Mon, 7 Mar 2022 18:21:05 -0500 Subject: [PATCH] Working on rewrite version 3. Focus on caching for now. --- app/css/aether_system.css | 2 +- app/css/base_style_event_launcher.css | 2 +- app/index 2022-03-01.html.bak | 6 +- app/index.html | 13 +- app/js/app_ui_files.js | 442 ++++++++++----------- app/js/app_ui_misc.js | 266 ++++++------- app/js/app_v3.js | 20 + app/js/hold testing.js | 2 +- app/js/module_app.js | 22 ++ app/js/module_app_ui.js | 520 ++++++++++++------------- app/static/images/favicon.ico | Bin 0 -> 1626 bytes app/static/images/oneskyit_logo.png | Bin 0 -> 9760 bytes app/static/images/site_background.png | Bin 0 -> 41785 bytes app/static/images/site_background.svg | 1 + app/static/images/site_background.webp | Bin 0 -> 16974 bytes index.js | 34 +- 16 files changed, 695 insertions(+), 635 deletions(-) create mode 100644 app/js/app_v3.js create mode 100755 app/static/images/favicon.ico create mode 100644 app/static/images/oneskyit_logo.png create mode 100644 app/static/images/site_background.png create mode 100644 app/static/images/site_background.svg create mode 100644 app/static/images/site_background.webp diff --git a/app/css/aether_system.css b/app/css/aether_system.css index c14bc2a..22864e0 100644 --- a/app/css/aether_system.css +++ b/app/css/aether_system.css @@ -15,7 +15,7 @@ body { /* Display */ /* Center and scale the image nicely */ background-color: steelblue; - background-image: url('/static/images/site_background.webp'); /* "/static/images/site_background.webp" */ + background-image: url('../static/images/site_background.svg'); background-position: center; background-repeat: no-repeat; background-attachment: fixed; diff --git a/app/css/base_style_event_launcher.css b/app/css/base_style_event_launcher.css index 3ae1b93..db5e4c6 100644 --- a/app/css/base_style_event_launcher.css +++ b/app/css/base_style_event_launcher.css @@ -1,7 +1,7 @@ body { background-color: steelblue; /* https://app.haikei.app/ */ - background-image: url('/static/images/site_background.svg'); + background-image: url('../static/images/site_background.svg'); background-position: center; background-repeat: no-repeat; background-attachment: fixed; diff --git a/app/index 2022-03-01.html.bak b/app/index 2022-03-01.html.bak index c8974b8..1f773db 100644 --- a/app/index 2022-03-01.html.bak +++ b/app/index 2022-03-01.html.bak @@ -109,7 +109,7 @@ let api_update_datetime = Date.now(); let waiting_on_api_token = false; - const secret_key = app_config.api_secret_key; + const api_secret_key = app_config.api_secret_key; let api_temporary_token = null; let api_base_url = null; // 'http://api.localhost:5001' 'https://api.oneskyit.com' @@ -135,8 +135,8 @@ //console.log('****************** LOOP: API Token Loop ******************'); if (app_online && api_update_datetime < Date.now()) { - //let api_temporary_token_result = api_token_request_async(axios, secret_key) - api_temporary_token = await api_token_request_async(axios, secret_key) + //let api_temporary_token_result = api_token_request_async(axios, api_secret_key) + api_temporary_token = await api_token_request_async(axios, api_secret_key) .then(function (result) { if (result) { console.log('Setting temporary API token to axios Authorization header: '+result); diff --git a/app/index.html b/app/index.html index a1a8310..216981d 100644 --- a/app/index.html +++ b/app/index.html @@ -56,7 +56,8 @@ - + + @@ -83,6 +84,7 @@ + @@ -103,13 +105,16 @@ const app_env = 'development_local'; // 'development_local', 'development_remote const api_env = 'development_local'; // 'development_local', 'development_remote' const app_mode = 'onsite'; // null, 'default', 'onsite' -let account_id = app_config.account_id; +let client_account_id = app_config.account_id; +console.log(client_account_id); let event_id = app_config.event_id; let event_location_id = app_config.event_location_id; const page_for = { 'event': event_id, 'event_location': event_location_id }; // Simple key value like object console.log(page_for); +const host_file_cache_path = app_config.host_file_cache_path; // 'file_cache/' + /* ***** **** *** ** * ### * ** *** **** ***** */ @@ -121,7 +126,9 @@ console.log(page_for); // let api_update_datetime = Date.now(); // let waiting_on_api_token = false; -const secret_key = app_config.api_secret_key; +const access_control_allow_origin = app_config.access_control_allow_origin; +const api_secret_key = app_config.api_secret_key; +console.log(api_secret_key); let api_temporary_token = null; let api_base_url = null; diff --git a/app/js/app_ui_files.js b/app/js/app_ui_files.js index 2d81c37..8185566 100644 --- a/app/js/app_ui_files.js +++ b/app/js/app_ui_files.js @@ -1,228 +1,228 @@ // This function is used to render all event, location, session, presentation, and presenter file records to the UI. //exports.render_event_file_records = async function () { async function render_event_file_records() { - console.log('****************** Files ******************'); - console.log('Rendering all event, location, session, presentation, and presenter file records...'); - - if (looping_tbl_event_file) { - console.log('Already looping through the tbl_event_file table. Not starting until finished.'); - return false; - } else { - - } - - looping_tbl_event_file = true; - - console.log('Iterating through the tbl_event_file table...'); - let tbl_event_file_result = await tbl_event_file.iterate(function(value, key, iteration) { - let tbl_file_id = value.id; - let tbl_hosted_file_id = value.hosted_file_id; - let tbl_event_id = value.event_id; - let tbl_location_id = value.event_location_id; - let tbl_session_id = value.event_session_id; - let tbl_presentation_id = value.event_presentation_id; - let tbl_presenter_id = value.event_presenter_id; - let tbl_for_type = value.for_type; - let tbl_for_id = value.for_id; - let tbl_hash_sha256 = value.hosted_file_hash_sha256; - let tbl_filename = value.filename; // This could also be event_file_filename, internal_filename, private_filename, public_filename, or hosted_file_filename - let tbl_size = value.hosted_file_size; - let tbl_created_on = value.created_on; - let tbl_updated_on = value.created_on; - let tbl_internal_os = value.internal_os; - - console.log('tbl_event_file iteration='+iteration+' | tbl_file_id='+tbl_file_id+' for tbl_event_id='+tbl_event_id+' at location tbl_location_id='+tbl_location_id+'.'); - - if (tbl_event_id == event_id && tbl_for_type == 'event') { - console.log('EVENT FILE **************************'); - document.getElementById('event_files_menu').classList.remove('d-none'); - document.getElementById('event_files_menu').classList.add('d-block'); - } - - if (tbl_location_id == event_location_id && tbl_for_type == 'location') { - console.log('LOCATION FILE **************************'); - document.getElementById('location_files_menu').classList.remove('d-none'); - document.getElementById('location_files_menu').classList.add('d-block'); - } - - //add_file_id = false; - remove_file_id = true; - if (tbl_event_id == event_id/* && tbl_location_id == event_location_id*/) { - console.log('Match for event_id='+event_id+' and event_location_id='+event_location_id); - file_li_node = document.getElementById('event_file_'+tbl_file_id); - if (file_li_node) { - console.log('event_file ('+tbl_file_id+') node found... check and remove/update.'); - if (file_li_node.getAttribute('data-for_type') == tbl_for_type && file_li_node.getAttribute('data-for_id') == tbl_for_id) { - console.log('This file is still for_type='+tbl_for_type+' and for_id='+tbl_for_id+'.'); - file_li_node.setAttribute('data-filename', tbl_filename); - - let new_filename = shorten_filename(tbl_filename); - file_li_node.getElementsByClassName('filename')[0].innerHTML = new_filename; - try { - file_li_node.getElementsByClassName('file_meta')[0].innerHTML = format_bytes(tbl_size, 2)+'; '+dateFns.format(tbl_created_on, 'MMM M h:mm A')+'; '+tbl_internal_os; - } catch(err) { - console.log('file_meta span not found. This is ok for event and location specific files.'); - } - - file_li_node.setAttribute('data-size', tbl_size); - - file_li_node.setAttribute('data-created_on', dateFns.format(tbl_created_on, 'YYYY-MM-DD HH:mm:ss A')); - file_li_node.setAttribute('data-updated_on', dateFns.format(tbl_updated_on, 'YYYY-MM-DD HH:mm:ss A')); - - file_li_node.setAttribute('data-internal_os', tbl_internal_os); - - - remove_file_id = false; - } else { - console.log('This file no longer matching for_type='+tbl_for_type+' and for_id='+tbl_for_id+'. Removing...'); - file_li_node.remove(); - remove_file_id = false; - } - } else if (!file_li_node) { - console.log('event_file ('+tbl_file_id+') node NOT found... check and add.'); - - let node_id = tbl_for_type+'_files_list_'+tbl_for_id; - console.log(node_id); - let parent_ul_node = document.getElementById(node_id); - console.log(parent_ul_node); - if (parent_ul_node) { - // Trying to remove old ID in case there is one already rendered - console.log('Trying to remove an old file LI node if it exists...'); - try { - document.getElementById('event_file_'+tbl_file_id).remove(); - } catch(err) { - //console.log('A node with the ID of event_file_'+tbl_file_id+' was not found.'); - console.log('This event file list item node was not found. In most cases this is expected.'); - console.log(err.message); - } - - let file_li_node = document.createElement('LI'); - file_li_node.id = 'event_file_'+tbl_file_id; - if (tbl_for_type != 'event' && tbl_for_type != 'location') { - file_li_node.className = 'list-group-item btn btn-primary d-flex justify-content-between align-items-center open_local_file event_file'; - //file_li_node.className = 'list-group-item btn btn-primary justify-content-between align-items-center open_local_file event_file'; - } else { - file_li_node.className = 'list-group-item btn btn-sm btn-secondary d-flex justify-content-between align-items-center open_local_file event_file'; - //file_li_node.className = 'list-group-item btn btn-sm btn-secondary justify-content-between align-items-center open_local_file event_file'; - } - file_li_node.setAttribute('data-file_id', tbl_file_id); - - - file_li_node.setAttribute('data-event_id', tbl_event_id); - file_li_node.setAttribute('data-location_id', tbl_location_id); - file_li_node.setAttribute('data-session_id', tbl_session_id); - file_li_node.setAttribute('data-presentation_id', tbl_presentation_id); - file_li_node.setAttribute('data-presenter_id', tbl_presenter_id); - - file_li_node.setAttribute('data-for_type', tbl_for_type); - file_li_node.setAttribute('data-for_id', tbl_for_id); - - file_li_node.setAttribute('data-hash_sha256', tbl_hash_sha256+'.file'); - file_li_node.setAttribute('data-filename', tbl_filename); - file_li_node.setAttribute('data-size', tbl_size); - - file_li_node.setAttribute('data-created_on', dateFns.format(tbl_created_on, 'YYYY-MM-DD HH:mm:ss A')); - file_li_node.setAttribute('data-updated_on', dateFns.format(tbl_updated_on, 'YYYY-MM-DD HH:mm:ss A')); - - file_li_node.setAttribute('data-internal_os', tbl_internal_os); - - file_li_node.title = 'Click to open "'+tbl_filename+'" | id='+tbl_file_id+' | for_type='+tbl_for_type+' | for_id='+tbl_for_id+' | updated_on='+dateFns.format(tbl_updated_on, 'YYYY-MM-DD HH:mm:ss A'); - - let file_fa_span_node = document.createElement('SPAN'); - file_fa_span_node.className = 'fas fa-external-link-alt'; - - let file_filename_span_node = document.createElement('SPAN'); - - - file_filename_span_node.className = 'filename'; - - let new_filename = shorten_filename(tbl_filename); - let filename_text_node = document.createTextNode(new_filename); - file_filename_span_node.appendChild(filename_text_node); - - file_li_node.appendChild(file_fa_span_node); - file_li_node.appendChild(file_filename_span_node); - - // We do not want the badge to show in the left menu. Not enough space. - if (tbl_for_type != 'event' && tbl_for_type != 'location') { - let file_badge_span_node = document.createElement('SPAN'); - file_badge_span_node.className = 'badge badge-pill badge-light float-right file_meta'; - - let badge_text_node = document.createTextNode(format_bytes(tbl_size, 2)+'; '+dateFns.format(tbl_created_on, 'MMM M h:mm A')+'; '+tbl_internal_os); - file_badge_span_node.appendChild(badge_text_node); - - file_li_node.appendChild(file_badge_span_node); - } - - - - console.log(file_li_node); - - parent_ul_node.appendChild(file_li_node); - remove_file_id = false; - } - - } - - // NOTE: This is probably not needed? - if (remove_file_id) { - // Trying to remove old ID in case there is one already rendered - console.log('Trying to remove an old file LI node if it exists...'); - try { - document.getElementById('event_file_'+tbl_file_id).remove(); - } catch(err) { - //console.log('A node with the ID of event_file_'+tbl_file_id+' was not found.'); - console.log('This event file list item node was not found. In most cases this is expected.'); - console.log(err.message); - } - } - - console.log('XXXXX ******** STARTING SORT ******** XXXXX'); - let node_id = tbl_for_type+'_files_list_'+tbl_for_id; - console.log(node_id); - try { - var categoryItems = document.getElementById(node_id).childNodes; - console.log(categoryItems); - - var categoryItemsArray = Array.from(categoryItems); - - function sorter(a, b) { - if (a.dataset.updated_on > b.dataset.updated_on) return -1; - if (a.dataset.updated_on < b.dataset.updated_on) return 1; - } - - let sorted = categoryItemsArray.sort(sorter); - - function update_li_order(item, index) { - document.getElementById(node_id).appendChild(item); - } - - sorted.forEach(update_li_order); - } catch(err) { - console.log(err); - } - console.log('******** FINISHED SORT ********'); - - - + console.log('****************** Files ******************'); + console.log('Rendering all event, location, session, presentation, and presenter file records...'); + + if (looping_tbl_event_file) { + console.log('Already looping through the tbl_event_file table. Not starting until finished.'); + return false; } else { - console.log('This file ('+tbl_file_id+') is not part of this event and or location'); - console.log('tbl_event_id='+tbl_event_id+' ?= event_id='+event_id); - console.log('tbl_location_id='+tbl_location_id+' ?= event_location_id='+event_location_id); + } - }).then(function() { - console.log('idb_to_ui: Iterate tbl_event_file looking for files to add is complete'); - looping_tbl_event_file = false; + + looping_tbl_event_file = true; + + console.log('Iterating through the tbl_event_file table...'); + let tbl_event_file_result = await tbl_event_file.iterate(function(value, key, iteration) { + let tbl_file_id = value.id; + let tbl_hosted_file_id = value.hosted_file_id; + let tbl_event_id = value.event_id; + let tbl_location_id = value.event_location_id; + let tbl_session_id = value.event_session_id; + let tbl_presentation_id = value.event_presentation_id; + let tbl_presenter_id = value.event_presenter_id; + let tbl_for_type = value.for_type; + let tbl_for_id = value.for_id; + let tbl_hash_sha256 = value.hosted_file_hash_sha256; + let tbl_filename = value.filename; // This could also be event_file_filename, internal_filename, private_filename, public_filename, or hosted_file_filename + let tbl_size = value.hosted_file_size; + let tbl_created_on = value.created_on; + let tbl_updated_on = value.created_on; + let tbl_internal_os = value.internal_os; + + console.log('tbl_event_file iteration='+iteration+' | tbl_file_id='+tbl_file_id+' for tbl_event_id='+tbl_event_id+' at location tbl_location_id='+tbl_location_id+'.'); + + if (tbl_event_id == event_id && tbl_for_type == 'event') { + console.log('EVENT FILE **************************'); + document.getElementById('event_files_menu').classList.remove('d-none'); + document.getElementById('event_files_menu').classList.add('d-block'); + } + + if (tbl_location_id == event_location_id && tbl_for_type == 'location') { + console.log('LOCATION FILE **************************'); + document.getElementById('location_files_menu').classList.remove('d-none'); + document.getElementById('location_files_menu').classList.add('d-block'); + } + + //add_file_id = false; + remove_file_id = true; + if (tbl_event_id == event_id/* && tbl_location_id == event_location_id*/) { + console.log('Match for event_id='+event_id+' and event_location_id='+event_location_id); + file_li_node = document.getElementById('event_file_'+tbl_file_id); + if (file_li_node) { + console.log('event_file ('+tbl_file_id+') node found... check and remove/update.'); + if (file_li_node.getAttribute('data-for_type') == tbl_for_type && file_li_node.getAttribute('data-for_id') == tbl_for_id) { + console.log('This file is still for_type='+tbl_for_type+' and for_id='+tbl_for_id+'.'); + file_li_node.setAttribute('data-filename', tbl_filename); + + let new_filename = shorten_filename(tbl_filename); + file_li_node.getElementsByClassName('filename')[0].innerHTML = new_filename; + try { + file_li_node.getElementsByClassName('file_meta')[0].innerHTML = format_bytes(tbl_size, 2)+'; '+dateFns.format(tbl_created_on, 'MMM M h:mm A')+'; '+tbl_internal_os; + } catch(err) { + console.log('file_meta span not found. This is ok for event and location specific files.'); + } + + file_li_node.setAttribute('data-size', tbl_size); + + file_li_node.setAttribute('data-created_on', dateFns.format(tbl_created_on, 'YYYY-MM-DD HH:mm:ss A')); + file_li_node.setAttribute('data-updated_on', dateFns.format(tbl_updated_on, 'YYYY-MM-DD HH:mm:ss A')); + + file_li_node.setAttribute('data-internal_os', tbl_internal_os); + + + remove_file_id = false; + } else { + console.log('This file no longer matching for_type='+tbl_for_type+' and for_id='+tbl_for_id+'. Removing...'); + file_li_node.remove(); + remove_file_id = false; + } + } else if (!file_li_node) { + console.log('event_file ('+tbl_file_id+') node NOT found... check and add.'); + + let node_id = tbl_for_type+'_files_list_'+tbl_for_id; + console.log(node_id); + let parent_ul_node = document.getElementById(node_id); + console.log(parent_ul_node); + if (parent_ul_node) { + // Trying to remove old ID in case there is one already rendered + console.log('Trying to remove an old file LI node if it exists...'); + try { + document.getElementById('event_file_'+tbl_file_id).remove(); + } catch(err) { + //console.log('A node with the ID of event_file_'+tbl_file_id+' was not found.'); + console.log('This event file list item node was not found. In most cases this is expected.'); + console.log(err.message); + } + + let file_li_node = document.createElement('LI'); + file_li_node.id = 'event_file_'+tbl_file_id; + if (tbl_for_type != 'event' && tbl_for_type != 'location') { + file_li_node.className = 'list-group-item btn btn-primary d-flex justify-content-between align-items-center open_local_file event_file'; + //file_li_node.className = 'list-group-item btn btn-primary justify-content-between align-items-center open_local_file event_file'; + } else { + file_li_node.className = 'list-group-item btn btn-sm btn-secondary d-flex justify-content-between align-items-center open_local_file event_file'; + //file_li_node.className = 'list-group-item btn btn-sm btn-secondary justify-content-between align-items-center open_local_file event_file'; + } + file_li_node.setAttribute('data-file_id', tbl_file_id); + + + file_li_node.setAttribute('data-event_id', tbl_event_id); + file_li_node.setAttribute('data-location_id', tbl_location_id); + file_li_node.setAttribute('data-session_id', tbl_session_id); + file_li_node.setAttribute('data-presentation_id', tbl_presentation_id); + file_li_node.setAttribute('data-presenter_id', tbl_presenter_id); + + file_li_node.setAttribute('data-for_type', tbl_for_type); + file_li_node.setAttribute('data-for_id', tbl_for_id); + + file_li_node.setAttribute('data-hash_sha256', tbl_hash_sha256+'.file'); + file_li_node.setAttribute('data-filename', tbl_filename); + file_li_node.setAttribute('data-size', tbl_size); + + file_li_node.setAttribute('data-created_on', dateFns.format(tbl_created_on, 'YYYY-MM-DD HH:mm:ss A')); + file_li_node.setAttribute('data-updated_on', dateFns.format(tbl_updated_on, 'YYYY-MM-DD HH:mm:ss A')); + + file_li_node.setAttribute('data-internal_os', tbl_internal_os); + + file_li_node.title = 'Click to open "'+tbl_filename+'" | id='+tbl_file_id+' | for_type='+tbl_for_type+' | for_id='+tbl_for_id+' | updated_on='+dateFns.format(tbl_updated_on, 'YYYY-MM-DD HH:mm:ss A'); + + let file_fa_span_node = document.createElement('SPAN'); + file_fa_span_node.className = 'fas fa-external-link-alt'; + + let file_filename_span_node = document.createElement('SPAN'); + + + file_filename_span_node.className = 'filename'; + + let new_filename = shorten_filename(tbl_filename); + let filename_text_node = document.createTextNode(new_filename); + file_filename_span_node.appendChild(filename_text_node); + + file_li_node.appendChild(file_fa_span_node); + file_li_node.appendChild(file_filename_span_node); + + // We do not want the badge to show in the left menu. Not enough space. + if (tbl_for_type != 'event' && tbl_for_type != 'location') { + let file_badge_span_node = document.createElement('SPAN'); + file_badge_span_node.className = 'badge badge-pill badge-light float-right file_meta'; + + let badge_text_node = document.createTextNode(format_bytes(tbl_size, 2)+'; '+dateFns.format(tbl_created_on, 'MMM M h:mm A')+'; '+tbl_internal_os); + file_badge_span_node.appendChild(badge_text_node); + + file_li_node.appendChild(file_badge_span_node); + } + + + + console.log(file_li_node); + + parent_ul_node.appendChild(file_li_node); + remove_file_id = false; + } + + } + + // NOTE: This is probably not needed? + if (remove_file_id) { + // Trying to remove old ID in case there is one already rendered + console.log('Trying to remove an old file LI node if it exists...'); + try { + document.getElementById('event_file_'+tbl_file_id).remove(); + } catch(err) { + //console.log('A node with the ID of event_file_'+tbl_file_id+' was not found.'); + console.log('This event file list item node was not found. In most cases this is expected.'); + console.log(err.message); + } + } + + console.log('XXXXX ******** STARTING SORT ******** XXXXX'); + let node_id = tbl_for_type+'_files_list_'+tbl_for_id; + console.log(node_id); + try { + var categoryItems = document.getElementById(node_id).childNodes; + console.log(categoryItems); + + var categoryItemsArray = Array.from(categoryItems); + + function sorter(a, b) { + if (a.dataset.updated_on > b.dataset.updated_on) return -1; + if (a.dataset.updated_on < b.dataset.updated_on) return 1; + } + + let sorted = categoryItemsArray.sort(sorter); + + function update_li_order(item, index) { + document.getElementById(node_id).appendChild(item); + } + + sorted.forEach(update_li_order); + } catch(err) { + console.log(err); + } + console.log('******** FINISHED SORT ********'); + + + + } else { + console.log('This file ('+tbl_file_id+') is not part of this event and or location'); + console.log('tbl_event_id='+tbl_event_id+' ?= event_id='+event_id); + console.log('tbl_location_id='+tbl_location_id+' ?= event_location_id='+event_location_id); + } + }).then(function() { + console.log('idb_to_ui: Iterate tbl_event_file looking for files to add is complete'); + looping_tbl_event_file = false; + return true; + }) + .catch(function (error) { + console.log('Something went wrong in function render_event_file_records.'); + console.log(error); + return false; + }); + + + index_open_file_buttons('open_local_file'); return true; - }) - .catch(function (error) { - console.log('Something went wrong in function render_event_file_records.'); - console.log(error); - return false; - }); - - - index_open_file_buttons('open_local_file'); - return true; - + } diff --git a/app/js/app_ui_misc.js b/app/js/app_ui_misc.js index 811fff1..e78b99b 100644 --- a/app/js/app_ui_misc.js +++ b/app/js/app_ui_misc.js @@ -3,178 +3,178 @@ const { ipcRenderer } = require('electron'); //exports.render_event_records = function () { async function render_event_records() { - console.log('****************** Events ******************'); - console.log('Rendering event records...'); - //console.log(tbl_event); - //console.log(event_id); - - if (looping_tbl_event) { - console.log('Already looping through the tbl_event table. Not starting until finished.'); - return false; - } else { - - } - - looping_tbl_event = true; - - tbl_event.iterate(function(value, key, iteration) { - if (value.id == event_id) { - console.log('*** Event id ('+event_id+') found in table.'); - document.getElementById('event_name').innerHTML = '@'+value.name; - document.getElementById('event_files_menu').getElementsByTagName('ul')[0].id = 'event_files_list_'+value.id; + console.log('****************** Events ******************'); + console.log('Rendering event records...'); + //console.log(tbl_event); + //console.log(event_id); + + if (looping_tbl_event) { + console.log('Already looping through the tbl_event table. Not starting until finished.'); + return false; } else { - console.log('Event not it.'); + } - }).then(function() { - console.log('idb_to_ui: Iterate tbl_event_file complete') - //tbl_event_complete = true; - looping_tbl_event = false; - }); - + + looping_tbl_event = true; + + tbl_event.iterate(function(value, key, iteration) { + if (value.id == event_id) { + console.log('*** Event id ('+event_id+') found in table.'); + document.getElementById('event_name').innerHTML = '@'+value.name; + document.getElementById('event_files_menu').getElementsByTagName('ul')[0].id = 'event_files_list_'+value.id; + } else { + console.log('Event not it.'); + } + }).then(function() { + console.log('idb_to_ui: Iterate tbl_event_file complete') + //tbl_event_complete = true; + looping_tbl_event = false; + }); + } //exports.render_event_location_records = async function () { async function render_event_location_records() { - console.log('****************** Locations ******************'); - console.log('Rendering event location records...'); - - if (looping_tbl_event_location) { - console.log('Already looping through the tbl_event_location table. Not starting until finished.'); - return false; - } else { - - } - - looping_tbl_event_location = true; - - await tbl_event_location.iterate(function(value, key, iteration) { - if (value.id == event_location_id) { - console.log('*** Event location id ('+event_location_id+') found in table.'); - document.getElementById('location_name').innerHTML = ' '+value.name; - - document.getElementById('location_files_menu').getElementsByTagName('ul')[0].id = 'location_files_list_'+value.id; - /* - let location_files_ul_node = document.createElement('UL'); - location_files_ul_node.id = 'event_presentation_files_list_'+value.id; - location_files_ul_node.className = 'list-group list-group-flush location_files location_files_list event_files_list'; - - document.getElementById('location_files_menu').appendChild(location_files_ul_node); - */ + console.log('****************** Locations ******************'); + console.log('Rendering event location records...'); + + if (looping_tbl_event_location) { + console.log('Already looping through the tbl_event_location table. Not starting until finished.'); + return false; } else { - console.log('Event location not it.'); + } - }).then(function() { - console.log('idb_to_ui: Iterate tbl_event_file complete') - //tbl_event_location_complete = true; - looping_tbl_event_location = false; - }); - - return true; + + looping_tbl_event_location = true; + + await tbl_event_location.iterate(function(value, key, iteration) { + if (value.id == event_location_id) { + console.log('*** Event location id ('+event_location_id+') found in table.'); + document.getElementById('location_name').innerHTML = ' '+value.name; + + document.getElementById('location_files_menu').getElementsByTagName('ul')[0].id = 'location_files_list_'+value.id; + /* + let location_files_ul_node = document.createElement('UL'); + location_files_ul_node.id = 'event_presentation_files_list_'+value.id; + location_files_ul_node.className = 'list-group list-group-flush location_files location_files_list event_files_list'; + + document.getElementById('location_files_menu').appendChild(location_files_ul_node); + */ + } else { + console.log('Event location not it.'); + } + }).then(function() { + console.log('idb_to_ui: Iterate tbl_event_file complete') + //tbl_event_location_complete = true; + looping_tbl_event_location = false; + }); + + return true; } /* Updated 2020-01-31 */ function index_launcher_sessions(class_name) { - console.log('Indexing launcher sessions with class name: '+class_name); - var class_elements = document.getElementsByClassName(class_name); - - - for (var i = 0; i < class_elements.length; i++) { - class_elements[i].addEventListener( 'click', function() {view_session( this.getAttribute('data-session_id')) } ); - } - console.log(class_elements); - return true; + console.log('Indexing launcher sessions with class name: '+class_name); + var class_elements = document.getElementsByClassName(class_name); + + + for (var i = 0; i < class_elements.length; i++) { + class_elements[i].addEventListener( 'click', function() {view_session( this.getAttribute('data-session_id')) } ); + } + console.log(class_elements); + return true; } /* Updated 2020-01-31 */ function view_session(session_id) { - var class_elements = document.getElementsByClassName('session_detail'); // This class name should be the class names for each div container - console.log('View session ID: '+session_id); - for (var i = 0; i < class_elements.length; i++) { - //console.log('*** checking: '+class_elements[i].getAttribute('data-session_id')); - if (class_elements[i].getAttribute('data-session_id') == session_id) { - //console.log('show'); - class_elements[i].classList.remove('d-none'); - class_elements[i].classList.add('d-block'); - } else { - //console.log('hide'); - class_elements[i].classList.remove('d-block'); - class_elements[i].classList.add('d-none'); + var class_elements = document.getElementsByClassName('session_detail'); // This class name should be the class names for each div container + console.log('View session ID: '+session_id); + for (var i = 0; i < class_elements.length; i++) { + //console.log('*** checking: '+class_elements[i].getAttribute('data-session_id')); + if (class_elements[i].getAttribute('data-session_id') == session_id) { + //console.log('show'); + class_elements[i].classList.remove('d-none'); + class_elements[i].classList.add('d-block'); + } else { + //console.log('hide'); + class_elements[i].classList.remove('d-block'); + class_elements[i].classList.add('d-none'); + } } - } - - return true; + + return true; } /* Updated 2020-02-13 */ function index_open_file_buttons(class_name) { - console.log('****************** Indexing ******************'); - console.log('Indexing open file buttons...'); - var class_elements = document.getElementsByClassName(class_name); - //console.log(class_elements); - - for (var i = 0; i < class_elements.length; i++) { - // Do not use an anonymous function. If you do then it will keep adding event listeners. - // Adding the exact same event listeners over and over doesn't hurt anything. - // No need to use removeEventListener() - class_elements[i].addEventListener( 'click', open_local_file ); - - /* - let hash = class_elements[i].getAttribute('data-hash_sha256'); - let file_path = path.join(host_file_cache_path, hash); - let filename = class_elements[i].getAttribute('data-filename'); - class_elements[i].addEventListener( 'click', function() { ipcRenderer.send('open_local_file', file_path, filename) } ); - */ - } - - return true; + console.log('****************** Indexing ******************'); + console.log('Indexing open file buttons...'); + var class_elements = document.getElementsByClassName(class_name); + //console.log(class_elements); + + for (var i = 0; i < class_elements.length; i++) { + // Do not use an anonymous function. If you do then it will keep adding event listeners. + // Adding the exact same event listeners over and over doesn't hurt anything. + // No need to use removeEventListener() + class_elements[i].addEventListener( 'click', open_local_file ); + + /* + let hash = class_elements[i].getAttribute('data-hash_sha256'); + let file_path = path.join(host_file_cache_path, hash); + let filename = class_elements[i].getAttribute('data-filename'); + class_elements[i].addEventListener( 'click', function() { ipcRenderer.send('open_local_file', file_path, filename) } ); + */ + } + + return true; } /* Updated 2020-02-13 */ function open_local_file() { - //console.log(this); - let hash = this.getAttribute('data-hash_sha256'); - let file_path = path.join(host_file_cache_path, hash); - let filename = this.getAttribute('data-filename'); - console.log(file_path); - console.log(filename); - - ipcRenderer.send('open_local_file', file_path, filename); + //console.log(this); + let hash = this.getAttribute('data-hash_sha256'); + let file_path = path.join(host_file_cache_path, hash); + let filename = this.getAttribute('data-filename'); + console.log(file_path); + console.log(filename); + + ipcRenderer.send('open_local_file', file_path, filename); } function format_bytes(bytes, decimals = 2) { - if (bytes === 0) return '0 Bytes'; + if (bytes === 0) return '0 Bytes'; - const k = 1024; - const dm = decimals < 0 ? 0 : decimals; - const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; - const i = Math.floor(Math.log(bytes) / Math.log(k)); + const i = Math.floor(Math.log(bytes) / Math.log(k)); - return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; + return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; } function shorten_filename(filename) { - let length = filename.length; - let char_over = filename.length-45; - let new_filename = null; - let wildcards = char_over; - if (char_over > 0) { - let part1 = filename.slice(0, 20); - if (char_over > 5) { - wildcards = 5; + let length = filename.length; + let char_over = filename.length-45; + let new_filename = null; + let wildcards = char_over; + if (char_over > 0) { + let part1 = filename.slice(0, 20); + if (char_over > 5) { + wildcards = 5; + } else { + } + let part2 = '.'.repeat(wildcards); + let part3 = filename.slice(-20); + + new_filename = part1+part2+part3; } else { + new_filename = filename; } - let part2 = '.'.repeat(wildcards); - let part3 = filename.slice(-20); - - new_filename = part1+part2+part3; - } else { - new_filename = filename; - } - return new_filename; + return new_filename; } diff --git a/app/js/app_v3.js b/app/js/app_v3.js new file mode 100644 index 0000000..e8e9aa6 --- /dev/null +++ b/app/js/app_v3.js @@ -0,0 +1,20 @@ +const path = require('path'); +const { ipcRenderer } = require('electron'); + +/* Updated 2022-03-07 */ +// function open_local_file({hash, host_file_cache_path, filename}) { +function open_local_file({host_file_cache_path, hash, filename}) { + + console.log('*** open_local_file() ***'); + + // hash = this.getAttribute('data-hash_sha256'); + // let file_path = path.join(host_file_cache_path, hash); + // filename = this.getAttribute('data-filename'); + console.log(host_file_cache_path); + console.log(hash); + // console.log(file_path); + console.log(filename); + + // ipcRenderer.send('open_local_file', file_path, filename); + ipcRenderer.send('open_local_file', host_file_cache_path, hash, filename); +} \ No newline at end of file diff --git a/app/js/hold testing.js b/app/js/hold testing.js index 503e060..342b8af 100644 --- a/app/js/hold testing.js +++ b/app/js/hold testing.js @@ -15,7 +15,7 @@ if(fs.existsSync(filename)) { }) } -//shell.openItem('test.txt'); +//shell.openPath('test.txt'); /* const path = './'; diff --git a/app/js/module_app.js b/app/js/module_app.js index b25ee1e..96e0e2b 100644 --- a/app/js/module_app.js +++ b/app/js/module_app.js @@ -69,6 +69,28 @@ exports.load_config = function () { } +exports.check_file_cache_v3 = async function (host_file_cache_path, event_file_id, hash) { + console.log('**** *** ** * FUNCTION: check_file_cache_v3 * ** *** ****'); + console.log('Checking the local file cache against the remote server.'); + + event_file_id; // NOTE: This is the event_file.id_random or event_file.event_file_id_random + let hash_filename = hash+'.file'; + + let save_path = path.join(host_file_cache_path, hash_filename); + console.log(save_path); + + if (fs.existsSync(save_path)) { + console.log('Local file already exists: '+save_path); + } else { + console.log('File not found locally. Downloading file: '+save_path); + let endpoint = `/event/file/${event_file_id}/download`; + ipcRenderer.send('download_file', api_base_url, endpoint, save_path); // Must download file using main node.js thread. + } + + return true; +} + + exports.check_file_cache = async function () { console.log('**** *** ** * FUNCTION: check_file_cache * ** *** ****'); console.log('Checking the local file cache against the remote server.'); diff --git a/app/js/module_app_ui.js b/app/js/module_app_ui.js index d7dc8b4..f6cb155 100644 --- a/app/js/module_app_ui.js +++ b/app/js/module_app_ui.js @@ -6,260 +6,260 @@ const { ipcRenderer } = require('electron'); exports.render_launcher = function (launcher_tmp) { - console.log('Rendering based on launcher_tmp...'); - - console.log('In module_app_ui.js v2 idb to launcher object: ***'); - console.log(launcher_tmp); - console.log('In module_app_ui.js v2 idb to launcher object: ^^^'); - /* - if (launcher_tmp.event) { - for (var i in launcher_tmp.event) { - if (launcher_tmp.event[i].id == event_id) { - console.log('*** Event id ('+event_id+') found in launcher object.'); - for (var j in launcher_tmp.location) { - if (launcher_tmp.location[j].id == event_location_id) { - console.log('*** Location id ('+event_location_id+') found in launcher object.'); - document.title = launcher_tmp.location[j].name+'@'+launcher_tmp.event[i].name; - document.getElementById('location_name').innerHTML = ' '+launcher_tmp.location[j].name+'@'+launcher_tmp.event[i].name; - } else { - console.log('Event location not it.'); - } - } - } else { - console.log('Event not it.'); - } - } - console.log('Data in launcher object'); + console.log('Rendering based on launcher_tmp...'); + + console.log('In module_app_ui.js v2 idb to launcher object: ***'); console.log(launcher_tmp); - } else { - console.log('Missing data in launcher object'); - return false; - } - */ - document.getElementById('event_files_menu').innerHTML = '

Event Files

'; - document.getElementById('event_files_menu').innerHTML += ''; - - - document.getElementById('location_files_menu').innerHTML = '

Location Files

'; - document.getElementById('location_files_menu').innerHTML += ''; - - //document.getElementById('sessions_menu').innerHTML = '

Sessions

'; - //document.getElementById('sessions_menu').innerHTML += ''; - - index_launcher_sessions('btn_view_session'); - - index_open_file_buttons('open_local_file'); + session_files_card += files_list; - - //const btn_session_{{ event_presentation.id }}_name = document.querySelector('button#presentation_{{ event_presentation.id }}_name'); - //btn_presentation_{{ event_presentation.id }}_name.onclick = display_hide_poster_for_type_id.bind(this, true, 'presentation', {{ event_presentation.id }}); - console.log('Rendering launcher finished.'); - - return true; + session_files_card += ''; // for card-body + session_files_card += ' '; // for session files card + } else { + //session_files_card = 'no session files found'; + } + // *** Session files card section end + + session_detail += session_files_card; + + // *** Session presentations card section start + let session_presentations_card = ''; + if (typeof launcher_tmp.session[i].presentation !== 'undefined') { + + session_presentations_card += '
'; + session_presentations_card += '
Presentations:
'; + session_presentations_card += '
'; + + let presentations_list = ''; + presentations_list += '
    '; + + let presentation = ''; + for (var j in launcher_tmp.session[i].presentation) { + presentation = launcher_tmp.session[i].presentation[j]; + + //var session_presentation_startdatetime = new Date(launcher_tmp.session[i].presentation[j].start_datetime); + + presentations_list += '
  • '; + presentations_list += '
    '; + presentations_list += ''+presentation.name+''; + presentations_list += ''+dateFns.format(presentation.start_datetime, 'h:mm a')+''; + presentations_list += '
    '; + + presentations_list += '
    '; // Start presentation file list and presenters with files lists + + if (typeof presentation.file !== 'undefined') { + let files_list = ''; + files_list += '
      '; + for (var k in presentation.file) { + let file = presentation.file[k]; + //console.log(file.event_file_filename); + + files_list += '
    • '; + files_list += file.event_file_filename; + files_list += ''+format_bytes(file.size, 2)+'; '+dateFns.format(file.created_on, 'MMM M h:mm A')+'; '+file.internal_os+''; + files_list += '
    • '; + } + files_list += '
    '; + presentations_list += files_list; + } else { + files_list = '
    None here!
    '; + presentations_list += files_list; + } + + let presenters_list = ''; + for (var k in presentation.presenter) { + let presenter = presentation.presenter[k]; + //console.log(presenter.given_name); + + presenters_list += '
  • '; + presenters_list += ''+presenter.given_name+' '+presenter.family_name+''; + + if (typeof presenter.file !== 'undefined') { + let files_list = ''; + files_list += '
      '; + for (var l in presenter.file) { + let file = presenter.file[l]; + files_list += '
    • '; + files_list += file.event_file_filename; + files_list += ''+format_bytes(file.size, 2)+'; '+dateFns.format(file.created_on, 'MMM M h:mm A')+'; '+file.internal_os+''; + files_list += '
    • '; + } + files_list += '
    '; + presenters_list += files_list; + } else { + files_list = '
    None here!
    '; + presenters_list += files_list; + } + presenters_list +='
  • '; // End presenter's list group item (one presenter and their files) + } + presentations_list += presenters_list; + + presentations_list += ''; // close presentation files and presenters with files + + } + + presentations_list += '
'; // end of presentations with files list + + session_presentations_card += presentations_list; + session_presentations_card += '
'; // for presentations card-body + session_presentations_card += '
'; // for presentations card + + + session_detail += session_presentations_card; + //session_detail += ' '; // for session_presentations + + //session_detail += ''; // for card-group + + } + session_detail += ' '; + // *** Session presentations card section start + + //document.getElementById('launcher_sessions').innerHTML += session_detail; + + if (typeof(document.getElementById('detail_session_id_'+launcher_tmp.session[i].id)) != 'undefined' && document.getElementById('detail_session_id_'+launcher_tmp.session[i].id) != null) { + document.getElementById('detail_session_id_'+launcher_tmp.session[i].id).innerHTML = session_detail; + } else { + document.getElementById('launcher_sessions').innerHTML += session_detail; + } + + + } + document.getElementById('sessions_menu').innerHTML += ''; + + index_launcher_sessions('btn_view_session'); + + index_open_file_buttons('open_local_file'); + + + //const btn_session_{{ event_presentation.id }}_name = document.querySelector('button#presentation_{{ event_presentation.id }}_name'); + //btn_presentation_{{ event_presentation.id }}_name.onclick = display_hide_poster_for_type_id.bind(this, true, 'presentation', {{ event_presentation.id }}); + console.log('Rendering launcher finished.'); + + return true; } /* Updated 2019-12-19 */ function index_launcher_sessions(class_name) { - console.log('Indexing launcher sessions with class name: '+class_name); - var class_elements = document.getElementsByClassName(class_name); - - for (var i = 0; i < class_elements.length; i++) { - class_elements[i].addEventListener( 'click', function() {view_session( this.getAttribute('data-session_id')) } ); - } - - return true; + console.log('Indexing launcher sessions with class name: '+class_name); + var class_elements = document.getElementsByClassName(class_name); + + for (var i = 0; i < class_elements.length; i++) { + class_elements[i].addEventListener( 'click', function() {view_session( this.getAttribute('data-session_id')) } ); + } + + return true; } /* Updated 2019-12-19 */ function view_session(session_id) { - var class_elements = document.getElementsByClassName('launcher_sessions'); - console.log('*** View session ID: '+session_id); - for (var i = 0; i < class_elements.length; i++) { - //console.log('*** checking: '+class_elements[i].getAttribute('data-session_id')); - if (class_elements[i].getAttribute('data-session_id') == session_id) { - //console.log('show'); - class_elements[i].classList.remove('d-none'); - class_elements[i].classList.add('d-block'); - } else { - //console.log('hide'); - class_elements[i].classList.remove('d-block'); - class_elements[i].classList.add('d-none'); + var class_elements = document.getElementsByClassName('launcher_sessions'); + console.log('*** View session ID: '+session_id); + for (var i = 0; i < class_elements.length; i++) { + //console.log('*** checking: '+class_elements[i].getAttribute('data-session_id')); + if (class_elements[i].getAttribute('data-session_id') == session_id) { + //console.log('show'); + class_elements[i].classList.remove('d-none'); + class_elements[i].classList.add('d-block'); + } else { + //console.log('hide'); + class_elements[i].classList.remove('d-block'); + class_elements[i].classList.add('d-none'); + } } - } - - return true; + + return true; } @@ -268,35 +268,35 @@ function view_session(session_id) { /* Updated 2019-12-20 */ function index_open_file_buttons(class_name) { - var class_elements = document.getElementsByClassName(class_name); - - for (var i = 0; i < class_elements.length; i++) { - //class_elements[i].addEventListener( 'click', function() {open_local_file( this.getAttribute('data-filename')) } ); - - //let directory = 'file_cache/'; - - //directory_and_filename = path.join(directory, class_elements[i].getAttribute('data-filename')); - - let file_path = path.join(host_file_cache_path, class_elements[i].getAttribute('data-hash_sha256')); - let filename = class_elements[i].getAttribute('data-filename'); - - class_elements[i].addEventListener( 'click', function() { ipcRenderer.send('open_local_file', file_path, filename) } ); - //ipcRenderer.send('open_local_file', this.getAttribute('data-filename')); // in render thread - } - - return true; + var class_elements = document.getElementsByClassName(class_name); + + for (var i = 0; i < class_elements.length; i++) { + //class_elements[i].addEventListener( 'click', function() {open_local_file( this.getAttribute('data-filename')) } ); + + //let directory = 'file_cache/'; + + //directory_and_filename = path.join(directory, class_elements[i].getAttribute('data-filename')); + + let file_path = path.join(host_file_cache_path, class_elements[i].getAttribute('data-hash_sha256')); + let filename = class_elements[i].getAttribute('data-filename'); + + class_elements[i].addEventListener( 'click', function() { ipcRenderer.send('open_local_file', file_path, filename) } ); + //ipcRenderer.send('open_local_file', this.getAttribute('data-filename')); // in render thread + } + + return true; } function format_bytes(bytes, decimals = 2) { - if (bytes === 0) return '0 Bytes'; + if (bytes === 0) return '0 Bytes'; - const k = 1024; - const dm = decimals < 0 ? 0 : decimals; - const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; - const i = Math.floor(Math.log(bytes) / Math.log(k)); + const i = Math.floor(Math.log(bytes) / Math.log(k)); - return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; + return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; } diff --git a/app/static/images/favicon.ico b/app/static/images/favicon.ico new file mode 100755 index 0000000000000000000000000000000000000000..cf4994903e3855b16cff0b2ad17a7c3e66ae59e7 GIT binary patch literal 1626 zcmV-g2BrClP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00gN300gN4SoPiQ00007bV*G`2iyz; z5<4*rqpSx200r7fL_t(o!|j(_h+bC}$A4>|ea?5z+%hvv(#A_{GBI9CZ6Xw_U=vg9 zG#V`wq4Y^fnsy!{eJb`%un$&5siMU3LP^0YeMwN1Rwu@wG-xQ2ASPpiPJ-6h#K}x% zzWKg$+slV@=DUA0ee=Z)n{zmOum4`_zb<rC3&mYu_vwHsW^Vi$tU3swW#5EmN`eLF5lxp4hi!CO(b`s0zjd%|IQ+ zy9y#Kn#~XVZen`xHm_%Vr9iZv0`*>6o~RPO5$^w@^TI$t5h-KKG~;uP1uqKU2p>Fp zHE;O6bJY50!Qr!CCK?BAVM~0sW%2d*Y`$~rVW(>XT8L(KFaa3T#&>g*zcI1z z8ZK=vionWs;l;gQ=~m$I>yI-w`7*ZBm8nsBlb!jcGz-UlX?10u7DswPivohJ-H5OF z_f%?jyxaA83JX^r=SLs?Y10J%?Zv=;kxU^Vlthek_EqHOMbK;qr z8R}Xuo;i$de~zgahMNlPoH~RJwqrcSMsrLf)viWlr)*QX8@{2ra#L@;=PU}zhv;8HMtQ)n$c+$!7S^O+Zpc%>zR zlx3ulQGl$zl+IW71c`~dt#=t1Ti_#Xz!>VMA}j z4#QRqX*DlclU`FumS;J(d$zqFxcrMJnf&B|MryUvmew+c?g$YhWw!KYK~)hWRE90L z{}E#cO!uA~=70NCcSB+WOEeMS`5m4Rs4p3uQ@pp?XQ?Xwphq}ryRh;E;ziqi8%|Em z;91JNZUJ*jxXF@L9qRg9U$7;pQ<9aOaMbq1@_hKfqciOaOrL*AZKTrK>s%XhRe(}w4yAh;kpQ@@DYe-jfyudUS>)3-r zTFnWDie|PKTY@0QN6aYid*q}ch(1Cv@R@a+WDzOKv@c|FA7Bx(L@`0Jx38!OW=WP`VQ}JpL^k+? zkm5qAFHQ6EXMe@rpKH&Fxu4}6{N6(h-TBM5>emkog?RZDi?J^fuS`=J+O^?NOuYOW zwsMMFS8{&;eBNDzqEp1TUnLrQ_-$Za!FWG39J^$R;`!K-+%LT(NFXVtQ(h}W%ik6{y%{K Y0_>udzR@tf*Z=?k07*qoM6N<$f-{T{WB>pF literal 0 HcmV?d00001 diff --git a/app/static/images/oneskyit_logo.png b/app/static/images/oneskyit_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..64f24870c7c69df27c92adf46d16968ed98b323d GIT binary patch literal 9760 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 \ No newline at end of file diff --git a/app/static/images/site_background.webp b/app/static/images/site_background.webp new file mode 100644 index 0000000000000000000000000000000000000000..e5a15b56dbea18156314c04a0c08969126f4430c GIT binary patch literal 16974 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 { }) -ipcMain.on('download_file', (event, api_base_url, api_endpoint, api_temporary_token, save_path) => { - console.log('ipcMain on download_file: api_base_url='+api_base_url+' | api_temporary_token='+api_temporary_token); - console.log(api_temporary_token); +// ipcMain.on('download_file', (event, api_base_url, api_endpoint, api_temporary_token, save_path) => { +ipcMain.on('download_file', (event, api_base_url, api_endpoint, save_path) => { + console.log('*** call IPC download_file() ***'); + // console.log('ipcMain on download_file: api_base_url='+api_base_url+' | api_temporary_token='+api_temporary_token); + console.log('ipcMain on download_file: api_base_url='+api_base_url); + // console.log(api_temporary_token); console.log('ipcMain download and save file: '+api_endpoint+' -> '+save_path); axios.defaults.baseURL = api_base_url; - axios.defaults.headers.common['Access-Control-Allow-Origin'] = access_control_allow_origin; + axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*'; // app_config.access_control_allow_origin; axios.defaults.headers.common['content-type'] = 'application/json'; - axios.defaults.headers.common['x-aether-api-key'] = api_secret_key; - axios.defaults.headers.common['x-account-id'] = account_id; + axios.defaults.headers.common['x-aether-api-key'] = 'dFP6J9DVj9hUgIMn-fNIqg'; // api_secret_key; + axios.defaults.headers.common['x-account-id'] = '_XY7DXtc9MY'; // account_id; const url = api_endpoint; @@ -118,12 +121,19 @@ ipcMain.on('download_file', (event, api_base_url, api_endpoint, api_temporary_to -ipcMain.on('open_local_file', (event, file_path, filename) => { - console.log('ipcMain open local file: '+file_path+' -> '+filename); +// ipcMain.on('open_local_file', (event, file_path, filename) => { +// ipcMain.on('open_local_file', ({host_file_cache_path, hash, filename}) => { +ipcMain.on('open_local_file', (event, host_file_cache_path, hash, filename) => { + console.log(host_file_cache_path); + console.log('ipcMain open local file: '+host_file_cache_path+' -> '+filename); - cache_file_path = path.join(process.cwd(), file_path); + let cache_file_path = path.join(process.cwd(), host_file_cache_path); console.log(cache_file_path); + let hash_filename = hash+'.file'; + let full_cache_file_path = path.join(cache_file_path, hash_filename); + console.log(full_cache_file_path); + open_file_path = path.join(process.cwd(), 'temp/', filename); console.log(open_file_path); @@ -136,11 +146,11 @@ ipcMain.on('open_local_file', (event, file_path, filename) => { console.log('File copy already exists: '+open_file_path); } else { //console.log('Creating file link: '+open_file_path); - //fs.linkSync(cache_file_path, open_file_path); + //fs.linkSync(full_cache_file_path, open_file_path); console.log('Copying file to temp: '+open_file_path); - fs.copyFileSync(cache_file_path, open_file_path); + fs.copyFileSync(full_cache_file_path, open_file_path); } - shell.openItem(open_file_path); + shell.openPath(open_file_path); //fs.open(open_file_path); });