diff --git a/src/components/emoji-input/emoji-input.js b/src/components/emoji-input/emoji-input.js index 48e89409..8f7598ca 100644 --- a/src/components/emoji-input/emoji-input.js +++ b/src/components/emoji-input/emoji-input.js @@ -105,6 +105,11 @@ const EmojiInput = { }, setCaret ({target: {selectionStart}}) { this.caret = selectionStart + }, + onEmoji (emoji) { + const newValue = this.value.substr(0, this.caret) + emoji + this.value.substr(this.caret) + this.$refs.input.focus() + this.$emit('input', newValue) } } } diff --git a/src/components/emoji-input/emoji-input.vue b/src/components/emoji-input/emoji-input.vue index a1ddd7f9..151861de 100644 --- a/src/components/emoji-input/emoji-input.vue +++ b/src/components/emoji-input/emoji-input.vue @@ -1,6 +1,5 @@ <template> <div class="emoji-input"> - <EmojiSelector /> <input v-if="type !== 'textarea'" :class="classname" @@ -16,6 +15,7 @@ @keydown.shift.tab="cycleBackward" @keydown.tab="cycleForward" @keydown.enter="replaceEmoji" + ref="input" /> <textarea v-else @@ -31,7 +31,9 @@ @keydown.shift.tab="cycleBackward" @keydown.tab="cycleForward" @keydown.enter="replaceEmoji" + ref="input" ></textarea> + <EmojiSelector @emoji="onEmoji" /> <div class="autocomplete-panel" v-if="suggestions"> <div class="autocomplete-panel-body"> <div @@ -58,6 +60,8 @@ @import '../../_variables.scss'; .emoji-input { + position: relative; + .form-control { width: 100%; } diff --git a/src/components/emoji-selector/emoji-selector.js b/src/components/emoji-selector/emoji-selector.js index 4771f4c6..07ea0442 100644 --- a/src/components/emoji-selector/emoji-selector.js +++ b/src/components/emoji-selector/emoji-selector.js @@ -12,6 +12,11 @@ const EmojiSelector = { methods: { togglePanel () { this.open = !this.open + }, + onEmoji (emoji) { + const value = emoji.image_url ? `:${emoji.shortcode}:` : emoji.utf + this.$emit('emoji', ` ${value} `) + this.open = false } }, computed: { diff --git a/src/components/emoji-selector/emoji-selector.vue b/src/components/emoji-selector/emoji-selector.vue index 576ca16e..70752714 100644 --- a/src/components/emoji-selector/emoji-selector.vue +++ b/src/components/emoji-selector/emoji-selector.vue @@ -14,7 +14,13 @@ <div class="emoji-groups"> <div v-for="(value, key) in emojis" :key="key" class="emoji-group"> <h6 class="emoji-group-title">{{value.text}}</h6> - <span v-for="emoji in value.emojis" :key="key + emoji.shortcode" :title="emoji.shortcode" class="emoji-item"> + <span + v-for="emoji in value.emojis" + :key="key + emoji.shortcode" + :title="emoji.shortcode" + class="emoji-item" + @click="onEmoji(emoji)" + > <span v-if="!emoji.image_url">{{emoji.utf}}</span> <img :src="'https://bikeshed.party' + emoji.image_url" v-else> </span> @@ -32,20 +38,27 @@ .emoji { &-dropdown { - position: relative; + position: absolute; + right: 10px; + top: 2px; + z-index: 1; &-toggle { cursor: pointer; + position: absolute; + right: 0; } &-menu { position: absolute; z-index: 1; right: 0; + top: 25px; width: 300px; height: 300px; display: flex; flex-direction: column; + margin: 0 !important; &-content { flex: 1 1 1px;