Поскольку лучшего ответа на данный момент нет, я выложу его здесь.
На самом деле, компонент <xp:fileDownload>
перечисляет вложения файлов в том порядке, в котором они отображаются в поле Rich Text документа, а не в самом последнем:
Вы не можете изменить это поведение ни с одним из свойств, поэтому один из возможных способов - получить список вложений, отсортировать его так, как вам нужно, и затем передать отсортированный список в компонент <xp:repeat>
, где вы можете Нарисуйте таблицу вложений, которая будет незначительно или даже не будет отличаться от отображаемой <xp:fileDownload>
. Это не так сложно, просто посмотрите на созданную HTML-разметку в инструменте отладки вашего браузера и воссоздайте ее внутри <xp:repeat>
.
Предположим, на вашей странице объявлено dominoData
:
<xp:this.data>
<xp:dominoDocument var="document1"
documentId="9CAA72D47AEA7C8D462582FB005AB525"
action="openDocument" />
</xp:this.data>
Затем создайте <xp:panel>
, где будет находиться ваш <xp:repeat>
. Создайте dataContext
для своей панели:
<xp:panel>
<xp:this.dataContexts>
<xp:dataContext var="attachments">
<xp:this.value><![CDATA[
#{javascript:
var sourceList:java.util.List = document1.getAttachmentList('files');
if (sourceList.size() == 0) {
return sourceList;
}
java.util.Collections.sort(sourceList, createdComparator);
return sourceList;
}
]]></xp:this.value>
</xp:dataContext>
</xp:this.dataContexts>
</xp:panel>
Там вы получаете список com.ibm.xsp.model.domino.wrapped.DominoDocument.AttachmentValueHolder
объектов, затем сортируете список с объявленным Comparator (см. Обновление ниже), используя атрибут файла created
, и возвращаете отсортированный список как переменную attachments
.
Затем вы создаете <xp:repeat>
и вкладываете его в свой <xp:panel>
после <xp:dataContexts>
. Дайте ему имя переменной dataContext
как value
:
<xp:repeat value="#{attachments}" var="attachment">
<xp:text value="#{attachment.type}" />
<xp:label value=" - " />
<xp:text>
<xp:this.value><![CDATA[
#{javascript:
var rawSize = attachment.getLength();
return (rawSize < 1024 ? 1 : (rawSize / 1024).toFixed(0)) + " KB";
}
]]></xp:this.value>
</xp:text>
<xp:label value = " - " />
<xp:link text="#{attachment.name}" value="#{attachment.href}" />
<xp:label value = " - " />
<xp:text>
<xp:this.value>
#{javascript:
return new java.util.Date(attachment.getCreated());
}
</xp:this.value>
<xp:this.converter>
<xp:convertDateTime type="both" timeStyle="short" />
</xp:this.converter>
</xp:text>
<xp:br />
</xp:repeat>
Вот результат вывода <xp:repeat>
по сравнению с <xp:fileDownload>
:
Просто создайте разметку, похожую на таблицу fileDownload
, и все готово.
Обновление
Стоит усилий, чтобы создать управляемый компонент в рамках запроса, который будет служить компаратором вместо реализации какого-либо хорошего алгоритма сортировки прямо внутри блока кода SSJS.
Создайте класс Java внутри папки Code / Java в рамках существующего или нового пакета. Если имя пакета, например, com.benway.util
и имя класса CreatedComparator
:
package com.benway.util;
import java.util.Comparator;
import com.ibm.xsp.model.FileRowData;
public class CreatedComparator implements Comparator<FileRowData> {
public int compare(FileRowData file1, FileRowData file2) {
if (file1 == null || file2 == null) return 0;
return (int)(file2.getCreated() - file1.getCreated());
}
}
Зарегистрируйте новый класс как управляемый компонент в вашем faces-config.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
<managed-bean>
<managed-bean-name>createdComparator</managed-bean-name>
<managed-bean-class>
com.benway.util.CreatedComparator
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
...etc...
</faces-config>
Теперь вы действительно сделали:)