summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/packages_and_registries/shared/components/registry_list.vue
blob: 79381f82009263b4289fb45f2e3c6241d16958a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<script>
import { GlButton, GlFormCheckbox, GlKeysetPagination } from '@gitlab/ui';
import { filter } from 'lodash';
import { __ } from '~/locale';

export default {
  name: 'RegistryList',
  components: {
    GlButton,
    GlFormCheckbox,
    GlKeysetPagination,
  },
  props: {
    title: {
      type: String,
      required: true,
    },
    isLoading: {
      type: Boolean,
      default: false,
      required: false,
    },
    hiddenDelete: {
      type: Boolean,
      default: false,
      required: false,
    },
    pagination: {
      type: Object,
      required: false,
      default: () => ({}),
    },
    items: {
      type: Array,
      required: false,
      default: () => [],
    },
    idProperty: {
      type: String,
      required: false,
      default: 'id',
    },
  },
  data() {
    return {
      selectedReferences: {},
    };
  },
  computed: {
    showPagination() {
      return this.pagination.hasPreviousPage || this.pagination.hasNextPage;
    },
    disableDeleteButton() {
      return this.isLoading || filter(this.selectedReferences).length === 0;
    },
    selectedItems() {
      return this.items.filter(this.isSelected);
    },
    selectAll: {
      get() {
        return this.items.every(this.isSelected);
      },
      set(value) {
        this.items.forEach((item) => {
          const id = item[this.idProperty];
          this.$set(this.selectedReferences, id, value);
        });
      },
    },
  },
  methods: {
    selectItem(item) {
      const id = item[this.idProperty];
      this.$set(this.selectedReferences, id, !this.selectedReferences[id]);
    },
    isSelected(item) {
      const id = item[this.idProperty];
      return this.selectedReferences[id];
    },
  },
  i18n: {
    deleteSelected: __('Delete Selected'),
  },
};
</script>

<template>
  <div>
    <div class="gl-display-flex gl-justify-content-space-between gl-mb-3 gl-align-items-center">
      <gl-form-checkbox v-if="!hiddenDelete" v-model="selectAll" class="gl-ml-2 gl-pt-2">
        <span class="gl-font-weight-bold">{{ title }}</span>
      </gl-form-checkbox>

      <gl-button
        v-if="!hiddenDelete"
        :disabled="disableDeleteButton"
        category="secondary"
        variant="danger"
        @click="$emit('delete', selectedItems)"
      >
        {{ $options.i18n.deleteSelected }}
      </gl-button>
    </div>

    <div v-for="(item, index) in items" :key="index">
      <slot
        :select-item="selectItem"
        :is-selected="isSelected"
        :item="item"
        :first="index === 0"
      ></slot>
    </div>

    <div class="gl-display-flex gl-justify-content-center">
      <gl-keyset-pagination
        v-if="showPagination"
        v-bind="pagination"
        class="gl-mt-3"
        @prev="$emit('prev-page')"
        @next="$emit('next-page')"
      />
    </div>
  </div>
</template>