Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
View Customize Pluginで出来ること
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
onozaty
November 28, 2015
Programming
0
190
View Customize Pluginで出来ること
第9回 redmine.tokyo のLTで発表したView Customize Plugin for Redmineの紹介です。
onozaty
November 28, 2015
Tweet
Share
More Decks by onozaty
See All by onozaty
Dev Containers のススメ
onozaty
0
19
リモートワーク中に買って良かったものベスト3
onozaty
0
200
情報を表現するときのポイント
onozaty
0
28
チームで開発するための環境を整える
onozaty
1
330
Selenium入門(2023年版)
onozaty
1
200
40歳過ぎてもエンジニアでいるためにやっていること
onozaty
0
73
Java8から17へ
onozaty
0
25
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
0
250
Redmine issue assign notice plugin の紹介
onozaty
0
250
Other Decks in Programming
See All in Programming
モダンOBSプラグイン開発
umireon
0
180
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
130
2026-03-27 #terminalnight 変数展開とコマンド展開でターミナル作業をスマートにする方法
masasuzu
0
220
我々はなぜ「層」を分けるのか〜「関心の分離」と「抽象化」で手に入れる変更に強いシンプルな設計〜 #phperkaigi / PHPerKaigi 2026
shogogg
2
640
Strategy for Finding a Problem for OSS: With Real Examples
kibitan
0
120
PHP でエミュレータを自作して Ubuntu を動かそう
m3m0r7
PRO
2
150
Redox OS でのネームスペース管理と chroot の実現
isanethen
0
460
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
270
Fundamentals of Software Engineering In the Age of AI
therealdanvega
2
300
GoのDB アクセスにおける 「型安全」と「柔軟性」の両立 - Bob という選択肢
tak848
0
280
Geminiをパートナーに神社DXシステムを個人開発した話(いなめぐDX 開発振り返り)
fujiba
0
120
おれのAgentic Coding 2026/03
tsukasagr
1
110
Featured
See All Featured
A better future with KSS
kneath
240
18k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
310
What's in a price? How to price your products and services
michaelherold
247
13k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Six Lessons from altMBA
skipperchong
29
4.2k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
210
Information Architects: The Missing Link in Design Systems
soysaucechin
0
850
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
150
A Modern Web Designer's Workflow
chriscoyier
698
190k
Are puppies a ranking factor?
jonoalderson
1
3.2k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.4k
Transcript
View Customize Pluginで できること 2015-11-28 第9回redmine.tokyo勉強会 Hirokazu Onozato (onozaty)
自己紹介 • Hirokazu Onozato (onozaty) • https://twitter.com/onozaty • https://github.com/onozaty •
http://www.enjoyxstudy.com/ • 株式会社ユニスティ所属 • エンジニア • Redmine使用歴 6年 個人でのPlugin開発は2年前から • Parent issue filter https://www.redmine.org/plugins/redmine_parent_issue_filter • Copy parent issue https://www.redmine.org/plugins/copy_parent_issue_id
View Customize Plugin • View Customize Plugin https://github.com/onozaty/redmine-view-customize • Redmineの画面をカスタマイズするためのPlugin
• 特定の画面に対して、JavaScript、CSSを埋め込む 機能を提供
設定方法 コードを実行するパス(URL)。 正規表現で記載。 実行するコード。 JavaScript または StyleSheet(CSS)で書く。 Redmineの画面で使用され ているjQueryも使える。 (Redmineのバージョンに
よってライブラリが違うの で注意) プライベートにチェックを入れると、作成したユーザ のみに有効 →個人で動作確認して、OKだったら全員に反映すると いったことができる
どういうカスタマイズをするかは ユーザ次第 次からのサンプルを カスタマイズのご参考に
Sample 1 プロジェクト毎にヘッダを変えて プロジェクトを識別しやすいように
プロジェクト毎にヘッダを変える Path pattern: .* Type: StyleSheet Code: body.project-a #top-menu {
background-color: #006400; /* dark green */ } body.project-a #header { background-color: #008000; /* green */ } body.project-b #top-menu { background-color: #696969; /* dimgray */ } body.project-b #header { background-color: #808080; /* gray */ } • body要素にプロジェクト毎にclass(project-<プロジェクト ID>)が設定されるので、それを利用してCSSを設定
プロジェクト毎にヘッダを変える
Sample 2 チケット一覧を識別しやすいように
チケット一覧を識別しやすいように Path pattern: /issues$ Type: StyleSheet Code: /* 自分が担当のチケットは太字 */
tr.issue.assigned-to-me { font-weight: bold; } /* 優先度が今すぐのものは赤字 */ tr.issue.priority-highest, tr.issue.priority-highest a, tr.issue.priority-highest a:link, tr.issue.priority-highest a:visited { color: red; } /* 題名は折り返さない */ tr.issue td.subject { white-space: nowrap; } • チケットの情報に基づくclassが指定されているので、それ を活用。テーマでも同じことができる。
チケット一覧を識別しやすいように 設定前 設定後
Sample 3 よくアクセスするページのリンクを ヘッダメニューに追加する
ヘッダメニューにリンクを追加 Path pattern: .* Type: JavaScript Code: // 全てのチケット一覧リンクをヘッダに $(function()
{ $('#top-menu > ul') .append('<li><a href="/issues">全てのチケット</a></li>'); }); • ドキュメントのロード完了時にヘッダにリンクを追加する • Redmineのすべての画面でjQueryが読み込まれている (2.1.0以降)ので、jQueryの関数使うといろいろ楽になる
ヘッダメニューにリンクを追加
Sample 4 子チケット追加時に親チケットの 情報を引き継いで入力の手間を減らす
子チケット追加時に親チケットの情報を引き 継ぐ Path pattern: /issues/[0-9]+$ Type: JavaScript Code: $(function(){ //
子チケットの追加リンクを取得 var addLink = $('#issue_tree a[href*="/issues/new"]')[0]; if (!addLink) { return; } // 対象バージョンがあれば子チケットの追加リンクにパラメータ追加 var version = $('#issue_fixed_version_id').val(); if (version) { addLink.href += '&issue%5Bfixed_version_id%5D=' + version; } }); • リンクにパラメータを追加してあげることにより、チケッ ト作成時の初期値(カスタムフィールドを含むすべての項 目)を指定可能
子チケット追加時に親チケットの情報を引き 継ぐ 子チケット追加のリンク押下 で新しいチケットを作成した 際に、情報が引き継がれる
Sample 5 サイドバーを開閉式にして 画面を広く使えるようにする
サイドバーを開閉式に Path pattern: .* Type: JavaScript Code: 100行超えるスクリプトになるので、コード全体は下記参照 https://github.com/onozaty/redmine-view-customize- scripts/blob/master/toggle_sidebar.js
• JavaScriptで頑張れば、結構なんでもできる
サイドバーを開閉式に クリックで開閉
Sample 6 進行中のステータスにおける 担当者の入力漏れを防ぐ
進行中のステータスで担当者を必須に Path pattern: /issues/ Type: JavaScript Code: $(function() { $('#issue-form
input[type="submit"]') .on('click', function(event) { var statusId = $('#issue_status_id').val(); var assignedId = $('#issue_assigned_to_id').val(); if (statusId == '2' && !assignedId) { // 2:進行中 alert('進行中にもかかわらず担当者が設定されていません。'); return false; } }); }); • チケット作成、更新時のsubmitにフックして独自にチェッ ク処理を差し込むイメージ
進行中のステータスで担当者を必須に 進行中ステータスの状態で 送信ボタンを押下した際に、 警告ダイアログがでる
Sample 7 チケット作成時にトラッカーに応じて デフォルト値を変更する
トラッカーに応じてデフォルト値を変更 Path pattern: /issues/new$ Type: JavaScript Code: $(function() { $('#all_attributes').change(function(e)
{ if (e.target.id == 'issue_tracker_id') { // トラッカーが変わった場合にデフォルト値を切り替え setDefalutValue(); } }); var setDefalutValue = function() { // トラッカーに応じてデフォルト値を設定 ~ 省略 ~ } // 現在選択されているものをもとに setDefalutValue(); }); コード全体は下記参照 https://github.com/onozaty/redmine-view-customize- scripts/blob/master/set_default_value_at_change_tracker.js
トラッカーに応じてデフォルト値を変更 トラッカーを切り替えたタ イミングでデフォルト値も 切り替わる
ほかにもいろいろ
ほかにもいろいろ • ステータス変更に連動して、その他の項目(担当者 や進捗など)を変える • 新規チケット作成時に担当者をデフォルト自分に • 担当者のセレクトボックスで、特定のルールでグ ループ化して選択しやすいように •
ショートカットキーを追加 • 全画面にお知らせを表示 などなど
参考 • 本資料に書かれた設定を行ったVagrant box • https://atlas.hashicorp.com/onozaty/boxes/redmine- viewcustomize • スクリプトの一覧 •
https://github.com/onozaty/redmine-view-customize- scripts (すいません、これから追加整理予定です) • Redmineの画面で振られているclass属性について - Enjoy*Study • http://blog.enjoyxstudy.com/entry/2014/10/11/000000