summaryrefslogtreecommitdiff
path: root/src/client/app/common/views/components/poll-editor.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/app/common/views/components/poll-editor.vue')
-rw-r--r--src/client/app/common/views/components/poll-editor.vue142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/client/app/common/views/components/poll-editor.vue b/src/client/app/common/views/components/poll-editor.vue
new file mode 100644
index 0000000000..47d901d7b1
--- /dev/null
+++ b/src/client/app/common/views/components/poll-editor.vue
@@ -0,0 +1,142 @@
+<template>
+<div class="mk-poll-editor">
+ <p class="caution" v-if="choices.length < 2">
+ %fa:exclamation-triangle%%i18n:common.tags.mk-poll-editor.no-only-one-choice%
+ </p>
+ <ul ref="choices">
+ <li v-for="(choice, i) in choices">
+ <input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:common.tags.mk-poll-editor.choice-n%'.replace('{}', i + 1)">
+ <button @click="remove(i)" title="%i18n:common.tags.mk-poll-editor.remove%">
+ %fa:times%
+ </button>
+ </li>
+ </ul>
+ <button class="add" v-if="choices.length < 10" @click="add">%i18n:common.tags.mk-poll-editor.add%</button>
+ <button class="destroy" @click="destroy" title="%i18n:common.tags.mk-poll-editor.destroy%">
+ %fa:times%
+ </button>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+export default Vue.extend({
+ data() {
+ return {
+ choices: ['', '']
+ };
+ },
+ watch: {
+ choices() {
+ this.$emit('updated');
+ }
+ },
+ methods: {
+ onInput(i, e) {
+ Vue.set(this.choices, i, e.target.value);
+ },
+
+ add() {
+ this.choices.push('');
+ this.$nextTick(() => {
+ (this.$refs.choices as any).childNodes[this.choices.length - 1].childNodes[0].focus();
+ });
+ },
+
+ remove(i) {
+ this.choices = this.choices.filter((_, _i) => _i != i);
+ },
+
+ destroy() {
+ this.$emit('destroyed');
+ },
+
+ get() {
+ return {
+ choices: this.choices.filter(choice => choice != '')
+ }
+ },
+
+ set(data) {
+ if (data.choices.length == 0) return;
+ this.choices = data.choices;
+ if (data.choices.length == 1) this.choices = this.choices.concat('');
+ }
+ }
+});
+</script>
+
+<style lang="stylus" scoped>
+@import '~const.styl'
+
+.mk-poll-editor
+ padding 8px
+
+ > .caution
+ margin 0 0 8px 0
+ font-size 0.8em
+ color #f00
+
+ > [data-fa]
+ margin-right 4px
+
+ > ul
+ display block
+ margin 0
+ padding 0
+ list-style none
+
+ > li
+ display block
+ margin 8px 0
+ padding 0
+ width 100%
+
+ &:first-child
+ margin-top 0
+
+ &:last-child
+ margin-bottom 0
+
+ > input
+ padding 6px 8px
+ width 300px
+ font-size 14px
+ border solid 1px rgba($theme-color, 0.1)
+ border-radius 4px
+
+ &:hover
+ border-color rgba($theme-color, 0.2)
+
+ &:focus
+ border-color rgba($theme-color, 0.5)
+
+ > button
+ padding 4px 8px
+ color rgba($theme-color, 0.4)
+
+ &:hover
+ color rgba($theme-color, 0.6)
+
+ &:active
+ color darken($theme-color, 30%)
+
+ > .add
+ margin 8px 0 0 0
+ vertical-align top
+ color $theme-color
+
+ > .destroy
+ position absolute
+ top 0
+ right 0
+ padding 4px 8px
+ color rgba($theme-color, 0.4)
+
+ &:hover
+ color rgba($theme-color, 0.6)
+
+ &:active
+ color darken($theme-color, 30%)
+
+</style>