4
3
2

JIRAでは、トランジョン時に事後操作でフィールドの値を変更したりできますが、
これを課題編集時に行うことは可能でしょうか?

具体的には、課題編集時にカスタムフィールドの値を評価して、評価結果によりセキュリティレベルを操作するような処理を入れたいと思っています。

    Commentコメントを追加...

    2 回答

    1.  
      5
      4
      3

      いろいろな条件によって考え直さないといけないかと思いますが...

      例えばラジオボタンの値によってセキュリティレベルを変更するスクリプトを
      ラジオボタンフィールドの説明欄に挿入してみました。

      <script>
      AJS.toInit(function () {
          function func() {
              // フィールド ID は置き換える
              var radioButton = document.querySelectorAll('[name="customfield_11400"]');
              var radioButtonField = radioButton[0].parentElement.parentElement;
              var securityLevel = document.getElementById('security').options;
              
              function setLevel(levelName){
                  for(var i = 0,len = securityLevel.length; i < len; i++){
                      if(securityLevel[i].textContent.indexOf(levelName) != -1){
                          securityLevel[i].selected = true;
                          break;
                      }
                  }
              }
      
             radioButtonField.addEventListener('click', function(){
                 for(var i = 0, len = radioButton.length; i < len; i++){
                     if(radioButton[i].checked){
                         // ラジオボタンの値によってセキュリティレベルを変更
                         switch(radioButton[i].nextElementSibling.textContent){
                              // ラジオボタンの値が「bbb」の場合
                             case 'bbb' :
                                 // セキュリティレベル「ユーザー」に設定
                                 setLevel('ユーザー');
                                 break;
                              // ラジオボタンの値が「ccc」の場合
                             case 'ccc' :
                                 // セキュリティレベル「管理者のみ」に設定
                                 setLevel('管理者のみ');
                                 break;
                              // その他
                             default :
                                 // セキュリティレベルなし
                                 setLevel('なし');
                                 break;
                         }
                      break;
                     }
                 }
             },false);
             
         }
      
         func();
         JIRA.bind(JIRA.Events.NEW_CONTENT_ADDED, function (e, context, reason) {
           if (reason === JIRA.CONTENT_ADDED_REASON.dialogReady) {
             func();
           }
         });
      });
      </script>

      汚かったらすみません...

      あとはアドオンの Scriptrunner でしょうか...?

      1. 蒼龍

        Shuzaburo Dobaさん

        フィールドの説明欄にスクリプトを突っ込むなんて言う荒業ができるんですね!!
        考えた事すらありませんでした。

        ちょっとこれで評価してみようと思います!

      2. 蒼龍

        Shuzaburo Dobaさん
        試しにクリックでアラートを出すような形で動作確認をしてみました。

        この仕組みだと、通常の編集画面では編集できますが、インライン編集だと説明が表示されないから動かないのですね・・・。
        これに関してはインライン編集を禁止にするかどうか内部で議論してみます。

        次は編集で割り込ませるイベントをClickからsubmitとかにして値の評価ができないか確認してみます。

        ひとまず途中報告まで・・・

      3. Shuzaburo Doba

        蒼龍 さん

        確かにインライン編集では動かないですね...
        申し訳ありません。

        共有ありがとうございます。

        伊藤看寿 さんの内容がとても参考になりそうです。

      4. Kengo Ohsaki

        蒼龍-san,

        私も 伊藤看寿-san の意見の通り、アドオンなどで課題編集イベントを取得するほうがいいと思います。JavaScriptは見た目上での処理しかできないので…。

        カスタムフィールドの値を評価して、評価結果によりセキュリティレベルを操作するような処理を作るとした場合は  ScriptRunner for JIRA の https://scriptrunner.adaptavist.com/latest/jira/listeners.html になるかと思います。

      5. 蒼龍

        皆様

        色々ありがとうございました。

        最終的に Shuzaburo Dobaさんのコードを参照に、以下のような感じのスクリプトを説明欄に埋め込みました。

        <script>
            function func(){
        
                var edit_button = document.getElementById("edit-issue-submit");
        
                   edit_button.addEventListener('click', function(){
                       var radioButton = document.querySelectorAll('[name="customfield_10300"]');
                       var radiovalue;
                       var number = document.getElementById("customfield_10301").value; 
                       
                       for(var i=0;i<radioButton.length;i++){
                           if(radioButton[i].checked){
                               radiovalue = radioButton[i].nextElementSibling.textContent;
                               break;
                           }
                       }
                       
                       if(radiovalue == "外部開示" && number != ""){
                           setLevel("開示");
                       }else{
                           setLevel("非開示");
                       }
                       
                       
                   },false);
           }
           function setLevel(levelName){
               var securityLevel = document.getElementById('security').options;
               for(var i = 0,len = securityLevel.length; i < len; i++){
                   if(securityLevel[i].textContent.indexOf(levelName) != -1){
                       securityLevel[i].selected = true;
                       break;
                   }
               }
           }
           func();
        </script>

        伊藤看寿さん、 Kengo Ohsakiさん
        リスナー機能の提案ありがとうございました。
        Atlassianのドキュメントを読んではみたのですが、リスナー機能の概要がつかめず、どういったことができてどう使う機能なのかが読み取れませんでした。
        細かく解説しているサイトも無く、私にリスナー機能を使うのは難しそうです。

        せっかくオススメとして提案していただいたのに申し訳ないです・・・

      6. Kengo Ohsaki

        蒼龍-san,

        いえいえ、結果として目的達成できたということでよかったです

        リスナー機能は、課題を編集したらメールが届くかと思いますが

        内部的には課題編集というイベントをトリガーにしてメールが送られています。

        メール以外にもアドオンを入れる・作ることで課題編集イベントをトリガーにして、任意の課題操作をできるようにするというようなものですね。

        ワークフローの事後操作はステータス変更時にしか動かないですが、イベントをトリガーにできるのでご質問のようなケースでは一番良い方法ですが、アドオンのリスナー機能を使うのは確かに少し難しいですね…。


      Commentコメントを追加...
    2.  
      5
      4
      3

      リスナーで課題更新イベントを拾って、セキュリティレベルフィールドを更新する方法もあるかもしれません。

      しかし、自作のリスナーをアドオンで実装するのは少々手間がかかるので、ScriptRunner の Listeners や Automation for Jira などのアドオンを使えば、もう少し楽に実現できるかもしれませんね(具体的なコードをすぐに示せずすみません・・・)。


        Commentコメントを追加...