> 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/7-komponenty-specjalne/sekcja-powtarzalna-repeatablesection.md).

# Sekcja powtarzalna - RepeatableSection

Zestaw pól, które mogą być wielokrotnie wypełnione we wniosku przez użytkownika.

![](/files/f853d33eb03110981670ad9427668f904670cca9)

## Właściwości komponentu

<table><thead><tr><th>Właściwość Eximee Designer</th><th width="187.583251953125">Nazwa atrybutu w Źródle</th><th>Opis</th></tr></thead><tbody><tr><td><strong>Minimalna liczba wystąpień sekcji</strong><br>(sekcja <strong>Podstawowe właściwości</strong>)</td><td>minCount</td><td>Minimalna liczba wystąpień sekcji powtarzalnej (początkowa wartość 1). W chwili wyświetlania wniosku jest to także liczba wystąpień, które są domyślnie widoczne i dostępne. Usuwając elementy sekcji podczas wypełniania wniosku nie można zejść poniżej tej liczby.</td></tr><tr><td><strong>Maksymalna liczba wystąpień sekcji</strong><br>(sekcja <strong>Podstawowe właściwości</strong>)</td><td>maxCount</td><td>Maksymalna liczba wystąpień sekcji powtarzalnej (początkowa wartość 1). Dodając elementy sekcji nie można przekroczyć tej liczby.</td></tr><tr><td><strong>Tytuł</strong><br>(sekcja <strong>Podstawowe właściwości</strong>)</td><td>title</td><td><p>Tytuł.</p><p>Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.</p></td></tr><tr><td><strong>Tytuł całej sekcji powtarzalnej</strong><br>(sekcja <strong>Podstawowe właściwości</strong>)</td><td>parentSectionTitle</td><td>Tytuł dla całej sekcji powtarzalnej.</td></tr><tr><td><strong>Etykieta przycisku zwinięcia sekcji</strong><br>(sekcja <strong>Pozostałe</strong>)</td><td></td><td><p>Etykieta przycisku zwinięcia sekcji.</p><p>Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.</p></td></tr><tr><td><strong>Etykieta przycisku rozwinięcia sekcji</strong><br>(sekcja <strong>Pozostałe</strong>)</td><td></td><td><p>Etykieta przycisku rozwinięcia sekcji.</p><p>Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.</p></td></tr><tr><td><strong>Sekcja zwijana</strong><br>(sekcja <strong>Pozostałe</strong>)</td><td>foldable</td><td><p>Określa czy sekcja powinna mieć możliwość zwinięcia (początkowo ustawiona na "false").</p><p>Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.</p></td></tr><tr><td><strong>Warunek zwinięcia sekcji</strong><br>(sekcja <strong>Pozostałe</strong>)</td><td>foldedCondition</td><td><p>Warunek zwinięcia sekcji.</p><p>Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniami.</p></td></tr><tr><td><strong>Sposób prezentacji rozwijania sekcji</strong><br>(sekcja <strong>Pozostałe</strong>)</td><td>presentation</td><td><p>Określenie sposobu prezentacji rozwijania sekcji. Dostępne typy prezentacji zwijania/rozwijania: STANDARD i LABELS (poniżej szerszy opis).</p><p>Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.</p></td></tr><tr><td><strong>Dynamiczne etykiety przycisków</strong><br>(sekcja <strong>Pozostałe</strong>)</td><td>plusMinusLabels</td><td>Warunki dla widoczności przycisków dodawania/usuwania elementów sekcji powtarzalnej.</td></tr><tr><td><strong>Etykieta przycisku usunięcia sekcji</strong><br>(sekcja <strong>Pozostałe</strong>)</td><td>minusText</td><td>Etykieta dla przycisku minus (usunięcie elementu sekcji powtarzalnej).</td></tr><tr><td><strong>Etykieta przycisku dodania sekcji</strong><br>(sekcja <strong>Pozostałe</strong>)</td><td>plusText</td><td>Etykieta dla przycisku plus (dodanie elementu sekcji powtarzalnej).</td></tr><tr><td><strong>Tytuł rozwijanej sekcji</strong><br>(sekcja <strong>Pozostałe</strong>)</td><td>rowTitleExpanded</td><td><p>Tytuł wyświetlany dla rozwiniętej sekcji.</p><p>Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.</p></td></tr><tr><td><strong>Tytuł zwiniętej sekcji</strong><br>(sekcja <strong>Pozostałe</strong>)</td><td>rowTitleCollapsed</td><td><p>Tytuł wyświetlany dla zwiniętej sekcji.</p><p>Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.</p></td></tr><tr><td><strong>Obramowanie komponentu</strong><br>(sekcja <strong>Pozostałe</strong>)</td><td>parentSectionFrameVisible</td><td><p>Ustawienie flagi powoduje wyświetlenie ramki wokół wszystkich wystąpień sekcji powtarzalnej (początkowo ustawiona na "false").</p><p>Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.</p></td></tr><tr><td><strong>Wartość przesunięcia przycisku dodawania</strong><br>(sekcja <strong>Pozostałe</strong>)</td><td>plusButtonOffset</td><td><p>Wartość przesunięcia przycisku dodawania (początkowo ustawiona na 0).</p><p>Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.</p></td></tr><tr><td><strong>Pomoc kontekstowa przycisku usuwania</strong><br>(sekcja <strong>Pozostałe</strong>)</td><td>minusToolTipText</td><td>Pomoc kontekstowa przycisku usuwania wiersza</td></tr></tbody></table>

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

## Praca z Sekcją powtarzalną

**Sekcja powtarzalna** umożliwia wielokrotne wyświetlenie tego samego zestawu komponentów na formularzu. Wewnątrz sekcji można umieścić komponenty bazowe, np. Pole tekstowe, Pole wyboru wartości z listy itd. Każde wystąpienie sekcji zawiera ten sam zestaw komponentów, ale może przechowywać inne wartości.

Liczbę dostępnych wystąpień sekcji określają właściwości **Minimalna liczba wystąpień sekcji** oraz **Maksymalna liczba wystąpień sekcji**. Użytkownik może podczas wypełniania formularza dodawać kolejne wystąpienia sekcji lub usuwać istniejące za pomocą odpowiednich przycisków.

Na poniższym przykładzie każde wystąpienie Sekcji powtarzalnej zawiera dwa Pola tekstowe.

<figure><img src="/files/29d77dca2b9eb2325166858a6aae9837b0bf4522" alt=""><figcaption><p><em><strong>Ilustracja 1.</strong> Przykładowy wygląd komponentu na wniosku</em></p></figcaption></figure>

{% hint style="warning" %}
W Repeatable Section nie można użyć [zmiennych sesyjnych](/budowanie-aplikacji/interfejs-uzytkownika/formularze/zmienne-sesyjne.md) — tutaj używamy pól technicznych (np. komponent Pole tekstowe z zaznaczoną właściwością [Pole techniczne](/budowanie-aplikacji/interfejs-uzytkownika/formularze/praca-z-komponentami-bazowymi/wspolne-wlasciwosci-komponentow.md)). Również zasilanie pól z usługi w sekcji powtarzalnej może powodować nietypowe błędy — np. nieprawidłowe wyświetlanie komponentów (ale nie musi). W takiej sytuacji należy zastosować obejście w postaci pola technicznego.
{% endhint %}

## Zasilenie Sekcji powtarzalnej skryptem

Aby dynamicznie zasilić danymi **Sekcję powtarzalną**, należy skorzystać z zewnętrznego skryptu. W tym celu przejdź do **Właściwości** komponentu, wybierz zakładkę **Interakcje**, a następnie zaznacz **Źródło danych zewnętrznych**. Opcja ta pozwala na wybór skryptu, który dostarczy dane do komponentu.

### Przykład skryptu generującego listę powtarzalną

Poniższy skrypt generuje listę powtarzalnych sekcji danych testowych na podstawie zadanej liczby wierszy i opcjonalnie dołącza dodatkowe pola (min, max, count) do pierwszego wiersza, jeśli odpowiednie flagi są ustawione.

```js

function callService(context) {
    const rowCount = parseInt(context.getFirstParameter('rowCount') || '0');
    const count = context.getFirstParameter('count');
    const min = context.getFirstParameter('min');
    const max = context.getFirstParameter('max');
    const returnCount = context.getFirstParameter('returnCount');
    const returnMin = context.getFirstParameter('returnMin');
    const returnMax = context.getFirstParameter('returnMax');

    const result = [];

    for (let i = 0; i < rowCount; i++) {
        result.push({
            field1: `field1_${i}`,
            field2: `field2_${i}`,
            field3: `field3_${i}`,
        });
    }

    if (returnMin =="true" && min.trim() != '') {
        if (result.length == 0) result.push({});
        result[0]['min'] = min;
    }

    if (returnMax =="true" && max.trim() != '') {
        if (result.length == 0) result.push({});
        result[0]['max'] = max;
    }

    if (returnCount =="true" && count.trim() != '') {
        if (result.length == 0) result.push({});
        result[0]['count'] = count;
    }

    return result;
}
```

Kluczowym etapem po wybraniu źródła danych jest odpowiednia konfiguracja przepływu informacji:

* mapowanie pól - upewnij się, że parametry wejściowe skryptu (np. pole określające liczbę wierszy) są poprawnie powiązane z komponentami na wniosku. Podobnie, wyjściowe parametry skryptu (zwracane dane) muszą zostać przypisane do konkretnych atrybutów komponentu,
* nasłuchiwanie - pamiętaj o dodaniu nasłuchiwań na komponenty wzbudzające zmianę. Dzięki nim skrypt uruchomi się automatycznie i przeładuje sekcję, gdy tylko użytkownik zmieni wartość na formularzu (np. wpisze inną liczbę powtórzeń).

<figure><img src="/files/YGgT81t1g7PBRxikDkys" alt=""><figcaption><p><em><strong>Ilustracja 2.</strong> Sposób zasilenia sekcji powtarzalnej skryptem</em></p></figcaption></figure>

<figure><img src="/files/Zx6J0qICV6BOiPhjd2K6" alt=""><figcaption><p><em><strong>Ilustracja 3.</strong> Parametry wyjściowe skryptu</em></p></figcaption></figure>

Po prawidłowym podpięciu i zmapowaniu skryptu, zachowanie komponentu staje się w pełni dynamiczne. Formularz automatycznie wygeneruje i wyświetli dokładną liczbę sekcji powtarzalnych, zgodnie z logiką wpisaną w kodzie.

<figure><img src="/files/03pp9pB9l1PtPclialPN" alt=""><figcaption><p><em><strong>Ilustracja 4.</strong> Sekcja powtarzalna ze sterowaniem liczbą powtórzeń (zasilenie sekcji skryptem)</em></p></figcaption></figure>

## Przykład Sekcji powtarzalnej z wartościami do zsumowania

Gdy chcemy zsumować wartości z powtarzającego się komponentu Pola tekstowego w **Sekcji powtarzalnej**, dodajemy kolejne Pole tekstowe poza sekcją i w jego właściwościach podpinamy w **Źródle danych zewnętrznych** skrypt SumService:

```javascript
function callService(context) {
    let parts = context.getParameters('parts');
    
    let result = BigDecimal.valueOf("0");
    
    if (!!parts) {
        for (let i = 0; i < parts.size(); i++) {
            let part = parts.get(i);

            if(!!part){
                let bigDecimalItem = BigDecimal.valueOf(part.replace(',','.'));
                result = result.add(bigDecimalItem);
            }
        }
    }
    
    return [{'output': result.setScale(2)}];
}
```

W parametrach wejściowych skryptu podpinamy powtarzający się komponent z wartościami do zsumowania, a w parametrach wyjściowych wybieramy output, czyli sumę wartości, jako atrybut text.

<figure><img src="/files/sWKZ0VySHPcZLoUCHdq6" alt=""><figcaption><p><em><strong>Ilustracja 5.</strong> Podpięcie parametru wyjściowego w skrypcie SumService</em></p></figcaption></figure>

{% hint style="info" %}
Wnioski demo:

* demoRepeatableSection
* repeatable\_section\_service (wniosek pokazujący zasilenie sekcji usługą lub skryptem)
* demoRepeatableSectionValidator (wniosek z walidatorem dla powtarzających się wartości w sekcji)
  {% endhint %}

{% hint style="info" %}
♿WCAG: [Dobre praktyki WCAG dla low-code dev](/budowanie-aplikacji/proces-biznesowy/tworzenie-procesu-biznesowego-w-bpmn-2.0/dobre-praktyki.md)
{% 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/7-komponenty-specjalne/sekcja-powtarzalna-repeatablesection.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.
