sessions-list.vue 4.81 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
<!--
  - Copyright 2014-2018 the original author or authors.
  -
  - Licensed under the Apache License, Version 2.0 (the "License");
  - you may not use this file except in compliance with the License.
  - You may obtain a copy of the License at
  -
  -     http://www.apache.org/licenses/LICENSE-2.0
  -
  - Unless required by applicable law or agreed to in writing, software
  - distributed under the License is distributed on an "AS IS" BASIS,
  - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  - See the License for the specific language governing permissions and
  - limitations under the License.
  -->

<template>
    <table class="table">
        <thead>
        <tr>
            <th></th>
            <th>Session Id</th>
            <th>Created at</th>
            <th>Last accessed at</th>
25
            <th>Max. inactive<br>interval
26 27 28
            </th>
            <th>Attributes</th>
            <th>
29 30 31
                <sba-confirm-button class="button"
                                    :class="{ 'is-loading' : deletingAll === 'deleting', 'is-danger' : deletingAll === 'failed' }"
                                    :disabled="deletingAll !== null"
32
                                    v-if="sessions.length > 1" @click="deleteAllSessions()">
33 34 35
                    <span v-if="deletingAll === 'deleted'">Deleted</span>
                    <span v-else-if="deletingAll === 'failed'">Failed</span>
                    <span v-else><font-awesome-icon icon="trash"></font-awesome-icon>&nbsp;Delete</span>
36 37 38 39 40 41 42 43
                </sba-confirm-button>
            </th>
        </tr>
        </thead>
        <tr v-for="session in sessions" :key="session.id">
            <td>
                <span v-if="session.expired" class="tag is-info">Expired</span>
            </td>
44 45 46 47 48
            <td>
                <router-link v-text="session.id"
                             :to="{ name: 'instance/sessions', params: { 'instanceId' : instance.id, sessionId : session.id } }">
                </router-link>
            </td>
49 50 51 52 53 54 55 56 57 58 59
            <td v-text="session.creationTime.format('L HH:mm:ss.SSS')"></td>
            <td v-text="session.lastAccessedTime.format('L HH:mm:ss.SSS')"></td>
            <td>
                <span v-if="session.maxInactiveInterval >= 0" v-text="`${session.maxInactiveInterval}s`"></span>
                <span v-else>unlimited</span>
            </td>
            <td>
                <span class="tag" v-for="name in session.attributeNames" :key="`${session.id}-${name}`"
                      v-text="name"></span>
            </td>
            <td>
60 61 62 63 64 65
                <button class="button"
                        :class="{ 'is-loading' :  deleting[session.id] === 'deleting', 'is-info' : deleting[session.id] === 'deleted', 'is-danger' : deleting[session.id] === 'failed' }"
                        :disabled="session.id in deleting" @click="deleteSession(session.id)">
                    <span v-if="deleting[session.id] === 'deleted'">Deleted</span>
                    <span v-else-if="deleting[session.id] === 'failed'">Failed</span>
                    <span v-else><font-awesome-icon icon="trash"></font-awesome-icon>&nbsp;Delete</span>
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
                </button>
            </td>
        </tr>
        <tr v-if="sessions.length=== 0">
            <td class="is-muted" colspan="7 ">No sessions found.</td>
        </tr>
    </table>
</template>

<script>
  import {Observable} from '@/utils/rxjs';
  import prettyBytes from 'pretty-bytes';

  export default {
    props: ['sessions', 'instance'],
    data: () => ({
82 83
      deletingAll: null,
      deleting: {},
84 85 86
    }),
    methods: {
      prettyBytes,
87
      deleteAllSessions() {
88
        const vm = this;
89
        vm.deletingAll = 'deleting';
90 91
        this.subscription = Observable.from(vm.sessions)
          .map(session => session.id)
92
          .concatMap(vm._deleteSession)
93
          .subscribe({
94 95 96 97 98 99
            complete: () => {
              vm.deletingAll = 'deleted';
              vm.$emit('deleted', '*');
            },
            error: error => {
              vm.deletingAll = 'failed';
100 101 102
            },
          });
      },
103
      deleteSession(sessionId) {
104
        const vm = this;
105 106 107 108 109 110 111 112 113
        vm._deleteSession(sessionId)
          .subscribe({
            complete: () => vm.$emit('deleted', sessionId),
          });
      },
      _deleteSession(sessionId) {
        const vm = this;
        vm.$set(vm.deleting, sessionId, 'deleting');
        return Observable.of(sessionId)
114 115 116 117
          .concatMap(async sessionId => {
            await vm.instance.deleteSession(sessionId);
            return sessionId;
          })
118 119 120 121 122
          .do(sessionId => vm.$set(vm.deleting, sessionId, 'deleted'))
          .catch(error => {
            vm.$set(vm.deleting, sessionId, 'failed');
            console.warn(`Deleting session ${sessionId} failed:`, error);
            throw error;
123 124 125 126 127
          })
      }
    }
  }
</script>