Trelloのガントチャートを自作のchrome拡張で見やすくカスタマイズしてみた

# 概要

タスク管理のツールとして有名な[Trello](https://trello.com)がありますが、登録したカードをガントチャートで見たいときはchrome拡張の[Elegantt for Trello](https://chrome.google.com/webstore/detail/elegantt-for-trello/jdongfcbejkjibhkbekkjcckophhjcjj?hl=ja)を入れるのが一般的かと思います。

ガントチャートが表示されるのは助かりますが、ガントチャートが上、カードが下に固定表示されてしまうため残念ながら見やすいレイアウトとは言えません。また、レイアウトの調整も自由にはできない仕様のようです。

そこで、レイアウトを調整するためのchrome拡張を独自に開発してガントチャートを見やすくカスタマイズをしてみました。

# 課題

* カードが増えてくるとガントチャートのスクロールが必須になるので全体を見渡せない
* 今日を表す列が網掛けと同じグレーで表示されるため分かりにくい

# 結果

まずはカスタマイズ結果からご紹介です。

**カスタマイズ前**
![001.png](https://qiita-image-store.s3.amazonaws.com/0/278145/75147c30-a5bd-f2c9-d2bd-881751d71619.png)

ガントチャートの領域が狭いのでスクロールが必須で非常に見づらいです。
今日を表す列も色が網掛けと同じグレーなので同化してしまって分かりにくいです。

**カスタマイズ後**
![002.png](https://qiita-image-store.s3.amazonaws.com/0/278145/c61845dd-7bbd-8ba4-1c53-6712f9f2dde8.png)

今日を表す列は背景が赤で表示されるようになり、ガントチャートは左、カードは右に表示されるようになりました。
ガントチャートの領域が広くなったのでスクロールすることなく全体を見渡せて見やすくなったと思います。
カスタマイズ前と比べて画面全体を有効活用できています。

# カスタマイズ方法

レイアウトの調整はchrome拡張から行うためchrome拡張の開発から始めます。

## 1. はじめに

今回作成するchrome拡張は以下のようなフォルダ構成となります。

> trello-layout/
> 　├ css/
> 　│　└ main.css
> 　├ js/
> 　│　├ background.js
> 　│　├ jquery-3.3.1.min
> 　│　└ main.js
> 　└ manifest.json

## 2. manifest.jsonの作成

```json:manifest.json
{
  "manifest_version": 2,
  "name": "trello-layout",
  "version": "1.0.0",
  "description": "trello-layout",
  "content_scripts": [
    {
      "matches": [
        "https://trello.com/*"
      ],
      "css": [
        "css/main.css"
      ],
      "js": [
        "js/jquery-3.3.1.min.js",
        "js/main.js"
      ]
    }
  ],
  "background": {
    "scripts": [
      "js/background.js"
    ]
  },
  "permissions": [
    "tabs"
  ],
  "author": "Targityen"
}
```

matchesではTrelloのドメインを指定してTrelloのサイトだけカスタマイズが反映されるようにします。
今日を表す列の背景色を変更するため `main.css` ファイルからスタイルを上書きします。
ガントチャートのレイアウトの変更は `main.js` ファイルから変更します。

## 3. main.cssの作成

```css:main.css
div.gantt-foreground-col-current-date {
  background-color: red;
}
```

今日を表す列の背景色を変更します。

## 4. main.jsの作成

```javascript:main.js
$(function() {
  const update = function() {
    const $timeline = $('div.egt-ui-timeline-wrapper');
    if ($timeline.length == 0) {
      setTimeout(function() {
        update();
      }, 0);
      return;
    }
    let $div = $('#trello-layout');
    if ($div.length == 0) {
      $div = $('<div/>', {
        id: 'trello-layout',
        css: {
          'flex': 'none'
        }
      });
    }
    const $wrapper = $('div.egt-ui-widgets-wrapper');
    $wrapper.css({
      'width': '50%',
      'float': 'left'
    });
    const $canvas = $('div.board-canvas');
    $canvas.css({
      'width': '50%',
      'float': 'right',
      'maxHeight': '90vh',
      'minHeight': '90vh'
    });
    $div.append($wrapper);
    $div.append($canvas);
    $('div.board-main-content').append($div);
  };
  chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
    update();
  });
  update();
});
```

ガントチャートが表示されたのを確認後、ガントチャートを左に、カードを右に表示するようにDOMを調整します。
DOMの調整には[jQuery](https://jquery.com/)を利用しています。

## 5. background.jsの作成

```javascript:background.js
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
  chrome.tabs.sendMessage(tabId, {}, () => {});
});
```

Trelloのボードリストからボードを変更した場合など、画面がリロードされない状態で遷移するケースがあるため、タブの更新イベントを拾って `main.js` の `update` 関数を強制的に呼び出すようにします。

## 6. chrome拡張機能の読み込み

ここまでの手順でchrome拡張を動かすために必要なファイルが揃ったので、chrome拡張機能として読み込みます。
Google Chromeのブラウザの拡張機能から **デベロッパーモード** を有効にして **パッケージ化されていない拡張機能を読み込む** から先ほど作成したtrello-layoutフォルダを読み込みます。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/278145/b96e5f2f-511f-370b-16c0-cc7dfb71ab89.png)

読み込みに成功すると **trello-layout** という拡張が表示されます。
拡張が有効な状態でTrelloのボードにアクセスすると、ガントチャートが見やすくカスタマイズされます。

# 今回使用したソース

[trello-layout](https://github.com/Targityen/trello-layout)