diff --git a/elections2021/migrations/0021_elections2021homepage_carousel.py b/elections2021/migrations/0021_elections2021homepage_carousel.py new file mode 100644 index 0000000000000000000000000000000000000000..94c1bca66c259b05dc68ee19bc2f64716f2175b1 --- /dev/null +++ b/elections2021/migrations/0021_elections2021homepage_carousel.py @@ -0,0 +1,68 @@ +# Generated by Django 3.2.2 on 2021-05-17 12:05 + +import wagtail.core.blocks +import wagtail.core.fields +import wagtail.images.blocks +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("elections2021", "0020_auto_20210517_0235"), + ] + + operations = [ + migrations.AddField( + model_name="elections2021homepage", + name="carousel", + field=wagtail.core.fields.StreamField( + [ + ( + "slide", + wagtail.core.blocks.StructBlock( + [ + ( + "title", + wagtail.core.blocks.CharBlock(label="titulek"), + ), + ( + "photo", + wagtail.images.blocks.ImageChooserBlock( + label="fotka" + ), + ), + ( + "page", + wagtail.core.blocks.PageChooserBlock( + label="stránka do tlačítka", + page_type=[ + "elections2021.Elections2021ArticlesPage", + "elections2021.Elections2021CandidatesListPage", + "elections2021.Elections2021CandidatesMapPage", + "elections2021.Elections2021ProgramPage", + "elections2021.Elections2021QuestionsPage", + "elections2021.Elections2021ProgramAppPage", + "elections2021.Elections2021TextPage", + "elections2021.Elections2021StrategicListPage", + "elections2021.Elections2021StrategicPage", + ], + required=False, + ), + ), + ( + "raw_url", + wagtail.core.blocks.CharBlock( + label="ručně zadaný odkaz do tlačítka (místo stránky)", + required=False, + ), + ), + ] + ), + ) + ], + blank=True, + verbose_name="obsah slideru", + ), + ), + ] diff --git a/elections2021/models.py b/elections2021/models.py index fd05eb1bfb05c25c3f0152390979b23fe32cbbcc..1998f237b4bdab083cbda8cc3b8676e5eed3569e 100644 --- a/elections2021/models.py +++ b/elections2021/models.py @@ -27,6 +27,7 @@ from wagtail.contrib.routable_page.models import RoutablePageMixin, route from wagtail.core import blocks from wagtail.core.fields import RichTextField, StreamField from wagtail.core.models import Page +from wagtail.images.blocks import ImageChooserBlock from wagtail.images.edit_handlers import ImageChooserPanel from wagtailmetadata.models import MetadataPageMixin @@ -143,9 +144,41 @@ class MenuItemBlock(blocks.StructBlock): label = "stránka" +class SlideBlock(blocks.StructBlock): + title = blocks.CharBlock(label="titulek") + photo = ImageChooserBlock(label="fotka") + button_label = blocks.CharBlock(label="text tlačítka") + page = blocks.PageChooserBlock( + label="stránka do tlačítka", + page_type=[ + "elections2021.Elections2021ArticlesPage", + "elections2021.Elections2021CandidatesListPage", + "elections2021.Elections2021CandidatesMapPage", + "elections2021.Elections2021ProgramPage", + "elections2021.Elections2021QuestionsPage", + "elections2021.Elections2021ProgramAppPage", + "elections2021.Elections2021TextPage", + "elections2021.Elections2021StrategicListPage", + "elections2021.Elections2021StrategicPage", + ], + required=False, + ) + raw_url = blocks.CharBlock( + label="ručně zadaný odkaz do tlačítka (místo stránky)", required=False + ) + + class Meta: + label = "slide" + icon = "media" + template = "elections2021/_carousel_slide.html" + + class Elections2021HomePage(Page, MetadataPageMixin): ### FIELDS + carousel = StreamField( + [("slide", SlideBlock())], verbose_name="obsah slideru", blank=True + ) header_links = StreamField( [("link", LinkBlock())], verbose_name="odkazy v záhlaví", blank=True ) @@ -179,6 +212,8 @@ class Elections2021HomePage(Page, MetadataPageMixin): ### PANELS + content_panels = Page.content_panels + [StreamFieldPanel("carousel")] + header_panels = [ StreamFieldPanel("header_links"), PageChooserPanel( @@ -213,7 +248,7 @@ class Elections2021HomePage(Page, MetadataPageMixin): edit_handler = TabbedInterface( [ - ObjectList(Page.content_panels, heading=gettext_lazy("Content")), + ObjectList(content_panels, heading=gettext_lazy("Content")), ObjectList(promote_panels, heading=gettext_lazy("Promote")), ObjectList(header_panels, heading="hlavička"), ObjectList(footer_panels, heading="patička"), diff --git a/elections2021/templates/elections2021/_carousel_slide.html b/elections2021/templates/elections2021/_carousel_slide.html new file mode 100644 index 0000000000000000000000000000000000000000..c3181820c3d21fd563cb7d19c1d2bd336ce14660 --- /dev/null +++ b/elections2021/templates/elections2021/_carousel_slide.html @@ -0,0 +1,43 @@ +{% load wagtailcore_tags wagtailimages_tags %} +<slide> + <div class="relative bg-lemon hero py-0 w-full bg-lemon flex flex-col-reverse md:flex-row"> + <div class="md:w-7/12 h-96 md:h-full"> + <picture class="flex w-full h-full"> + {% image block.value.photo width-480 as img480 %} + {% image block.value.photo width-768 as img768 %} + {% image block.value.photo width-1120 as img1120 %} + {% image block.value.photo width-2240 as img2240 %} + <source srcset="{{ img480.url }} 480w, {{ img768.url }} 768w, {{ img1120.url }} 1120w, {{ img2240.url }} 2240w" sizes="(min-width: 768px) 50vw, 100vw" type="image/jpeg"> + <img class="object-cover flex-grow" src="{{ img768.url }}" alt="{{ block.value.title }}" loading="lazy"> + </picture> + </div> + <div class="md:w-5/12 px-5 md:px-8 xl:px-16 py-9 md:pt-12 xl:pt-16 md:relative h-full"> + <h1 class="head-alt-md text-5xl xl:text-6xl pt-1 mb-5 max-w-xs md:max-w-sm">{{ block.value.title }}</h1> + <div class="md:absolute md:right-0 md:bottom-24 md:w-full md:px-8 xl:px-16 md:text-left"> + {% if block.value.page %} + <a href="{% pageurl block.value.page %}"> + <button class="btn btn--icon btn--hoveractive md:text-xl"> + <div class="btn__body-wrap"> + <div class="btn__body md:py-4 md:leading-5 hover:bg-grey-800">{{ block.value.button_label }}</div> + <div class="btn__icon bg-grey-800"> + <i class="ico--chevron-right"></i> + </div> + </div> + </button> + </a> + {% elif block.value.raw_url %} + <a href="{{ block.value.raw_url }}"> + <button class="btn btn--icon btn--hoveractive md:text-xl"> + <div class="btn__body-wrap"> + <div class="btn__body md:py-4 md:leading-5 hover:bg-grey-800">{{ block.value.button_label }}</div> + <div class="btn__icon bg-grey-800"> + <i class="ico--chevron-right"></i> + </div> + </div> + </button> + </a> + {% endif %} + </div> + </div> + </div> +</slide> diff --git a/elections2021/templates/elections2021/elections2021_home_page.html b/elections2021/templates/elections2021/elections2021_home_page.html index 6a7babc24779b0001deed8cdd14366a16e00daa6..c1a200e5d9ce84d855ab40d4e2094db6ebd90e7a 100644 --- a/elections2021/templates/elections2021/elections2021_home_page.html +++ b/elections2021/templates/elections2021/elections2021_home_page.html @@ -1,17 +1,21 @@ {% extends "elections2021/base.html" %} -{% load wagtailcore_tags wagtailimages_tags %} +{% load wagtailcore_tags %} {% block content %} -<article class="relative bg-lemon md:bg-split-color px-4 md:pl-8 md:pr-0 2xl:px-8 hero py-0 w-full "> - <div class="2xl:container w-auto bg-lemon md:pl-20 pr-0 grid lg:grid-rows-1 h-64 lg:grid-cols-7 items-center 2xl:mx-auto"> - <div class="lg:row-span-1 lg:col-span-4 order-1 md:pr-20"> - <h1 class="head-alt-md sm:head-alt-lg pt-1 max-w-sm">Hodně<br>budeš někde</h1> - </div> - <div class="hidden lg:block lg:row-span-2 lg:col-span-3 order-2 h-full 2xl:absolute 2xl:right-0 2xl:w-1/3"> - </div> - </div> -</article> -<div class="py-16"> +<div class="hero-slider __js-root"> + <ui-app inline-template> + <ui-carousel> + <template v-slot:default="slotProps"> + <!--<carousel :per-page=1 :autoplay="true" :autoplay-timeout="4000" :autoplay-hover-pause="false" :loop="true" :navigation-enabled="true" center-mode v-on:transition-end="slotProps.onthaslide" ref="homeCarrousel" class="pb-8">--> + <carousel :per-page=1 :autoplay="true" :autoplay-timeout="4000" :autoplay-hover-pause="false" :loop="true" :navigation-enabled="true" class="pb-8"> + {% for block in page.carousel %} + {% include_block block %} + {% endfor %} + </carousel> + </template> + </ui-carousel> + </ui-app> </div> + {% endblock %}