1<template> 2 <div class="input-password-toggle-container"> 3 <slot></slot> 4 <b-button 5 :aria-label="$t('global.ariaLabel.showPassword')" 6 variant="link" 7 class="input-action-btn" 8 :class="{ isVisible: isVisible }" 9 @click="toggleVisibility" 10 > 11 <icon-view-off 12 v-if="isVisible" 13 aria-hidden="true" 14 :title="$t('global.ariaLabel.hidePassword')" 15 /> 16 <icon-view 17 v-else 18 aria-hidden="true" 19 :title="$t('global.ariaLabel.showPassword')" 20 /> 21 </b-button> 22 </div> 23</template> 24 25<script> 26import IconView from '@carbon/icons-vue/es/view/20'; 27import IconViewOff from '@carbon/icons-vue/es/view--off/20'; 28 29export default { 30 name: 'InputPasswordToggle', 31 components: { IconView, IconViewOff }, 32 data() { 33 return { 34 isVisible: false, 35 }; 36 }, 37 methods: { 38 toggleVisibility() { 39 const firstChild = this.$children[0]; 40 const inputEl = firstChild ? firstChild.$el : null; 41 42 this.isVisible = !this.isVisible; 43 44 if (inputEl.nodeName === 'INPUT') { 45 inputEl.type = this.isVisible ? 'text' : 'password'; 46 } 47 }, 48 }, 49}; 50</script> 51 52<style lang="scss" scoped> 53.input-password-toggle-container { 54 position: relative; 55} 56</style> 57