summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/assets/javascripts/notes/components/comment_form.vue49
-rw-r--r--app/assets/stylesheets/pages/note_form.scss5
-rw-r--r--package.json1
-rw-r--r--yarn.lock4
4 files changed, 58 insertions, 1 deletions
diff --git a/app/assets/javascripts/notes/components/comment_form.vue b/app/assets/javascripts/notes/components/comment_form.vue
index b85c1a6ad72..aa8fbc4fba8 100644
--- a/app/assets/javascripts/notes/components/comment_form.vue
+++ b/app/assets/javascripts/notes/components/comment_form.vue
@@ -1,4 +1,5 @@
<script>
+ import sentiment from 'sentiment';
import { mapActions, mapGetters } from 'vuex';
import _ from 'underscore';
import Autosize from 'autosize';
@@ -17,6 +18,8 @@
import discussionLockedWidget from './discussion_locked_widget.vue';
import issuableStateMixin from '../mixins/issuable_state';
+ import { glEmojiTag } from '../../emoji';
+
export default {
name: 'CommentForm',
components: {
@@ -42,6 +45,7 @@
noteType: constants.COMMENT,
isSubmitting: false,
isSubmitButtonDisabled: true,
+ totalSentiment: null,
};
},
computed: {
@@ -115,6 +119,31 @@
endpoint() {
return this.getNoteableData.create_note_path;
},
+ getSentimentEmoji() {
+ if (this.totalSentiment === -5) {
+ return glEmojiTag('triumph');
+ } else if (this.totalSentiment === -4) {
+ return glEmojiTag('angry');
+ } else if (this.totalSentiment === -3) {
+ return glEmojiTag('frowning2');
+ } else if (this.totalSentiment === -2) {
+ return glEmojiTag('slightly_frowning_face');
+ } else if (this.totalSentiment === -1) {
+ return glEmojiTag('confused');
+ } else if (this.totalSentiment === 0) {
+ return glEmojiTag('neutral_face');
+ } else if (this.totalSentiment === 1) {
+ return glEmojiTag('slightly_smiling_face');
+ } else if (this.totalSentiment === 2) {
+ return glEmojiTag('smiley');
+ } else if (this.totalSentiment === 3) {
+ return glEmojiTag('smile');
+ } else if (this.totalSentiment >= 4) {
+ return glEmojiTag('grin');
+ }
+
+ return;
+ },
},
watch: {
note(newNote) {
@@ -290,6 +319,16 @@ Please check your network connection and try again.`;
Autosize.update(this.$refs.textarea);
});
},
+ checkSentiment() {
+ const text = this.$refs.textarea.value;
+ if (text) {
+ const { score, positive, negative } = sentiment(text);
+ const impactfulWordCount = (positive.length + negative.length) || 1;
+ this.totalSentiment = Math.round(score / impactfulWordCount);
+ } else {
+ this.totalSentiment = null;
+ }
+ },
},
};
</script>
@@ -350,7 +389,9 @@ js-gfm-input js-autosize markdown-area js-vue-textarea"
placeholder="Write a comment or drag your files here..."
@keydown.up="editCurrentUserLastNote()"
@keydown.meta.enter="handleSave()"
- @keydown.ctrl.enter="handleSave()">
+ @keydown.ctrl.enter="handleSave()"
+ @keyup="checkSentiment()"
+ >
</textarea>
</markdown-field>
<div class="note-form-actions">
@@ -361,7 +402,13 @@ append-right-10 comment-type-dropdown js-comment-type-dropdown droplab-dropdown"
@click.prevent="handleSave()"
:disabled="isSubmitButtonDisabled"
class="btn btn-create comment-btn js-comment-button js-comment-submit-button"
+ :class="{ 'has-emoji': totalSentiment !== null }"
type="submit">
+ <span
+ v-if="totalSentiment !== null"
+ v-html="getSentimentEmoji"
+ >
+ </span>
{{ __(commentButtonTitle) }}
</button>
<button
diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss
index 4a528bc2bb1..9de059ad3f8 100644
--- a/app/assets/stylesheets/pages/note_form.scss
+++ b/app/assets/stylesheets/pages/note_form.scss
@@ -386,6 +386,11 @@
.comment-type-dropdown {
.comment-btn {
width: auto;
+
+ &.has-emoji {
+ padding-top: 1px;
+ padding-bottom: 1px;
+ }
}
.dropdown-toggle {
diff --git a/package.json b/package.json
index cbad55b4c85..1d1a38edc00 100644
--- a/package.json
+++ b/package.json
@@ -69,6 +69,7 @@
"react-dev-utils": "^5.0.0",
"sanitize-html": "^1.16.1",
"select2": "3.5.2-browserify",
+ "sentiment": "^4.2.0",
"sql.js": "^0.4.0",
"style-loader": "^0.20.2",
"svg4everybody": "2.1.9",
diff --git a/yarn.lock b/yarn.lock
index ab0ad265d81..f7778c879bf 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7494,6 +7494,10 @@ send@0.16.1:
range-parser "~1.2.0"
statuses "~1.3.1"
+sentiment@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/sentiment/-/sentiment-4.2.0.tgz#02e3e59972d754e81d427f7a3a8c25b43ed8d4f0"
+
serialize-javascript@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005"