from django.forms.utils import ErrorList from wagtail import blocks from wagtail.blocks.struct_block import StructBlockValidationError class ButtonBlock(blocks.StructBlock): title = blocks.CharBlock(label="Titulek", max_length=128, required=True) color = blocks.ChoiceBlock( choices=( ("black", "Černá"), ("white", "Bílá"), ("pirati-yellow", "Žlutá"), ("grey-125", "Světle šedá"), ("blue-300", "Modrá"), ("cyan-200", "Tyrkysová"), ("green-400", "Zelená"), ("violet-400", "Vínová"), ("red-600", "Červená"), ), label="Barva", default="black", ) hoveractive = blocks.BooleanBlock( label="Animovat na hover", default=True, help_text="Pokud je zapnuto, tlačítko při najetí kurzorem ukáže žlutou šipku.", required=False, ) page = blocks.PageChooserBlock(label="Stránka", required=False) link = blocks.URLBlock(label="Odkaz", required=False) align = blocks.ChoiceBlock( choices=( ("auto", "Automaticky"), ("center", "Na střed"), ), label="Zarovnání", default="auto", ) size = blocks.ChoiceBlock( choices=( ("normal", "Normální"), ("large", "Velká"), ("huge", "Masivní"), ), label="Velikost tlačítka", default="normal", ) class Meta: label = "Tlačítko" icon = "code" group = "1. Text" template = "styleguide2/includes/atoms/buttons/round_button_block.html" def get_context(self, value, parent_context=None): context = super().get_context(value, parent_context) context["background_color"] = f"bg-{value['color']}" context["text_color"] = ( "text-white" if value["color"] in ( "black", "red-600", "blue-300", "cyan-200", "green-400", "violet-400", "red-600", ) else "text-black" ) context[ "color_classes" ] = f"{context['background_color']} {context['text_color']}" return context def clean(self, value): errors = {} if value["page"] and value["link"]: errors["page"] = ErrorList( ["Stránka nemůže být vybrána současně s odkazem."] ) errors["link"] = ErrorList( ["Odkaz nemůže být vybrán současně se stránkou."] ) if not value["page"] and not value["link"]: errors["page"] = ErrorList(["Stránka nebo odkaz musí být vyplněna."]) errors["link"] = ErrorList(["Stránka nebo odkaz musí být vyplněna."]) if value["hoveractive"] and value["color"] not in ( "black", "white", "grey-125", ): errors["hoveractive"] = ErrorList( ["Šipku lze ukazovat pouze s černým, bílým nebo šedým pozadím."] ) if errors: raise StructBlockValidationError(errors) return super().clean(value) class ButtonGroupBlock(blocks.StructBlock): buttons = blocks.ListBlock(ButtonBlock(), label="Tlačítka") class Meta: label = "Skupina tlačítek" icon = "list-ul" group = "1. Text" template = "styleguide2/includes/atoms/buttons/round_button_group_block.html"