ExecutionDialog.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // This ExecutionDialog is NOT a custom HTML element, but rather just picks up
  2. // the <dialog /> element out of index.html and just re-uses that - as only
  3. // one dialog can be shown at a time.
  4. export class ExecutionDialog {
  5. show (json) {
  6. this.executionUuid = json
  7. this.dlg = document.querySelector('dialog#execution-results-popup')
  8. this.domIcon = document.getElementById('execution-dialog-icon')
  9. this.domTitle = document.getElementById('execution-dialog-title')
  10. this.domStdout = document.getElementById('execution-dialog-stdout')
  11. this.domStderr = document.getElementById('execution-dialog-stderr')
  12. this.domDatetimeStarted = document.getElementById('execution-dialog-datetime-started')
  13. this.domDatetimeFinished = document.getElementById('execution-dialog-datetime-finished')
  14. this.domExitCode = document.getElementById('execution-dialog-exit-code')
  15. this.domStatus = document.getElementById('execution-dialog-status')
  16. this.domTitle.innerText = 'Loading...'
  17. this.domExitCode.innerText = '?'
  18. this.domStatus.className = ''
  19. this.domDatetimeStarted.innerText = ''
  20. this.domDatetimeFinished.innerText = ''
  21. this.domStdout.innerText = ''
  22. this.domStderr.innerText = ''
  23. this.dlg.showModal()
  24. this.fetchExecutionResult()
  25. }
  26. fetchExecutionResult () {
  27. const executionStatusArgs = {
  28. executionUuid: this.executionUuid
  29. }
  30. window.fetch(window.restBaseUrl + 'ExecutionStatus', {
  31. method: 'POST',
  32. headers: {
  33. 'Content-Type': 'application/json'
  34. },
  35. body: JSON.stringify(executionStatusArgs)
  36. }).then((res) => {
  37. if (res.ok) {
  38. return res.json()
  39. } else {
  40. throw new Error(res.statusText)
  41. }
  42. }
  43. ).then((json) => {
  44. this.renderResult(json)
  45. }).catch(err => {
  46. this.renderError(err)
  47. })
  48. }
  49. renderResult (res) {
  50. this.executionUuid = res.logEntry.executionUuid
  51. if (res.logEntry.executionFinished) {
  52. this.domStatus.innerText = 'Completed'
  53. this.domStatus.classList.add('action-success')
  54. this.domDatetimeFinished.innerText = res.logEntry.datetimeFinished
  55. if (res.logEntry.timedOut) {
  56. this.domExitCode.innerText = 'Timed out'
  57. this.domStatus.classList.add('action-timeout')
  58. } else if (res.logEntry.blocked) {
  59. this.domStatus.innerText = 'Blocked'
  60. this.domStatus.classList.add('action-blocked')
  61. } else if (res.logEntry.exitCode !== 0) {
  62. this.domStatus.innerText = 'Non-Zero Exit'
  63. this.domStatus.classList.add('action-nonzero-exit')
  64. } else {
  65. this.domExitCode.innerText = res.logEntry.exitCode
  66. }
  67. } else {
  68. this.domDatetimeFinished.innerText = 'Still running...'
  69. this.domExitCode.innerText = 'Still running...'
  70. this.domStatus.innerText = 'Still running...'
  71. }
  72. this.domIcon.innerHTML = res.logEntry.actionIcon
  73. this.domTitle.innerText = res.logEntry.actionTitle
  74. this.domStdout.innerText = res.logEntry.stdout
  75. this.domStdout.innerText = res.logEntry.stdout
  76. if (res.logEntry.stderr === '') {
  77. this.domStderr.parentElement.style.display = 'none'
  78. this.domStderr.innerText = res.logEntry.stderr
  79. } else {
  80. this.domStderr.parentElement.style.display = 'block'
  81. this.domStderr.innerText = res.logEntry.stderr
  82. }
  83. this.domDatetimeStarted.innerText = res.logEntry.datetimeStarted
  84. }
  85. renderError (err) {
  86. this.dlg.querySelector('pre').innerText = JSON.stringify(err)
  87. }
  88. }