Správce úloh
- Vlevo nahoře vedle tlačítka zvonečku přidáno tlačítko pro Správce úloh.
- Správce úloh zobrazuje seznam posledních až padesáti událostí provedených právě přihlášeným uživatelem v posledním dni.
- Uživatel zde může sledovat průběh/výsledek událostí, výpis poznámek k dané události a případně také získat výstupy.
- Události jsou řazeny sestupně dle času dokončení, nedokončené jako první.
- Podřazené události jsou podbarveny světleji a lze je sbalit/rozbalit pomocí trojúhelníčku v nadřazené události.
- Na pozadí probíhá periodicky kontrola aktuálnosti zobrazených úloh.
- Každých 1,5s pokud je dialog Správce úloh otevřený.
- Každých 15s pokud je dialog Správce úloh zavřený. V případě detekce změny ikona Správce úloh dvakrát problikne.

Úlohy na pozadí
- Následující úlohy jsou nyní vždy spuštěny na pozadí (uživatel může monitorovat jejich průběh pomocí Správce úloh):
- Obecný export dat stránky do XLSX/CSV/PDF
- Výstup dle šablony XLSX (jednotlivé i spojené)
Mapové rozhraní Spinbox
- Integrace nového mapového řešení Spinbox. Stávající aplikace postupně převádíme.
- Umožňuje zobrazení mapy ve stejném okně s aplikací, i v samostatném okně.

UI/UX
- Umožněno definovat druhé logo, které bude zobrazeno v pravém horním rohu. Typicky levé logo je primárním logem aplikace, zatímco pravé logo je logo zákazníka aplikace.
- Vyhledávání v menu nyní vrací více relevantní výsledky.
- Zmenšena velikost textu cesty aktuálního menu (navigátor).
- Zmenšena tlačítka Filtrovat / Reset filtru. Tlačítko pro reset je nyní aktivní pouze pokud je co resetovat.
- Přidáno tlačítko pro reset řazení.
- Šířka nadpisu sloupců se nyní responsivně přizpůsobuje změnám velikosti okna prohlížeče.
- Lépe vyplněn horní prostor při schování postranního menu.
- Pole našeptávače v kartě detailu a datovém formuláři nyní působí celistvě, nerozpadá se na políčko uvnitř políčka při interakci.
- Modernizován prvek pro editaci formátovaného textu HTML:
- Verze využívaného editoru TinyMCE navýšena 5.2.2 -> 6.8.0
- Aktivovány pluginy fullscreen, preview, code, table, image, accordion, lists, emoticons, charmap
- Do toolbaru nastavena tlačítka
undo redo |bold italic forecolor |align |bullist numlist - Aktualizace verze nástroje již nevyžaduje ruční obnovu cache prohlížeče
- Pokud je nastaven popisek záhlaví sloupce, nezobrazovat popisek názvu sloupce.
- Vylepšeno zobrazení zvýrazněných řádků dat:
- Nezvýrazňovat buňky pro systémové prvky akcí, zvýrazňovat pouze datové buňky.
- Neaktivovat pokud uživatel klikne v řádku na odkaz/tlačítko/checkbox.
- Vylepšeno vizuální zobrazení okrajů tlačítek řádkových akcí.
- Vylepšeno grafické oddělení jednotlivých tabů widgetu.
- Vylepšeno zobrazení okrajů tabů widgetů, aby pozadí nepřetékalo při najetí myší.
- Filtrovatelné tabulky dat widgetů se již zbytečně neroztahují na 100% šířky, když to není potřeba.
- Rozbalovací navigace „ozubené kolečko“ se nyní zavře při kliknutí mimo její obsah.
- Následující UI prvky na horní liště sloučeny do jednoho: výpis uživatele, tlačítko navigace „ozubené kolečko“, tlačítko odhlásit (přesunuto do nabídky navigace).
- Horní lišta nyní automaticky zajíždí při scrollování směrem dolů.
- Šipky u složek menu mají nyní stejnou logiku orientace jako v průzkumníku souborů Windows.
- Nová výchozí favicona aplikace.
- Akce „Zobrazit vybrané“ je nyní ukotvena v levé části lišty akcí a zobrazuje se pouze jako ikona oka.
- Při procházení historie prohlížeče je nyní zachováno zvýraznění zvolených řádků dat.
- Při rozbalování skupiny sloupců je nyní v kontextovém popisku vidět název dané skupiny.
- Pro sbalení skupiny sloupců lze nyní kliknout kamkoli do prostoru nadpisu dané skupiny, zrušeno tlačítko minus.
- Výběr ve vícenásobném výběrovém seznamu lze nyní potvrdit klávesou enter.
- V levém dolním rohu se nyní zobrazuje branding ISAX.
- Doplněna ikona pro soubory typu DWG.
- Pokud widget momentálně neobsahuje data a lze je vyhledat hlavním filtrem, vypisuje se nově hláška „Vyhledejte data pro zobrazení“.
- Oprava vykreslování kontextových popisků po přenačtení obsahu datové tabulky.
- Oprava rozbalení složky menu dle právě aktivní položky menu.
- Oprava občasné chybné orientace šipek v menu úrovně 3 a hlubší.
- Oprava přetékání výběrových seznamů mimo modální okno formuláře.
Našeptávací filtr
- Filtr typu našeptávač nyní reaguje na možnost odeslání filtrů při změně.
- Změna hodnoty filtru našeptávače je detekována:
- Při zvolení nové hodnoty enterem nebo kliknutím na nabízenou hodnotu.
- Při odstranění libovolného počtu hodnot z výběru a zavření nabídky hodnot uložených ve výběru (kliknutím mimo).
- Při odstranění všech hodnot z výběru.
- Naopak za změnu se nepovažuje:
- Opětovné zvolení hodnoty, která již je uložena ve výběru.
- Započetí editace hodnoty uložené ve výběru (neboli odstranění hodnoty z výběru za účelem její editace). A to i v případě, že uživatel zároveň odstranil jiné hodnoty z výběru.
- Otevření a zavření nabídky hodnot uložených ve výběru, bez provedení změn.
- Při započetí editace je nyní automaticky zavřena nabídka hodnot uložených ve výběru.
Vylepšení exportů/tisků
- Upřesněny popisky typů exportu.
- Pole hodnot se nyní exportují bez ohraničení uvozovek a složených závorek.
Obecný export dat do CSV
- Optimalizace výkonu a využití paměti.
- Nyní využívá systém událostí včetně procentuálního průběhu, zahrnuto pod nový typ událostí „export“.
Obecný export dat do XLSX/PDF
- Optimalizace využití paměti.
- Nyní využívá systém událostí včetně procentuálního průběhu, zahrnuto pod nový typ událostí „export“.
- Implementováno odsazení tisíců dle nastavení sloupce.
- Vylepšena detekce optimálního počtu zobrazených desetinných míst.
- Pokud se nepodaří určit datový typ hodnoty vlastní logikou, hodnota bude vždy explicitně uložena jako text. Dosud byla v tomto případě využita automatická detekce datového typu poskytovaná externí knihovnou, což způsobovalo nekonzistenci datových typů v rámci stejného sloupce (například u čísel parcel) a někdy i zcela nesprávné určení datového typu.
- Formulář exportu nově nabízí možnost exportovat také skupiny sloupců.
- Formulář exportu nově nabízí možnost neexportovat agregační řádek.
XLSX šablony (jednotlivé i spojené)
- Optimalizace využití paměti.
- Nyní využívá systém událostí včetně procentuálního průběhu, zahrnuto pod nový typ událostí „export“.
- Logika přepracována/sjednocena s obecným exportem dat. Hodnoty jsou nyní vždy exportovány „syrové“ s explicitně daným datovým typem a následně naformátované pomocí nativních možností XLSX.
- Logika formátování se snaží upřednostnit pravidla určená v dané XLSX šabloně a až v druhé řadě pravidla vyplývající z nastavení daných UNIS sloupců. Ve většině případů by tedy měla být zajištěna zpětná kompatibilita.
- Díky explicitním datovým typům bude vyřešen například problém exportu textu vypadajícího jako desetinné číslo.
- Při zpracování datasetu je nyní fyzicky přidán potřebný počet nových řádků. Hodnoty zapsané v šabloně pod datasetem tedy nemohou být přepsány samotným datasetem.
- Podmíněné formátování nastavené v šabloně již není kopírováno do jednotlivých datových řádků. Tato funkcionalita způsobovala problémy při otevření výstupu v programu MS Excel.
- Zůstává možné využít podmíněné formátování UNISu, které se ve výstupu projeví.
Export zdrojů dat
- Optimalizace výkonu.
- Nyní využívá systém událostí včetně procentuálního průběhu, zahrnuto pod nový typ událostí „export“.
- Do výstupu přidány sloupce ID stránky, ID datového zdroje, ID sloupce.
- Vylepšeno řazení:
- Oprava chybného řazení pokud stránka obsahovala zdroj dat stejné tabulky v několika formách.
- Viditelné sloupce jsou nyní řazeny jako první v rámci svého zdroje dat.
- Výstupní tabulka v XLSX je nyní filtrovatelná.
Tiskový modul
- Oprava překreslení dat po smazání/editaci šablony v administraci.
- Nyní využívá systém událostí, zahrnuto pod nový typ událostí „export“.
- Log událostí lze nyní filtrovat podle ID tiskové šablony. Přidán proklik ze seznamu tiskových šablon do Logu událostí.
Události
- Nový typ události „export“ zastřešuje obecný export dat stránky do XLSX/CSV/PDF, výstup dle šablony XLSX (jednotlivé i spojené), tiskový modul (Word/PDF) a export zdrojů dat.
- Události všech typů mají nově možnost definovat cestu k výstupu úlohy a název výstupu. Výstupem může být cesta k souboru nebo URL.
- V Logu událostí lze získat výstup úlohy z nového sloupce Výstup.
- Události typů action a export mají nově možnost definovat relevantní page_id.
- V Logu událostí lze podle page_id filtrovat a ovlivňuje také zobrazený popisek události.
Obecná vylepšení
- PostGIS geometrie je nyní vypisována v lépe čitelném formátu EWKT.
- Sloupce UUID se již nezobrazují v datovém formuláři.
- Konzistentnější zobrazení ✔️ / ❌ hodnot v datech i filtrech dat.
- Přidána logika zlepšení čitelnosti chybových zpráv z databáze (ve formuláři i hromadných akcích), zejména při:
- problému závislostí záznamů
- problému duplicity záznamů
- problému povinné hodnoty
- neplatném vstupu hodnoty
- Vylepšeno chování při chybě v dotazu na data stránky. Nyní se chyba zaloguje a datová tabulka se zobrazuje správně prázdná.
- Vylepšeno chování při chybě v SSO přihlašování. Chybová hláška zůstane vypsaná na obrazovce a nezobrazí se přihlašovací formulář UNIS (když je vynuceno SSO).
Optimalizace výkonu
- Optimalizace využití indexů při načítání dat do formuláře.
- Oprava zbytečného zdvojení podmínky relace v dotazu, pokud stránka neobsahuje žádné dynamické sloupce.
- Neprovádět převody datových typů při porovnávání numerických a boolean hodnot, když to není nutné. Lepší podpora využití indexů/partitioning na numerických/boolean sloupcích.
- Optimalizace vyhodnocení perzistentních parametrů na nedynamických sloupcích zavedena u stránek typu detail (karta).
- U stránek typu table i detail je nyní tato optimalizace využita i v případě, že pouze některé parametry jsou na nedynamických sloupcích.
- Optimalizace načítání skupin/rolí uživatelů ve Správě uživatelů.
Opravy
- Oprava chybného zobrazení dat pokud uživatel sbalí/rozbalí skupiny sloupců do jiného než výchozího stavu a následně změní řazení.
- Oprava zobrazení akčních menu na novějších verzích prohlížečů typu Chromium/Blink.
- Zamezeno uložení dat formuláře obsahujícího chybu.
- Datumy a čísla se v textu po prokliku nyní formátují stejně jako v jejich původní datové sadě.
- Oprava udržení výběru hodnoty „– neměnit –“ při přenačtení hodnot v závislém výběrovém seznamu.
- Oprava neočekávané reaktivace závislého výběrového seznamu při přenačtení hodnot.
- Oprava zobrazení hodnoty/cesty readonly prvku pro nahrání souboru.
- Oprava chyby datového formuláře, pokud obsahuje skrytý/neoprávněný upload prvek.
- Oprava chyby při prokliku do formuláře přes neplatnou hodnotu výběrového seznamu:
- Aplikace danou hodnotu nyní prezentuje uživateli jako
-- NEPLATNÁ HODNOTA -- - Pokud se uživatel pokusí formulář s neplatnou hodnotou uložit, dostane chybovou hlášku.
- Aplikace danou hodnotu nyní prezentuje uživateli jako
- Oprava chyby, kdy při použití formuláře pro pokročilý filtr se operátor „není mezi“ vždy chybně sestavil jakožto „je mezi“.
- Oprava filtrování prázdného textu pomocí filtru typu výběrový seznam.
- Oprava filtrování prázdného pole hodnot.
- Oprava chybného zobrazení ✔️ / ❌ hodnoty ve výchozím filtru, pokud hodnota neexistuje v aktuálním datové sadě.
- Mazací akce již nelze vyvolat bez potvrzení pomocí funkcí prohlížeče. Nyní nefunguje jako odkaz.
- Oprava možného přesměrování na neplatnou URL po provedení mazací akce.
- Oprava možného odkazu na neplatnou URL ve sloupci obsahující obrázky.
- Při neoprávněném pokusu otevřít menu se nyní konzistentně vypíše chybová hláška. Dosud se buď nestalo nic, nebo došlo k přesměrování na homepage.
- Při chybě načítání dat stránky typu detail (karta) se zobrazí srozumitelná chybová hláška namísto spadnutí aplikace.
- Oprava provádění akcí/prokliků na záznamech identifikovaných pomocí znaků speciálního významu
( ) && || * - Oprava funkce odhlášení uživatele, pokud je vynuceno přihlašování přes SSO.
- Oprava funkce odhlášení uživatele ze stránek speciálních typů iframe/script.
- Oprava řazení číselných sloupců obsahujících záporná čísla.
- Oprava řazení sloupců některých speciálních datových typů na PostgreSQL.
- Oprava chyby při uploadu/kopírování, pokud formulář obsahuje nedatabázové prvky.
- Oprava možného přetékání řádků při exportu dat do PDF.
- Oprava detekce výchozího jazyka, kdy některé části aplikace mohly být zobrazeny v rozdílných jazycích.
Bezpečnostní opravy
- Data ve výstupech stránek jsou nyní ošetřena proti XSS.
- Datový formulář nyní ošetřuje vstupní data proti XSS.
- „Text po prokliku“, respektive URL parametr
titleje nyní ošetřen proti XSS. - Zobecněna chybová hláška pokud stahovaný soubor neexistuje nebo nelze přečíst (prevence „path disclosure“).
- Skryta cesta k otevíraným obrázkům v datech (prevence „path disclosure“).
- Zakázán upload souborů nebezpečných typů, dle whitelistu.
- Do JS proměnné
UNIS.menu.menusForSearchjiž nejsou načítány neoprávněné položky, kontrolováno rekurzivně. - Při pokusu otevřít menu jsou nyní práva kontrolována až 7 úrovní nahoru (dosud kontrolována pouze aktuální úroveň).
- Ošetření možné SQL injection ve filtrech.
- Ošetření XSS a SQL injection v nastavení podmíněného formátování.
- Session cookie nyní striktně vyžaduje zabezpečené spojení.
- Session cookie již v názvu neobsahuje cestu k aplikaci (prevence „path disclosure“).
- Omezeno zobrazování detailu interních chyb uživateli, který není vývojář.
- Provedena bezpečnostní aktualizace knihovny bootstrap 3.2.0 -> 3.4.1
- Provedena bezpečnostní aktualizace knihovny moment.js 2.10.3 -> 2.30.1
Administrační rozhraní
Rozbalit/zabalit seznam změn relevantní pro administrátory
Koš
Struktura
- Zavedena nová oficiální struktura tabulky
sys_bin:idautoincrement primární klíčevent_idnávaznost na událost sys_event (povinné)connectionnávaznost na dataConnection smazaného záznamu (povinné)table_namenázev datového zdroje, ze kterého byl záznam smazán (povinné)datapůvodní data smazaného záznamu, ve formátu json (povinné)restoredboolean, nastaveno na true při úspěšném obnovení záznamu
Jelikož se struktura značně liší od původní implementace, není možná zpětná migrace dat.
Administrace
- Vytvořeno administrační rozhraní Koše, nahrazující dosavadní nesystémové stránky
- Možno otevřít následujícími způsoby:
- přes menu ozubeného kolečka
- proklikem ze seznamu uživatelů přes konkrétního uživatele
- proklikem ze zdrojů dat přes konkrétní zdroj dat
- proklikem z logu událostí přes konkrétní událost mající navázané záznamy v koši
- Výpis je omezen na 1500 záznamů, avšak nabízí filtrovací formulář pro snadnou změnu datové sady. Podobný filtrovací formulář byl zároveň přidán také do Logu událostí.
- Výpis obsahuje SQL dotaz pro obnovu záznamu, korektně naformátovaný podle driveru dané dataConnection. Dotaz si lze zkopírovat do mezipaměti jednoduše kliknutím na kopírovací tlačítko, nebo lze rovnou vyvolat obnovu záznamu pomocí tlačítka recyklace.
- Záznamy úspěšně obnovené pomocí tlačítka recyklace mají zeleně podbarvenu buňku s SQL dotazem pro obnovení.
- Možno otevřít následujícími způsoby:

Scripty
- Přidána metoda
PagePresenter::getRecordDeleter(), umožňující získat instanci třídyRecordDeleterve scriptech. - Samotná třída
RecordDeleternově poskytuje metodudeleteByWhereArray, pomocí které lze snadno provést odmazání záznamů z libovolné tabulky a zároveň dané záznamy automaticky vložit do koše.- Jelikož pro zavolání metody
deleteByWhereArrayje nutno předat instanciEvent, nově je poskytována instanceEventautomaticky jako další argument na vstupu vlastních metod akcí i callbacků formuláře.
- Jelikož pro zavolání metody
- Přidána explicitní konstanta
RecordDeleter::STATUS_UNFINISHEDpro použití jakožto stav na výstupu vlastních metod pro mazací akce (indikující pokračovat ve společné logice mazání po dokončení scriptu vlastní metody). Chování zůstává kompatibilní s dosavadním stylem vracení true/false. - Veškeré dosavadní scripty používající koš jsou předělány na nový způsob interakce přes zabudovanou třídu
RecordDeleter.
Vlastní javascript stránky
Umožněna definice vlastního JS kódu, který se spustí na konkrétní stránce. Způsob psaní těchto skriptů je blíže popsán na wiki: https://redmine.gisa.cz/projects/unis/wiki/Scripts#Page-JS
Administraci lze otevřít proklikem ze seznamu stránek. Ke stránce lze přiřadit libovolný počet skriptů, případně i stejný skript vícekrát s odlišnou konfigurací. Ve formuláři je vždy nutno vybrat soubor skriptu z nabízeného seznamu, načež se nabídne výchozí konfigurace skriptu dle jeho definice vlastnosti config.

Mapování externích identit
Nová funkcionalita umožňující mapovat identity z externích systémů na lokální role/skupiny UNISu. Nastavení probíhá v nové sekci administrace „Uživatelské role & skupiny“. Mapování je aplikováno při přihlášení uživatele, kdy mu jsou role/skupiny patřičně přiděleny/odebrány.

Konfigurace
V common.neon do sekce auth.sso přidány dvě nové možnosti:
extIdentityKeys: [] # json keys containing user identities (roles/groups)
ignoreIdentitySuffix: '' # cut off given suffix when mapping identities
extIdentityKeys definuje názvy klíčů v příchozích datech, kde jsou obsažena pole identit. Může jich být více než jeden. Pokud není definován žádný, logika mapování je vypnuta.
ignoreIdentitySuffix umožní oříznout nadbytečný suffix příchozích identit.
Závislosti stránek
Implementován výpis závislostí stránky.
- Výpis závislostí stránky lze zobrazit tlačítkem ze seznamu stránek, nebo z horní části administrace konkrétní stránky.
- Výpis může obsahovat následující závislosti: menu, akce, sloupce, stránky.
- U závislých akcí a sloupců lze měnit jejich nastavení přímo bez opuštění výpisu závislostí.

Uživatelské proměnné
Přepracováno nastavení var_string rolí/skupin, aby bylo možné definovat libovolný počet proměnných.
- Do administrace „Uživatelské role & skupiny“ přidána administrace seznamu definovaných proměnných.
- Jako název proměnné je očekáváno slovo ve tvaru PascalCase. V ostatních částech aplikace se proměnná používá syntaxí
%userVarNázevProměnné, například%userVarZhotovitel - Kromě přiřazení statické hodnoty klasickým způsobem lze využít možnost přiřazení hodnoty pomocí dynamického SQL dotazu. V tomto případě budou načteny vždy hodnoty prvního sloupce z výsledku dotazu.
- Každá proměnná může mít výchozí hodnotu/dotaz. Výchozí hodnota/dotaz se aplikuje pouze v případě, kdy by daný uživatel jinak neměl žádnou hodnotu pro danou proměnnou.
- Ze seznamu definovaných proměnných se lze prokliknout do administrace přiřazení hodnot k proměnné dle rolí a skupin.
- Původní proměnné var_string jsou v rámci SQL migrace přesunuty do nové struktury jakožto proměnná „String“. Pro zpětnou kompatibilitu funguje
%groupStringjako alias pro%userVarString. - Oprava dědění proměnných dle stromu rolí.

Synchronizace DB
- Optimalizace načítání administrační stránky pro synchronizaci.
- Vylepšeno UI synchronizace databáze.
- Oprava chybné detekce rozdílu záznamů u sys tabulek se složeným PK (sys_data_source_widget, sys_spinbox_info_overlay).
- Tlačítko pro celkovou synchronizaci SLAVE/MASTER nyní chytře synchronizuje pouze tabulky v nesouladu.
- Tlačítko pro synchronizaci DEV->PREP nyní chytře synchronizuje pouze tabulky v nesouladu. Tabulky upravené modulem jsou však momentálně vždy synchronizovány.
- Tlačítko pro synchronizaci PREP->PROD nyní chytře synchronizuje pouze tabulky v nesouladu.
- Zrušena konfigurační sekce
syncsync.tablespřesunuto do TableSynchronizer::SYSTEM_TABLESsync.remoteDestinationszrušeno společně s funkcionalitou vzdálené synchronizace (nahrazuje synchronizace prostředí DEV/PREP/PROD)

UX formuláře akcí
- Výběr typu akce mírně přeskupen a upraveny názvy některých akcí (zejména aby vybíraný název odpovídal názvu na vytvořené akci).
- Výběr typu akce rozdělen do dvou celků;
- Základní (pro 1 záznam)
- Hromadné
- Možnost „Modální dialog“ přemístěna do sekce s výběrem formuláře.
- Možnosti nastavení prokliku (text/nový tab) vyčleněny do vlastní sekce pod sekcí s formulářem. Nyní se zobrazují pouze pro akce mající možnost formuláře.
- Možnost „Formát popisku“ přejmenována na „Text zobrazený po prokliku“, konzistentní s názvem ve formuláři nastavení sloupce.
- Sekce pro specifické nastavení hromadných akcí se již nezobrazuje pro typ „Zobrazit vybrané“, včetně nastavení skriptu.

Výpis všech oprávnění role
- V seznamu rolí se nově lze ikonou klíče prokliknout do výpisu všech oprávnění role.
- Přímo ve výpisu je možné editovat a odebírat oprávnění, ne však přidávat nové.
- Z každého řádku výpisu se lze dále prokliknout do administrace všech oprávnění souvisejícího zdroje (stránky/menu/sloupce/…).
Kopírování stránek
Kopírování stránek značně přepracováno pro vyřešení řady dlouhodobých problémů.
- Nyní pracuje vždy nad SLAVE na obou stranách.
- Chytřejší nahrazení ID v dynamických výrazech. Dosud mohlo docházet k chybnému nahrazení když bylo jedno ID obsaženo ve druhém, např.:
%11,%1134kde by se mělo nahradit 11 -> 6; 1134 -> 7- mohlo být chybně nahrazeno jako
%6,%634namísto%6,%7
- Implementováno kopírování dynamických výrazů pro vlastní formulářové prvky (
custom_sql_pattern), pro prvek dynamického geometrického typu (geometry_pattern), pro formát popisku akce (title_pattern), pro parametry podmíněného formátování (value). - Implementováno kopírování práv akcí.
- Umožněno kopírování stránek typu calendar a gantt.
- Při kopírování je nyní snaha neduplikovat filtr, pokud již existuje filtr nad daným SQL dotazem.
- Implementováno kopírování SQL dotazů pro závislé hodnoty ve formuláři.
- Oprava možných duplicit při kopírování složek menu.
- Oprava zachování relativního pořadí položek menu v rootu.
- Při kopírování datových tabulek jsou nyní tabulky nabízeny v seznamu seskupené dle db připojení.
- Optimalizace výkonu.
- Značný refaktoring třídy CopyPage:
- Přejmenováno a přesunuto do \Unis\Services\Page\PageCopier
- Pro snadnější vytváření instancí přes DI přidána továrna PageCopierFactory
- Ruční instancování modelů nahrazeno použitím DI containerů:
- Jelikož třída využívá téměř všechny modely, přes DI je jí předán celý container, ze kterého si načte modely pro zdrojový systém.
- Modely pro cílový systém se mi podařilo získat také pomocí DI containeru – vytvořením kopie containeru s upravenou konfigurací vedoucí do cílové db.
- Přímé dotazy do DB nahrazeny metodami modelů ve všech případech, kdy patřičný model (BaseModelFluent) pro obsluhu dané tabulky existuje.
Dynamické schema
Nová funkcionalita umožňující dynamicky měnit strukturu menu a datové schema stránek, v závislosti odkud se uživatel proklikne.
- V konfiguraci jednotlivých dataConnections lze nastavit nové možnosti pro definici dynamického schema:
dynamicSchema: '' # dynamic schema based on schemaVar from URL query, ex. 'job_%s' schemaToReplace: '' # choose which schema from the schema array to replace with dynamicSchema- Je předpokládáno, že dataConnection v základu obsahuje nějaké výchozí schema, aby bylo vůbec možné stránky administrovat. Konfigurací
schemaToReplaceje následně toto výchozí schema zaměněno za dynamické, mimo administraci.
- Je předpokládáno, že dataConnection v základu obsahuje nějaké výchozí schema, aby bylo vůbec možné stránky administrovat. Konfigurací
- V nastavení sloupce je v sekci Odkazu nová možnost poslání proměnné pro dynamické schema. Tato proměnná je následně dosazena do zástupného
%sdle konfiguracedynamicSchema. - Přidána globální proměnná
%schemaVarobsahující aktuální hodnotu proměnné pro dynamické schema, nebo ‚NULL‘ pokud žádná není. PagePresenternabízí novou metodugetSchemaVariable()pro získání hodnoty proměnné pro dynamické schema ve skriptech.- V administraci položky menu lze nyní zaškrtnout, že vyžaduje dynamické schema. Taková položka/složka se následně vůbec nezobrazí, pokud proměnná pro dynamické schema není aktuálně nastavena.
- V administraci položky menu lze nyní zaškrtnout, že vyžaduje statické schema. Taková položka/složka se následně vůbec nezobrazí, pokud je aktuálně nastavena proměnná pro dynamické schema.
- Kliknutím na složku vyžadující dynamické schema v navigátoru nebo menu lze opustit dynamické schema.
- V navigátoru je vyznačena aktuální hodnota proměnné pro dynamické schema.
Obecná vylepšení
- Do správy uživatelů přidáno datum posledního přihlášení uživatele.
- Doplněna plná podpora multi-schema search path u datových připojení.
- V nastavení stránky je nově možné definovat odkaz na uživatelskou dokumentaci. Uživateli se zobrazí jako tlačítko „Nápověda“ vpravo nahoře.
- Položky menu lze nyní v administraci skrýt/zobrazit ikonou oka, nebo ve formuláři editace menu. Skryté položky se nezobrazí žádným uživatelům v postranním menu, avšak lze takové položky nastavovat jako cíl prokliku ze sloupce. Uživatel po takovémto prokliku uvidí v navigátoru celou cestu ke „skrytému“ menu a neztratí tedy orientaci, kde v aplikaci se zrovna nachází.
- V administraci parametrů menu/stránky lze nyní u jednotlivých parametrů volit konkrétní roli, pro kterou bude aplikován.
- Při nastavení parametru aplikovaného pouze pro určitou roli není takový parametr propagován nadřazeným rolím v hierarchii.
- Přidána nová pokročilá možnost do nastavení sloupce, pomocí níž lze vynutit řazení NULL hodnot na začátek nebo na konec. K dispozici pouze na PostgreSQL.
- Z důvodu optimalizace výkonu i vyšší relevance výsledků se nyní administrace stránky typu detail načítá vyfiltrovaná podle poslední hodnoty z pageFilter seznamu (pokud je nějaký nastaven). Zároveň se nyní v administraci projevuje nastavené řazení dat.
- Umožněno nastavení šířky widgetu (default
100%) a výšky widgetu (defaultauto).- Implementováno pouze pro widgety typu Samostatný.
- Widgety je nyní možné zobrazit vedle sebe, pokud se vejdou na obrazovku dle nastavené velikosti widgetů.
- Přidány nové šablony widgetu pro rozpadnutí „one-to-one“ na dvě až pět tabulek:
one-to-one-5chunks.latteone-to-one-4chunks.latteone-to-one-3chunks.latteone-to-one-2chunks.latte
- Přidána nová šablona widgetu pro graf
chart-area.latte - Menší vylepšení formuláře widgetu:
- Typ je nyní radioList.
- Pořadí je nyní povinné a číselné.
- Přidána možnost zapsat popis uživatelské role/skupiny.
- Přidána administrační stránka pro snadnou správu přiřazení rolí k dané skupině uživatelů.
- Umožněno nastavení oprávnění pro Log Událostí, stejným způsobem jako umožňuje Správa Uživatelů.
- Uživateli umožněno stažení lokální složky přičemž se on-the-fly zabalí do ZIP archivu. Povoleno pouze pro složky pod
UPLOADS_DIR. - Zlepšena použitelnost GROUP BY na PostgreSQL:
- Logika SELECTu sloupců specificky upravena pro vyřešení nejednoznačnosti:
CASE WHEN MAX(sloupec) = MIN(sloupec) THEN MAX(sloupec) END
- Hodnota sloupce se tedy ve výsledku objeví pouze pokud mají všechny záznamy v daném GROUP totožnou hodnotu, jinak sloupec vrátí NULL. Tím je dosažena jednoznačnost dotazu a nemůže se náhodně vrátit neočekávaná hodnota, takže PostgreSQL dotaz zpracuje.
- Logika SELECTu sloupců specificky upravena pro vyřešení nejednoznačnosti:
- V popisu stránky lze nyní používat systémové proměnné.
- Přidána systémová proměnná
%rolesobsahující seznam názvů rolí v uvozovkách, oddělených čárkou. Lze použít v SQL IN. - Přidána systémová proměnná
%roleIdsobsahující seznam ID rolí, oddělených čárkou. - Přidána systémová proměnná
%instanceUrl(dle nastavení z configuapp.instanceUrl). - Přidána systémová proměnná
%systemUserId(dle nového nastavení z configuapp.systemUserIddefault0). - Přidána systémová proměnná
%helpdeskUrl(dle nového nastavení z configuapp.helpdeskUrldefault#). - Export zdrojů dat je nyní vždy spouštěn jako úloha na pozadí.
- Umožněno použití checkboxu ve formulářovém prvku nad sloupcem číselného/textového typu. Hodnota checkboxu je předána databázi jako string
'1'nebo'0', což je kompatibilní s datovými typy čísel/stringů/booleanů na PostgreSQL i MySQL. - Přidány uživatelsky-srozumitelné názvy stavů, typů i podtypů událostí.
- Názvy stránek v nadpisech v administraci se nyní vypisují kurzívou.
- Přidány odkazy do relevantní administrace ke každé závislosti uložených SQL.
- Akce typu „Obecná akce“ a „Hromadná obecná akce“ se nyní ve výchozím stavu ukládají jako INSERT, namísto chybové hlášky.
- V nastavení akcí typu obecná akce a hromadná obecná akce lze využít novou možnost „Bezpečná akce (nemění data)“ pro určení akcí vhodných pro demo uživatele.
- Umožněno nastavení počtu zobrazených řádků množiny hodnot.
- Vícenásobný výběrový seznam (multiselect) nyní dokáže přijmout pole hodnot ve formátu CSV.
- Výchozí zpracování formuláře se nyní pokusí ukládat multiselect array jakožto JSON, namísto vyhození chyby.
- Přidána podpora pro FULL JOIN ve zdrojích dat (PostgreSQL).
- Integrována JS knihovna Pannellum pro zobrazení panoramat.
- Do nastavení sloupce i do nastavení formulářového prvku přidána zaškrtávací možnost „Vědecký zápis čísel“.
- V nastavení sloupce je tato možnost považována za pokročilou a není kompatibilní s možností odsazení tisíců. Je navíc k dispozici pouze pro sloupce číselného typu.
- ActionEvent nyní ukládá případné page_id navázaného formuláře.
- Vylepšeno zkrácené zobrazení Safari UA v logu událostí.
- Do administrace oprávnění přidána sekce Zákazy. Nové definice zákazů lze přidávat stejným způsobem jako oprávnění (zaškrtnutí možnosti = zákaz).
- V sekci oprávnění jsou nyní oprávněné úkony vyznačeny fajfkou (namísto jedničky). V sekci zákazů jsou zakázané úkony vyznačeny křížkem.
- Poznámka: definování zákazů aktuálně není příliš užitečné, dokud není implementace nastavení globálních výchozích oprávnění.
- Indikace povinné hodnoty se nyní zobrazí také při dynamickém nastavení povinnosti prvku ve form scriptu.
Opravy
- Oprava chyby, kdy několik posledních sloupců v administraci nebylo možné posouvat, pokud má stránka nastaveny skupiny sloupců.
- Detekce fatální chyby při běhu události a její patřičné ukončení s chybovým stavem.
- Oprava regrese speciální role „demo“, která přestala fungovat od verze 1.10.
- Oprava JS chyby aplikace, pokud widget one-to-many na stránce typu detail obsahuje sloupec datového typu datum bez určeného formátu.
- V administraci oprávnění opraveno zobrazení nadpisu, ke které stránce se práva vztahují.
- Dořešení podpory čarových grafů:
- Barvy okrajů/čar grafů jsou nyní automaticky nastaveny na 30% tmavší barvu než nastavená barva pozadí.
- Oprava obarvení grafů majících vždy jednobarevný dataset (line/radar).
- Zrušení výplně čárového grafu.
- Oprava možnosti otevírat hromadné akce nemodálně.
- Ve Správě uživatelů zavedena následující omezení pro správce ne-administrátory:
- Nemohou nikomu přiřazovat „vývojářské“ role (dle configu
debug.developerGroups). - Nemohou nijak spravovat jiné uživatele s „vývojářskou“ rolí.
- Nemohou nikomu přiřazovat „vývojářské“ role (dle configu
- Podpora datového zdroje bez primárního klíče. Datový formulář vyhodí chybu, pokud kvůli absenci PK nemůže vykonat akci.
- Přepracování funkce „Přejmenování sloupce v databázi“:
- Přejmenovat napříč systémem, všude kde souhlasí název sloupce + název tabulky + connection.
- Stejným způsobem přejmenovat také formulářové prvky.
- Povoleno na MySQL, pokud verze podporuje RENAME COLUMN.
- Po dokončení operace je zavřeno modální okno.
- Logika přesunuta do nové service ColumnManager s využitím DI.
- Pokud je dynamická výchozí hodnota skrytého formulářového prvku vyhodnocena jako prázdná, chybně zůstával v prvku nevyhodnocený výraz. Opraveno, aby byla výsledná hodnota prázdná.
- Oprava řízení názvu exportovaného XLSX ze šablony dle nastavení hint_record / hint_column.
- Formátovací kódy
%Ma%Snastavené ve formátu datumu sloupce jsou nyní korektně převáděny naMMaSSv Excelových výstupech. - Do výpisu závislostí uložených SQL doplněno vlastní řazení a vlastní formulářové prvky.
- Datový formulář již nevyvolává událost zrušení akce.
- Pokud je v callbacku datového formuláře nebo akce ukončen běh aplikace (např. redirect), navázaná událost nyní považuje tento stav za úspěch.
- Pokud skript akce skončí chybou, uživateli se případný formulář akce již vůbec nezobrazí.
- Oprava možnosti explicitně zrušit zpracovávání formulářového prvku jakožto geometrický.
- Parametrizovaný filtr bez závislostí nyní umí přijmout relační data.
- Zjednodušena logika automatického převodu datového typu při dělení v dotazech (PostgreSQL). Nyní je prováděn výhradně na dosazených sloupcích a jen když nejsou obaleny žádným dalším voláním funkcí, aby nedocházelo k dosazení CASTu na nesmyslné místo (typicky cesta souboru obsahující lomítka).
- U následující formulářů opraveno, aby se případná chyba vypsala jako chyba a také zalogovala:
- Page
- Menu
- RoleUsers
- UserGroupUsers
- RoleUserGroups
- Hromadná akce nyní zapisuje chybovou hlášku skriptu (Throwable) do event logu.
- Oprava regrese, kdy nebylo možné použít dynamické sloupce pro GROUP BY.
- Oprava administrace skupiny sloupců, pokud došlo ke skrytí některých jejích sloupců.
- Oprava administrace práva menu s externím url.
- Oprava vyhodnocení proměnných uvnitř dotazu %sqlId v parametru nebo filtru.
- Sloupec typu image nyní umí otevřít obrázek přes lokální cestu mimo www.
- Při zrušení prokliku na sloupci je nyní zároveň zrušeno nastavení link_column_id.
- Ve výběrových seznamech tříd ze skriptů se již nenabízí nepoužitelné abstraktní třídy.
- Vylepšen formát názvu indexů nad cachovanou tabulkou dat.
- Nepokoušet se propsat NULL hodnoty relací do formuláře přidání záznamu.
- Oprava ztráty popisku hodnoty při opětovném volání
BaseDataForm::setControlsReadonly. - Oprava zneplatnění cache metadat sloupců při změnách skupiny sloupců.
Zavržené funkcionality
- Zrušen typ stránky
detail_v2pro widgety používající existující stránky. Vývoj je již dlouhodobě zastaven a není v plánu dosavadní implementaci dokončit. Pokud bychom se k původní myšlence chtěli vrátit, tak spíše cestou rozšíření funkcionality existujícího typu stránkydetail. - Zrušena možnost nastavení sloupců dle role. Tato funkcionalita není nikde využívána a její kód byl značně ztrouchnivělý; administrace ani nebyla funkční. Další využití se nepředpokládá, samotná myšlenka zaváděla do systému přílišnou komplexitu pro administrátora aplikace.
- Zrušeno sql_mode_compatible pro MySQL sloupce (původní logika volání SQL pro každý řádek dat).
- Zrušena možnost nastavení agregace nad sloupcem pomocí vlastního SQL. Tato funkcionalita nikdy nebyla využita a ve stávající formě ani nedává moc smysl. Původní zadání zřejmě nebylo správně pochopeno a skutečné řešení později implementováno jakožto agregace unikátní podle určeného sloupce.
- Zrušeno systémové nastavení favicon_background_color (nepoužívané).
- Zrušeny konfigurační parametry app.title, app.logoSmall, app.logoSmallLink (nepoužívané).
Poznámky pro vývojáře
- Minimální podporovaná verze php navýšena ze 7.0 na 7.4, composer knihovny patřičně aktualizovány.
- Distribuce nyní obsahuje Dockerfile, docker-compose.yml a readme pro snadné spuštění v prostředí Dockeru.
- Dockerfile nabízí dvě stage prod/debug, přičemž debug je obohacen o podporu xdebug integrace na portu 9003.
- Databázová služba momentálně není součástí.
- Zavedení pravidel Easy Coding Standard.
- Zavedení .editorconfig pravidel.
- V konfigurační sekci
filelze nyní určit povolené přípony stahovaných souborů a povolená umístění stahovaných souborů. - Funkce
BaseDataForm::savenyní vrací objekt typu\Unis\Tools\DataFormResult, pomocí kterého lze vytáhnout informace o uložených řádcích dat.- Řádky dat jsou vraceny v běžném php poli, ne jako
\Dibi\Row - Pokud formulář obsahuje chyby, obsah výsledného pole dat je prázdný
- Řádky dat jsou vraceny v běžném php poli, ne jako
- V kódu vlastních skriptů lze přejít do pozadí metodou
BaseDataForm::continueRequestInBackground, nebo mimo kontext formulářeBasePresenter::continueRequestInBackground.- Po přechodu úlohy na pozadí nemá metoda
BasePresenter::flashMessagežádný efekt. Obecně je nutno počítat s tím, že není k dispozici session. - Event objekt nabízí pomocnou metodu dispatchProgressInterval pro snadnou aktualizaci procentuálního průběhu úlohy.
- Po přechodu úlohy na pozadí nemá metoda
- Do
BaseDataFormpřidána metodasetControlsHidden, umožňující skrýt jeden či více prvků formuláře, včetně jejich labelu. Hodnoty skryté tímto způsobem zůstávají součástí odesílaných dat formuláře a lze s nimi následně pracovat v callbacku. - Metoda
BaseDataForm::savenyní rozpozná, že callback již zprocesoval nahraný soubor a nepokouší se jej zprocesovat podruhé. - Ve form skriptu umožněno vytvářet tlačítka s vlastní php logikou:
- Pokud je formulář odeslán custom tlačítkem, spustí se pouze specifický kód tlačítka a formulář je překreslen (klasicky včetně form skriptu). Žádný callback ani výchozí uložení dat formuláře v tomto případě není spuštěno.
- Příklad vytvoření vlastního tlačítka uvnitř form skriptu:
$onClick = function () use ($form) { $form['nazev']->setValue('test3'); }; $testCustomSubmit = $form->addSubmit('test', 'Test'); $testCustomSubmit->onClick[] = $onClick; // executed only when form renders without validation errors $testCustomSubmit->onInvalidClick[] = $onClick; // executed even when form renders with validation errors
- Vylepšena integrace Nette mail, přidána podpora SMTP:
- Zaimplementován
MailExtension, který zaregistruje vlastní třídySendmailMailer/SmtpMailerz UNISu.- Díky tomu lze nyní využívat standardní konfigurační sekci
maildle dokumentace Nette: https://doc.nette.org/cs/mail/2.x#toc-konfigurace
- Díky tomu lze nyní využívat standardní konfigurační sekci
- Vytvořen interface
\Unis\Services\Mail\IMailer, rozšiřující původní\Nette\Mail\IMailer. - Továrna
SendmailMailerFactoryje zrušena a v kódu nahrazena vyžádáním přímo\Unis\Services\Mail\IMailer. - Metoda
setEventIdv Maileru je zrušena a nahrazena předáváním Eventu až jako argumentu dosend. Díky tomu nejsou potřeba továrny a přes DI lze používat rovnou třídy Mailerů. Ve scripts patřičně upraveno. - V PagePresenteru/BaseDataFormu nahrazena metoda
getSendmailMailerzagetMailervracející\Unis\Services\Mail\IMailer. - Složka/namespace
Unis\Tools\Mailpřesunuta jakoUnis\Services\Mail.
- Zaimplementován
- CliPresenter nabízí novou metodu
runJobByClassName, které lze předat argumentclassNamelibovolné třídy implementujícíJobInterface. Pokud se nejedná o Job poskytovaný jádrem UNISu, je nutno předat kompletní název třídy včetně namespace. V logu událostí se spuštění úlohy touto metodou prezentuje jako typ cron, bez návaznosti na konkrétní plánovanou úlohu.- Příklad použití:
php ./www/index.php Cli:runJobByClassName --className=UpdateFromPreprodJob
- Příklad použití:
- Do jádra zaimplementován
DeploySelfUpdateJobpro načtení aktualizací z preprodukce. VDeploymentManagerošetřeno, aby bylo možné update pouštět pouze v prostředí produkce. - Přidána knihovna symfony/process pro snadné spouštění externích procesů.
- Tabulka sys_printings je zrušena a přemigrována do centrální sys_event. Do sys_event přidán sloupec print_template_id, identifikující použitou šablonu tisku.
- FilePresenter nyní umožňuje určit název souboru zobrazený uživateli (při download i open).
- V poli config parametrů containeru jsou nyní vždy vyhodnoceny \Nette\DI\Statement
- RobotLoader nyní automaticky detekuje nově přidané třídy.
- Opraveno chytání Exception -> Throwable ve skriptech.
- V configu lze nyní zapnout klikatelnou cestu menu pomocí
app.useNavigator - V configu lze nyní měnit barvu horního navbaru pomocí
app.navbarColor - V configu lze nyní zapnout červený pruh navrchu označující testovací prostředí pomocí
app.testEnv - V configu lze nyní vypnout zobrazování odkazu do uživatelského nastavení stránky pomocí
app.showPageSettingsLink - V configu lze nyní vypnout uživateli možnost nastavení vlastní domovské stránky pomocí
app.allowCustomHomepage - V configu lze nyní vypnout novou funkcionalitu zajíždění horní lišty pomocí
app.dynamicallyDisplayedNavbar - V configu lze nyní zapnout funkcionalitu obecného exportu do PDF pomocí
app.enableExportPdf(výchozí vypnuté). - Přidán konfigurační parametr
environment.prod.additionalDestinationsobsahující pole configů připojení, kam se má prod deploy pokusit nahrát tabulky. - V rámci skriptu zpracování cron úlohy lze nyní změnit stav Eventu.
- Odstraněn kód zrušeného projektu Mapa2.
- Zastaralá knihovna
phayes/geophpnahrazena zafuniq/geophp, s opraveným autoloadingem tříd. - Provedena aktualizace jQuery:
- jQuery 3.5.1 -> 3.7.0
- jQuery Migrate 3.3.2 -> 3.4.0
- jQuery UI 1.12.1 -> 1.13.2
Exception handling
- Uživateli vypisovat pouze rozpoznané typy Exception, které lze bezpečně vypsat.
- Pokud je uživatel administrátorem UNISu, vypisování chyb všech typů je pro něj považováno za bezpečné.
- Typ
\Nette\InvalidStateExceptionje vždy považován za bezpečný. Ve skriptech může být využit buď napřímo, nebo dále rozdělen do nových, zděděných typů.- Ve scripts při chytání jiného typu Exception a vyhození
\Nette\InvalidStateExceptionje potřeba předat do konstruktoru jako třetí parametr předchozí chytaný Exception, aby nebyl ztracen původní kontext vyvolané chyby.
- Ve scripts při chytání jiného typu Exception a vyhození
- Typ
\Dibi\Exceptionje někdy rozeznán dle specifické message (#14929). - Pokud typ není rozpoznán, zaloguje se daný Exception a aplikace vypíše pouze obecnou chybovou hlášku:
Při zpracování došlo k chybě.
Event callbacks
Přepracováno na DI, využita standardizovaná knihovna symfony/event-dispatcher.
- UNIS nyní přímo vyžaduje knihovnu
symfony/event-dispatcherv5, jež byla dosud jen nepřímou závislostí. - Nově lze definovat „Event Subscriber“ třídy dle dokumentace Symfony: https://symfony.com/doc/5.x/event_dispatcher.html#creating-an-event-subscriber
- Tyto třídy je nutno zaregistrovat jako služby do configu a mohou si nechat předávat závislosti z DIC, stejně jako ostatní služby:
services: # register event subscribers - UnisScripts\Services\Event\Esp\MenuUpdaterEventSubscriber - Předpokládané umístění „Event Subscriber“ tříd ve scripts je
app/services/Event(případně další organizace do podsložek). - Stejně jako dosud je možné poslouchat všechny typy eventů dle tříd odvozených od
Unis\Tools\Event\Event. Typ poslouchaného eventu je určen názvem příslušnéEventtřídy:public static function getSubscribedEvents(): array { return [ SyncEvent::class => [ ['invalidateCache', 0], ], ]; } - Nově lze poslouchat pouze úspěšně provedené eventy, stav poslouchaného eventu se tudíž nijak nedefinuje.
- Tyto třídy je nutno zaregistrovat jako služby do configu a mohou si nechat předávat závislosti z DIC, stejně jako ostatní služby:
- Konfigurační sekce
parameters.eventzcela zrušena.- Dosud existoval jediný custom event callback
GisaCommonEvents::syncOk, který však nebyl aktivní ani funkční. Přesto jsem se jej pokusil přepsat do nové funkční verze jakoSharedDbSyncEventSubscriber(neotestováno).
- Dosud existoval jediný custom event callback
- Interně používané event callbacky přepsány do nového stylu (
MatviewRefreshEventSubscriber,SyncEventSubscriber).- Dále invalidace cache po deploySelfUpdate přesunuta do
SyncEventSubscriber.
- Dále invalidace cache po deploySelfUpdate přesunuta do
- V rámci refaktoringu přesunuta veškerá obsluha eventů z
AdminSyncPresenterdoTableSynchronizeraDeploymentManager.
SSO
- SSO konfigurace nyní podporuje standard OIDC (OpenID Connect). Nové konfigurační možnosti:
auth: sso: authenticationHttpMethod: GET # GET|POST authenticationParameters: [] # key/value array of parameters sent to authenticationUrl accessTokenName: access_token # name of token granted for accessing userData userDataUrl: # url where to retrieve user info (null if already retrieved from authenticationUrl)- Umožní odeslat autentifikační požadavek metodou POST a doplnit libovolné parametry.
- Dále je možné specifikovat zvlášť endpoint
userDataUrl, který poskytne data na základě tokenu předaného při autentifikaci (accessTokenName). - Původní možnost
userDataKeynyní může býtnull– pro případ, že data nejsou zanořena do žádného klíče.
- Zavedena nová konfigurační možnost
auth.sso.logoutUrl. Pokud je hodnota nastavena, uživatel je přesměrován na danou URL po dokončení UNIS logout procesu. - V configu lze nyní vypnout kontrolu SSO certifikátu pomocí
auth.sso.sslVerifyCertificate- Přihlašování SSO GET autentizací nyní používá jednotně CURL a umožňuje uplatnit konfigurační možnost
sslVerifyCertificate
- Přihlašování SSO GET autentizací nyní používá jednotně CURL a umožňuje uplatnit konfigurační možnost
- Umožněno spárování uživatele dle username. Nová posloupnost párování:
- Dle SSO ID
- Dle username
- Dle emailu
- Zavedena nová konfigurační možnost
auth.sso.autoCreateUser, default false. Pokud je možnost povolena, každý neznámý SSO uživatel bude automaticky přidán do lokální tabulky uživatelů.
Refaktoring
- Odstraněna řada použití zavrženého Nette\Environment.
- Refaktorován DefaultPresenter, přihlašovací formulář vyčleněn do vlastní třídy LoginForm.
- Formulář rolí/skupin uživatele vyčleněn z UserPresenter do vlastní třídy UserRelationshipsForm
- Sjednocení layout šablon, využito dědění blocků namísto duplikování kódu.
- Logika zpracování odkazů v datových tabulkách přepracována z
dataCell.lattedo TableRenderer. Externí odkazy a lokální relativní odkazy již neprocházejí přes „proxy“ FilePresenter; jsou realizovány přímým url. - Logika zpracování odkazů na inline akce přesunuta z PagePresenter do vhodnějšího TableRenderer.
- Logika podmíněného formátování přesunuta z TableRenderer do vhodnějšího BaseSql.
- DetailSql sloučeno do BaseSql pro konzistentní chování datových sad.
- Logika práce se setem sloupců stránky přesunuta z presenterů do nové třídy ColumnSet.
- Logika high-level práce se stránkou zkonsolidována do nové třídy PageService (+factory).
- Logika relativně high-level práce s daty stránky konsolidována z presenterů do nové služby PageDataManager.
- Logika práce s řazením dat stránky přesunuta do nové služby PageOrderManager.
- Logika práce s akcí zobrazit vybrané záznamy stránky přesunuta do nové služby PageMassViewManager.
- Translator je nyní vytvářen pomocí služby TranslatorFactory.
- Logika zjištění správného titulku sloupce je nyní již součástí cachovaného dotazu na metadata sloupců.
- Logika spuštění Jobů vyčleněna do nové služby
JobDispatcher, která nabízí pohodlnou metodudispatchJobByClassName. - Přidán latte filter „parseVariables“ pro vyhodnocení systémových proměnných aplikace.
- dibi::getInsertId nahrazeno za spolehlivější
RETURNING, jež podporuje triggery a nevyžaduje dotaz navíc. - Odstraněny nepoužívané soubory z gis/mapserv/map_static
- Refaktorování SqlParamsBuilder na DI:
- DI realizováno skrze factory třídu
SqlParamsBuilderFactory - Obecně poměrně značný refactoring kódu
- Revize všech komentářů v kódu
- Přidány nové value třídy
SqlParamGroupParamaSqlParamCustomFilter
- DI realizováno skrze factory třídu
- Následující třídy seskupeny do nového namespace Unis\Services\Database:
- DataConnectionManager
- DeploymentManager
- RecordDeleter
- SharedSchemaManager
- TemporaryTableManager
- DataSourceManager (nové) – detekuje změny a aktualizuje ds dle databáze (vyčleněno z AbstractDataSourceColumn)
- SystemConnectionManager (nové) – spravuje system/shared connection (vyčleněno z Database)
- TableSynchronizer (nové) – nahrazuje starý TableComparator

