2016-08-31 3 views
0

У меня есть поток бизнес-процессов, который имеет «специальную» проверку. По крайней мере, один из трех шагов должен быть установлен на «Да», чтобы продолжить переход к следующему этапу.Настройка пользовательского предупреждающего сообщения в потоке бизнес-процессов

Вот мой обработчик на сцене.

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 самостоятельно, иногда, когда проверка проходит, и я перехожу к следующему этапу, пользовательское сообщение об ошибке мерцает и исчезает).

Я пытаюсь получить эту часть, чтобы показать собственное сообщение:

enter image description here

Любой лучший способ сделать это? Я думаю о функциях, которые сам 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.

+0

Итак, ваша текущая проблема заключается в том, что после того, как пользователь заполнил необходимые поля, они переходят к следующему этапу, но предупреждение занимает еще 5 секунд после навигации, чтобы очистить себя? – Daryl

+0

@ Daryl Хорошо, хотя если 'valid' является истинным и уведомление очищается, оно будет отображаться еще на 5 секунд, а затем исчезнет. –

ответ

0

Я решил использовать Notify.js и делая то же самое, используя этот веб-ресурс, проблема появляясь уведомления решается.

if (!valid) { 

    Xrm.Page.data.process.movePrevious(function (result) { 
     Notify.add('<b>At least one sales sub-stage has to be selected to move on to next sales stage.</b>', 'WARNING', 'subStageMessage', null); 
    }); 

} 
else { 
    //if previous stage's steps were all valid, remove all notifications 
    Notify.remove(); 
} 
1

Да, лучший способ существует: Xrm.Page.ui.setFormNotification

// Sample 
Xrm.Page.ui.setFormNotification("You have to complete required steps", "INFO", "messageId"); 
+0

Это действительно помогает, но можете ли вы посмотреть мое редактирование в моем вопросе? У меня странный сбой. –