From 46e941900596795329cf1f32f791b7c4dc7d6f37 Mon Sep 17 00:00:00 2001 From: sosig132 Date: Mon, 15 Sep 2025 13:58:31 +0300 Subject: [PATCH 01/12] refs #32137 - EDW paragraph carousel --- .../components/slider-item/slider-item.css | 9 ++ .../components/slider/slider.component.yml | 16 +++ .../components/slider/slider.css | 4 + .../components/slider/slider.js | 19 +++- .../components/slider/slider.twig | 14 ++- ...display.paragraph.edw_carousel.default.yml | 93 +++++++++++++++- ...display.paragraph.edw_carousel.default.yml | 100 ++++++++++++++++++ ...w_display.paragraph.edw_slider.default.yml | 47 ++++++++ ...ld.paragraph.edw_carousel.field_arrows.yml | 23 ++++ ....paragraph.edw_carousel.field_autoplay.yml | 23 ++++ ...ld.paragraph.edw_carousel.field_banner.yml | 21 ++++ ...ield.paragraph.edw_carousel.field_dots.yml | 23 ++++ ...graph.edw_carousel.field_extra_options.yml | 19 ++++ ...ield.paragraph.edw_carousel.field_fade.yml | 23 ++++ ....paragraph.edw_carousel.field_infinite.yml | 23 ++++ ...ph.edw_carousel.field_slides_to_scroll.yml | 23 ++++ ...raph.edw_carousel.field_slides_to_show.yml | 23 ++++ .../field.storage.paragraph.field_arrows.yml | 18 ++++ ...field.storage.paragraph.field_autoplay.yml | 18 ++++ .../field.storage.paragraph.field_banner.yml | 18 ++++ .../field.storage.paragraph.field_dots.yml | 18 ++++ ....storage.paragraph.field_extra_options.yml | 19 ++++ .../field.storage.paragraph.field_fade.yml | 18 ++++ ...field.storage.paragraph.field_infinite.yml | 18 ++++ ...orage.paragraph.field_slides_to_scroll.yml | 20 ++++ ...storage.paragraph.field_slides_to_show.yml | 20 ++++ .../edw_paragraphs_carousel.module | 24 +++++ .../paragraph--edw-carousel.html.twig | 12 ++- 28 files changed, 696 insertions(+), 10 deletions(-) create mode 100644 modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_slider.default.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_arrows.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_autoplay.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_banner.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_dots.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_extra_options.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_fade.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_infinite.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_scroll.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_show.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_arrows.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_autoplay.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_banner.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_dots.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_extra_options.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_fade.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_infinite.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_scroll.yml create mode 100644 modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_show.yml diff --git a/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css b/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css index 449a0e0..1ec9ae1 100644 --- a/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css +++ b/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css @@ -51,3 +51,12 @@ .carousel-item--default .field-link { margin-top: 1.25rem; } +.slider[data-banner="false"] .carousel-item--default { + padding-top: 0; +} +.slider[data-banner="false"] .carousel-item--default .slide-item__media:before { + content: unset; +} +.slider[data-banner="false"] .carousel-item--default .w-content { + display: none; +} \ No newline at end of file diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.component.yml b/modules/edw_paragraphs_carousel/components/slider/slider.component.yml index 28d45ab..5ef67bd 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.component.yml +++ b/modules/edw_paragraphs_carousel/components/slider/slider.component.yml @@ -36,6 +36,21 @@ props: title: Autoplay speed description: Autoplay speed in ms. default: true + slides_to_show: + type: integer + title: Slides to show + description: Number of slides to show, default -> 1. + default: 1 + slides_to_scroll: + type: integer + title: Slides to scroll + description: Number of slides to scroll, default -> 1. + default: 1 + extra_options: + type: object + title: Extra options + description: Extra options in JSON format, e.g., {"centerMode": true, "centerPadding": "60px"}. + default: {} slider_classes: type: array @@ -48,6 +63,7 @@ props: type: Drupal\Core\Template\Attribute title: Attributes description: A list of HTML attributes for the slider + slots: slide_slot_main: diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.css b/modules/edw_paragraphs_carousel/components/slider/slider.css index 4e37c7b..dd01e73 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.css +++ b/modules/edw_paragraphs_carousel/components/slider/slider.css @@ -139,3 +139,7 @@ } } } + +.slider[data-banner="false"] .slick-slide { + height: 100%; +} \ No newline at end of file diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.js b/modules/edw_paragraphs_carousel/components/slider/slider.js index a3dfa75..76a0d36 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.js +++ b/modules/edw_paragraphs_carousel/components/slider/slider.js @@ -12,15 +12,24 @@ const infinite = JSON.parse(carousel.getAttribute('data-infinite')); const fade = JSON.parse(carousel.getAttribute('data-fade')); const autoplay = JSON.parse(carousel.getAttribute('data-autoplay')); - const autoplaySpeed = JSON.parse(carousel.getAttribute('data-autoplay-speed')); - - $('.slider').slick({ + const slidesToShow = parseInt(carousel.getAttribute('data-slides-to-show'), 7); + const slidesToScroll = parseInt(carousel.getAttribute('data-slides-to-scroll'), 7); + const extraOptions = carousel.getAttribute('data-extra-options') ? JSON.parse(carousel.getAttribute('data-extra-options')) : {}; + console.log(extraOptions); + Object.assign(extraOptions, { dots: dots, autoplay: autoplay, - autoplaySpeed: parseInt(autoplaySpeed, 10), infinite: infinite, fade: fade, - arrows: arrows + arrows: arrows, + slidesToShow: slidesToShow, + slidesToScroll: slidesToScroll, + }); + + console.log('Initializing slick with options:', extraOptions); + + $('.slider').slick({ + ...extraOptions, }); }); } diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.twig b/modules/edw_paragraphs_carousel/components/slider/slider.twig index 6e5af0a..58a15af 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.twig +++ b/modules/edw_paragraphs_carousel/components/slider/slider.twig @@ -38,6 +38,10 @@ {% set infinite = infinite ? 'true' : 'false' %} {% set fade = fade ? 'true' : 'false' %} +{% set slides_to_show = slides_to_show ? slides_to_show : 1 %} +{% set slides_to_scroll = slides_to_scroll ? slides_to_scroll : 1 %} +{% set banner = banner is not defined ? 'false' : (banner ? 'true' : 'false') %} +{% set extra_options = extra_options is not defined ? '' : extra_options %} {# Create attributres #} {% set slider_attributes = slider_attributes ?: create_attribute() %} @@ -55,11 +59,19 @@ {% set slider_attributes = slider_attributes.setAttribute('data-fade', fade) %} {% set slider_attributes = slider_attributes.setAttribute('data-autoplay', autoplay) %} {% set slider_attributes = slider_attributes.setAttribute('data-autoplay-speed', autoplaySpeed) %} +{% set slider_attributes = slider_attributes.setAttribute('data-slides-to-show', slides_to_show) %} +{% set slider_attributes = slider_attributes.setAttribute('data-slides-to-scroll', slides_to_scroll) %} +{% set slider_attributes = slider_attributes.setAttribute('data-banner', banner) %} +{% if extra_options %} + {% set slider_attributes = slider_attributes.setAttribute('data-extra-options', extra_options) %} +{% endif %} + +{# Render component #}
{% block slide_slot_main %} - {{ content }} + {{ content|without('field_dots', 'field_fade', 'field_autoplay', 'field_slides_to_show', 'field_slides_to_scroll', 'field_infinite', 'field_arrows', 'field_banner', 'field_extra_options') }} {% endblock %}
diff --git a/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml b/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml index e64541e..4989147 100644 --- a/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml +++ b/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml @@ -1,18 +1,89 @@ +uuid: 49ea953e-c71e-427d-89a9-7704a3ca38c0 langcode: en status: true dependencies: config: + - field.field.paragraph.edw_carousel.field_arrows + - field.field.paragraph.edw_carousel.field_autoplay + - field.field.paragraph.edw_carousel.field_banner + - field.field.paragraph.edw_carousel.field_dots + - field.field.paragraph.edw_carousel.field_extra_options + - field.field.paragraph.edw_carousel.field_fade + - field.field.paragraph.edw_carousel.field_full_width + - field.field.paragraph.edw_carousel.field_infinite + - field.field.paragraph.edw_carousel.field_paragraphs + - field.field.paragraph.edw_carousel.field_slides_to_scroll + - field.field.paragraph.edw_carousel.field_slides_to_show - paragraphs.paragraphs_type.edw_carousel module: + - field_layout + - layout_discovery - paragraphs +third_party_settings: + field_layout: + id: layout_onecol + settings: + label: '' +_core: + default_config_hash: Kkj8Hn5VPqIurDa1-w12X9nOIXVSpAak0BA6qpIxSzY id: paragraph.edw_carousel.default targetEntityType: paragraph bundle: edw_carousel mode: default content: + field_arrows: + type: boolean_checkbox + weight: 3 + region: content + settings: + display_label: true + third_party_settings: { } + field_autoplay: + type: boolean_checkbox + weight: 7 + region: content + settings: + display_label: true + third_party_settings: { } + field_banner: + type: boolean_checkbox + weight: 9 + region: content + settings: + display_label: true + third_party_settings: { } + field_dots: + type: boolean_checkbox + weight: 2 + region: content + settings: + display_label: true + third_party_settings: { } + field_extra_options: + type: string_textarea + weight: 10 + region: content + settings: + rows: 5 + placeholder: '' + third_party_settings: { } + field_fade: + type: boolean_checkbox + weight: 5 + region: content + settings: + display_label: true + third_party_settings: { } field_full_width: type: boolean_checkbox - weight: 0 + weight: 1 + region: content + settings: + display_label: true + third_party_settings: { } + field_infinite: + type: boolean_checkbox + weight: 6 region: content settings: display_label: true @@ -26,15 +97,31 @@ content: title_plural: Paragraphs edit_mode: closed closed_mode: summary - autocollapse: none + autocollapse: all closed_mode_threshold: 0 - add_mode: dropdown + add_mode: button form_display_mode: default default_paragraph_type: edw_carousel_item features: + add_above: '0' collapse_edit_all: collapse_edit_all + convert: '0' duplicate: duplicate third_party_settings: { } + field_slides_to_scroll: + type: number + weight: 8 + region: content + settings: + placeholder: '' + third_party_settings: { } + field_slides_to_show: + type: number + weight: 4 + region: content + settings: + placeholder: '' + third_party_settings: { } hidden: created: true status: true diff --git a/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_carousel.default.yml b/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_carousel.default.yml index badf010..b2805bb 100644 --- a/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_carousel.default.yml +++ b/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_carousel.default.yml @@ -1,15 +1,96 @@ +uuid: 211d71ad-fe39-47af-a676-7da5e3572ec3 langcode: en status: true dependencies: config: + - field.field.paragraph.edw_carousel.field_arrows + - field.field.paragraph.edw_carousel.field_autoplay + - field.field.paragraph.edw_carousel.field_banner + - field.field.paragraph.edw_carousel.field_dots + - field.field.paragraph.edw_carousel.field_extra_options + - field.field.paragraph.edw_carousel.field_fade + - field.field.paragraph.edw_carousel.field_full_width + - field.field.paragraph.edw_carousel.field_infinite + - field.field.paragraph.edw_carousel.field_paragraphs + - field.field.paragraph.edw_carousel.field_slides_to_scroll + - field.field.paragraph.edw_carousel.field_slides_to_show - paragraphs.paragraphs_type.edw_carousel module: - entity_reference_revisions +_core: + default_config_hash: kyUy7i1rS3zGaL6TFshBj8ZPW14CM9z_3Xt2Ou0xXyM id: paragraph.edw_carousel.default targetEntityType: paragraph bundle: edw_carousel mode: default content: + field_arrows: + type: boolean + label: above + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: { } + weight: 2 + region: content + field_autoplay: + type: boolean + label: above + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: { } + weight: 6 + region: content + field_banner: + type: boolean + label: above + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: { } + weight: 8 + region: content + field_dots: + type: boolean + label: above + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: { } + weight: 1 + region: content + field_extra_options: + type: basic_string + label: above + settings: { } + third_party_settings: { } + weight: 9 + region: content + field_fade: + type: boolean + label: above + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: { } + weight: 4 + region: content + field_infinite: + type: boolean + label: above + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: { } + weight: 5 + region: content field_paragraphs: type: entity_reference_revisions_entity_view label: hidden @@ -19,5 +100,24 @@ content: third_party_settings: { } weight: 0 region: content + field_slides_to_scroll: + type: number_integer + label: above + settings: + thousand_separator: '' + prefix_suffix: true + third_party_settings: { } + weight: 7 + region: content + field_slides_to_show: + type: number_integer + label: above + settings: + thousand_separator: '' + prefix_suffix: true + third_party_settings: { } + weight: 3 + region: content hidden: field_full_width: true + search_api_excerpt: true diff --git a/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_slider.default.yml b/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_slider.default.yml new file mode 100644 index 0000000..7b41843 --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_slider.default.yml @@ -0,0 +1,47 @@ +uuid: 8dcdff32-3714-4b2d-b841-1c511716e997 +langcode: en +status: true +dependencies: + config: + - field.field.paragraph.edw_slider.field_paragraphs + - field.field.paragraph.edw_slider.field_title + - paragraphs.paragraphs_type.edw_slider + module: + - entity_reference_revisions + - sdc_display +third_party_settings: + sdc_display: + enabled: false + component: + machine_name: '' + mappings: + static: + props: { } + slots: { } + dynamic: + props: { } + slots: { } +id: paragraph.edw_slider.default +targetEntityType: paragraph +bundle: edw_slider +mode: default +content: + field_paragraphs: + type: entity_reference_revisions_entity_view + label: above + settings: + view_mode: default + link: '' + third_party_settings: { } + weight: 1 + region: content + field_title: + type: string + label: hidden + settings: + link_to_entity: false + third_party_settings: { } + weight: 0 + region: content +hidden: + search_api_excerpt: true diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_arrows.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_arrows.yml new file mode 100644 index 0000000..da253ae --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_arrows.yml @@ -0,0 +1,23 @@ +uuid: 80aaf08d-e30e-4d78-8f2f-b76949196dc1 +langcode: en +status: true +dependencies: + config: + - field.storage.paragraph.field_arrows + - paragraphs.paragraphs_type.edw_carousel +id: paragraph.edw_carousel.field_arrows +field_name: field_arrows +entity_type: paragraph +bundle: edw_carousel +label: Arrows +description: '' +required: false +translatable: false +default_value: + - + value: 0 +default_value_callback: '' +settings: + on_label: 'On' + off_label: 'Off' +field_type: boolean diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_autoplay.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_autoplay.yml new file mode 100644 index 0000000..8abf618 --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_autoplay.yml @@ -0,0 +1,23 @@ +uuid: 8e85c27d-b14c-426f-9b3b-215ff24895fd +langcode: en +status: true +dependencies: + config: + - field.storage.paragraph.field_autoplay + - paragraphs.paragraphs_type.edw_carousel +id: paragraph.edw_carousel.field_autoplay +field_name: field_autoplay +entity_type: paragraph +bundle: edw_carousel +label: Autoplay +description: '' +required: false +translatable: false +default_value: + - + value: 0 +default_value_callback: '' +settings: + on_label: 'On' + off_label: 'Off' +field_type: boolean diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_banner.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_banner.yml new file mode 100644 index 0000000..3bcd390 --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_banner.yml @@ -0,0 +1,21 @@ +uuid: 3c52ce04-cc4e-41b9-a5ca-24c6f320d5c2 +langcode: en +status: true +dependencies: + config: + - field.storage.paragraph.field_banner + - paragraphs.paragraphs_type.edw_carousel +id: paragraph.edw_carousel.field_banner +field_name: field_banner +entity_type: paragraph +bundle: edw_carousel +label: Banner +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + on_label: Banner + off_label: Slider +field_type: boolean diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_dots.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_dots.yml new file mode 100644 index 0000000..2ea6b34 --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_dots.yml @@ -0,0 +1,23 @@ +uuid: 103400c9-c261-4d98-834f-7ef3a43d96ae +langcode: en +status: true +dependencies: + config: + - field.storage.paragraph.field_dots + - paragraphs.paragraphs_type.edw_carousel +id: paragraph.edw_carousel.field_dots +field_name: field_dots +entity_type: paragraph +bundle: edw_carousel +label: Dots +description: '' +required: false +translatable: false +default_value: + - + value: 0 +default_value_callback: '' +settings: + on_label: 'On' + off_label: 'Off' +field_type: boolean diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_extra_options.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_extra_options.yml new file mode 100644 index 0000000..ed9e0c1 --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_extra_options.yml @@ -0,0 +1,19 @@ +uuid: 3c60ab75-3861-42fc-93d7-44cee776b904 +langcode: en +status: true +dependencies: + config: + - field.storage.paragraph.field_extra_options + - paragraphs.paragraphs_type.edw_carousel +id: paragraph.edw_carousel.field_extra_options +field_name: field_extra_options +entity_type: paragraph +bundle: edw_carousel +label: 'Extra options' +description: 'See https://kenwheeler.github.io/slick/ for documentation. Needs to be valid JSON.' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: { } +field_type: string_long diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_fade.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_fade.yml new file mode 100644 index 0000000..fad20d0 --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_fade.yml @@ -0,0 +1,23 @@ +uuid: 20e14573-6798-4074-afe1-0f17bf2a93ea +langcode: en +status: true +dependencies: + config: + - field.storage.paragraph.field_fade + - paragraphs.paragraphs_type.edw_carousel +id: paragraph.edw_carousel.field_fade +field_name: field_fade +entity_type: paragraph +bundle: edw_carousel +label: Fade +description: '' +required: false +translatable: false +default_value: + - + value: 0 +default_value_callback: '' +settings: + on_label: 'On' + off_label: 'Off' +field_type: boolean diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_infinite.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_infinite.yml new file mode 100644 index 0000000..d139c18 --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_infinite.yml @@ -0,0 +1,23 @@ +uuid: f77e1c10-7f25-4203-928d-3fe9f76e4f94 +langcode: en +status: true +dependencies: + config: + - field.storage.paragraph.field_infinite + - paragraphs.paragraphs_type.edw_carousel +id: paragraph.edw_carousel.field_infinite +field_name: field_infinite +entity_type: paragraph +bundle: edw_carousel +label: Infinite +description: '' +required: false +translatable: false +default_value: + - + value: 0 +default_value_callback: '' +settings: + on_label: 'On' + off_label: 'Off' +field_type: boolean diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_scroll.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_scroll.yml new file mode 100644 index 0000000..6f2b3ba --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_scroll.yml @@ -0,0 +1,23 @@ +uuid: cb6f96e1-f8de-4d0e-aee2-cd93c0f1415e +langcode: en +status: true +dependencies: + config: + - field.storage.paragraph.field_slides_to_scroll + - paragraphs.paragraphs_type.edw_carousel +id: paragraph.edw_carousel.field_slides_to_scroll +field_name: field_slides_to_scroll +entity_type: paragraph +bundle: edw_carousel +label: 'Slides to scroll' +description: '' +required: true +translatable: false +default_value: { } +default_value_callback: '' +settings: + min: 1 + max: 10 + prefix: '' + suffix: '' +field_type: integer diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_show.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_show.yml new file mode 100644 index 0000000..db70ab5 --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_show.yml @@ -0,0 +1,23 @@ +uuid: b1ac6524-0f68-4887-b205-bb92b92cde8a +langcode: en +status: true +dependencies: + config: + - field.storage.paragraph.field_slides_to_show + - paragraphs.paragraphs_type.edw_carousel +id: paragraph.edw_carousel.field_slides_to_show +field_name: field_slides_to_show +entity_type: paragraph +bundle: edw_carousel +label: 'Slides to show' +description: '' +required: true +translatable: false +default_value: { } +default_value_callback: '' +settings: + min: 1 + max: 10 + prefix: '' + suffix: '' +field_type: integer diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_arrows.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_arrows.yml new file mode 100644 index 0000000..6b2e93f --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_arrows.yml @@ -0,0 +1,18 @@ +uuid: de96fa4d-a617-483f-83d5-3d7e1c569739 +langcode: en +status: true +dependencies: + module: + - paragraphs +id: paragraph.field_arrows +field_name: field_arrows +entity_type: paragraph +type: boolean +settings: { } +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_autoplay.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_autoplay.yml new file mode 100644 index 0000000..4efdfb7 --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_autoplay.yml @@ -0,0 +1,18 @@ +uuid: cb8201f6-5497-4c2f-92ba-5da348dafae6 +langcode: en +status: true +dependencies: + module: + - paragraphs +id: paragraph.field_autoplay +field_name: field_autoplay +entity_type: paragraph +type: boolean +settings: { } +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_banner.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_banner.yml new file mode 100644 index 0000000..a6b87b8 --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_banner.yml @@ -0,0 +1,18 @@ +uuid: 875f5510-65fa-4335-8636-52b1cae66d89 +langcode: en +status: true +dependencies: + module: + - paragraphs +id: paragraph.field_banner +field_name: field_banner +entity_type: paragraph +type: boolean +settings: { } +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_dots.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_dots.yml new file mode 100644 index 0000000..98cbdc5 --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_dots.yml @@ -0,0 +1,18 @@ +uuid: dbf395be-ffd2-40e7-aff6-a651ef8c00ce +langcode: en +status: true +dependencies: + module: + - paragraphs +id: paragraph.field_dots +field_name: field_dots +entity_type: paragraph +type: boolean +settings: { } +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_extra_options.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_extra_options.yml new file mode 100644 index 0000000..1910936 --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_extra_options.yml @@ -0,0 +1,19 @@ +uuid: 52587730-4269-4a45-8f38-3ca4743f1626 +langcode: en +status: true +dependencies: + module: + - paragraphs +id: paragraph.field_extra_options +field_name: field_extra_options +entity_type: paragraph +type: string_long +settings: + case_sensitive: false +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_fade.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_fade.yml new file mode 100644 index 0000000..e35749b --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_fade.yml @@ -0,0 +1,18 @@ +uuid: f914fee9-0182-41ab-817d-b74a60d0aee7 +langcode: en +status: true +dependencies: + module: + - paragraphs +id: paragraph.field_fade +field_name: field_fade +entity_type: paragraph +type: boolean +settings: { } +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_infinite.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_infinite.yml new file mode 100644 index 0000000..cc32392 --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_infinite.yml @@ -0,0 +1,18 @@ +uuid: 05242136-8f6f-45fc-a5ab-2089ca23b009 +langcode: en +status: true +dependencies: + module: + - paragraphs +id: paragraph.field_infinite +field_name: field_infinite +entity_type: paragraph +type: boolean +settings: { } +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_scroll.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_scroll.yml new file mode 100644 index 0000000..7856eff --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_scroll.yml @@ -0,0 +1,20 @@ +uuid: 8790152d-335c-4303-a912-e558a4642ee1 +langcode: en +status: true +dependencies: + module: + - paragraphs +id: paragraph.field_slides_to_scroll +field_name: field_slides_to_scroll +entity_type: paragraph +type: integer +settings: + unsigned: false + size: normal +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_show.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_show.yml new file mode 100644 index 0000000..2b8cdf5 --- /dev/null +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_show.yml @@ -0,0 +1,20 @@ +uuid: f38dfca7-f81e-467b-88f8-bb88dd257039 +langcode: en +status: true +dependencies: + module: + - paragraphs +id: paragraph.field_slides_to_show +field_name: field_slides_to_show +entity_type: paragraph +type: integer +settings: + unsigned: false + size: normal +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.module b/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.module index 5972bd3..755ee6d 100644 --- a/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.module +++ b/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.module @@ -38,3 +38,27 @@ function edw_paragraphs_carousel_entity_bundle_field_info_alter(&$fields, Entity } } } + +/** + * Implements hook_entity_presave(). + */ +function edw_paragraphs_carousel_entity_presave(EntityInterface $entity) { + if ($entity->hasField('field_extra_options')) { + $value = $entity->get('field_extra_options')->value; + + $value = trim($value); + + $decoded = json_decode($value, TRUE); + if (json_last_error() !== JSON_ERROR_NONE) { + throw new EntityStorageException( + 'The field Extra Options must contain valid JSON. Error: ' . json_last_error_msg() + ); + } + + if (is_array($decoded) && array_values($decoded) === $decoded) { + throw new EntityStorageException( + 'The JSON must be an object (enclosed in {}).' + ); + } + } +} diff --git a/modules/edw_paragraphs_carousel/templates/paragraph--edw-carousel.html.twig b/modules/edw_paragraphs_carousel/templates/paragraph--edw-carousel.html.twig index de83372..b110efb 100644 --- a/modules/edw_paragraphs_carousel/templates/paragraph--edw-carousel.html.twig +++ b/modules/edw_paragraphs_carousel/templates/paragraph--edw-carousel.html.twig @@ -8,5 +8,15 @@ {% extends "paragraph.html.twig" %} {% block content %} - {% include 'edw_paragraphs_carousel:slider' with {} %} + {% include 'edw_paragraphs_carousel:slider' with { + dots: paragraph.field_dots.value, + fade: paragraph.field_fade.value, + autoplay: paragraph.field_autoplay.value, + slides_to_show: paragraph.field_slides_to_show.value, + slides_to_scroll: paragraph.field_slides_to_scroll.value, + infinite: paragraph.field_infinite.value, + arrows: paragraph.field_arrows.value, + banner: paragraph.field_banner.value, + extra_options: paragraph.field_extra_options.value, + } %} {% endblock %} From 9120f4633f6e3af72dab033771b406b55e6dd6f1 Mon Sep 17 00:00:00 2001 From: sosig132 Date: Mon, 15 Sep 2025 14:02:24 +0300 Subject: [PATCH 02/12] refs #32137 - remove console log --- modules/edw_paragraphs_carousel/components/slider/slider.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.js b/modules/edw_paragraphs_carousel/components/slider/slider.js index 76a0d36..c2a0b37 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.js +++ b/modules/edw_paragraphs_carousel/components/slider/slider.js @@ -15,7 +15,7 @@ const slidesToShow = parseInt(carousel.getAttribute('data-slides-to-show'), 7); const slidesToScroll = parseInt(carousel.getAttribute('data-slides-to-scroll'), 7); const extraOptions = carousel.getAttribute('data-extra-options') ? JSON.parse(carousel.getAttribute('data-extra-options')) : {}; - console.log(extraOptions); + Object.assign(extraOptions, { dots: dots, autoplay: autoplay, @@ -26,7 +26,6 @@ slidesToScroll: slidesToScroll, }); - console.log('Initializing slick with options:', extraOptions); $('.slider').slick({ ...extraOptions, From 9d7ac40bfaa80080d47d30ea7a559fc8237bd274 Mon Sep 17 00:00:00 2001 From: Mara Predescu Date: Mon, 15 Sep 2025 15:07:11 +0300 Subject: [PATCH 03/12] fix unquoted field description --- .../components/slider/slider.component.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.component.yml b/modules/edw_paragraphs_carousel/components/slider/slider.component.yml index 5ef67bd..e2032d6 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.component.yml +++ b/modules/edw_paragraphs_carousel/components/slider/slider.component.yml @@ -49,7 +49,7 @@ props: extra_options: type: object title: Extra options - description: Extra options in JSON format, e.g., {"centerMode": true, "centerPadding": "60px"}. + description: 'Extra options in JSON format, e.g., {"centerMode": true, "centerPadding": "60px"}.' default: {} slider_classes: @@ -63,7 +63,7 @@ props: type: Drupal\Core\Template\Attribute title: Attributes description: A list of HTML attributes for the slider - + slots: slide_slot_main: From 2f5ecd73209de120505858d4912e7e188f06e2a5 Mon Sep 17 00:00:00 2001 From: sosig132 Date: Mon, 15 Sep 2025 17:22:25 +0300 Subject: [PATCH 04/12] refs #32137 - fix --- .../components/slider-item/slider-item.css | 6 +-- .../components/slider/slider.component.yml | 3 +- .../components/slider/slider.css | 2 +- .../components/slider/slider.js | 2 +- .../components/slider/slider.twig | 7 +++- ...display.paragraph.edw_carousel.default.yml | 8 ---- ...display.paragraph.edw_carousel.default.yml | 37 ++++++++++++------- ...ld.paragraph.edw_carousel.field_banner.yml | 21 ----------- ...ph.edw_carousel.field_slides_to_scroll.yml | 6 ++- ...raph.edw_carousel.field_slides_to_show.yml | 6 ++- .../field.storage.paragraph.field_banner.yml | 18 --------- 11 files changed, 43 insertions(+), 73 deletions(-) delete mode 100644 modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_banner.yml delete mode 100644 modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_banner.yml diff --git a/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css b/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css index 1ec9ae1..dc7ba01 100644 --- a/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css +++ b/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css @@ -51,12 +51,12 @@ .carousel-item--default .field-link { margin-top: 1.25rem; } -.slider[data-banner="false"] .carousel-item--default { +.slider:not(.full-width) .carousel-item--default { padding-top: 0; } -.slider[data-banner="false"] .carousel-item--default .slide-item__media:before { +.slider:not(.full-width) .carousel-item--default .slide-item__media:before { content: unset; } -.slider[data-banner="false"] .carousel-item--default .w-content { +.slider:not(.full-width) .carousel-item--default .w-content { display: none; } \ No newline at end of file diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.component.yml b/modules/edw_paragraphs_carousel/components/slider/slider.component.yml index 5ef67bd..cf81569 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.component.yml +++ b/modules/edw_paragraphs_carousel/components/slider/slider.component.yml @@ -49,7 +49,7 @@ props: extra_options: type: object title: Extra options - description: Extra options in JSON format, e.g., {"centerMode": true, "centerPadding": "60px"}. + description: Extra options in JSON format. default: {} slider_classes: @@ -74,4 +74,3 @@ libraryOverrides: dependencies: - edw_paragraphs_carousel/carousel - core/once - diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.css b/modules/edw_paragraphs_carousel/components/slider/slider.css index dd01e73..d71b6bc 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.css +++ b/modules/edw_paragraphs_carousel/components/slider/slider.css @@ -140,6 +140,6 @@ } } -.slider[data-banner="false"] .slick-slide { +.slider:not(.full-width) .slick-slide { height: 100%; } \ No newline at end of file diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.js b/modules/edw_paragraphs_carousel/components/slider/slider.js index c2a0b37..982afee 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.js +++ b/modules/edw_paragraphs_carousel/components/slider/slider.js @@ -27,7 +27,7 @@ }); - $('.slider').slick({ + $('.slider').not('.slider-initialized').slick({ ...extraOptions, }); }); diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.twig b/modules/edw_paragraphs_carousel/components/slider/slider.twig index 58a15af..935558e 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.twig +++ b/modules/edw_paragraphs_carousel/components/slider/slider.twig @@ -52,6 +52,10 @@ 'full', ]|merge(slider_classes ?: []) %} +{% if banner == 'true' %} + {% set slider_classes = slider_classes|merge(['full-width']) %} +{% endif %} + {# Add extra test #} {% set slider_attributes = slider_attributes.setAttribute('data-dots', dots) %} {% set slider_attributes = slider_attributes.setAttribute('data-infinite', infinite) %} @@ -61,7 +65,6 @@ {% set slider_attributes = slider_attributes.setAttribute('data-autoplay-speed', autoplaySpeed) %} {% set slider_attributes = slider_attributes.setAttribute('data-slides-to-show', slides_to_show) %} {% set slider_attributes = slider_attributes.setAttribute('data-slides-to-scroll', slides_to_scroll) %} -{% set slider_attributes = slider_attributes.setAttribute('data-banner', banner) %} {% if extra_options %} {% set slider_attributes = slider_attributes.setAttribute('data-extra-options', extra_options) %} {% endif %} @@ -71,7 +74,7 @@
{% block slide_slot_main %} - {{ content|without('field_dots', 'field_fade', 'field_autoplay', 'field_slides_to_show', 'field_slides_to_scroll', 'field_infinite', 'field_arrows', 'field_banner', 'field_extra_options') }} + {{ content|without('field_dots', 'field_fade', 'field_autoplay', 'field_slides_to_show', 'field_slides_to_scroll', 'field_infinite', 'field_arrows', 'field_full_width', 'field_extra_options') }} {% endblock %}
diff --git a/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml b/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml index 4989147..ddc64ca 100644 --- a/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml +++ b/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml @@ -5,7 +5,6 @@ dependencies: config: - field.field.paragraph.edw_carousel.field_arrows - field.field.paragraph.edw_carousel.field_autoplay - - field.field.paragraph.edw_carousel.field_banner - field.field.paragraph.edw_carousel.field_dots - field.field.paragraph.edw_carousel.field_extra_options - field.field.paragraph.edw_carousel.field_fade @@ -45,13 +44,6 @@ content: settings: display_label: true third_party_settings: { } - field_banner: - type: boolean_checkbox - weight: 9 - region: content - settings: - display_label: true - third_party_settings: { } field_dots: type: boolean_checkbox weight: 2 diff --git a/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_carousel.default.yml b/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_carousel.default.yml index b2805bb..0778762 100644 --- a/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_carousel.default.yml +++ b/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_carousel.default.yml @@ -5,7 +5,6 @@ dependencies: config: - field.field.paragraph.edw_carousel.field_arrows - field.field.paragraph.edw_carousel.field_autoplay - - field.field.paragraph.edw_carousel.field_banner - field.field.paragraph.edw_carousel.field_dots - field.field.paragraph.edw_carousel.field_extra_options - field.field.paragraph.edw_carousel.field_fade @@ -17,6 +16,19 @@ dependencies: - paragraphs.paragraphs_type.edw_carousel module: - entity_reference_revisions + - sdc_display +third_party_settings: + sdc_display: + enabled: false + component: + machine_name: '' + mappings: + static: + props: { } + slots: { } + dynamic: + props: { } + slots: { } _core: default_config_hash: kyUy7i1rS3zGaL6TFshBj8ZPW14CM9z_3Xt2Ou0xXyM id: paragraph.edw_carousel.default @@ -44,16 +56,6 @@ content: third_party_settings: { } weight: 6 region: content - field_banner: - type: boolean - label: above - settings: - format: default - format_custom_false: '' - format_custom_true: '' - third_party_settings: { } - weight: 8 - region: content field_dots: type: boolean label: above @@ -69,7 +71,7 @@ content: label: above settings: { } third_party_settings: { } - weight: 9 + weight: 8 region: content field_fade: type: boolean @@ -81,6 +83,16 @@ content: third_party_settings: { } weight: 4 region: content + field_full_width: + type: boolean + label: above + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: { } + weight: 9 + region: content field_infinite: type: boolean label: above @@ -119,5 +131,4 @@ content: weight: 3 region: content hidden: - field_full_width: true search_api_excerpt: true diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_banner.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_banner.yml deleted file mode 100644 index 3bcd390..0000000 --- a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_banner.yml +++ /dev/null @@ -1,21 +0,0 @@ -uuid: 3c52ce04-cc4e-41b9-a5ca-24c6f320d5c2 -langcode: en -status: true -dependencies: - config: - - field.storage.paragraph.field_banner - - paragraphs.paragraphs_type.edw_carousel -id: paragraph.edw_carousel.field_banner -field_name: field_banner -entity_type: paragraph -bundle: edw_carousel -label: Banner -description: '' -required: false -translatable: false -default_value: { } -default_value_callback: '' -settings: - on_label: Banner - off_label: Slider -field_type: boolean diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_scroll.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_scroll.yml index 6f2b3ba..d915894 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_scroll.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_scroll.yml @@ -11,9 +11,11 @@ entity_type: paragraph bundle: edw_carousel label: 'Slides to scroll' description: '' -required: true +required: false translatable: false -default_value: { } +default_value: + - + value: 1 default_value_callback: '' settings: min: 1 diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_show.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_show.yml index db70ab5..88f6034 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_show.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_show.yml @@ -11,9 +11,11 @@ entity_type: paragraph bundle: edw_carousel label: 'Slides to show' description: '' -required: true +required: false translatable: false -default_value: { } +default_value: + - + value: 1 default_value_callback: '' settings: min: 1 diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_banner.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_banner.yml deleted file mode 100644 index a6b87b8..0000000 --- a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_banner.yml +++ /dev/null @@ -1,18 +0,0 @@ -uuid: 875f5510-65fa-4335-8636-52b1cae66d89 -langcode: en -status: true -dependencies: - module: - - paragraphs -id: paragraph.field_banner -field_name: field_banner -entity_type: paragraph -type: boolean -settings: { } -module: core -locked: false -cardinality: 1 -translatable: true -indexes: { } -persist_with_no_fields: false -custom_storage: false From 2873e27adeeca924e69eefec252486863e79fd9b Mon Sep 17 00:00:00 2001 From: sosig132 Date: Mon, 15 Sep 2025 17:23:29 +0300 Subject: [PATCH 05/12] refs #32137 - fix --- .../components/slider/slider.component.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.component.yml b/modules/edw_paragraphs_carousel/components/slider/slider.component.yml index cf81569..dc1d109 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.component.yml +++ b/modules/edw_paragraphs_carousel/components/slider/slider.component.yml @@ -49,7 +49,7 @@ props: extra_options: type: object title: Extra options - description: Extra options in JSON format. + description: 'Extra options in JSON format, e.g., {"centerMode": true, "centerPadding": "60px"}.' default: {} slider_classes: From bcf6c268d40843c25b59daad13345189ad630783 Mon Sep 17 00:00:00 2001 From: sosig132 Date: Mon, 15 Sep 2025 17:41:35 +0300 Subject: [PATCH 06/12] refs #32137 - fix --- .../edw_paragraphs_carousel.install | 13 +++++++ .../edw_paragraphs_carousel.module | 37 ++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 modules/edw_paragraphs_carousel/edw_paragraphs_carousel.install diff --git a/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.install b/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.install new file mode 100644 index 0000000..1666536 --- /dev/null +++ b/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.install @@ -0,0 +1,13 @@ +installDefaultConfig('module', 'edw_paragraphs_carousel'); +} diff --git a/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.module b/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.module index 755ee6d..6c7dc90 100644 --- a/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.module +++ b/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.module @@ -5,7 +5,10 @@ * EDW Paragraphs Carousel module. */ +use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Entity\EntityStorageException; use Drupal\Core\Entity\EntityTypeInterface; +use Drupal\Core\Entity\FieldableEntityInterface; /** * Implements hook_theme(). @@ -43,7 +46,7 @@ function edw_paragraphs_carousel_entity_bundle_field_info_alter(&$fields, Entity * Implements hook_entity_presave(). */ function edw_paragraphs_carousel_entity_presave(EntityInterface $entity) { - if ($entity->hasField('field_extra_options')) { + if ($entity instanceof FieldableEntityInterface && $entity->hasField('field_extra_options') && !$entity->get('field_extra_options')->isEmpty()) { $value = $entity->get('field_extra_options')->value; $value = trim($value); @@ -60,5 +63,37 @@ function edw_paragraphs_carousel_entity_presave(EntityInterface $entity) { 'The JSON must be an object (enclosed in {}).' ); } + + $booleanKeys = ['dots', 'infinite', 'autoplay', 'arrows', 'fade']; + $integerKeys = ['autoplaySpeed', 'slidesToShow', 'slidesToScroll', 'speed', 'rows']; + $stringKeys = ['cssEase', 'easing', 'centerMode']; + + foreach ($decoded as $key => $val) { + if (in_array($key, $booleanKeys, TRUE)) { + if (!is_bool($val)) { + throw new EntityStorageException("Slick option '{$key}' must be a boolean."); + } + } + elseif (in_array($key, $integerKeys, TRUE)) { + if (!is_int($val)) { + throw new EntityStorageException("Slick option '{$key}' must be an integer."); + } + } + elseif (in_array($key, $stringKeys, TRUE)) { + if (!is_string($val)) { + throw new EntityStorageException("Slick option '{$key}' must be a string."); + } + } + elseif ($key === 'responsive') { + if (!is_array($val)) { + throw new EntityStorageException("Slick option 'responsive' must be an array."); + } + foreach ($val as $item) { + if (!isset($item['breakpoint'], $item['settings']) || !is_int($item['breakpoint']) || !is_array($item['settings'])) { + throw new EntityStorageException("Each responsive item must have an integer 'breakpoint' and an object 'settings'."); + } + } + } + } } } From 80031ab885b88c097603743bfd59cda28f7e437e Mon Sep 17 00:00:00 2001 From: sosig132 Date: Tue, 16 Sep 2025 11:30:50 +0300 Subject: [PATCH 07/12] refs #32137 - fix --- .../components/slider-item/slider-item.css | 3 +++ .../components/slider/slider.js | 8 ++++---- ...rm_display.paragraph.edw_carousel.default.yml | 1 - ...ew_display.paragraph.edw_carousel.default.yml | 1 - ...view_display.paragraph.edw_slider.default.yml | 1 - ...field.paragraph.edw_carousel.field_arrows.yml | 1 - ...eld.paragraph.edw_carousel.field_autoplay.yml | 1 - ...d.field.paragraph.edw_carousel.field_dots.yml | 1 - ...aragraph.edw_carousel.field_extra_options.yml | 1 - ...d.field.paragraph.edw_carousel.field_fade.yml | 1 - ...eld.paragraph.edw_carousel.field_infinite.yml | 1 - ...graph.edw_carousel.field_slides_to_scroll.yml | 1 - ...ragraph.edw_carousel.field_slides_to_show.yml | 1 - .../field.storage.paragraph.field_arrows.yml | 1 - .../field.storage.paragraph.field_autoplay.yml | 1 - .../field.storage.paragraph.field_dots.yml | 1 - ...eld.storage.paragraph.field_extra_options.yml | 1 - .../field.storage.paragraph.field_fade.yml | 1 - .../field.storage.paragraph.field_infinite.yml | 1 - ....storage.paragraph.field_slides_to_scroll.yml | 1 - ...ld.storage.paragraph.field_slides_to_show.yml | 1 - .../templates/paragraph--edw-carousel.html.twig | 16 ++++++++-------- 22 files changed, 15 insertions(+), 31 deletions(-) diff --git a/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css b/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css index dc7ba01..bb3208a 100644 --- a/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css +++ b/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css @@ -17,6 +17,9 @@ .carousel-item--default .slide-item__media .field-media { height: 100%; } +.carousel-item--default .slide-item__media .field-media .contextual-region { + height: 100%; +} .carousel-item--default .slide-item__media img { z-index: -2; -o-object-fit: cover; diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.js b/modules/edw_paragraphs_carousel/components/slider/slider.js index 982afee..7f448c2 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.js +++ b/modules/edw_paragraphs_carousel/components/slider/slider.js @@ -14,9 +14,9 @@ const autoplay = JSON.parse(carousel.getAttribute('data-autoplay')); const slidesToShow = parseInt(carousel.getAttribute('data-slides-to-show'), 7); const slidesToScroll = parseInt(carousel.getAttribute('data-slides-to-scroll'), 7); - const extraOptions = carousel.getAttribute('data-extra-options') ? JSON.parse(carousel.getAttribute('data-extra-options')) : {}; + const options = carousel.getAttribute('data-extra-options') ? JSON.parse(carousel.getAttribute('data-extra-options')) : {}; - Object.assign(extraOptions, { + Object.assign(options, { dots: dots, autoplay: autoplay, infinite: infinite, @@ -27,8 +27,8 @@ }); - $('.slider').not('.slider-initialized').slick({ - ...extraOptions, + $(carousel).not('.slick-initialized').slick({ + ...options, }); }); } diff --git a/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml b/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml index ddc64ca..9e5ec72 100644 --- a/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml +++ b/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml @@ -1,4 +1,3 @@ -uuid: 49ea953e-c71e-427d-89a9-7704a3ca38c0 langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_carousel.default.yml b/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_carousel.default.yml index 0778762..b9bdea7 100644 --- a/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_carousel.default.yml +++ b/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_carousel.default.yml @@ -1,4 +1,3 @@ -uuid: 211d71ad-fe39-47af-a676-7da5e3572ec3 langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_slider.default.yml b/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_slider.default.yml index 7b41843..adcc6fc 100644 --- a/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_slider.default.yml +++ b/modules/edw_paragraphs_carousel/config/install/core.entity_view_display.paragraph.edw_slider.default.yml @@ -1,4 +1,3 @@ -uuid: 8dcdff32-3714-4b2d-b841-1c511716e997 langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_arrows.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_arrows.yml index da253ae..d650ea5 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_arrows.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_arrows.yml @@ -1,4 +1,3 @@ -uuid: 80aaf08d-e30e-4d78-8f2f-b76949196dc1 langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_autoplay.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_autoplay.yml index 8abf618..2c37328 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_autoplay.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_autoplay.yml @@ -1,4 +1,3 @@ -uuid: 8e85c27d-b14c-426f-9b3b-215ff24895fd langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_dots.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_dots.yml index 2ea6b34..10416ab 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_dots.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_dots.yml @@ -1,4 +1,3 @@ -uuid: 103400c9-c261-4d98-834f-7ef3a43d96ae langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_extra_options.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_extra_options.yml index ed9e0c1..9aa6b4b 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_extra_options.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_extra_options.yml @@ -1,4 +1,3 @@ -uuid: 3c60ab75-3861-42fc-93d7-44cee776b904 langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_fade.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_fade.yml index fad20d0..5f23cc6 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_fade.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_fade.yml @@ -1,4 +1,3 @@ -uuid: 20e14573-6798-4074-afe1-0f17bf2a93ea langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_infinite.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_infinite.yml index d139c18..696f1df 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_infinite.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_infinite.yml @@ -1,4 +1,3 @@ -uuid: f77e1c10-7f25-4203-928d-3fe9f76e4f94 langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_scroll.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_scroll.yml index d915894..769a0a8 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_scroll.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_scroll.yml @@ -1,4 +1,3 @@ -uuid: cb6f96e1-f8de-4d0e-aee2-cd93c0f1415e langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_show.yml b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_show.yml index 88f6034..8e1bdc2 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_show.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.field.paragraph.edw_carousel.field_slides_to_show.yml @@ -1,4 +1,3 @@ -uuid: b1ac6524-0f68-4887-b205-bb92b92cde8a langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_arrows.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_arrows.yml index 6b2e93f..aff92f5 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_arrows.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_arrows.yml @@ -1,4 +1,3 @@ -uuid: de96fa4d-a617-483f-83d5-3d7e1c569739 langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_autoplay.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_autoplay.yml index 4efdfb7..1257a7f 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_autoplay.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_autoplay.yml @@ -1,4 +1,3 @@ -uuid: cb8201f6-5497-4c2f-92ba-5da348dafae6 langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_dots.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_dots.yml index 98cbdc5..bf7a657 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_dots.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_dots.yml @@ -1,4 +1,3 @@ -uuid: dbf395be-ffd2-40e7-aff6-a651ef8c00ce langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_extra_options.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_extra_options.yml index 1910936..968e1b5 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_extra_options.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_extra_options.yml @@ -1,4 +1,3 @@ -uuid: 52587730-4269-4a45-8f38-3ca4743f1626 langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_fade.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_fade.yml index e35749b..d27b925 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_fade.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_fade.yml @@ -1,4 +1,3 @@ -uuid: f914fee9-0182-41ab-817d-b74a60d0aee7 langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_infinite.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_infinite.yml index cc32392..efc2876 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_infinite.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_infinite.yml @@ -1,4 +1,3 @@ -uuid: 05242136-8f6f-45fc-a5ab-2089ca23b009 langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_scroll.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_scroll.yml index 7856eff..a4e1f32 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_scroll.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_scroll.yml @@ -1,4 +1,3 @@ -uuid: 8790152d-335c-4303-a912-e558a4642ee1 langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_show.yml b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_show.yml index 2b8cdf5..f69ad61 100644 --- a/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_show.yml +++ b/modules/edw_paragraphs_carousel/config/install/field.storage.paragraph.field_slides_to_show.yml @@ -1,4 +1,3 @@ -uuid: f38dfca7-f81e-467b-88f8-bb88dd257039 langcode: en status: true dependencies: diff --git a/modules/edw_paragraphs_carousel/templates/paragraph--edw-carousel.html.twig b/modules/edw_paragraphs_carousel/templates/paragraph--edw-carousel.html.twig index b110efb..91fb0e4 100644 --- a/modules/edw_paragraphs_carousel/templates/paragraph--edw-carousel.html.twig +++ b/modules/edw_paragraphs_carousel/templates/paragraph--edw-carousel.html.twig @@ -9,14 +9,14 @@ {% block content %} {% include 'edw_paragraphs_carousel:slider' with { - dots: paragraph.field_dots.value, - fade: paragraph.field_fade.value, - autoplay: paragraph.field_autoplay.value, - slides_to_show: paragraph.field_slides_to_show.value, - slides_to_scroll: paragraph.field_slides_to_scroll.value, - infinite: paragraph.field_infinite.value, - arrows: paragraph.field_arrows.value, - banner: paragraph.field_banner.value, + dots: paragraph.field_dots.value == 1, + fade: paragraph.field_fade.value == 1, + autoplay: paragraph.field_autoplay.value == 1, + slides_to_show: paragraph.field_slides_to_show.value * 1, + slides_to_scroll: paragraph.field_slides_to_scroll.value * 1, + infinite: paragraph.field_infinite.value == 1, + arrows: paragraph.field_arrows.value == 1, + banner: paragraph.field_full_width.value == 1, extra_options: paragraph.field_extra_options.value, } %} {% endblock %} From f7dff94045b5ecab66c70b863b496dee0b477b72 Mon Sep 17 00:00:00 2001 From: sosig132 Date: Tue, 16 Sep 2025 12:11:45 +0300 Subject: [PATCH 08/12] refs #32137 - fix --- modules/edw_paragraphs_carousel/components/slider/slider.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.js b/modules/edw_paragraphs_carousel/components/slider/slider.js index 7f448c2..9c23977 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.js +++ b/modules/edw_paragraphs_carousel/components/slider/slider.js @@ -12,8 +12,8 @@ const infinite = JSON.parse(carousel.getAttribute('data-infinite')); const fade = JSON.parse(carousel.getAttribute('data-fade')); const autoplay = JSON.parse(carousel.getAttribute('data-autoplay')); - const slidesToShow = parseInt(carousel.getAttribute('data-slides-to-show'), 7); - const slidesToScroll = parseInt(carousel.getAttribute('data-slides-to-scroll'), 7); + const slidesToShow = parseInt(carousel.getAttribute('data-slides-to-show'), 10); + const slidesToScroll = parseInt(carousel.getAttribute('data-slides-to-scroll'), 10); const options = carousel.getAttribute('data-extra-options') ? JSON.parse(carousel.getAttribute('data-extra-options')) : {}; Object.assign(options, { From b54351cb45792b83290265481c79531327a94249 Mon Sep 17 00:00:00 2001 From: Mara Predescu Date: Tue, 16 Sep 2025 14:25:20 +0300 Subject: [PATCH 09/12] refs #32137 separate carousel form fields into tabs --- ...display.paragraph.edw_carousel.default.yml | 76 ++++++++++++++++--- 1 file changed, 67 insertions(+), 9 deletions(-) diff --git a/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml b/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml index 9e5ec72..1bea563 100644 --- a/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml +++ b/modules/edw_paragraphs_carousel/config/install/core.entity_form_display.paragraph.edw_carousel.default.yml @@ -14,6 +14,7 @@ dependencies: - field.field.paragraph.edw_carousel.field_slides_to_show - paragraphs.paragraphs_type.edw_carousel module: + - field_group - field_layout - layout_discovery - paragraphs @@ -22,6 +23,63 @@ third_party_settings: id: layout_onecol settings: label: '' + field_group: + group_tabs: + children: + - group_items + - group_settings + label: Tabs + region: content + parent_name: '' + weight: 0 + format_type: tabs + format_settings: + classes: '' + show_empty_fields: false + id: '' + label_as_html: false + direction: horizontal + width_breakpoint: 640 + group_items: + children: + - field_paragraphs + label: Items + region: content + parent_name: group_tabs + weight: 3 + format_type: tab + format_settings: + classes: '' + show_empty_fields: false + id: '' + label_as_html: false + formatter: open + description: '' + required_fields: true + group_settings: + children: + - field_full_width + - field_dots + - field_arrows + - field_slides_to_show + - field_fade + - field_infinite + - field_autoplay + - field_slides_to_scroll + - field_extra_options + label: Settings + region: content + parent_name: group_tabs + weight: 4 + format_type: tab + format_settings: + classes: '' + show_empty_fields: false + id: '' + label_as_html: false + formatter: closed + description: '' + required_fields: true _core: default_config_hash: Kkj8Hn5VPqIurDa1-w12X9nOIXVSpAak0BA6qpIxSzY id: paragraph.edw_carousel.default @@ -31,21 +89,21 @@ mode: default content: field_arrows: type: boolean_checkbox - weight: 3 + weight: 4 region: content settings: display_label: true third_party_settings: { } field_autoplay: type: boolean_checkbox - weight: 7 + weight: 8 region: content settings: display_label: true third_party_settings: { } field_dots: type: boolean_checkbox - weight: 2 + weight: 3 region: content settings: display_label: true @@ -60,28 +118,28 @@ content: third_party_settings: { } field_fade: type: boolean_checkbox - weight: 5 + weight: 6 region: content settings: display_label: true third_party_settings: { } field_full_width: type: boolean_checkbox - weight: 1 + weight: 2 region: content settings: display_label: true third_party_settings: { } field_infinite: type: boolean_checkbox - weight: 6 + weight: 7 region: content settings: display_label: true third_party_settings: { } field_paragraphs: type: paragraphs - weight: 0 + weight: 1 region: content settings: title: Paragraph @@ -101,14 +159,14 @@ content: third_party_settings: { } field_slides_to_scroll: type: number - weight: 8 + weight: 9 region: content settings: placeholder: '' third_party_settings: { } field_slides_to_show: type: number - weight: 4 + weight: 5 region: content settings: placeholder: '' From 92cd3b3acd784bb9d325daec2b42cabb3ff95fe9 Mon Sep 17 00:00:00 2001 From: sosig132 Date: Tue, 16 Sep 2025 16:09:25 +0300 Subject: [PATCH 10/12] refs #32137 - fix --- .../components/slider-item/slider-item.css | 5 ----- .../components/slider/slider.twig | 12 +++++----- ...aragraph.edw_carousel.field_full_width.yml | 22 ------------------- 3 files changed, 5 insertions(+), 34 deletions(-) delete mode 100644 modules/edw_paragraphs_carousel/config/optional/field.field.paragraph.edw_carousel.field_full_width.yml diff --git a/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css b/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css index bb3208a..eb26119 100644 --- a/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css +++ b/modules/edw_paragraphs_carousel/components/slider-item/slider-item.css @@ -27,11 +27,6 @@ width: 100%; height: 100%; } -.carousel-item--default .slide-item__media:before { - content: ""; - background: rgba(0, 0, 0, 0.5); - z-index: -1; -} .carousel-item--default .w-content { max-width: var(--container-mw); margin-inline: auto; diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.twig b/modules/edw_paragraphs_carousel/components/slider/slider.twig index 935558e..38cb2fb 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.twig +++ b/modules/edw_paragraphs_carousel/components/slider/slider.twig @@ -52,7 +52,7 @@ 'full', ]|merge(slider_classes ?: []) %} -{% if banner == 'true' %} +{% if slides_to_show == 1 %} {% set slider_classes = slider_classes|merge(['full-width']) %} {% endif %} @@ -71,10 +71,8 @@ {# Render component #} -
- - {% block slide_slot_main %} - {{ content|without('field_dots', 'field_fade', 'field_autoplay', 'field_slides_to_show', 'field_slides_to_scroll', 'field_infinite', 'field_arrows', 'field_full_width', 'field_extra_options') }} - {% endblock %} -
+ + {% block slide_slot_main %} + {{ content|without('field_dots', 'field_fade', 'field_autoplay', 'field_slides_to_show', 'field_slides_to_scroll', 'field_infinite', 'field_arrows', 'field_full_width', 'field_extra_options') }} + {% endblock %} diff --git a/modules/edw_paragraphs_carousel/config/optional/field.field.paragraph.edw_carousel.field_full_width.yml b/modules/edw_paragraphs_carousel/config/optional/field.field.paragraph.edw_carousel.field_full_width.yml deleted file mode 100644 index 470bc2b..0000000 --- a/modules/edw_paragraphs_carousel/config/optional/field.field.paragraph.edw_carousel.field_full_width.yml +++ /dev/null @@ -1,22 +0,0 @@ -langcode: en -status: true -dependencies: - config: - - field.storage.paragraph.field_full_width - - paragraphs.paragraphs_type.edw_carousel -id: paragraph.edw_carousel.field_full_width -field_name: field_full_width -entity_type: paragraph -bundle: edw_carousel -label: 'Display as full width' -description: '' -required: false -translatable: false -default_value: - - - value: 0 -default_value_callback: '' -settings: - on_label: 'On' - off_label: 'Off' -field_type: boolean From c59ad2af41ff29f1177e072eb7749be0a6a78dc6 Mon Sep 17 00:00:00 2001 From: Mara Predescu Date: Thu, 18 Sep 2025 15:48:42 +0300 Subject: [PATCH 11/12] refs #32137 extra options field in slider component is string --- .../components/slider/slider.component.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.component.yml b/modules/edw_paragraphs_carousel/components/slider/slider.component.yml index 1f68fde..8385d59 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.component.yml +++ b/modules/edw_paragraphs_carousel/components/slider/slider.component.yml @@ -47,10 +47,10 @@ props: description: Number of slides to scroll, default -> 1. default: 1 extra_options: - type: object + type: string title: Extra options description: 'Extra options in JSON format, e.g., {"centerMode": true, "centerPadding": "60px"}.' - default: {} + default: '' slider_classes: type: array From 74a696147daf004f00691c52b5fe9bbc1093a3a8 Mon Sep 17 00:00:00 2001 From: sosig132 Date: Fri, 19 Sep 2025 14:11:11 +0300 Subject: [PATCH 12/12] refs #32137 - fix --- .../components/slider/slider.js | 13 ++- .../edw_paragraphs_carousel.module | 82 +++++++++++++------ 2 files changed, 68 insertions(+), 27 deletions(-) diff --git a/modules/edw_paragraphs_carousel/components/slider/slider.js b/modules/edw_paragraphs_carousel/components/slider/slider.js index 9c23977..956139b 100644 --- a/modules/edw_paragraphs_carousel/components/slider/slider.js +++ b/modules/edw_paragraphs_carousel/components/slider/slider.js @@ -6,6 +6,14 @@ (function ($, Drupal, once) { Drupal.behaviors.carousel = { attach: function (context, settings) { + function safeJSONParse(str, fallback = {}) { + try { + return JSON.parse(str); + } catch (e) { + console.warn("Invalid JSON in data-extra-options:", str); + return fallback; + } + } once('carousel', '.slider', context).forEach(function (carousel) { const dots = JSON.parse(carousel.getAttribute('data-dots')); const arrows = JSON.parse(carousel.getAttribute('data-arrows')); @@ -14,7 +22,10 @@ const autoplay = JSON.parse(carousel.getAttribute('data-autoplay')); const slidesToShow = parseInt(carousel.getAttribute('data-slides-to-show'), 10); const slidesToScroll = parseInt(carousel.getAttribute('data-slides-to-scroll'), 10); - const options = carousel.getAttribute('data-extra-options') ? JSON.parse(carousel.getAttribute('data-extra-options')) : {}; + const options = carousel.getAttribute('data-extra-options') + ? safeJSONParse(carousel.getAttribute('data-extra-options')) + : {}; + Object.assign(options, { dots: dots, diff --git a/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.module b/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.module index 6c7dc90..fe05f1b 100644 --- a/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.module +++ b/modules/edw_paragraphs_carousel/edw_paragraphs_carousel.module @@ -45,12 +45,15 @@ function edw_paragraphs_carousel_entity_bundle_field_info_alter(&$fields, Entity /** * Implements hook_entity_presave(). */ -function edw_paragraphs_carousel_entity_presave(EntityInterface $entity) { +function edw_paragraphs_carousel_paragraph_presave(EntityInterface $entity) { + if ($entity->bundle() !== 'edw_carousel') { + return; + } + if ($entity instanceof FieldableEntityInterface && $entity->hasField('field_extra_options') && !$entity->get('field_extra_options')->isEmpty()) { $value = $entity->get('field_extra_options')->value; $value = trim($value); - $decoded = json_decode($value, TRUE); if (json_last_error() !== JSON_ERROR_NONE) { throw new EntityStorageException( @@ -58,42 +61,69 @@ function edw_paragraphs_carousel_entity_presave(EntityInterface $entity) { ); } + \Drupal::logger('edw_paragraphs_carousel')->notice('presave {s}', ['s' => print_r($decoded, TRUE)]); if (is_array($decoded) && array_values($decoded) === $decoded) { throw new EntityStorageException( 'The JSON must be an object (enclosed in {}).' ); } - $booleanKeys = ['dots', 'infinite', 'autoplay', 'arrows', 'fade']; - $integerKeys = ['autoplaySpeed', 'slidesToShow', 'slidesToScroll', 'speed', 'rows']; - $stringKeys = ['cssEase', 'easing', 'centerMode']; + _edw_paragraphs_carousel_validate_slick_options($decoded, ''); + } +} + +/** + * Recursively validate slick options. + * + * @param array $options + * The options to validate. + * @param string $path + * The current path in the options (for error messages). + * + * @throws \Drupal\Core\Entity\EntityStorageException + * Thrown when validation fails. + */ +function _edw_paragraphs_carousel_validate_slick_options(array $options, string $path) { + $booleanKeys = ['dots', 'infinite', 'autoplay', 'arrows', 'fade']; + $integerKeys = ['autoplaySpeed', 'slidesToShow', 'slidesToScroll', 'speed', 'rows']; + $stringKeys = ['cssEase', 'easing', 'centerMode']; - foreach ($decoded as $key => $val) { - if (in_array($key, $booleanKeys, TRUE)) { - if (!is_bool($val)) { - throw new EntityStorageException("Slick option '{$key}' must be a boolean."); - } + if ($path === '' && !array_key_exists('responsive', $options)) { + throw new EntityStorageException("Missing required top-level key 'responsive'."); + } + + foreach ($options as $key => $val) { + $currentPath = $path === '' ? $key : "{$path}.{$key}"; + \Drupal::logger('edw_paragraphs_carousel')->notice('key {k} val {v}', ['k' => $currentPath, 'v' => print_r($val, TRUE)]); + + if (in_array($key, $booleanKeys, TRUE)) { + if (!is_bool($val)) { + throw new EntityStorageException("Slick option '{$currentPath}' must be a boolean."); } - elseif (in_array($key, $integerKeys, TRUE)) { - if (!is_int($val)) { - throw new EntityStorageException("Slick option '{$key}' must be an integer."); - } + } + elseif (in_array($key, $integerKeys, TRUE)) { + if (!is_int($val)) { + throw new EntityStorageException("Slick option '{$currentPath}' must be an integer."); } - elseif (in_array($key, $stringKeys, TRUE)) { - if (!is_string($val)) { - throw new EntityStorageException("Slick option '{$key}' must be a string."); - } + } + elseif (in_array($key, $stringKeys, TRUE)) { + if (!is_string($val)) { + throw new EntityStorageException("Slick option '{$currentPath}' must be a string."); } - elseif ($key === 'responsive') { - if (!is_array($val)) { - throw new EntityStorageException("Slick option 'responsive' must be an array."); - } - foreach ($val as $item) { - if (!isset($item['breakpoint'], $item['settings']) || !is_int($item['breakpoint']) || !is_array($item['settings'])) { - throw new EntityStorageException("Each responsive item must have an integer 'breakpoint' and an object 'settings'."); - } + } + elseif ($key === 'responsive') { + if (!is_array($val)) { + throw new EntityStorageException("Slick option '{$currentPath}' must be an array."); + } + foreach ($val as $index => $item) { + if (!isset($item['breakpoint'], $item['settings']) || !is_int($item['breakpoint']) || !is_array($item['settings'])) { + throw new EntityStorageException("Each {$currentPath}[{$index}] must have an integer 'breakpoint' and an object 'settings'."); } + _edw_paragraphs_carousel_validate_slick_options($item['settings'], "{$currentPath}[{$index}].settings"); } } + else { + throw new EntityStorageException("Unknown slick option '{$currentPath}'."); + } } }