This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit 1a4b75609ebcffc0c1caf5fd3e3151e83f5b5a5d
Author: Marcus Christie <machris...@apache.org>
AuthorDate: Fri Mar 20 17:26:37 2020 -0400

    AIRAVATA-3126 Add support for deleting all expired reservations
---
 .../ComputePreference.vue                          | 10 ++++--
 .../ComputeResourceReservationList.vue             | 38 +++++++++++++++-------
 .../js/models/ComputeResourceReservation.js        |  4 +++
 .../static/common/js/components/DeleteButton.vue   |  6 +++-
 .../static/common/js/layouts/ListLayout.vue        |  2 ++
 5 files changed, 46 insertions(+), 14 deletions(-)

diff --git 
a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputePreference.vue
 
b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputePreference.vue
index 74294d8..5ad366e 100644
--- 
a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputePreference.vue
+++ 
b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputePreference.vue
@@ -479,10 +479,16 @@ export default {
     addReservation(reservation) {
       this.data.reservations.push(reservation);
     },
-    deleteReservation(reservationIndex) {
+    deleteReservation(reservation) {
+      const reservationIndex = this.data.reservations.findIndex(
+        r => r.key === reservation.key
+      );
       this.data.reservations.splice(reservationIndex, 1);
     },
-    updateReservation(reservation, reservationIndex) {
+    updateReservation(reservation) {
+      const reservationIndex = this.data.reservations.findIndex(
+        r => r.key === reservation.key
+      );
       this.data.reservations.splice(reservationIndex, 1, reservation);
     }
   },
diff --git 
a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputeResourceReservationList.vue
 
b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputeResourceReservationList.vue
index 2415291..8c23922 100644
--- 
a/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputeResourceReservationList.vue
+++ 
b/django_airavata/apps/admin/static/django_airavata_admin/src/components/admin/group_resource_preferences/ComputeResourceReservationList.vue
@@ -6,6 +6,16 @@
     new-item-button-text="New Reservation"
     :new-button-disabled="readonly"
   >
+    <template slot="additional-buttons">
+      <delete-button
+        class="mr-2"
+        @delete="deleteAllExpiredReservations"
+        label="Delete All Expired"
+        :disabled="expiredReservations.length === 0"
+      >
+        Are you sure you want to delete all expired reservations?
+      </delete-button>
+    </template>
     <template slot="new-item-editor">
       <b-card v-if="showNewItemEditor" title="New Reservation">
         <compute-resource-reservation-editor
@@ -38,12 +48,15 @@
     </template>
     <template slot="item-list" slot-scope="slotProps">
       <b-table
-        striped
         hover
         :fields="fields"
         :items="slotProps.items"
         sort-by="startTime"
       >
+        <template slot="reservationName" slot-scope="data">
+          {{ data.value }}
+          <b-badge v-if="data.item.isExpired">Expired</b-badge>
+        </template>
         <template slot="queueNames" slot-scope="data">
           <ul v-for="queueName in data.item.queueNames" :key="queueName">
             <li>{{ queueName }}</li>
@@ -54,7 +67,7 @@
             v-if="!readonly"
             class="action-link"
             @click="toggleDetails(data)"
-              :disabled="isReservationInvalid(data.item.key)"
+            :disabled="isReservationInvalid(data.item.key)"
           >
             Edit
             <i class="fa fa-edit" aria-hidden="true"></i>
@@ -101,7 +114,8 @@ export default {
     "delete-link": components.DeleteLink,
     "human-date": components.HumanDate,
     "list-layout": layouts.ListLayout,
-    ComputeResourceReservationEditor
+    ComputeResourceReservationEditor,
+    "delete-button": components.DeleteButton
   },
   props: {
     reservations: {
@@ -174,26 +188,25 @@ export default {
         (!this.showNewItemEditor || this.newReservationValid) &&
         this.invalidReservations.length === 0
       );
+    },
+    expiredReservations() {
+      return this.reservations
+        ? this.reservations.filter(r => r.isExpired)
+        : [];
     }
   },
   created() {},
   methods: {
     updatedReservation(newValue) {
-      const reservationIndex = this.reservations.findIndex(
-        r => r.key === newValue.key
-      );
-      this.$emit("updated", newValue, reservationIndex);
+      this.$emit("updated", newValue);
     },
     toggleDetails(row) {
       row.toggleDetails();
       this.showingDetails[row.item.key] = !this.showingDetails[row.item.key];
     },
     deleteReservation(reservation) {
-      const reservationIndex = this.reservations.findIndex(
-        r => r.key === reservation.key
-      );
       this.removeInvalidReservation(reservation.key);
-      this.$emit("deleted", reservationIndex);
+      this.$emit("deleted", reservation);
     },
     addNewReservation() {
       this.newReservation = new models.ComputeResourceReservation();
@@ -230,6 +243,9 @@ export default {
       } else {
         this.$emit("invalid");
       }
+    },
+    deleteAllExpiredReservations() {
+      this.expiredReservations.forEach(this.deleteReservation);
     }
   }
 };
diff --git 
a/django_airavata/apps/api/static/django_airavata_api/js/models/ComputeResourceReservation.js
 
b/django_airavata/apps/api/static/django_airavata_api/js/models/ComputeResourceReservation.js
index c4a8921..2303ad7 100644
--- 
a/django_airavata/apps/api/static/django_airavata_api/js/models/ComputeResourceReservation.js
+++ 
b/django_airavata/apps/api/static/django_airavata_api/js/models/ComputeResourceReservation.js
@@ -43,4 +43,8 @@ export default class ComputeResourceReservation extends 
BaseModel {
     }
     return validationResults;
   }
+  get isExpired() {
+    const now = new Date();
+    return now > this.endTime;
+  }
 }
diff --git a/django_airavata/static/common/js/components/DeleteButton.vue 
b/django_airavata/static/common/js/components/DeleteButton.vue
index f1a22aa..0e07c43 100644
--- a/django_airavata/static/common/js/components/DeleteButton.vue
+++ b/django_airavata/static/common/js/components/DeleteButton.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="delete-button">
     <b-button variant="danger" @click="$refs.modal.show()" 
:disabled="disabled">
-      Delete
+      {{ label }}
     </b-button>
     <confirmation-dialog ref="modal" :title="dialogTitle" 
@ok="$emit('delete')">
       <slot></slot>
@@ -21,6 +21,10 @@ export default {
     disabled: {
       type: Boolean,
       default: false
+    },
+    label: {
+      type: String,
+      default: "Delete"
     }
   },
   components: {
diff --git a/django_airavata/static/common/js/layouts/ListLayout.vue 
b/django_airavata/static/common/js/layouts/ListLayout.vue
index d94628f..dfd77fa 100644
--- a/django_airavata/static/common/js/layouts/ListLayout.vue
+++ b/django_airavata/static/common/js/layouts/ListLayout.vue
@@ -7,6 +7,8 @@
         </slot>
       </div>
       <div class="col-auto">
+        <slot name="additional-buttons">
+        </slot>
         <slot name="new-item-button">
           <b-btn variant="primary" @click="addNewItem" 
:disabled="newButtonDisabled">
             {{ newItemButtonText }}

Reply via email to