summaryrefslogtreecommitdiff
path: root/src/client/app/common/views/components/poll-editor.vue
blob: 7f52c62c232e68580ac47ae973d4feb2773f3d43 (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
151
<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';
import { erase } from '../../../../../prelude/array';
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: erase('', this.choices)
			}
		},

		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>


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 var(--inputText)
				background isDark ? #191b22 : #fff
				border solid 1px var(--primaryAlpha01)
				border-radius 4px

				&:hover
					border-color var(--primaryAlpha02)

				&:focus
					border-color var(--primaryAlpha05)

			> button
				padding 4px 8px
				color var(--primaryAlpha04)

				&:hover
					color var(--primaryAlpha06)

				&:active
					color var(--primaryDarken30)

	> .add
		margin 8px 0 0 0
		vertical-align top
		color var(--primary)

	> .destroy
		position absolute
		top 0
		right 0
		padding 4px 8px
		color var(--primaryAlpha04)

		&:hover
			color var(--primaryAlpha06)

		&:active
			color var(--primaryDarken30)

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

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

</style>