Přeskočit obsah

Tiskové šablony

Tiskové šablony umožňují otevřít data formuláře v novém okně prohlížeče jako formátovaný HTML dokument připravený k tisku. Šablony používají Handlebars syntaxi pro vykreslení hodnot polí do HTML.

Přehled

Tiskové šablony jsou uloženy v Cosmos DB ve stejném kontejneru templates jako textové šablony. Každá tisková šablona obsahuje lokalizovaný titulek a tělo (HTML s Handlebars výrazy).

Struktura šablony

{
  "id": "template-ContractCoverSheet",
  "templateName": "ContractCoverSheet",
  "templateType": "Print",
  "localizations": {
    "1029": {
      "title": "Titulní strana smlouvy",
      "body": "<h1>{{Title}}</h1><table><tr><td>Autor</td><td>{{Author}}</td></tr></table>"
    },
    "1033": {
      "title": "Contract Cover Sheet",
      "body": "<h1>{{Title}}</h1><table><tr><td>Author</td><td>{{Author}}</td></tr></table>"
    }
  },
  "version": 1,
  "isActive": true,
  "tenantId": "<tenant-id>"
}
Vlastnost Popis
templateName Jedinečný název šablony. Slouží jako identifikátor při volání z Custom Script.
templateType Typ šablony — Print.
localizations Lokalizace indexované LCID kódem. Každá obsahuje title (titulek) a body (HTML tělo).
version Verze šablony.
isActive Pouze aktivní šablony (true) jsou dostupné přes API.

Lokalizace se vybírá podle jazyka uživatele. Priorita výběru je stejná jako u textových šablon — viz Lokalizace.

Spuštění tisku

Tisk se spouští z Custom Script formuláře pomocí funkce tisa.utils.showPrintTemplate(). Tlačítko pro tisk se přidává jako akční tlačítko.

{
  "ActionButtons": [
    {
      "Title": "Action.Print.Title",
      "ID": "PrintInvoice",
      "CommandFunction": "btnPrintInvoice",
      "Icon": {
        "Icon": "regular/print"
      }
    }
  ],
  "CustomScript": "async function btnPrintInvoice() {\n  await tisa.utils.showPrintTemplate('InvoiceTemplate', true);\n}"
}

Parametry showPrintTemplate

Parametr Popis
templateName Název tiskové šablony odpovídající templateName v Cosmos DB. [Povinné]
debug Zobrazí na konci dokumentu debug box s hodnotami všech polí formuláře. Slouží pro ladění.

Poznámka: Jazyk (LCID) se určuje automaticky z kontextu stránky SharePoint.

Handlebars syntaxe

Tělo šablony (body) je HTML dokument s Handlebars výrazy. Hodnoty polí formuláře jsou dostupné přímo podle interního názvu pole.

Vložení hodnoty pole

<h1>{{Title}}</h1>
<p>Dodavatel: {{s_supplierName}}</p>
<p>Částka: {{s_amountWithoutVat}}</p>

Dvojité složené závorky {{pole}} escapují HTML znaky. Pro pole obsahující HTML (formátovaný text) použijte trojité závorky:

<!-- Escapované (bezpečné) -->
<div>{{wfHistory}}</div>

<!-- Raw HTML (pro pole s formátem HTML) -->
<div>{{{wfHistory}}}</div>

Podmíněné bloky

{{#if s_note}}
  <p>Poznámka: {{s_note}}</p>
{{else}}
  <p>Bez poznámky.</p>
{{/if}}

Iterace přes pole

{{#each (parseJson s_items)}}
  <tr>
    <td>{{lookup this.Cells "RESX.$O_Name"}}</td>
    <td>{{lookup this.Cells "RESX.$O_Amount"}}</td>
  </tr>
{{else}}
  <tr><td colspan="2">Žádné záznamy</td></tr>
{{/each}}

Handlebars helpery

Tiskové šablony mají k dispozici vlastní helpery pro práci s různými typy dat.

Helper Popis Příklad
formatDate Formátování data. {{formatDate Created format="dd.MM.yyyy"}}
json Výpis hodnoty jako JSON (raw). {{json this}}
parseJson Parsování JSON řetězce na objekt nebo pole. {{#each (parseJson s_table)}}...{{/each}}
eq Porovnání dvou hodnot (striktní rovnost). {{#if (eq Status "Active")}}...{{/if}}
lookupValue Získání zobrazované hodnoty z lookup pole ("id#;hodnota""hodnota"). {{lookupValue s_department}}
lookupId Získání ID z lookup pole ("id#;hodnota""id"). {{lookupId s_department}}

formatDate

Helper formatDate podporuje dva režimy:

Explicitní formát:

{{formatDate Created format="dd.MM.yyyy"}}
{{formatDate Created format="dd.MM.yyyy HH:mm"}}
{{formatDate Created format="yyyy-MM-dd"}}

Podporované tokeny: dd, MM, yyyy, HH, hh, mm, ss.

Lokalizovaný formát:

{{formatDate Created locale="cs-CZ" includeTime=false}}
{{formatDate Created locale="en-GB" includeTime=true use24Hour=true}}
Volba Popis Výchozí
format Explicitní vzor formátu. Má přednost před ostatními volbami.
locale BCP47 kód jazyka (např. cs-CZ, en-GB).
includeTime Zobrazit čas. false
use24Hour 24hodinový formát času. true
includeSeconds Zobrazit sekundy. false

Poznámka: Hodnoty bez časové zóny se interpretují jako UTC. Neplatné hodnoty se vykreslí jako původní řetězec.

Práce s pokročilými typy polí

ExternalLookup

Pole typu ExternalLookup ukládají hodnotu ve formátu "id#;zobrazenáHodnota". Pro zobrazení textu použijte helper lookupValue:

<!-- Vstup: "1#;EMS" -->
{{lookupValue s_department}}
<!-- Výstup: EMS -->

AdvancedTable

Pole typu AdvancedTable obsahují JSON řetězec s polem objektů. Každý objekt má vlastnost Cells — slovník sloupců indexovaný názvem sloupce (formát RESX.$O_NázevSloupce).

<table>
  <thead>
    <tr>
      <th>Oddělení</th>
      <th>Předmět</th>
      <th>Částka</th>
    </tr>
  </thead>
  <tbody>
{{#each (parseJson s_postingTable)}}
    <tr>
      <td>{{lookupValue (lookup this.Cells "RESX.$O_Department")}}</td>
      <td>{{lookup this.Cells "RESX.$O_Subject"}}</td>
      <td style="text-align:right;">{{lookup this.Cells "RESX.$O_Amount"}}</td>
    </tr>
{{else}}
    <tr><td colspan="3">Žádné záznamy</td></tr>
{{/each}}
  </tbody>
</table>

Pro sloupce typu ExternalLookup (např. oddělení, sazba DPH) obalte lookup helperem lookupValue. Pro ostatní sloupce (text, číslo) použijte lookup přímo.

Přehled typů polí

Typ pole Formát hodnoty Přístup v šabloně Pomocné helpery
Text, Number Prostý text {{fieldName}}
DateTime ISO řetězec {{formatDate fieldName format="dd.MM.yyyy"}} formatDate
HTML (formátovaný text) HTML kód {{{fieldName}}} trojité závorky
ExternalLookup "id#;hodnota" {{lookupValue fieldName}} lookupValue / lookupId
AdvancedTable JSON řetězec {{#each (parseJson fieldName)}} parseJson + lookup
User "userId#;jméno" {{lookupValue fieldName}} lookupValue

Příklad: Tisková šablona faktury

<style type="text/css">
  body { font-family: Arial, sans-serif; }
  h1 { text-align: center; margin-bottom: 20px; }
  table { width: 100%; border-collapse: collapse; }
  th, td { border: 1px solid #ddd; padding: 8px; }
  th { background: #f5f5f5; font-weight: bold; }
</style>

<h1>Rozúčtování faktury</h1>

<table style="margin-bottom: 20px;">
  <tr>
    <td><strong>Číslo faktury:</strong></td>
    <td>{{s_invoiceNumber}}</td>
    <td><strong>Dodavatel:</strong></td>
    <td>{{s_supplierName}}</td>
  </tr>
  <tr>
    <td><strong>Datum vystavení:</strong></td>
    <td>{{formatDate s_invoiceIssueDate format="dd.MM.yyyy"}}</td>
    <td><strong>Částka bez DPH:</strong></td>
    <td>{{s_amountWithoutVat}}</td>
  </tr>
</table>

<table>
  <thead>
    <tr>
      <th>Oddělení</th>
      <th>Předmět</th>
      <th>Částka</th>
      <th>DPH</th>
      <th>Poznámka</th>
    </tr>
  </thead>
  <tbody>
{{#each (parseJson s_postingTable)}}
    <tr>
      <td>{{lookupValue (lookup this.Cells "RESX.$O_Department")}}</td>
      <td>{{lookup this.Cells "RESX.$O_Subject"}}</td>
      <td style="text-align:right;">{{lookup this.Cells "RESX.$O_Amount"}}</td>
      <td>{{lookupValue (lookup this.Cells "RESX.$O_VAT")}}</td>
      <td>{{lookup this.Cells "RESX.$O_Note"}}</td>
    </tr>
{{else}}
    <tr><td colspan="5" style="text-align:center;">Žádné záznamy</td></tr>
{{/each}}
  </tbody>
</table>

Debug režim

Volání tisa.utils.showPrintTemplate("TemplateName", true) s parametrem debug nastaveným na true zobrazí na konci dokumentu box se všemi daty formuláře předanými do šablony. V šabloně lze debug box podmínit:

{{#if _showDebug}}
<div style="margin-top: 30px; padding: 10px; background: #f9f9f9; border: 1px solid #ddd;">
  <strong>Data formuláře:</strong>
  <pre>{{json this}}</pre>
</div>
{{/if}}

Debug režim slouží pro ověření správných názvů polí a jejich hodnot při vývoji šablony.

Doporučení

  • Používejte Handlebars syntaxi — je čistší a bezpečnější než JavaScript v šablonách.
  • Vkládejte CSS styly do tagu <style> přímo v těle šablony.
  • Ošetřete prázdná data klauzulí {{else}} v blocích {{#each}}.
  • Testujte s debug režimem pro ověření názvů polí.
  • Poskytněte lokalizace pro všechny požadované jazyky (minimálně 1029 a 1033).
  • Pro pole ExternalLookup vždy používejte lookupValue.
  • Názvy sloupců AdvancedTable získáte z konfigurace pole (formát RESX.$O_NázevSloupce).

API přístup

Tiskové šablony jsou dostupné přes stejný API endpoint jako textové šablony:

GET /templates?type=print&templates=ContractCoverSheet&lcid=1029
Parametr Popis Výchozí
type Typ šablony — print. text
templates Názvy šablon oddělené čárkou, nebo all pro všechny. all
lcid Kód jazyka. 1033

Poznámka: Pouze šablony s isActive: true jsou vráceny API.