Не срабатывает onChange при обновлении поля

Здравствуйте.

Ко мне перешла поддержка YouTrack после ухода человека, много написавшего на php и в рабочих процессах. К сожалению связи с ним нет. Поэтому прошу помощи у вас, может быть чем-то поможете.

Ситуация такая. В рабочем процессе сделан вызов всплывающего окна, используя jQuery и php.

В коде php шлётся команда по смене значения в custom field. Она срабатывает.

Мне необходимо отловить эту смену значения указанного поля после закрытия этого окна.

Я сделал модуль в рабочем процессе, но в консоль ничего не пишется, несмотря на то, что значение поля меняется. Привожу код, надеюсь либо посоветуете что-то дельное, либо укажете на мою ошибку.

Спасибо.

 

var entities = require('@jetbrains/youtrack-scripting-api/entities');
var workflow = require('@jetbrains/youtrack-scripting-api/workflow');

exports.rule = entities.Issue.onChange({

title: 'Change_role_after_category',
guard: function(ctx) {
return true;
//ctx.issue.fields['Назначенная категория'] && ctx.issue.fields['Назначенная категория'].isChanged &&
// ctx.issue.fields['Назначенная категория'].name === 'Управление доступом к Хронос';
},
action: function(ctx) {
var issue = ctx.issue;
var bNeedsToShow = ctx.issue.fields['Назначенная категория'] && ctx.issue.fields['Назначенная категория'].isChanged &&
ctx.issue.fields['Назначенная категория'].name === 'Управление доступом';

if (bNeedsToShow)
console.log(bNeedsToShow);

},
requirements: {
}
});

1
9 comments

Михаил, здравствуйте! 

Спасибо за Ваше обращение. Я предлагаю следующие действия для локализации проблемы: 

  1. Проверить, что правило подключено к проекту - находясь на странице проекта, зайдите в рабочие процессы и проверьте, что конкретно данное правило подключено к проекту. Проверьте, что напротив правила не стоит значка requires setup. 
  2.  Дополнить код рабочего процесса секцией requirements и вынести туда используемые значения полей
requirements: { 
AssignedCategory: {
name: 'Назначенная категория',
type: // Здесь необходимо указать тип поля, как в Project-->Fields. Например, это может
быть entities.EnumField.fieldType,
AccessManagement:{
name: 'Управление доступом'
}
}

   Обращение к полям из тела рабочего процесса при этом можно осуществлять с помощью конструкции: 

issue.fields.AssignedCategory.name == ctx.AssignedCategory.AccessManagement.name

   3. Проверить, выводятся ли результаты console.log("Test"); , поместив его прямо в начало секции action. Результат будет свидетельствовать о том, заходим ли мы в рабочий процесс.

   4. Если после всех шагов выше проблема не локализована, сообщите, срабатывает ли логика при ручном   изменении поля? 

Буду ждать Вашего ответа. 

 

1

Леонид, спасибо за быстрый ответ.

Сделал всё, вроде бы так, как Вы указали, но сохранить модуль не даёт, выдает ошибку.

Принтскрин прилагаю.

0

Михаил, 

Я вижу, что в требованиях в секции AssignedCategory некорректно выставлены фигурные скобки. Рекомендую протестировать вариант ниже. 

requirements: { 
AssignedCategory: {
name: 'Назначенная категория',
type:  entities.Field.srtingType,
AccessManagement:{
name: 'Управление доступом к Хронос'
}
}
}

Если не поможет - пришлите дополнительно скрин настроек поля 'Назначенная категория'.

Спасибо.

1

Леонид, спасибо за быстрый ответ.

Ваше указание помогло сохранить скрипт.

Но при выполнении требуемых условий, при выборе требуемой категории получаю следующий лог:

 

Processing issue HD-37554:
TypeError: Cannot find function findValueByName in object {"becomesRemoved": "false",
"isNew": "false",
"$$type": "SimpleProjectCustomField",
"toString": function() {},
"toShortString": function() {},
"required": function() {},
"becomes": function() {},
"isChanged": function() {},
"oldValue": function() {},
"canBeReadBy": function() {},
"canBeWrittenBy": function() {},
"constructor": function() {},
"becomesInvisibleInIssue": function() {},
"becomesVisibleInIssue": function() {},
"getBackgroundColor": function() {},
"getForegroundColor": function() {},
"localizedName": "null",
"name": "Назначенная категория",
"getValuePresentation": function() {},
"isVisibleInIssue": function() {},
"nullValueText": "Нет: назначенная категория"}. (_execution_ctx_#76)

            org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:4198)
            org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:4176)
            org.mozilla.javascript.ScriptRuntime.typeError(ScriptRuntime.java:4209)
            org.mozilla.javascript.ScriptRuntime.typeError2(ScriptRuntime.java:4228)
            org.mozilla.javascript.ScriptRuntime.notFunctionError(ScriptRuntime.java:4300)
            org.mozilla.javascript.ScriptRuntime.getPropFunctionAndThisHelper(ScriptRuntime.java:2575)
            org.mozilla.javascript.ScriptRuntime.getPropFunctionAndThis(ScriptRuntime.java:2557)
            org.mozilla.javascript.ScriptRuntime.getElemFunctionAndThis(ScriptRuntime.java:2506)
            org.mozilla.javascript.gen._execution_ctx__12364._c_anonymous_15(_execution_ctx_:76)
            org.mozilla.javascript.gen._execution_ctx__12364.call(_execution_ctx_)
            org.mozilla.javascript.NativeArray.iterativeMethod(NativeArray.java:1627)
            org.mozilla.javascript.NativeArray.execIdCall(NativeArray.java:341)
            org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:101)
            org.mozilla.javascript.optimizer.OptRuntime.call1(OptRuntime.java:32)
            org.mozilla.javascript.gen._execution_ctx__12364._c_anonymous_12(_execution_ctx_:75)
            org.mozilla.javascript.gen._execution_ctx__12364.call(_execution_ctx_)
            org.mozilla.javascript.NativeArray.iterativeMethod(NativeArray.java:1627)
            org.mozilla.javascript.NativeArray.execIdCall(NativeArray.java:341)
            org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:101)
            org.mozilla.javascript.optimizer.OptRuntime.call1(OptRuntime.java:32)
            org.mozilla.javascript.gen._execution_ctx__12364._c_anonymous_9(_execution_ctx_:58)
            org.mozilla.javascript.gen._execution_ctx__12364.call(_execution_ctx_)
            org.mozilla.javascript.NativeArray.iterativeMethod(NativeArray.java:1627)
            org.mozilla.javascript.NativeArray.execIdCall(NativeArray.java:341)
            org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:101)
            org.mozilla.javascript.optimizer.OptRuntime.call1(OptRuntime.java:32)
            org.mozilla.javascript.gen._execution_ctx__12364._c_anonymous_6(_execution_ctx_:49)
            org.mozilla.javascript.gen._execution_ctx__12364.call(_execution_ctx_)
            org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:405)
            org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3508)
            org.mozilla.javascript.gen._execution_ctx__12364.call(_execution_ctx_)
1

Михаил, 

Метод findValueByName может быть использован только для enum-полей, а в вашем случае он вызывается для поля 'Назначенная категория', с типом entities.Field.stringType. 

Напрямую вызова я не вижу, но подозреваю, что вызов происходит в следствие не совсем корректного задания условий. 

Могу ля попросить актуальный код рабочего процесса(желательно не скриншот, а вставить блок кода)?

Спасибо. 

1

Многоуважаемый Леонид!

Я благодарен Вам за помощь, за потраченное на меня время.

В настоящее время я дополнили php-код и смог решить мою проблему последовательным выводом модальных окон. К сожалению, я так понимаю, что обновить Youtrack не получится, т.к. изменения внесены на серверной части. От рассматриваемого тут рабочего процесса я отказался, поэтому дальнейшее решение вопросов, связанных с ним, считаю уже неактуальным. Ещё раз большое спасибо за помощь и обучение синтаксису. С уважением, Михаил

2

Михаил, спасибо за информацию! 

При возникновении любого рода вопросов, наша служба поддержки будет рада помочь Вам. 

Также может быть полезна исчерпывающая документация по написанию рабочих процессов (с примерами). 

 

0

Здравствуйте, Леонид.

Всё же решил написать именно сюда, т.к. проблема осталась.

Как я написал выше, я добавил необходимый код в js-файл, который срабатывает на стороне сервера.

команда посланная оттуда выполняется, поле меняет своё значение, но дальше ничего не происходит.

Для чего всё это делается? Я хочу получить в результате следующее: в результате команды, посланной с сервера, поле "Назначенная категория" меняет значение на "Управление доступом к Хронос", после этого становится видимым поле "Ответственный". Вопрос: можно ли командой сделать это поле видимым или спрятать его, как это делается в настройках полей проекта? Я ещё попробовал другой способ: создал поле "Видимость" типа enum в проекте, добавил в него два значения: "Видно" и "Не видно". Поле всегда непустое и по умолчанию имеет значение "Не видно". Если выбрать значение "Видно", то поле "Ответственный" становится видимым, если же выбрано "Не видно", то поле "Ответственный" скрывается. Это всё работает, если менять значения поля "Видимость" руками, но если я шлю команду по смене значения в этом поле с сервера, то значение меняется, а поле "Ответственный" остается невидимым, но выскакивает сообщение, как на приложенном принскрине. При нажатии на ссылку "Обновить задачу" в этом сообщении всё обновляется, как нужно. Можно как-то из Workflow сделать то же самое, что происходит при нажатии на "Обновить задачу" в этом всплывающем окне? Спасибо.

 

0

Михаил, здравствуйте! 

Спасибо за Ваше сообщение. К сожалению, на текущий момент из рабочих процессов нет возможности автоматически обновлять страницу задачи.

Я создал соответствующий feature request. Вы можете проголосовать за него, что увеличит приоритет задачи в бэклоге. 

0

Please sign in to leave a comment.