> For the complete documentation index, see [llms.txt](https://docs.eximee.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.eximee.com/budowanie-aplikacji/interfejs-uzytkownika/formularze/biblioteka-komponentow-bazowych/5-dokumenty-i-zaloczniki/lista-dokumentow-documentlist.md).

# Lista dokumentów - DocumentList

Lista wygenerowanych dokumentów

![](/files/472f3926f619a950c1726ab54aa80a9606a5de31)

## 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>Pobierz wszystkie dokumenty</strong><br>(sekcja <strong>Podstawowe właściwości</strong>)</p> | allowDownloadingOfAllDocuments | Opcja umożliwiająca 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](/budowanie-aplikacji/interfejs-uzytkownika/formularze/praca-z-komponentami-bazowymi/wspolne-wlasciwosci-komponentow.md)

![Ilustracja 1. Przykładowy wygląd komponentu na wniosku](/files/4213165947609940de1b76a71085a7a897d378a0)

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](/budowanie-aplikacji/interfejs-uzytkownika/formularze/biblioteka-komponentow-bazowych/5-dokumenty-i-zaloczniki/generator-dokumentow-documentgenerator.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 %}

Poniższa usługa zwróci nam dwa dokumenty - zakodowany w Base64 oraz pobrany z zewnętrznego adresu URL:

* *document\_list\_example1* - skrypt pobiera parametr wejściowy fileName z wniosku i zwraca dwa dokumenty:
  * pierwszy dokument ma ustawiony parametr `source` na `externalDocument` — zawartość pliku zostanie pobrana ze wskazanego w parametrze `documentServiceName` skryptu (w tym przypadku jest to skrypt `document_list_example2.js`, który zwraca zawarość pliku w Base64).
  * drugi dokument ma ustawiony parametr `source` na `externalWeb` — zawartość pliku zostanie pobrana bezpośrednio z podanego zewnętrznego adresu URL.
* *document\_list\_example2* - skrypt zdefiniowany na potrzeby wywołania go w skrypcie document\_list\_example1 - 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 załączonego pliku. Możliwe wartości:
  * `externalDocument` — plik pochodzi z zewnętrznego źródła danych,
  * `externalWeb` — plik pochodzi z zewnętrznego adresu URL,
* **documentServiceName** - nazwa drugiej usługi, która zostaje wywołana aby pobrać zawartość pliku (wypełniane w przypadku, gdy source=externalDocument). 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...
* **documentLink** - zewnętrzny adres URL (wypełniane w przypadku, gdy source=externalWeb)

<figure><img src="/files/UGBgipq5Wrjkl9dgUSiP" 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) {
  var fileName = context.getFirstParameter('fileName');

  return [
    {
      'fileName': fileName,
      'fileMimeType': 'application/pdf',
      'source': 'externalDocument', 
      'documentServiceName': 'script:document_list_example2',
      'documentServiceParams': 'parameter1=value1&parameter2=value2'
    },
    {
      'fileName': 'fileFromUrl.pdf',
      'mimeType': 'text/plain',
      'source': 'externalWeb',
      'link': 'https://example.com/example_file_from_url.pdf',
    }
  ];
}
```

{% 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 %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.eximee.com/budowanie-aplikacji/interfejs-uzytkownika/formularze/biblioteka-komponentow-bazowych/5-dokumenty-i-zaloczniki/lista-dokumentow-documentlist.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
