HEX
Server: nginx/1.24.0
System: Linux webserver 6.8.0-59-generic #61-Ubuntu SMP PREEMPT_DYNAMIC Fri Apr 11 23:16:11 UTC 2025 x86_64
User: wpuser (1002)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /opt/wpsites/datainsightnow.com/wp-content/plugins/essential-blocks/blocks/post-grid/src/edit.js
/**
 * WordPress dependencies
 */
import { __ } from "@wordpress/i18n";
import { useEffect, useState } from "@wordpress/element";
import { useBlockProps } from "@wordpress/block-editor";
import { select } from "@wordpress/data";
import { doAction, applyFilters } from "@wordpress/hooks";
import { dateI18n, format, __experimentalGetSettings } from "@wordpress/date";

/**
 * Externnal depencencies
 */
import parse from "html-react-parser";

/**
 * Internal depencencies
 */
import classnames from "classnames";

import Inspector from "./inspector";
import Style from "./style";

const {
    duplicateBlockIdFix,
    ebJsonStringCheck,
    CustomQuery,
} = window.EBControls;

export default function Edit(props) {
    const {
        attributes,
        setAttributes,
        className,
        clientId,
        isSelected,
    } = props;
    const {
        blockId,
        blockMeta,
        // responsive control attribute ⬇
        resOption,
        preset,
        queryData,
        queryResults,
        loadMoreOptions,
        showThumbnail,
        thumbnailSize,
        showTitle,
        titleLength,
        titleTag,
        showContent,
        contentLength,
        expansionIndicator,
        showReadMore,
        readmoreText,
        showMeta,
        headerMeta,
        footerMeta,
        authorPrefix,
        datePrefix,
        showTaxonomyFilter,
        selectedTaxonomy,
        selectedTaxonomyItems,
        classHook,
    } = attributes;

    const dateFormat = __experimentalGetSettings().formats.date;

    // this useEffect is for creating a unique id for each block's unique className by a random unique number
    useEffect(() => {
        const BLOCK_PREFIX = "eb-post-grid";
        duplicateBlockIdFix({
            BLOCK_PREFIX,
            blockId,
            setAttributes,
            select,
            clientId,
        });
    }, []);

    const blockProps = useBlockProps({
        className: classnames(className),
    });

    const paginationLinks = (options, perPage) => {
        const totalPages = Math.floor(options.totalPosts / perPage);
        let html = "";
        html += `<button class="ebpg-pagination-item-previous">${options.prevTxt}</button>`;
        for (let i = 1; i <= totalPages; i++) {
            if (i === 1) {
                html += `<button class="ebpg-pagination-item active">${i}</button>`;
            } else if (i <= 3) {
                html += `<button class="ebpg-pagination-item">${i}</button>`;
            } else if (i === totalPages) {
                html +=
                    '<button class="ebpg-pagination-item-separator">...</button>';
                html += `<button class="ebpg-pagination-item">${i}</button>`;
            } else {
                html += "";
            }
        }
        html += `<button class="ebpg-pagination-item-next">${options.nextTxt}</button>`;
        return html;
    };

    const thumbnailImageUrl = (media) => {
        if (!thumbnailSize) {
            return media.source_url;
        } else if (media?.media_details?.sizes) {
            const sizes = media.media_details.sizes;
            if (sizes[thumbnailSize] && sizes[thumbnailSize].source_url) {
                return sizes[thumbnailSize].source_url;
            } else {
                return media.source_url;
            }
        }
    };

    const ebReadingTime = (text) => {
        if (!text) {
            return 0;
        }
        const wpm = 200;
        text = text.replace(/(<([^>]+)>)/gi, "");
        const words = text.trim().split(/\s+/).length;
        const time = Math.ceil(words / wpm);
        return time;
    };

    //Filter by Category
    // const [categoryList, setCategoryList] = useState({ all: "All" });
    // useEffect(() => {
    //     if (typeof queryResults === "object" && queryResults.length > 0) {
    //         const catArray = { ...categoryList };
    //         queryResults.map((post, index) => {
    //             post._embedded && post._embedded["wp:term"] &&
    //                 post._embedded["wp:term"].length > 0 &&
    //                 post._embedded["wp:term"].map((item) => {
    //                     if (item[0]?.taxonomy === "category") {
    //                         catArray[item[0].slug] = item[0].name;
    //                     }
    //                 });
    //         });
    //         setCategoryList(catArray);
    //     }
    // }, [queryResults]);

    return (
        <>
            {isSelected && <Inspector {...props} />}
            <CustomQuery
                isEdit={true}
                attributes={attributes}
                setAttributes={setAttributes}
            />

            <div {...blockProps}>
                <Style {...props} />

                <div
                    className={`eb-parent-wrapper eb-parent-${blockId} ${classHook}`}
                >
                    <div
                        className={`eb-post-grid-wrapper ${blockId} ${preset}`}
                        data-id={blockId}
                    >
                        {showTaxonomyFilter && (
                            <div className="eb-post-grid-category-filter">
                                <ul className="ebpg-category-filter-list">
                                    {JSON.parse(selectedTaxonomyItems).length >
                                        0 &&
                                        JSON.parse(
                                            selectedTaxonomyItems
                                        ).map((catItem, catIndex) => (
                                            <li
                                                className={`ebpg-category-filter-list-item ${catItem.value === "all"
                                                    ? "active"
                                                    : ""
                                                    }`}
                                            >
                                                {catItem.label}
                                            </li>
                                        ))}
                                </ul>
                            </div>
                        )}

                        {queryResults && typeof queryResults === "object" &&
                            queryResults.length > 0 &&
                            queryResults.map((post, index) => {
                                // console.log("queryResults", queryResults)
                                //Generate Featured Image
                                const {
                                    featuredImageInfo: {
                                        url: imageSourceUrl,
                                        alt: featuredImageAlt,
                                    } = {},
                                } = post;
                                const featuredImage = showThumbnail && (
                                    <img
                                        key={index}
                                        src={imageSourceUrl}
                                        alt={featuredImageAlt}
                                    />
                                );

                                //Generate Title
                                const title = post?.title?.rendered;
                                const titleWithLimitWords =
                                    titleLength >= 0
                                        ? title
                                            .trim()
                                            .split(" ", titleLength)
                                            .join(" ")
                                        : title;
                                const titleHTML = `
								<${titleTag} class="ebpg-entry-title">
									<a class="ebpg-grid-post-link" href="javascript:void(0)" title="">
										${titleWithLimitWords}
									</a>
								</${titleTag}>
							`;

                                //Generate Excerpt & Read More
                                let excerpt = post?.excerpt?.rendered;
                                const excerptElement = document.createElement(
                                    "div"
                                );
                                excerptElement.innerHTML = excerpt
                                    ? excerpt
                                    : "";
                                excerpt =
                                    excerptElement.textContent ||
                                    excerptElement.innerText ||
                                    "";
                                const excerptWithLimitWords =
                                    contentLength >= 0
                                        ? excerpt
                                            .trim()
                                            .split(" ", contentLength)
                                            .join(" ")
                                        : excerpt;

                                const avatarUrl = (author) => {
                                    if (author.avatar_urls && author.avatar_urls[96]) {
                                        return author.avatar_urls[96];
                                    }
                                    else {
                                        return "http://1.gravatar.com/avatar/467ceabf70aaa0e555b7dd11c9729241?s=96&d=mm&r=g";
                                    }
                                }
                                const avatar = post?._embedded?.author ? (
                                    <div className="ebpg-author-avatar">
                                        <a href={post._embedded.author[0].link}>
                                            <img
                                                alt={
                                                    post._embedded.author[0].name
                                                        ? post._embedded.author[0].name
                                                        : post._embedded.author[0].slug
                                                }
                                                src={avatarUrl(post._embedded.author[0])}
                                            />
                                        </a>
                                    </div>
                                ) : "";
                                const date = (
                                    <span className="ebpg-posted-on">
                                        {datePrefix + " "}
                                        <time
                                            dateTime={format(
                                                "c",
                                                post.date_gmt
                                            )}
                                        >
                                            {dateI18n(
                                                dateFormat,
                                                post.date_gmt
                                            )}
                                        </time>
                                    </span>
                                );
                                const author = post?._embedded?.author ? (
                                    <span className="ebpg-posted-by">
                                        {authorPrefix + " "}
                                        <a
                                            href={post._embedded.author[0].link}
                                            title={
                                                post._embedded.author[0].name
                                                    ? post._embedded.author[0]
                                                        .name
                                                    : post._embedded.author[0]
                                                        .slug
                                            }
                                            rel="author"
                                        >
                                            {post._embedded.author[0].name
                                                ? post._embedded.author[0].name
                                                : post._embedded.author[0].slug}
                                        </a>
                                    </span>
                                ) : (
                                    ""
                                );

                                const postTermsVal = {};
                                post._embedded && post._embedded["wp:term"] &&
                                    post._embedded["wp:term"].length > 0 &&
                                    post._embedded["wp:term"].map((item) => {
                                        let termObj = {};
                                        let termName = "";
                                        item.length > 0 &&
                                            item.map((term) => {
                                                termName = term.taxonomy;
                                                termObj[term.slug] = {
                                                    name: term.name,
                                                    id: term.id,
                                                    link: term.link,
                                                    slug: term.slug,
                                                };
                                            });
                                        postTermsVal[termName] = termObj;
                                    });

                                const postTermsHtml = {};
                                if (Object.keys(postTermsVal).length > 0) {
                                    Object.keys(postTermsVal).map((term) => {
                                        let termClass = term;
                                        if (term === "category") {
                                            termClass = "categories";
                                        } else if (term === "post_tag") {
                                            termClass = "tags";
                                        }
                                        let markup = `<div className="ebpg-meta ebpg-${termClass}-meta">`;
                                        Object.keys(postTermsVal[term]).length >
                                            0 &&
                                            Object.keys(postTermsVal[term]).map(
                                                (item, index) => {
                                                    markup += `
											<a
												key=${index}
												href=${postTermsVal[term][item].link}
												title=${postTermsVal[term][item].name}
											>
												${postTermsVal[term][item].name}
											</a>
										`;
                                                }
                                            );
                                        markup += `</div>`;
                                        postTermsHtml[term] = markup;
                                    });
                                }

                                const categories = postTermsVal.category ? (
                                    <div className="ebpg-meta ebpg-categories-meta">
                                        {Object.keys(postTermsVal.category).map(
                                            (item, index) => (
                                                <a
                                                    key={index}
                                                    href={
                                                        postTermsVal.category[
                                                            item
                                                        ].link
                                                    }
                                                    title={
                                                        postTermsVal.category[
                                                            item
                                                        ].name
                                                    }
                                                >
                                                    {
                                                        postTermsVal.category[
                                                            item
                                                        ].name
                                                    }
                                                </a>
                                            )
                                        )}
                                    </div>
                                ) : (
                                    ""
                                );

                                const tags = postTermsVal.post_tag ? (
                                    <div className="ebpg-meta ebpg-tags-meta">
                                        {Object.keys(postTermsVal.post_tag).map(
                                            (item) => (
                                                <a
                                                    href={
                                                        postTermsVal.post_tag[
                                                            item
                                                        ].link
                                                    }
                                                    title={
                                                        postTermsVal.post_tag[
                                                            item
                                                        ].name
                                                    }
                                                >
                                                    {
                                                        postTermsVal.post_tag[
                                                            item
                                                        ].name
                                                    }
                                                </a>
                                            )
                                        )}
                                    </div>
                                ) : (
                                    ""
                                );

                                const calcTime = ebReadingTime(
                                    post?.content?.rendered
                                );
                                const readtime = (
                                    <span className="ebpg-read-time">
                                        <i className={"fas fa-clock"}></i>
                                        {`${calcTime} ${calcTime > 1 ? "minutes" : "minute"
                                            } read`}
                                    </span>
                                );

                                const metaObject = {
                                    date,
                                    author,
                                    categories,
                                    tags,
                                    readtime,
                                };

                                const headerMetaItems = ebJsonStringCheck(headerMeta) ?
                                    JSON.parse(headerMeta).map((item) => item.value) :
                                    [];

                                const headerMetaHtml = showMeta ? (
                                    <div className="ebpg-entry-meta ebpg-header-meta">
                                        {headerMetaItems.includes("avatar") && avatar}
                                        <div className="ebpg-entry-meta-items">
                                            {headerMetaItems.map((item) => {
                                                if (metaObject.hasOwnProperty(item )) {
                                                    return metaObject[item];
                                                }
                                                else if ( postTermsHtml.hasOwnProperty( item ) ) {
                                                    return parse( postTermsHtml[item] );
                                                }
                                                else {
                                                    if (item ==='avatar') {
                                                        return
                                                    }
                                                    return applyFilters('essential_blocks_post_grid_dynamic_fields_markup', '', item)
                                                }
                                            })}
                                        </div>
                                    </div>
                                ) : (
                                    ""
                                );

                                const footerMetaItems = ebJsonStringCheck(
                                    footerMeta
                                )
                                    ? JSON.parse(footerMeta).map(
                                        (item) => item.value
                                    )
                                    : [];
                                const footerMetaHtml = showMeta ? (
                                    <div className="ebpg-entry-meta ebpg-footer-meta">
                                        {footerMetaItems.includes("avatar") && avatar}
                                        <div className="ebpg-entry-meta-items">
                                            {footerMetaItems.map((item) => {
                                                if (metaObject.hasOwnProperty(item)) {
                                                    return metaObject[item];
                                                }
                                                else if ( postTermsHtml.hasOwnProperty(item)) {
                                                    return parse(postTermsHtml[item]);
                                                }
                                                else {
                                                    if (item ==='avatar') {
                                                        return
                                                    }
                                                    return applyFilters('essential_blocks_post_grid_dynamic_fields_markup', '', item)
                                                }
                                            })}
                                        </div>
                                    </div>
                                ) : (
                                    ""
                                );

                                return (
                                    <article
                                        className="ebpg-grid-post ebpg-post-grid-column"
                                        data-id={post.id}
                                    >
                                        <div className="ebpg-grid-post-holder">
                                            {preset === "style-5" && (
                                                <a
                                                    className="ebpg-post-link-wrapper"
                                                    href="javascript:void(0)"
                                                ></a>
                                            )}
                                            <div className="ebpg-entry-media">
                                                {showThumbnail && (
                                                    <div className="ebpg-entry-thumbnail">
                                                        {preset !==
                                                            "style-5" && (
                                                                <a
                                                                    className="ebpg-post-link-wrapper"
                                                                    href="javascript:void(0)"
                                                                ></a>
                                                            )}
                                                        {post._embedded && post._embedded[
                                                            "wp:featuredmedia"
                                                        ] &&
                                                            post._embedded[
                                                                "wp:featuredmedia"
                                                            ].length > 0 && (
                                                                <img
                                                                    src={thumbnailImageUrl(
                                                                        post
                                                                            ._embedded[
                                                                        "wp:featuredmedia"
                                                                        ][0]
                                                                    )}
                                                                    alt={
                                                                        post?.title?.alt_text
                                                                    }
                                                                />
                                                            )}
                                                        {post._embedded && !post._embedded[
                                                            "wp:featuredmedia"
                                                        ] && (
                                                                <img
                                                                    src={EssentialBlocksLocalize?.placeholder_image}
                                                                    alt="No Thumbnail Available"
                                                                />
                                                            )}
                                                    </div>
                                                )}
                                            </div>

                                            <div className="ebpg-entry-wrapper">
                                                {showTitle && (
                                                    <header
                                                        className="ebpg-entry-header"
                                                        dangerouslySetInnerHTML={{
                                                            __html: titleHTML,
                                                        }}
                                                    ></header>
                                                )}

                                                {/* Header Meta */}
                                                {showMeta && headerMetaHtml}

                                                <div className="ebpg-entry-content">
                                                    {showContent && (
                                                        <div className="ebpg-grid-post-excerpt">
                                                            <p>
                                                                {
                                                                    excerptWithLimitWords
                                                                }
                                                                {__(
                                                                    expansionIndicator
                                                                )}
                                                            </p>
                                                        </div>
                                                    )}
                                                    {showReadMore && (
                                                        <div className="ebpg-readmore-btn">
                                                            <a href={post.link}>
                                                                {__(
                                                                    readmoreText
                                                                )}
                                                            </a>
                                                        </div>
                                                    )}
                                                </div>

                                                {/* Footer Meta */}
                                                {showMeta && footerMetaHtml}
                                            </div>
                                        </div>
                                    </article>
                                );
                            })}
                        {typeof queryResults != "undefined" &&
                            queryResults.length < 1 && <p>No Posts Found</p>}

                        {/* Pagination */}
                        {typeof queryResults != "undefined" &&
                            queryResults.length > 0 &&
                            typeof loadMoreOptions != "undefined" &&
                            loadMoreOptions.enableMorePosts && (
                                <div
                                    className={`ebpg-pagination ${loadMoreOptions.loadMoreType === "3"
                                        ? "prev-next-btn"
                                        : ""
                                        }`}
                                >
                                    {loadMoreOptions.loadMoreType === "1" && (
                                        <button className="btn ebpg-pagination-button">
                                            {loadMoreOptions.loadMoreButtonTxt}
                                        </button>
                                    )}
                                    {(loadMoreOptions.loadMoreType === "2" ||
                                        loadMoreOptions.loadMoreType ===
                                        "3") && (
                                            <div
                                                className="btn ebpg-pagination-page"
                                                dangerouslySetInnerHTML={{
                                                    __html: paginationLinks(
                                                        loadMoreOptions,
                                                        queryData.per_page
                                                    ),
                                                }}
                                            ></div>
                                        )}
                                </div>
                            )}
                    </div>
                </div>
            </div>
        </>
    );
}