Redash v6 で追加されたオートコンプリートの無効化について挙動とコードを追ってみる
この記事は Redash Advent Calendar 19日目の記事です。勤務先でも師走ムードを感じ始めました。
お題
Redash、入力補完(スニペットとか)が出てこなくなってしまって困った...シークレットモードだとちゃんと動く!キャッシュクリアとかスーパリロードしても出てこない...謎 😢(解決方法知っている人いたら、教えてください...)
— mario (@mario_kada) 2018年12月17日
この問題と関係あるかどうかはわかりませんが、オートコンプリートと聞いて、先日リリースされた Redash v6 (正確には 6.0.0-beta から追加)で以下の機能が追加されたことを思い出しました。
If the live autocomplete in the code editor annoys you, you can disable it now
今日はこの機能について検証しつつ、ざっくりと実装を追ってみます。
検証環境は docker-compose
で起動し、Docker イメージは redash/redash:6.0.0.b8537
を使用しました。
影響範囲
この機能はクエリ編集画面に影響があります。
以下はオートコンプリートを無効にする前の画面で、今までのバージョンと同じくオートコンプリートが有効になっています。
上記の画面で表示されている、雷のマークがオートコンプリートの有効・無効を切り替えるトグルになっていて、無効にすると静止画ではわかりにくいですが、以下の画面のようにオートコンプリートが効かなくなります。
オートコンプリートの設定はどこに保持されているか?
Chrome の開発者ツールなどで見るとすぐに分かりますが、LocalStorage に保持されています。
liveAutocompleteDisabled
が false
だとオートコンプリートが有効になるようです。
オートコンプリートを制御しているのはどのコードか?
client/app/components/QueryEditor.jsx
で liveAutocompleteDisabled
を操作しています。
redash/QueryEditor.jsx at v6.0.0 · getredash/redash · GitHub
Redash は現在 Angular から React への移行を進めていて、クエリエディタ周りも v6.0.0 時点では React のコンポーネントに書き換わっています。
このコンポーネントのなかでオートコンプリートのボタンがクリックされるたび、コンポーネントの State と一緒にブラウザの Local Storage を書き換えているようです。
toggleAutocomplete
で呼ばれている localOptions.set
は Redash 独自のもので、Web Storage API を薄くラップしたもののようでした。
redash/localOptions.js at v6.0.0 · getredash/redash · GitHub
まとめ
まとめと書きつつ、これといったまとめはありませんが、オートコンプリート周りの実装を読んだことで、また少し Redash についての理解が深まりました。
それも元ツイートのおかげなので、ありがたい限りです。
お知らせ
Redash についての疑問などを Twitter で拾えることもあるのですが、できればフォーラムへの投稿をしていただけるとありがたいです!日本語でOK!