Zadání soutěžních úloh

Kategorie programování webu

25. až 27. dubna 2019

Soutěž v programování – 33. ročník

Krajské kolo 2018/2019

Responzivní web
Rodokmen

Úlohy můžete řešit v libovolném pořadí a samozřejmě je nemusíte vyřešit všechny. Počet bodů za každou úlohu je uveden přímo v jejím zadání. Hodnotí se shoda se zadáním, funkčnost, dodržování webových standardů a přehlednost zdrojového kódu.

Na řešení úloh máte 4 hodiny čistého času.

Před zahájením soutěže vám pořadatel oznámí, kde najdete testovací soubory a kam máte ukládat řešení úloh. Kompletní řešení každé úlohy (soubory HTML, CSS, obrázky, Javascript) uložte do samostatného podadresáře nazvaného jménem úlohy (např. rodokmen). Stránku s řešením vždy pojmenujte index.html a uložte v kódování UTF-8.

Při zápisu HTML a CSS kódu dodržujte webové standardy. Řešení by mělo fungovat ve všech běžně dostupných prohlížečích.

Při řešení můžete používat frontendové technologie HTML, CSS a JavaScript. Všechny zdrojové kódy musíte napsat sami v průběhu soutěže. Řešení úlohy smí využívat pouze běžně dostupná API současných webových prohlížečů. Preprocesory zdrojového kódu (jako např. Babel, Typescript, Sass, Less, …) jsou povoleny, odevzdávejte pak jak vámi napsaný vstupní kód, tak i vygenerovaný výsledek. Snažte se, aby vygenerovaný výsledek co nejlépe odpovídal zdrojovému souboru, neprovádějte minifikaci nebo obfuskaci.

Není povoleno používat knihovny, frameworky nebo kompilátory, které vyžadují runtime podporu prohlížeče (např. jQuery, Bootstrap, React, mono-wasm, …). Zdůrazňujeme, že od letošního ročníku je zakázáno používat jQuery.


Responzivní web

max. 30 bodů (15 rozvržení stránky, 15 vzhled prvků)

Máme skvělého emailového klienta, který umí zobrazovat emaily v prohlížeči. Aby nebyl tak úplně stejný jaky všechny ostatní, tak má i podporu pro zobrazování zpráv z Redditu a možná i dalších zdrojů. Na tom ale teď nesejde, potřebujeme aby stránka vypadala perfektně na zařízeních všeho druhu – počítačích, mobilech, tabletech, čtečkách ebooků a kdo ví čem ještě.

V adresáři responzivni-web máte k úloze přiložené soubory style.css a index.html. Obsahují základní rozhraní pro počítač, od vás potřebujeme doladit jeho podobu a přispůsobit jej pro mobilní obrazovky. Měnit můžete jenom soubor style.css, v HTML nic neměňte – je to jenom ukázka, v provozu se bude HTML generovat dynamicky serverem. Měnit jeho strukturu je bohužel velmi komplikované, protože jsme zpackali zálohy a zdrojáky nám odnesla velká voda. Hlavním cílem aplikace je zprávy zobrazovat – pár tlačítek sice obsahuje, ale nic zatím nedělají. To je v pořádku, bude to umět až Enterprise verze, která je předražená a naštěstí si ji zatím nikdo nekoupil.

Rozvržení stránky

Stránka má aktuálně tři panely vedle sebe: vlevo se dají vybírat složky, uprostřed jsou zobrazené zprávy a vpravo je panel s blížícími se událostmi (bez toho by to nebyl emailový klient). Takto má stránka vypadat na počítači s velkým displejem a tam to rozvržení nijak zásadně neměňte.

Na trochu menším displeji (tzn. větší tablet nebo menší notebook, řekněme širší než 1000px) je možné ušetřit trochu místa tím, že dáme složky (levý panel) a události (pravý panel) pod sebe. Složky jsou důležitější, ty budou nad událostmi a oba panely od sebe budou graficky odlišeny (můžou mít například pozadí v jiném odstínu bílé). Navíc panel trochu zmenšete.

Na menších obrazovkách už nebudeme vůbec zobrazovat panel s událostmi a panel se složkami přesuneme do hlavičky. Pokud je obrazovka ještě rozumně široká (menší tablety), složky nebudeme zobrazovat pod sebou ale vedle sebe, aby panel nebyl zbytečně dlouhý. Navíc se při skrolování panel zafixuje v horní části obrazovky, aby šlo složky přepínat ať je uživatel kdekoliv. Pokud se jedná o mobil (má ještě menší displej), tak se panel fixovat nahoře nebude, aby vůbec zbylo nějaké místo na zprávy. Složky zase chceme srovnané pod sebou, protože stejně nemáme mnoho horizontálního prostoru.

V každém případě by se aplikace měla přizpůsobit velikosti displeje (nebo okna prohlížeče) a prohlížeč by nikdy neměl uživateli nabídnout horizontální skrolování.

Vzhled prvků

Pak bychom chtěli v aplikaci doladit několik vizuálních detailů:

Některé zprávy mají u adresáta napsané jméno i adresu, jiné mají jen adresu. Pokud jsou tam oba, tak chceme aby se jméno zobrazovalo tučně a adresa byla šedivá a ve špičatých závorkách (například takto Moje Jméno <mujemail@domena.cz>). V tomto případě je navíc plýtváním adresu zobrazovat na malých obrazovkách (mobily a malé tablety), tak jí prosím skryjte úplně. Pokud není jméno uvedené, pak chceme aby adresa byla tučně a nebyla ve špičatých závorkách.

Předmět zprávy by měl být napsaný kapitálkami a trochu větším písmem (cca o čtvrtinu).

Datum a čas odeslání zprávy by měly být šedivé (stejně jako adresa) a měly by být při pravém okraji stránky. Stejně tak by se měl zobrazovat i čas události v pravém panelu, pokud je zadaný. Čas by měl být navíc napsaný menším písmem (cca tříčtvrtinové velikosti) a měl by být zarovaný s horním okrajem.

V hlavním panelu jsou jednotlivé zprávy vizuálně rozděleny do bločků s dělící čárou a po najetí myší se zvýrazní. Chtěli bychom aby se stejně chovalo i menu se složkami a panel s událostmi. Konkrétně, zařiďte prosím čáry mezi složkami a zvýraznění složky a události po najetí myší. Také zařiďte ať menu se složkami vypadá víceméně stejně jako menu s událostmi (podobné mezery mezi bloky, písma apod). Když se složka vybere klinutím, tak má mít modré pozadí.

Aby se nemísil předmět zprávy s datem odeslání a odesílatelem, tak na menších obrazovkách dejte předmět na jiný řádek než odesílatele (přibližně na tabletech a menších, ale otestujte si sami kdy vám připadá nejlepší je oddělit).


Rodokmen

max. 50 bodů

Vytvořte aplikaci pro zobrazení rodokmenu. V této úloze je zakázáno používat předpřipravené obrázky. Pro zobrazení piktogramů a ikon zvolte symboly Unicode.

Úloha je rozdělena na dvě části. V první budete vytvářet statickou stránku, v druhé pak aplikaci oživíte a umožníte uživateli zobrazený rodokmen upravovat. Za statickou část dostanete až 15 bodů, za dynamickou pak až 35. Úlohu není nutno řešit popořadě – jednotlivé části jsou hodnoceny víceméně nezávisle.

Pokud nebudete dělat dynamickou část, zobrazte umělý rodokmen o alespoň třech generacích, na kterém demonstrujete všechny požadavky zmíněné v zadání. Pamatujte, že nelze přidělit body za splnění požadavku, který není vidět nebo nelze ověřit!

Statická část

Stránka bude obsahovat v levém horním rohu nadpis „Rodokmen“.

Příklad zobrazení:

Příklad rodokmenu.

Jednotlivé osoby budou reprezentovány pomocí zaoblených obdélníků s viditelným ohraničením. Obdélník bude obsahovat tři řádky textu s těmito informacemi: 1. jméno, 2. datum narození a úmrtí, 3. místo bydliště. Na prvním řádku bude větším písmem celé jméno dané osoby zarovnané na střed. Poté budou následovat zbylé dva řádky s menším písmem. Druhý řádek bude rozdělen na poloviny a v první bude na střed zarovnané datum narození a v druhé bude na střed zarovnané datum úmrtí. Pokud daná osoba ještě žije, tak řádek nebude rozdělen na poloviny a bude obsahovat pouze datum narození zarovnané na střed celého řádku. Datumy budou doplněny o jednoduché piktogramy znázorňující datum narození a datum úmrtí (např. hvězdička a křížek). Na posledním řádku bude na střed zarovnané místo bydliště. Obdélník má zakulacené rohy a všechny obdélníky mají stejnou výšku.

Příbuzenské vztahy budou v rodokmenu znázorněny rovnými čárami propojující dané osoby. Čáry nesmí procházet přes obdélník nebo jím být překrývány. Čáry jsou lomené, každý úsek je rovnoběžný s osami. Body napojení jsou určeny následovně:

Pro zobrazení vztahu dvou rodičů a dítěte nejprve propojte rovnoběžnou čarou rodiče, následně v polovině vodorovné čáry oddělte svislou čáru směrem dolů, kde zobrazte dítě. Pokud je dětí více, ze svislé čáry oddělte vodorovnou, na kterou teprve děti napojíte.

Osoby v rodokmenu zobrazujte tak, aby příslušníci jedné generace byli vždy ve stejné výšce.

Rodokmen by měl být vykreslený vektorově. Měla by být zachována schopnost škálování stránky v prohlížeči – ať už změnou velikosti písma nebo celé stránky. Velikosti textu by měly respektovat uživatelské nastavení velikosti písma (tj. vyhněte se absolutním velikostem). Text by mělo být možné vybrat myší a zkopírovat do schránky.

Pokud je rodokmen větší než dostupný prostor na obrazovce, umožněte pohyb pomocí scrollbarů. Zajistěte ale, aby se pomocí scrollbarů hýbal pouze rodokmen sám – nadpis „Rodokmen“ musí být vždy v levém horním rohu zobrazené části stránky.

Dynamická část

Pohyb

Umožněte pohyb po rodokmenu jako po mapě – kliknutím myši do prázdného místa dojde k „uchopení“ bodu rodokmenu a tažením myši se bude celý rodokmen pohybovat. Musí být možné část rodokmenu vysunout mimo viditelnou oblast stránky a zpět. Stránka obsahující rodokmen tedy bude obsahovat scrollbary a možnost posouvat rodokmen pomocí uchopení myší.

Úpravy osob

Umožněte osoby v rodokmenu živě upravovat. Pro úpravy zobrazte na každém obdélníčku odkaz „upravit“, příp. znak tužky (✎) nebo něco podobného. Po kliknutí se stránka rozdělí na dvě poloviny: v levé zůstane rodokmen, v pravé se zobrazí okno s formulářem pro úpravu osoby. Rozdělení nesmí pohnout s rodokmenem (pravá polovina bude tedy zakryta oknem pro úpravy). Zobrazení okna animujte tak, že se okno vysune z pravého okraje. Zvolte takovou rychlost animace, aby byla patrná, ale uživatele neotravovala přílišnou délkou.

Formulář obsahuje pouze prvky zobrazené v rodokmenu: jméno, datum narození a úmrtí, místo bydliště. Navíc pak tlačítko k uzavření formuláře – křížek v pravém horním rohu. Zavření okna animujte opětovným zasunutím do pravého okraje.

Změny ve formuláři se živě (s každou změnou písmene) projevují v rodokmenu v levé polovině.

Perzistence

Rodokmen uschovávejte do libovolného úložiště prohlížeče tak, aby při opětovném načtení stránky aplikace zobrazila rodokmen ve stavu, ve kterém byl před uzavřením okna – tj. nejen data rodokmenu, ale i pozice osob a pohled na rodokmen.

Úpravy struktury rodokmenu

Umožněte uživateli přesouvat uzly v rodokmenu myší. Nad pravým horním rohem každého obdélníčku zobrazte šipku (⬌), za kterou lze obdélníček uchopit a přesouvat ve vodorovném směru. Poloha ve svislém směru je dána generací. Díky této možnosti se může stát, že se budou čáry překrývat – tento problém neřešte. Rozmístění uzlů, aby se čáry nekřížily, je starost uživatele. Nikdy by ale čáry neměly překrývat obdélníky.

Umožněte přidávat osoby do rodokmenu (přesný popis přidávání následuje v několik dalších odstavcích).

Aplikace začne tím, že zobrazí rámeček pro jednoho člověka, ostatní lidé se do rodokmenu přidají pomocí vazeb na tuto osobu (a její příbuzné) – rodokmen tedy bude vždy souvislý. Zároveň nebude možno přidávat rozpadlé vztahy – každý bude mít vždy nejvýše jednoho partnera. Také není nutno řešit případy, kdy rodokmen není strom (v grafové terminologii) – tj. každé dvě osoby v rodokmenu jsou příbuzné právě jednou cestou.

Součástí formuláře k úpravě člověka budou tlačítka k přidání příbuzných. Některá tlačítka ale můžou být zakázaná – při najetí myší zobrazte důvod zakázání (např. v tooltipu „Partner již existuje.“). Pokud je důvodů více, zobrazte libovolný z nich.

Kliknutím na tlačítko k přidání příbuzného se přidá osoba do zobrazeného rodokmenu. Při přidání předpokládejte existenci ostatních vztahů: přidání druhého rodiče dítěte má stejný efekt, jako přidání partnera rodiče. Podobně, přidání druhého a dalšího dítěte má stejný efekt jako přidání sourozence.

Po přidání formulář přejde k úpravám nově vzniklé osoby.

Umožněte osoby mazat – ovšem pouze v případě, že se jejich odstraněním rodokmen nerozpadne na oddělené části. Také nesmí být možné odstranit poslední osobu z rodokmenu (pozor, poslední osoba nemusí nutně být tou původní). Pokud je možné osobu za těchto podmínek odstranit, součástí formuláře pro úpravy je tlačítko „odstranit“. Tlačítko podbarvěte červeně. Po kliknutí na něj dojde k odstranění osoby z rodokmenu a uzavření okna pro úpravy.

Pokud není možné osobu odstranit, zobrazte tlačítko „odstranit“ jako zakázané. Po najetí myši se uživateli zobrazí libovolný konkrétní důvod (např. rodokmen by se rozpadl.)