# ZeenHowGetCoins
Блочный компонент с прогресс-баром и перечнем задач, за которые выдаются баллы.
# Примеры:
Как заработать коины
11 из 20
55%
- Посмотреть спонсорский стенд3 / 5
- Посмотреть спонсорский стенд8 / 10
- Пройти всю гранд викторину0 / 5
# props
Название | Тип | Обязательный | По умолчанию | Описание |
---|---|---|---|---|
tasks | object | - | {} | объект с задачами и баллами |
for | string | - | из | предлог для выделения выполненных заданий из общего количества |
byPoints | boolean | - | true | если false, то считает по количеству заданий, если true, то по количеству баллов |
# slots
Название | Описание |
---|---|
title | заголовок блока |
# Source Code - исходный код компонента
<template lang="pug">
section.zeen-how-get-coins
ZeenContainer
slot(name="title")
.zeen-pb
.zeen-pb__text
.zeen-pb__how
span.zeen-pb__done {{ numberOfDone }}
span.zeen-pb__total {{ from }} {{ numberOfTotal }}
.zeen-pb__percent {{ progressPercent }}%
.zeen-pb__wrapper
.zeen-pb__width(:style='styleObjectProgressBarPercent')
ul.zeen-how-get-coins__list
li.zeen-how-get-coins__item(
:class='{"zeen-how-get-coins__item_zero": !hasPoints(task)}'
v-for='(task, i) in sortedTasksByStatus'
:key='"task_" + i'
)
.zeen-how-get-coins__title {{ task.title }}
.zeen-how-get-coins__coins
span.zeen-how-get-coins__done {{ task.points_earned + '' }}
span.zeen-how-get-coins__full / {{ task.max_points }}
</template>
<script>
import ZeenContainer from '../../components/ZeenContainer/ZeenContainer'
export default {
name: 'ZeenHowGetCoins',
components: {ZeenContainer},
props: {
tasks: {
type: Array,
default: () => [],
},
from: {
type: String,
default: 'из',
},
byPoints: {
type: Boolean,
default: true,
},
},
methods: {
isDone(task) {
return task.max_points - task.points_earned === 0
},
hasPoints(task) {
return task.points_earned > 0
},
},
computed: {
sortedTasksByStatus() {
const sortedTasks = this.tasks.slice()
return sortedTasks.sort((a) => {
if (this.isDone(a)) {
return -1
}
if (+a.points_earned > 0) {
return -1
}
if (+a.points_earned === 0) {
return 1
}
})
},
numberOfDone() {
const availablePoints = this.tasks.filter((task) => {
return task.points_earned > 0
})
if (this.byPoints) {
return availablePoints.reduce((acc, task) => {
acc += task.points_earned
return acc
}, 0)
}
return availablePoints.length
},
numberOfTotal() {
if (this.byPoints) {
return this.tasks.reduce((acc, task) => {
acc += task.max_points
return acc
}, 0)
}
return this.tasks.length
},
progressPercent() {
const progress = Math.round((this.numberOfDone / this.numberOfTotal) * 100)
if (isNaN(progress)) {
return '0'
} else {
return progress
}
},
styleObjectProgressBarPercent() {
return {
width: this.progressPercent + '%',
}
},
},
}
</script>
<style lang="scss">
@import 'src/styles/mixins';
:root {
/* Размеры */
--zeen-progress-bar-wrapper-height: 12px;
--zeen-progress-bar-wrapper-border-radius: 5px;
--zeen-progress-bar-font-size: var(--main-larger-size);
--zeen-progress-bar-font-weight: 600;
--zeen-pb-font-size: var(--main-large-size);
--zeen-pb-font-weight: 600;
--zeen-pb-margin-top: 15px;
--zeen-pb-margin-bottom: -15px;
--zeen-pb-margin-horizontal: 0;
--zeen-pb-padding-vertical: 15px;
--zeen-pb-padding-horizontal: 0;
/* Цвета */
--zeen-progress-bar-wrapper-background: var(--gray-3);
--zeen-progress-bar-percent-background: var(--main-color);
--zeen-progress-title-done-color: var(--main-color);
--zeen-progress-title-percent-color: var(--main-color);
--zeen-progress-title-total-color: var(--main-negative-color);
--zeen-pb-title-done-color: var(--main-negative-color);
--zeen-pb-number-done-color: var(--main-color);
--zeen-pb-not-started: var(--gray-2);
@include tablets {
--zeen-progress-bar-font-size: var(--main-large-size);
}
@include phones {
--zeen-progress-bar-wrapper-height: 9px;
--zeen-pb-font-size: var(--main-smallest-text);
--zeen-pb-padding-vertical: 10px;
--zeen-pb-padding-horizontal: 0;
--zeen-pb-margin-top: 10px;
--zeen-pb-margin-bottom: -10px;
--zeen-pb-margin-horizontal: 0;
}
}
</style>
<style lang="scss" scoped>
@import 'src/styles/mixins';
.zeen-how-get-coins {
&__list {
display: flex;
flex-direction: column;
padding: 0;
margin: var(--zeen-pb-margin-top) var(--zeen-pb-margin-horizontal) var(--zeen-pb-margin-bottom);
}
&__item {
display: flex;
justify-content: space-between;
list-style-type: none;
padding: var(--zeen-pb-padding-vertical) var(--zeen-pb-padding-horizontal);
&_zero {
& .zeen-how-get-coins {
&__title,
&__done,
&__full {
color: var(--zeen-pb-not-started);
}
}
}
}
&__done {
color: var(--zeen-pb-number-done-color);
}
&__title,
&__full {
color: var(--zeen-pb-title-done-color);
}
&__title,
&__coins {
line-height: 1.3;
font-weight: var(--zeen-pb-font-weight);
font-size: var(--zeen-pb-font-size);
}
}
.zeen-pb {
&__text {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
}
&__done {
color: var(--zeen-progress-title-done-color);
}
&__percent {
color: var(--zeen-progress-title-percent-color);
}
&__total {
color: var(--zeen-progress-title-total-color);
}
&__percent,
&__how {
line-height: 1.3;
font-weight: var(--zeen-progress-bar-font-weight);
font-size: var(--zeen-progress-bar-font-size);
}
&__wrapper {
width: 100%;
overflow: hidden;
height: var(--zeen-progress-bar-wrapper-height);
background-color: var(--zeen-progress-bar-wrapper-background);
border-radius: var(--zeen-progress-bar-wrapper-border-radius);
}
&__width {
width: 100%;
height: 100%;
background-color: var(--zeen-progress-bar-percent-background);
border-radius: var(--zeen-progress-bar-wrapper-border-radius);
}
}
</style>