Nový způsob načítání veškerého obsahu
- Při načítání obsahu je nyní vždy zobrazeno velké točící se kolečko, jasně indikující, že se něco děje.
- Načítání obsahu vylepšeno tak, aby byly načítány a překreslovány pouze nezbytně nutné části aplikace, jejichž obsah se skutečně mění. Toto znamená jednak efektivnější načítání obsahu a také zpříjemnění používání aplikace, jelikož například postranní menu zůstává staticky na svém místě při přechodu mezi záložkami.
- Vylepšena funkcionalita ZPĚT/VPŘED v prohlížeči; do historie prohlížeče se již neukládají irelevantní záznamy, například při řazení a filtrování dat.
- Vylepšeno zobrazení notifikačních hlášek, aby poslední hláška nevyskakovala opakovaně při každém přechodu mezi stránkami.
- Zabráněna interakce s formulářem po jeho odeslání, zejména aby nebylo možné formulář odeslat omylem dvakrát.
Obecná vylepšení
- Ikona pro zobrazení notifikací změněna na intuitivnější zvoneček a obarvena oranžově.
- Modernizován výběr datumu/času ve formuláři.
- Nový vzhled, snadnější výběr časových prvků.
- Hodnotu lze smazat buďto pomocí klávesy delete/backspace nebo pomocí nového tlačítka ❌ přímo v poli.
- Zlepšena čitelnost chybových hlášek formuláře na tmavém pozadí:
- Font zvětšen.
- Červená barva zesvětlena.
- Přidáno černé ostínování pro vylepšení kontrastu.
- Ikona člověka vedle jména uživatele nyní funguje jako rychlý odkaz do Nastavení.
- Typ agregace se nyní vypisuje s dvojtečkou a před prefixem hodnoty.
- Horní lišta modálních dialogů je nyní ukotvena a vždy viditelná při scrollování.
- Podmíněné formátování lze nyní definovat pouze podle viditelných sloupců, výběr parametru je tímto mnohem přehlednější.
Optimalizace výkonu
- Optimalizace načítání unikátních hodnot pro filtry nad stránkou, zejména pro stránky s větším objemem dat a stránkováním.
- Optimalizace načítání stránek využívajících cache dat (odebrána kontrola struktury dle metadat db).
- Optimalizace procházení řádků dat na stránkách typu
table
. - Optimalizace vyhodnocování „textu po prokliku“.
- Optimalizace vyhodnocování závislých výběrových seznamů ve formuláři.
- Implementován cache nastavených oprávnění.
Opravy
- Sufixy pro metr čtvereční/krychlový jsou nyní zobrazeny korektně jako m² a m³, s číslem na horním indexu.
- Oprava nadbytečné mezery u prefixu i sufixu.
- Oprava chybně zobrazeného nadpisu formuláře hromadné akce, kdy byl zobrazen název menu namísto názvu formuláře.
- Oprava filtrování speciálních znaků %_
- Oprava chyby, kdy po přihlášení selhal pokus o vrácení uživatele na poslední zobrazenou stránku.
- Oprava chyby, kdy formulář mohl vyžadovat od uživatele potvrzení dříve, než byl skutečně připraven k odeslání (chybějící povinné hodnoty).
- Oprava rozbitého stránkování, pokud je na sloupci s agregačním výpočtem počtu řádků aktivní odsazení tisíců.
- Uživatel mající neplatnou roli oprávnění je nyní automaticky odhlášen. Může nastat například z důvodu zrušení role.
- Oprava chyby, kdy při přenačtení stránky nebyly u vícenásobných filtrů nad sloupci typu množina hodnot přednastaveny hodnoty dle aktivního vyfiltrování.
- Oprava zobrazení a filtrování množin hodnot obsahujících mezery/uvozovky.
Administrační rozhraní
Rozbalit/zabalit seznam změn relevantní pro administrátory
Skupiny sloupců nad tabulkou
Již dlouho žádaná funkcionalita vizuálního seskupení sloupců je tu!
V administraci stránky lze nově použít tlačítko „Vytvořit skupinu sloupců“ a pomocí zobrazeného formuláře nadefinovat novou skupinu složenou ze zvolených sloupců. Ve formuláři lze dále určit, zdá má být daná skupina v počátečním stavu načtení stránky viditelná (výchozí), či srolovaná.
- Stránka může mít libovolný počet skupin sloupců, sloupce v rámci skupiny však musí jít za sebou v pořadí a jeden sloupec nemůže být součástí více skupin najednou. Pokud sloupce skupiny nejdou v pořadí za sebou, skupina se bude zobrazovat nepředvídatelně.
- Součástí skupiny mohou být pouze viditelné sloupce. Pokud momentální uživatel nemá oprávnění na některé či všechny sloupce skupiny, toto je ve výsledném zobrazení zohledněno.
- Skupina sloupců se vizuálně zobrazuje stejně v administraci i mimo administraci, akorát administrační zobrazení poskytuje navíc tlačítka pro možnost úpravy/smazání skupiny.
- Skupiny sloupců jsou podporovány i na stránce typu detail, avšak momentálně mají význam pouze pro typ widgetu
one-to-many
. Skupiny se zde vytvářejí z lišty nástrojů konkrétního widgetu a nabízeny jsou pouze viditelné sloupce daného widgetu. Pokud je součástí skupiny sloupec použitý napříč v několika widgetechone-to-many
, skupina se nemusí zobrazovat správně. - Každá skupina sloupců může být uživatelem skryta (pomocí tlačítka minus vpravo nahoře), nebo naopak rozbalena (pomocí tlačítka plus). Skrytá skupina je vždy nahrazena jedním zástupným sloupcem s rozbalovacím tlačítkem plus v hlavičce tabulky.
- Při kopírování stránky jsou přenášeny i zadefinované skupiny sloupců.
- Změny nastavení skupiny sloupců podléhají synchronizaci SLAVE/MASTER (nová synchronizovaná systémová tabulka
sys_column_group
). - Funkcionalita vyvinuta s ohledem na podporu všech moderních prohlížečů (Chrome, Firefox, Edge).
Správa uživatelů
Uživatele systému bylo dosud nutné spravovat buď úplně ručně v databázi, nebo pomocí vlastnoručně vyrobených stránek. Nyní však UNIS nabízí zabudované rozhraní pro správu uživatelů, které mohou využít administrátoři systému i správci aplikace.
- Správa uživatelů je přístupná přes ozubené kolečko, v sekci Ostatní.
- Administrátoři (uživatelé „s admin lištou“) mají ke správě uživatelů vždy plný přístup. V samotné správě uživatelů může administrátor tlačítkem „Oprávnění pro správu uživatelů“ určit, které role mohou uživatele do jaké míry spravovat (klasika čtení/zápis/nový záznam/mazání). Rozdíl oproti ostatním oprávněním je, že ve výchozím stavu nemůže krom administrátora nikdo spravovat uživatele nijak.
- V seznamu uživatelů jsou zobrazeny všechny sloupce, které UNIS obecně u uživatelů rozeznává. Dále zde lze vidět výpis skupin uživatele, výpis rolí nabytých dle skupin uživatele a nakonec výpis přímo přiřazených rolí uživatele. Administrátor má navíc možnost prokliknout se do detailního výpisu kterékoli skupiny/role, dále také možnost přihlásit se za kteréhokoli uživatele a možnost přejít na výpis událostí vyvolaných daným uživatelem.
- Seznam uživatelů je řazen dle příjmení vzestupně, avšak neautorizovaní uživatelé jsou zařazeni až na konec za všechny ostatní.
- Formulář pro přidávání a editaci uživatelů je nutno sestavit klasickým způsobem a následně v sekci Nastavení určit jakožto „Formulář uživatelů“.
- V tomto formuláři není nutno složitě řešit přiřazování rolí a skupin, jelikož pro tyto účely je ve správě uživatelů vyčleněno zvlášť tlačítko vedoucí na zabudovaný formulář UNISu.
- Pro správnou funkčnost musí mít formulář nastaven jako primární klíč ID uživatele.
- Nastavením možnosti „Formulář uživatelů“ je zároveň aktivována funkcionalita uživatelského profilu. Tento formulář se stane „profilem“ uživatele a každému se zobrazí v jeho Nastavení.
- Profil respektuje nastavená oprávnění zdrojového formuláře. Pokud uživatel nemá právo
read
na daný formulář, profil se mu vůbec nezobrazí. Pokud uživatel nemá právowrite
na daný formulář, zobrazí se celý formulář jako read-only.
- Profil respektuje nastavená oprávnění zdrojového formuláře. Pokud uživatel nemá právo
Přepracování formuláře editace & přidání sloupce
Formulář editace sloupce se s neustále nabývajícím počtem možných nastavení stal nepřehledný, těžce navigovatelný i pro zkušeného administrátora. V nové verzi se však podařilo situaci elegantně vyřešit pomocí dynamického zobrazovaní relevantních možností v závislosti na zvolených hodnotách, přeskupením některých částí formuláře a skrytím „pokročilých“ možností v počátečním zobrazení formuláře.
- Mnohé prvky se nyní zobrazí pouze v závislosti na dříve zvolených hodnotách; například počet desetinných míst a odsazení tisíců se zobrazí pouze pro sloupce číselného datového typu.
- Výběr datového typu přesunut do první sekce formuláře, jelikož přítomnost mnoha dalších prvků závisí na jeho hodnotě.
- Nastavení prefixu & sufixu též přesunuto do první sekce. Původní sekce „Typ sloupce“ nyní obsahuje výhradně prvky, jejichž přítomnost závisí na zvoleném typu sloupce. Pro databázové sloupce je tato sekce zcela zrušena, pro všechny ostatní nyní nabízí možnost změnit typ dodatečně (pouze na jiný než databázový).
- Na MySQL aplikacích se již nenabízí nepodporovaný typ „Tagy“.
- Celkem 23 možností napříč sekcemi formuláře je nyní považováno za „pokročilé možnosti“. Tyto možnosti nejsou ve výchozím stavu nikdy zobrazeny, aby nepřekážely při rutinních administračních úpravách. Pro jejich zobrazení lze využít nové zaškrtávátko „Zobrazit pokročilé možnosti“ v pravé dolní části formuláře.
- Patička formuláře s odesílacím tlačítkem Uložit a s novým zaškrtávátkem je nyní ukotvena a zůstává při scrollování formuláře vždy zobrazena.
- Možnosti „Výška náhledového obrázku v px“, „Zaokrouhlení“ a „Priorita výchozího řazení“ nyní umožňují zadat pouze číselnou hodnotu.
- Formulář přidání sloupce je nyní stejný jako formulář editace sloupce. „Přidávání“, respektive zobrazování databázových sloupců tímto formulářem není nadále povoleno (doporučuje se provádět v administraci zdrojů dat pomocí „očíčka“).
- Dynamicky skryté/zobrazené prvky obecně jsou nyní krátce animovány.
Zjednodušené nastavení filtru na sloupci
- Úpravy databázové struktury:
- Zrušen atribut slave_sys_data_source_column.
filter
(none/condition/predefined)- Aktivní/neaktivní filtr nyní rozeznán podle nastaveného atributu
filter_controler
- „Vlastní filtr“ (predefined) rozeznán podle nastaveného atributu
filter_id
- Aktivní/neaktivní filtr nyní rozeznán podle nastaveného atributu
- Zrušen nepoužívaný atribut
filter_type
- Atributy
filter_controler
,filtered_column
afilter_id
nyní nabývají hodnoty NULL namísto specifických „prázdných“ hodnot0
/none
- Zrušen atribut slave_sys_data_source_column.
- Ve formuláři nastavení sloupce v sekci filtru:
- Odstraněna položka „Filtr“
- „Ovládací prvek“ přesunut na první místo, přejmenován na „Typ filtru“ a jako prompt nastaveno „– žádný –„
- „Defaultní hodnota“ přejmenováno na „Výchozí hodnota“ a přesunuto na druhé místo
- „Podle sloupce“ přejmenováno na „Filtr aplikovat na“
- „Vlastní filtr“ přejmenováno na „Dotaz pro filtr“ a jako prompt nastaveno „– dynamický–„
Nedatabázové formulářové prvky
Podobně jako SQL/math dynamické sloupce se hodí možnost vytvářet vlastní extra formulářové prvky pro následné zpracování formulářovými skripty.
- Vlastní formulářové prvky lze nyní vytvářet tlačítkem
Přidat vlastní formulářový prvek
v administraci formuláře. Oproti klasickým databázovým prvkům je nutno zadat interní název prvku, kterým bude nově vytvořený prvek identifikován v rámci skriptů (musí být alfanumerický unikátní název v rámci celého formuláře – včetně databázových prvků). - Vlastní formulářové prvky mohou mít dále zadefinovaný SQL dotaz určený pro dynamické vytažení vlastní hodnoty společně s hodnotami ostatních databázových prvků, typicky například při editaci. Dotaz funguje velmi podobně jako u SQL sloupců na stránkách – lze do něj předat hodnoty ostatních prvků jako argumenty. V administraci zdrojů dat je následně viditelné sestavené SQL včetně logiky těchto vlastních prvků, opět podobně jako u SQL sloupců.
- Při ukládání hodnot formuláře zabudovanou funkcí
save
jsou hodnoty vlastních formulářových prvků vždy ignorovány. Případná implementace jejich uložení závisí čistě na logice uvnitř callbacku formuláře. - Vícenásobný výběrový seznam (multiselect) nyní dokáže automaticky rozparsovat pole hodnot předané ve formátu JSON array nebo PostgreSQL array přímo do jeho aktuální hodnoty (tj.
setDefaultValue
…).
Přepracování komponenty kalendáře
Stránka typu kalendář doposud nebyla příliš využívána, jelikož nabízela pouze velmi základní funkcionalitu prohlížení dat v kalendářovém zobrazení. Nyní však přichází velký balík změn, díky kterému se kalendář stává mnohem mocnějším nástrojem:
- Vzhledově vylepšeno rozhraní kalendáře, používaná knihovna FullCalendar aktualizována na nejnovější verzi (2.0.1 -> 5.9.0).
- Přidána funkcionalita přidávání a editace dat v kalendáři, fungující na bázi klasických insert/update akcí. Přidávat lze buď tlačítkem přidat, nebo tažením přímo v kalendáři, přičemž určení formulářových polí pro předání datum/času je prováděno automaticky dle souhlasného názvu formulářového pole se sloupcem kalendáře.
- Data jsou nyní dynamicky načítána pro zobrazený rozsah kalendáře, namísto všechna najednou.
- Kalendář nově může být vytvořen také jako widget na stránce typu detail (karta). Podporováno je i několik widgetů s různými kalendáři najednou.
- Přidáno tlačítko pro občerstvení dat v právě viditelném rozsahu kalendáře.
- Víkendy podbarveny červeně.
- Ukotvena hlavička s výpisem dnů aktuálního rozsahu.
- Celodenní události jsou nyní automaticky detekovány dle začátku a konce o půlnoci.
- Zvětšena velikost písma uvnitř kalendáře o 20%.
- Popisky událostí v kalendáři jsou nyní vypisovány celé při najetí myší, aby bylo možné zobrazit osekaný text dlouhých popisků.
- Výchozí podbarvení událostí kalendáře změněno na oranžové. Přidáno tmavé ohraničení jednotlivých prvků.
- V zobrazení stylem „Agenda“ přesunuty názvy dnů zprava doleva.
- Implementovány součty hodin:
- Zabudováno do kalendáře jako přirozená funkcionalita UNISu. Nijak se nenastavuje.
- Funkcionalita součtu celkových hodin je implementována pouze pro zobrazení kalendáře jednoho týdne a nebo jednoho dne.
- Součet hodin je zobrazován vlevo nahoře v první buňce tabulky kalendáře.
- Celodenní události se do součtu hodin nezapočítávají.
- Konečný součet hodin je zaokrouhlen na jedno desetinné místo.
Log událostí
- Jednotlivé stavy události nyní nezakládají v databázi separátní záznamy. Událost s daným ID tedy nyní začne ve stavu
attempt
a následně je aktualizována na výsledný stav pod stejným ID události.- Události nyní evidují časově zahájení i ukončení události. Nově mají také možnost evidovat progress zpracování úlohy.
- Rozhraní logu událostí nyní zobrazuje události jakéhokoli stavu.
- Rozhraní logu událostí:
- Odstraněn nadbytečný string Safari ze zkráceného zobrazení User Agent.
- Odstraněn sloupec ID.
- Typ a podtyp události sloučen do jednoho sloupce, rozlišeno tučným písmem a odděleno pomlčkou.
- Oprava řádkování ve sloupci poznámek. Zmenšena šířka sloupce poznámek.
- ID související akce je nyní ukládáno zvlášť do nového sloupce
action_id
, namísto nasypání do poznámek.- Ve sloupci Událost se nyní jako title zobrazuje název provedené akce (u událostí majících
action_id
). - Hodnoty do sloupce
action_id
jsou zpětně namigrovány. - V administračním toolbaru relevantních akcí je nyní k dispozici proklik s ikonkou kalendáře, vedoucí do logu událostí dané akce.
- Ve sloupci Událost se nyní jako title zobrazuje název provedené akce (u událostí majících
- Událost nově může evidovat jí nadřazenou jinou událost. Do nadřazené události se lze prokliknout pomocí šipky vedle sloupce Stav.
Nový způsob přihlašování přes SSO
Implementován nový způsob přihlašování pomocí SSO (single-sign-on) skrze externí službu. Nabízí značnou míru konfigurace v nové sekci auth.sso:
auth: sso: isEnforced: false # when true, all users are always redirected to SSO for authentication transferDescription: 'Pro přihlášení přes SSO klikněte zde.' # transfer url text transferLogoUrl: 'https://sso.rsd.cz/images/rsd/rsd_logo.png' # optional logo to display next to transferDescription transferUrl: 'https://sso.rsd.cz/saml/TransferService/' # url where user should be directed to log into SSO transferParameters: # key/value array of parameters sent to transferUrl TARGET: https://gisa.rsd.cz receivedTokenName: 'SAMLart' # name of received parameter which contains user token on successful login authenticationUrl: https://sso.rsd.cz/JSONserver/ # url where user token should be verified authenticationTokenName: AssertionArtifact # name of outgoing parameter containing token to verify errorMessageLocalUserNotFound: 'SSO uživatel není v aplikaci evidován. Kontaktujte správce aplikace pro přidělení přístupu.' # error message displayed when no matching local user is found upon successful SSO authentication userDataKey: User # json key containing user data userDataMapping: # foreign user data attributes mapped to local attributes UserID: %users.ssoUserId% Email: %users.email% FirstName: %users.name% LastName: %users.surname% Mobile: %users.phone%
Do konfigurační sekce users
přidány klíče email
a phone
pro nastavení sloupců emailu/telefonu. UNIS nyní rozeznává/vyžaduje správné nastavení obou těchto sloupců a jejich prezenci v tabulce uživatelů. Dále přidán klíč ssoUserId
pro nastavení sloupce se vzdáleným ID uživatele z SSO. Tento sloupec je vyžadován pouze pokud daná instance využívá SSO.
SSO uživatel je párován s lokálním uživatelem dle souhlasícího vzdáleného ID, případně podle souhlasící emailové adresy.
Pokud má uživatel ve sloupci auth_type
zadán typ SSO
, může být přihlášen výhradně skrze SSO. Jinak může být přihlášen i napřímo.
Po dobu platnosti session se k přihlášenému uživateli chováme stejně jako doposud. Autorizace nadále probíhá přes role/skupiny UNISu.
Obecná vylepšení
- Vylepšeno výchozí nastavení sloupců dle datového typu z databáze:
- U formulářů nastaven prvek checkbox pro databázový typ
tinyint
.
U ostatních stránek: - Detekován a nastaven datový typ množina hodnot & datum.
- Detekován boolean/tinyint a nastaveno:
- zobrazení bool ano/ne
- zarovnání doprostřed
- filtr výběrový seznam
- Detekováno celé/desetinné číslo a nastaveno:
- datový typ číselný
- zarovnání doprava
- odsazení tisíců
- U formulářů nastaven prvek checkbox pro databázový typ
- V horní části administrace sloupců přidáno tlačítko „Kopírovat formátování“, poskytující novou možnost jak snadno kopírovat nastavené formátování sloupce. Při kopírování je administrátorovi nabídnut formulář pro určení zdrojového sloupce, cílových sloupců pro nakopírování a dále také možnosti zvolit zda zahrnout nastavení agregace a typ filtru (výchozí je ano).
- Umožněno soužití widgetů závislých na hlavním filtru stránky společně s widgety které na hlavním filtru vůbec nezávisí a používají vlastní zcela oddělené zdroje dat. Parametry předávané z hlavního filtru (respektive obecně z prokliku) se chytře projeví pouze na platných widgetech, které je dokáží vyhodnotit.
- Na každý widget jsou nyní aplikovány pouze pro něj platné parametry; tzn. pouze parametry nad sloupci, které daný widget obsahuje.
- Vylepšení UX administrace stránky typu detail (karta):
- Přidány tlusté přerušované oddělovací čáry mezi jednotlivými samostatnými widgety.
- Vrchní navigace/toolbar přeskládán na konzistentní pořadí oproti administraci ostatních typů stránek.
- Přidána tlačítka pro snadný proklik do administrace práv stránky a parametrů stránky (zároveň přidáno i do administrace ostatních typů stránek).
- Tlačítko „Nastavení sloupců“ přejmenováno na „Zobrazené sloupce“ a jeho ikona změněna na oko.
- Typ sloupce a datový typ sloupce je nyní vypisován podobně jako v administraci sloupců na stránce typu table.
- Implementován nový typ akce „Kopírování záznamů“ fungující podobně jako hromadné kopírování, avšak zobrazuje se v řádku vedle editace a vždy kopíruje dle jednoho konkrétního záznamu. Vhodné pro případy, kdy kopírování několika záznamů najednou není žádoucí/přípustné.
- V nastavení sloupce do sekce „Odkaz na další stránku“ přidána zaškrtávací možnost „Modální dialog“. Tímto způsobem lze vyvolat modální formulář, podobně jako u akcí. Výchozí stav je zde false – nezaškrtnuto. Tato možnost nastavení sloupce je považována za pokročilou (význam popsán v sekci Přepracování formuláře editace & přidání sloupce).
- Umožněno vypnout/zapnout zobrazení promptu na výběrových seznamech ve formuláři.
- Do nastavení formulářového prvku přidána možnost „Rozlišit nezvolenou hodnotu (pro výběrový seznam umožní nevybrat hodnotu)“.
- Výchozí stav je TRUE, avšak zpětně je u existujících prvků využívajících enum nastaveno na FALSE.
- Možnost se momentálně zobrazuje pouze u prvků typu výběrový seznam, na ostatní typy nemá vliv.
- Přidána podpora generovaných databázových sloupců v datovém formuláři; UNIS se již nepokouší vkládat hodnoty do sloupců automaticky generovaných na straně databáze.
- Přidána základní podpora geometrie:
- Přidán datový typ sloupce Geometrie.
- Do formulářového prvku přidán boolean atribut Geometrie.
- Při natažení struktury zdroje dat je geometrie detekována a typ sloupce / atribut formulářového prvku je nastaven automaticky.
- Na MySQL jsou geometrické hodnoty automaticky převáděny do čitelného formátu WKT.
- Často potřebné sufixy m² a m³ přidány do příkladného textu, aby je šlo snadno překopírovat.
- Sloupce v administraci zdrojů dat jsou nyní řazeny vzestupně podle ID, namísto náhodně.
- Výběrový seznam uživatelů je nyní řazen podle přijmení.
- Ve výpisu uložených SQL dotazů je nyní řádkován dotaz i jeho popis.
- Pro sloupce obsahující množinu hodnot lze nyní nastavit proklik. Při použití samotného sloupce s množinou jakožto zdroje relace je odeslána vždy konkrétní hodnota z množiny, na kterou bylo uživatelem kliknuto.
- Pokud položky načtené z databáze do datového formuláře (typicky při editaci) již nejsou z části či vůbec platné pro daný multiselect, aplikace nespadne a místo toho:
- Nastaví do multiselectu pouze platné položky obsažené v aktuálně nabízeném seznamu, ostatní neplatné zahodí.
- Zobrazí uživateli informativní hlášku u takovýchto multiselectů, ve znění: „Neplatné zvolené položky byly odstraněny.“.
- Globální proměnné z výchozích hodnot filtrů jsou nyní vyhodnoceny před jejich dosazením do filtru, uživateli se tedy zobrazí jako čitelná hodnota. Toto se netýká referencí na uložené SQL dotazy.
- Nestandardní proměnné
%VAR()
ve výchozí hodnotě filtru jsou zrušeny a nahrazeny globálními proměnnými následovně:- Namísto
%VAR(USERID)
lze použít standardní%user
%VAR(USERNAME)
zrušeno bez náhrady (není nikde použito)- Namísto
%VAR(GROUP)
lze použít standardní%groupName
(nedoporučuje se ale používat vůbec) - Namísto
%VAR(GROUPID)
lze použít standardní%groupId
(nedoporučuje se ale používat vůbec) - Namísto
%VAR(YEAR)
lze použít standardní%currentYear
(přidáno nově) - Namísto
%VAR(MONTH)
lze použít standardní%currentMonth
(přidáno nově) - Namísto
%VAR(DAY)
lze použít standardní%currentDay
(přidáno nově) - Dále navíc přidáno
%currentDate
(vypíše datum ve formátuY-m-d
) a%currentDateTime
(vypíše datum ve formátuY-m-d H:i:s
)
- Namísto
- Dosavadní použití
%VAR()
budou automaticky zmigrovány.
- Nestandardní proměnné
- V administraci zdrojů dat formuláře lze nyní překliknout u kteréhokoli prvku zda je nebo není primárním klíčem. Zejména užitečné pokud je formulář postaven na pohledu a tím pádem UNIS nedokáže primární klíč určit automaticky.
- Pozor, při spuštění aktualizace zdroje dat je i nadále vždy použita automatická detekce, která přepíše jakékoli předchozí nastavení.
- Do sekce Databáze & Server vpravo nahoře přidán odkaz pro zobrazení phpinfo – detailní informace o aktuálně používaném php na serveru, užitečné zejména pro vývojáře.
- Zrušeno nastavení
action_text
(„Text akce„) u sloupce. Toto nastavení jen zbytečně duplikovalo funkcionalitu, která může být zahrnuta do jiných nastavení.- Existující hodnoty přemigrovány jakožto
hint_record
(„Popisek na řádcích dat“) a/nebopattern
(„Vzorec“). - Název souboru vygenerovaného ze XLSX šablony se nyní řídí podle
hint_record
, případně fallbackem podlehint_column
(„Popisek na záhlaví „). - Efekt popisku přímo na ikoně zrušen, jelikož způsoboval konflikt/zdvojení popisku při použití
hint_record
.
- Existující hodnoty přemigrovány jakožto
- Zrušeno nastavení
computation_position
(„Pozice„) u agregačního výpočtu sloupce.- Nastavení dolní pozice agregačního výpočtu nefungovalo správně a všude v aplikacích je stejně použita horní pozice. Díky ukotvení hlavičky datové tabulky toto nastavení v podstatě ztratilo význam.
- Ze seznamu stránek se lze nově prokliknout do parametrů stránek typu Kalendář, Harmonogram a Detail.
- Při změně UNIS verze je nyní automaticky vyčištěn cache Nette.
Opravy
- Zapnutí/vypnutí módu vývojáře se nyní projeví bez potřeby opětovně přenačíst stránku. Ostatní otevřené záložky aplikace je však nutno přenačíst, jinak na nich jakékoli další požadavky skončí chybou.
- Oprava odesílání „textu po prokliku“ ze sloupců i akcí na stránce typu
detail
. - Widget one-to-one nyní reaguje na nastavené zarovnání sloupce, dosud zůstával zarovnaný vždy doleva bez ohledu na nastavení.
- Tlačítko „Jako nový“ se nyní zobrazuje jedině při editaci a navíc vyžaduje právo insert na daném formuláři.
- Vícenásobný výběrový seznam (multiselect) již neztrácí dříve zvolené hodnoty při vyhodnocení závislostí.
- Při zobrazení editoru formátovaného textu (tinyMCE) jako readonly je nyní správně vyhodnoceno HTML, namísto zobrazení HTML značek uživateli.
- Datový formulář nyní dokáže zpracovat skrytý/readonly vícenásobný výběrový seznam (multiselect).
- Datový formulář nyní dokáže zpracovat skrytý/readonly boolean na PostgreSQL.
- Oprava chyby, kdy proklik do uživatelského nastavení momentální stránky někdy zobrazil nastavení jiné stránky.
- Výchozí hodnoty vypnutých filtrů nad sloupcem jsou nyní ignorovány.
- Oprava nemožnosti přepnutí se na uživatele, který má nastaven specifický typ přihlašování pomocí
auth_type
. - Omezení počtů znaku odstraněno ze všech atributů filtru na PostgreSQL a navýšeno na 255 pod MySQL.
- Kopírování:
- Oprava kopírování agregací unikátních podle určeného sloupce.
- Oprava kopírování prokliků do vzdálené databáze.
- Prokliky přes menu jsou nyní správně aktualizovány, když je prováděno kopírování včetně souvisejících menu.
- Oprava kopírování relací neformulářových akcí.
- V sekci Nastavení již nelze zvolit menu s externí URL jakožto domovské.
- Formulář podmíněného formátování nyní správně nabízí pouze synchronizované sloupce.
- Oprava kompatibility s materializovanými pohledy na PostgreSQL 12+
- Oprava kompatibility s datovými typy range* na PostgreSQL
- Závislá hodnota v datovém formuláři nyní dokáže změnit hodnotu ‚0‘ na “ a obráceně.
- Oprava chyby, kdy export zdrojů dat někdy nešlo vygenerovat.
- Aplikace již neskončí chybou při ručním smazání souborů cache menu, ale rozezná stav jako nevalidní a vygeneruje si nové menu.
- Pokud složka
log
neexistuje, aplikace ji sama vytvoří. - Pokud při aktualizaci prod instance dojde k chybě, je nyní korektně vypsána.
- Dodána chybějící invalidace cache menu při následujících operacích v administraci rolí a skupin:
- Odebrání role uživateli.
- Odebrání role skupině uživatelů.
- Odebrání skupiny uživateli.
- Smazání role.
- Smazání skupiny.
- Oprava invalidace cache při změně akce; nutno invalidovat cache sloupců i dat dané stránky, aby byla zajištěna dostupnost nastaveného sloupce ID.
- Oprava chyby v administraci tiskových šablon.
- U obecné akce se nyní v administraci zobrazuje popis, jako u ostatních akcí.
- Oprava chybného přetypování vnořených dynamických sloupců na text, jež mohlo nastat na stránce typu
detail
. - Při spuštění hromadné akce po prokliku jsou nyní správně nastaveny relace tak, aby skript dané akce získal relace své akce namísto relací prokliku.
- Na přihlašovací stránce je nyní možné zvolit jazyk aplikace, pokud je aplikace vícejazyčná.
- Oprava překreslení menu při změně jazyka.
- Dodána řada chybějících překladů.
Poznámky pro vývojáře
- Oprava výpisu předávaných argumentů v tracy na php 7.4+
- Oprava funkcionality schování/zobrazení tracy bluescreen (červená obrazovka), pomocí trojúhelníku vpravo nahoře.
- Implementována základní infrastruktura odesílání/logování emailů:
- Vytvořena nová nesdílená systémová tabulka
sys_email_log
pro zaznamenávání odeslaných mailů. - Do
BaseDataForm
aPagePresenteru
přidána metodagetSendmailMailer()
. TentoSendmailMailer
umí klasicky posílat maily metodousend
, zároveň však zaloguje informace o odeslaném mailu dosys_email_log
a to včetně ID aktuálního eventu, pokud nějaký probíhá. - Přidána nová služba
Unis\Services\TemplateFactory
rozšiřující/nahrazujícíNette\Bridges\ApplicationLatte\TemplateFactory
. Momentálně jediným rozdílem je, že při zavolánícreateTemplate
bez předání$control
kontextu se automaticky použijeNette\Application\LinkGenerator
pro generování absolutních URL a umožnění použití odkazů formou:<a n:href="Presenter:action">Link</a>
- Nová služba nahrazuje tu původní, lze ji tedy (krom napřímo pomocí dependency injection) získat jednoduše z Presenteru zabudovanou metodou
getTemplateFactory()
.
- Nová služba nahrazuje tu původní, lze ji tedy (krom napřímo pomocí dependency injection) získat jednoduše z Presenteru zabudovanou metodou
- Vytvořena nová nesdílená systémová tabulka
- Obsah datových buněk je nyní vykreslen pomocí jednotné logiky ze sdílené šablony
Column/frontend/dataCell.latte
- Přechod na jednotné zpracování se týká šablon:
Column/frontend/columns.latte
Column/admin/columns.latte
Widget/one-to-one.latte
Widget/one-to-many.latte
- Oproti
Column/frontend/columns.latte
ostatní šablony často dosud pokulhávaly a chyběly jim některé featury. Díky tomuto sloučení získají ostatní šablony zaručeně implementaci všech současný i budoucích featur.
- Přechod na jednotné zpracování se týká šablon:
- Přidána konfigurační možnost
parameters.debug.maxQueryLength
s výchozí hodnotou 1500. Toto je už v základu vyšší než výchozí dibi hodnota 1000. - Umožněn toggle prvků datového formuláře ve skriptech.
- Jednotlivé řádky datového formuláře nyní mají nastaveno ID standardně dle
getOption('id')
- ID option je ve výchozím stavu nastaveno jakožto
BaseDataForm::getControlContainerIdPrefix()
+ název prvku.
- Jednotlivé řádky datového formuláře nyní mají nastaveno ID standardně dle
- LC_TIME je nyní automaticky nastaven dle
app.locale
. - Jelikož
index.php
je jediný nesymlinkovatelný soubor, jakákoli jeho změna musí být ručně aplikována do každé jednotlivé sdílené instance. Z tohoto důvodu bylo co nejvíce kódu z něj přesunuto jinam:- Všechny globální konstanty kromě
WWW_DIR
aAPP_DIR
přesunuty do nového souboruapp/tools/constants.php
- Přidána nová globální konstanta
BASE_DIR
, obsahující cestu ke kořenu instance.
- Všechny globální konstanty kromě
- Výchozí hodnota konfigurační možnosti
app.instanceName
je nyní načtena již uvnitř samotného configu, takže lze předat jako parametr do jiných konfigurací. BaseDataForm::setConfirmMessage
nyní umožňuje předat NULL, pro odebrání potřeby cokoli potvrdit.- Pokud provedená úprava/přidání záznamu nevyhovuje pravidlu exclusion constraint na datové tabulce, UNIS se pokusí využít komentář na daném pravidlu jakožto chybovou hlášku (PostgreSQL).
- Oprava možnosti nastavit různé databázové umístění dle typu cache (tableData/activeColumns).
- Doplněny výchozí hodnoty konfigurace cache/connection, pro usnadnění úprav v dědícím konfiguráku.
- Složka
scripts/tests
je vyhrazena pro testy aplikačních skriptů, třídy z této složky nejsou automaticky načítány do aplikace. - Názvy systémových tlačítek datového formuláře upraveny na více unikátní, aby nedošlo ke kolizi s datovými prvky formuláře:
new
->x_unis_as_new
cancel
->x_unis_cancel
- Složka
libs
zcela zrušena:- Následující knihovny přesunuty do správy composeru:
- datto/json-rpc-http (povýšeno na nejnovější verzi 5.0.6)
- phayes/geophp (novější verze neexistuje, zůstává 1.2)
- simplehtmldom/simplehtmldom (povýšeno na nejnovější verzi 2.0-RC2)
- tecnickcom/tcpdf (povýšeno na nejnovější verzi 6.4.2; v metodách overridovaných zděděnou třídou MyTCPDF se zdá nedošlo k žádným změnám)
- Následující knihovny zahozeny:
- PHP_ICO + FaviconGenerator (již nepoužíváno)
- EvalMath + secondsToTime (dávno zavrženo)
- FileDownloader (nahrazeno třídou FileDownloader, již obsaženou v jádru UNIS)
- Pomocné funkce
dd
/ddd
přesunuty dotools/shortcuts.php
- Následující knihovny přesunuty do správy composeru:
- Na serveru je pro správné fungování UNIS2 vyžadováno:
- php extension
pdo_sqlite
- přidat typ
application/json
do nastavení /etc/apache2/mods-available/deflate.conf - v MySQL configuraci navýšit group_concat_max_len = 10240000
- php extension
Přepracování konfigurace datových připojení
Sekce configu data
je zrušena/nahrazena novou sekcí dataConnections
, kde každý klíč představuje vlastní název datového spojení a obsahuje rovnou klasickou konfiguraci db připojení:
dataConnections: default: driver: %database.driver% host: %database.host% database: %database.database% username: %database.username% password: %database.password% charset: %database.charset% gabina: driver: postgre host: 192.168.17.29 database: shkn username: milos password: heslo schema: shkn_nove mojedata: ....
default
data connection musí mít definována každá aplikace. V common.neon
je default globálně zadefinovaný stylem jako výše v příkladu, což přináší zpětnou kompatibilitu s MySQL aplikacemi udělanými postaru bez explicitního data připojení. U moderních aplikací stačí pouze správně nastavit dataConnections.default.database
/schema
, což je také jednodušší než předchozí syntaxe. Díky této změně struktury configu je možné ze sys_page
zcela odstavit sloupce db_name
/db_schema
a nahradit je jedním novým sloupcem connection
, jehož hodnota koresponduje s názvem klíče datového připojení z config sekce dataConnections
(takže např. default). Tím se dost vyjasňuje, co se tam vlastně má zadávat, s čímž byl typicky problém jak na MySQL tak PostgreSQL; jednak kvůli sdíleným aplikacím a taky kvůli synchronizaci prostředí.
Správa datových připojení na straně php je také předělána a vyčleněna z Database
do vlastní service/třídy DataConnectionManager
, aby to bylo čistější jako dependency injection.
Konfigurační možnost cache.enabledDatabases
zrušena – momentálně není žádnou aplikací využívána a nebyla příliš kompatibilní se změnami okolo přepracování datových připojení.
Plánované úlohy
Databázová struktura
- Tabulka system_cron_scripts přejmenována na sys_cron_job.
- Přidán sloupec
class
obsahující název třídy zpracovávající daný job (zpětně doplněnoCronFunc
). - Sloupec
script
přejmenován namethod
. - Sloupec
id_script
přejmenován naid
. - Sloupce
minutes
,hours
,days_month
,months
,days_week
přetypovány na textové. Čas je nyní zapisován standardní cron syntaxí. Výchozí hodnota všech polí je*
(„vždy“), nahrazující dosavadníNULL
(již není povoleno). - Přidán sloupec
title
pro definování uživatelsky-čitelného názvu daného jobu. - Přidán sloupec
enabled
pro možnost dočasného vypnutí jobu. - Přidán sloupec
connection
, využívající nový způsob definování datového připojení (viz Přepracování konfigurace datových připojení). - Přidán sloupec
allow_overlap
, určující zda může být spuštěno několik instancí daného jobu souběžně. - Přidán sloupec
repeat
, určující zda má být úloha spuštěna pouze jednorázově (po spuštění je nastavenoenabled
na false).
- Přidán sloupec
- Tabulka system_cron_process zrušena, nově je stav úlohy zapisován do sys_event.
- Do tabulky sys_event přidán sloupec
cron_job_id
, identifikující související cron job. - Všechny existující záznamy ze system_cron_process jsou zpětně namigrovány do sys_event.
- Do tabulky sys_event přidán sloupec
Nová logika implementace úloh
Každá úloha by měla být vlastní samostatnou třídou, která musí implementovat rozhraní Unis\Services\Cron\JobInterface
. Toto rozhraní definuje pouze přítomnost metody run
, která bude zavolána při skutečném spuštění dané úlohy. Do metody run
je při spuštění úlohy vždy předán objekt typu Unis\Tools\Event\CronEvent
představující aktuální úlohu a zároveň jako druhý argument je předáno databázové připojení dle nastavení ze sloupce conection
.
Úloha může v průběhu volat metody na předaném Event
objektu, například pro zápis poznámky k úloze. Odeslání finálního stavu Eventu
typicky není potřeba v rámci implementace úlohy řešit; mělo by být ošetřeno nadřazeným skriptem pouštějícím samotnou úlohu.
Každá třída úlohy musí být zaregistrována v configu jako service a závislosti si předávat pomocí dependency injection. Například:
services: - UnisScripts\CronJobs\AktualizaceStaniceniJob
Třídy vytvářet v nové složce scripts/CronJobs
.
Zpětná kompatibilita s dosud používanou obecnou třídou CronFunc
je zachována bez nutnosti úprav existujícího kódu.
Další změny a poznámky k úlohám
- K dispozici je příkladová úloha
Unis\Services\Cron\ValidateActiveColumnsCacheJob
, dodávána jako součást core. - Jednotlivé úlohy jsou nyní spouštěny v oddělených procesech, podobně jako skutečný crontab.
- Oprava ukládání lokální IP do logu událostí při spuštění události z prostředí CLI.
- Oprava zobrazení hodnoty User Agent v logu událostí při spuštění události z prostředí CLI.
- Jakožto podtyp cron události je v logu zobrazen název třídy související úlohy.
- Pro logiku plánování úloh využita knihovna
peppeocchi/php-cron-scheduler
, nahrazující dosavadní logiku. - Dosavadní syntaxe zápisu plánovače úloh do crontabu se nemění.
- Jednotlivé Joby lze spouštět ručně z příkazové řádky syntaxí:
php .\index.php "Cli:runCronJob" "--cronJobId" "2"
kde 2 je id Jobu, jež má být spuštěn. - Plánováná úloha má možnost si načíst
SendmailMailer
pomocí dependency injection, pro snadné odesílání mailů včetně zalogování. - Přidán konfigurační parametr
app.instanceUrl
, kterým lze ručně nastavit URL instance pro využítí v CLI režimu.- Jako výchozí je dosazeno
https://%app.instanceName%.gisa.cz
- Tato URL je následně dosazena do služby httpRequest, takže by o ní zbytek aplikace měl vědět. V samotné úloze si lze službu načíst pomocí dependency injection jakožto
Nette\Http\Request
.
- Jako výchozí je dosazeno
Administrace plánovaných úloh
- Nové administrační rozhraní je k dispozici z menu ozubeného kolečka jakožto „Plánované úlohy“.
- Formulář pro přidání úlohy má nastaveny výchozí hodnoty dle nejčastějšího použití. Třída úlohy je zvolena pomocí výběrového seznamu nabízejícím všechny třídy ze složky
scripts/CronJobs
implementujícíUnis\Services\Cron\JobInterface
+ systémové Joby dodávané jako součást core + dosud používanou tříduCronFunc
. - Tabulka úloh umožňuje snadnou (de)aktivaci jednotlivých úloh kliknutím ve sloupci „Aktivní?“. Dále nabízí možnost okamžitého spuštění úlohy na popředí (trojúhelníček), nebo na pozadí (přesýpací hodiny). Nakonec je zde možnost prokliku do logu událostí souvisejících s danou úlohou (kalendářík).
- Pokud systém vyhodnotí potřebu zaregistrovat samotný plánovač do crontabu (není zatím registrován pro našeho OS uživatele), v horní části nabídne tlačítko pro zaregistrování do crontabu. Možnosti dále editovat crontab či zrušit registraci plánovače nejsou z administračního rozhraní nabízeny.