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) %}
+
+
+
+
+
+
+ {{ community.metadata.description | truncate(length=300, end='...') }}
+
+
+
+{% 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 }}"
>
-
-
-
+
+
+
-
-
+
+
+
+
+
-
+ {{ communities_carousel_slides(communities, items_per_page) }}
+
+
+
+
-
-
+
-
{{ 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 %}
+
+
+ {% for page in range(pageListLength) %}
+ {% set visibility_class = "visible" if (loop.index == 1) else "hidden" %}
+
+ {% for item in range(items_per_page) %}
+ {% set communityIndex = page*items_per_page + item %}
+ {% set community = communitiesList[communityIndex] %}
+
+ {% if community is defined %}
+ {{ carousel_item(community=community) }}
+ {% endif %}
+
+ {% set index = index + 1 %}
+ {% endfor %}
+
+ {% endfor %}
+
+{% endmacro %}