![]() |
Мобильная Торговля
|
Версия
|
function doAction() {
var conf = {
"isNeedCheckUnsoldAssortment": false
}
api.result.setConfig(conf);
}
{
"uri": "stmobile://action/<ДОКУМЕНТ>/preopen",
"type": "action",
"datascript": {
"script_file": "preopen.js"
}
}
Где <ДОКУМЕНТ> - название документа, например preorder.
var newAttr = api.form.newRowsAttribute('columnNameHere'); // Добавление колонки
newAttr.title = "Название колонки"; // Установка заголовка
Более подробно о доступных полях: Attribute
{
"uri": "stmobile://action/<ДОКУМЕНТ>/iteminit",
"type": "action",
"datascript": {
"script_file": "iteminit.js"
}
}
И создайте data-скрипт iteminit.js.
var currAttr = api.form.rowAttribute('columnNameHere', api.context.rowItemId);
currAttr.value = 42; // установка значения
Для обмена данными между двумя скриптами используйте кэш.
function mtcall_mechanicsFormConfig() {
var config = {
conditionsPanelVisible: true, // отображение блока "Условие акции"
conditionsPanelEnabled: false, // редактирование блока "Условие акции"
bonusPanelVisible: true, // отображение блока "Бонус"
bonusPanelEnabled: false // редактирование блока "Бонус"
}
api.result.setConfig(config)
}
api.result.setConfig принимает в качестве параметра объект и устанавливает конфигурацию формы.
function mtcall_editAnswerConfig() {
var config = {
isAllowedBarcodeManualEdit: true, // включить редактирование штрихкода
}
api.result.setConfig(config)
}
api.result.setConfig принимает в качестве параметра объект и устанавливает конфигурацию формы.
{
bonusItemsList:
[
{
skuId: ID // идентификатор товара к которому применяется бонус
value: number // количество бонусов
},
... ,
],
bonusPoint: number // количество бонусных балов переданных на сохранение, не доступно к изменению
}
На выход скрипта надо передать точно такую же структуру, она подменит текущую переданную на сохранение.
api.result.setData("bonusItemsList" , {...});
api.result.setData("bonusPoint" , 1);
stmobile://tma/bonus/postregistration
{
"uri": "stmobile://document/survey/customanswers",
"type": "action",
"datascript": {
"script_file": "customAnswers.js"
}
}
Содержимое файла customAnswers.js:
function doAction() {
const { distributorId, templateId } = api.context;
const topics = api.survey.service.topics(templateId).value;
const answers = [];
topics.forEach((topic) => {
const questions = api.survey.service.questions(templateId, topic.id, distributorId).value;
questions.forEach((question) => {
const { possibleValues } = question.answerValuesRange;
const answer = {
topicId: topic.id,
questionId: question.id,
values: [],
};
switch (question.answerType) {
case 'DataTypeInteger':
answer.values.push(357);
break;
case 'DataTypeReal':
answer.values.push(111.111);
break;
case 'DataTypeYesNo':
answer.values.push(1);
break;
case 'DataTypeYesNoUnknown':
answer.values.push(2);
break;
case 'DataTypeSingle':
answer.values.push(possibleValues[1].value);
break;
case 'DataTypeMultiple':
answer.values.push(possibleValues[1].value);
break;
case 'DataTypeText':
answer.values.push('text');
break;
case 'DataTypeBarCode':
answer.values.push('1q2w3e4r5t');
break;
case 'DataTypeDate':
answer.values.push(new Date(2019, 3, 25));
break;
case 'DataTypeTime':
answer.values.push(new Date(1900, 0, 1, 2, 30));
break;
case 'DataTypeDateTime':
answer.values.push(new Date(2019, 3, 25, 14, 40));
break;
default:
answer.values.push('-');
}
answers.push(answer);
});
});
api.result.setParams("customAnswers", answers);
}
var reasons = api.visit.reasonModel();
var ret = api.interactive.selectSingleValue("Результат посещения", reasons, reasons[0].value);
if (!ret.success) {
// нажали "Отмена"
...
}
else {
var reasonId = ret.value;
api.result.setData("reasonId", reasonId);
}
1. last_visits - Последние визиты
2. limits - Лимиты
3. matched_outlets - Сопоставленные точки
4. outlet_photos - Фотографии точки
5. properties - Общая информация
6. visits_calendar - Календарь визитов
{
...
"config": {
"settingsKey": "myreport_open_modules",
"modules": [
{
"name": "my_module", // имя подключенного модуля (обязат.)
"position": 1, // порядок сортировки (обязат.)
"uiName": "qsTr(My module)", // заголовок, который будет отображен в интерфейсе (обязат.)
"visibilityCheck": true, // проверка отображения модуля
"reloadCheck": "self", // проверка необходимости перезагрузки модуля
"isDisabled": false // отключение загрузки модуля
}
]
}
...
}
function doAction() {
var attributes = api.context.config,
attributesLength = attributes.length;
for (var i = 0; i < attributesLength; i++) {
// Структура атрибута:
// {
// isReadonly: bool, (только для чтения)
// isRequired: bool, (обязательный для заполнения)
// defValue: string, (значение по умолчанию, используется только при создании новой ТТ)
// isShared: bool, (разделяемый или нет)
// distributorId: id, (задано, если атрибут разделяемый)
// isUsed: bool, (признак использования атрибута)
// isVisible: bool, (признак отображения на форме. Атрибут может существовать в невидимом виде.
// Если при этом атрибуту назначено значение по умолчанию, то оно сохранится при записи)
// param: string (параметр атрибута, обычно указывает на классификатор, например, "ClassifierTT1")
// title: string (заголовок атрибута)
// type: string (внутреннее название атрибута, см. структуру AttributeType)
// valueHint: string (подсказка-placeholder для текстовых полей)
// }
attributes[i].isRequired = true;
}
// Установка новых значений параметров
api.result.setConfig(attributes);
}
// Скрываем колонку
const rest = api.form.rowAttribute('NameRestStore');
rest.force = true;
rest.view = false;
// Было
...
for (var i = 0; i <= length; i++) {
var reg = /(привет)?/g;
var match = reg.exec(data[i]);
if (match[1]) result.push(match[1]);
}
...
// Надо
...
var reg = /(привет)?/g;
for (var i = 0; i <= length; i++) {
var match = reg.exec(data[i]);
if (match[1]) result.push(match[1]);
reg.lastIndex = 0;
}
...
<ul>
{% range 5 as num %}
<li>{{ num }}</li>
{% endrange %}
</ul>
Получится:
<ul>
{% range 5 10 as num %}
<li>{{ num }}</li>
{% endrange %}
</ul>
Получится:
<ul>
{% range 5 30 5 as num %}
<li>{{ num }}</li>
{% endrange %}
</ul>
Получится:
... mapper.rating = 4; ...
{% range rating %}
*
{% endrange %}
Получится:<meta name="snapshot" content="EnablePixelCopy" />
// Примерный текст ошибки
Can not call method of undefined
При этом линтер не подчеркнет некорректные символы, а внешне они будут выглядеть одинаково.
function doAction() {
var defaultItems = api.context.config;
var userDefinedItems = [
{
"name": "Summary",
"icon": "globalmenu/dashboard",
"title": "Summary",
"uri": "stmobile://dashboard"
},
{
"name": "route",
"icon": "globalmenu/route",
"title": "Supervisor Routes",
"uri": "stmobile://route",
"subtitle": "Ленинградский р-н"
}
];
for (var i = 0; i < userDefinedItems.length; i++) {
var isFound = false;
for(var j = 0; j < defaultItems.length; j++) {
var userObject = userDefinedItems[i];
var defaultObject = defaultItems[j];
if (defaultObject.hasOwnProperty["name"] &&
defaultObject["name"].toLowerCase() === userObject["name"].toLowerCase())
{
defaultObject["title"] = userObject["title"];
defaultObject["icon"] = userObject["icon"];
defaultObject["uri"] = userObject["uri"];
defaultObject["subtitle"] = userObject["subtitle"];
isFound = true;
}
}
if (!isFound) defaultItems.push(userObject);
}
api.result.setConfig(defaultItems);
api.result.type = "ok";
}
1.9.4