main.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. 'use strict'
  2. import { createClient } from '@connectrpc/connect'
  3. import { createConnectTransport } from '@connectrpc/connect-web'
  4. import { OliveTinApiService } from './resources/scripts/gen/olivetin/api/v1/olivetin_pb'
  5. import { createApp } from 'vue'
  6. import router from './resources/vue/router.js';
  7. import App from './resources/vue/App.vue';
  8. import {
  9. initMarshaller,
  10. setupSectionNavigation,
  11. marshalDashboardComponentsJsonToHtml,
  12. refreshServerConnectionLabel
  13. } from './js/marshaller.js'
  14. import { checkWebsocketConnection } from './js/websocket.js'
  15. function searchLogs (e) {
  16. document.getElementById('searchLogsClear').disabled = false
  17. const searchText = e.target.value.toLowerCase()
  18. for (const row of document.querySelectorAll('tr.log-row')) {
  19. const actionTitle = row.getAttribute('title').toLowerCase()
  20. row.hidden = !actionTitle.includes(searchText)
  21. }
  22. }
  23. function searchLogsClear () {
  24. for (const row of document.querySelectorAll('tr.log-row')) {
  25. row.hidden = false
  26. }
  27. document.getElementById('searchLogsClear').disabled = true
  28. document.getElementById('logSearchBox').value = ''
  29. }
  30. function refreshLoop () {
  31. checkWebsocketConnection()
  32. // fetchGetDashboardComponents()
  33. // fetchGetLogs()
  34. refreshServerConnectionLabel()
  35. }
  36. async function fetchGetDashboardComponents () {
  37. try {
  38. const res = await window.client.getDashboardComponents()
  39. marshalDashboardComponentsJsonToHtml(res)
  40. refreshServerConnectionLabel() // in-case it changed, update the label quicker
  41. } catch(err) {
  42. window.showBigError('fetch-buttons', 'getting buttons', err, false)
  43. }
  44. }
  45. function processWebuiSettingsJson (settings) {
  46. setupSectionNavigation(settings.SectionNavigationStyle)
  47. window.restBaseUrl = settings.Rest
  48. document.querySelector('#currentVersion').innerText = settings.CurrentVersion
  49. if (settings.ShowNewVersions && settings.AvailableVersion !== 'none') {
  50. document.querySelector('#available-version').innerText = 'New Version Available: ' + settings.AvailableVersion
  51. document.querySelector('#available-version').hidden = false
  52. }
  53. if (!settings.ShowNavigation) {
  54. document.querySelector('header').style.display = 'none'
  55. }
  56. if (!settings.ShowFooter) {
  57. document.querySelector('footer[title="footer"]').style.display = 'none'
  58. }
  59. if (settings.EnableCustomJs) {
  60. const script = document.createElement('script')
  61. script.src = './custom-webui/custom.js'
  62. document.head.appendChild(script)
  63. }
  64. window.pageTitle = 'OliveTin'
  65. if (settings.PageTitle) {
  66. window.pageTitle = settings.PageTitle
  67. document.title = window.pageTitle
  68. const titleElem = document.querySelector('#page-title')
  69. if (titleElem) titleElem.innerText = window.pageTitle
  70. }
  71. processAdditionalLinks(settings.AdditionalLinks)
  72. window.settings = settings
  73. }
  74. function processAdditionalLinks (links) {
  75. if (links === null) {
  76. return
  77. }
  78. if (links.length > 0) {
  79. for (const link of links) {
  80. const linkA = document.createElement('a')
  81. linkA.href = link.Url
  82. linkA.innerText = link.Title
  83. if (link.Target === '') {
  84. linkA.target = '_blank'
  85. } else {
  86. linkA.target = link.Target
  87. }
  88. const linkLi = document.createElement('li')
  89. linkLi.appendChild(linkA)
  90. document.getElementById('supplemental-links').prepend(linkLi)
  91. }
  92. }
  93. }
  94. function initClient () {
  95. const transport = createConnectTransport({
  96. baseUrl: window.location.protocol + '//' + window.location.host + '/api/',
  97. })
  98. window.client = createClient(OliveTinApiService, transport)
  99. }
  100. function setupVue () {
  101. const app = createApp(App)
  102. app.use(router);
  103. app.mount('#app')
  104. }
  105. function main () {
  106. setupVue();
  107. initClient()
  108. initMarshaller()
  109. window.addEventListener('EventConfigChanged', fetchGetDashboardComponents)
  110. window.addEventListener('EventEntityChanged', fetchGetDashboardComponents)
  111. window.fetch('webUiSettings.json').then(res => {
  112. return res.json()
  113. }).then(res => {
  114. processWebuiSettingsJson(res)
  115. fetchGetDashboardComponents()
  116. window.restAvailable = true
  117. window.refreshLoop = refreshLoop
  118. window.refreshLoop()
  119. setInterval(refreshLoop, 3000)
  120. }).catch(err => {
  121. window.showBigError('fetch-webui-settings', 'getting webui settings', err)
  122. })
  123. }
  124. main() // call self