• Tag.vue
  • <template>
        <div
            class="tag-wrapper rounded d-inline-flex"
            :class="{ 'px-3': size == 'normal',
                      'py-1': size == 'normal',
                      'm-2': size == 'normal',
                      'px-2': size == 'sm',
                      'py-0': size == 'sm',
            }"
            :style="{ backgroundColor: item.color, fontSize: size == 'sm' ? '0.7em' : '1em' }"
        >
            <span class="tag-text">{{ displayText }}</span>
            <span v-if="remove != null" class="ps-1 btn-remove" @click="remove(item)">
                <font-awesome-icon icon="times" />
            </span>
        </div>
    </template>
    
    <script>
    /**
     * @typedef {import('./TagsManager.vue').Tag} Tag
     */
    
    export default {
        props: {
            /**
             * Object representing tag
             * @type {Tag}
             */
            item: {
                type: Object,
                required: true,
            },
            /** Function to remove tag */
            remove: {
                type: Function,
                default: null,
            },
            /**
             * Size of tag
             * @type {"normal" | "small"}
             */
            size: {
                type: String,
                default: "normal",
            }
        },
        computed: {
            displayText() {
                if (this.item.value === "" || this.item.value === undefined || this.item.value === null) {
                    return this.item.name;
                } else {
                    return `${this.item.name}: ${this.item.value}`;
                }
            }
        }
    };
    </script>
    
    <style lang="scss" scoped>
    .tag-wrapper {
        color: white;
        opacity: 0.85;
    
        .dark & {
            opacity: 1;
        }
    }
    
    .tag-text {
        padding-bottom: 1px !important;
        text-overflow: ellipsis;
        overflow: hidden;
        white-space: nowrap;
    }
    
    .btn-remove {
        font-size: 0.9em;
        line-height: 24px;
        opacity: 0.3;
    }
    
    .btn-remove:hover {
        opacity: 1;
    }
    </style>