Столбец сортировки контроля загрузки файлов Xpages - PullRequest
0 голосов
/ 30 августа 2018

Я хотел бы, чтобы элемент управления загрузкой файлов отображал вложения с самой новой (самой последней) датой создания вверху. По умолчанию отображается последняя последняя версия.

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

1 Ответ

0 голосов
/ 01 сентября 2018

Поскольку лучшего ответа на данный момент нет, я выложу его здесь.

На самом деле, компонент <xp:fileDownload> перечисляет вложения файлов в том порядке, в котором они отображаются в поле Rich Text документа, а не в самом последнем: enter image description here

Вы не можете изменить это поведение ни с одним из свойств, поэтому один из возможных способов - получить список вложений, отсортировать его так, как вам нужно, и затем передать отсортированный список в компонент <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>: enter image description here

Просто создайте разметку, похожую на таблицу 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>

Теперь вы действительно сделали:)

...