-
Notifications
You must be signed in to change notification settings - Fork 219
Add global style for Product Categories List block #5133
Changes from 5 commits
eeb0d39
810981c
200836e
7142b1e
bbd1bfa
2b96117
67fbfea
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,11 +1,14 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<?php | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
namespace Automattic\WooCommerce\Blocks\BlockTypes; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use Automattic\WooCommerce\Blocks\Utils\StyleAttributesUtils; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* ProductCategories class. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
class ProductCategories extends AbstractDynamicBlock { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Block name. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -42,6 +45,10 @@ protected function get_block_type_attributes() { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'hasEmpty' => $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 +84,11 @@ protected function render( $attributes, $content ) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$classes = $this->get_container_classes( $attributes ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$classes_and_styles = $this->get_container_classes_and_styles( $attributes ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$classes = $classes_and_styles[0]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$styles = $classes_and_styles[1]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$output = '<div class="' . esc_attr( $classes ) . '">'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$output = '<div class="wp-block-woocommerce-product-categories ' . esc_attr( $classes ) . '" style="' . esc_attr( $styles ) . '">'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There is a possibility that the style property will be empty. Do you think that is it necessary to exclude style property when the variable $styles is empty? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @gigitux Empty style or class attribute is fine to me. But if you prefer a cleaner HTML output, go for it. I prefer empty attributes because of the readability. We will need some There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I agree with you! In any case, I preferred to point it out to you |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$output .= ! empty( $attributes['isDropdown'] ) ? $this->renderDropdown( $categories, $attributes, $uid ) : $this->renderList( $categories, $attributes, $uid ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$output .= '</div>'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -90,9 +99,10 @@ protected function render( $attributes, $content ) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Get the list of classes to apply to this block. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This comment needs to be updated as well. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param array $attributes Block attributes. Default empty array. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @return string space-separated list of classes. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @return array space-separated list of classes and space-separated list of inline styles. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
protected function get_container_classes( $attributes = array() ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
protected function get_container_classes_and_styles( $attributes = array() ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$classes = array( 'wc-block-product-categories' ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( isset( $attributes['align'] ) ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -109,7 +119,30 @@ protected function get_container_classes( $attributes = array() ) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$classes[] = 'is-list'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return implode( ' ', $classes ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$line_height_class_and_style = StyleAttributesUtils::get_line_height_class_and_style( $attributes ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$text_color_class_and_style = StyleAttributesUtils::get_text_color_class_and_style( $attributes ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$font_size_class_and_style = StyleAttributesUtils::get_font_size_class_and_style( $attributes ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$line_height_class = isset( $line_height_class_and_style['class'] ) ? $line_height_class_and_style['class'] : null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$text_color_class = isset( $text_color_class_and_style['class'] ) ? $text_color_class_and_style['class'] : null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$font_size_class = isset( $font_size_class_and_style['class'] ) ? $font_size_class_and_style['class'] : null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$classes = array_filter( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
array( $line_height_class, $text_color_class, $font_size_class ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$line_height_style = isset( $line_height_class_and_style['style'] ) ? $line_height_class_and_style['style'] : null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$text_color_style = isset( $text_color_class_and_style['style'] ) ? $text_color_class_and_style['style'] : null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$font_size_style = isset( $font_size_class_and_style['style'] ) ? $font_size_class_and_style['style'] : null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$styles = array_filter( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
array( $line_height_style, $text_color_style, $font_size_style ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm wondering if we can use
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Maybe in the future, we could add more attributes and if this happens we should update this There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Done and approved! Thanks for your great feedback! |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$string_classes = implode( ' ', $classes ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$string_styles = implode( ' ', $styles ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return array( $string_classes, $string_styles ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You're changing the return data type of this function, so you should update the comment docs block as well. By the way, this method now returns an array of classes and styles, then the method name should be updated to reflect the return data. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -301,11 +334,15 @@ protected function renderList( $categories, $attributes, $uid, $depth = 0 ) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
protected function renderListItems( $categories, $attributes, $uid, $depth = 0 ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$output = ''; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$link_color_class_and_style = StyleAttributesUtils::get_link_color_class_and_style( $attributes ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$link_color_style = isset( $link_color_class_and_style['style'] ) ? $link_color_class_and_style['style'] : ''; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
foreach ( $categories as $category ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$output .= ' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<li class="wc-block-product-categories-list-item"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<a href="' . esc_attr( get_term_link( $category->term_id, 'product_cat' ) ) . '">' . $this->get_image_html( $category, $attributes ) . esc_html( $category->name ) . '</a> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' . $this->getCount( $category, $attributes ) . ' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<a style="' . esc_attr( $link_color_style ) . '" href="' . esc_attr( get_term_link( $category->term_id, 'product_cat' ) ) . '">' . $this->get_image_html( $category, $attributes ) . esc_html( $category->name ) . '</a> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' . $this->getCount( $category, $attributes ) . ' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
' . ( ! empty( $category->children ) ? $this->renderList( $category->children, $attributes, $uid, $depth + 1 ) : '' ) . ' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</li> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
<?php | ||
namespace Automattic\WooCommerce\Blocks\Utils; | ||
|
||
/** | ||
* StyleAttributesUtils class used for getting class and style from attributes. | ||
*/ | ||
class StyleAttributesUtils { | ||
|
||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Consecutive empty lines here. |
||
/** | ||
* Get class and style for font-size from attributes. | ||
* | ||
* @param array $attributes Block attributes. | ||
* | ||
* @return (array | null) | ||
*/ | ||
public static function get_font_size_class_and_style( $attributes ) { | ||
|
||
$font_size = $attributes['fontSize']; | ||
|
||
$custom_font_size = isset( $attributes['style']['color']['fontSize'] ) ? $attributes['style']['color']['fontSize'] : null; | ||
|
||
if ( ! isset( $font_size ) && ! isset( $custom_font_size ) ) { | ||
return null; | ||
}; | ||
|
||
$has_named_font_size = ! empty( $font_size ); | ||
$has_custom_font_size = isset( $custom_font_size ); | ||
|
||
if ( $has_named_font_size ) { | ||
return array( | ||
'class' => 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 null; | ||
} | ||
|
||
/** | ||
* Get class and style for text-color from attributes. | ||
* | ||
* @param array $attributes Block attributes. | ||
* | ||
* @return (array | null) | ||
*/ | ||
public static function get_text_color_class_and_style( $attributes ) { | ||
|
||
$text_color = $attributes['textColor']; | ||
|
||
$custom_text_color = isset( $attributes['style']['color']['text'] ) ? $attributes['style']['color']['text'] : null; | ||
|
||
if ( ! isset( $text_color ) && ! isset( $custom_text_color ) ) { | ||
return null; | ||
}; | ||
|
||
$has_named_text_color = ! empty( $text_color ); | ||
$has_custom_text_color = isset( $custom_text_color ); | ||
|
||
if ( $has_named_text_color ) { | ||
return array( | ||
'class' => sprintf( 'has-text-color has-%s-color', $text_color ), | ||
'style' => null, | ||
); | ||
} elseif ( $has_custom_text_color ) { | ||
return array( | ||
'class' => null, | ||
'style' => sprintf( 'color: %s;', $custom_text_color ), | ||
); | ||
} | ||
return null; | ||
|
||
} | ||
|
||
/** | ||
* Get class and style for link-color from attributes. | ||
* | ||
* @param array $attributes Block attributes. | ||
* | ||
* @return (array | null) | ||
*/ | ||
public static function get_link_color_class_and_style( $attributes ) { | ||
|
||
if ( ! isset( $attributes['style']['elements']['link']['color']['text'] ) ) { | ||
return null; | ||
}; | ||
|
||
$link_color = $attributes['style']['elements']['link']['color']['text']; | ||
|
||
// If the link color is selected from the theme color picker, the value of $link_color is var:preset|color|slug. | ||
// If the link color is selected from the core color picker, the value of $link_color is an hex value. | ||
// When the link color is a string var:preset|color|slug we parsed it for get the slug, otherwise we use the hex value. | ||
$index_named_link_color = strrpos( $link_color, '|' ); | ||
|
||
if ( ! empty( $index_named_link_color ) ) { | ||
$parsed_named_link_color = substr( $link_color, $index_named_link_color + 1 ); | ||
return array( | ||
'class' => null, | ||
'style' => sprintf( 'color: %s;', $parsed_named_link_color ), | ||
); | ||
} else { | ||
return array( | ||
'class' => null, | ||
'style' => sprintf( 'color: %s;', $link_color ), | ||
); | ||
} | ||
|
||
} | ||
|
||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Consecutive empty lines here. |
||
/** | ||
* Get class and style for line height from attributes. | ||
* | ||
* @param array $attributes Block attributes. | ||
* | ||
* @return (array | null) | ||
*/ | ||
public static function get_line_height_class_and_style( $attributes ) { | ||
|
||
$line_height = isset( $attributes['style']['color']['lineHeight'] ) ? $attributes['style']['color']['lineHeight'] : null; | ||
|
||
if ( ! isset( $line_height ) ) { | ||
return null; | ||
}; | ||
|
||
$line_height_style = sprintf( 'line-height: %s;', $line_height ); | ||
|
||
return array( | ||
'class' => null, | ||
'style' => $line_height_style, | ||
); | ||
} | ||
|
||
/** | ||
* Get classes and styles from attributes. | ||
* | ||
* @param array $attributes Block attributes. | ||
* | ||
* @return array | ||
*/ | ||
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 ), | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The array keys need to be string |
||
); | ||
|
||
return array_filter( | ||
$classes_and_styles | ||
); | ||
|
||
} | ||
|
||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Consecutive empty lines here. |
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With
apiVersion: 2
, you will need to passuseBlockProps()
to the edit component. Similarly to how it's done here:https://github.com/woocommerce/woocommerce-gutenberg-products-block/blob/trunk/assets/js/blocks/reviews/editor-container-block.js#L58
(I think you will need to replace the fragment
<>
with a wrapping div)