From 8d1ad2cfdf972b88f02f9efc4b7ef55b1e4b3592 Mon Sep 17 00:00:00 2001 From: rexalex Date: Fri, 18 Aug 2023 17:40:15 +0300 Subject: [PATCH] fix: ignoreSpaces on char counter - refs #256525 --- .../manage/Blocks/Group/CounterComponent.jsx | 71 ++++++++++--------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/src/components/manage/Blocks/Group/CounterComponent.jsx b/src/components/manage/Blocks/Group/CounterComponent.jsx index 7279f6c..8693df9 100644 --- a/src/components/manage/Blocks/Group/CounterComponent.jsx +++ b/src/components/manage/Blocks/Group/CounterComponent.jsx @@ -8,46 +8,53 @@ import { serializeNodesToText } from '@plone/volto-slate/editor/render'; import delightedSVG from '@plone/volto/icons/delighted.svg'; import dissatisfiedSVG from '@plone/volto/icons/dissatisfied.svg'; -const CounterComponent = ({ data, setSidebarTab, setSelectedBlock }) => { - const { maxChars } = data; - let charCount = 0; - - const countCharsWithoutSpaces = (paragraph) => { - const regex = /[^\s\\]/g; +const countCharsWithoutSpaces = (paragraph) => { + const regex = /[^\s\\]/g; + return (paragraph.match(regex) || []).length; +}; - return (paragraph.match(regex) || []).length; - }; +const countCharsWithSpaces = (paragraph) => { + return paragraph?.length || 0; +}; - const countCharsWithSpaces = (paragraph) => { - return paragraph?.length || 0; - }; +const countTextInEachBlock = (countTextIn, ignoreSpaces, groupCharCount) => ([ + id, + blockData, +]) => { + const foundText = + blockData && countTextIn?.includes(blockData?.['@type']) + ? isString(blockData?.plaintext) + ? blockData?.plaintext + : isArray(blockData?.value) && blockData?.value !== null + ? serializeNodesToText(blockData?.value) + : '' + : ''; - const countTextInBlocks = (blocksObject) => { - const { countTextIn } = config.blocks?.blocksConfig?.group; - let groupCharCount = 0; - if (!maxChars) { - return groupCharCount; - } - if (!blocksObject) return groupCharCount; + groupCharCount.value += ignoreSpaces + ? countCharsWithoutSpaces(foundText) + : countCharsWithSpaces(foundText); +}; - visitBlocks(blocksObject, ([id, data]) => { - let foundText; - if (data && countTextIn?.includes(data?.['@type'])) { - if (isString(data?.plaintext)) foundText = data?.plaintext; - else if (isArray(data?.value) && data?.value !== null) - foundText = serializeNodesToText(data?.value); - } else foundText = ''; +const countTextInBlocks = (blocksObject, ignoreSpaces, maxChars) => { + const { countTextIn } = config.blocks?.blocksConfig?.group; + // use obj ref to update value - if you send number it will not be updated + const groupCharCount = { value: 0 }; - groupCharCount += data?.ignoreSpaces - ? countCharsWithoutSpaces(foundText) - : countCharsWithSpaces(foundText); - }); + if (!maxChars || !blocksObject) { + return groupCharCount.value; + } - return groupCharCount; - }; + visitBlocks( + blocksObject, + countTextInEachBlock(countTextIn, ignoreSpaces, groupCharCount), + ); - charCount = countTextInBlocks(data?.data); + return groupCharCount.value; +}; +const CounterComponent = ({ data, setSidebarTab, setSelectedBlock }) => { + const { maxChars, ignoreSpaces } = data; + const charCount = countTextInBlocks(data?.data, ignoreSpaces, maxChars); const counterClass = charCount < Math.ceil(maxChars / 1.05) ? 'info'