Пользовательский компонент *Выбор и создание записи реестра*
------------------------------------------------------------
Данный пользовательский компонент расширяет функциональность компонента выбор записи реестра, добавив к нему следующие
возможности:
* создание записи реестра;
* просмотр файла по форме в диалоге;
* удаление выбранного значения.
На форме компонент отображается следующим образом:
.. figure:: ../../_static/img/forms/cmp/form_registry1.png
:scale: 100%
Пользовательский компонент *Выбор и создание записи реестра*
Html код компонента содержит следующий код:
.. code-block:: xml
//ссылка на документ реестра
//поле ввода для поиска записи реестра
//надпись, по клику на которой откроется диалог с формой для заполнения
+Создать
//надпись, по клику по которой открывается диалог выбора записи реестра
Выбрать из реестра
//надпись для удаления выбранного значения
✕ Удалить
Значение этого пользовательского компонента будет сохраняться со значениями остальных компонентов, в этом заключается
отличие от пользовательского компонента *Кнопка*, который просто выполнял действие по клику.
Способ хранения выбранного значения, как и поведение всего компонента, описывается скриптом в блоке JAVASCRIPT код.
Данные компонента будут храниться в виде:
.. code-block:: json
{
"id":"custom-zthfcc",
"type":"custom",
"value":"Услуга3",
"key":"c38e83a0-c065-4dec-a334-d32e63fcb0b4"
}
Здесь *id* - это идентификатор компонента, *type* - тип, *value* - значение, *key* - ключ компонента
За способ хранения данных компонента отвечает следующий кусок кода:
.. code-block:: js
/**
* метод реализовывает получение данных компонента для хранения
* @param blockNumber
* @returns {*}
*/
model.getAsfData = function (blockNumber) {
return AS.FORMS.ASFDataUtils.getBaseAsfData(model.asfProperty, blockNumber, model.textValue, model.value);
};
Здесь в качестве *value* передаем параметр model.textValue, который обновляется каждый раз при изменении значения компонента:
.. code-block:: js
/**
* обновить текстовое представление записи реестра
*/
model.updateTextView = function () {
if (!model.getValue()) {
model.textValue = "";
model.asfDataId = null;
model.trigger(AS.FORMS.EVENT_TYPE.dataLoad, [model]);
return;
}
AS.FORMS.ApiUtils.getAsfDataUUID(model.getValue(), function (newAsfDataId) {
model.asfDataId = newAsfDataId;
if(!registry) return;
AS.FORMS.ApiUtils.getDocMeaningContent(registry.registryID, newAsfDataId, function (text) {
if (text === null || text === '') {
model.textValue = i18n.tr('Документ');
} else {
model.textValue = text;
}
model.trigger(AS.FORMS.EVENT_TYPE.dataLoad, [model]);
});
});
};
Переопределяем метод ``setAsfData`` модели, в данном случае в качестве значения выступает ``key``
(ид документа выбранной записи).
.. code-block:: js
/**
* метод реализовывает вставку asfData
* @param asfData
*/
model.setAsfData = function (asfData) {
model.setValue(asfData.key);
};
В скрипте компонента на форме необходимо прописать код реестра, записи которого будут выбраны либо созданы.
Это указывается следующим образом:
.. figure:: ../../_static/img/forms/cmp/form_registry2.png
:scale: 100%
Скрипт компонента на форме
В результате получим следующий компонент:
.. figure:: ../../_static/img/forms/cmp/form_registry3.png
:scale: 100%
Полный javascript код компонента с комментариями:
.. code-block:: js
/**
* обновить текстовое представление записи реестра
*/
model.updateTextView = function () {
if (!model.getValue()) {
model.textValue = "";
model.asfDataId = null;
model.trigger(AS.FORMS.EVENT_TYPE.dataLoad, [model]);
return;
}
AS.FORMS.ApiUtils.getAsfDataUUID(model.getValue(), function (newAsfDataId) {
model.asfDataId = newAsfDataId;
AS.FORMS.ApiUtils.getDocMeaningContent(registry.registryID, newAsfDataId, function (text) {
if (text === null || text === '') {
model.textValue = i18n.tr('Документ');
} else {
model.textValue = text;
}
model.trigger(AS.FORMS.EVENT_TYPE.dataLoad, [model]);
});
});
};
/**
* получить тесктовое представление записи реестра
* @returns {string|string|*}
*/
model.getTextValue = function () {
return model.textValue;
};
// подписываемся на событие модели об изменении содержания, чтобы подгрузить дополнительные данные
model.on(AS.FORMS.EVENT_TYPE.valueChange, function () {
model.updateTextView();
});
/**
* метод реализовывает вставку asfData
* @param asfData
*/
model.setAsfData = function (asfData) {
model.setValue(asfData.key);
};
/**
* метод реализовывает получение данных компонента для хранения
* @param blockNumber
* @returns {*}
*/
model.getAsfData = function (blockNumber) {
return AS.FORMS.ASFDataUtils.getBaseAsfData(model.asfProperty, blockNumber, model.textValue, model.value);
};
/* инициализация отображения */
/**
* реестр
* @type {object}
*/
var registry = null;
/**
* видимые колонки реестра
* @type {Array}
*/
var registryColumns = [];
/**
* поле ввода для поиска записей реестра
* @type {XMLList|*}
*/
var input = jQuery(view.container).children("[innerId='name']");
/**
* поле для отображения выбранной записи реестра
* @type {XMLList|*}
*/
var textView = jQuery(view.container).children("[innerId='textView']");
/**
* кнопка добавления записи
* @type {XMLList|*}
*/
var addIcon = jQuery(view.container).children("[innerId='add']");
/**
* кнопка выбора записи из реестра
* @type {XMLList|*}
*/
var browseIcon = jQuery(view.container).children("[innerId='browse']");
/**
* кнопка удаления текущей выбранной записи
* @type {XMLList|*}
*/
var deleteIcon = jQuery(view.container).children("[innerId='delete']");
// кнопку удаления текущей выбраннйо записи скрываем
deleteIcon.hide();
// по нажатию на кнопку "выбрать из реестра" открываем стандартный диалог выбра записи реестра
browseIcon.click(function () {
AS.SERVICES.showRegisterLinkDialog(registry, function (documentId) {
model.setValue(documentId);
});
});
// по нажатию на кнопку "создать" открываем форму создания записи реестра
addIcon.click(function () {
if (!registry.rr_create) {
alert("У вас нет прав на создание записей данного реестра");
return;
}
var createPlayerDiv = jQuery("