pleroma-fe/src/components/poll/poll.vue

182 lines
3.9 KiB
Vue
Raw Normal View History

2019-06-18 22:28:31 +02:00
<template>
2019-07-05 09:17:44 +02:00
<div
class="poll"
:class="containerClass"
>
2019-06-18 22:28:31 +02:00
<div
2023-02-18 19:40:42 +01:00
:role="showResults ? 'section' : (poll.multiple ? 'group' : 'radiogroup')"
2019-06-18 22:28:31 +02:00
>
2019-07-05 09:17:44 +02:00
<div
2023-02-18 19:40:42 +01:00
v-for="(option, index) in options"
:key="index"
class="poll-option"
2019-07-05 09:17:44 +02:00
>
2023-02-18 19:40:42 +01:00
<div
v-if="showResults"
:title="resultTitle(option)"
class="option-result"
>
<div class="option-result-label">
<span class="result-percentage">
{{ percentageForOption(option.votes_count) }}%
</span>
<RichContent
:html="option.title_html"
:handle-links="false"
:emoji="emoji"
/>
</div>
<div
class="result-fill"
:style="{ 'width': `${percentageForOption(option.votes_count)}%` }"
/>
2019-06-18 22:28:31 +02:00
</div>
<div
v-else
2023-02-18 19:40:42 +01:00
tabindex="0"
:role="poll.multiple ? 'checkbox' : 'radio'"
:aria-labelledby="`option-vote-${randomSeed}-${index}`"
:aria-checked="choices[index]"
2024-02-29 18:06:50 +01:00
class="input unstyled"
2024-03-04 20:40:35 +01:00
@click="activateOption(index)"
2019-06-18 22:28:31 +02:00
>
2024-02-07 14:53:49 +01:00
<!-- TODO: USE CHECKBOX -->
2023-02-18 19:40:42 +01:00
<input
v-if="poll.multiple"
type="checkbox"
2024-02-21 12:10:11 +01:00
class="input -checkbox poll-checkbox"
2023-02-18 19:40:42 +01:00
:disabled="loading"
:value="index"
>
<input
v-else
type="radio"
:disabled="loading"
:value="index"
2024-02-21 12:10:11 +01:00
class="input -radio"
2023-02-18 19:40:42 +01:00
>
<label class="option-vote">
<RichContent
:id="`option-vote-${randomSeed}-${index}`"
:html="option.title_html"
:handle-links="false"
:emoji="emoji"
/>
</label>
</div>
2019-06-18 22:28:31 +02:00
</div>
</div>
<div class="footer faint">
<button
v-if="!showResults"
class="btn button-default poll-vote-button"
2019-06-18 22:28:31 +02:00
type="button"
:disabled="isDisabled"
2019-07-05 09:17:44 +02:00
@click="vote"
2019-06-18 22:28:31 +02:00
>
2019-07-05 09:17:44 +02:00
{{ $t('polls.vote') }}
2019-06-18 22:28:31 +02:00
</button>
<div class="total">
<template v-if="typeof poll.voters_count === 'number'">
{{ $tc("polls.people_voted_count", poll.voters_count, { count: poll.voters_count }) }}
</template>
<template v-else>
{{ $tc("polls.votes_count", poll.votes_count, { count: poll.votes_count }) }}
</template>
<span v-if="expiresAt !== null">
&nbsp;·&nbsp;
</span>
2019-06-18 22:28:31 +02:00
</div>
<span v-if="expiresAt !== null">
2022-03-29 18:04:01 +02:00
<i18n-t
scope="global"
:keypath="expired ? 'polls.expired' : 'polls.expires_in'"
>
<Timeago
:time="expiresAt"
:auto-update="60"
:now-threshold="0"
/>
</i18n-t>
</span>
2019-06-18 22:28:31 +02:00
</div>
</div>
</template>
<script src="./poll.js"></script>
<style lang="scss">
.poll {
.votes {
display: flex;
flex-direction: column;
margin: 0 0 0.5em;
}
2023-01-09 19:02:16 +01:00
2019-06-18 22:28:31 +02:00
.poll-option {
2019-06-20 15:00:10 +02:00
margin: 0.75em 0.5em;
2024-03-04 22:02:21 +01:00
.input {
line-height: inherit;
}
2019-06-18 22:28:31 +02:00
}
2023-01-09 19:02:16 +01:00
2019-06-18 22:28:31 +02:00
.option-result {
height: 100%;
display: flex;
flex-direction: row;
position: relative;
2024-03-04 18:45:42 +01:00
color: var(--textLight);
2019-06-18 22:28:31 +02:00
}
2023-01-09 19:02:16 +01:00
2019-06-18 22:28:31 +02:00
.option-result-label {
display: flex;
align-items: center;
padding: 0.1em 0.25em;
z-index: 1;
2020-08-25 11:17:42 +02:00
word-break: break-word;
2019-06-18 22:28:31 +02:00
}
2023-01-09 19:02:16 +01:00
2019-06-18 22:28:31 +02:00
.result-percentage {
width: 3.5em;
2019-06-20 15:00:10 +02:00
flex-shrink: 0;
2019-06-18 22:28:31 +02:00
}
2023-01-09 19:02:16 +01:00
2019-06-18 22:28:31 +02:00
.result-fill {
height: 100%;
position: absolute;
2024-02-13 01:27:53 +01:00
border-radius: var(--roundness);
2019-06-18 22:28:31 +02:00
top: 0;
left: 0;
transition: width 0.5s;
}
2023-01-09 19:02:16 +01:00
2019-06-20 15:00:10 +02:00
.option-vote {
display: flex;
align-items: center;
}
2023-01-09 19:02:16 +01:00
2019-06-18 22:28:31 +02:00
input {
width: 3.5em;
}
2023-01-09 19:02:16 +01:00
2019-06-18 22:28:31 +02:00
.footer {
display: flex;
align-items: center;
}
2023-01-09 19:02:16 +01:00
2019-06-18 22:28:31 +02:00
&.loading * {
cursor: progress;
}
2023-01-09 19:02:16 +01:00
2019-06-18 22:28:31 +02:00
.poll-vote-button {
padding: 0 0.5em;
margin-right: 0.5em;
}
2023-02-18 19:40:42 +01:00
.poll-checkbox {
display: none;
}
2019-06-18 22:28:31 +02:00
}
</style>