From fb0cf6454982a371e68b22e29b0374507425242d Mon Sep 17 00:00:00 2001 From: Xiaofeng An Date: Fri, 8 Feb 2019 10:49:14 -0500 Subject: #255 - make AutoCompleteInput component --- .../post_status_form/post_status_form.js | 129 ++------------------- .../post_status_form/post_status_form.vue | 35 ++---- 2 files changed, 15 insertions(+), 149 deletions(-) (limited to 'src/components/post_status_form') diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index ab379c23..3568951f 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -1,8 +1,8 @@ import statusPoster from '../../services/status_poster/status_poster.service.js' import MediaUpload from '../media_upload/media_upload.vue' +import AutoCompleteInput from '../autocomplete_input/autocomplete_input.vue' import fileTypeService from '../../services/file_type/file_type.service.js' -import Completion from '../../services/completion/completion.js' -import { take, filter, reject, map, uniqBy } from 'lodash' +import { reject, map, uniqBy } from 'lodash' const buildMentionsString = ({user, attentions}, currentUser) => { let allAttentions = [...attentions] @@ -28,13 +28,10 @@ const PostStatusForm = { 'subject' ], components: { - MediaUpload + MediaUpload, + AutoCompleteInput }, mounted () { - this.resize(this.$refs.textarea) - const textLength = this.$refs.textarea.value.length - this.$refs.textarea.setSelectionRange(textLength, textLength) - if (this.replyTo) { this.$refs.textarea.focus() } @@ -61,15 +58,13 @@ const PostStatusForm = { submitDisabled: false, error: null, posting: false, - highlighted: 0, newStatus: { spoilerText: this.subject || '', status: statusText, nsfw: false, files: [], visibility: scope - }, - caret: 0 + } } }, computed: { @@ -81,59 +76,6 @@ const PostStatusForm = { direct: { selected: this.newStatus.visibility === 'direct' } } }, - candidates () { - const firstchar = this.textAtCaret.charAt(0) - if (firstchar === '@') { - const query = this.textAtCaret.slice(1).toUpperCase() - const matchedUsers = filter(this.users, (user) => { - return user.screen_name.toUpperCase().startsWith(query) || - user.name && user.name.toUpperCase().startsWith(query) - }) - if (matchedUsers.length <= 0) { - return false - } - // eslint-disable-next-line camelcase - return map(take(matchedUsers, 5), ({screen_name, name, profile_image_url_original}, index) => ({ - // eslint-disable-next-line camelcase - screen_name: `@${screen_name}`, - name: name, - img: profile_image_url_original, - highlighted: index === this.highlighted - })) - } else if (firstchar === ':') { - if (this.textAtCaret === ':') { return } - const matchedEmoji = filter(this.emoji.concat(this.customEmoji), (emoji) => emoji.shortcode.startsWith(this.textAtCaret.slice(1))) - if (matchedEmoji.length <= 0) { - return false - } - return map(take(matchedEmoji, 5), ({shortcode, image_url, utf}, index) => ({ - screen_name: `:${shortcode}:`, - name: '', - utf: utf || '', - // eslint-disable-next-line camelcase - img: utf ? '' : this.$store.state.instance.server + image_url, - highlighted: index === this.highlighted - })) - } else { - return false - } - }, - textAtCaret () { - return (this.wordAtCaret || {}).word || '' - }, - wordAtCaret () { - const word = Completion.wordAtPosition(this.newStatus.status, this.caret - 1) || {} - return word - }, - users () { - return this.$store.state.users.users - }, - emoji () { - return this.$store.state.instance.emoji || [] - }, - customEmoji () { - return this.$store.state.instance.customEmoji || [] - }, statusLength () { return this.newStatus.status.length }, @@ -174,53 +116,8 @@ const PostStatusForm = { } }, methods: { - replace (replacement) { - this.newStatus.status = Completion.replaceWord(this.newStatus.status, this.wordAtCaret, replacement) - const el = this.$el.querySelector('textarea') - el.focus() - this.caret = 0 - }, - replaceCandidate (e) { - const len = this.candidates.length || 0 - if (this.textAtCaret === ':' || e.ctrlKey) { return } - if (len > 0) { - e.preventDefault() - const candidate = this.candidates[this.highlighted] - const replacement = candidate.utf || (candidate.screen_name + ' ') - this.newStatus.status = Completion.replaceWord(this.newStatus.status, this.wordAtCaret, replacement) - const el = this.$el.querySelector('textarea') - el.focus() - this.caret = 0 - this.highlighted = 0 - } - }, - cycleBackward (e) { - const len = this.candidates.length || 0 - if (len > 0) { - e.preventDefault() - this.highlighted -= 1 - if (this.highlighted < 0) { - this.highlighted = this.candidates.length - 1 - } - } else { - this.highlighted = 0 - } - }, - cycleForward (e) { - const len = this.candidates.length || 0 - if (len > 0) { - if (e.shiftKey) { return } - e.preventDefault() - this.highlighted += 1 - if (this.highlighted >= len) { - this.highlighted = 0 - } - } else { - this.highlighted = 0 - } - }, - setCaret ({target: {selectionStart}}) { - this.caret = selectionStart + postStatus () { + this.postStatus(this.newStatus) }, postStatus (newStatus) { if (this.posting) { return } @@ -305,18 +202,6 @@ const PostStatusForm = { fileDrag (e) { e.dataTransfer.dropEffect = 'copy' }, - resize (e) { - const target = e.target || e - if (!(target instanceof window.Element)) { return } - const vertPadding = Number(window.getComputedStyle(target)['padding-top'].substr(0, 1)) + - Number(window.getComputedStyle(target)['padding-bottom'].substr(0, 1)) - // Auto is needed to make textbox shrink when removing lines - target.style.height = 'auto' - target.style.height = `${target.scrollHeight - vertPadding}px` - if (target.value === '') { - target.style.height = null - } - }, clearError () { this.error = null }, diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index 6ed5d92e..ac5f5566 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -16,22 +16,14 @@ :placeholder="$t('post_status.content_warning')" v-model="newStatus.spoilerText" class="form-cw"> - +
-
-
-
-
- - {{candidate.utf}} - {{candidate.screen_name}}{{candidate.name}} -
-
-
-
-- cgit v1.2.3-70-g09d2 From 17c70fc0ef380d1faa360aa5b91791fd44d6c419 Mon Sep 17 00:00:00 2001 From: Xiaofeng An Date: Fri, 8 Feb 2019 11:02:28 -0500 Subject: add id & placeholder props to AutoCompleteInput component --- src/components/autocomplete_input/autocomplete_input.js | 3 +++ src/components/autocomplete_input/autocomplete_input.vue | 3 ++- src/components/post_status_form/post_status_form.vue | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) (limited to 'src/components/post_status_form') diff --git a/src/components/autocomplete_input/autocomplete_input.js b/src/components/autocomplete_input/autocomplete_input.js index 51c1f5d9..0f1a510c 100644 --- a/src/components/autocomplete_input/autocomplete_input.js +++ b/src/components/autocomplete_input/autocomplete_input.js @@ -3,9 +3,12 @@ import { take, filter, map } from 'lodash' const AutoCompleteInput = { props: [ + 'id', 'classObj', 'value', + 'placeholder', 'autoResize', + 'multiline', 'drop', 'dragoverPrevent', 'paste', diff --git a/src/components/autocomplete_input/autocomplete_input.vue b/src/components/autocomplete_input/autocomplete_input.vue index d3bda597..309f2202 100644 --- a/src/components/autocomplete_input/autocomplete_input.vue +++ b/src/components/autocomplete_input/autocomplete_input.vue @@ -4,9 +4,10 @@ v-if="multiline" ref="textarea" :value="text" + :id="id" @input="text = $event.target.value, $emit('input', $event.target.value), autoResize && resize($event)" @click="setCaret" - @keyup="setCaret" :placeholder="$t('post_status.default')" rows="1" :class="classObj" + @keyup="setCaret" :placeholder="placeholder" rows="1" :class="classObj" @keydown.down="cycleForward" @keydown.up="cycleBackward" @keydown.shift.tab="cycleBackward" diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index ac5f5566..18c2d2b2 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -18,7 +18,9 @@ class="form-cw"> Date: Fri, 8 Feb 2019 11:06:27 -0500 Subject: move styles for AutoCompleteInput --- .../autocomplete_input/autocomplete_input.vue | 51 ++++++++++++++++++++++ .../post_status_form/post_status_form.vue | 47 -------------------- 2 files changed, 51 insertions(+), 47 deletions(-) (limited to 'src/components/post_status_form') diff --git a/src/components/autocomplete_input/autocomplete_input.vue b/src/components/autocomplete_input/autocomplete_input.vue index 309f2202..44324e23 100644 --- a/src/components/autocomplete_input/autocomplete_input.vue +++ b/src/components/autocomplete_input/autocomplete_input.vue @@ -52,3 +52,54 @@ + + diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index 18c2d2b2..4c3eb159 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -233,52 +233,5 @@ cursor: pointer; z-index: 4; } - - .autocomplete-panel { - margin: 0 0.5em 0 0.5em; - border-radius: $fallback--tooltipRadius; - border-radius: var(--tooltipRadius, $fallback--tooltipRadius); - position: absolute; - z-index: 1; - box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.5); - // this doesn't match original but i don't care, making it uniform. - box-shadow: var(--popupShadow); - min-width: 75%; - background: $fallback--bg; - background: var(--bg, $fallback--bg); - color: $fallback--lightText; - color: var(--lightText, $fallback--lightText); - } - - .autocomplete { - cursor: pointer; - padding: 0.2em 0.4em 0.2em 0.4em; - border-bottom: 1px solid rgba(0, 0, 0, 0.4); - display: flex; - - img { - width: 24px; - height: 24px; - border-radius: $fallback--avatarRadius; - border-radius: var(--avatarRadius, $fallback--avatarRadius); - object-fit: contain; - } - - span { - line-height: 24px; - margin: 0 0.1em 0 0.2em; - } - - small { - margin-left: .5em; - color: $fallback--faint; - color: var(--faint, $fallback--faint); - } - - &.highlighted { - background-color: $fallback--fg; - background-color: var(--lightBg, $fallback--fg); - } - } } -- cgit v1.2.3-70-g09d2 From 59cde429b9c19cc2df0ea2b1717a5be67fc18f07 Mon Sep 17 00:00:00 2001 From: Xiaofeng An Date: Fri, 8 Feb 2019 11:40:54 -0500 Subject: fix naming --- src/components/post_status_form/post_status_form.js | 2 +- src/components/post_status_form/post_status_form.vue | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src/components/post_status_form') diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index 3568951f..8e30264d 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -116,7 +116,7 @@ const PostStatusForm = { } }, methods: { - postStatus () { + postStatusCopy () { this.postStatus(this.newStatus) }, postStatus (newStatus) { diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index 4c3eb159..ef3a7901 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -24,8 +24,8 @@ :drop="fileDrop" :dragoverPrevent="fileDrag" :paste="paste" - :keydownMetaEnter="postStatus" - :keyupCtrlEnter="postStatus"/> + :keydownMetaEnter="postStatusCopy" + :keyupCtrlEnter="postStatusCopy"/>