// Создаём объект 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;
// Блок аналогичен тому расположенному выше
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;
// Блок аналогичен тому расположенному выше
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;
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())
// устанавили его значение
})
});
Скрипт (добавленный как к компоненту, так и пользовательскому компоненту) выполняется каждый раз при смене режима проигрывателя (просмотр - редактирование).
model.on(AS.FORMS.EVENT_TYPE.valueChange, function () {
console.log('#GMP: valueChange detected')
})
Рассмотрим два вопроса:
Поставим себе несколько надуманную задачу которая, тем не менее, хорошо демонстрирует принцип: нужно чтобы пользователь не мог ввести нечётные значения. Для этого будем проверять что он вводит, и если нечётное - исправлять на чётное. > В таких случаях, естественно, рекомендуется каким-либо образом давать подсказку > пользователю, почему он не может ввести любое значение.
// слушаем сами себя, свою модель
model.on(AS.FORMS.EVENT_TYPE.valueChange, function () {
var initVal = model.getValue()
if (initVal % 2) initVal++
// даже в числовые поля данные пишутся строками:
model.setValue(initVal.toString())
})
На форме есть таблица 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")
})
На форме имеется ‘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())
}
}
})
Если нужно отреагировать на изменение значения внутри таблицы, то можно повесить обработчик на событие ‘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 */
}
В этом примере показано, как можно выяснить, в каком именно блоке (строке) таблицы произошло событие. Это может быть полезно, если пересчёт всей таблицы нежелателен, излишне ресурсоёмок и т.д.
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);
}
Рассмотрим задачу создания Пользовательского Компонента (Далее UC от User Component), для показа на форме HTML-форматированного текста. Этот пример был написан для вывода подсказок к заявкам. Какая именно покажется подсказка зависит от типа заявки.
let tips = {
// тут мы можем определить представление текста с HTML-форматированием
1: 'В заявке должно быть:<br>• Описание проблемы<br>• Описание своего взгляда на решение этой проблемы<br>•
2: 'В заявке должно быть:<br>• Ссылка на документ или указание на его отсутствие<br>• Замечания, предложения',
}
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)
}
})