main.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. 'use strict'
  2. import { initMarshaller, setupSectionNavigation, marshalDashboardComponentsJsonToHtml, marshalLogsJsonToHtml } from './js/marshaller.js'
  3. import { checkWebsocketConnection } from './js/websocket.js'
  4. function searchLogs (e) {
  5. document.getElementById('searchLogsClear').disabled = false
  6. const searchText = e.target.value.toLowerCase()
  7. for (const row of document.querySelectorAll('tr.log-row')) {
  8. const actionTitle = row.getAttribute('title').toLowerCase()
  9. row.hidden = !actionTitle.includes(searchText)
  10. }
  11. }
  12. function searchLogsClear () {
  13. for (const row of document.querySelectorAll('tr.log-row')) {
  14. row.hidden = false
  15. }
  16. document.getElementById('searchLogsClear').disabled = true
  17. document.getElementById('logSearchBox').value = ''
  18. }
  19. function setupLogSearchBox () {
  20. document.getElementById('logSearchBox').oninput = searchLogs
  21. document.getElementById('searchLogsClear').onclick = searchLogsClear
  22. }
  23. function refreshLoop () {
  24. if (window.websocketAvailable) {
  25. // Websocket updates are streamed live, not updated on a loop.
  26. } else if (window.restAvailable) {
  27. // Fallback to rest, but try to reconnect the websocket anyway.
  28. fetchGetDashboardComponents()
  29. fetchGetLogs()
  30. checkWebsocketConnection()
  31. } else {
  32. // Still try to fetch the dashboard, if successfull window.restAvailable = true
  33. fetchGetDashboardComponents()
  34. }
  35. refreshServerConnectionLabel()
  36. }
  37. function refreshServerConnectionLabel () {
  38. if (window.restAvailable) {
  39. document.querySelector('#serverConnectionRest').classList.remove('error')
  40. } else {
  41. document.querySelector('#serverConnectionRest').classList.add('error')
  42. }
  43. if (window.websocketAvailable) {
  44. document.querySelector('#serverConnectionWebSocket').classList.remove('error')
  45. } else {
  46. document.querySelector('#serverConnectionWebSocket').classList.add('error')
  47. }
  48. }
  49. function fetchGetDashboardComponents () {
  50. window.fetch(window.restBaseUrl + 'GetDashboardComponents', {
  51. cors: 'cors'
  52. }).then(res => {
  53. return res.json()
  54. }).then(res => {
  55. if (!window.restAvailable) {
  56. window.clearBigErrors('fetch-buttons')
  57. }
  58. window.restAvailable = true
  59. marshalDashboardComponentsJsonToHtml(res)
  60. refreshServerConnectionLabel() // in-case it changed, update the label quicker
  61. }).catch((err) => { // err is 1st arg
  62. window.restAvailable = false
  63. window.showBigError('fetch-buttons', 'getting buttons', err, 'blat')
  64. })
  65. }
  66. function fetchGetLogs () {
  67. window.fetch(window.restBaseUrl + 'GetLogs', {
  68. cors: 'cors'
  69. }).then(res => {
  70. return res.json()
  71. }).then(res => {
  72. marshalLogsJsonToHtml(res)
  73. }).catch(err => {
  74. window.showBigError('fetch-buttons', 'getting buttons', err, 'blat')
  75. })
  76. }
  77. function processWebuiSettingsJson (settings) {
  78. window.restBaseUrl = settings.Rest
  79. if (settings.ThemeName) {
  80. const themeCss = document.createElement('link')
  81. themeCss.setAttribute('rel', 'stylesheet')
  82. themeCss.setAttribute('type', 'text/css')
  83. themeCss.setAttribute('href', '/themes/' + settings.ThemeName + '/theme.css')
  84. document.head.appendChild(themeCss)
  85. }
  86. document.querySelector('#currentVersion').innerText = settings.CurrentVersion
  87. if (settings.ShowNewVersions && settings.AvailableVersion !== 'none') {
  88. document.querySelector('#available-version').innerText = 'New Version Available: ' + settings.AvailableVersion
  89. document.querySelector('#available-version').hidden = false
  90. }
  91. document.querySelector('#perma-widget').hidden = !settings.ShowNavigation
  92. document.querySelector('footer[title="footer"]').hidden = !settings.ShowFooter
  93. if (settings.PageTitle) {
  94. document.title = settings.PageTitle
  95. const titleElem = document.querySelector('#page-title')
  96. if (titleElem) titleElem.innerText = settings.PageTitle
  97. }
  98. }
  99. function main () {
  100. initMarshaller()
  101. setupLogSearchBox()
  102. setupSectionNavigation('sidebar')
  103. window.fetch('webUiSettings.json').then(res => {
  104. return res.json()
  105. }).then(res => {
  106. processWebuiSettingsJson(res)
  107. window.restAvailable = true
  108. window.refreshLoop = refreshLoop
  109. window.refreshLoop()
  110. setInterval(refreshLoop, 3000)
  111. }).catch(err => {
  112. window.showBigError('fetch-webui-settings', 'getting webui settings', err)
  113. })
  114. }
  115. main() // call self