Path: blob/main/frontend/vue/components/Binary/Binary.vue
3376 views
<template> <div class="binary-demo"> <section class="binary-demo__section"> <h4 class="binary-demo__input__title"> {{ $translate('Binary') }} </h4> <div class="binary-demo__container"> <div class="binary-demo__input"> <BinaryTile v-for="tile in initialTileData" :key="tile.index" :num="0" :val="tile.value" :active="tile.isActive" @click="calculateTotal" @handleToggle="updateTileStatus($event)" /> <div class="binary-demo__block"> = </div> </div> </div> </section> <section class="binary-demo__section" data-test="binary-demo-total"> <h4 class="binary-demo__output__title"> {{ $translate('Decimal') }} </h4> <div class="binary-demo__output"> <div class="binary-demo__block"> {{ decimalTotal }} </div> </div> </section> </div> </template> <script lang="ts"> import { Options, Vue } from 'vue-class-component' import BinaryTile from './BinaryTile.vue' @Options({ components: { BinaryTile }, computed: { decimalTotal ():number { let updatedTotal = 0 this.initialTileData.forEach((item: { value: number, isActive: boolean }) => { const val = item.value const isActive = item.isActive if (val && isActive) { updatedTotal += val } }) this.displayTotal = updatedTotal return updatedTotal } } }) export default class Binary extends Vue { displayTotal = 0; initialTileData = [ { value: 32, isActive: false }, { value: 16, isActive: true }, { value: 8, isActive: true }, { value: 4, isActive: false }, { value: 2, isActive: false }, { value: 1, isActive: true } ] updateTileStatus (e:any) { this.initialTileData.forEach((tile) => { if (tile.value === e.tileVal) { tile.isActive = e.newTileState } }) } calculateTotal () { const binaryTiles = document.querySelectorAll('[data-tile-active="true"]') const binaryTitlesList = Array.from(binaryTiles) let dynamicTotal = 0 binaryTitlesList.forEach((item) => { const val = item.getAttribute('data-val') if (val) { dynamicTotal += parseInt(val) } }) this.displayTotal = dynamicTotal return dynamicTotal } mounted () { this.calculateTotal() } } </script> <style lang="scss" scoped> @import 'carbon-components/scss/globals/scss/typography'; @import '~/../scss/variables/colors.scss'; @import '~/../scss/variables/settings.scss'; @import '~/../scss/variables/mq.scss'; .binary-demo { display: flex; @include mq($until: x-large) { flex-direction: column; } &__section { display: flex; flex-direction: column; } &__block { @include type-style('expressive-heading-05'); min-width: 3.25rem; color: $black-100; text-align: center; display: flex; height: 100%; @include mq($until: x-large) { min-width: 2rem; display: flex; height: 100%; } } &__container { display: flex; } &__input { display: flex; align-items: center; justify-content: space-between; &__title { @include type-style('expressive-heading-01'); margin-bottom: $spacing-02; margin-top: 0; @include mq($until: x-large) { margin-bottom: $spacing-05; } } } &__output { display: flex; &__title { @include type-style('expressive-heading-01'); margin-bottom: $spacing-02; margin-top: 0; @include mq($until: x-large) { margin-top: $spacing-07; } } } } </style> <style lang="scss"> @import 'carbon-components/scss/globals/scss/typography'; @import '~/../scss/variables/settings.scss'; @import '~/../scss/variables/mq.scss'; .binary-demo { & .binary-tile { padding-right: $spacing-05; @include mq($until: large) { padding-right: $spacing-03; } } } </style>