xref: /openbmc/webui-vue/src/components/Global/TableToolbar.vue (revision 24b377db47a05f742b1f3db77606f6bae845f637)
1183c2754SYoshie Muranaka<template>
2183c2754SYoshie Muranaka  <transition name="slide">
3183c2754SYoshie Muranaka    <div v-if="isToolbarActive" class="toolbar-container">
4183c2754SYoshie Muranaka      <div class="toolbar-content">
5183c2754SYoshie Muranaka        <p class="toolbar-selected">
6547b5fc3SYoshie Muranaka          {{ selectedItemsCount }} {{ $t('global.action.selected') }}
7183c2754SYoshie Muranaka        </p>
8183c2754SYoshie Muranaka        <div class="toolbar-actions d-flex">
927d68affSDixsie Wolmers          <slot name="toolbar-buttons"></slot>
10183c2754SYoshie Muranaka          <b-button
11183c2754SYoshie Muranaka            v-for="(action, index) in actions"
12183c2754SYoshie Muranaka            :key="index"
13ed06dc11SYoshie Muranaka            :data-test-id="`table-button-${action.value}Selected`"
14183c2754SYoshie Muranaka            variant="primary"
15183c2754SYoshie Muranaka            class="d-block"
16edb8a774SSukanya Pandey            @click="$emit('batch-action', action.value)"
17183c2754SYoshie Muranaka          >
18eaa04800SYoshie Muranaka            {{ action.label }}
19183c2754SYoshie Muranaka          </b-button>
20183c2754SYoshie Muranaka          <b-button
21e409b738SSurenNeware            variant="secondary"
22183c2754SYoshie Muranaka            class="d-block"
23edb8a774SSukanya Pandey            @click="$emit('clear-selected')"
24183c2754SYoshie Muranaka          >
25547b5fc3SYoshie Muranaka            {{ $t('global.action.cancel') }}
26183c2754SYoshie Muranaka          </b-button>
27183c2754SYoshie Muranaka        </div>
28183c2754SYoshie Muranaka      </div>
29183c2754SYoshie Muranaka    </div>
30183c2754SYoshie Muranaka  </transition>
31183c2754SYoshie Muranaka</template>
32183c2754SYoshie Muranaka
33183c2754SYoshie Muranaka<script>
34883a0d59SEd Tanousimport { useI18n } from 'vue-i18n';
35183c2754SYoshie Muranakaexport default {
36183c2754SYoshie Muranaka  name: 'TableToolbar',
37183c2754SYoshie Muranaka  props: {
38183c2754SYoshie Muranaka    selectedItemsCount: {
39183c2754SYoshie Muranaka      type: Number,
40602e98aaSDerick Montague      required: true,
41183c2754SYoshie Muranaka    },
42183c2754SYoshie Muranaka    actions: {
43183c2754SYoshie Muranaka      type: Array,
44b1a7191eSYoshie Muranaka      default: () => [],
45602e98aaSDerick Montague      validator: (prop) => {
46602e98aaSDerick Montague        return prop.every((action) => {
47183c2754SYoshie Muranaka          return (
48efd7c884SYoshie Muranaka            Object.prototype.hasOwnProperty.call(action, 'value') &&
49efd7c884SYoshie Muranaka            Object.prototype.hasOwnProperty.call(action, 'label')
50183c2754SYoshie Muranaka          );
51183c2754SYoshie Muranaka        });
52602e98aaSDerick Montague      },
53602e98aaSDerick Montague    },
54183c2754SYoshie Muranaka  },
55183c2754SYoshie Muranaka  data() {
56183c2754SYoshie Muranaka    return {
57883a0d59SEd Tanous      $t: useI18n().t,
58602e98aaSDerick Montague      isToolbarActive: false,
59183c2754SYoshie Muranaka    };
60183c2754SYoshie Muranaka  },
61183c2754SYoshie Muranaka  watch: {
62183c2754SYoshie Muranaka    selectedItemsCount: function (selectedItemsCount) {
63183c2754SYoshie Muranaka      if (selectedItemsCount > 0) {
64183c2754SYoshie Muranaka        this.isToolbarActive = true;
65183c2754SYoshie Muranaka      } else {
66183c2754SYoshie Muranaka        this.isToolbarActive = false;
67183c2754SYoshie Muranaka      }
68602e98aaSDerick Montague    },
69602e98aaSDerick Montague  },
70183c2754SYoshie Muranaka};
71183c2754SYoshie Muranaka</script>
72183c2754SYoshie Muranaka
73183c2754SYoshie Muranaka<style lang="scss" scoped>
74183c2754SYoshie Muranaka$toolbar-height: 46px;
75183c2754SYoshie Muranaka
76183c2754SYoshie Muranaka.toolbar-container {
77183c2754SYoshie Muranaka  width: 100%;
78183c2754SYoshie Muranaka  position: relative;
79*24b377dbSsuryav9724  z-index: $zindex-dropdown + 1;
80183c2754SYoshie Muranaka}
81183c2754SYoshie Muranaka
82183c2754SYoshie Muranaka.toolbar-content {
83183c2754SYoshie Muranaka  height: $toolbar-height;
8401da8187SYoshie Muranaka  background-color: theme-color('primary');
85183c2754SYoshie Muranaka  color: $white;
86183c2754SYoshie Muranaka  position: absolute;
87183c2754SYoshie Muranaka  left: 0;
88183c2754SYoshie Muranaka  right: 0;
89183c2754SYoshie Muranaka  top: -$toolbar-height;
90183c2754SYoshie Muranaka  display: flex;
91183c2754SYoshie Muranaka  flex-direction: row;
92183c2754SYoshie Muranaka  justify-content: space-between;
93183c2754SYoshie Muranaka}
94183c2754SYoshie Muranaka
95183c2754SYoshie Muranaka.toolbar-selected {
96183c2754SYoshie Muranaka  line-height: $toolbar-height;
97183c2754SYoshie Muranaka  margin: 0;
98183c2754SYoshie Muranaka  padding: 0 $spacer;
99183c2754SYoshie Muranaka}
100183c2754SYoshie Muranaka
101e516d4d9SSneha Patel// Using v-deep to style export slot child-element
102e516d4d9SSneha Patel// depricated and vue-js 3
103e516d4d9SSneha Patel.toolbar-actions ::v-deep .btn {
104e516d4d9SSneha Patel  position: relative;
105e516d4d9SSneha Patel  &:after {
106e516d4d9SSneha Patel    content: '';
107e516d4d9SSneha Patel    position: absolute;
108e516d4d9SSneha Patel    left: 0;
109e516d4d9SSneha Patel    height: 1.5rem;
110e516d4d9SSneha Patel    width: 1px;
111e516d4d9SSneha Patel    background: rgba($white, 0.6);
112e516d4d9SSneha Patel  }
113e516d4d9SSneha Patel  &:last-child,
114e516d4d9SSneha Patel  &:first-child {
115e516d4d9SSneha Patel    &:after {
116e516d4d9SSneha Patel      width: 0;
117e516d4d9SSneha Patel    }
118e516d4d9SSneha Patel  }
119e516d4d9SSneha Patel}
120e516d4d9SSneha Patel
121183c2754SYoshie Muranaka.slide-enter-active {
122183c2754SYoshie Muranaka  transition: transform $duration--moderate-02 $entrance-easing--productive;
123183c2754SYoshie Muranaka}
124183c2754SYoshie Muranaka.slide-leave-active {
125183c2754SYoshie Muranaka  transition: transform $duration--moderate-02 $exit-easing--productive;
126183c2754SYoshie Muranaka}
127151dd249SSurenNeware.slide-enter, // Remove this vue2 based only class when switching to vue3
128151dd249SSurenNeware.slide-enter-from, // This is vue3 based only class modified from 'slide-enter'
129183c2754SYoshie Muranaka.slide-leave-to {
130183c2754SYoshie Muranaka  transform: translateY($toolbar-height);
131183c2754SYoshie Muranaka}
132183c2754SYoshie Muranaka</style>
133