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 ); + } + ); + + } + + +}