подскажите пожалуйста, с чем может быть проблема, уже всё перепробовал. Кнопка Move to Spam должна при нажатии ставить поле spam(read only) в состояние true, а так же менять значение state и urgency. Но вместо этого у меня просто сохраняются значения в заметках если они были. поля же никак не изменяются(urgency конкретно например ставится в low, но сразу же меняется обратно.)Я понимаю что скорее всего проблема во внешнем скрипте, но вот что понять не могу.
КНОПКА
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;
}
}
А вот со внешним скриптом проблемы есть, он как минимум не для вызова с клиентской стороны, потому что не наследуется от 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();
}
Ещё нужно учесть, что s_form.setValue - это асинхронная функция, которая возвращает Promise.
Перед каждым вызовом s_form.setValue следует добавить await.
Иначе есть вероятность, что s_form.save сработает раньше, чем были установлены новые значения полей и изменения не сохраняться.