diff --git a/assets/dev/js/editor/components/dynamic-tags/manager.js b/assets/dev/js/editor/components/dynamic-tags/manager.js index 9ac9767ea177..811e4e74a75a 100644 --- a/assets/dev/js/editor/components/dynamic-tags/manager.js +++ b/assets/dev/js/editor/components/dynamic-tags/manager.js @@ -58,6 +58,23 @@ module.exports = elementorModules.Module.extend( { } ); }, + loadSingleCacheRequest( request ) { + elementorCommon.ajax.addRequest( 'render_tags_single', { + data: { + post_id: elementor.config.document.id, + tags: Object.keys( request ), + }, + success: ( data ) => { + this.cache = { + ...this.cache, + ...data, + }; + }, + } ); + + return this.cache; + }, + refreshCacheFromServer( callback ) { this.cacheCallbacks.push( callback ); diff --git a/assets/dev/js/editor/elements/views/base.js b/assets/dev/js/editor/elements/views/base.js index 352c6dd67f3a..d9f14404bd6b 100644 --- a/assets/dev/js/editor/elements/views/base.js +++ b/assets/dev/js/editor/elements/views/base.js @@ -659,33 +659,40 @@ BaseElementView = BaseContainer.extend( { this.renderHTML(); }, - isAtomicDynamic( dataBinding, changedSetting ) { - return !! ( dataBinding.el.hasAttribute( 'data-binding-dynamic' ) && - elementorCommon.config.experimentalFeatures.e_nested_atomic_repeaters ) && - this.isAddingDynamicToTitle( dataBinding, changedSetting ); - }, - - isAddingDynamicToTitle( dataBinding, changedSetting ) { - return ( - 'object' === typeof changedSetting?.__dynamic__ && - Object.keys( changedSetting?.__dynamic__ )[ 0 ]?.length > 0 && - dataBinding.el.getAttribute( 'data-binding-setting' ) === Object.keys( changedSetting?.__dynamic__ )[ 0 ] - ); + isAtomicDynamic( dataBinding ) { + return dataBinding.el.hasAttribute( 'data-binding-dynamic' ); }, getDynamicValue( settings, bindingSetting ) { - const valueToParse = settings.attributes?.__dynamic__?.[ bindingSetting ], + const valueToParse = settings.attributes.__dynamic__[ bindingSetting ], dynamicSettings = { active: true }; if ( valueToParse ) { try { return elementor.dynamicTags.parseTagsText( valueToParse, dynamicSettings, elementor.dynamicTags.getTagDataContent ); } catch { - return false; + // return false; + const request = elementor.dynamicTags.createCacheKey( this ); // This this is incorrect, we should add the tag.js this of build a dedicated this. + console.log( { request } ); + elementor.dynamicTags.loadSingleCacheRequest( request ); + + console.log( 'cache:', elementor.dynamicTags.cache ) + } } - return settings.attributes[ bindingSetting ]; + return settings.attributes.item_title; // Default title + }, + + renderDynamicValue( dynamicValue ) { + const activeItem = this?.model?.attributes?.editSettings?.attributes.activeItemIndex, + widgetConfig = elementor.widgetsCache[ this.model.config.name ], + titleContainers = this.$el.find( widgetConfig.title_container ); + + if ( activeItem ) { + titleContainers[ activeItem - 1 ].innerHTML = dynamicValue; + return; + } }, /** @@ -763,14 +770,6 @@ BaseElementView = BaseContainer.extend( { const { bindingSetting } = dataBinding.dataset; let change = settings.changed[ bindingSetting ]; - if ( this.isAtomicDynamic( dataBinding, settings.changed ) ) { - const dynamicValue = this.getDynamicValue( settings, bindingSetting ); - - if ( dynamicValue ) { - change = dynamicValue; - } - } - if ( change !== undefined ) { dataBinding.el.innerHTML = change; return true; diff --git a/core/dynamic-tags/manager.php b/core/dynamic-tags/manager.php index adc3dc5a5134..0d0c687d9638 100644 --- a/core/dynamic-tags/manager.php +++ b/core/dynamic-tags/manager.php @@ -456,6 +456,39 @@ public function ajax_render_tags( $data ) { return $tags_data; } + /** + * @since 2.0.0 + * @access public + * + * @throws \Exception If post ID is missing. + * @throws \Exception If current user don't have permissions to edit the post. + */ + public function ajax_render_tags_single( $data ) { + if ( empty( $data['post_id'] ) ) { + throw new \Exception( 'Missing post id.' ); + } + + if ( ! User::is_current_user_can_edit( $data['post_id'] ) ) { + throw new \Exception( 'Access denied.' ); + } + + Plugin::$instance->db->switch_to_post( $data['post_id'] ); + + $tags_data = []; + + $tag_key_parts = explode( '-', $data['tag'] ); + + $tag_name = base64_decode( $tag_key_parts[0] ); + + $tag_settings = json_decode( urldecode( base64_decode( $tag_key_parts[1] ) ), true ); + + $tag = $this->create_tag( null, $tag_name, $tag_settings ); + + $tags_data[ $data['tag'] ] = $tag->get_content(); + + return $tags_data; + } + /** * @since 2.0.0 * @access public @@ -495,6 +528,8 @@ public function after_enqueue_post_css( $css_file ) { */ public function register_ajax_actions( Ajax $ajax ) { $ajax->register_ajax_action( 'render_tags', [ $this, 'ajax_render_tags' ] ); + $ajax->register_ajax_action( 'render_tags_single', [ $this, 'ajax_render_tags_single' ] ); + } /** diff --git a/modules/nested-accordion/widgets/nested-accordion.php b/modules/nested-accordion/widgets/nested-accordion.php index b805bffbef42..81df75f40f35 100644 --- a/modules/nested-accordion/widgets/nested-accordion.php +++ b/modules/nested-accordion/widgets/nested-accordion.php @@ -896,6 +896,7 @@ protected function get_initial_config(): array { 'target_container' => [ '.e-n-accordion' ], 'node' => 'details', 'is_interlaced' => true, + 'title_container' => '.e-n-accordion-item-title-text', ] ); } @@ -951,7 +952,9 @@ protected function content_template_single_repeater_item() { protected function content_template() { ?>
- <# if ( settings['items'] ) { + <# + console.log('re-rendered'); + if ( settings['items'] ) { const elementUid = view.getIDInt().toString().substring( 0, 3 ), titleHTMLTag = elementor.helpers.validateHTMLTag( settings.title_tag ), defaultState = settings.default_state,