summaryrefslogtreecommitdiff
path: root/src/client/app/common/views/components/poll-editor.vue
blob: 115c934c8bb6720c81171e9aad968d123141cb0f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
<template>
<div class="mk-poll-editor">
	<p class="caution" v-if="choices.length < 2">
		%fa:exclamation-triangle%%i18n:@no-only-one-choice%
	</p>
	<ul ref="choices">
		<li v-for="(choice, i) in choices">
			<input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:@choice-n%'.replace('{}', i + 1)">
			<button @click="remove(i)" title="%i18n:@remove%">
				%fa:times%
			</button>
		</li>
	</ul>
	<button class="add" v-if="choices.length < 10" @click="add">%i18n:@add%</button>
	<button class="destroy" @click="destroy" title="%i18n:@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'

root(isDark)
	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
				color isDark ? #fff : #000
				background isDark ? #191b22 : #fff
				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%)

.mk-poll-editor[data-darkmode]
	root(true)

.mk-poll-editor:not([data-darkmode])
	root(false)

</style>