diff --git a/assets/js/blocks/product-categories/index.js b/assets/js/blocks/product-categories/index.js
index a491710666c..9953ffb8e63 100644
--- a/assets/js/blocks/product-categories/index.js
+++ b/assets/js/blocks/product-categories/index.js
@@ -13,6 +13,7 @@ import './style.scss';
import Block from './block.js';
registerBlockType( 'woocommerce/product-categories', {
+ apiVersion: 2,
title: __( 'Product Categories List', 'woo-gutenberg-products-block' ),
icon: {
src: ,
@@ -27,6 +28,14 @@ registerBlockType( 'woocommerce/product-categories', {
supports: {
align: [ 'wide', 'full' ],
html: false,
+ color: {
+ background: false,
+ link: true,
+ },
+ typography: {
+ fontSize: true,
+ lineHeight: true,
+ },
},
example: {
attributes: {
diff --git a/src/BlockTypes/ProductCategories.php b/src/BlockTypes/ProductCategories.php
index 9bdc8809b45..f8f5051c844 100644
--- a/src/BlockTypes/ProductCategories.php
+++ b/src/BlockTypes/ProductCategories.php
@@ -1,11 +1,15 @@
$this->get_schema_boolean( false ),
'isDropdown' => $this->get_schema_boolean( false ),
'isHierarchical' => $this->get_schema_boolean( true ),
+ 'textColor' => $this->get_schema_string(),
+ 'fontSize' => $this->get_schema_string(),
+ 'lineHeight' => $this->get_schema_string(),
+ 'style' => array( 'type' => 'object' ),
+
)
);
}
@@ -77,9 +86,11 @@ protected function render( $attributes, $content ) {
}
}
- $classes = $this->get_container_classes( $attributes );
+ $classes_and_styles = $this->get_container_classes( $attributes );
+ $classes = $classes_and_styles[0];
+ $styles = $classes_and_styles[1];
- $output = '
';
+ $output = '
';
$output .= ! empty( $attributes['isDropdown'] ) ? $this->renderDropdown( $categories, $attributes, $uid ) : $this->renderList( $categories, $attributes, $uid );
$output .= '
';
@@ -93,6 +104,7 @@ protected function render( $attributes, $content ) {
* @return string space-separated list of classes.
*/
protected function get_container_classes( $attributes = array() ) {
+
$classes = array( 'wc-block-product-categories' );
if ( isset( $attributes['align'] ) ) {
@@ -109,9 +121,31 @@ protected function get_container_classes( $attributes = array() ) {
$classes[] = 'is-list';
}
- return implode( ' ', $classes );
+ $line_height_class_and_style = AttributesUtils::get_line_height_class_and_style( $attributes );
+ $text_color_class_and_style = AttributesUtils::get_text_color_class_and_style( $attributes );
+ $font_size_class_and_style = AttributesUtils::get_font_size_class_and_style( $attributes );
+
+ $classes = array_filter(
+ [ $line_height_class_and_style['class'], $text_color_class_and_style['class'], $font_size_class_and_style['class'] ],
+ function ( $var ) {
+ return ! is_null( $var );
+ }
+ );
+ $styles = array_filter(
+ [ $line_height_class_and_style['style'], $text_color_class_and_style['style'], $font_size_class_and_style['style'] ],
+ function ( $var ) {
+ return ! is_null( $var );
+ }
+ );
+
+ $string_classes = implode( ' ', $classes );
+ $string_styles = implode( ' ', $styles );
+
+ return array( $string_classes, $string_styles );
}
+
+
/**
* Get categories (terms) from the db.
*
@@ -301,10 +335,12 @@ protected function renderList( $categories, $attributes, $uid, $depth = 0 ) {
protected function renderListItems( $categories, $attributes, $uid, $depth = 0 ) {
$output = '';
+ $link_color_class_and_style = AttributesUtils::get_link_color_class_and_style( $attributes );
+
foreach ( $categories as $category ) {
$output .= '
- ' . $this->get_image_html( $category, $attributes ) . esc_html( $category->name ) . '
+ ' . $this->get_image_html( $category, $attributes ) . esc_html( $category->name ) . '
' . $this->getCount( $category, $attributes ) . '
' . ( ! empty( $category->children ) ? $this->renderList( $category->children, $attributes, $uid, $depth + 1 ) : '' ) . '
diff --git a/src/Utils/AttributesUtils.php b/src/Utils/AttributesUtils.php
new file mode 100644
index 00000000000..2481e271cef
--- /dev/null
+++ b/src/Utils/AttributesUtils.php
@@ -0,0 +1,145 @@
+ sprintf( 'has-font-size has-%s-font-size', $font_size ),
+ 'style' => null,
+ );
+ } elseif ( $has_custom_font_size ) {
+ return array(
+ 'class' => null,
+ 'style' => sprintf( 'font-size: %s;', $custom_font_size ),
+ );
+ }
+
+ return array(
+ 'class' => null,
+ 'style' => null,
+ );
+ }
+
+ /**
+ * Get class and style for text-color from attributes.
+ *
+ * @param array $attributes Attributes.
+ *
+ * @return (array | null)
+ */
+ public static function get_text_color_class_and_style( $attributes ) {
+
+ $text_color = $attributes['textColor'];
+ $custom_text_color = $attributes['style']['color']['text'];
+
+ if ( ! isset( $text_color ) && ! isset( $custom_text_color ) ) {
+ return null;
+ };
+
+ $text_color_class = sprintf( 'has-text-color' );
+ $text_color_style = sprintf( 'color: %s;', ( ! empty( $text_color ) ? $text_color : $custom_text_color ) );
+
+ return array(
+ 'class' => $text_color_class,
+ 'style' => $text_color_style,
+ );
+ }
+
+ /**
+ * Get class and style for text-color from attributes.
+ *
+ * @param array $attributes Attributes.
+ *
+ * @return (array | null)
+ */
+ public static function get_link_color_class_and_style( $attributes ) {
+
+ $link_color = $attributes['style']['elements']['link']['color']['text'];
+
+ if ( ! isset( $link_color ) ) {
+
+ return null;
+ };
+
+ $link_color_class = sprintf( 'has-link-color', $link_color );
+ $link_color_style = sprintf( 'color: %s;', $link_color );
+
+ return array(
+ 'class' => $link_color_class,
+ 'style' => $link_color_style,
+ );
+ }
+
+ /**
+ * Get class and style for line height from attributes.
+ *
+ * @param array $attributes Attributes.
+ *
+ * @return (array | null)
+ */
+ public static function get_line_height_class_and_style( $attributes ) {
+
+ $line_height = $attributes['style']['typography']['lineHeight'];
+
+ if ( ! isset( $line_height ) ) {
+ return null;
+ };
+
+ $line_height_style = 'line-height: ' . $line_height . ';';
+
+ return array(
+ 'class' => null,
+ 'style' => $line_height_style,
+ );
+ }
+
+ /**
+ * Get classes and styles from attributes.
+ *
+ * @param array $attributes Attributes.
+ *
+ * @return (array | null)
+ */
+ public static function get_classes_and_styles_by_attributes( $attributes ) {
+ $classes_and_styles = array(
+ line_height => self::get_line_height_class_and_style( $attributes ),
+ text_color => self::get_text_color_class_and_style( $attributes ),
+ font_size => self::get_font_size_class_and_style( $attributes ),
+ link_color => self::get_link_color_class_and_style( $attributes ),
+ );
+
+ return array_filter(
+ $classes_and_styles,
+ function ( $var ) {
+ return ! is_null( $var );
+ }
+ );
+
+ }
+
+
+}