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.