view customize pluginで遊ぶ


[Redmine Advent Calendar 2019](Https://adventar.org/calendars/4221)　初参加です。
13日の金曜日ですｗよろしくお願いします。
題名のとおり、楽しすぎる[view customize plugin]( 
https://github.com/onozaty/redmine-view-customize) [^1]で遊びつつ、Redmineをカスタマイズしています。

#目次
1.[チケットの誤削除はご勘弁](#1チケットの誤削除はご勘弁)
2.[チケット一覧上部にもエクスポートリンク欲しい](#2チケット一覧上部にもエクスポートリンク欲しい)
3.[リンクを別窓で開きたいって言われた](#3リンクを別窓で開きたいって言われた)
4.[おしまいに](#4おしまいに)
の3本＋1でお送りします。

---
##1．チケットの誤削除はご勘弁

親チケットをうっかり削除して<div><font color="red"><b>ああああああ!!!!!!</b></font></div>ってなることありますよね。私はありました。
先輩も同じ事やって灰になってました。
なので私はそんな先輩を助けたいと思い、更にネットに助けを求めたところ [^2]、以下のような記事を見つけたのです。
　
[ユーザの誤削除を絶対にさせたくない](https://redmine.tokyo/issues/313)
　
見つけた私のアルカディア。要は「削除」を非表示にすればいいんだよ。ということで、こちらの記事を応用して以下のようにしてみました。

- あらゆる画面から「削除」を消してしまおう
- チケット詳細の削除は使いたいときもあるので表示・非表示切り替えよう
　

ぐだぐだ言ってないでコードです。
***<font color=#4689FF>◆あらゆる画面から「削除」を消してしまおう</font>***

```ruby:qiita.CSS
PathPattern:/issues
Type:CSS
挿入位置:全てのページのヘッダ

/*チケット一覧の右クリックメニューでの削除ボタンを非表示*/
div#context-menu a.icon-del{
  display:none;
}

/*チケット編集画面の削除ボタンを非表示*/ 
div.contextual a.icon.icon-del{
  display: none;
}
```

ついでに、うっかりユーザ削除を防ぐためにユーザ管理画面の削除も消します。
ユーザは削除じゃなくて。ロックで。(合言葉)

```ruby:qiita.CSS
PathPattern:/users
挿入位置:全てのページのヘッダ
Type:CSS
/*ユーザ管理画面の削除ボタンを非表示*/ 

.icon-del{
    display:none;
}
```
これでとりあえずめぼしい画面から「削除」が消えました。
次。

***<font color=#4689FF>◆チケット詳細の削除は使いたいときもあるので表示・非表示切り替えよう</font>***

まずはボタンを作る。とりあえずシンプル可愛いのがいい。
ボタンのデザインはお好みでどうぞ。

```ruby:qiita.CSS
PathPattern:/issues
Type:CSS
挿入位置:チケット詳細の下
/* うっかりチケット削除を防ぐため「削除ボタン」非表示→表示（切替ボタンデザインCSS）*/ 

button.button1 {
  font-size: 9pt;
  display: inline-block;
  text-decoration: none;
  background: #fffffe;
  color: #67c5ff;
  border: solid 1px #67c5ff;
  border-radius: 3px;
  transition: .4s;
}

button.button1:hover {
  background: #67c5ff;
  color: white;
}
```

次、削除できるのは管理者だけでいい。

```ruby:qiita.javascript
PathPattern:/issues
Type:JavaScript
挿入位置:チケット詳細の下
/*うっかりチケット削除を防ぐため「削除ボタン」非表示→表示切替*/ 

$(function () {
  var admin = ViewCustomize.context.user.admin; // 管理者

  // 管理者じゃない場合は適用しない
  if (admin != true){
     return;
  }

  // 削除ボタン表示／非表示切り替え
  $('p.other-formats').append('<br><br><hr><body><button class="button1" title="システム管理者のみ使用できます">削除ボタン「表示／非表示」切替え</button></body>');

  $('button').click(function () {
     $('a.icon.icon-del').toggle();
  });
});
```

見ておわかりのように結構な力業です。きっともっと綺麗になります。
htmlが好きです。
画面上はこんな感じ。

![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332990/ad609cd6-59c1-b0e1-9bcd-ac85f468996b.jpeg)
↓
ステータスとかトラッカーがバラバラで妙なのは気にしないでください。
ただの砂場です。
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332990/b54672fb-e3b4-0b04-00b0-f8672582990c.jpeg)

![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332990/1180b6be-cf67-5ed2-1615-b1ef82b28948.jpeg)
↓
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332990/45e99e2c-4350-054e-12e8-ed5286b8703f.jpeg)



##2．チケット一覧上部にもエクスポートリンク欲しい
　
題名のとおり。
結構csvでエクスポートすることもあるのでいちいち画面下までスクロールするのめんどくさい……。
ここんち、view customizeのバージョンが1.2以下なので挿入位置ないです。

```ruby:qiita.JavaScript
PathPattern:/issues
Type:JavaScript
/*チケット編集画面の削除ボタンを非表示*/ 

$(function() {
  var page = $('span.pagination').clone();
  var other = $('p.other-formats').clone();
  var contex = $('div.contextual').clone();


  $('div.autoscroll').before(page);
  $('div.autoscroll').before(other);
  $('div.hide-when-print').append(contex);
});
```

結果こんな感じ。地味に便利。
ついでにチケット数も表示させておいた。

![WS000006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332990/087452d4-0a17-9d34-54a6-5f14ea9728fb.jpeg)
↓
![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332990/e9a90a08-e2b5-4e85-19eb-e0a55a8f8e18.jpeg)



##3．リンクを別窓で開きたいって言われた

カスタムフィールズの「リンク」を使って他プロジェクトのRedmineチケットと連携取ってるのですが、そのときメンバーに言われたのでやってみた！ [^3]
これはHTTPSしか対処してません。

＜追記＞
前田さんよりフォローいただきました。

>Redmine 4.0からはカスタムフィールドのリンクには external クラスがつきましたので、「3．リンクを別窓で開きたいって言われた」は a.external に _blank を追加する書き方でも実現できます。

とのことです。シンプルイズベストです。
方法はこちらにありました。
[リンクを別タブで表示する(Textile)](https://github.com/farend/redmine-view-customize-examples/blob/master/customizes/0798899d/customize.md)
前田さん、フォローありがとうございました！[^4]

```ruby:qiita.javascript
PathPattern:.*
Type:JavaScript
/*リンクをすべて別窓で開く*/ 

$(function(){
 window.onload = function() {
    for (var i = 0; i < document.links.length; i++) {
       var ele = document.links[i];
       if (ele.href.match(/^https/)) {
           ele.target = "_blank";
       }
    }
 }
});
```

あとこういうのもありかも。<sup>※20200313 13日の金曜日追記。</sup>
ただこの場合、別窓反対のメンバーもいるのでパスとか条件とか気を付けてやりたい。

```ruby:qiita.javascript
PathPattern:.*
Type:JavaScript
/*リンクを別窓で開く*/ 

$(function(){
   $('a[href^=http]').attr("target", "_blank");
   $('a[href^=https]').attr("target", "_blank");
});
```

　
##4．おしまいに
以上、「素人でもなんとかなる！」を表明する記事でした。
先人はたくさんいますし、お世話になっております。めちゃめちゃぐぐるしなんだったらサンプル丸コピですけど、便利を追求すると本当に誰でもなんとかなります。この部分こう変更したらイケる？と思って試してみられるのがview customize plugin[^1]の素晴らしいところです。
Plugin追加やバージョンアップを許してくれない難しいひとたちの目を盗んで、現場にとって色々と使いやすいRedmineにできる道を模索中です。本当感謝しかありません。






[^1]: いつもお世話になっております。
[^2]: 困ったときはひとりで木目を数えずに誰かに助けを求めればいいと教えてもらいました。技の1号とかに。<sup>※ちなみに私は力と技の風車回してる人が好きです。いまだに。</sup>
[^3]: [あんぽんたんさん](http://www9.plala.or.jp/oyoyon/)の[サンプル集](http://www9.plala.or.jp/oyoyon/html/script/blankwin.html)を参考にさせていただきました。
[^4]: うちのRedmineが4.xになるのには果たして一体あと何年かかることだろう。