Remove jquery from autocompletion
This commit is contained in:
parent
a71472a427
commit
fcf7488e1e
@ -8,7 +8,6 @@
|
|||||||
:value="channel.pendingMessage"
|
:value="channel.pendingMessage"
|
||||||
:placeholder="getInputPlaceholder(channel)"
|
:placeholder="getInputPlaceholder(channel)"
|
||||||
:aria-label="getInputPlaceholder(channel)"
|
:aria-label="getInputPlaceholder(channel)"
|
||||||
class="mousetrap"
|
|
||||||
@input="setPendingMessage"
|
@input="setPendingMessage"
|
||||||
@keypress.enter.exact.prevent="onSubmit"
|
@keypress.enter.exact.prevent="onSubmit"
|
||||||
/>
|
/>
|
||||||
@ -49,6 +48,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import autocompletion from "../js/autocompletion";
|
||||||
const commands = require("../js/commands/index");
|
const commands = require("../js/commands/index");
|
||||||
const socket = require("../js/socket");
|
const socket = require("../js/socket");
|
||||||
const upload = require("../js/upload");
|
const upload = require("../js/upload");
|
||||||
@ -80,6 +80,8 @@ const bracketWraps = {
|
|||||||
_: "_",
|
_: "_",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let autocompletionRef = null;
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "ChatInput",
|
name: "ChatInput",
|
||||||
props: {
|
props: {
|
||||||
@ -93,7 +95,7 @@ export default {
|
|||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.$store.state.settings.autocomplete) {
|
if (this.$store.state.settings.autocomplete) {
|
||||||
require("../js/autocompletion").enable(this.$refs.input);
|
autocompletionRef = autocompletion(this.$refs.input);
|
||||||
}
|
}
|
||||||
|
|
||||||
const inputTrap = Mousetrap(this.$refs.input);
|
const inputTrap = Mousetrap(this.$refs.input);
|
||||||
@ -152,7 +154,11 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
destroyed() {
|
destroyed() {
|
||||||
require("../js/autocompletion").disable();
|
if (autocompletionRef) {
|
||||||
|
autocompletionRef.destroy();
|
||||||
|
autocompletionRef = null;
|
||||||
|
}
|
||||||
|
|
||||||
upload.abort();
|
upload.abort();
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@ -201,6 +207,10 @@ export default {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (autocompletionRef) {
|
||||||
|
autocompletionRef.hide();
|
||||||
|
}
|
||||||
|
|
||||||
this.channel.inputHistoryPosition = 0;
|
this.channel.inputHistoryPosition = 0;
|
||||||
this.channel.pendingMessage = "";
|
this.channel.pendingMessage = "";
|
||||||
this.$refs.input.value = "";
|
this.$refs.input.value = "";
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const $ = require("jquery");
|
|
||||||
const fuzzy = require("fuzzy");
|
const fuzzy = require("fuzzy");
|
||||||
const Mousetrap = require("mousetrap");
|
const Mousetrap = require("mousetrap");
|
||||||
const {Textcomplete, Textarea} = require("textcomplete");
|
const {Textcomplete, Textarea} = require("textcomplete");
|
||||||
@ -8,23 +7,7 @@ const emojiMap = require("./helpers/simplemap.json");
|
|||||||
const constants = require("./constants");
|
const constants = require("./constants");
|
||||||
const store = require("./store").default;
|
const store = require("./store").default;
|
||||||
|
|
||||||
let input;
|
export default enableAutocomplete;
|
||||||
let textcomplete;
|
|
||||||
let enabled = false;
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
enable: enableAutocomplete,
|
|
||||||
disable() {
|
|
||||||
if (enabled) {
|
|
||||||
$("#form").off("submit.tabcomplete");
|
|
||||||
input.off("input.tabcomplete");
|
|
||||||
Mousetrap(input.get(0)).unbind("tab", "keydown");
|
|
||||||
textcomplete.destroy();
|
|
||||||
enabled = false;
|
|
||||||
store.commit("isAutoCompleting", false);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const emojiSearchTerms = Object.keys(emojiMap);
|
const emojiSearchTerms = Object.keys(emojiMap);
|
||||||
const emojiStrategy = {
|
const emojiStrategy = {
|
||||||
@ -66,7 +49,7 @@ const nicksStrategy = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If there is whitespace in the input already, append space to nick
|
// If there is whitespace in the input already, append space to nick
|
||||||
if (position > 0 && /\s/.test($("#input").val())) {
|
if (position > 0 && /\s/.test(store.state.activeChannel.channel.pendingMessage)) {
|
||||||
return original + " ";
|
return original + " ";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,14 +158,12 @@ const backgroundColorStrategy = {
|
|||||||
index: 2,
|
index: 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
function enableAutocomplete(inputRef) {
|
function enableAutocomplete(input) {
|
||||||
enabled = true;
|
|
||||||
let tabCount = 0;
|
let tabCount = 0;
|
||||||
let lastMatch = "";
|
let lastMatch = "";
|
||||||
let currentMatches = [];
|
let currentMatches = [];
|
||||||
input = $(inputRef);
|
|
||||||
|
|
||||||
input.on("input.tabcomplete", (e) => {
|
input.addEventListener("input", (e) => {
|
||||||
if (e.detail === "autocomplete") {
|
if (e.detail === "autocomplete") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -192,7 +173,7 @@ function enableAutocomplete(inputRef) {
|
|||||||
lastMatch = "";
|
lastMatch = "";
|
||||||
});
|
});
|
||||||
|
|
||||||
Mousetrap(input.get(0)).bind(
|
Mousetrap(input).bind(
|
||||||
"tab",
|
"tab",
|
||||||
(e) => {
|
(e) => {
|
||||||
if (store.state.isAutoCompleting) {
|
if (store.state.isAutoCompleting) {
|
||||||
@ -201,12 +182,11 @@ function enableAutocomplete(inputRef) {
|
|||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
const text = input.val();
|
const text = input.value;
|
||||||
const element = input.get(0);
|
|
||||||
|
|
||||||
if (tabCount === 0) {
|
if (tabCount === 0) {
|
||||||
lastMatch = text
|
lastMatch = text
|
||||||
.substring(0, element.selectionStart)
|
.substring(0, input.selectionStart)
|
||||||
.split(/\s/)
|
.split(/\s/)
|
||||||
.pop();
|
.pop();
|
||||||
|
|
||||||
@ -221,19 +201,19 @@ function enableAutocomplete(inputRef) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const position = element.selectionStart - lastMatch.length;
|
const position = input.selectionStart - lastMatch.length;
|
||||||
const newMatch = nicksStrategy.replace(
|
const newMatch = nicksStrategy.replace(
|
||||||
[0, currentMatches[tabCount % currentMatches.length]],
|
[0, currentMatches[tabCount % currentMatches.length]],
|
||||||
position
|
position
|
||||||
);
|
);
|
||||||
const remainder = text.substr(element.selectionStart);
|
const remainder = text.substr(input.selectionStart);
|
||||||
|
|
||||||
input.val(text.substr(0, position) + newMatch + remainder);
|
input.value = text.substr(0, position) + newMatch + remainder;
|
||||||
element.selectionStart -= remainder.length;
|
input.selectionStart -= remainder.length;
|
||||||
element.selectionEnd = element.selectionStart;
|
input.selectionEnd = input.selectionStart;
|
||||||
|
|
||||||
// Propagate change to Vue model
|
// Propagate change to Vue model
|
||||||
element.dispatchEvent(
|
input.dispatchEvent(
|
||||||
new CustomEvent("input", {
|
new CustomEvent("input", {
|
||||||
detail: "autocomplete",
|
detail: "autocomplete",
|
||||||
})
|
})
|
||||||
@ -245,8 +225,8 @@ function enableAutocomplete(inputRef) {
|
|||||||
"keydown"
|
"keydown"
|
||||||
);
|
);
|
||||||
|
|
||||||
const editor = new Textarea(input.get(0));
|
const editor = new Textarea(input);
|
||||||
textcomplete = new Textcomplete(editor, {
|
const textcomplete = new Textcomplete(editor, {
|
||||||
dropdown: {
|
dropdown: {
|
||||||
className: "textcomplete-menu",
|
className: "textcomplete-menu",
|
||||||
placement: "top",
|
placement: "top",
|
||||||
@ -278,9 +258,15 @@ function enableAutocomplete(inputRef) {
|
|||||||
store.commit("isAutoCompleting", false);
|
store.commit("isAutoCompleting", false);
|
||||||
});
|
});
|
||||||
|
|
||||||
$("#form").on("submit.tabcomplete", () => {
|
return {
|
||||||
|
hide() {
|
||||||
textcomplete.hide();
|
textcomplete.hide();
|
||||||
});
|
},
|
||||||
|
destroy() {
|
||||||
|
textcomplete.destroy();
|
||||||
|
store.commit("isAutoCompleting", false);
|
||||||
|
},
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function fuzzyGrep(term, array) {
|
function fuzzyGrep(term, array) {
|
||||||
@ -318,7 +304,7 @@ function completeNicks(word, isFuzzy) {
|
|||||||
return fuzzyGrep(word, users);
|
return fuzzyGrep(word, users);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $.grep(users, (w) => !w.toLowerCase().indexOf(word));
|
return users.filter((w) => !w.toLowerCase().indexOf(word));
|
||||||
}
|
}
|
||||||
|
|
||||||
function completeCommands(word) {
|
function completeCommands(word) {
|
||||||
|
Loading…
Reference in New Issue
Block a user