@elementor/editor-components 3.35.5 → 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/dist/index.js +60 -41
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +59 -40
- package/dist/index.mjs.map +1 -1
- package/package.json +23 -22
- package/src/components/load-template-components.tsx +14 -0
- package/src/init.ts +6 -0
- package/src/store/actions/delete-overridable-prop.ts +31 -17
- package/src/store/utils/groups-transformers.ts +4 -2
- package/src/sync/cleanup-overridable-props-on-delete.ts +24 -24
- package/src/utils/tracking.ts +1 -1
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
|
+
"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.
|
|
44
|
-
"@elementor/editor-canvas": "3.35.
|
|
45
|
-
"@elementor/editor-controls": "3.35.
|
|
46
|
-
"@elementor/editor-documents": "3.35.
|
|
47
|
-
"@elementor/editor-editing-panel": "3.35.
|
|
48
|
-
"@elementor/editor-elements": "3.35.
|
|
49
|
-
"@elementor/editor-elements-panel": "3.35.
|
|
50
|
-
"@elementor/editor-mcp": "3.35.
|
|
51
|
-
"@elementor/editor-panels": "3.35.
|
|
52
|
-
"@elementor/editor-props": "3.35.
|
|
53
|
-
"@elementor/editor-styles-repository": "3.35.
|
|
54
|
-
"@elementor/editor-
|
|
55
|
-
"@elementor/editor-
|
|
56
|
-
"@elementor/
|
|
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.
|
|
59
|
-
"@elementor/query": "3.35.
|
|
60
|
-
"@elementor/schema": "3.35.
|
|
61
|
-
"@elementor/store": "3.35.
|
|
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.
|
|
64
|
+
"@elementor/utils": "3.35.6",
|
|
64
65
|
"@wordpress/i18n": "^5.13.0",
|
|
65
|
-
"@elementor/editor-notifications": "3.35.
|
|
66
|
-
"@elementor/editor-current-user": "3.35.
|
|
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
|
|
22
|
+
const propKeysToDelete = Array.isArray( propKey ) ? propKey : [ propKey ];
|
|
23
|
+
const deletedProps: OverridableProp[] = [];
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
36
|
+
if ( deletedProps.length === 0 ) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
29
39
|
|
|
30
|
-
const
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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 ) =>
|
|
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 {
|
|
2
|
+
import { type HookOptions, registerDataHook } from '@elementor/editor-v1-adapters';
|
|
3
|
+
import { __getState as getState } from '@elementor/store';
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
}
|
package/src/utils/tracking.ts
CHANGED
|
@@ -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:
|