Skip to end of metadata
Go to start of metadata
Диалог выбора документа
Создание описания связей
Для текущего документа нужно создать описания связей, со всеми модулями, из которых возможен выбор документов.
Подключение диалога выбора связей
В схему, по которой открывается форма добавить свойство "addLinked<Name>" со ссылкой на системную схему "SelectLinkedDocDialogResource"
<schema-ref name="addLinkedDoc" ref="SelectLinkedDocDialogResource"/>
Конфигурация диалога выбора связей
Создать схему - наследник "LinkedDocSelectionParams<Name>" с системной схемы "LinkedDocSelectionParamsCommon". внутри созданной схемы переопределить свойства:
<schemas xmlns="http://www.intertrust.ru/schema/palette/tn-schema">
<schema name="LinkedDocSelectionParamsExample" extends="LinkedDocSelectionParamsCommon">
<meta>
<category name="Система\Делопроизводство"/>
<documentation>Ресурс с параметрами выбора документа в диалоге добавления связанного</documentation>
</meta>
<string name="title" temporal="true">
<calc-values>
<script event="open" lang="SPEL"><![CDATA['Выберите документ из системы']]></script>
</calc-values>
</string>
<boolean name="allowedManual" temporal="true">
<calc-values>
<script event="open" lang="SPEL"><![CDATA[false]]></script>
</calc-values>
</boolean>
<boolean name="isManySelect" temporal="true">
<calc-values>
<script event="open" lang="SPEL"><![CDATA[true]]></script>
</calc-values>
</boolean>
<string name="modules" array="true" temporal="true">
<calc-values>
<script event="open" lang="SPEL"><![CDATA[T(java.util.Arrays).asList("OutputDocs", "InternalDocs")]]></script>
</calc-values>
</string>
<string name="submit_caption" temporal="true">
<calc-values>
<script event="open" lang="SPEL"><![CDATA['Добавить документ']]></script>
</calc-values>
</string>
</schema>
</schemas>
Для созданной схемы создать форму, она не будет использоваться, но её наличие необходимо системе для вычисления свойств схемы. В ней можно сделать, например, только поле title.
<?xml version='1.0' encoding='UTF-8'?>
<ui xmlns="http://www.intertrust.ru/schema/palette/tn-ui">
<form schema-ref="TempLinkedDocSelectionParamsExample" id="LinkedDocSelectionParamsExample" name="${ui.form.TempLinkedDocSelectionParamsExample.name:"-"}" projection="default">
<component>
<field attribute-ref="title"/>
</component>
</form>
</ui>
Поле с гиперссылкой на субъект
Создание схемы
Создать схему, которая будет описывать выбранный субъект. Обязательные св-ва:
- id - идентификатор субъекта
- description - описание субъекта. Пример: Входящий документ №23 от 20.05.2024
- Link - ссылка на субъект
<?xml version='1.0' encoding='UTF-8'?>
<schemas
xmlns="http://www.intertrust.ru/schema/palette/tn-schema">
<schema name="CMDocument">
<string name="id">
<storage-field name="CMDocumentID" />
</string>
<string name="description" computed="true">
<storage-field name="CMDocumentDescription" />
</string>
<hyperlink computed="true" name="Link">
<storage-field name="CMDocumentLink" />
<calc-values>
<script lang="SPEL" event="open">
<![CDATA[id == null ? null : T(ru.intertrust.cmj.af.misc.HyperLink).createHyperLink(description +'~#'+T(ru.intertrust.cmj.ws.base.servlet.ServletUrlHolder).getServerUrlStr() + '/ids/' + id +'~#newTab~#local')]]>
</script>
</calc-values>
</hyperlink>
</schema>
</schemas>
Подключение поля
В схему, по которой открывается форма добавить свойство "CMDocumentBase" со ссылкой на cхему "CMDocument"
<schema-ref name="CMDocumentBase" ref="CMDocument" null-empty="true"/>
UI-интерфейс
Подключение к форме
На форме создать группу полей:
- субъектное поле CMDocumentBase
- кнопка с действием update-linked-doc и указанной схемой с параметрами "LinkedDocSelectionParams<Name>"
- скрытое поле, указывающее на свойство "addLinked<Name>". В нём указывается recalc.
...
<section id="select_cm_document" group="true">
<appearance field-layout="horizontal">
<dialog-mode width="49" unit="percent"/>
</appearance>
<component>
<field attribute-ref="CMDocumentBase.Link" alias="CMDocumentBase.description" name="${ui.form.CMDocumentBase.name:Документ из системы:}">
<appearance importance="normal" multiline="false" open-form="newTab">
<limit height="1" max-size="1" max-height-scroll="1"/>
<label-style>
<style id="tunBorderedField"/>
</label-style>
</appearance>
</field>
<section id="select_cm_document_button" group="true">
<properties>
<hide>
<condition-ref ref="read"/>
</hide>
</properties>
<component>
<button attribute-ref="addLinkedDoc" name="${ui.form.button.addLinkedDoc.name:+}">
<appearance>
<label-style>
<style id="tunBtn"/>
</label-style>
</appearance>
<action>
<custom>
<update-linked-doc schema-ref="LinkedDocSelectionParamsExample"/>
</custom>
</action>
</button>
</component>
</section>
<field attribute-ref="addLinkedDoc" recalc="true">
<properties>
<hide>
<condition>true</condition>
</hide>
</properties>
</field>
</component>
</section>
...
Доработка обработчика событий
При нажатии на кнопку будет показан диалог выбора документов с учётом заданных параметров. Web-клиент заполнит объект со структурой SelectLinkedDocDialogResource
После выбора отправится запрос на обновление, который надо обработать в custom-event-handler.
importClass(Packages.ru.intertrust.cmj.af.misc.AFDate);
importClass(Packages.ru.intertrust.cmj.rest.tuning.TuningHelper);
importClass(Packages.ru.intertrust.cmj.tunable.object.common.TunableObjectHelper);
importClass(Packages.ru.intertrust.cmj.tunable.object.history.TunableHistoryHelper);
importClass(Packages.ru.intertrust.cmj.af.core.AFCMDomino);
importClass(Packages.ru.intertrust.cmj.af.core.AFSession);
importClass(Packages.ru.intertrust.cmj.af.utils.BeansUtils);
importClass(Packages.ru.intertrust.cmj.af.utils.Utils);
importClass(Packages.ru.intertrust.cmj.af.misc.HyperLink);
importClass(Packages.ru.intertrust.cmj.dp.DPApplication);
importClass(Packages.ru.intertrust.cmj.af.tuning.impl.AFInstanceSimpleImpl);
importClass(Packages.ru.intertrust.cmj.af.tuning.impl.AFInstanceObjectImpl);
importClass(Packages.ru.intertrust.cmj.af.tuning.impl.AFInstanceArrayImpl);
importClass(Packages.ru.intertrust.cmj.af.tuning.TuningApplication);
importClass(Packages.ru.intertrust.cmj.dp.DPMContracts);
importPackage(Packages.java.util);
importPackage(Packages.java.lang);
importClass(Packages.java.util.List);
importClass(Packages.java.util.Arrays);
function recalc(object, changedField) {
var appdp = AFSession.get().getApplication(DPApplication.class);
/*Заполнение субъектного поля из диалога выбора документа*/
if (changedField == 'addLinkedDoc') {
var addLinkedDoc = values.get('addLinkedDoc');
if (addLinkedDoc.getValues().get("ids") != null) {
var ids = addLinkedDoc.getValues().get("ids").getValues();
for (var i = 0; i < ids.size(); i++) {
var unid = getIdFromHref(ids.get(i).getValue());
if (!unid.equals("")) {
var rkk = appdp.getEntityByUNID(unid);
fillCMDocumentBase(object, rkk);
}
}
}
TunableObjectHelper.putAFInstanceValue(object.tuning(), "addLinkedDoc", null);
}
/*...*/
}
/*Заполнение субъектного поля*/
function fillCMDocumentBase(object, rkk) {
var values = object.tuning().getValues();
var documentID = rkk.getUNID();
var regNumber = getRegNumber(object);
var reqType = document.getType();
var regDate = rkk.registration().getDate();
var regDateStr = AFDate.fromJavaDate(regDate).toString();
var description = reqType + " №" + regNumber + " от " + regDateStr;
TunableObjectHelper.putAFInstanceValue(object.tuning(), "CMDocumentBase.id", documentID);
TunableObjectHelper.putAFInstanceValue(object.tuning(), "CMDocumentBase.description", description);
}
/*Вычисление регистрационного номера*/
function getRegNumber(rkk) {
var regNumber = "";
regNumber = rkk.registration().getRegisteredInfo() != null ? rkk.registration().getRegisteredInfo().getNumber().toString() : "";
return regNumber;
}
/*Получение UNID-документа из ссылки*/
function getIdFromHref(href) {
var index = href.lastIndexOf("/", href.length()) + 1;
if (index < 0) {
return href;
} else {
return href.substring(index);
}
}