В предыдущей статье "Несколько примеров успешного изобретения велосипеда" мы поделились рядом решений, полученных путем комбинирования наших плагинов для Atlassian, таких как MyGroovy, JSIncluder и MyCalendar. На этот раз мы рассмотрим еще один плагин из нашей коллекции — Custom Select List. Custom Select List в сочетании с Groovy или JavaScript превращается в очень мощный инструмент по автоматизации, главная особенность которого — это метаданные опций. Очень много решений реализовано у нас с применением именно этой особенности. В основном, это блоки согласования. С помощью метаданных удобно хранить цепочки согласования с заранее определенными этапами и ответственными, но этим сфера его применения не ограничивается. Рассмотрим на примере реальной задачи, как можно с помощью данного плагина реализовать создание подзадач по шаблону.  Инструменты, которые понадобятся: MyGroovy, JSIncluder и Custom Select List. Команда разработки проводит сессии по планированию спринтов для быстрой декомпозиции и оценки историй. Необходим удобный способ создания подзадач, чтобы можно было использовать "шаблоны" — заранее заготовленные списки задач для типов историй. Это многократно ускорило бы процесс. Сначала мы проверили наличие готовых решений. Сразу на маркетплейсе нашли подходящий плагин, перекрывающий данную потребность, но так как у этого плагина нет поддержки версии Data Center Jira Software, это не гарантирует его соответствие большим кластерным средам. Также плагин не состоит в программе Atlassian Marketplace Bug Bounty, поэтому от идеи со сторонним решением пришлось отказаться. В итоге решили, что создание сабтасков по шаблону будет через loop-переход. Для этого на экран перехода нужно вывести поле для выбора шаблона и настроить форму для редактирования данных и управления количеством создаваемых сабтасков. Итоговый вид перехода Quick Sub-Task будет выглядеть так:   Для этого воспользуемся бесплатным плагином Custom Select List. Создаем новое поле и называем его "Quick subtasks template". Получившееся поле имеет customfield - 63803. Это поле будем использовать на следующем шаге для отрисовки формы по заданному шаблону.
Добавим первый шаблон "Ручное тестирование": Шаблон будет содержать следующие поля: summary, description, estimate, cfields. В данном примере дополнительные поля могут быть только с типом "список", в дальнейшем при необходимости можно добавить поддержку и других типов полей. Это задается на шаге 3 в groovy-скрипте.  Готовим frontend-часть, в этом нам поможет JS Includer. Код должен уметь получать данные из шаблона и формировать на их основе форму. Также код должен уметь добавлять или удалять элементы формы, чтобы можно было управлять количеством создаваемых через форму подзадач. Ну и, конечно же, код должен уметь сохранять итоговую форму в какое-нибудь поле (его создадим далее), чтобы с помощью пост-функции парсить данные и на их основе создавать подзадачи. Создаем новое поле Subs creator с типом Text Field (multi-line). В него мы будем сохранять итоговые значения с нашей формы. Получившееся поле имеет customfield - 63339. Затем, на шаге 3, с помощью groovy-скрипта, из значений этого поля будут создаваться наши сабтаски.
Приступим к написанию нашей формы. У нас готова форма и заведены все необходимые поля, пора приступать к backend-части. Так как одна из задач, которая перед нами стояла — это дать возможность заказчику самому выбирать поля, которые необходимо добавить в шаблон, то нужно учесть это в скрипте и завязаться на имена полей и опций, а не на их id.  Скрипт будет состоять из нескольких шагов. Первый шаг — это получить и распарсить значения из поля с Subs creator (customfield - 63339), а вторым шагом уже создать по полученным данным подзадачи.  Дополнительно к этому можно добавить переиндекс создаваемых задач и обернуть создание в отдельный поток. Чтобы переход не дожидался создания подзадач, можно добавить в код запуск отдельного потока (thread) для создания. Для примера создадим 3 подзадачи по шаблону и немного скорректируем входные параметры. Так выглядит наша кнопка:  Выберем шаблон "Ручное тестирование":  Появилась кнопка "Добавить подзадачу". Нам нужно создать их 3, поэтому нажимаем 3 раза на кнопку добавить:  Все 3 формы не умещаются на экране, но на примере двух мы видим, что из шаблона подтянулись следующие значения:  Поменяем значения summary и estimate у двух подзадач и после создания получим следующий результат:  Custom Select List можно использовать не только для создания шаблонов к подзадачам. Сценариев множество, например, для заполнения полей на форме запроса при создании или кастомизации рассылки уведомлений на переходах. Но самое частое применение — это согласование, где есть множество вводных и сложная матрица ответственных с различными этапами и условиями. Так мы в рамках одного статуса зацикливаем все согласование по запросу и, тем самым, избегаем избыточности статусной модели. И это далеко не весь список возможных реализаций. При должном уровне фантазии и времени можно делать достаточно интересные вещи, главное — не переусердствовать, ведь кому-то это потом еще и поддерживать.