diff --git a/invenio_communities/assets/semantic-ui/js/invenio_communities/community/communitiesCarousel/index.js b/invenio_communities/assets/semantic-ui/js/invenio_communities/community/communitiesCarousel/index.js index f2a4a2132..ab78fddc1 100644 --- a/invenio_communities/assets/semantic-ui/js/invenio_communities/community/communitiesCarousel/index.js +++ b/invenio_communities/assets/semantic-ui/js/invenio_communities/community/communitiesCarousel/index.js @@ -5,31 +5,68 @@ * Invenio is free software; you can redistribute it and/or modify it * under the terms of the MIT License; see LICENSE file for more details. */ -import React from "react"; -import ReactDOM from "react-dom"; -import CommunitiesCarousel from "./CommunitiesCarousel"; -import { OverridableContext, overrideStore } from "react-overridable"; +import $ from "jquery"; const communitiesCarouselContainer = document.getElementById("communities-carousel"); -const title = communitiesCarouselContainer.dataset.title; -const fetchUrl = communitiesCarouselContainer.dataset.fetchUrl; const intervalDelay = parseInt(communitiesCarouselContainer.dataset.intervalDelay); const animationSpeed = parseInt(communitiesCarouselContainer.dataset.animationSpeed); -const defaultLogo = communitiesCarouselContainer.dataset.defaultLogo; -const itemsPerPage = communitiesCarouselContainer.dataset.itemsPerPage; - -const overriddenComponents = overrideStore.getAll(); - -ReactDOM.render( - - - , - communitiesCarouselContainer -); + +const carouselSlides = $(".carousel.transition"); +const prevSlideBtn = $("#prev-slide-btn"); +const nextSlideBtn = $("#next-slide-btn"); + +const minIndex = 0; +const maxIndex = carouselSlides.length - 1; + +var activeIndex = 0; + +/** + * Switches carousel slide + * @param {string} direction Direction to slide - left or right + */ +const slide = (direction) => { + const prevIndex = activeIndex; + + if (direction === "left") { + activeIndex++; + if (activeIndex > maxIndex) activeIndex = 0; + } else { + activeIndex--; + if (activeIndex < minIndex) activeIndex = maxIndex; + } + + $(carouselSlides[activeIndex]).transition({ + animation: `carousel-slide ${direction} in`, + duration: animationSpeed, + }); + + $(carouselSlides[prevIndex]).transition({ + animation: `carousel-slide ${direction} out`, + duration: animationSpeed, + }); +}; + +// Run carousel automatically on page load +const setCarouselTimer = () => setInterval(() => slide("left"), intervalDelay); +var carouselTimer = setCarouselTimer(); + +// Pause carousel on focus +$(communitiesCarouselContainer) + .on("focusin", () => { + clearInterval(carouselTimer); + }) + .on("focusout", () => { + carouselTimer = setCarouselTimer(); + }); + +// Navigation arrow event handlers +prevSlideBtn + .on("click", () => slide("right")) + .on("keydown", (event) => { + event.key === "Enter" && slide("right"); + }); +nextSlideBtn + .on("click", () => slide("left")) + .on("keydown", (event) => { + event.key === "Enter" && slide("left"); + }); diff --git a/invenio_communities/templates/semantic-ui/invenio_communities/macros/carousel_item.html b/invenio_communities/templates/semantic-ui/invenio_communities/macros/carousel_item.html new file mode 100644 index 000000000..8b394fba6 --- /dev/null +++ b/invenio_communities/templates/semantic-ui/invenio_communities/macros/carousel_item.html @@ -0,0 +1,43 @@ +{# -*- coding: utf-8 -*- + + This file is part of Invenio. + Copyright (C) 2023 CERN. + + Invenio is free software; you can redistribute it and/or modify it + under the terms of the MIT License; see LICENSE file for more details. +#} + +{% macro carousel_item(community=None) %} + +{% endmacro %} diff --git a/invenio_communities/templates/semantic-ui/invenio_communities/macros/communities_carousel.html b/invenio_communities/templates/semantic-ui/invenio_communities/macros/communities_carousel.html index 338e79bf2..06b5bce7e 100644 --- a/invenio_communities/templates/semantic-ui/invenio_communities/macros/communities_carousel.html +++ b/invenio_communities/templates/semantic-ui/invenio_communities/macros/communities_carousel.html @@ -1,16 +1,18 @@ {# -*- coding: utf-8 -*- This file is part of Invenio. - Copyright (C) 2016-2020 CERN. + Copyright (C) 2023 CERN. Invenio is free software; you can redistribute it and/or modify it under the terms of the MIT License; see LICENSE file for more details. #} +{% from "invenio_communities/macros/communities_carousel_slides.html" import communities_carousel_slides %} + {% macro communities_carousel( + communities, title=_("Featured communities"), - fetch_url="/api/communities/featured", - interval_delay="10000", + interval_delay="5000", animation_speed="300", items_per_page=1, default_logo="/static/images/square-placeholder.png" @@ -23,52 +25,40 @@ data-interval-delay="{{ interval_delay }}" data-animation-speed="{{ animation_speed }}" data-default-logo="{{ default_logo }}" - data-items-per-page="{{ items_per_page }}" > -
-
-

{{ title }}

+ - {{ webpack['invenio-communities-carousel.js'] }} {% endmacro %} diff --git a/invenio_communities/templates/semantic-ui/invenio_communities/macros/communities_carousel_slides.html b/invenio_communities/templates/semantic-ui/invenio_communities/macros/communities_carousel_slides.html new file mode 100644 index 000000000..9e4b81dbe --- /dev/null +++ b/invenio_communities/templates/semantic-ui/invenio_communities/macros/communities_carousel_slides.html @@ -0,0 +1,34 @@ +{# -*- coding: utf-8 -*- + + This file is part of Invenio. + Copyright (C) 2023 CERN. + + Invenio is free software; you can redistribute it and/or modify it + under the terms of the MIT License; see LICENSE file for more details. +#} + +{% from "invenio_communities/macros/carousel_item.html" import carousel_item %} + +{% macro communities_carousel_slides(communities, items_per_page) %} + {% set pageListLength = (communities|length / items_per_page) | round(0, 'ceil') | int %} + {% set communitiesList = communities|list %} + {% set index = 0 %} + + +{% endmacro %}