Přehled
Systém úprav umožňuje rozšířit uživatelské rozhraní přidáním vlastních tlačítek, panelů, odkazů na pole a vizuálního stylu do různých částí aplikace. Tyto úpravy jsou specifické pro entitu a lze je nakonfigurovat tak, aby se zobrazovaly v různých kontextech na základě uživatelských oprávnění, stavu systému a vlastních podmínek.
Čtyři typy úprav
- Vlastní tlačítka — Interaktivní akce v datových mřížkách a detailech
- Vlastní panely — Panely s doplňujícími informacemi v rozhraní editoru
- Vlastní odkazy — Odkazy na úrovni polí do externích systémů na základě dat záznamu
- Barvy sloupců — Podmíněné barvy pozadí buněk v datových mřížkách
card: Custom Buttons
Interaktivní tlačítka, která se zobrazují v datových mřížkách nebo detailech dat a mohou provádět vlastní akce na vybraných záznamech. Podporují otevírání URL s kontextovými proměnnými nebo spouštění automatizovaných pracovních postupů.
card: Custom Panels
Sbalitelné panely, které se zobrazují v rozhraní editoru a zobrazují doplňující informace, vkládají externí obsah nebo poskytují vlastní ovládací prvky pro vylepšené pracovní postupy.
card: Custom Links
Odkazy na úrovni polí, které se zobrazují v polích editoru a otevírají externí aplikace s kontextovými daty. Viditelné pouze v případě, že pole má hodnotu a jsou splněny volitelné podmínky.
card: Column Colours
Podmíněné barvy pozadí pro buňky datové mřížky na základě výrazů filtru. Aplikujte na všechny sloupce nebo konkrétní sloupce pro vizuální zvýraznění dat.
Klíčové schopnosti
- Specifické pro entitu — Připojte úpravy k jakékoli datové entitě
- Kontextově závislé — Získejte přístup k informacím o uživateli, vybraným záznamům a stavu systému
- Podmíněná viditelnost — Zobrazit/skrýt na základě vlastních výrazů filtru
- Vědomé o sadě změn a režimu jen pro čtení — Respektujte systémové režimy a oprávnění
Vlastní tlačítka [badge:Buttons|warning]
Interaktivní tlačítka, která vylepšují funkčnost seznamu dat nebo detailu dat
[try:/customButtons|Spravovat vlastní tlačítka →|right]
Klíčové vlastnosti
- Zobrazují se v datových mřížkách vedle standardních akčních tlačítek
- Provádějí vlastní akce na vybraných záznamech
- Podporují výběr jednoho i více záznamů
- Mohou být podmíněně zobrazeny na základě stavu záznamu
- Respektují omezení sady změn a režimu jen pro čtení
Konfigurační pole
Základní vlastnosti
name— Popisek tlačítka zobrazený uživatelůmentityId— Cílová entita pro tlačítkoicon— Ikona zobrazená na tlačítkucolor— Barevný motiv tlačítka
Chování
allowMultiple— Zda tlačítko funguje s více vybranými záznamycondition— Volitelný výraz filtru pro povolení/zakázání tlačítkaaction— Typ akce: “openUrl” nebo “runAutomation”url— Cílová URL (pro akci openUrl)automation_id— Cílová automatizace (pro akci runAutomation)
Řízení viditelnosti
allowInChangeSet— Zobrazit tlačítko, když je aktivní sada změnallowInReadOnly— Zobrazit tlačítko v režimu jen pro čtení
Typy akcí
openUrl — Akce Otevřít URL
Otevře URL v prohlížeči s kontextovými informacemi z uživatelského rozhraní. To umožňuje výkonné vlastní integrace a připojení k externím systémům.
Dostupné kontextové proměnné:
{user.id}— ID aktuálního uživatele{user.email}— E-mail aktuálního uživatele{selectedIds}— Seznam ID vybraných záznamů oddělený čárkami{entityId}— Identifikátor cílové entity{orgId}— ID aktuální organizace
Příklad URL:
https://external-system.com/api/export?records={selectedIds}&user={user.id}&org={orgId}
runAutomation — Akce Spustit automatizaci
Spustí předdefinovaný automatizační pracovní postup na vybraných záznamech. To umožňuje komplexní zpracování dat, transformace a provádění obchodní logiky.
Možnosti automatizace:
- Úprava a aktualizace dat
- Výpočty a transformace polí
- Integrace s externími systémy
- Operace dávkového zpracování
- Spouštění pracovních postupů
Příklady použití:
- Hromadné aktualizace cen na základě výpočtů nákladů
- Automatizovaná synchronizace inventáře
- Pracovní postupy obohacování zákaznických dat
- Generování a distribuce sestav
Příklady konfigurací
Příklad akce OpenUrl:
{
"name": "Export do PDF",
"entityId": "products",
"icon": "FileText",
"color": "blue",
"allowMultiple": true,
"allowInChangeSet": false,
"allowInReadOnly": true,
"condition": "status = 'active'",
"action": "openUrl",
"url": "https://export.company.com/pdf?ids={selectedIds}&user={user.id}"
}
Příklad akce RunAutomation:
{
"name": "Update Prices",
"entityId": "products",
"icon": "euro",
"color": "green",
"allowMultiple": true,
"allowInChangeSet": true,
"allowInReadOnly": false,
"condition": "category.code = 'ELEC'",
"action": "runAutomation",
"automation_id": "code:bulk-price-update-automation"
}
Vlastní panely [badge:Panels|info]
Sbalitelné panely, které rozšiřují rozhraní editoru
[try:/customPanels|Spravovat vlastní panely→|right]
Klíčové vlastnosti
- Zobrazují se v postranním panelu editoru vedle standardních panelů
- Sbalitelné s koordinovaným chováním rozbalení/sbalení
- Mohou zobrazovat vlastní obsah, data nebo ovládací prvky
- Podporují různé polohy (vlevo, vpravo, nahoře, dole)
- Mohou se zobrazovat v zobrazení seznamu, zobrazení detailu nebo v obou
- Podpora panelů nezávislých na datech s možností requiresData
- Respektují omezení sady změn a režimu jen pro čtení
Konfigurační pole
Základní vlastnosti
name— Název panelu zobrazený uživatelůmentityId— Cílová entita pro panelicon— Ikona zobrazená v záhlaví paneluposition— Umístění panelu (vlevo, vpravo, nahoře, dole)location— Kde zobrazit panel (seznam, detail, obojí)size— Velikost panelu (tiny, small, medium, large)
Obsah a chování
action— Typ akce: “openUrl” nebo “showHtml”body— Obsah HTML k zobrazení (pro akci showHtml)url— Cílová URL (pro akci openUrl)requiresData— Zda panel závisí na vybraných datechcondition— Volitelný výraz filtru pro zobrazení/skrytí panelu
Řízení viditelnosti
allowInChangeSet— Zobrazit panel, když je aktivní sada změnallowInReadOnly— Zobrazit panel v režimu jen pro čtení
Typy akcí
openUrl — Akce Otevřít URL
Otevře URL v prohlížeči s kontextovými informacemi z uživatelského rozhraní, stejně jako CustomButtons. To umožňuje externí integrace a dynamický obsah na základě aktuálního kontextu.
Podporuje stejné kontextové proměnné jako CustomButtons:
{user.id},{user.email}— Informace o aktuálním uživateli{selectedIds}— ID vybraných záznamů{entityId},{orgId}— Kontextové identifikátory
⚠️ Důležité: Požadavky na vkládání Iframe
Když je URL načtena v iframe v rámci aplikace, cílový server musí být správně nakonfigurován:
- `X-Frame-Options: ALLOW-FROM {HOSTNAME}` — Povolit vkládání z vašeho serveru
- `Content-Security-Policy: frame-ancestors 'self' {HOSTNAME}` — Moderní alternativa CSP
- HTTPS je vyžadováno, pokud nadřazená aplikace používá HTTPS (zásady smíšeného obsahu)
- Soubory cookie nemusí fungovat správně kvůli omezením SameSite v iframech mezi zdroji
showHtml — Akce Zobrazit HTML
Zobrazí obsah z pole body jako HTML v panelu. To umožňuje bohatý formátovaný obsah přímo v rozhraní.
Omezení HTML:
- Pro zabezpečení je podporována omezená podmnožina HTML
- JavaScript není povolen
- Externí značky skriptů a obslužné rutiny událostí jsou odfiltrovány
- Jsou podporovány bezpečné značky, jako jsou nadpisy, odstavce, seznamy a základní formátování
Příklad těla HTML:
<h3>Informace o produktu</h3><p>Další podrobnosti o tomto produktu...</p><ul><li>Funkce 1</li><li>Funkce 2</li></ul>
Závislosti dat
Vlastnost requiresData
Řídí, zda panel závisí na aktuálně vybraných datech. Pokud je nastaveno na false, panel lze zobrazit, i když nejsou vybrána žádná data, takže je nezávislý na aktuálním stavu výběru.
requiresData: true— Panel se zobrazí pouze v případě, že jsou vybrána data. Kontextové proměnné jako selectedIds budou k dispozici.requiresData: false— Panel se může zobrazit nezávisle. Užitečné pro text nápovědy, statické informace nebo globální akce.
Příklady konfigurací
Příklad akce ShowHtml:
{
"name": "Product Help",
"entityId": "products",
"icon": "HelpCircle",
"position": "right",
"location": "detail",
"size": "small",
"requiresData": false,
"allowInChangeSet": true,
"allowInReadOnly": true,
"action": "showHtml",
"body": "<h3>Product Guidelines</h3><p>Follow these steps when editing products...</p>"
}
Příklad akce OpenUrl:
{
"name": "Product Analytics",
"entityId": "products",
"icon": "BarChart",
"position": "right",
"location": "detail",
"size": "medium",
"requiresData": true,
"allowInChangeSet": true,
"allowInReadOnly": true,
"action": "openUrl",
"url": "https://analytics.company.com/product?id={selectedIds}&user={user.id}"
}
Řízení viditelnosti
Pochopení, kdy jsou úpravy zobrazeny nebo skryty
Stavy systému
Režim sady změn
Když je aktivní sada změn, jsou viditelné pouze úpravy s allowInChangeSet: true.
Režim jen pro čtení
Když je v režimu jen pro čtení, jsou viditelné pouze úpravy s allowInReadOnly: true.
Matice viditelnosti
| Režim | allowInChangeSet | allowInReadOnly | Viditelné |
|---|---|---|---|
| Normální | - | - | ✅ |
| Aktivní sada změn | true | - | ✅ |
| Aktivní sada změn | false | - | ❌ |
| Jen pro čtení | - | true | ✅ |
| Jen pro čtení | - | false | ❌ |
Aspekty vkládání Iframe
Důležité technické požadavky a omezení při vkládání externího obsahu
⚠️ Kritické požadavky na konfiguraci serveru
Externí adresy URL načtené ve vlastních panelech musí být speciálně navrženy pro vkládání iframe. Cílový server MUSÍ poskytovat správné hlavičky zabezpečení HTTP, aby bylo možné vkládání.
Požadované hlavičky HTTP
Kritické — Hlavička X-Frame-Options:
X-Frame-Options: ALLOW-FROM {HOSTNAME}
Použijte skutečnou doménu aplikace. Tato hlavička umožňuje vaší aplikaci vložit externí obsah do iframe.
Moderní alternativa — Zásady zabezpečení obsahu (CSP):
Content-Security-Policy: frame-ancestors 'self' {HOSTNAME}
Moderní prohlížeče preferují CSP před X-Frame-Options. Tato direktiva řídí, které domény mohou vkládat stránku do rámců. Nahraďte skutečnou doménou aplikace.
Doporučeno — Další hlavičky zabezpečení:
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Referrer-Policy: strict-origin-when-cross-origin
Další hlavičky zabezpečení, které zlepšují zabezpečení vloženého obsahu.
Běžné problémy a řešení s iframe
Smíšený obsah HTTPS
Problém: Prohlížeč blokuje obsah HTTP, když nadřazená stránka používá HTTPS
Řešení: Zajistěte, aby všechny externí adresy URL používaly protokol HTTPS. Moderní prohlížeče vyžadují zabezpečené připojení pro vkládání iframe.
✅ https://external-app.com/panel
❌ http://external-app.com/panel
Problémy se soubory cookie/relací
Problém: Ověřovací soubory cookie nefungují v iframech mezi zdroji
Řešení: Použijte SameSite=None; Secure pro soubory cookie, které musí fungovat v iframech, nebo implementujte ověřování na základě tokenů prostřednictvím parametrů URL.
Skripty pro rozbití rámce
Problém: Kód JavaScript zabraňuje vkládání iframe
Řešení: Odeberte nebo upravte skripty, které kontrolují window.top !== window.self nebo podobnou logiku pro rozbití rámce.
Responzivní design
Problém: Obsah se dobře nepřizpůsobuje omezením iframe
Řešení: Navrhněte rozvržení specifická pro iframe nebo použijte responzivní CSS, které dobře funguje v omezených prostorech. Zvažte nastavení velikosti panelu (tiny, small, medium, large).
Komunikace
Problém: Omezená komunikace mezi iframe a nadřazeným
Řešení: Použijte rozhraní API postMessage pro zabezpečenou komunikaci mezi zdroji, pokud vložený obsah potřebuje interagovat s nadřazenou aplikací.
Příklady konfigurace serveru
📝 Konfigurace domény — nahraďte {HOSTNAME} skutečnou doménou aplikace.
Apache (.htaccess):
Header always append X-Frame-Options "ALLOW-FROM {HOSTNAME}"
Header always set Content-Security-Policy "frame-ancestors 'self' {HOSTNAME}"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Nginx:
add_header X-Frame-Options "ALLOW-FROM {HOSTNAME}" always;
add_header Content-Security-Policy "frame-ancestors 'self' {HOSTNAME}" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
Node.js/Express:
app.use((req, res, next) => {
res.setHeader('X-Frame-Options', 'ALLOW-FROM {HOSTNAME}');
res.setHeader('Content-Security-Policy', "frame-ancestors 'self' {HOSTNAME}");
res.setHeader('X-Content-Type-Options', 'nosniff');
res.setHeader('X-XSS-Protection', '1; mode=block');
next();
});
💡 Testování kompatibility Iframe: Před nasazením otestujte externí adresu URL vytvořením jednoduchého souboru HTML s iframe odkazujícím na váš obsah. Otevřete jej v prohlížeči a zkontrolujte konzolu pro vývojáře, zda neobsahuje chyby související s rámcem.
Vlastní odkazy [badge:Links|info]
Odkazy na úrovni polí, které se zobrazují v polích editoru a otevírají externí aplikace s kontextovými daty
[try:/customLinks|Spravovat vlastní odkazy →|right]
K čemu jsou vlastní odkazy dobré?
Vlastní odkazy umožňují přidávat kontextové odkazy ke konkrétním polím v rozhraní editoru. Tyto odkazy mohou otevírat externí aplikace, prohledávat databáze nebo přecházet do souvisejících systémů, vše vyplněné daty z aktuálního záznamu.
- Přidejte odkazy přímo k popiskům polí, ikonám vedle vstupů nebo tlačítkům pod poli
- Otevřete externí aplikace s kontextem z aktuálního záznamu (např. jméno, ID, informace o uživateli)
- Odkazy jsou viditelné pouze v případě, že vybrané pole má hodnotu
- Podpora podmíněného zobrazení na základě výrazů filtru
- Respektujte omezení sady změn a režimu jen pro čtení
Běžné případy použití
🔗 Odkaz na systém CRM
Přidejte odkaz na pole jména zákazníka, který otevře záznam zákazníka ve vašem systému CRM.
🔍 Vyhledávání v databázi EAN
Přidejte odkaz na pole EAN pro vyhledání informací o produktu v externí databázi.
🛒 Otevřít v E-commerce
Přidejte odkaz pro zobrazení produktu v rozhraní vašeho e-commerce.
Pozice odkazů
Vlastní odkazy se mohou zobrazit ve třech různých pozicích vzhledem k poli:
Pozice popisku
Popisek pole se stane klikatelným odkazem. Po kliknutí se otevře externí URL. To je užitečné pro interaktivní celý popisek.
Pozice ikony
Malé tlačítko s ikonou se zobrazí za vstupním polem. Vedle sebe se může zobrazit více odkazů s ikonami. To je užitečné pro poskytnutí rychlého přístupu bez změny vzhledu pole.
Pozice pod
Odkaz se zobrazí jako malý textový odkaz pod vstupním polem. Více odkazů se může zalomit do více řádků. To je užitečné pro sekundární akce, které nepotřebují okamžitou viditelnost.
Konfigurační pole
Základní vlastnosti
name— Text odkazu zobrazený uživatelůmentityId— Cílová entita pro odkazcolumns— Pole ID polí, kde by se měl odkaz zobraziticon— Ikona zobrazená s odkazem (pro pozice ikony a pod)position— Kde zobrazit odkaz: “label”, “icon” nebo “under”
Konfigurace akce
action— Typ akce (aktuálně je podporováno pouze “openUrl”)url— Cílová šablona URL s proměnnými zástupnými symboly
Podmíněné zobrazení
condition— Volitelný výraz filtru pro zobrazení/skrytí odkazuallowInChangeSet— Zobrazit odkaz, když je aktivní sada změnallowInReadOnly— Zobrazit odkaz v režimu jen pro čtení
Proměnné šablony URL
URL může obsahovat zástupné symboly, které jsou nahrazeny skutečnými daty při kliknutí na odkaz:
Data záznamu
{data.fieldName}— Hodnota libovolného pole z aktuálního záznamu (např.{data.name},{data.ean}){objectIds}— ID aktuálního záznamu{entityId}— Identifikátor entity
Informace o uživateli
{user.id}— ID aktuálního uživatele{user.username}— Uživatelské jméno aktuálního uživatele{user.email}— E-mailová adresa aktuálního uživatele
Informace o systému
{language}— Kód aktuálního jazyka uživatelského rozhraní{orgId}— ID aktuální organizace
Příklad šablony URL:
https://crm.example.com/customer?name={data.name}&email={data.email}&lang={language}&user={user.username}
Pravidla viditelnosti
⚠️ Důležité: Požadavek na hodnotu pole
Vlastní odkazy jsou **viditelné pouze v případě, že přidružené pole má hodnotu**. Pokud je pole prázdné (null, undefined nebo prázdný řetězec), odkaz se nezobrazí, i když jsou splněny všechny ostatní podmínky.
Příklad podmíněného zobrazení
Můžete použít výrazy filtru k zobrazení odkazů pouze v případě, že jsou splněny konkrétní podmínky:
platform.code = 'shoptet'
Tento odkaz se zobrazí pouze v případě, že je produkt na platformě Shoptet.
Příklad konfigurace
Kompletní příklad vlastního odkazu:
{
"name": "View in CRM",
"entityId": "products",
"columns": ["name", "ean"],
"icon": "ExternalLink",
"position": "icon",
"action": "openUrl",
"url": "https://crm.example.com/product?ean={data.ean}&name={data.name}&user={user.email}",
"condition": "platform.code = 'shoptet' AND status = 'active'",
"allowInChangeSet": false,
"allowInReadOnly": true,
"disabled": false
}
Tento odkaz se zobrazí jako ikona vedle polí “name” a “ean”, když je produkt na platformě Shoptet, je aktivní a pole má hodnotu. Otevře CRM s EAN produktu, jménem a e-mailem aktuálního uživatele.
💡 Doporučené postupy
- Použijte pozici ikony pro často používané odkazy, aby bylo uživatelské rozhraní čisté
- Použijte pozici popisku, když je odkaz primární akcí pro dané pole
- Použijte pozici pod pro sekundární nebo méně běžné akce
- Udržujte názvy odkazů krátké a popisné
- Otestujte šablony URL s různými daty záznamů, abyste zajistili, že fungují správně
- Použijte podmínky k zobrazení odkazů pouze v případě, že jsou relevantní
- Zvažte použití `allowInReadOnly=true` pro odkazy jen pro zobrazení
Barvy sloupců [badge:Colours|success]
Podmíněné barvy pozadí pro buňky datové mřížky
[try:/columnColours|Spravovat vlastní barvy →|right]
Klíčové vlastnosti
- Aplikujte barvy pozadí na buňky datové mřížky na základě podmínek filtru
- Cílit na všechny sloupce nebo konkrétní sloupce v entitě
- Pro každou entitu lze definovat více barevných pravidel
- Vyhodnocováno v reálném čase při změně dat
- Skvělé pro vizuální zvýraznění důležitých dat (např. položky po splatnosti, úrovně zásob)
Konfigurační pole
Základní vlastnosti
name— Popisný název pro barevné pravidloentityId— Cílová entita pro barevné pravidlocolour— Barva pozadí (hex formát, např. #ff0000)description— Volitelný popis pravidla
Filtrování
filter— Podmínka podobná SQL, která určuje, kdy se má barva použít- Příklad:
status = 'overdue' AND priority = 'high'
- Příklad:
Cílení na sloupce
allColumns— Použít barvu na všechny sloupce v řádkucolumns— Pole konkrétních názvů sloupců, které se mají obarvit (pokud je allColumns false)- Příklad:
["price", "discount", "total"]
- Příklad:
Řízení
disabled— Dočasně zakázat barevné pravidlo bez jeho odstranění
Případy použití
Zvýraznění stavu
Zvýrazněte řádky na základě hodnot stavu. Například zobrazte úkoly po splatnosti červeně, dokončené úkoly zeleně a úkoly ve stavu zpracování žlutě.
Příklad konfigurace:
Entita: tasks
Filtr: status = 'overdue'
Barva: #ffcccc (světle červená)
Všechny sloupce: true
Upozornění na prahové hodnoty
Zvýrazněte konkrétní sloupce, když hodnoty překročí prahové hodnoty. Například zvýrazněte sloupec zásob červeně, když zásoby klesnou pod minimální úroveň.
Příklad konfigurace:
Entita: products
Filtr: stock < minimumStock
Barva: #ff6666 (červená)
Všechny sloupce: false
Sloupce: ["stock"]
Vizualizace priority
Použijte různé barvy pro různé úrovně priority, abyste uživatelům pomohli rychle identifikovat položky s vysokou prioritou ve velkých datových sadách.
Příklad konfigurace:
Entita: orders
Filtr: priority = 'urgent'
Barva: #ffe6e6 (světle červená)
Všechny sloupce: true
Finanční ukazatele
Zvýrazněte finanční data na základě podmínek, jako jsou záporné zůstatky, nezaplacené platby nebo ziskové marže pod cílovými hodnotami.
Příklad konfigurace:
Entita: invoices
Filtr: balance < 0
Barva: #fff3cd (světle žlutá)
Všechny sloupce: false
Sloupce: ["balance", "status"]
Chování a priorita
Pořadí vyhodnocování
Barevná pravidla sloupců jsou vyhodnocována pro každý řádek v mřížce. Pokud více pravidel odpovídá řádku, použije se poslední odpovídající pravidlo (v pořadí, v jakém se zobrazují v databázi).
Aspekty výkonu
Barvy sloupců jsou vyhodnocovány v reálném čase při změně dat. Udržujte výrazy filtru jednoduché a efektivní pro nejlepší výkon, zejména u velkých datových sad.
Zakázaná pravidla
Použijte pole disabled k dočasnému vypnutí barevných pravidel bez jejich odstranění. To je užitečné pro testování nebo sezónní úpravy.
💡 Doporučené postupy
- Používejte jemné barvy, které nezasahují do čitelnosti textu
- Omezte počet barevných pravidel na entitu, abyste se vyhnuli vizuálnímu nepořádku
- Otestujte barevné kombinace pro přístupnost (poměry kontrastu)
- Dejte pravidlům popisné názvy, abyste je mohli později udržovat
- Zvažte preference uživatelů - někteří uživatelé mohou být barvoslepí
Poznámky k implementaci
Výkon
Úpravy jsou načítány a filtrovány efektivně pomocí React hooks se správnou správou závislostí a atomickými aktualizacemi stavu, aby se zabránilo blikání uživatelského rozhraní.
Zabezpečení
Všechny úpravy respektují základní systém oprávnění a řízení přístupu k entitám. Uživatelé mohou vidět a interagovat pouze s úpravami pro entity, ke kterým mají přístup.