job-window.vue 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <template>
  2. <div class="job-window">
  3. <div v-for="job in sortedJobs"
  4. v-bind:key="job.identifier"
  5. class="job">
  6. <div v-if="job.finished"
  7. class="remove" @click="removeJob(job.identifier)">
  8. <img alt="remove" src="@/assets/icons/x-circle.svg">
  9. </div>
  10. <div class="subtitle">{{ job.type }}</div>
  11. <div class="title">{{ job.name }}</div>
  12. <div v-if="job.exception" class="error">{{ job.exception }}</div>
  13. <progress-bar v-if="!job.finished"
  14. :progress="job.progress"/>
  15. </div>
  16. </div>
  17. </template>
  18. <script>
  19. import ProgressBar from "@/components/base/progress-bar";
  20. export default {
  21. name: "job-window",
  22. components: {ProgressBar},
  23. props: ['jobs'],
  24. computed: {
  25. sortedJobs: function () {
  26. return [...this.jobs].sort((j, k) => j.updated < k.updated ? +1 : -1);
  27. }
  28. },
  29. methods: {
  30. removeJob: function (id) {
  31. this.$root.socket.post(`/jobs/${id}/remove`, {remove: true});
  32. }
  33. }
  34. }
  35. </script>
  36. <style scoped>
  37. .job-window {
  38. position: absolute;
  39. top: 100%;
  40. right: 0;
  41. width: 100vw;
  42. max-width: 24rem;
  43. max-height: calc(100vh - 100%);
  44. padding: 0.75rem;
  45. background-color: rgba(40, 40, 40, 0.8);
  46. z-index: 99;
  47. overflow: auto;
  48. }
  49. .job {
  50. border: 1px solid rgba(255, 255, 255, 0.4);
  51. border-radius: 0.25rem;
  52. padding: 0.5rem;
  53. background-color: #7f7f7f;
  54. position: relative;
  55. }
  56. .job:not(:last-child) {
  57. margin-bottom: 1rem;
  58. }
  59. .remove {
  60. position: absolute;
  61. top: 0;
  62. right: 0;
  63. padding: 0.5rem;
  64. }
  65. .remove img {
  66. width: 1rem;
  67. filter: invert(1);
  68. }
  69. .subtitle {
  70. font-size: 70%;
  71. }
  72. .title {
  73. font-size: 90%;
  74. }
  75. .error {
  76. color: #FF1111;
  77. font-size: 80%;
  78. }
  79. .progress-bar {
  80. height: 0.7rem;
  81. border-color: whitesmoke;
  82. margin-top: 0.2rem;
  83. }
  84. </style>