Дерево страниц
Skip to end of metadata
Go to start of metadata

Постановка задачи

Создать поле "Документ из системы" на форме РКК, в котором можно выбрать документ и открыть его по ссылке
Инструмент: Палитра XML

Реализация

<Сопроводительная информация>


Диалог выбора документа

Создание описания связей

Для текущего документа нужно создать описания связей, со всеми модулями, из которых возможен выбор документов.

Подключение диалога выбора

В схему, по которой открывается форма добавить свойство "addLinked<Name>" со ссылкой на системную схему "SelectLinkedDocDialogResource"

<schema-ref name="addLinkedDoc" ref="SelectLinkedDocDialogResource"/>

Конфигурация диалога выбора

  • Создать схему - наследник "LinkedDocSelectionParams<Name>" с системной схемы "LinkedDocSelectionParamsCommon". внутри созданной схемы переопределить свойства:

    schema name="LinkedDocSelectionParamsExample"
    <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.

    form id="LinkedDocSelectionParamsExample"
    <?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 - ссылка на объект

schema name="CMDocument"
<?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
...
<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.

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);
	}
}