4
0
Эх сурвалжийг харах

feat: action status display on logs list (#770)

James Read 7 сар өмнө
parent
commit
f15f0ef329

+ 31 - 8
frontend/resources/vue/components/ActionStatusDisplay.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
-    <span>
-        <span :class="['action-status', statusClass]">{{ statusText }}</span><span>{{ exitCodeText }}</span>
-    </span>
+    <div :class = "statusClass + ' annotation'">
+        <span>{{ statusText }}</span><span>{{ exitCodeText }}</span>
+    </div>
 
 
 </template>
 </template>
 
 
@@ -35,11 +35,14 @@ const statusText = computed(() => {
 const exitCodeText = computed(() => {
 const exitCodeText = computed(() => {
     const logEntry = props.logEntry
     const logEntry = props.logEntry
     if (!logEntry) return ''
     if (!logEntry) return ''
+    if (logEntry.exitCode === 0) {
+        return ''
+    }
     if (logEntry.executionFinished) {
     if (logEntry.executionFinished) {
         if (logEntry.blocked || logEntry.timedOut) {
         if (logEntry.blocked || logEntry.timedOut) {
             return ''
             return ''
         }
         }
-        return ' Exit code: ' + logEntry.exitCode
+        return ' (Exit code: ' + logEntry.exitCode + ')'
     }
     }
     return ''
     return ''
 })
 })
@@ -49,15 +52,35 @@ const statusClass = computed(() => {
     if (!logEntry) return ''
     if (!logEntry) return ''
     if (logEntry.executionFinished) {
     if (logEntry.executionFinished) {
         if (logEntry.blocked) {
         if (logEntry.blocked) {
-            return 'action-blocked'
+            return 'status-blocked'
         } else if (logEntry.timedOut) {
         } else if (logEntry.timedOut) {
-            return 'action-timeout'
+            return 'status-timeout'
         } else if (logEntry.exitCode === 0) {
         } else if (logEntry.exitCode === 0) {
-            return 'action-success'
+            return 'status-success'
         } else {
         } else {
-            return 'action-nonzero-exit'
+            return 'status-nonzero-exit'
         }
         }
     }
     }
     return ''
     return ''
 })
 })
 </script>
 </script>
+
+<style scoped>
+.status-success {
+  color: var(--karma-good-fg);
+}
+
+.status-nonzero-exit {
+  color: var(--karma-bad-fg);
+}
+
+.status-timeout {
+  color: var(--karma-warning-fg);
+}
+
+.status-blocked {
+  color: #ca79ff;
+}
+
+
+</style>

+ 2 - 33
frontend/resources/vue/views/LogsListView.vue

@@ -46,9 +46,7 @@
                 </span>
                 </span>
               </td>
               </td>
               <td class="exit-code">
               <td class="exit-code">
-                <span :class="getStatusClass(log) + ' annotation'">
-                  {{ getStatusText(log) }}
-                </span>
+                <ActionStatusDisplay :logEntry="log" />
               </td>
               </td>
             </tr>
             </tr>
           </tbody>
           </tbody>
@@ -70,6 +68,7 @@ import { ref, computed, onMounted } from 'vue'
 import Pagination from 'picocrank/vue/components/Pagination.vue'
 import Pagination from 'picocrank/vue/components/Pagination.vue'
 import Section from 'picocrank/vue/components/Section.vue'
 import Section from 'picocrank/vue/components/Section.vue'
 import { useI18n } from 'vue-i18n'
 import { useI18n } from 'vue-i18n'
+import ActionStatusDisplay from '../components/ActionStatusDisplay.vue'
 
 
 const logs = ref([])
 const logs = ref([])
 const searchText = ref('')
 const searchText = ref('')
@@ -134,20 +133,6 @@ function formatTimestamp(timestamp) {
   }
   }
 }
 }
 
 
-function getStatusClass(log) {
-  if (log.timedOut) return 'status-timeout'
-  if (log.blocked) return 'status-blocked'
-  if (log.exitCode !== 0) return 'status-error'
-  return 'status-success'
-}
-
-function getStatusText(log) {
-  if (log.timedOut) return t('logs.timed-out')
-  if (log.blocked) return t('logs.blocked')
-  if (log.exitCode !== 0) return `${t('logs.exit-code')} ${log.exitCode}`
-  return t('logs.completed')
-}
-
 function handlePageChange(page) {
 function handlePageChange(page) {
   currentPage.value = page
   currentPage.value = page
   fetchLogs()
   fetchLogs()
@@ -227,22 +212,6 @@ onMounted(() => {
   font-size: smaller;
   font-size: smaller;
 }
 }
 
 
-.status-success {
-  color: var(--karma-good-fg);
-}
-
-.status-error {
-  color: var(--karma-bad-fg);
-}
-
-.status-timeout {
-  color: var(--karma-warning-fg);
-}
-
-.status-blocked {
-  color: var(--karma-neutral-fg);
-}
-
 .empty-state {
 .empty-state {
   text-align: center;
   text-align: center;
   padding: 2rem;
   padding: 2rem;

+ 13 - 3
service/internal/api/api.go

@@ -363,15 +363,25 @@ func (api *oliveTinAPI) Logout(ctx ctx.Context, req *connect.Request[apiv1.Logou
 
 
 	response := connect.NewResponse(&apiv1.LogoutResponse{})
 	response := connect.NewResponse(&apiv1.LogoutResponse{})
 
 
-	// Clear the authentication cookie by setting it to expire
-	cookie := &http.Cookie{
+	// Clear the local authentication cookie by setting it to expire
+	localCookie := &http.Cookie{
 		Name:     "olivetin-sid-local",
 		Name:     "olivetin-sid-local",
 		Value:    "",
 		Value:    "",
 		MaxAge:   -1, // This tells the browser to delete the cookie
 		MaxAge:   -1, // This tells the browser to delete the cookie
 		HttpOnly: true,
 		HttpOnly: true,
 		Path:     "/",
 		Path:     "/",
 	}
 	}
-	response.Header().Set("Set-Cookie", cookie.String())
+	response.Header().Set("Set-Cookie", localCookie.String())
+
+	// Clear the OAuth2 authentication cookie by setting it to expire
+	oauth2Cookie := &http.Cookie{
+		Name:     "olivetin-sid-oauth",
+		Value:    "",
+		MaxAge:   -1, // This tells the browser to delete the cookie
+		HttpOnly: true,
+		Path:     "/",
+	}
+	response.Header().Add("Set-Cookie", oauth2Cookie.String())
 
 
 	return response, nil
 	return response, nil
 }
 }