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