Диалог выбора документа
Создание описания связей
Для текущего документа нужно создать описания связей, со всеми модулями, из которых возможен выбор документов.
Подключение диалога выбора связей
В схему, по которой открывается форма добавить свойство "addLinked<Name>" со ссылкой на системную схему "SelectLinkedDocDialogResource"
Блок кода | ||
---|---|---|
| ||
<schema-ref name="addLinkedDoc" ref="SelectLinkedDocDialogResource"/> |
Конфигурация диалога выбора связей
Создать схему - наследник "LinkedDocSelectionParams<Name>" с системной схемы "LinkedDocSelectionParamsCommon". внутри созданной схемы переопределить свойства:
Блок кода language xml title schema name="LinkedDocSelectionParamsExample" collapse true <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.
Блок кода language xml title form id="LinkedDocSelectionParamsExample" collapse true <?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
Предупреждение |
---|
в поле ids web-клиент кладёт не сами ID а, self-ссылки на документы |
После выбора отправится запрос на обновление, который надо обработать в 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;
}
/*Вычисление типа документа*/
function getReqType(document) {
if (document instanceof DPMContracts.Addagr) {
return "Дополнительное соглашение";
} else {
return document.getType();
}
return "";
}
/*Получение UNID-документа из ссылки*/
function getIdFromHref(href) {
var index = href.lastIndexOf("/", href.length()) + 1;
if (index < 0) {
return href;
} else {
return href.substring(index);
}
} |