У меня есть поток бизнес-процессов, который имеет «специальную» проверку. По крайней мере, один из трех шагов должен быть установлен на «Да», чтобы продолжить переход к следующему этапу.Настройка пользовательского предупреждающего сообщения в потоке бизнес-процессов
Вот мой обработчик на сцене.
var subStageRequirements = new Array();
subStageRequirements.push({ stage: 0, fields: ['new_is_project_scope_defined_substage'] });
subStageRequirements.push({ stage: 1, fields: ['new_is_demo_1_substage', 'new_is_demo_2_substage', 'new_is_selection_srv_outlined_substage'] });
subStageRequirements.push({ stage: 2, fields: ['new_is_proposal_substage', 'new_is_negotiation_substage'] });
function onStageChange(context) {
var stage = context.getEventArgs().getStage();
var stageCategory = stage.getCategory().getValue();
var direction = context.getEventArgs().getDirection();
if (direction == "Next") {
//validate requirements on previous field...
var valid = false;
var req = subStageRequirements[stageCategory - 1];
for (var i = 0; i <= req.fields.length - 1; i++) {
if (Xrm.Page.getAttribute(req.fields[i]).getValue()) {
valid = true;
break;
}
}
if (!valid) {
Xrm.Page.data.process.movePrevious(function (result) {
if (result != "success") {
alert('Error forcing back to previous step: ' + result + '. Have fun...');
}
var messageArea = $(window.parent.document).find('.processWarningBar');
messageArea.css('display', 'block');
var textArea = $(window.parent.document).find('.processWarningBar-Text');
textArea.attr('title', 'At least one sales sub-stage has to be selected to move on to next sales stage.');
textArea.text('At least one sales sub-stage has to be selected to move on to next sales stage.');
setTimeout(function() {
var messageArea = $(window.parent.document).find('.processWarningBar');
messageArea.css('display', 'none');
}, 5000);
});
}
}
}
Как вы видите, как только сцена изменилась, я проверяю, если шаги в предыдущей стадии (текущая стадия - 1, в положении), по меньшей мере один true
значение.
Если нет, я возвращаюсь на сцену (movePrevious
), а затем включаю некоторые трюки jQuery ... У некоторых есть недостатки (как ошибка, так и предупреждение отображаются в ошибке, я должен скрыть ошибку div самостоятельно, иногда, когда проверка проходит, и я перехожу к следующему этапу, пользовательское сообщение об ошибке мерцает и исчезает).
Я пытаюсь получить эту часть, чтобы показать собственное сообщение:
Любой лучший способ сделать это? Я думаю о функциях, которые сам CRM вызывает при отображении собственного сообщения по умолчанию. Я попытался выведать их, но они кажутся хорошо скрытыми.
EDIT
Я изменил код подтверждения на этот вопрос, предложенный ответ ниже:
if (!valid) {
Xrm.Page.data.process.movePrevious(function (result) {
if (result != "success") {
alert('Error forcing back to previous step: ' + result + '. Have fun...');
}
Xrm.Page.ui.setFormNotification('At least one sales sub-stage has to be selected to move on to next sales stage.', 'ERROR', 'subStageMessage');
setTimeout(function() {
Xrm.Page.ui.clearFormNotification('subStageMessage');
}, 5000);
});
return;
}
else
{
Xrm.Page.ui.clearFormNotification('subStageMessage'); //trying to hide it once the previous stage has passed validation, but error message is still shown...
}
Сейчас вопрос в том, что сообщение отображается даже при переходе к следующему этапу. Когда проверка не выполняется, пользователь отправляется обратно на предыдущий шаг, после чего отображается сообщение. Когда пользователь завершает пропущенные шаги и переходит к следующему этапу, даже если код, который показывает сообщение, не выполняется, сообщение все еще отображается еще на 5 секунд (??)
Я использую CRM 2016 , и это для объекта Opportunity.
Итак, ваша текущая проблема заключается в том, что после того, как пользователь заполнил необходимые поля, они переходят к следующему этапу, но предупреждение занимает еще 5 секунд после навигации, чтобы очистить себя? – Daryl
@ Daryl Хорошо, хотя если 'valid' является истинным и уведомление очищается, оно будет отображаться еще на 5 секунд, а затем исчезнет. –