Xpages 文件下载控件排序列

Xpages File Download Control sort column

我想让一个文件下载控件在顶部显示带有最新(最新)创建日期的附件。默认显示最新的最后一个。

<xp:fileDownload rows="30" id="FD"
    displayLastModified="false" value="#{document1.files}"
    style="width:98%" hideWhen="false"
    displayType="true" allowDelete="false" displayCreated="true">
</xp:fileDownload>

目前没有更好的答案,我会 post 一个。

实际上,<xp:fileDownload> 组件按照文件附件在文档的富文本字段中的显示顺序列出文件附件,而不是最新的最后一个:

您无法使用任何属性更改此行为,因此一种可能的方法是获取附件列表,根据需要对其进行排序,然后将排序后的列表提供给 <xp:repeat> 组件,您可以在其中绘制与 <xp:fileDownload> 显示的附件 table 略有不同甚至没有区别的附件。这并不难,只需在浏览器调试工具中查看创建的 HTML 标记,然后在 <xp:repeat>.

中重新创建它

假设您在页面上声明了 dominoData

<xp:this.data>
    <xp:dominoDocument var="document1"
        documentId="9CAA72D47AEA7C8D462582FB005AB525"
        action="openDocument" />
</xp:this.data>

然后在 <xp:repeat> 所在的位置创建 <xp:panel>。为您的面板创建 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 对象的列表,然后使用 created 文件属性使用声明的比较器(见下面的更新)对列表进行排序,return 排序列表为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 的 table 的标记即可。

Update

值得努力创建一个请求范围内的托管 Bean,它将用作比较器,而不是在 SSJS 代码块内实现一些好的排序算法。

在某些现有或新包下的 Code/Java 文件夹中创建一个 Java class。如果包名称是例如com.benway.util 并且 class 名称是 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());
    }
}

将新的 class 注册为 faces-config.xml 中的托管 bean:

<?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>

现在你真的大功告成了:)