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

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

Инструкция по настройке кнопки выбора документа в объектное поле, через диалог добавления связей

Инструмент: Палитра XML
Статус

ГОТОВО

Комментарий

Реализация

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

С точки зрения поведения является неким подобием действия update-linked-doc, за исключением того, что форма диалога зашита на клиенте.

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

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

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

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

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

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

  • Создать схему - наследник "LinkedDocSelectionParams<Name>" с системной схемы "LinkedDocSelectionParamsCommon". внутри созданной схемы переопределить свойства:
    • title - заголовок диалога
    • allowedManual - отображать ли вкладку "вручную"
    • isManySelect - доступен ли множественный выбор
    • modules - массив идентификаторов модулей, из которых можно выбирать документы. Если можно выбирать из любых, то нужно вернуть пустой массив. Тогда выбор будет ограничиваться настройками описания связей.
    • submit_caption - название кнопки для подтверждения выбора
    • cancel_caption - название кнопки для отмены
      Значения в них задаются с помощью формул, вычисляемым при открытии.

      Пример
      <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.

Подключение к форме

На форме создать:

  • скрытое поле, указывающее на свойство "addLinked<Name>". В нём указывается recalc.
  • кнопка с действием update-linked-doc и указанной схемой с параметрами "LinkedDocSelectionParams<Name>"
Пример
<!--скрытое поле -->
<field attribute-ref="addLinkedDoc" recalc="true">
	<properties>
		<hide>
			<condition>true</condition>
		</hide>
	</properties>
</field>
<!--кнопка -->
<button attribute-ref="addLinkedDoc" name="${ui.form.RkkResourceForm.section.Attributes.button.addLinkedDoc.name:Добавить документ из системы}">
	<appearance>
		<label-style width="17" unit="symbol">
			<style id="tunBtnHeader"/>
		</label-style>
	</appearance>
	<action>
		<custom>
			<update-linked-doc schema-ref="LinkedDocSelectionParamsExample"/>
		</custom>
	</action>
</button>


Доработка обработчика событий

При нажатии на кнопку будет показан диалог выбора связей с учётом заданных параметров. Web-клиент заполнит объект со структурой SelectLinkedDocDialogResource

в поле ids web-клиент кладёт не сами ID, а self-ссылки на документы

После выбора отправится запрос на обновление, который надо обработать в custom-event-handler и сделать с выбранным документом то, что нужно в конкретном случае.

Пример
function recalc(object, changedField) {
    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());
                System.out.println("unid = "+unid);
                if (!unid.equals("")) {
                    var rkk = appdp.getEntityByUNID(unid);
                    //rkk - выбранный в диалоге документ
                }
            }
        }
        TunableObjectHelper.putAFInstanceValue(object.tuning(), "addLinkedDoc", null);
    }
}
 
function getIdFromHref(href) {
    var index = href.lastIndexOf("/", href.length())+1;
    if (index < 0) {
        return href;
    } else {
        return href.substring(index);
    }
}