Pravidla pro JavaScript

Veškerý klientský JavaScript se píše v TypeScriptu v assets/account/js/src/. Před psaním nového kódu vždy zkontroluj, zda už neexistuje řešení v libs/ nebo components/.

Nepoužívej nativní API přímo (fetch, XMLHttpRequest, document.cookie, localStorage, sessionStorage). Vždy používej frameworkové wrappery z libs/ — zajišťují konzistentní chování, error handling a retry logiku.
AJAX voláníVždy přes Account.HttpClient, nikdy nativní fetch/XMLHttpRequest
CookiesVždy přes Account.Cookie, nikdy document.cookie
LocalStorageVždy přes Account.LocalStorage, nikdy nativní localStorage
SessionStorageVždy přes Account.SessionStorage, nikdy nativní sessionStorage
UI komponentyProjdi components/ než budeš psát vlastní (Modal, Select, DateTimePicker, TabCard, ...)

HttpClient

Account.HttpClient — wrapper nad jQuery AJAX s automatickým retry, timeoutem a global loaderem.

getAsync(url, globalLoader?, preventCloseLoader?)GET požadavek. Vrátí Promise<HttpResponse>.
postAsync(url, data, globalLoader?, preventCloseLoader?)POST požadavek. Data se odešlou jako FormData.
setTimeout(ms)Nastaví timeout (výchozí 5000ms)
setRetry(count)Počet opakování při selhání (výchozí 3)

HttpResponse

isSuccessStatusCodebool — HTTP 200–299
statusCodeHTTP status kód
content.readAsString()Vrátí odpověď jako string
content.readAsJson()Parsuje a vrátí JSON objekt
content.isJson()Vrátí true pokud je odpověď validní JSON
// GET
let httpClient = new Account.HttpClient();
let response = await httpClient.getAsync('/api/users', false); // false = bez global loaderu

if(response.isSuccessStatusCode) {
    let data = response.content.readAsJson();
}

// POST
let response = await httpClient.postAsync('/api/users', {
    name: 'Denis',
    email: 'denis@example.com'
});

// Vlastní timeout a retry
httpClient.setTimeout(10000);
httpClient.setRetry(5);
Parametr globalLoader (výchozí true) zobrazí/skryje fullscreen page loader automaticky. Pro AJAX v komponentách (TabCard, Submenu) se většinou nastaví na false.

Cookie

Account.Cookie — práce s cookies na klientu.

Cookie.get(name)Vrátí hodnotu cookie nebo null
Cookie.set(name, value, options?)Nastaví cookie
Cookie.delete(name, options?)Smaže cookie

Options

expiresPočet dní (desetinné číslo: 0.5 = 12 hodin)
pathVýchozí '/'
domainDoména cookie
securePouze přes HTTPS
sameSite'Strict' | 'Lax' | 'None'
// Nastavení na 7 dní
Account.Cookie.set('theme', 'dark', {expires: 7});

// Čtení
let theme = Account.Cookie.get('theme'); // 'dark' nebo null

// Smazání
Account.Cookie.delete('theme');

LocalStorage & SessionStorage

Wrappery nad nativním Web Storage API. Konzistentní API pro oba typy.

LocalStorage.get(key) / SessionStorage.get(key)Vrátí string nebo null
LocalStorage.set(key, value) / SessionStorage.set(key, value)Uloží string
LocalStorage.delete(key) / SessionStorage.delete(key)Smaže klíč
// LocalStorage — přetrvá i po zavření prohlížeče
Account.LocalStorage.set('settings', JSON.stringify({theme: 'dark'}));
let settings = JSON.parse(Account.LocalStorage.get('settings'));

// SessionStorage — jen pro aktuální session (záložku)
Account.SessionStorage.set('tempFilter', 'active');
let filter = Account.SessionStorage.get('tempFilter');
LocalStorageData přetrvají i po zavření prohlížeče. Pro uživatelské preference, nastavení.
SessionStorageData jen po dobu otevřené záložky. Pro dočasné filtry, stav formuláře.

UI Komponenty

Přehled všech dostupných komponent v components/. Před tvorbou nového UI prvku vždy zkontroluj tento seznam.

ModalModální okno — open, close, openFromUrl, setContent. Velikosti 300–900.
OffcanvasBoční panel zleva/zprava. 400px desktop, 100% mobil.
DropdownRozbalovací menu s pozicováním a offset podporou.
SelectCustom select s optgroup, divider, disabled, ikonami v options.
DateTimePickerDatepicker, datetimepicker, timepicker s konfigurovatelnými texty.
DateRangePickerVýběr rozsahu datumů s vizuálním zvýrazněním range.
RadioButtonHorizontální (+ small) a vertikální radio group.
TabCardZáložkový panel s AJAX načítáním, stránkováním, hash navigací.
SubmenuAJAX navigace mezi záložkami stránky s pushState.
Ukázky a detailní dokumentace všech komponent jsou na stránce UI Elements.