<template> <div class="fm-breadcrumb"> <nav aria-label="breadcrumb"> <ol class="breadcrumb" v-bind:class="[ manager === activeManager ? 'active-manager' : 'bg-light', ]" > <li class="breadcrumb-item" v-on:click="selectMainDirectory"> <span class="badge badge-secondary"> <i class="far fa-hdd" /> </span> </li> <li class="breadcrumb-item text-truncate" v-for="(item, index) in breadcrumb" v-bind:key="index" v-bind:class="[breadcrumb.length === index + 1 ? 'active' : '']" v-on:click="selectDirectory(index)" > <span>{{ item }}</span> </li> </ol> </nav> </div> </template> <script> export default { name: "Breadcrumb", props: { manager: { type: String, required: true }, }, computed: { /** * Active manager name * @returns {default.computed.activeManager|(function())|string|activeManager} */ activeManager() { return this.$store.state.fm.activeManager; }, /** * Selected Disk for this manager * @returns {default.computed.selectedDisk|(function())|default.selectedDisk|null} */ selectedDisk() { return this.$store.state.fm[this.manager].selectedDisk; }, /** * Selected directory for this manager * @returns {default.computed.selectedDirectory|(function())|default.selectedDirectory|null} */ selectedDirectory() { return this.$store.state.fm[this.manager].selectedDirectory; }, /** * Breadcrumb * @returns {*} */ breadcrumb() { return this.$store.getters[`fm/${this.manager}/breadcrumb`]; }, }, methods: { /** * Load selected directory * @param index */ selectDirectory(index) { const path = this.breadcrumb.slice(0, index + 1).join("/"); // only if this path not selected if (path !== this.selectedDirectory) { // load directory this.$store.dispatch(`fm/${this.manager}/selectDirectory`, { path, history: true, }); } }, /** * Select main directory */ selectMainDirectory() { if (this.selectedDirectory) { this.$store.dispatch(`fm/${this.manager}/selectDirectory`, { path: null, history: true, }); } }, }, }; </script> <style scoped lang="scss"> @import "~bootstrap/scss/mixins"; @import "~bootstrap/scss/functions"; @import "~bootstrap/scss/variables"; .fm-breadcrumb { .breadcrumb { display: flex; flex-wrap: nowrap; padding: 0.2rem 0.3rem; margin-bottom: 0.5rem; @include font-size($breadcrumb-font-size); list-style: none; background-color: $breadcrumb-bg; @include border-radius($breadcrumb-border-radius); .breadcrumb-item { // The separator between breadcrumbs (by default, a forward-slash: "/") + .breadcrumb-item { padding-left: $breadcrumb-item-padding; &::before { float: left; // Suppress inline spacings and underlining of the separator padding-right: $breadcrumb-item-padding; color: $breadcrumb-divider-color; content: escape-svg($breadcrumb-divider); } } // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built // without `<ul>`s. The `::before` pseudo-element generates an element // *within* the .breadcrumb-item and thereby inherits the `text-decoration`. // // To trick IE into suppressing the underline, we give the pseudo-element an // underline and then immediately remove it. + .breadcrumb-item:hover::before { text-decoration: underline; } // stylelint-disable-next-line no-duplicate-selectors + .breadcrumb-item:hover::before { text-decoration: none; } &.active { color: $breadcrumb-active-color; } } &.active-manager { background-color: #c2e5eb; } .breadcrumb-item:not(.active):hover { cursor: pointer; font-weight: normal; color: #6d757d; } } } </style>