3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Redmineのガントチャートが重い?Canvas描画で爆速にするプラグインを作った

3
Posted at

はじめに

Redmineを使っていて、こんな経験はありませんか?

  • チケットが100件を超えるとガントチャートの表示が遅い
  • スクロールがカクつく
  • ドラッグ&ドロップでスケジュール変更したいのにできない
  • 依存関係の設定が面倒

そんな悩みを解決するために、Canvas描画で高速動作するガントチャートプラグイン を開発しました。

Canvas Gantt Demo

標準ガントチャートの課題

Redmineの標準ガントチャートには以下の課題があります:

課題 詳細
パフォーマンス DOM要素を大量生成するため、チケット数が増えると重くなる
操作性 閲覧専用で、ドラッグ操作ができない
依存関係 ガントチャート上で依存関係を作成・編集できない
編集 各チケットページに遷移しないと編集できない

Canvas Ganttの特徴

🚀 Canvas描画で高速

HTML5 Canvasを使用してタイムライン部分を描画しています。DOMノードを大量に生成しないため、1000件以上のチケットでもサクサク動作します。

従来方式: チケット数 × 日数 のDOM要素を生成
Canvas方式: 1つのCanvas要素に描画

🎯 ドラッグ&ドロップでスケジュール変更

タスクバーをドラッグするだけで日程変更が可能です。

  • 移動: バーをドラッグして開始日・終了日を同時に変更
  • リサイズ: バーの端をドラッグして期間を変更
  • 即時反映: ドロップ時にAPIで自動保存

ドラッグ操作デモ

🔗 依存関係の視覚化と編集

タスク間の依存関係(先行・後続)を矢印で視覚化します。

  • タスクの端点からドラッグして新しい依存関係を作成
  • 既存の依存関係は矢印で表示
  • 循環依存のチェックも実装

✏️ サイドバーでインライン編集

チケットページに遷移せずに、サイドバーから直接編集できます。

編集可能な項目:

  • 件名
  • ステータス
  • 担当者
  • 優先度
  • 開始日・期日
  • 進捗率
  • トラッカー
  • カテゴリ

📊 豊富なフィルタリング

ツールバーから様々な条件でフィルタリングできます:

  • プロジェクト
  • バージョン
  • ステータス
  • 担当者
  • テキスト検索

🎨 表示カスタマイズ

  • ズーム: 月/週/日の3段階 + 細かいズーム調整
  • 行高: 設定画面で調整可能
  • 表示列: サイドバーの列を自由に選択・並び替え
  • プロジェクトグループ化: 複数プロジェクトを階層表示

技術スタック

レイヤー 技術
フロントエンド React 19 + TypeScript
状態管理 Zustand
描画 HTML5 Canvas
ビルド Vite
テスト Vitest + Playwright
バックエンド Redmine Plugin (Ruby)

アーキテクチャ

┌─────────────────────────────────────────────────────────────┐
│                        React SPA                            │
├─────────────────────────────────────────────────────────────┤
│  ┌────────────┐  ┌────────────┐  ┌────────────────────────┐ │
│  │  Toolbar   │  │  Sidebar   │  │    Canvas Timeline     │ │
│  │ (filters)  │  │ (editable) │  │  ┌──────────────────┐  │ │
│  └────────────┘  └────────────┘  │  │ TaskRenderer     │  │ │
│                                  │  │ OverlayRenderer  │  │ │
│                                  │  │ BackgroundRender │  │ │
│                                  │  └──────────────────┘  │ │
│                                  └────────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│                    Zustand Stores                           │
│           (TaskStore, UIStore, EditMetaStore)               │
├─────────────────────────────────────────────────────────────┤
│                      API Client                             │
│              (fetch → Redmine REST API)                     │
└─────────────────────────────────────────────────────────────┘

インストール方法

1. プラグインをクローン

cd /path/to/redmine/plugins
git clone https://github.com/tiohsa/redmine_canvas_gantt.git

2. Redmineを再起動

# Pumaの場合
bundle exec pumactl restart

# Passengerの場合
touch tmp/restart.txt

3. REST APIを有効化

  1. 管理者としてログイン
  2. 管理設定API
  3. RESTによるWebサービスを有効にする にチェック

4. モジュールと権限を設定

  1. プロジェクト 設定モジュールCanvas Gantt を有効化
  2. 管理ロールと権限 で以下を設定:
    • View canvas gantt: ガントチャートの表示
    • Edit canvas gantt: ガントチャートからの編集

Docker Composeで試す

すぐに試したい方のために、Docker Compose設定も用意しています。

cd plugins/redmine_canvas_gantt
docker compose up -d

http://localhost:3000 でRedmineにアクセスできます。

初期データを投入する場合:

docker compose exec -e REDMINE_LANG=ja redmine bundle exec rake redmine:load_default_data

動作環境

  • Redmine: 6.x
  • Ruby: 3.x
  • Node.js: 18+ (開発時のみ)

設定オプション

管理 → プラグイン → Canvas Gantt → 設定 から以下をカスタマイズできます:

設定項目 説明
行の高さ デフォルトの行高(ピクセル)
インライン編集項目 サイドバーで編集できる項目を選択
Vite dev server 開発時にホットリロードを有効化

今後の予定

  • クリティカルパスの表示
  • エクスポート機能(PDF/PNG)
  • カスタムフィールドのサポート強化
  • キーボードショートカット

おわりに

Redmineの標準ガントチャートに不満を感じている方は、ぜひ試してみてください。

GitHubリポジトリ: https://github.com/tiohsa/redmine_canvas_gantt

Redmine Plugins Directory: https://www.redmine.org/plugins/redmine_canvas_gantt

Issue報告やPull Requestも歓迎です!

参考リンク

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?