import React, { useCallback, useMemo, useEffect, useState } from 'react' import { ReactSortable } from "react-sortablejs"; import { v4 } from "uuid"; import { executeChange, useBuilderContext, GenericField, isArray } from 'quickbuilder'; import BetterRepeaterField from './BetterRepeaterField'; import ReactModal from "react-modal"; import BetterRepeaterValueShow from './BetterRepeaterValueShow'; import { __ } from '@wordpress/i18n'; import CloseIcon from '../components/CloseIcon'; const BetterRepeater = (props) => { const { name: fieldName, value: fieldValue, placeholder_img, button, _fields, visible_fields, empty_rules_message } = props; const [isOpen, setIsOpen] = useState(false); const [isIntegrationModalOpen, setIsIntegrationModalOpen] = useState(false); const [isEditNecessaryModalOpen, setIsEditCookieInfoModalOpen] = useState(false); const builderContext = useBuilderContext(); const [localMemoizedValue, setLocalMemoizedValue] = useState(builderContext.values?.[fieldName]); const [activeEditItem, setActiveEditItem] = useState(""); const [lastEditState, setLastEditState] = useState({}); useEffect(() => { if (builderContext.values?.[fieldName] != undefined) { setLocalMemoizedValue(builderContext.values?.[fieldName]); } }, [builderContext.values?.[fieldName]]); const handleChange = (event, index) => { if (event.persist) { event.persist(); } const { field, val: value } = executeChange(event); builderContext.setFieldValue([fieldName, index, field], value); } const handleRemove = useCallback((index) => { let lValue = [...localMemoizedValue]; lValue.splice(index, 1) builderContext.setFieldValue(fieldName, lValue); }, [localMemoizedValue]) const handleClone = useCallback((index) => { let lValue = [...localMemoizedValue]; if (lValue.length > 0) { let indexedCopy = lValue?.[index] || {}; if(indexedCopy?.title){ indexedCopy = {...indexedCopy, title: (indexedCopy.title + ' - Copy')} } if(indexedCopy?.post_title){ indexedCopy = {...indexedCopy, post_title: (indexedCopy.post_title + ' - Copy')} } if(indexedCopy?.username){ indexedCopy = {...indexedCopy, username: (indexedCopy.username + ' - Copy')} } if(indexedCopy?.plugin_theme_name){ indexedCopy = {...indexedCopy, plugin_theme_name: (indexedCopy.plugin_theme_name + ' - Copy')} } indexedCopy = {...indexedCopy, index: v4(), isCollapsed: false}; builderContext.setFieldValue([fieldName, localMemoizedValue.length], indexedCopy); } }, [localMemoizedValue]) useEffect(() => { if (localMemoizedValue == undefined || localMemoizedValue == '') { setLocalMemoizedValue([]); } else{ // setLocalMemoizedValue((items) => items.map((item) => { // return {...item, index: v4()}; // })) } }, []) const handleButtonClick = () => { let fieldKeys = Object.keys(_fields); let newFieldKeysWithDefaultValues = {}; fieldKeys?.map((key) => { newFieldKeysWithDefaultValues[key] = ''; }); builderContext.setFieldValue(fieldName, [...localMemoizedValue, {index: v4(), ...newFieldKeysWithDefaultValues}]); setIsOpen(true); } const _handleButtonClick = () => { setIsIntegrationModalOpen(true); } let editItem = localMemoizedValue?.find((value) => ( value?.index == activeEditItem)); let modalLockCondition = ( localMemoizedValue != undefined && editItem == undefined && builderContext.values?.[fieldName][localMemoizedValue?.length - 1]?.access_control_rule?.length > 0 && builderContext.values?.[fieldName][localMemoizedValue?.length - 1]?.control_access_restrict_doc_category?.length > 0 && builderContext.values?.[fieldName][localMemoizedValue?.length - 1]?.control_access_restrict_roles?.length > 0 && builderContext.values?.[fieldName][localMemoizedValue?.length - 1]?.control_access_permission_mode?.length > 0 ) || ( localMemoizedValue != undefined && editItem == undefined && builderContext.values?.[fieldName][localMemoizedValue?.length - 1]?.access_control_rule_kb?.length > 0 && builderContext.values?.[fieldName][localMemoizedValue?.length - 1]?.control_access_restrict_multiple_kb?.toString()?.length > 0 && builderContext.values?.[fieldName][localMemoizedValue?.length - 1]?.control_access_restrict_roles_kb?.length > 0 && builderContext.values?.[fieldName][localMemoizedValue?.length - 1]?.control_access_permission_mode_kb?.length > 0 ) || ( editItem != undefined && editItem?.access_control_rule?.length > 0 && editItem?.control_access_restrict_doc_category?.length > 0 && editItem?.control_access_restrict_roles?.length > 0 && editItem?.control_access_permission_mode?.length > 0 ) || ( editItem != undefined && editItem?.access_control_rule_kb?.length > 0 && editItem?.control_access_restrict_multiple_kb?.toString()?.length > 0 && editItem?.control_access_restrict_roles_kb?.length > 0 && editItem?.control_access_permission_mode_kb?.length > 0 ) ? '' : ' locked'; function closeiconremove(e) { if( activeEditItem?.length == 0 ) { // if this is not edit more remove modal, active edit item setIsOpen(false); setActiveEditItem(""); handleRemove(localMemoizedValue?.length - 1); // remove the recently added fresh modal if cross is clicked } else { let index = localMemoizedValue?.findIndex((value) => { return value?.index == lastEditState?.index; }); if( index != undefined ) { localMemoizedValue[index] = {...lastEditState}; } builderContext.setFieldValue(fieldName, [...localMemoizedValue]); setIsOpen(false); setActiveEditItem(""); } } useEffect(() => { if( activeEditItem?.length > 0 ) { let foundItem = localMemoizedValue?.find((value) => value?.index == activeEditItem); if( foundItem != undefined ) { setLastEditState({...foundItem}); //preserve the last edit state } } else { setLastEditState({}); //revert the last edit state, when edit mode is disabled } }, [activeEditItem]); return ( <> {empty_rules_message != undefined && localMemoizedValue?.length == 0 &&
{empty_rules_message?.subtitle}
}{__('Set custom rules to control who can view, edit, or manage specific documentation based on user roles.', 'betterdocs')}
{ localMemoizedValue && localMemoizedValue?.length > 0 &&