背景
Redmineを昔から使っている人で、トラッカーのリンクフィールドに、ファイルサーバーのパス(file://xxxxxxx)を設定している人はどれくらいいるでしょう?
まだInternet Explorer(※以後「IE」)が全盛期のころ、これをクリックするとエクスプローラーでファイルサーバーが表示されたので、こういう人達はそれなりにいる様な気がしています。
私がいたプロジェクトでもそういう使い方をしている人たちがいました。
月日が流れIEが衰退してしまった現在、ファイルサーバーパスのリンクをクリックしてエクスプローラーを開くには、Edgeブラウザで且つ色々な条件が必要となりました。
- HTTPSであること
- レジストリの設定(IntranetFileLinksEnabled)
- ローカルイントラネットのゾーン設定
そのため、Redmineのトラッカーのリンクフィールドに、ファイルサーバーのパス(file://xxxxxxx)を設定している人たちは大幅に譲歩して、
表示されるリンク文字列をコピーして、エクスプローラーのアドレス欄に貼付けして開くという事をしていました。
(※そういう人、他にもおりますでしょうか??いらっしゃいましたらコメント頂けると助かります。)
問題内容
ところが、今回Redmineをv5系にバージョンアップしたところ、リンクフィールドの文字が長いと表示が省略されてしまい、ファイルサーバーパスをコピーできないと利用者からクレームがありました。。。
また、右クリックメニューから「リンクをコピー」をすると、ダブルバイト文字がURLエンコード( 例:あ → %E3%81%82 )されてしまっており、エクスプローラーのアドレス欄に貼り付けられませんでした。
「これはシステムの改悪だぁ~~!こんなんじゃ業務ができない。Redmineを元のバージョンに戻せ~!」と利用者が息巻いてきて困りました。
カスタムフィールドの形式を「リンク」では無く「テキスト」にすれば文字は全て表示されるのですが、これまで何年も登録してきたデータを全て新たに作成したテキストのカスタムフィールドに移すのもかなり面倒な作業です。。
View Customize Pluginでの回避策
そこで「View Customize Plugin」で以下のスクリプトを作成し、問題を回避しました。
$(function(){ // 全Aタグを取得 $('a').each(function(index, element){ // Aタグの href値とtext値を取得 let a_href_val = $(element).attr('href'); let a_text = $(element).text(); if ( a_text.startsWith('file://') ){ // text値が 'file://'から始まる時、text値をhref値に置き換える。 $(element).text(a_href_val); } else if (a_text.startsWith('\\') ) { // text値が "\\"から始まる時、hrefには"http://"が補完されている。 if ( a_href_val.startsWith('http://') ){ // href値が"http://"から始まる時、先頭の"http://"を外してhref値をtext値に置き換える $(element).text(a_href_val.substring('http://'.length)); }else if ( a_href_val.startsWith('https://') ){ $(element).text(a_href_val.substring('https://'.length)); } } }); });
やっていることは以下となります。
- Aタグのtext値が「file://」から始まる場合、href値でtext値を上書きする。
- Aタグのtext値が「\\」から始まる場合、href値は先頭に「http://」が補完されているので、それを外した値でtext値を上書きする。
後書き
Redmineをバージョンアップして、新バージョンでのプラグインの動作検証をして、データ移行も完璧にやって。。。
それでもこういう問題は発生する物ですね。
同様の問題に直面している人がどれくらいいるのか分かりませんが、本記事がどなたかのお役に立てば幸いです。
最後まで読んで頂きありがとうございました。