{*{include 'window/feeds.printObjectInfo.tpl'}*}
{function printItem}
    <li>
        <div class="dataInfo-row"{if (is_array($value) or is_a($value, "\KupShop\FeedGeneratorBundle\Utils\IObjectInfo")) and $value|count} data-info-opener{/if}>
            <strong>{$field}{if !$method}:{/if}</strong>
            {if $help || $description}
                <a class="help-tip" data-feedDataInfo-toggle="tooltip" title=""
                   data-original-title="<div class='help-text'>{$description nofilter}{if $help}<br/>{/if}{$help|nl2br}</div>">
                    <i class="bi bi-question-circle"></i>
                </a>
            {/if}
            {if (is_array($value) or is_a($value, "\KupShop\FeedGeneratorBundle\Utils\IObjectInfo")) and $value|count}
                <div class="dataInfo-opener">
                    <i class="bi bi-plus-circle"></i>
                </div>
            {elseif !is_array($value) and !is_a($value, "\KupShop\FeedGeneratorBundle\Utils\IObjectInfo")}
                {if isset($value)}
                    <small>{$value|truncate:100}</small>
                {/if}
            {/if}
            <span data-field-btn-copy data-value="{ltrim($fullPath, '.')}">
                <i class="bi bi-clipboard-fill"></i>
                <i class="bi bi-clipboard-plus-fill"></i>
            </span>
        </div>
        {*{if $return} - {$return}{/if}*}

        {if is_array($value)}
            <ul>
                {call name='printObject' item=$value}
            </ul>
        {elseif is_a($value, "\KupShop\FeedGeneratorBundle\Utils\IObjectInfo")}
            <ul>
                {call name='printObject' item=$value}
            </ul>
        {/if}
    </li>
{/function}

{function printObject}
    {if is_array($item) || is_a($item, '\Traversable')}
        {foreach $item as $key => $value}
            {printItem field=$key value=$value description='' help='' method=false fullPath="{$fullPath}{if is_numeric($key)}['{$key}']{else}.{$key}{/if}"}
        {/foreach}
    {elseif is_object($item)}
        {$data = $item->getFieldsAndMethods()}

        {foreach $data as $field}
            {if $field.method}
                {$value = ''}
            {else}
                {$value = $field.value}
            {/if}

            {printItem field=$field.name value=$value description=$field.description help=$field.help return=$field.return method=$field.method fullPath="{$fullPath}.{$field.rawName}"}
        {/foreach}
    {/if}
{/function}

<div class="row">
    <div class="col-lg-12">
        <p>Seznam společných obecných objektů:</p>
        <ul class="dataInfo">
            {foreach $body.contextPropertiesLocator->getContexts() as $contextName => $contextServiceID}
                <li>
                    <div class="dataInfo-row" data-info-opener>
                        <div class="dataInfo-opener">
                            <i class="bi bi-plus-circle"></i>
                        </div>
                        <strong>{$contextName}</strong>
                    </div>
                    <ul>
                        {printObject item=$body.contextPropertiesLocator->getServiceByContextName($contextName) fullPath=$contextName}
                    </ul>
                </li>
            {/foreach}
        </ul>
        <br/>
        <h4>Jazyk výrazů</h4>
        <p>Pro zápis výrazů se využívá JavaScript, a to v podobné verzi jakou umožňuje <strong>Node.js 18</strong>.
            Interpretace výrazů probíhá pomocí V8 JavaScript enginu{* ve verzi 10.5*}.
            Syntax podporuje <a href="https://www.w3schools.com/js/js_es6.asp" target="_blank">ECMAScript 2015 (ES6)</a>, ES2017 až ES2021 a
            převážně také ES2022 a ES2023.
            Podrobný rozpis podpory funkcí naleznete ve sloupci Node.js 18.x.x <a href="https://node.green/" target="_blank">zde
                (node.green)</a>. {*Node.js využívá dle <a href="https://nodejs.org/en/download/releases" target="_blank">releases</a> engine V8 verze 10.2, syntax i podporované funkce by zde měly být obdobné.*}
        </p>
        <dl>
            <dt>Výraz (Expression) vs Víceřádkový výraz (Multiline)</dt>
            <dd>Expression může obsahovat pouze jednořádkové výrazy a na začátek se automaticky přidává <code>return </code>. Mimo tohoto se
                vyhodnocování neliší.
            </dd>
            <dt>Proměnné</dt>
            <dd>V Multiline bloku lze snadno definovat globální proměnnou např. <code>promenna = 'test';</code>, ke které lze následně
                přistupovat i z jiných Multiline či Expression bloků, které jsou v konfiguraci definované později. Tato proměnná je platná
                vždy pouze v rámci právě zpracovávané položky (produktu), přičemž před každou další položkou (produktem) se globální kontext
                resetuje. Lokální proměnné, např. <code>var promenna2 = 'test2';</code>, jsou dostupné pouze v rámci výrazu, ve kterém jsou
                definovány.
            </dd>
            <dt>Object.values(obj)</dt>
            <dd>Pro získání pole hodnot objektu "obj" lze použít <code>Object.values(obj)</code>, stejně jako v <a
                   href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values" target="_blank">ECMAScript
                    2017</a>.
            </dd>
            <dt>arr.includes(searchElement[, fromIndex])</dt>
            <dd>Pro zjištění zda-li pole <code>arr</code> obsahuje položku <code>2</code> lze použít <code>arr.includes(2)</code>, stejně
                jako v <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes"
                          target="_blank">ECMAScript 2016</a>.
            </dd>
            <dt>str.includes(searchString[, position])</dt>
            <dd>Pro zjištění zda-li proměnná <code>str</code> s řetězcem obsahuje text "text" lze použít <code>str.includes('text')</code>,
                stejně jako v <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes"
                                 target="_blank">ECMAScript 2015</a>.
            </dd>
        </dl>
        <h4>Další funkce</h4>
        <dl>
            <dt>console.log(foo)</dt>
            <dd>Funkce v preview módu zaserializuje předaný objekt do JSON a zobrazí v záložce <strong>Log</strong>. V produkčním režimu
                funkce neprovádí nic.
            </dd>
        </dl>
        <h4>Bloky</h4>
        <dl>
            <dt>Přetahování bloků</dt>
            <dd>Pro úpravu pozice bloku se využívá drag & drop. Blok lze "uchopit" za jeho levý okraj.
                Tato oblast je zvýrazněna o něco tmavším pozadím a v její horní části se nachází ikona reprezentující typ bloku.
                Při změně umístění bloku dochází k lehké kontrole pozic, která má za účel zamezit nesmyslným kombinacím.
                Nelze např. vnořit Element do Expression nebo Attribute apod.
            </dd>
            <dt>Kopírování bloků</dt>
            <dd>Pro zkopírování požadovaného bloku najeďte kurzorem myši na zvýrazněný levý okraj bloku a stiskněte <strong>CTRL+C</strong>.
                Tím se uloží reprezentace bloku do schránky počítače.
                Pro následné vložení do struktury feedu najeďte kurzorem na levý okraj požadovaného rodičovského bloku a stiskněte <strong>CTRL+V</strong>.
                Kopírovaný blok bude tímto vnořen na konec vybraného bloku.
                Kopírovaný blok lze vložit také do prázdné konfigurace tak, že najedete myší nad prázdný prostor (kam se vkládají bloky) a
                stisknete <strong>CTRL+V</strong>.
                Při vkládání bloku probíhá obdobná kontrola validity pozic jako při přetahování.
                V případě zjištění chyby dojde k obnovení struktury do stavu před vložením.
            </dd>
            <dt>Vložení nového bloku</dt>
            <dd>Přetáhněte požadovaný typ z pravé části okna do cílového místa ve struktuře feedu.</dd>
            <dt>Odebrání bloku</dt>
            <dd>Přetáhněte blok na ikonu koše v pravé části okna.</dd>
        </dl>
    </div>
</div>
