# Lista dokumentów - DocumentList

Lista wygenerowanych dokumentów

![](https://content.gitbook.com/content/2CssJT0zIo4SJQLbSZ6l/blobs/P3U3G22KMeqlhO1dNU0V/4k_files/image2025-5-16_13-24-5.png)

## 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                                                                                                                                                                                      |
| <p><strong>Prezentacja komponentu w formie przycisku</strong> (Pobierz wszystkie dokumenty)<br>(sekcja <strong>Podstawowe właściwości</strong>)</p> | 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                          | <p>Opcja prezentująca loader podczas generowania dokumentu. Domyślna wartość "false".</p><p>Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.</p>                         |
| **Lista dokumentów zwijana** (sekcja Pozostałe)                                                                                                     | GesDocumentList.foldable       | <p>Prezentacja listy dokumentów jest ukryta w sekcji zwijanej.</p><p>Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach</p>                                                 |

> Więcej informacji o właściwościach komponentu: [Wspólne właściwości komponentów](https://docs.eximee.com/budowanie-aplikacji/interfejs-uzytkownika/formularze/praca-z-komponentami-bazowymi/wspolne-wlasciwosci-komponentow)

![Ilustracja 1. Przykładowy wygląd komponentu na wniosku](https://content.gitbook.com/content/2CssJT0zIo4SJQLbSZ6l/blobs/tgMErBPhyHKPJt9iL0LE/4k_files/image2025-5-16_13-22-33.png)

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:

```xml
<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.

{% hint style="warning" %}
Jeśli wygenerowany dokument ma zostać zapisany do DMS, należy na ostatniej stronie przed wysłaniem wniosku dodać ten dokument do generatora dokumentów (więcej tutaj: [Generator dokumentów - Document Generator](https://github.com/Consdata/eximee-docs/blob/main/budowanie-aplikacji/interfejs-uzytkownika/formularze/biblioteka-komponentow-bazowych/5-dokumenty-i-zaloczniki/generator-dokumentow-documentgenerator/README.md)), podając dokument w 'items'.
{% endhint %}

***

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

<table><thead><tr><th width="200.4833984375">Właściwość Eximee Designer</th><th width="183.1165771484375">Nazwa atrybutu w Źródle</th><th>Opis</th></tr></thead><tbody><tr><td><strong>Nazwa generatora</strong></td><td>Generator name</td><td>"fop" - jeśli dane zasilające wydruk pochodzą z wniosku. "fopFromVariable" - jeśli dane zasilające wydruk generowane są ze zmiennej <strong>xmlDocument</strong> (wówczas komponent musi też nasłuchiwać na tę zmienną!)</td></tr><tr><td><strong>Nazwa dokumentu</strong></td><td>File name</td><td>nazwa dokumentu prezentowana na szablonie</td></tr><tr><td><strong>Nazwa artefaktu</strong></td><td>Document template</td><td>nazwa komponentu w formacie nazwa-* gdzie gwiazdka oznacza najwyższą wersję komponentu (istnieje również możliwość wskazania konkretnej wersji)</td></tr></tbody></table>

## 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)

{% hint style="info" %}
Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.
{% endhint %}

{% hint style="info" %}
Wniosek demo: demoWebview
{% endhint %}

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):

{% code expandable="true" %}

```java
@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;
    }
}
```

{% endcode %}

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

{% hint style="warning" %}
Żeby funkcjonalność zadziałała musi być ustawiona w webforms.xml flaga server.features.externalDocumentResourceProviderEnabled=true
{% endhint %}

Zawartość pliku PDF zakodowana w Base64 została przekazana do komponentu z użyciem dwóch skryptów:

* *document\_list\_example1* - skrypt pobiera parametr wejściowy fileName z wniosku i zwraca dane wyjściowe dla komponentu.
* *document\_list\_example2* - skrypt pobiera parametry przekazywane z pierwszego skryptu i zwraca zawartość pliku w Base64.

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

<figure><img src="https://1082717226-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2CssJT0zIo4SJQLbSZ6l%2Fuploads%2FfOGCp2PvvYnJ7MYYq1PR%2Fobraz.png?alt=media&#x26;token=bbb7dd82-ae8c-40be-84bc-0032002b1db0" alt=""><figcaption><p><em><strong>Ilustracja 1.</strong> Podpięcie parametrów wyjściowych</em></p></figcaption></figure>

Przykładowe kody serwisów skryptowych:

{% code title="document\_list\_example1.js" %}

```javascript
function callService(context) {
    const fileName = context.getFirstParameter('fileName');
    return [{ fileName: fileName, fileMimeType: 'application/pdf', source: 'externalDocument', documentServiceName: 'script:document_list_example2', documentServiceParams: 'parameter1=value1&parameter2=value2' }];
}
```

{% endcode %}

{% code title="document\_list\_example2.js" %}

```javascript
function callService(context) {
    const content = "JVBERi0xLjMNCiXi48/TDQoNCjEgMCBvYmoNCjw8DQovVHlwZSAvQ2F0YWxvZw0KL091dGxpbmVzIDIgMCBSDQovUGFnZXMgMyAwIFINCj4+DQplbmRvYmoNCg0KMiAwIG9iag0KPDwNCi9UeXBlIC9PdXRsaW5lcw0KL0NvdW50IDANCj4+DQplbmRvYmoNCg0KMyAwIG9iag0KPDwNCi9UeXBlIC9QYWdlcw0KL0NvdW50IDINCi9LaWRzIFsgNCAwIFIgNiAwIFIgXSANCj4+DQplbmRvYmoNCg0KNCAwIG9iag0KPDwNCi9UeXBlIC9QYWdlDQovUGFyZW50IDMgMCBSDQovUmVzb3VyY2VzIDw8DQovRm9udCA8PA0KL0YxIDkgMCBSIA0KPj4NCi9Qcm9jU2V0IDggMCBSDQo+Pg0KL01lZGlhQm94IFswIDAgNjEyLjAwMDAgNzkyLjAwMDBdDQovQ29udGVudHMgNSAwIFINCj4+DQplbmRvYmoNCg0KNSAwIG9iag0KPDwgL0xlbmd0aCAxMDc0ID4+DQpzdHJlYW0NCjIgSg0KQlQNCjAgMCAwIHJnDQovRjEgMDAyNyBUZg0KNTcuMzc1MCA3MjIuMjgwMCBUZA0KKCBBIFNpbXBsZSBQREYgRmlsZSApIFRqDQpFVA0KQlQNCi9GMSAwMDEwIFRmDQo2OS4yNTAwIDY4OC42MDgwIFRkDQooIFRoaXMgaXMgYSBzbWFsbCBkZW1vbnN0cmF0aW9uIC5wZGYgZmlsZSAtICkgVGoNCkVUDQpCVA0KL0YxIDAwMTAgVGYNCjY5LjI1MDAgNjY0LjcwNDAgVGQNCigganVzdCBmb3IgdXNlIGluIHRoZSBWaXJ0dWFsIE1lY2hhbmljcyB0dXRvcmlhbHMuIE1vcmUgdGV4dC4gQW5kIG1vcmUgKSBUag0KRVQNCkJUDQovRjEgMDAxMCBUZg0KNjkuMjUwMCA2NTIuNzUyMCBUZA0KKCB0ZXh0LiBBbmQgbW9yZSB0ZXh0LiBBbmQgbW9yZSB0ZXh0LiBBbmQgbW9yZSB0ZXh0LiApIFRqDQpFVA0KQlQNCi9GMSAwMDEwIFRmDQo2OS4yNTAwIDYyOC44NDgwIFRkDQooIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlICkgVGoNCkVUDQpCVA0KL0YxIDAwMTAgVGYNCjY5LjI1MDAgNTY5LjA4ODAgVGQNCiggQW5kIG1vcmUgdGV4dC4gQW5kIG1vcmUgdGV4dC4gQW5kIG1vcmUgdGV4dC4gQW5kIG1vcmUgdGV4dC4gQW5kIG1vcmUgKSBUag0KRVQNCkJUDQovRjEgMDAxMCBUZg0KNjkuMjUwMCA1NTcuMTM2MCBUZA0KKCB0ZXh0LiBBbmQgbW9yZSB0ZXh0LiBBbmQgbW9yZSB0ZXh0LiBFdmVuIG1vcmUuIENvbnRpbnVlZCBvbiBwYWdlIDIgLi4uKSBUag0KRVQNCmVuZHN0cmVhbQ0KZW5kb2JqDQoNCjYgMCBvYmoNCjw8DQovVHlwZSAvUGFnZQ0KL1BhcmVudCAzIDAgUg0KL1Jlc291cmNlcyA8PA0KL0ZvbnQgPDwNCi9GMSA5IDAgUiANCj4+DQovUHJvY1NldCA4IDAgUg0KPj4NCi9NZWRpYUJveCBbMCAwIDYxMi4wMDAwIDc5Mi4wMDAwXQ0KL0NvbnRlbnRzIDcgMCBSDQo+Pg0KZW5kb2JqDQoNCjcgMCBvYmoNCjw8IC9MZW5ndGggNjc2ID4+DQpzdHJlYW0NCjIgSg0KQlQNCjAgMCAwIHJnDQovRjEgMDAyNyBUZg0KNTcuMzc1MCA3MjIuMjgwMCBUZA0KKCBBbmQgbW9yZSB0ZXh0LiBBbmQgbW9yZSB0ZXh0LiBBbmQgbW9yZSB0ZXh0LiApIFRqDQpFVA0KQlQNCi9GMSAwMDEwIFRmDQo2OS4yNTAwIDY3Ni42NTYwIFRkDQooIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlIHRleHQuIEFuZCBtb3JlICkgVGoNCkVUDQpCVA0KL0YxIDAwMTAgVGYNCjY5LjI1MDAgNjY0LjcwNDAgVGQNCiggdGV4dC4gT2gsIGhvdyBib3JpbmcgdHlwaW5nIHRoaXMgc3R1ZmYuICBCdXQgbm90IGFzIGJvcmluZyBhcyB3YXRjaGluZyApIFRqDQpFVA0KQlQNCi9GMSAwMDEwIFRmDQo2OS4yNTAwIDY1Mi43NTIwIFRkDQooIHBhaW50IGRyeS4gQW5kIG1vcmUgdGV4dC4gQW5kIG1vcmUgdGV4dC4gQW5kIG1vcmUgdGV4dC4gQW5kIG1vcmUgdGV4dC4gKSBUag0KRVQNCkJUDQovRjEgMDAxMCBUZg0KNjkuMjUwMCA2NDAuODAwMCBUZA0KKCBCb3JpbmcuICBNb3JlLCBhIGxpdHRsZSBtb3JlIHRleHQuIFRoZSBlbmQsIGFuZCBqdXN0IGFzIHdlbGwuICkgVGoNCkVUDQplbmRzdHJlYW0NCmVuZG9iag0KDQo4IDAgb2JqDQpbL1BERiAvVGV4dF0NCmVuZG9iag0KDQo5IDAgb2JqDQo8PA0KL1R5cGUgL0ZvbnQNCi9TdWJ0eXBlIC9UeXBlMQ0KL05hbWUgL0YxDQovQmFzZUZvbnQgL0hlbHZldGljYQ0KL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcNCj4+DQplbmRvYmoNCg0KMTAgMCBvYmoNCjw8DQovQ3JlYXRvciAoUmF2ZSBcKGh0dHA6Ly93d3cubmV2cm9uYS5jb20vcmF2ZVwpKQ0KL1Byb2R1Y2VyIChOZXZyb25hIERlc2lnbnMpDQovQ3JlYXRpb25EYXRlIChEOjIwMDYwMzAxMDcyODI2KQ0KPj4NCmVuZG9iag0KDQp4cmVmDQowIDExDQowMDAwMDAwMDAwIDY1NTM1IGYNCjAwMDAwMDAwMTkgMDAwMDAgbg0KMDAwMDAwMDA5MyAwMDAwMCBuDQowMDAwMDAwMTQ3IDAwMDAwIG4NCjAwMDAwMDAyMjIgMDAwMDAgbg0KMDAwMDAwMDM5MCAwMDAwMCBuDQowMDAwMDAxNTIyIDAwMDAwIG4NCjAwMDAwMDE2OTAgMDAwMDAgbg0KMDAwMDAwMjQyMyAwMDAwMCBuDQowMDAwMDAyNDU2IDAwMDAwIG4NCjAwMDAwMDI1NzQgMDAwMDAgbg0KDQp0cmFpbGVyDQo8PA0KL1NpemUgMTENCi9Sb290IDEgMCBSDQovSW5mbyAxMCAwIFINCj4+DQoNCnN0YXJ0eHJlZg0KMjcxNA0KJSVFT0YNCg==";
    return [{ output: content }];
}
```

{% endcode %}

{% hint style="warning" %}
Sama zawartość pliku musi być zakodowana w base64 oraz zwracana pod parametrem o nazwie **output**. Inaczej lista dokumentów nie pobierze załącznika.
{% endhint %}

{% hint style="info" %}
Wniosek demo: demoDocuments
{% endhint %}
