Задача с кнопкой Move to Spam(Практическое 4)

подскажите пожалуйста, с чем может быть проблема, уже всё перепробовал. Кнопка Move to Spam должна при нажатии ставить поле spam(read only) в состояние true, а так же менять значение state и urgency. Но вместо этого у меня просто сохраняются значения в заметках если они были. поля же никак не изменяются(urgency конкретно например ставится в low, но сразу же меняется обратно.)Я понимаю что скорее всего проблема во внешнем скрипте, но вот что понять не могу.

  1. КНОПКА
    if (window.confirm(‘Are you shure?’)) {
    const sAjax = new SimpleAjax(‘ScriptForMoveToSpam’);
    sAjax.addParam(‘sysparm_name’, ‘setSpamUrgState’);
    sAjax.addParam(‘sysparm_start’, s_form.getUniqueValue());
    sAjax.getXML(callback);
    async function callback(response){
    if (s_form.isChanged()) { //callback
    s_form.setValue(‘urgency’, 1);
    await s_form.save();
    __resolveServerResponse();
    } else {
    s_go.reloadWindow();
    }
    }
    }
    else{
    s_go.reloadWindow();
    }
    2)ВНЕШНИЙ СКРИПТ
    class ScriptForMoveToSpam{
    setSpamUrgState(idRecord){
    const record = new SimpleRecord(‘itsm_inquiry’);
    record.get(${idRecord});
    record.setValue(‘c_spam’, true);
    record.setValue(‘urgency’, 1);
    record.setValue(‘state’, 3);
    let result = record.update();
    return result;
    }
    }
1 лайк

Возможно вы сохраняете форму до того, как выполняется серверный скрипт и нет обработки результата серверного скрипта

попробуйте сделать всё через клиентский скрипт без внешнего скрипта:

UI Action (Script)

if (window.confirm('Are you sure?')) {
    // Сразу устанавливаем значения
    s_form.setValue('c_spam', true);
    s_form.setValue('urgency', 1);
    s_form.setValue('state', 3);
    
    // Сохраняем
    await s_form.save();
    s_go.reloadWindow();
} else {
    s_go.reloadWindow();
}

Сохранение формы если и вызывается, то в callback’e SimpleAjax, до выполнения внешнего срипта это никак не сработает.

А вот со внешним скриптом проблемы есть, он как минимум не для вызова с клиентской стороны, потому что не наследуется от AbastractAjaxProcessor.
Чтобы это заработало при текущем решении, то стоит правильно создать внешний скрипт:

Внешний скрипт
/**
 * Стоит перечитать документацию по Script Include
 * https://docs.simpleone.ru/ru/platform/developer-help/common-automation-tools/script-include
 * В системе также есть реализация AbstractAjaxProcessor для более глубокого понимания советую
 * с ней ознакомиться.
 */
ss.importIncludeScript('AbstractAjaxProcessor');
/**
 * Важный момент это наличие наследования и в форме внешнего скрипта
 * отмеченный чекбокс "Доступно для Client API" (в документации примеры используют
 * наследование на основе прототипов, это многословно, платформа позволяет
 * использовать более лаконичное решение)
 */
class ScriptForMoveToSpam extends AbstractAjaxProcessor {
  /** Сам метод не принимает параметров, они доступны через this.getParameter */
  setSpamUrgState() {
    /** Обязательно получать параметры с помощью суффикса 'sysparm_' */
    const idRecord = this.getParameter('sysparm_idRecord');
    const record = new SimpleRecord('itsm_inquiry');
    record.get(idRecord);
    record.setValue('c_spam', true);
    record.setValue('urgency', 1);
    record.setValue('state', 3);
    let result = record.update();
    return result;
  }
}

Клиентский скрипт
if (window.confirm('Are you shure?')) {
  const sAjax = new SimpleAjax('ScriptForMoveToSpam');
  /**
   * На всякий случай напоминаю, что здесь используется зарезервированное имя параметра
   * `sysparm_name`, иначе не сработает.
   */
  sAjax.addParam('sysparm_name', 'setSpamUrgState');
  /**
   * Здесь указываем то название, которое используем во внешнем скрипте в this.getParameter.
   * Вы же передаете `sysparm_start`, а ожидаете `idRecord` - так не сработает.
   */
  sAjax.addParam('sysparm_idRecord', s_form.getUniqueValue());
  sAjax.getXML(callback);
  async function callback(response) {
    if (s_form.isChanged()) {
      //callback
      s_form.setValue('urgency', 1);
      await s_form.save();
      __resolveServerResponse();
    } else {
      s_go.reloadWindow();
    }
  }
} else {
  s_go.reloadWindow();
}

А в остальном DxCpp прав, для ваших целей внешний скрипт здесь ни к чему.

Ещё нужно учесть, что s_form.setValue - это асинхронная функция, которая возвращает Promise.

Перед каждым вызовом s_form.setValue следует добавить await.
Иначе есть вероятность, что s_form.save сработает раньше, чем были установлены новые значения полей и изменения не сохраняться.