Lista dokumentów - DocumentList

Lista wygenerowanych dokumentów

Właściwości komponentu

Właściwość Eximee Designer
Nazwa atrybutu w Źródle
Opis

Lista dokumentów

items

Lista dokumentów do zaprezentowania

Prezentacja komponentu w formie przycisku (Pobierz wszystkie dokumenty) (sekcja Podstawowe właściwości)

allowDownloadingOfAllDocuments

Prezentacja komponentu jako jednego przycisku umożliwiającego pobranie wszystkich dokumentów. Domyślna wartość "false". Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.

Prezentowanie loadera podczas generowania dokumentu (sekcja Podstawowe właściwości)

async

Opcja prezentująca loader podczas generowania dokumentu. Domyślna wartość "false".

Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.

Lista dokumentów zwijana (sekcja Pozostałe)

GesDocumentList.foldable

Prezentacja listy dokumentów jest ukryta w sekcji zwijanej.

Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach

Więcej informacji o właściwościach komponentu: Wspólne właściwości komponentów

Ilustracja 1. Przykładowy wygląd komponentu na wniosku

Po dodaniu komponentu z palety pozostałą konfigurację (dotyczącą listy wyświetlanych dokumentów) należy ustalić w zakładce Źródło. Przykładowa konfiguracja dla komponentu:

<p1:GesDocumentList id="GesDocumentList1" mid="GesDocumentList1" labelKey="GesDocumentList1.label" ariaLabelKey="GesDocumentList1.ariaLabel" ariaDescriptionKey="GesDocumentList1.ariaDescription" documentsAreNotReadyMessageKey="GesDocumentList1.documentsAreNotReadyMessage">
    <data:ListeningOn>
        <data:ListenField id="currentPageMid"/>
    </data:ListeningOn>
    <data:ClearOn/>
    <p1:GesDocumentList.layoutData>
        <ns6:GridData horizontalAlignment="FILL" horizontalSpan="16" verticalAlignment="CENTER"/>
    </p1:GesDocumentList.layoutData>
    <data:DocumentGeneratorItems>
        <data:DocumentGeneratorItem generatorName="fop" fileName="my_file.pdf" documentTemplate="my_template.xsl-*"/>
    </data:DocumentGeneratorItems>
    <data:GesDocumentList.foldable enabled="false"/>
</p1:GesDocumentList>

Najważniejsze w powyższej konfiguracji jest ustalenie:

  • fileName="my_file.pdf" - w cudzysłowie podajemy nazwę dokumentu prezentowaną na szablonie.

  • documentTemplate="my_template.xsl-" - w cudzysłowie podajemy nazwę szablonu xsl w formacie nazwa- gdzie gwiazdka oznacza najwyższą wersję komponentu.

Jeśli artefakt podpięty w komponencie Lista dokumentów zasilany jest danymi z wniosku, należy na komponencie DocumentList dodać nasłuchiwanie np. na currentPageMid (lub inny element, który zmienia się na wniosku przy przechodzeniu między stronami). Pozwoli to uniknąć sytuacji, w której zmiana danych nie zostanie odzwierciedlona w wydruku.


Konfigurowanie właściwości items dla zasilenie listy dokumentów wydrukiem PDF generowanym przy wykorzystaniu XSL template

Właściwość Eximee Designer
Nazwa atrybutu w Źródle
Opis

Nazwa generatora

Generator name

"fop" - jeśli dane zasilające wydruk pochodzą z wniosku. "fopFromVariable" - jeśli dane zasilające wydruk generowane są ze zmiennej xmlDocument (wówczas komponent musi też nasłuchiwać na tę zmienną!)

Nazwa dokumentu

File name

nazwa dokumentu prezentowana na szablonie

Nazwa artefaktu

Document template

nazwa komponentu w formacie nazwa-* gdzie gwiazdka oznacza najwyższą wersję komponentu (istnieje również możliwość wskazania konkretnej wersji)

Zasilenie listy dokumentów danymi z usługi

Komponent można zasilić danymi z usługi podpiętej na komponencie albo na stronie.

Zasilenie listy dokumentów linkami z usługi (zewnętrznymi linkami)

Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.

Wniosek demo: demoWebview

Usługę podpinamy pod komponent standardowo przez ŹRÓDŁO DANYCH ZEWNĘTRZNYCH (External Data Source). Powinna ona zwracać (nazwy endpointów są pogrubione):

  • documentLink — listę linków lub identyfikatorów dokumentów, które chcemy wyświetlić,

  • fileName — nazwę pliku do pobrania,

  • documentLabel — opcjonalnie etykietę wyświetlaną przy pliku (jeżeli jej nie ma, to wyświetla się nazwa pliku),

  • source — rodzaj źródła (wartości: "externalWeb" lub "internalDoc"), stała, dzięki której platforma będzie wiedziała czy systemem źródłowym jest cms ("externalWeb") czy nemo ("internalDoc").

Należy pamiętać, że jeżeli lista dokumentów ma być prezentowana w innych kanałach niż native to usługa musi zwracać wartości skorelowane z aktualnym kanałem. Np. zwracanie identyfikatorów dokumentów nie ma sensu dla kanału desktop.

Przykładowy kod usługi (Java, komponent OSGI/Charon):

@Component
@Service(AbstractServiceProxy.class)
public class DemoDocumentLinkServiceProxy extends AbstractServiceProxy {
    static final String INPUT_LINK_LIST = "linkList";
    static final String INPUT_IS_EXTERNAL = "isExternalSource";
    static final String OUTPUT_SOURCE = "source";
    static final String OUTPUT_LINK = "link";
    static final String OUTPUT_FILE_NAME = "fileName";
    static final String EXTERNAL_WEB_SOURCE = "externalWeb";
    static final String INTERNAL_DOC = "internalDoc";

    private static final Logger LOGGER = LoggerFactory.getLogger(DemoDocumentLinkServiceProxy.class);
    private static final Logger SENSITIVE_LOGGER = SensitiveLoggerFactory.getSensitiveLogger(DemoDocumentLinkServiceProxy.class);

    public DemoDocumentLinkServiceProxy() {
        this.name = "DemoDocumentLinkServiceProxy";
        this.description = "Zwraca przekazaną listę linków do komponentu DocumentList. Jako źródło ustawia externalWeb lub internalDoc w zależności od przekazanego isExternalSource";
        this.inputFields.add(new ServiceProxyField(INPUT_LINK_LIST));
        this.inputFields.add(new ServiceProxyField(INPUT_IS_EXTERNAL));
        this.outputFields.add(new ServiceProxyField(OUTPUT_SOURCE));
        this.outputFields.add(new ServiceProxyField(OUTPUT_LINK));
        this.outputFields.add(new ServiceProxyField(OUTPUT_FILE_NAME));
    }

    @Override
    public List<Map<String, String>> callService(Map<String, List<String>> values) throws ServiceProxyException {
        LOGGER.info(">> Service called with values: {}", values);
        SENSITIVE_LOGGER.info(">> Service called with values: {}", values);
        List<Map<String, String>> result = new ArrayList<>();
        final Boolean isExternal = getBooleanValue(values, INPUT_IS_EXTERNAL, true);
        final String source = isExternal ? EXTERNAL_WEB_SOURCE : INTERNAL_DOC;
        final List<String> inputLinkList = values.get(INPUT_LINK_LIST);
        for (String inputLink : inputLinkList) {
            result.add(createEntry(inputLink, source));
        }
        LOGGER.info("<< Service finished with result: {}", result);
        SENSITIVE_LOGGER.info("<< Service finished with result: {}", result);
        return result;
    }

    private Map<String, String> createEntry(final String link, final String source) {
        Map<String, String> entry = new HashMap<>();
        entry.put(OUTPUT_SOURCE, source);
        entry.put(OUTPUT_LINK, link);
        entry.put(OUTPUT_FILE_NAME, (isNotBlank(link) && link.contains("/")) ? substringAfterLast(link, "/") : link);
        return entry;
    }
}

Zasilenie listy dokumentów danymi z dwóch usług

Pierwszą usługę podpinamy pod komponent standardowo przez ŹRÓDŁO DANYCH ZEWNĘTRZNYCH (External Data Source). Powinna ona zwracać (nazwy endpointów są pogrubione):

  • fileName - nazwa pliku do pobrania,

  • fileMimeType - typ pliku do pobrania,

  • documentLabel - opcjonalna etykieta wyświetlana przy pliku (jeżeli jej nie ma, to wyświetla się nazwa pliku),

  • fileContent - warto dodać, jeśli chcemy obsługiwać większą liczbę plików niż 1 - pozwala nam to ustawiać identyfikator pliku i rozróżniać pliki pomiędzy sobą,

  • source - rodzaj źródła, w tym przypadku wartość 'externalDocument',

  • documentServiceName - nazwa drugiej usługi, która zostaje wywołana aby pobrać zawartość pliku. Jeśli jest to usługa skryptowa, dodajemy przed jej nazwą przedrostek script: (bez tego przedrostka system będzie szukać usługi Charonowej/OSGI),

  • documentServiceParams - opcjonalne parametry, które chcemy przekazać do usługi pobierającej zawartość pliku. Mają one postać parametr1=value&parametr2=value...

Przykładowe kody serwisów skryptowych:

Skrypt 1

function callService(context) {
    var fileName = context.getFirstParameter('fileName');
    return [{'fileName': fileName, 'fileMimeType': 'application/pdf', 'source': 'externalDocument', 'documentServiceName': 'script:document_list_example2', 'documentServiceParams': 'parameter1=value1&parameter2=value2' }];
}
Skrypt 2 (zawiera przykładowe zakodowane dane pliku)

function callService(context) {
    var parameter1 = context.getFirstParameter('parameter1');
    var parameter2 = context.getFirstParameter('parameter2');
    var content = "JVBERi0xLjMNCiXi48/TDQoNCjEgMCBvYmoNCjw8DQovVHlwZSAvQ2F0YWxvZw0KL091dGxpbmVzIDIgMCBSDQovUGFnZXMgMyAwIFINCj4+DQplbmRvYmoNCg0KMiAwIG9iag0KPDwNCi9UeXBlIC9PdXRsaW5lcw0KL0NvdW50IDANCj4+DQplbmRvYmoNCg0KMyAwIG9iag0KPDwNCi9UeXBlIC9QYWdlcw0KL0NvdW50IDINCi9LaWRzIFsgNCAwIFIgNiAwIFIgXSANCj4+DQplbmRvYmoNCg0KNCAwIG9iag0KPDwNCi9UeXBlIC9QYWdlDQovUGFyZW50IDMgMCBSDQovUmVzb3VyY2VzIDw8DQovRm9udCA8PA0KL0YxIDkgMCBSIA0KPj4NCi9Qcm9jU2V0IDggMCBSDQo+Pg0KL01lZGlhQm94IFswIDAgNjEyLjAwMDAgNzkyLjAwMDBdDQovQ29udGVudHMgNSAwIFINCj4+DQplbmRvYmoNCg0KNSAwIG9iag0KPDwgL0xlbmd0aCAxMDc0ID4+DQpzdHJlYW0NCjIgSg0KQlQNCjAgMCAwIHJnDQovRjEgMDAyNyBUZg0KNTcuMzc1MCA3MjIuMjgwMCBUZA0KKCBBIFNpbXBsZSBQREYgRmlsZSApIFRqDQpFVA0KQlQNCi9GMSAwMDEwIFRmDQo2OS4yNTAwIDY4OC42MDgwIFRkDQooIFRoaXMgaXMgYSBzbWFsbCBkZW1vbnN0cmF0aW9uIC5wZGYgZmlsZSAtICkgVGoNCkVUDQpCVA0KL0YxIDAwMTAgVGYNCjY5LjI1MDAgNjY0LjcwNDAgVGQNCigganVzdCBmb3IgdXNlIGluIHRoZSBWaXJ0dWFsIE1lY2hhbmljcyB0dXRvcmlhbHMuIE1vcmUgdGV4dC4gQW5kIG1vcmUgKSBUag0KRVQNCkJUDQovRjEgMDAxMCBUZg0KNjkuMjUwMCA2NTIuNzUyMCBUZA0KKCB0ZXh0LiBBbmQgbW9yZSB0ZXh0LiBBbmQgbW9yZSB0ZXh0LiBBbmQgbW9yZSB0ZXh0LiApIFRqDQpFVA0KQlQNCi9GMSAwMDEwIFRmDQo2OS4yNTAwIDYyOC44NDgwIFRkDQooIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlICkgVGoNCkVUDQpCVA0KL0YxIDAwMTAgVGYNCjY5LjI1MDAgNTY5LjA4ODAgVGQNCiggQW5kIG1vcmUgdGV4dC4gQW5kIG1vcmUgdGV4dC4gQW5kIG1vcmUgdGV4dC4gQW5kIG1vcmUgdGV4dC4gQW5kIG1vcmUgKSBUag0KRVQNCkJUDQovRjEgMDAxMCBUZg0KNjkuMjUwMCA1NTcuMTM2MCBUZA0KKCB0ZXh0LiBBbmQgbW9yZSB0ZXh0LiBBbmQgbW9yZSB0ZXh0LiBFdmVuIG1vcmUuIENvbnRpbnVlZCBvbiBwYWdlIDIgLi4uKSBUag0KRVQNCmVuZHN0cmVhbQ0KZW5kb2JqDQoNCjYgMCBvYmoNCjw8DQovVHlwZSAvUGFnZQ0KL1BhcmVudCAzIDAgUg0KL1Jlc291cmNlcyA8PA0KL0ZvbnQgPDwNCi9GMSA5IDAgUiANCj4+DQovUHJvY1NldCA4IDAgUg0KPj4NCi9NZWRpYUJveCBbMCAwIDYxMi4wMDAwIDc5Mi4wMDAwXQ0KL0NvbnRlbnRzIDcgMCBSDQo+Pg0KZW5kb2JqDQoNCjcgMCBvYmoNCjw8IC9MZW5ndGggNjc2ID4+DQpzdHJlYW0NCjIgSg0KQlQNCjAgMCAwIHJnDQovRjEgMDAyNyBUZg0KNTcuMzc1MCA3MjIuMjgwMCBUZA0KKCBBbmQgbW9yZSB0ZXh0LiBBbmQgbW9yZSB0ZXh0LiBBbmQgbW9yZSB0ZXh0LiApIFRqDQpFVA0KQlQNCi9GMSAwMDEwIFRmDQo2OS4yNTAwIDY3Ni42NTYwIFRkDQooIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlICkgVGoNCkVUDQpCVA0KL0YxIDAwMTAgVGYNCjY5LjI1MDAgNjY0LjcwNDAgVGQNCiggdGV4dC4gT2gsIGhvdyBib3JpbmcgdHlwaW5nIHRoaXMgc3R1ZmYuICBCdXQgbm90IGFzIGJvcmluZyBhcyB3YXRjaGluZyApIFRqDQpFVA0KQlQNCi9GMSAwMDEwIFRmDQo2OS4yNTAwIDY1Mi43NTIwIFRkDQooIHBhaW50IGRyeS4gQW5kIG1vcmUgdGV4dC4gQW5kIG1vcmUgdGV4dC4gQW5kIG1vcmUgdGV4dC4gQW5kIG1vcmUgdGV4dC4gKSBUag0KRVQNCkJUDQovRjEgMDAxMCBUZg0KNjkuMjUwMCA2NDAuODAwMCBUZA0KKCBCb3JpbmcuICBNb3JlLCBhIGxpdHRsZSBtb3JlIHRleHQuIFRoZSBlbmQsIGFuZCBqdXN0IGFzIHdlbGwuICkgVGoNCkVUDQplbmRzdHJlYW0NCmVuZG9iag0KDQo4IDAgb2JqDQpbL1BERiAvVGV4dF0NCmVuZG9iag0KDQo5IDAgb2JqDQo8PA0KL1R5cGUgL0ZvbnQNCi9TdWJ0eXBlIC9UeXBlMQ0KL05hbWUgL0YxDQovQmFzZUZvbnQgL0hlbHZldGljYQ0KL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcNCj4+DQplbmRvYmoNCg0KMTAgMCBvYmoNCjw8DQovQ3JlYXRvciAoUmF2ZSBcKGh0dHA6Ly93d3cubmV2cm9uYS5jb20vcmF2ZVwpKQ0KL1Byb2R1Y2VyIChOZXZyb25hIERlc2lnbnMpDQovQ3JlYXRpb25EYXRlIChEOjIwMDYwMzAxMDcyODI2KQ0KPj4NCmVuZG9iag0KDQp4cmVmDQowIDExDQowMDAwMDAwMDAwIDY1NTM1IGYNCjAwMDAwMDAwMTkgMDAwMDAgbg0KMDAwMDAwMDA5MyAwMDAwMCBuDQowMDAwMDAwMTQ3IDAwMDAwIG4NCjAwMDAwMDAyMjIgMDAwMDAgbg0KMDAwMDAwMDM5MCAwMDAwMCBuDQowMDAwMDAxNTIyIDAwMDAwIG4NCjAwMDAwMDE2OTAgMDAwMDAgbg0KMDAwMDAwMjQyMyAwMDAwMCBuDQowMDAwMDAyNDU2IDAwMDAwIG4NCjAwMDAwMDI1NzQgMDAwMDAgbg0KDQp0cmFpbGVyDQo8PA0KL1NpemUgMTENCi9Sb290IDEgMCBSDQovSW5mbyAxMCAwIFINCj4+DQoNCnN0YXJ0eHJlZg0KMjcxNA0KJSVFT0YNCg==";
    return [{'output': content}];
}

Wniosek demo: demoDocuments

Last updated

Was this helpful?