LoginSignup
6
6

More than 5 years have passed since last update.

Redmineの担当者欄にインクリメンタルサーチをつける(focus、スクロールバー追加)

Last updated at Posted at 2018-01-05

以下の記事で、Redmineの担当者欄にインクリメンタルサーチを付けれることを知り、対応してみた結果をまとめる。
(参考サイトの組み合わせなので、おもに自分用メモとして)

はじめに

  • [Redmineバージョン] 3.3.1.stable
  • [view_customize_pluginバージョン] 1.1.4
  • [Redmineサーバ環境] 社内オンプレ環境、OS:Windows Server 2012 R2
  • [動作確認ブラウザ] Chrome

追加で対応したこと

上記記事で触れている方法を元に、以下へ対応した。

  • 元記事での未解決事項
    • 担当者欄をクリックしても一覧表示にならず、何か 1 文字打つと一覧表示が始まる
  • あらたに発生した対応事項
    • 担当者候補が多すぎてリストの表示が縦に長くなる

設定内容(抜粋)

担当者欄をクリックしても一覧表示にならず、何か 1 文字打つと一覧表示が始まる

解決方法:フォームにfocusイベントを追加した。

.focus(function() {
  jQuery(this).autocomplete("search", "");
})

担当者候補が多すぎてリストの表示が縦に長くなる

解決方法:スクロールバーを導入した。
(CSSファイルを編集したくなかったので、JQueryでCSSプロパティをいじっている。heightは要調整)

$('.ui-autocomplete').css({'max-height':'250px','overflow-y':'auto','overflow-x':'hidden','padding-right':'20px'});

設定内容(全文)

View customize に以下を設定する。

  • Path pattern : /issues
  • Type : JavaScript
  • Code : 下記
View_customize
// 担当者欄にインクリメンタルサーチをつける(Redmine View Customize Plugin)
// http://blog.enjoyxstudy.com/entry/2017/12/05/000000

$(function() {

  function replaceSelectToAutocomplete(selectElement) {

    var $select = $(selectElement);
    if ($select.length == 0) {
      return;
    }

    var options = $select.find('option[value!=""]')
      .map(function() {
        var $option = $(this);
        return {
          label: $option.text(),
          optionValue: $option.val()
        };
      })
      .toArray();

    var $autocomplete = $('<input type="text" class="ui-autocomplete-input autocomplete" autocomplete="off">')
      .autocomplete({
        source: options,
        minLength: 0,
        select: function(event, ui) {
          $select.val(ui.item.optionValue);
        },
        change: function(event, ui) {
          if (ui.item != null) {
            return;
          }

          var inputValue = $autocomplete.val();
          var matchOption = $.grep(options, function(option) {
            return option.label == inputValue;
          })[0];

          if (matchOption != null) {
            $select.val(matchOption.optionValue);
          } else {
            $autocomplete.val('');
            $select.val('');
          }
        }
      })
      .focus(function() {
        jQuery(this).autocomplete("search", "");
      });

    var currentSelectValue = $select.val();
    if (currentSelectValue != '') {
      var initAutcompleteValue = $.grep(options, function(option) {
        return option.optionValue == currentSelectValue;
      })[0].label;

      $autocomplete.val(initAutcompleteValue);
    }

    $select.hide()
      .after($autocomplete);
  }

  function setupAssignedAutocomplete() {
    replaceSelectToAutocomplete('#issue_assigned_to_id');
    $('.ui-autocomplete').css({'max-height':'250px','overflow-y':'auto','overflow-x':'hidden','padding-right':'20px'});
  }

  // ステータス変更時などにDOMが差し替えられるので
  // フォームの内容が書き変わるたびに表示切替
  var _replaceIssueFormWith = replaceIssueFormWith;
  replaceIssueFormWith = function(html){

    _replaceIssueFormWith(html);

    setupAssignedAutocomplete();
  };

  setupAssignedAutocomplete();
});

参考

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6