From e2d04a72e95b0c58e99a23bba388016a014d3504 Mon Sep 17 00:00:00 2001
From: ml bonhomme <bonhomme@teklia.com>
Date: Wed, 25 Oct 2023 14:30:34 +0000
Subject: [PATCH] Change worker version display when worker is not linked to a
 repository

---
 .../Process/Workers/Versions/List.vue         | 51 +++++++++++--------
 .../Process/Workers/Versions/Row.vue          | 46 +++++++++--------
 src/stores/workers.ts                         |  4 +-
 src/types/worker.ts                           |  4 ++
 src/views/Process/Workers/List.vue            | 10 ++--
 src/views/Process/Workers/Manage.vue          |  7 ++-
 6 files changed, 74 insertions(+), 48 deletions(-)

diff --git a/src/components/Process/Workers/Versions/List.vue b/src/components/Process/Workers/Versions/List.vue
index b5822e8c1..7c4f0bc5a 100644
--- a/src/components/Process/Workers/Versions/List.vue
+++ b/src/components/Process/Workers/Versions/List.vue
@@ -1,11 +1,13 @@
 <template>
-  <input
-    id="switchAll"
-    type="checkbox"
-    class="switch is-rtl is-rounded is-info"
-    v-model="advancedMode"
-  />
-  <label class="is-pulled-right" for="switchAll">Display all versions</label>
+  <template v-if="worker.repository_id">
+    <input
+      id="switchAll"
+      type="checkbox"
+      class="switch is-rtl is-rounded is-info"
+      v-model="advancedMode"
+    />
+    <label class="is-pulled-right" for="switchAll">Display all versions</label>
+  </template>
   <h2 class="title is-4">Versions</h2>
   <span class="is-clearfix"></span>
   <div v-if="versionsError" class="notification is-warning">{{ versionsError }}</div>
@@ -23,11 +25,17 @@
       <thead>
         <tr>
           <th>Id</th>
-          <th>Hash</th>
-          <th>Message</th>
-          <th>Author</th>
-          <th>Created</th>
-          <th>References</th>
+          <template v-if="worker.repository_id">
+            <th>Hash</th>
+            <th>Message</th>
+            <th>Author</th>
+            <th>Created</th>
+            <th>References</th>
+          </template>
+          <template v-else>
+            <th>Created</th>
+            <th>Version</th>
+          </template>
           <th>State</th>
           <th v-if="processId || selectable">Actions</th>
         </tr>
@@ -47,7 +55,7 @@
 </template>
 
 <script lang="ts">
-import { defineComponent } from 'vue'
+import { PropType, defineComponent } from 'vue'
 import { mapActions } from 'pinia'
 import { errorParser } from '@/helpers'
 import Paginator from '@/components/Paginator.vue'
@@ -55,7 +63,7 @@ import Row from './Row.vue'
 import { useNotificationStore, useWorkerStore } from '@/stores'
 import { WorkerVersionListParameters } from '@/api'
 import { PageNumberPagination } from '@/types'
-import { WorkerVersion } from '@/types/worker'
+import { WorkerVersion, Worker } from '@/types/worker'
 
 export default defineComponent({
   components: {
@@ -70,8 +78,8 @@ export default defineComponent({
       default: false
     },
     // Lists versions related to a specific worker
-    workerId: {
-      type: String,
+    worker: {
+      type: Object as PropType<Worker>,
       required: true
     },
     /*
@@ -104,13 +112,15 @@ export default defineComponent({
       this.versionsPage = null
       this.versionsError = null
       this.loading = true
+      let mode = 'complete' as WorkerVersionListParameters['mode']
+      if (this.worker.repository_id) mode = this.advancedMode ? 'complete' : 'simple'
       const payload: WorkerVersionListParameters = {
         page: this.page,
         page_size: this.pageSize,
-        mode: this.advancedMode ? 'complete' : 'simple'
+        mode
       }
       try {
-        this.versionsPage = await this.listVersions(this.workerId, payload)
+        this.versionsPage = await this.listVersions(this.worker.id, payload)
       } catch (err) {
         this.versionsError = errorParser(err)
       } finally {
@@ -120,9 +130,10 @@ export default defineComponent({
   },
   watch: {
     page: 'fetchVersions',
-    workerId: {
+    worker: {
       immediate: true,
-      handler () {
+      handler (newValue, oldValue) {
+        if (oldValue?.id === newValue.id) return
         this.page = 1
         this.fetchVersions()
       }
diff --git a/src/components/Process/Workers/Versions/Row.vue b/src/components/Process/Workers/Versions/Row.vue
index f92cd5047..47b432a26 100644
--- a/src/components/Process/Workers/Versions/Row.vue
+++ b/src/components/Process/Workers/Versions/Row.vue
@@ -1,27 +1,33 @@
 <template>
   <tr>
-    <td class="shrink">
+    <td :class="{ 'shrink': version.revision }">
       <ItemId :item-id="version.id" />
     </td>
-    <td class="shrink">
-      <a v-if="version.revision" :href="version.revision.commit_url" target="_blank">
-        <samp>{{ version.revision.hash.substring(0,8) }}</samp>
-      </a>
-      <span v-else>—</span>
-    </td>
-    <td>{{ version?.revision?.message || '—' }}</td>
-    <td>{{ version?.revision?.author || '—' }}</td>
-    <td>{{ created(version.created) }}</td>
-    <td class="shrink">
-      <span
-        v-for="ref in version?.revision?.refs || []"
-        :key="ref.name"
-        class="tag mr-3"
-        :class="refClass(ref.type)"
-      >
-        {{ ref.name }}
-      </span>
-    </td>
+    <template v-if="version.revision">
+      <td class="shrink">
+        <a v-if="version.revision" :href="version.revision.commit_url" target="_blank">
+          <samp>{{ version.revision.hash.substring(0,8) }}</samp>
+        </a>
+        <span v-else>—</span>
+      </td>
+      <td>{{ version.revision.message || '—' }}</td>
+      <td>{{ version.revision.author || '—' }}</td>
+      <td>{{ created(version.created) }}</td>
+      <td class="shrink">
+        <span
+          v-for="ref in version.revision.refs || []"
+          :key="ref.name"
+          class="tag mr-3"
+          :class="refClass(ref.type)"
+        >
+          {{ ref.name }}
+        </span>
+      </td>
+    </template>
+    <template v-else>
+      <td>{{ created(version.created) }}</td>
+      <td>{{ version.version }}</td>
+    </template>
     <td class="shrink">
       <span class="tag" :class="stateClass(version.state)">
         {{ capitalize(version.state) }}
diff --git a/src/stores/workers.ts b/src/stores/workers.ts
index a55ed9352..2f55e335d 100644
--- a/src/stores/workers.ts
+++ b/src/stores/workers.ts
@@ -150,7 +150,9 @@ export const useWorkerStore = defineStore('worker', {
       }
       this.workers = {
         ...this.workers,
-        ...Object.fromEntries(resp.results.map(v => [v.worker.id, v.worker]))
+        ...Object.fromEntries(resp.results.map(v =>
+          [v.worker.id, { ...(this.workers[v.worker.id] ?? {}), ...v.worker }]
+        ))
       }
       return resp
     },
diff --git a/src/types/worker.ts b/src/types/worker.ts
index 7dfb917ff..1ba9fae59 100644
--- a/src/types/worker.ts
+++ b/src/types/worker.ts
@@ -19,6 +19,10 @@ export interface Worker extends WorkerLight {
   repository_id: UUID
 }
 
+export function isWorker(worker: WorkerLight): worker is Worker {
+  return ('repository_id' in worker && (worker.repository_id === null || typeof worker.repository_id === 'string'))
+}
+
 export type UserConfiguration = Record<string, UserConfigurationField>
 
 interface WorkerVersionConfiguration {
diff --git a/src/views/Process/Workers/List.vue b/src/views/Process/Workers/List.vue
index 190f782f1..f97872082 100644
--- a/src/views/Process/Workers/List.vue
+++ b/src/views/Process/Workers/List.vue
@@ -55,9 +55,9 @@
                 <tr
                   v-for="worker in results"
                   :key="worker.id"
-                  v-on:click="selectedWorker = worker.id"
+                  v-on:click="selectedWorker = worker"
                   class="is-clickable"
-                  :class="{ 'is-selected': selectedWorker === worker.id }"
+                  :class="{ 'is-selected': selectedWorker?.id === worker.id }"
                 >
                   <td>
                     <WorkerTag :worker="worker" />
@@ -74,7 +74,7 @@
         </div>
         <template v-else>
           <VersionList
-            :worker-id="selectedWorker"
+            :worker="selectedWorker"
             :process-id="processId"
             :selectable="selectable"
             v-on:selected-version="$emit('selected-version', $event)"
@@ -84,7 +84,7 @@
             <h2 class="title is-4">Members</h2>
             <ListMembers
               content-type="worker"
-              :content-id="selectedWorker"
+              :content-id="selectedWorker.id"
               v-model:page-number="membersPageNumber"
             />
           </template>
@@ -151,7 +151,7 @@ export default {
     loading: false,
     workersPage: null,
     membersPageNumber: 1,
-    // ID of the selected worker
+    // Selected worker
     selectedWorker: null,
     page: 1,
     nameFilter: '',
diff --git a/src/views/Process/Workers/Manage.vue b/src/views/Process/Workers/Manage.vue
index 7e224fc9a..d1e783783 100644
--- a/src/views/Process/Workers/Manage.vue
+++ b/src/views/Process/Workers/Manage.vue
@@ -9,7 +9,7 @@
       <div class="title">{{ worker.name }}</div>
 
       <hr />
-      <VersionList :worker-id="workerId" />
+      <VersionList :worker="worker" />
 
       <hr />
       <h2 class="title is-4">Members</h2>
@@ -30,6 +30,7 @@ import { errorParser } from '@/helpers'
 import VersionList from '@/components/Process/Workers/Versions/List.vue'
 import ListMembers from '@/components/Memberships/ListMembers.vue'
 import { useNotificationStore, useWorkerStore } from '@/stores'
+import { isWorker } from '@/types/worker'
 
 export default defineComponent({
   props: {
@@ -52,7 +53,9 @@ export default defineComponent({
   computed: {
     ...mapState(useWorkerStore, ['workers']),
     worker () {
-      return this.workers[this.workerId]
+      const worker = this.workers[this.workerId]
+      if (!worker || !isWorker(worker)) return
+      return worker
     }
   },
   methods: {
-- 
GitLab