| 
									
										
										
										
											2020-07-25 22:07:35 -04:00
										 |  |  | const adjustTableHeight = () => { | 
					
						
							|  |  |  |     const tablesContainer = document.getElementById('tables-container'); | 
					
						
							| 
									
										
										
										
											2023-03-04 16:34:10 +01:00
										 |  |  |     if (!tablesContainer) | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2020-07-25 22:07:35 -04:00
										 |  |  |     const upperDistance = tablesContainer.getBoundingClientRect().top; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const tableWrappers = document.getElementsByClassName('table-wrapper'); | 
					
						
							| 
									
										
										
										
											2023-11-18 12:29:35 -06:00
										 |  |  |     for (let i = 0; i < tableWrappers.length; i++) { | 
					
						
							|  |  |  |         // Ensure we are starting from maximum size prior to calculation.
 | 
					
						
							|  |  |  |         tableWrappers[i].style.height = null; | 
					
						
							|  |  |  |         tableWrappers[i].style.maxHeight = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Set as a reasonable height, but still allows the user to resize element if they desire.
 | 
					
						
							|  |  |  |         const currentHeight = tableWrappers[i].offsetHeight; | 
					
						
							|  |  |  |         const maxHeight = (window.innerHeight - upperDistance) / Math.min(tableWrappers.length, 4); | 
					
						
							|  |  |  |         if (currentHeight > maxHeight) { | 
					
						
							|  |  |  |             tableWrappers[i].style.height = `calc(${maxHeight}px - 1rem)`; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         tableWrappers[i].style.maxHeight = `${currentHeight}px`; | 
					
						
							| 
									
										
										
										
											2020-07-25 22:07:35 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-29 14:58:49 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Convert an integer number of seconds into a human readable HH:MM format | 
					
						
							|  |  |  |  * @param {Number} seconds | 
					
						
							|  |  |  |  * @returns {string} | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const secondsToHours = (seconds) => { | 
					
						
							| 
									
										
										
										
											2024-06-01 17:07:58 +02:00
										 |  |  |     let hours = Math.floor(seconds / 3600); | 
					
						
							| 
									
										
										
										
											2023-08-29 14:58:49 -07:00
										 |  |  |     let minutes = Math.floor((seconds - (hours * 3600)) / 60).toString().padStart(2, '0'); | 
					
						
							|  |  |  |     return `${hours}:${minutes}`; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-23 20:54:25 -04:00
										 |  |  | window.addEventListener('load', () => { | 
					
						
							|  |  |  |     const tables = $(".table").DataTable({ | 
					
						
							| 
									
										
										
										
											2020-07-23 03:21:26 -04:00
										 |  |  |         paging: false, | 
					
						
							|  |  |  |         info: false, | 
					
						
							| 
									
										
										
										
											2020-07-25 02:07:52 -04:00
										 |  |  |         dom: "t", | 
					
						
							| 
									
										
										
										
											2022-12-05 03:39:07 +01:00
										 |  |  |         stateSave: true, | 
					
						
							| 
									
										
										
										
											2024-06-01 17:07:58 +02:00
										 |  |  |         stateSaveCallback: function (settings, data) { | 
					
						
							| 
									
										
										
										
											2023-02-17 19:24:21 +01:00
										 |  |  |             delete data.search; | 
					
						
							| 
									
										
										
										
											2022-12-05 03:39:07 +01:00
										 |  |  |             localStorage.setItem(`DataTables_${settings.sInstance}_/tracker`, JSON.stringify(data)); | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2024-06-01 17:07:58 +02:00
										 |  |  |         stateLoadCallback: function (settings) { | 
					
						
							| 
									
										
										
										
											2022-12-05 03:39:07 +01:00
										 |  |  |             return JSON.parse(localStorage.getItem(`DataTables_${settings.sInstance}_/tracker`)); | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2024-06-01 17:07:58 +02:00
										 |  |  |         footerCallback: function (tfoot, data, start, end, display) { | 
					
						
							| 
									
										
										
										
											2023-08-29 14:58:49 -07:00
										 |  |  |             if (tfoot) { | 
					
						
							|  |  |  |                 const activityData = this.api().column('lastActivity:name').data().toArray().filter(x => !isNaN(x)); | 
					
						
							|  |  |  |                 Array.from(tfoot?.children).find(td => td.classList.contains('last-activity')).innerText = | 
					
						
							| 
									
										
										
										
											2024-06-01 17:07:58 +02:00
										 |  |  |                     (activityData.length) ? secondsToHours(Math.min(...activityData)) : 'None'; | 
					
						
							| 
									
										
										
										
											2023-08-29 14:58:49 -07:00
										 |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2021-06-25 21:05:44 +02:00
										 |  |  |         columnDefs: [ | 
					
						
							| 
									
										
										
										
											2023-08-29 14:58:49 -07:00
										 |  |  |             { | 
					
						
							|  |  |  |                 targets: 'last-activity', | 
					
						
							|  |  |  |                 name: 'lastActivity' | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2021-06-25 21:05:44 +02:00
										 |  |  |             { | 
					
						
							|  |  |  |                 targets: 'hours', | 
					
						
							|  |  |  |                 render: function (data, type, row) { | 
					
						
							|  |  |  |                     if (type === "sort" || type === 'type') { | 
					
						
							|  |  |  |                         if (data === "None") | 
					
						
							| 
									
										
										
										
											2023-11-10 22:13:32 -08:00
										 |  |  |                             return Number.MAX_VALUE; | 
					
						
							| 
									
										
										
										
											2021-06-25 21:05:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |                         return parseInt(data); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     if (data === "None") | 
					
						
							| 
									
										
										
										
											2021-06-25 21:15:54 +02:00
										 |  |  |                         return data; | 
					
						
							| 
									
										
										
										
											2021-06-25 21:05:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-29 14:58:49 -07:00
										 |  |  |                     return secondsToHours(data); | 
					
						
							| 
									
										
										
										
											2021-06-25 21:05:44 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2021-06-25 21:15:54 +02:00
										 |  |  |             { | 
					
						
							|  |  |  |                 targets: 'number', | 
					
						
							|  |  |  |                 render: function (data, type, row) { | 
					
						
							|  |  |  |                     if (type === "sort" || type === 'type') { | 
					
						
							|  |  |  |                         return parseFloat(data); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     return data; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 targets: 'fraction', | 
					
						
							|  |  |  |                 render: function (data, type, row) { | 
					
						
							|  |  |  |                     let splitted = data.split("/", 1); | 
					
						
							|  |  |  |                     let current = splitted[0] | 
					
						
							|  |  |  |                     if (type === "sort" || type === 'type') { | 
					
						
							|  |  |  |                         return parseInt(current); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     return data; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2021-06-25 21:05:44 +02:00
										 |  |  |         ], | 
					
						
							| 
									
										
										
										
											2020-07-23 03:21:26 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // DO NOT use the scrollX or scrollY options. They cause DataTables to split the thead from
 | 
					
						
							|  |  |  |         // the tbody and render two separate tables.
 | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 19:24:21 +01:00
										 |  |  |     const searchBox = document.getElementById("search"); | 
					
						
							|  |  |  |     searchBox.value = tables.search(); | 
					
						
							|  |  |  |     searchBox.focus(); | 
					
						
							|  |  |  |     searchBox.select(); | 
					
						
							|  |  |  |     const doSearch = () => { | 
					
						
							|  |  |  |         tables.search(searchBox.value); | 
					
						
							| 
									
										
										
										
											2020-07-25 02:07:52 -04:00
										 |  |  |         tables.draw(); | 
					
						
							| 
									
										
										
										
											2023-02-17 19:24:21 +01:00
										 |  |  |     }; | 
					
						
							|  |  |  |     searchBox.addEventListener("keyup", doSearch); | 
					
						
							|  |  |  |     window.addEventListener("keydown", (event) => { | 
					
						
							|  |  |  |         if (!event.ctrlKey && !event.altKey && event.key.length === 1 && document.activeElement !== searchBox) { | 
					
						
							|  |  |  |             searchBox.focus(); | 
					
						
							|  |  |  |             searchBox.select(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (!event.ctrlKey && !event.altKey && !event.shiftKey && event.key === "Escape") { | 
					
						
							|  |  |  |             if (searchBox.value !== "") { | 
					
						
							|  |  |  |                 searchBox.value = ""; | 
					
						
							|  |  |  |                 doSearch(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             searchBox.blur(); | 
					
						
							|  |  |  |             if (!document.getElementById("tables-container")) | 
					
						
							|  |  |  |                 window.scroll(0, 0); | 
					
						
							|  |  |  |             event.preventDefault(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-07-25 02:07:52 -04:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2024-06-01 17:07:58 +02:00
										 |  |  |     const target_second = parseInt(document.getElementById('tracker-wrapper').getAttribute('data-second')) + 3; | 
					
						
							|  |  |  |     console.log("Target second of refresh: " + target_second); | 
					
						
							| 
									
										
										
										
											2022-12-12 00:30:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-01 17:07:58 +02:00
										 |  |  |     function getSleepTimeSeconds() { | 
					
						
							| 
									
										
										
										
											2022-12-12 00:30:43 +01:00
										 |  |  |         // -40 % 60 is -40, which is absolutely wrong and should burn
 | 
					
						
							|  |  |  |         var sleepSeconds = (((target_second - new Date().getSeconds()) % 60) + 60) % 60; | 
					
						
							|  |  |  |         return sleepSeconds || 60; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-07-25 02:07:52 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-01 17:07:58 +02:00
										 |  |  |     let update_on_view = false; | 
					
						
							| 
									
										
										
										
											2020-07-23 03:21:26 -04:00
										 |  |  |     const update = () => { | 
					
						
							| 
									
										
										
										
											2024-06-01 17:07:58 +02:00
										 |  |  |         if (document.hidden) { | 
					
						
							|  |  |  |             console.log("Document reporting as not visible, not updating Tracker..."); | 
					
						
							|  |  |  |             update_on_view = true; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             update_on_view = false; | 
					
						
							|  |  |  |             const target = $("<div></div>"); | 
					
						
							|  |  |  |             console.log("Updating Tracker..."); | 
					
						
							|  |  |  |             target.load(location.href, function (response, status) { | 
					
						
							|  |  |  |                 if (status === "success") { | 
					
						
							|  |  |  |                     target.find(".table").each(function (i, new_table) { | 
					
						
							|  |  |  |                         const new_trs = $(new_table).find("tbody>tr"); | 
					
						
							|  |  |  |                         const footer_tr = $(new_table).find("tfoot>tr"); | 
					
						
							|  |  |  |                         const old_table = tables.eq(i); | 
					
						
							|  |  |  |                         const topscroll = $(old_table.settings()[0].nScrollBody).scrollTop(); | 
					
						
							|  |  |  |                         const leftscroll = $(old_table.settings()[0].nScrollBody).scrollLeft(); | 
					
						
							|  |  |  |                         old_table.clear(); | 
					
						
							|  |  |  |                         if (footer_tr.length) { | 
					
						
							|  |  |  |                             $(old_table.table).find("tfoot").html(footer_tr); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                         old_table.rows.add(new_trs); | 
					
						
							|  |  |  |                         old_table.draw(); | 
					
						
							|  |  |  |                         $(old_table.settings()[0].nScrollBody).scrollTop(topscroll); | 
					
						
							|  |  |  |                         $(old_table.settings()[0].nScrollBody).scrollLeft(leftscroll); | 
					
						
							|  |  |  |                     }); | 
					
						
							|  |  |  |                     $("#multi-stream-link").replaceWith(target.find("#multi-stream-link")); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     console.log("Failed to connect to Server, in order to update Table Data."); | 
					
						
							|  |  |  |                     console.log(response); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         updater = setTimeout(update, getSleepTimeSeconds() * 1000); | 
					
						
							| 
									
										
										
										
											2020-07-23 03:21:26 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-06-01 17:07:58 +02:00
										 |  |  |     let updater = setTimeout(update, getSleepTimeSeconds() * 1000); | 
					
						
							| 
									
										
										
										
											2020-07-23 03:21:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-25 22:07:35 -04:00
										 |  |  |     window.addEventListener('resize', () => { | 
					
						
							|  |  |  |         adjustTableHeight(); | 
					
						
							| 
									
										
										
										
											2021-02-19 15:18:26 +01:00
										 |  |  |         tables.draw(); | 
					
						
							| 
									
										
										
										
											2020-07-25 22:07:35 -04:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-07-25 02:07:52 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-01 17:07:58 +02:00
										 |  |  |     window.addEventListener('visibilitychange', () => { | 
					
						
							|  |  |  |         if (!document.hidden && update_on_view) { | 
					
						
							|  |  |  |             console.log("Page became visible, tracker should be refreshed."); | 
					
						
							|  |  |  |             clearTimeout(updater); | 
					
						
							|  |  |  |             update(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-25 22:07:35 -04:00
										 |  |  |     adjustTableHeight(); | 
					
						
							| 
									
										
										
										
											2020-07-23 20:54:25 -04:00
										 |  |  | }); |