JIRA自定義一個優雅的可多選下拉列表

  • 2019 年 12 月 16 日
  • 筆記

公司PMO最新發布的規範,需要在每個JIRA故事裡輸入涉及上線的應用系統名稱,最開始就是自定義了一個最簡單的文本框,讓Owner自己填寫,多個系統逗號分隔。後來在數據統計的過程中發現系統應用名每個人寫的千奇百怪,難於對齊。所以考慮將所有的系統應用名稱導入到JIRA中,讓Owner直接選擇減少出錯概率。但是JIRA內嵌的幾個標準自定義控制項,實在是不好用。

自定義欄位的路徑是:右上角的「JIRA管理」 ->「問題」->「自定義欄位」->"添加",可多選的欄位類型如下。

  1. 多個checkbox的複選框,對於我們上百個的微服務系統,全部陳列到一個頁面,那簡直沒法看,故而放棄。
  2. Select List(多選)是個帶垂直滾動條的多選框,這個控制項也有問題,若上百個系統在裡面滾動,多選需要按住Ctrl來多選,而且在滾動過程中,如果不小心沒按住Ctrl,之前其他人選擇的系統名稱,可能就丟了,不直觀。
  3. Select List(級聯) 場景不合適,忽略。

checkbox 和 多選列表效果如下圖所示。

那麼有沒有一種更優雅的方式,可以在下拉列表中多選,而且每次選擇後可以有直觀的提示我選擇了哪些呢?當然有!而且只需要簡單的幾行程式碼。步驟如下:

1.繼續之前的路徑,在自定義欄位介面,仍然選擇Select List(多選);

2.名稱隨便輸入一個你想要在Issue編輯頁上顯示的名字,比如我這裡是叫"Related Applications";

3. 描述文本框留空,本文最關鍵的幾行程式碼就是要存到這個「描述」里;選項先隨便填入一個,確定即可;

4. 進入JIRA的資料庫中,運行如下SQL,找到這個ID,比如是12000;

select id from customfield  where cfname='Related Applications';  //cfname就是剛才你自定義欄位的名稱

5.複製如下的程式碼,將裡面的<cf-id>替換為上一步從資料庫里查詢到的ID,比如customfield_<cf-id>

替換後變為(注意不要不小心加入空格啥的)

customfield_12000

<script type="text/javascript">  (function($) {     AJS.$("#customfield_<cf-id> option[value='-1']").remove(); //Removes the default value "None"       function convertMulti(id){         if (AJS.$('#'+id+"-textarea").length == 0){             new AJS.MultiSelect({                 element: $("#"+id),                 itemAttrDisplayed: "label",       errorMessage: AJS.params.multiselectComponentsError            });         }     }       AJS.toInit(function(){         convertMulti("customfield_<cf-id>");     })       JIRA.bind(JIRA.Events.NEW_CONTENT_ADDED, function (e, context) {         AJS.$("#customfield_<cf-id> option[value='-1']").remove();         convertMulti("customfield_<cf-id>");     });})(AJS.$);  </script>

6. 從JIRA管理重新進入"自定義欄位",選擇"編輯",將上一步全局替換完畢的程式碼黏貼到「描述」中,保存;

7. 退出繼續對自定義欄位「配置」多個可選項,手動一個一個添加吧…

我曾經試過直接在資料庫表 customfieldoption中插入,後來會引起ID衝突,全部回滾了。如果真的太多選項,你可以網頁抓一下network找到那個jspa介面,自己寫程式碼調用介面也可以。反正盡量不要直接操作資料庫。

大功告成!!!