Диалог выбора документа
Создание описания связей
Для текущего документа нужно создать описания связей, со всеми модулями, из которых возможен выбор документов.
Подключение диалога выбора
В схему, по которой открывается форма добавить свойство "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
После выбора отправится запрос на обновление, который надо обработать в 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); } } |