summaryrefslogtreecommitdiff
path: root/src/web/app/desktop/scripts/autocomplete.js
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2017-11-13 18:05:35 +0900
committersyuilo <syuilotan@yahoo.co.jp>2017-11-13 18:05:35 +0900
commitbc9a8283c66d7588f931d4b802f7ab1fa7aa3226 (patch)
treecac529d136737c95b1656564756da8c4ae84df32 /src/web/app/desktop/scripts/autocomplete.js
parent:v: (diff)
downloadmisskey-bc9a8283c66d7588f931d4b802f7ab1fa7aa3226.tar.gz
misskey-bc9a8283c66d7588f931d4b802f7ab1fa7aa3226.tar.bz2
misskey-bc9a8283c66d7588f931d4b802f7ab1fa7aa3226.zip
なんかもうめっちゃ変えた
Diffstat (limited to 'src/web/app/desktop/scripts/autocomplete.js')
-rw-r--r--src/web/app/desktop/scripts/autocomplete.js130
1 files changed, 0 insertions, 130 deletions
diff --git a/src/web/app/desktop/scripts/autocomplete.js b/src/web/app/desktop/scripts/autocomplete.js
deleted file mode 100644
index 8ca516e2a9..0000000000
--- a/src/web/app/desktop/scripts/autocomplete.js
+++ /dev/null
@@ -1,130 +0,0 @@
-const getCaretCoordinates = require('textarea-caret');
-import * as riot from 'riot';
-
-/**
- * オートコンプリートを管理するクラス。
- */
-class Autocomplete {
-
- /**
- * 対象のテキストエリアを与えてインスタンスを初期化します。
- */
- constructor(textarea) {
- // BIND ---------------------------------
- this.onInput = this.onInput.bind(this);
- this.complete = this.complete.bind(this);
- this.close = this.close.bind(this);
- // --------------------------------------
-
- this.suggestion = null;
- this.textarea = textarea;
- }
-
- /**
- * このインスタンスにあるテキストエリアの入力のキャプチャを開始します。
- */
- attach() {
- this.textarea.addEventListener('input', this.onInput);
- }
-
- /**
- * このインスタンスにあるテキストエリアの入力のキャプチャを解除します。
- */
- detach() {
- this.textarea.removeEventListener('input', this.onInput);
- this.close();
- }
-
- /**
- * [Private] テキスト入力時
- */
- onInput() {
- this.close();
-
- const caret = this.textarea.selectionStart;
- const text = this.textarea.value.substr(0, caret);
-
- const mentionIndex = text.lastIndexOf('@');
-
- if (mentionIndex == -1) return;
-
- const username = text.substr(mentionIndex + 1);
-
- if (!username.match(/^[a-zA-Z0-9-]+$/)) return;
-
- this.open('user', username);
- }
-
- /**
- * [Private] サジェストを提示します。
- */
- open(type, q) {
- // 既に開いているサジェストは閉じる
- this.close();
-
- // サジェスト要素作成
- const tag = document.createElement('mk-autocomplete-suggestion');
-
- // ~ サジェストを表示すべき位置を計算 ~
-
- const caretPosition = getCaretCoordinates(this.textarea, this.textarea.selectionStart);
-
- const rect = this.textarea.getBoundingClientRect();
-
- const x = rect.left + window.pageXOffset + caretPosition.left;
- const y = rect.top + window.pageYOffset + caretPosition.top;
-
- tag.style.left = x + 'px';
- tag.style.top = y + 'px';
-
- // 要素追加
- const el = document.body.appendChild(tag);
-
- // マウント
- this.suggestion = riot.mount(el, {
- textarea: this.textarea,
- complete: this.complete,
- close: this.close,
- type: type,
- q: q
- })[0];
- }
-
- /**
- * [Private] サジェストを閉じます。
- */
- close() {
- if (this.suggestion == null) return;
-
- this.suggestion.unmount();
- this.suggestion = null;
-
- this.textarea.focus();
- }
-
- /**
- * [Private] オートコンプリートする
- */
- complete(user) {
- this.close();
-
- const value = user.username;
-
- const caret = this.textarea.selectionStart;
- const source = this.textarea.value;
-
- const before = source.substr(0, caret);
- const trimmedBefore = before.substring(0, before.lastIndexOf('@'));
- const after = source.substr(caret);
-
- // 結果を挿入する
- this.textarea.value = trimmedBefore + '@' + value + ' ' + after;
-
- // キャレットを戻す
- this.textarea.focus();
- const pos = caret + value.length;
- this.textarea.setSelectionRange(pos, pos);
- }
-}
-
-export default Autocomplete;