blob: 2fbbd6cd77c4cb9d9aa7dea884f335c0214814dc [file] [log] [blame]
Yoshie Muranaka183c2752020-02-12 11:30:49 -08001<template>
2 <transition name="slide">
3 <div v-if="isToolbarActive" class="toolbar-container">
4 <div class="toolbar-content">
5 <p class="toolbar-selected">
Yoshie Muranaka547b5fc2020-02-24 15:42:40 -08006 {{ selectedItemsCount }} {{ $t('global.action.selected') }}
Yoshie Muranaka183c2752020-02-12 11:30:49 -08007 </p>
8 <div class="toolbar-actions d-flex">
9 <b-button
10 v-for="(action, index) in actions"
11 :key="index"
Yoshie Muranakaed06dc12020-06-16 12:12:27 -070012 :data-test-id="`table-button-${action.value}Selected`"
Yoshie Muranaka183c2752020-02-12 11:30:49 -080013 variant="primary"
14 class="d-block"
15 @click="$emit('batchAction', action.value)"
16 >
Yoshie Muranakaeaa04802020-02-28 13:21:27 -080017 {{ action.label }}
Yoshie Muranaka183c2752020-02-12 11:30:49 -080018 </b-button>
Yoshie Muranakab1a71912020-04-29 10:52:39 -070019 <slot name="export"></slot>
Yoshie Muranaka183c2752020-02-12 11:30:49 -080020 <b-button
21 variant="primary"
22 class="d-block"
23 @click="$emit('clearSelected')"
24 >
Yoshie Muranaka547b5fc2020-02-24 15:42:40 -080025 {{ $t('global.action.cancel') }}
Yoshie Muranaka183c2752020-02-12 11:30:49 -080026 </b-button>
27 </div>
28 </div>
29 </div>
30 </transition>
31</template>
32
33<script>
34export default {
35 name: 'TableToolbar',
36 props: {
37 selectedItemsCount: {
38 type: Number,
39 required: true
40 },
41 actions: {
42 type: Array,
Yoshie Muranakab1a71912020-04-29 10:52:39 -070043 default: () => [],
Yoshie Muranaka183c2752020-02-12 11:30:49 -080044 validator: prop => {
45 return prop.every(action => {
46 return (
Yoshie Muranakaeaa04802020-02-28 13:21:27 -080047 action.hasOwnProperty('value') && action.hasOwnProperty('label')
Yoshie Muranaka183c2752020-02-12 11:30:49 -080048 );
49 });
50 }
51 }
52 },
53 data() {
54 return {
55 isToolbarActive: false
56 };
57 },
58 watch: {
59 selectedItemsCount: function(selectedItemsCount) {
60 if (selectedItemsCount > 0) {
61 this.isToolbarActive = true;
62 } else {
63 this.isToolbarActive = false;
64 }
65 }
66 }
67};
68</script>
69
70<style lang="scss" scoped>
Derick Montague40865722020-04-13 17:01:19 -050071@import 'src/assets/styles/helpers';
72
Yoshie Muranaka183c2752020-02-12 11:30:49 -080073$toolbar-height: 46px;
74
75.toolbar-container {
76 width: 100%;
77 position: relative;
78}
79
80.toolbar-content {
81 height: $toolbar-height;
Yoshie Muranaka01da8182020-07-08 15:46:43 -070082 background-color: theme-color('primary');
Yoshie Muranaka183c2752020-02-12 11:30:49 -080083 color: $white;
84 position: absolute;
85 left: 0;
86 right: 0;
87 top: -$toolbar-height;
88 display: flex;
89 flex-direction: row;
90 justify-content: space-between;
91}
92
93.toolbar-actions {
94 > :last-child {
95 position: relative;
96 &::before {
97 content: '';
98 position: absolute;
99 height: $toolbar-height / 2;
100 border-left: 2px solid $white;
101 left: -2px;
102 top: $toolbar-height / 4;
103 }
104 }
105}
106
107.toolbar-selected {
108 line-height: $toolbar-height;
109 margin: 0;
110 padding: 0 $spacer;
111}
112
113.slide-enter-active {
114 transition: transform $duration--moderate-02 $entrance-easing--productive;
115}
116.slide-leave-active {
117 transition: transform $duration--moderate-02 $exit-easing--productive;
118}
119.slide-enter,
120.slide-leave-to {
121 transform: translateY($toolbar-height);
122}
123</style>