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