@elementor/editor-components 3.35.4 → 3.35.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elementor/editor-components",
3
3
  "description": "Elementor editor components",
4
- "version": "3.35.4",
4
+ "version": "3.35.6",
5
5
  "private": false,
6
6
  "author": "Elementor Team",
7
7
  "homepage": "https://elementor.com/",
@@ -40,30 +40,31 @@
40
40
  "dev": "tsup --config=../../tsup.dev.ts"
41
41
  },
42
42
  "dependencies": {
43
- "@elementor/editor": "3.35.4",
44
- "@elementor/editor-canvas": "3.35.4",
45
- "@elementor/editor-controls": "3.35.4",
46
- "@elementor/editor-documents": "3.35.4",
47
- "@elementor/editor-editing-panel": "3.35.4",
48
- "@elementor/editor-elements": "3.35.4",
49
- "@elementor/editor-elements-panel": "3.35.4",
50
- "@elementor/editor-mcp": "3.35.4",
51
- "@elementor/editor-panels": "3.35.4",
52
- "@elementor/editor-props": "3.35.4",
53
- "@elementor/editor-styles-repository": "3.35.4",
54
- "@elementor/editor-ui": "3.35.4",
55
- "@elementor/editor-v1-adapters": "3.35.4",
56
- "@elementor/http-client": "3.35.4",
43
+ "@elementor/editor": "3.35.6",
44
+ "@elementor/editor-canvas": "3.35.6",
45
+ "@elementor/editor-controls": "3.35.6",
46
+ "@elementor/editor-documents": "3.35.6",
47
+ "@elementor/editor-editing-panel": "3.35.6",
48
+ "@elementor/editor-elements": "3.35.6",
49
+ "@elementor/editor-elements-panel": "3.35.6",
50
+ "@elementor/editor-mcp": "3.35.6",
51
+ "@elementor/editor-panels": "3.35.6",
52
+ "@elementor/editor-props": "3.35.6",
53
+ "@elementor/editor-styles-repository": "3.35.6",
54
+ "@elementor/editor-templates": "3.35.6",
55
+ "@elementor/editor-ui": "3.35.6",
56
+ "@elementor/editor-v1-adapters": "3.35.6",
57
+ "@elementor/http-client": "3.35.6",
57
58
  "@elementor/icons": "^1.63.0",
58
- "@elementor/events": "3.35.4",
59
- "@elementor/query": "3.35.4",
60
- "@elementor/schema": "3.35.4",
61
- "@elementor/store": "3.35.4",
59
+ "@elementor/events": "3.35.6",
60
+ "@elementor/query": "3.35.6",
61
+ "@elementor/schema": "3.35.6",
62
+ "@elementor/store": "3.35.6",
62
63
  "@elementor/ui": "1.36.17",
63
- "@elementor/utils": "3.35.4",
64
+ "@elementor/utils": "3.35.6",
64
65
  "@wordpress/i18n": "^5.13.0",
65
- "@elementor/editor-notifications": "3.35.4",
66
- "@elementor/editor-current-user": "3.35.4"
66
+ "@elementor/editor-notifications": "3.35.6",
67
+ "@elementor/editor-current-user": "3.35.6"
67
68
  },
68
69
  "peerDependencies": {
69
70
  "react": "^18.3.1",
@@ -0,0 +1,14 @@
1
+ import { useEffect } from 'react';
2
+ import { useLoadedTemplates } from '@elementor/editor-templates';
3
+
4
+ import { loadComponentsAssets } from '../store/actions/load-components-assets';
5
+
6
+ export const LoadTemplateComponents = () => {
7
+ const templates = useLoadedTemplates();
8
+
9
+ useEffect( () => {
10
+ loadComponentsAssets( templates.flatMap( ( elements ) => elements ?? [] ) );
11
+ }, [ templates ] );
12
+
13
+ return null;
14
+ };
package/src/init.ts CHANGED
@@ -31,6 +31,7 @@ import { CreateComponentForm } from './components/create-component-form/create-c
31
31
  import { EditComponent } from './components/edit-component/edit-component';
32
32
  import { openEditModeDialog } from './components/in-edit-mode';
33
33
  import { InstanceEditingPanel } from './components/instance-editing-panel/instance-editing-panel';
34
+ import { LoadTemplateComponents } from './components/load-template-components';
34
35
  import { OverridablePropControl } from './components/overridable-props/overridable-prop-control';
35
36
  import { OverridablePropIndicator } from './components/overridable-props/overridable-prop-indicator';
36
37
  import { COMPONENT_WIDGET_TYPE, createComponentType } from './create-component-type';
@@ -110,6 +111,11 @@ export function init() {
110
111
  await loadComponentsAssets( ( config?.elements as V1ElementData[] ) ?? [] );
111
112
  } );
112
113
 
114
+ injectIntoLogic( {
115
+ id: 'templates',
116
+ component: LoadTemplateComponents,
117
+ } );
118
+
113
119
  registerFieldIndicator( {
114
120
  fieldType: FIELD_TYPE.SETTINGS,
115
121
  id: 'component-overridable-prop',
@@ -1,6 +1,6 @@
1
1
  import { __dispatch as dispatch, __getState as getState } from '@elementor/store';
2
2
 
3
- import { type ComponentId } from '../../types';
3
+ import { type ComponentId, type OverridableProp } from '../../types';
4
4
  import { revertElementOverridableSetting } from '../../utils/revert-overridable-settings';
5
5
  import { type Source, trackComponentEvent } from '../../utils/tracking';
6
6
  import { selectCurrentComponent, selectOverridableProps, slice } from '../store';
@@ -8,26 +8,38 @@ import { removePropFromAllGroups } from '../utils/groups-transformers';
8
8
 
9
9
  type DeletePropParams = {
10
10
  componentId: ComponentId;
11
- propKey: string;
11
+ propKey: string | string[];
12
12
  source: Source;
13
13
  };
14
14
 
15
15
  export function deleteOverridableProp( { componentId, propKey, source }: DeletePropParams ): void {
16
16
  const overridableProps = selectOverridableProps( getState(), componentId );
17
17
 
18
- if ( ! overridableProps ) {
18
+ if ( ! overridableProps || Object.keys( overridableProps.props ).length === 0 ) {
19
19
  return;
20
20
  }
21
21
 
22
- const prop = overridableProps.props[ propKey ];
22
+ const propKeysToDelete = Array.isArray( propKey ) ? propKey : [ propKey ];
23
+ const deletedProps: OverridableProp[] = [];
23
24
 
24
- if ( ! prop ) {
25
- return;
25
+ for ( const key of propKeysToDelete ) {
26
+ const prop = overridableProps.props[ key ];
27
+
28
+ if ( ! prop ) {
29
+ continue;
30
+ }
31
+
32
+ deletedProps.push( prop );
33
+ revertElementOverridableSetting( prop.elementId, prop.propKey, prop.originValue, key );
26
34
  }
27
35
 
28
- revertElementOverridableSetting( prop.elementId, prop.propKey, prop.originValue, propKey );
36
+ if ( deletedProps.length === 0 ) {
37
+ return;
38
+ }
29
39
 
30
- const { [ propKey ]: removedProp, ...remainingProps } = overridableProps.props;
40
+ const remainingProps = Object.fromEntries(
41
+ Object.entries( overridableProps.props ).filter( ( [ key ] ) => ! propKeysToDelete.includes( key ) )
42
+ );
31
43
 
32
44
  const updatedGroups = removePropFromAllGroups( overridableProps.groups, propKey );
33
45
 
@@ -44,13 +56,15 @@ export function deleteOverridableProp( { componentId, propKey, source }: DeleteP
44
56
 
45
57
  const currentComponent = selectCurrentComponent( getState() );
46
58
 
47
- trackComponentEvent( {
48
- action: 'propertyRemoved',
49
- source,
50
- component_uid: currentComponent?.uid,
51
- property_id: removedProp.overrideKey,
52
- property_path: removedProp.propKey,
53
- property_name: removedProp.label,
54
- element_type: removedProp.widgetType ?? removedProp.elType,
55
- } );
59
+ for ( const prop of deletedProps ) {
60
+ trackComponentEvent( {
61
+ action: 'propertyRemoved',
62
+ source,
63
+ component_uid: currentComponent?.uid,
64
+ property_id: prop.overrideKey,
65
+ property_path: prop.propKey,
66
+ property_name: prop.label,
67
+ element_type: prop.widgetType ?? prop.elType,
68
+ } );
69
+ }
56
70
  }
@@ -5,7 +5,9 @@ import { type OverridableProp, type OverridableProps, type OverridablePropsGroup
5
5
 
6
6
  type Groups = OverridableProps[ 'groups' ];
7
7
 
8
- export function removePropFromAllGroups( groups: Groups, propKey: string ): Groups {
8
+ export function removePropFromAllGroups( groups: Groups, propKey: string | string[] ): Groups {
9
+ const propKeys = Array.isArray( propKey ) ? propKey : [ propKey ];
10
+
9
11
  return {
10
12
  ...groups,
11
13
  items: Object.fromEntries(
@@ -13,7 +15,7 @@ export function removePropFromAllGroups( groups: Groups, propKey: string ): Grou
13
15
  groupId,
14
16
  {
15
17
  ...group,
16
- props: group.props.filter( ( p ) => p !== propKey ),
18
+ props: group.props.filter( ( p ) => ! propKeys.includes( p ) ),
17
19
  },
18
20
  ] )
19
21
  ),
@@ -1,9 +1,9 @@
1
1
  import { getAllDescendants, type V1Element } from '@elementor/editor-elements';
2
- import { registerDataHook } from '@elementor/editor-v1-adapters';
3
- import { __dispatch as dispatch, __getState as getState } from '@elementor/store';
2
+ import { type HookOptions, registerDataHook } from '@elementor/editor-v1-adapters';
3
+ import { __getState as getState } from '@elementor/store';
4
4
 
5
- import { type ComponentsSlice, selectCurrentComponentId, selectOverridableProps, slice } from '../store/store';
6
- import { removePropFromAllGroups } from '../store/utils/groups-transformers';
5
+ import { deleteOverridableProp } from '../store/actions/delete-overridable-prop';
6
+ import { type ComponentsSlice, selectCurrentComponentId, selectOverridableProps } from '../store/store';
7
7
 
8
8
  type DeleteCommandArgs = {
9
9
  container?: V1Element;
@@ -11,7 +11,14 @@ type DeleteCommandArgs = {
11
11
  };
12
12
 
13
13
  export function initCleanupOverridablePropsOnDelete() {
14
- registerDataHook( 'dependency', 'document/elements/delete', ( args: DeleteCommandArgs ) => {
14
+ // This hook is not a real dependency - it doesn't block the execution of the command in any case, only perform side effect.
15
+ // We use `dependency` and not `after` hook because the `after` hook doesn't include the children of a deleted container
16
+ // in the callback parameters (as they already were deleted).
17
+ registerDataHook( 'dependency', 'document/elements/delete', ( args: DeleteCommandArgs, options?: HookOptions ) => {
18
+ if ( isPartOfMoveCommand( options ) ) {
19
+ return true;
20
+ }
21
+
15
22
  const state = getState() as ComponentsSlice | undefined;
16
23
 
17
24
  if ( ! state ) {
@@ -50,25 +57,7 @@ export function initCleanupOverridablePropsOnDelete() {
50
57
  return true;
51
58
  }
52
59
 
53
- const remainingProps = Object.fromEntries(
54
- Object.entries( overridableProps.props ).filter( ( [ propKey ] ) => ! propKeysToDelete.includes( propKey ) )
55
- );
56
-
57
- let updatedGroups = overridableProps.groups;
58
- for ( const propKey of propKeysToDelete ) {
59
- updatedGroups = removePropFromAllGroups( updatedGroups, propKey );
60
- }
61
-
62
- dispatch(
63
- slice.actions.setOverridableProps( {
64
- componentId: currentComponentId,
65
- overridableProps: {
66
- ...overridableProps,
67
- props: remainingProps,
68
- groups: updatedGroups,
69
- },
70
- } )
71
- );
60
+ deleteOverridableProp( { componentId: currentComponentId, propKey: propKeysToDelete, source: 'system' } );
72
61
 
73
62
  return true;
74
63
  } );
@@ -83,3 +72,14 @@ function collectDeletedElementIds( containers: V1Element[] ): string[] {
83
72
 
84
73
  return elementIds;
85
74
  }
75
+
76
+ function isPartOfMoveCommand( options?: HookOptions ): boolean {
77
+ // Skip cleanup if this delete is part of a move command
78
+ // Move = delete + create, and we don't want to delete the overridable prop in this case.
79
+ // See assets/dev/js/editor/document/elements/commands/move.js
80
+ const isMoveCommandInTrace =
81
+ options?.commandsCurrentTrace?.includes( 'document/elements/move' ) ||
82
+ options?.commandsCurrentTrace?.includes( 'document/repeater/move' );
83
+
84
+ return Boolean( isMoveCommandInTrace );
85
+ }
@@ -5,7 +5,7 @@ import { __getState as getState } from '@elementor/store';
5
5
  import { selectCreatedThisSession } from '../store/store';
6
6
  import { type ExtendedWindow } from '../types';
7
7
 
8
- export type Source = 'user' | 'mcp_tool';
8
+ export type Source = 'user' | 'mcp_tool' | 'system';
9
9
 
10
10
  type ComponentEventData = Record< string, unknown > & {
11
11
  action: