/** * External dependencies */ import isUndefined from "lodash/isUndefined"; import pickBy from "lodash/pickBy"; import moment from "moment"; import classnames from "classnames"; import Inspector from "./inspector"; import PostCarouselImage from "./image"; import Slider from "react-slick"; import map from "lodash/map"; import generateCSSUnit from "../../../generateCSSUnit"; import Style from "style-it"; import { loadGoogleFont } from "../../../utils/font"; const { compose } = wp.compose; const { Component, Fragment } = wp.element; const { __ } = wp.i18n; const { decodeEntities } = wp.htmlEntities; const { withSelect } = wp.data; const { Placeholder, Spinner, Toolbar, Dashicon } = wp.components; const { BlockAlignmentToolbar, BlockControls, AlignmentToolbar, } = wp.blockEditor; class LatestPostsBlock extends Component { componentDidMount() { this.props.setAttributes({ block_id: this.props.clientId.substr(0, 8) }); } render() { const { attributes, setAttributes, latestPosts } = this.props; const { displayPostExcerpt, displayPostDate, displayPostLink, displayPostComment, displayPostTaxonomy, excerptLength, columns, pauseOnHover, infiniteLoop, transitionSpeed, autoplay, autoplaySpeed, arrowDots, arrowSize, arrowBorderSize, arrowBorderRadius, block_id, blockAlign, titleColor, contentColor, metaColor, dateColor, arrowDotsColor, ctaColor, ctaBackColor, ctaHoverColor, ctaHoverBackColor, ctaBorderColor, ctaHoverBorderColor, ctaBorderRadius, ctaBorderWidth, ctaBorderStyle, ctaHpadding, ctaVpadding, contentPadding, rowGap, columnGap, imageSpace, titleSpace, dateSpace, excerptSpace, ctaSpace, titleFontFamily, titleFontSize, titleFontSizeMobile, titleFontSizeTablet, titleFontWeight, titleLineHeight, metaFontFamily, metaFontSize, metaFontWeight, metaLineHeight, excerptFontFamily, excerptFontSize, excerptFontWeight, excerptLineHeight, ctaFontFamily, ctaFontSize, ctaFontWeight, ctaLineHeight, imagePosition, opacity, readMoreText, equalHeight, buttonTarget, contentPaddingMobile, } = attributes; setAttributes({ block_id: this.props.clientId }); let imgopacity = opacity / 100; // Check if there are posts const hasPosts = Array.isArray(latestPosts) && latestPosts.length; // Check the post type const isPost = "post" === attributes.postType; if (!hasPosts) { return ( {!Array.isArray(latestPosts) ? ( ) : ( __("No posts found.", "skt-blocks") )} ); } // Removing posts from display should be instant. const displayPosts = latestPosts.length > attributes.postsToShow ? latestPosts.slice(0, attributes.postsToShow) : latestPosts; // Get the section tag const SectionTag = attributes.sectionTag ? attributes.sectionTag : "section"; // Get the section title tag const SectionTitleTag = attributes.sectionTitleTag ? attributes.sectionTitleTag : "h2"; // Get the post title tag const PostTag = attributes.postTitleTag ? attributes.postTitleTag : "h3"; const onRemoveImage = () => { x = null; y = null; setAttributes({ x, y, }); }; function NextArrow(props) { return ( ); } function PrevArrow(props) { return ( ); } let dots = "dots" == attributes.arrowDots || "arrows_dots" == attributes.arrowDots ? true : false; let arrows = "arrows" == attributes.arrowDots || "arrows_dots" == attributes.arrowDots ? true : false; const settings = { slidesToShow: attributes.columns, slidesToScroll: 1, autoplaySpeed: attributes.autoplaySpeed, autoplay: attributes.autoplay, infinite: attributes.infiniteLoop, pauseOnHover: pauseOnHover, speed: attributes.transitionSpeed, arrows: arrows, dots: dots, rtl: false, draggable: false, nextArrow: , prevArrow: , responsive: [ { breakpoint: 1024, settings: { slidesToShow: attributes.tcolumns, slidesToScroll: 1, }, }, { breakpoint: 767, settings: { slidesToShow: attributes.mcolumns, slidesToScroll: 1, }, }, ], }; return ( setAttributes({ blockAlign: value })} /> { setAttributes({ align: value }); }} controls={["center", "wide", "full"]} />
{titleFontFamily && loadGoogleFont(titleFontFamily)} {metaFontFamily && loadGoogleFont(metaFontFamily)} {excerptFontFamily && loadGoogleFont(excerptFontFamily)} {ctaFontFamily && loadGoogleFont(ctaFontFamily)} {displayPosts.map((post, index) => (
{imagePosition && attributes.displayPostImage && post.featured_media ? ( ) : null}
{attributes.displayPostTitle && ( {decodeEntities(post.title.rendered.trim()) || __( "(Untitled)", "skt-blocks" )} )} {isPost && (
{attributes.displayPostAuthor && post.author_info.display_name && ( )} {attributes.displayPostDate && post.date_gmt && ( )} {attributes.displayPostComment && (

{post.comments_num == "0 comments" ? "No Comments" : post.comments_num}

)}
{attributes.displayPostTaxonomy && (
)}
)}
{attributes.displayPostExcerpt && post.excerpt && (
)} {attributes.displayPostLink && (

{readMoreText}

)}
))}
); } } export default compose([ withSelect((select, props) => { const { order, categories } = props.attributes; const { getEntityRecords } = select("core"); const latestPostsQuery = pickBy( { categories, order, orderby: props.attributes.orderBy, per_page: props.attributes.postsToShow, offset: props.attributes.offset, exclude: [wp.data.select("core/editor").getCurrentPostId()], }, (value) => !isUndefined(value) ); return { latestPosts: getEntityRecords( "postType", props.attributes.postType, latestPostsQuery ), }; }), ])(LatestPostsBlock); // Truncate excerpt function truncate(str, no_words) { return str.split(" ").splice(0, no_words).join(" "); }