Hodnocení 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

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).

Hodnocení

Úkolem bylo napsat CSS styly pro připraveného HTML, do kterého nemají soutěžící šahat. Na hodnocení si do řešení zkopírujte soubory web/responzivni-web/puvodni.html a web/responzivni-web/testovaci.html a funkčnost testujte na všech třech (tedy včetně index.html, který dostal/a soutěžící). Pokud nějaká vlastnost bude fungovat jen v nějakých testovacích souborech, strhněte body lineárně (speciálně, pokud si soutěžící upravil/a index.html aby to rozfungoval/a, tak dostane třetinu bodů).

Jádrem úlohy je práce s různě velkými displeji. Pro hodnocení tohoto aspektu si můžete otevřít devtools (většinou na klávese F12) a přepnout do mobilního simulátoru ("Responsive Design Mode" ve Firefoxu nebo "Toogle Device Toolbar" v Chrome) nebo prostě vzít okno prohlížeče a zmenšovat/zvětšovat ho. Devtools vám nicméně umožní otestovat i větší obrazovku než testovací počítače, zkuste je prosím použít pokud to vypadá jako že se pořád zobrazuje tabletová verze.

Základním požadavkem je, že se nerozbilo to co fungovalo, pokud nějaký z následujících bodů není splněný, tak zbytek hodnoťte jako "nesplněno":

Detaily k následujícím bodům jsou v zadání ve stejném pořadí.

Body Za co
3 Při zmenšování displeje panel s událosmi zmizí a události se zobrazí pod složkami.
2 Při zmenšování displeje se levý panel trochu změnší.
2 Pak se při zmenšování displeje levý panel zruší, události zmizí a složky se budou přepínat nahoře.
1 Panel se složkami je při určité velikosti v horizontálním módu - složky jsou zobrazené vedle sebe.
1 Panel se složkami je při určité velikosti zafixovaný - nezávisle na skrolování je navrchu obrazovky.
1 Když se obrazovka dostatečně změnší, tak panel zase přestane být zafixovaný nahoře.
5 Do šířky cca 300px (to je na začátku velikost bočního panelu) se aplikace vždy přispůsobí velikosti displeje - není vidět scrollbar ani nic nepřetéká.
1 Odesílatel je tučně
2 Pokud je uvedeno i jméno, tak je adresa odesílatele šedivá a ve špičatých závorkách.
1 Na malém displeji emailová adresa zmizí, pokud je zároveň uvedeno i jméno odesílatele.
2 Předmět je kapitálkami.
2 Čas přijetí zprávy a čas události je zarovnaný vpravo nahoře.
1 Čas přijetí zprávy a čas události je menším písmem a je šedivý.
1 Události se zvýrazňují po najetí myší.
1 Pozadí složek se zvýrazňuje po najetí myší.
2 Složky nejsou v odrážkovém seznamu, ale v "boxech" podobně jako události a zprávy.
1 Složky jsou oddělené horizontální čárou (oddělené => čára není pod poslední ani nad první složkou).
1 Box s vybranou složkou má modré pozadí na celé svojí ploše ploše (tedy nemá jiné než modré pozadí)
1 Při určitém zmenšení displeje se předmět zprávy vždycky začne zobrazovat na jiném řádku než odesílatel a datum.

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.)

Hodnocení

Body ve statické části přidělujte podle toho, co je možno vidět. Pokud např. neexistuje blok s osobou s datem úmrtí, nepřidělujte body za rozdělení druhého řádku.

Body Za co
1 Nadpis Rodokmen je trvale v levém horním rohu
0.5 Bloky mají zaoblené rohy
0.5 Blok vždy obsahuje 3 řádky s informacemi
0.5 Text na 1. řádku je větší než na zbylých 2
1 Zemřelé osoby mají 2. řádek rozdělené na dvě poloviny (zarovnané na střed)
0.5 Datum narození a úmrtí je doplněn o piktogramy
1 Všechny osoby v každé generaci mají středy ve stejné výšce
0.5 Existují čáry mezi bloky
1 Čáry jsou lomené se souosými úseky
0.5 Čáry neprochází skrze obdélníky (a ani jimi nejsou překrývány)
1 Čára od dítěte k rodiči vychází ze středu horní strany obdélníka
1 Čára mezi partnery vede mezi středy stran
1 Čára od rodiče bez partnera k dítěti vede ze středu dolní strany
1 Čára pro dítě partnerů vychází ze středu čáry mezi partnery
1 Rodokmen je vykreslen vektorově (ověřte pohledem do kódu)
1 Jména jdou označit jako text
1 Rodokmen lze škálovat prohlížečem bez porušení ostatních bodů hodnocení
1 S rodokmenem lze pohybovat pomocí scrollbarů na obrazovce (rodokmen lze částečně vysunout mimo viewport)
2 Rodokmen lze posouvat uchopením myší.
1 Přesun je realizován tažením piktogramu šipek
1 Po kliknutí na editační ikonku se rozdělí obrazovka na dvě části
1 V pravé polovině je zobrazen dialog pro úpravu, obsahuje prvky z rodokmenu a tlačítko pro zavření
1 Otevřením editačního okna se neposune rodokmen
1 Zobrazení a skrývání okna je animováno
2 Lze upravovat data v rodokmenu skrze okno pro úpravy
1 Upravy se projevují ihned
1 Ovládací prvky jsou stylovány dle zadání
2 Upravená data rodokmenu jsou zachována přes zavření okna
2 Pohled na rodokmen je zachován přes zavření okna
1 Obdelníky lze přesouvat tažením za šipku
1 Obdélník po přesunu zůstane na přesunutém místě
1 Přesouvat lze pouze ve vodorovném směru
2 Čáry se správně přesouvají s obdélníkem
1 Po prvním otevření rodokmenu je zobrazen rámeček pouze pro jednu osobu
1 Formulář obsahuje nějaká tlačítka pro přidání osoby
1 Tlačítka jsou neaktivní dle pravidel v hodnocení
1 Funguje přidávání rodičů (i opakovaně)
1 Funguje přidávání sourozenců (i opakovaně)
1 Funguje přidávání partnerů
1 Funguje přidávání dětí (i opakovaně)
1 Nová osoba je připojena čarou dle pravidel ve statické části
1 Po přidání formulář přejde k úpravám nově vzniklé osoby
1 Osoby lze smazat (v povolených případech)
1 Po odstranění osoba zmizí a zavře se okno pro úpravy
1 Lze smazat počáteční osobu (např. po přidání rodiče)
1 Tlačítko je neaktivní, pokud osoba nelze odstranit
1 Po najetí na neaktivní tlačítka se zobrazí (správný) důvod
1 Ovládací prvky jsou stylovány dle zadání