Примеры

1. Интерпретатор

1.1 POST-запрос API-метода

// Создаём объект POST-запроса
var post = new org.apache.commons.httpclient.methods.PostMethod("http://192.168.4.6:8080/Synergy/rest/api/storage/copy");
// Добавляем параметры согласно спецификации метода "rest/api/storage/copy"
post.addParameter("fileID", fileReportID);
post.addParameter("documentID", documentID);
// Создаём HTTP-клиент и авторизационные данные
var client = new org.apache.commons.httpclient.HttpClient();
var creds = new org.apache.commons.httpclient.UsernamePasswordCredentials(synergyUser, synergyPass);
// Задаём клиенту способ авторизации и передаём авторизационные данные
client.getParams().setAuthenticationPreemptive(true);
client.getState().setCredentials(org.apache.commons.httpclient.auth.AuthScope.ANY, creds);
// Настраиваем заголовки запроса
post.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
// Выполняем метод
var status = client.executeMethod(post);
// Обязательно закрываем соединение
post.releaseConnection();
var result = true;

1.2 GET-запрос API-метода

// Блок аналогичен тому расположенному выше
var get = new org.apache.commons.httpclient.methods.GetMethod("http://127.0.0.1:8080/Synergy/rest/api/departments/list");
var client = new org.apache.commons.httpclient.HttpClient();
var creds = new org.apache.commons.httpclient.UsernamePasswordCredentials(synergyUser, synergyPass);
client.getParams().setAuthenticationPreemptive(true);
client.getState().setCredentials(org.apache.commons.httpclient.auth.AuthScope.ANY, creds);
get.setRequestHeader("Content-type", "application/json");
var status = client.executeMethod(get);

// Получаем HTTP-код возврата и преобразуем его в строку
// далее используем по своему усмотрению
var message = "" + status;
// Обязательно закрываем соединение
get.releaseConnection();
var result = true;

1.3 GET-запрос API-метода с последующим получением JSON из тела ответа

// Блок аналогичен тому расположенному выше
var get = new org.apache.commons.httpclient.methods.GetMethod("http://127.0.0.1:8080/Synergy/rest/api/departments/list");
var client = new org.apache.commons.httpclient.HttpClient();
var creds = new org.apache.commons.httpclient.UsernamePasswordCredentials("ivanov", "1");
client.getParams().setAuthenticationPreemptive(true);
client.getState().setCredentials(org.apache.commons.httpclient.auth.AuthScope.ANY, creds);
get.setRequestHeader("Content-type", "application/json");
var status = client.executeMethod(get);

// Возвращает тело запроса HTTP, если такое есть, как String
var responseBody = get.getResponseBodyAsString();
var json = eval("(" + responseBody + ")");

var message = "" + status + " " + json[0].departmentID;

get.releaseConnection();

var result = true;
//
var responseBody = get.getResponseBodyAsString();
var json = eval("(" + responseBody + ")");
var message = "" + status + " " + json[0].documentID;

2. ВМК

2.1 Запись нового значения в один компонент, при изменении другого

AS.FORMS.bus.on(AS.FORMS.EVENT_TYPE.formShow, function (event, model, view) {
    // скрипт будет вызываться при каждом formShow, т.е. при показе/изменении формы
    function currentDate() {
        var today = new Date()
        var month = Number(today.getMonth() + 1)
        if (month < 10) month = '0' + month
        return today.getFullYear() + '-' + (month) + '-' + ('0' + today.getDate()).slice(-2) + ' 00:00:00'
    }

    var listboxModel = model.getModelWithId('st')
    // получаем модель компонента с идентификатором 'st'
    // при изменении которого нужно что-то делать
    listboxModel.on(AS.FORMS.EVENT_TYPE.valueChange, function () {
        // реагируем на valueChange, т.е. на изменение 'st'
        var dateFieldModel = model.getModelWithId('status_changed')
        // получаем модель компонента требующего изменения
        dateFieldModel.setValue(currentDate())
        // устанавили его значение
    })
});

3. Комопненты

3.1 Реакция на изменение значения компонента

Скрипт (добавленный как к компоненту, так и пользовательскому компоненту) выполняется каждый раз при смене режима проигрывателя (просмотр - редактирование).

model.on(AS.FORMS.EVENT_TYPE.valueChange, function () {
  console.log('#GMP: valueChange detected')
})

3.2 Чтение и запись значений элементов формы

Рассмотрим два вопроса:

Поставим себе несколько надуманную задачу которая, тем не менее, хорошо демонстрирует принцип: нужно чтобы пользователь не мог ввести нечётные значения. Для этого будем проверять что он вводит, и если нечётное - исправлять на чётное. > В таких случаях, естественно, рекомендуется каким-либо образом давать подсказку > пользователю, почему он не может ввести любое значение.

// слушаем сами себя, свою модель
model.on(AS.FORMS.EVENT_TYPE.valueChange, function () {
  var initVal = model.getValue()
  if (initVal % 2) initVal++
  // даже в числовые поля данные пишутся строками:
  model.setValue(initVal.toString())
})

3.3 Добавление строки в таблицу

На форме есть таблица c ‘table_2’. В неё надо добавить строку (и за одно вывести сообщение в консоль браузера):

model.on(AS.FORMS.EVENT_TYPE.valueChange, function () {
  var tableModel = model.playerModel.getModelWithId('table_2')
  tableModel.createRow()
  console.log("#GMP: Row to 'table2' added")
})

3.4 Получение и запись значений таблицы

На форме имеется ‘table_3’ с тремя колонками. Значения первых двух колонок складываются и записываются в третью. В этом примере обратите внимание на обход таблицы в цикле: если в настройках таблицы задан параметр ‘Количество отображаемых строк при создании’ равный ‘1’, то обход начинаем с 2, если ‘2’ то с 3 и так далее.

// Настроим короткие алиасы часто используемых методов
let getModel = function(field, table, index) { return model.playerModel.getModelWithId(field, table, index) }
let getView = function(field, table, index) { return view.playerView.getViewWithId(field, table, index) }
let getModelValue = function(field, table, index) { return getModel(field, table, index).getValue() }

getModel('table_3').on(AS.FORMS.EVENT_TYPE.dataLoad, function () {
  // Из отображения получаем текущее количество строк таблицы:
  let rowCount = getView('table_3').getRowsCount() - 1
  // Проходим циклом по всем строкам таблицы. Обход начинаем с 2-ой строки (блока) т.к.
  // 'Количество отображаемых строк при создании' установлен в '1'
  for (let i = 2; i < rowCount + 2; i++) {
    // берём значения из элементов имеющихся столбцов, преобразуем в числа:
    let t3_n1 = parseFloat(getModelValue('table3_numfield1', 'table_3', i))
    let t3_n2 = parseFloat(getModelValue('table3_numfield2', 'table_3', i))
    let t3_n3 = parseFloat(getModelValue('table3_numfield3', 'table_3', i))
    let t3_n3_new = t3_n1 + t3_n2
    // если записывать нечего - очистить поле от старого значения:
    if (!t3_n3_new) {
      (getModel('table3_numfield3', 'table_3', i)).setValue('')
    // если есть что записать, и оно отличается от того что было записано ранее - записываем, как строку:
    } else if (t3_n3_new !== t3_n3) {
      (getModel('table3_numfield3', 'table_3', i)).setValue(t3_n3_new.toString())
    }
  }
})

4 События

4.1 События изменения элементов внутри формы

Если нужно отреагировать на изменение значения внутри таблицы, то можно повесить обработчик на событие ‘dataLoad’. В примере ниже одна и таже функция выполняется при двух событиях: добавление строки к таблице, и при модификации любого компонента внутри неё.

let tableModel = model.playerModel.getModelWithId('table_3')
tableModel.on(AS.FORMS.EVENT_TYPE.tableRowAdd, updateTable)
tableModel.on(AS.FORMS.EVENT_TYPE.dataLoad, updateTable)

function updateTable () {
    /* Code is here */
}

4.2 Определение номера блока таблицы, где произошло событие

В этом примере показано, как можно выяснить, в каком именно блоке (строке) таблицы произошло событие. Это может быть полезно, если пересчёт всей таблицы нежелателен, излишне ресурсоёмок и т.д.

let tableModel = model.playerModel.getModelWithId('qtable');
tableModel.on(AS.FORMS.EVENT_TYPE.tableRowAdd, newRow);
// _ - объект события, __ - объект таблицы, modelRow - модель блока
function newRow(_, __, modelRow) {
  let row = modelRow.tableBlockIndex;
  modelRow.forEach(function (model, column) {
    model.on(AS.FORMS.EVENT_TYPE.valueChange, function () {
      cellValueChanged(model.asfProperty.tableBlockIndex, column, model);
    });
    model.on(AS.FORMS.EVENT_TYPE.dataLoad, function () {
      cellDataLoad(model.asfProperty.tableBlockIndex, column, model);
    });
  });
}
function cellValueChanged(row, column, model) {
  console.log("value change event", row, column);
}
function cellDataLoad(row, column, model) {
  console.log("data load event", row, column);
}

5 Пользовательские компоненты

5.1 Компонент для вывода на форму произвольного HTML

Рассмотрим задачу создания Пользовательского Компонента (Далее UC от User Component), для показа на форме HTML-форматированного текста. Этот пример был написан для вывода подсказок к заявкам. Какая именно покажется подсказка зависит от типа заявки.

let tips = {
  // тут мы можем определить представление текста с HTML-форматированием
  1: 'В заявке должно быть:<br>&#8226; Описание проблемы<br>&#8226; Описание своего взгляда на решение этой проблемы<br>&#8226;
  2: 'В заявке должно быть:<br>&#8226; Ссылка на документ или указание на его отсутствие<br>&#8226; Замечания, предложения',
}

ticket_type_model = model.playerModel.getModelWithId('ticket_type')
// в начале работы подсказка не нужна, скрываем UC
view.setVisible(false)
// реагируем на изменение интересующего компонента
ticket_type_model.on(AS.FORMS.EVENT_TYPE.valueChange, function () {
  let value = ticket_type_model.getValue().toString()
  // компонент это комбобокс, в котором 99 означает пустой тип, для него подсказок не будет
  if (value && value !== '99') {
    // теперь подсказка нужна, отображаем UC
    view.setVisible(true)
    // jQuery формируем <div>, определяем стиль
    var textView = jQuery('<div>', { class: "asf-label" })
    textView.css('padding', '20px')
    textView.css('background-color', '#ccff99')
    textView.css('color', 'black')
    // при каждом срабатывании нужно очистить устаревший текст UC
    view.container.empty()
    // и только после этого записать новый
    view.container.append(textView)
    // определяем как должно обновляться представление (интерфейс)
    view.updateValueFromModel = function () {
      textView.html(tips[value])
    }
    // обновляем представление
    view.updateValueFromModel()
  } else {
    // если выбрали пустой тип заявки скрываем UC
    view.setVisible(false)
  }
})