пятница, 22 декабря 2017 г.

JIRA: Отображение поля на основе параметров другого поля

Типичная задача, которой нет в базовом варианте JIRA. 
Существуют некоторые обходные пути, посредством работы JS. Скрипт вставляется в описание необходимого поля. 
Существует описанный пример вот тут и тут Но данный пример осуществляет не совсем то, что необходимо на практике. Разберем пример: 
<script type="text/javascript">
priority = document.getElementById('priority');
if (priority) {
target = document.getElementById('customfield_10000');
// Hide the target field if priority isn't critical
if (priority.value != 2) target.style.display='none';
priority.onchange=function() {
if (this.value == 2) {
target.style.display = '';
target.value="enter message here";
} else {
target.style.display='none';
}
}
}
</script>



В данном примере подразумевается отображать или скрывать настраиваемое поле customfield_10000 на основе того, какой будет выбран приоритет у задачи. 
Если приоритет будет иметь значение 2 (критический, по умолчанию под этой цифрой), то поле отображается, в противном случае - не отображается. 
Данный скрипт необходимо вставить в описание настраиваемого поля customfield_10000
Этот пример неудачен тем, что "название поля" останется на экране, а его значения (input's) будут скрыты. Куда более эффективнее и приятнее для глаза - полностью скрывать поле, вместе с его именем. Такие примеры я приведу ниже. 
Описание ниже-представленного блока будет после самого блока. 
<script type="text/javascript">
var radiovalues = document.getElementsByName("customfield_12617");
var hideCustom12608 = document.getElementById("customfield_12608");
var hideCustom12609 = document.getElementById("customfield_12609");
var hideCustom12610 = document.getElementById("customfield_12610");
var hideCustom12611 = document.getElementById("customfield_12611");
var hideCustom12613 = document.getElementById("customfield_12613");
var parentCustom12608 = document.getElementById("customfield_12608").parentNode;
var parentCustom12609 = document.getElementById("customfield_12609").parentNode;
var parentCustom12610 = document.getElementById("customfield_12610").parentNode;
var parentCustom12611 = document.getElementById("customfield_12611").parentNode;
var parentCustom12613 = document.getElementById("customfield_12613").parentNode;
for (var i = 0; i < radiovalues.length; i++) {
if (radiovalues[i].checked) {
else {
parentCustom12608.style.display = "none";
parentCustom12609.style.display = "none";
parentCustom12610.style.display = "none";
parentCustom12611.style.display = "none";
parentCustom12613.style.display = "none";
}
radiovalues[i].onchange = function() {
if (this.value === "12435" || this.value === "-1") {
hideCustom12608.style.display = "none";
hideCustom12608.value = "-1";
hideCustom12609.style.display = "none";
hideCustom12609.value = "-1";
hideCustom12610.style.display = "none";
hideCustom12610.value = "-1";
hideCustom12611.style.display = "none";
hideCustom12613.style.display = "";
parentCustom12608.style.display = "none";
parentCustom12609.style.display = "none";
parentCustom12610.style.display = "none";
parentCustom12611.style.display = "none";
parentCustom12613.style.display = "";
else {
hideCustom12608.style.display = "";
hideCustom12609.style.display = "";
hideCustom12610.style.display = "";
hideCustom12611.style.display = "";
hideCustom12613.style.display = "none";
parentCustom12608.style.display = "";
parentCustom12609.style.display = "";
parentCustom12610.style.display = "";
parentCustom12611.style.display = "";
parentCustom12613.style.display = "none";
}
};
}
</script>
В силу того, что полей для манипуляций много - я разместил данный скрипт в единственном описании поля customfield_12617
Изначально мы объявляем переменные для всех необходимых полей. В последствии будем присваивать значения на основе этих переменных. 
Первым делом скрываем "ненужные" поля на стартовом экране

Необходимо учесть, если пытаться скрыть поля средствами описанными в примере от Atlassian (выше) - то скрываться будут только значения полей, но названия поля останется отображаемым. Нам необходимо получить родительское значение наших инпутов, чтобы скрыть и название поля. Для этого мы используем parentNode: 
var parentCustom12608 = document.getElementById("customfield_12608").parentNode;
В цикле мы сразу же скрываем все требуемые нам поля, уже средством управления переменными выставив значение стилю в none
parentCustom12608.style.display = "none";
После этого, функцией, мы проверяем изменение наших "радио-значений"
radiovalues[i].onchange = function() {
if (this.value === "12435" || this.value === "-1")

Значение -1 всегда обозначает NONE \ Не назначено

В некоторымх случаях - я намеренно выставляю значение -1 определенным полям. Это делается для того, чтобы ранее выставленные значения по умолчанию - не появились в задаче, если на этапе создания задачи - эти поля должны были быть скрытыми. 
Например на скрине выше видно, что поле "Операционная система" имеет значение по умолчанию: Windows 2012 R2. Но в случае создания заявки будет выбрано Действие с сервером: Клонирование вирт. сервера. То поле "Операционная система" должно быть скрыто и более того иметь пустое значение. И если намеренно не выставить значение в -1 то после создания заявки "Клонирование вирт. сервера" - вы увидите у себя это значение на экране заявки.