@elementor/editor-elements 3.32.0-70 → 3.32.0-71
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.d.mts +47 -4
- package/dist/index.d.ts +47 -4
- package/dist/index.js +167 -25
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +153 -14
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -5
- package/src/hooks/use-element-children.ts +11 -9
- package/src/index.ts +4 -1
- package/src/sync/create-element.ts +5 -8
- package/src/sync/create-elements.ts +101 -0
- package/src/sync/delete-element.ts +2 -1
- package/src/sync/generate-element-id.ts +10 -0
- package/src/sync/remove-elements.ts +101 -0
- package/src/sync/types.ts +10 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-elements",
|
|
3
3
|
"description": "This package contains the elements model for the Elementor editor",
|
|
4
|
-
"version": "3.32.0-
|
|
4
|
+
"version": "3.32.0-71",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "Elementor Team",
|
|
7
7
|
"homepage": "https://elementor.com/",
|
|
@@ -40,10 +40,11 @@
|
|
|
40
40
|
"dev": "tsup --config=../../tsup.dev.ts"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@elementor/editor-props": "3.32.0-
|
|
44
|
-
"@elementor/editor-styles": "3.32.0-
|
|
45
|
-
"@elementor/editor-v1-adapters": "3.32.0-
|
|
46
|
-
"@elementor/utils": "3.32.0-
|
|
43
|
+
"@elementor/editor-props": "3.32.0-71",
|
|
44
|
+
"@elementor/editor-styles": "3.32.0-71",
|
|
45
|
+
"@elementor/editor-v1-adapters": "3.32.0-71",
|
|
46
|
+
"@elementor/utils": "3.32.0-71",
|
|
47
|
+
"@wordpress/i18n": "^3.1.0"
|
|
47
48
|
},
|
|
48
49
|
"peerDependencies": {
|
|
49
50
|
"react": "^18.3.1"
|
|
@@ -24,19 +24,21 @@ export function useElementChildren< T extends ElementChildren >(
|
|
|
24
24
|
() => {
|
|
25
25
|
const container = getContainer( elementId );
|
|
26
26
|
|
|
27
|
-
const
|
|
27
|
+
const elementChildren = childrenTypes.reduce( ( acc, type ) => {
|
|
28
|
+
acc[ type ] = [];
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
return acc;
|
|
31
|
+
}, {} as ElementChildren );
|
|
32
|
+
|
|
33
|
+
container?.children?.forEachRecursive?.( ( { model, id } ) => {
|
|
34
|
+
const widgetType = model.get( 'widgetType' );
|
|
33
35
|
|
|
34
|
-
if (
|
|
35
|
-
|
|
36
|
+
if ( widgetType && widgetType in elementChildren ) {
|
|
37
|
+
elementChildren[ widgetType ].push( { id } );
|
|
36
38
|
}
|
|
39
|
+
} );
|
|
37
40
|
|
|
38
|
-
|
|
39
|
-
}, {} as ElementChildren );
|
|
41
|
+
return elementChildren;
|
|
40
42
|
},
|
|
41
43
|
[ elementId ]
|
|
42
44
|
) as T;
|
package/src/index.ts
CHANGED
|
@@ -10,8 +10,10 @@ export { useParentElement } from './hooks/use-parent-element';
|
|
|
10
10
|
export { useElementChildren, type ElementChildren } from './hooks/use-element-children';
|
|
11
11
|
|
|
12
12
|
// utils
|
|
13
|
-
export { createElement } from './sync/create-element';
|
|
13
|
+
export { createElement, type CreateElementParams } from './sync/create-element';
|
|
14
|
+
export { createElements } from './sync/create-elements';
|
|
14
15
|
export { deleteElement } from './sync/delete-element';
|
|
16
|
+
export { removeElements } from './sync/remove-elements';
|
|
15
17
|
export { getContainer, selectElement } from './sync/get-container';
|
|
16
18
|
export { getElementSetting, getElementSettings } from './sync/get-element-setting';
|
|
17
19
|
export { getElementStyles } from './sync/get-element-styles';
|
|
@@ -21,6 +23,7 @@ export { getCurrentDocumentId } from './sync/get-current-document-id';
|
|
|
21
23
|
export { getSelectedElements } from './sync/get-selected-elements';
|
|
22
24
|
export { getWidgetsCache } from './sync/get-widgets-cache';
|
|
23
25
|
export { updateElementSettings, type UpdateElementSettingsArgs } from './sync/update-element-settings';
|
|
26
|
+
export { generateElementId } from './sync/generate-element-id';
|
|
24
27
|
|
|
25
28
|
export { ELEMENT_STYLE_CHANGE_EVENT, styleRerenderEvents } from './styles/consts';
|
|
26
29
|
export {
|
|
@@ -5,21 +5,18 @@ import { type V1Element, type V1ElementSettingsProps } from './types';
|
|
|
5
5
|
|
|
6
6
|
type Options = {
|
|
7
7
|
useHistory?: boolean;
|
|
8
|
+
at?: number;
|
|
8
9
|
};
|
|
9
10
|
|
|
10
|
-
export
|
|
11
|
-
containerId,
|
|
12
|
-
settings,
|
|
13
|
-
type,
|
|
14
|
-
id,
|
|
15
|
-
options,
|
|
16
|
-
}: {
|
|
11
|
+
export type CreateElementParams = {
|
|
17
12
|
settings: V1ElementSettingsProps;
|
|
18
13
|
type: string;
|
|
19
14
|
containerId: string;
|
|
20
15
|
id?: string;
|
|
21
16
|
options?: Options;
|
|
22
|
-
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export function createElement( { containerId, settings, type, id, options }: CreateElementParams ) {
|
|
23
20
|
const container = getContainer( containerId );
|
|
24
21
|
const model = createElementModel( { settings, type, id } );
|
|
25
22
|
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { undoable } from '@elementor/editor-v1-adapters';
|
|
2
|
+
import { __ } from '@wordpress/i18n';
|
|
3
|
+
|
|
4
|
+
import { createElement, type CreateElementParams } from './create-element';
|
|
5
|
+
import { deleteElement } from './delete-element';
|
|
6
|
+
import { getContainer } from './get-container';
|
|
7
|
+
import { type V1ElementModelProps } from './types';
|
|
8
|
+
|
|
9
|
+
type CreateNestedElementsParams = {
|
|
10
|
+
elements: CreateElementParams[];
|
|
11
|
+
title: string;
|
|
12
|
+
subtitle?: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
type CreatedElement = {
|
|
16
|
+
elementId: string;
|
|
17
|
+
model: V1ElementModelProps;
|
|
18
|
+
createParams: CreateElementParams;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
type CreatedElementsResult = {
|
|
22
|
+
createdElements: CreatedElement[];
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export type { CreateNestedElementsParams, CreatedElement, CreatedElementsResult };
|
|
26
|
+
|
|
27
|
+
export const createElements = ( {
|
|
28
|
+
elements,
|
|
29
|
+
title,
|
|
30
|
+
subtitle = __( 'Item added', 'elementor' ),
|
|
31
|
+
}: CreateNestedElementsParams ): CreatedElementsResult => {
|
|
32
|
+
const undoableCreate = undoable(
|
|
33
|
+
{
|
|
34
|
+
do: ( { elements: elementsParam }: { elements: CreateElementParams[] } ): CreatedElementsResult => {
|
|
35
|
+
const createdElements: CreatedElement[] = [];
|
|
36
|
+
|
|
37
|
+
elementsParam.forEach( ( createParams ) => {
|
|
38
|
+
const { options, ...elementParams } = createParams;
|
|
39
|
+
const element = createElement( {
|
|
40
|
+
...elementParams,
|
|
41
|
+
options: { ...options, useHistory: false },
|
|
42
|
+
} );
|
|
43
|
+
|
|
44
|
+
const elementId = element.id;
|
|
45
|
+
|
|
46
|
+
createdElements.push( {
|
|
47
|
+
elementId,
|
|
48
|
+
model: element.model?.toJSON() || {},
|
|
49
|
+
createParams: {
|
|
50
|
+
...createParams,
|
|
51
|
+
id: elementId,
|
|
52
|
+
},
|
|
53
|
+
} );
|
|
54
|
+
} );
|
|
55
|
+
|
|
56
|
+
return { createdElements };
|
|
57
|
+
},
|
|
58
|
+
undo: ( _: { elements: CreateElementParams[] }, { createdElements }: CreatedElementsResult ) => {
|
|
59
|
+
// Delete elements in reverse order to avoid dependency issues
|
|
60
|
+
[ ...createdElements ].reverse().forEach( ( { elementId } ) => {
|
|
61
|
+
deleteElement( {
|
|
62
|
+
elementId,
|
|
63
|
+
options: { useHistory: false },
|
|
64
|
+
} );
|
|
65
|
+
} );
|
|
66
|
+
},
|
|
67
|
+
redo: (
|
|
68
|
+
_: { elements: CreateElementParams[] },
|
|
69
|
+
{ createdElements }: CreatedElementsResult
|
|
70
|
+
): CreatedElementsResult => {
|
|
71
|
+
const newElements: CreatedElement[] = [];
|
|
72
|
+
|
|
73
|
+
createdElements.forEach( ( { createParams } ) => {
|
|
74
|
+
const element = createElement( {
|
|
75
|
+
...createParams,
|
|
76
|
+
options: { ...createParams.options, useHistory: false },
|
|
77
|
+
} );
|
|
78
|
+
|
|
79
|
+
const elementId = element.id;
|
|
80
|
+
|
|
81
|
+
const container = getContainer( elementId );
|
|
82
|
+
if ( container ) {
|
|
83
|
+
newElements.push( {
|
|
84
|
+
elementId,
|
|
85
|
+
model: container.model.toJSON(),
|
|
86
|
+
createParams,
|
|
87
|
+
} );
|
|
88
|
+
}
|
|
89
|
+
} );
|
|
90
|
+
|
|
91
|
+
return { createdElements: newElements };
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
title,
|
|
96
|
+
subtitle,
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
return undoableCreate( { elements } );
|
|
101
|
+
};
|
|
@@ -4,9 +4,10 @@ import { getContainer } from './get-container';
|
|
|
4
4
|
|
|
5
5
|
type Options = {
|
|
6
6
|
useHistory?: boolean;
|
|
7
|
+
at?: number;
|
|
7
8
|
};
|
|
8
9
|
|
|
9
|
-
export function deleteElement( { elementId, options }: { elementId: string; options?: Options } ): void {
|
|
10
|
+
export function deleteElement( { elementId, options = {} }: { elementId: string; options?: Options } ): void {
|
|
10
11
|
const container = getContainer( elementId );
|
|
11
12
|
|
|
12
13
|
if ( ! container ) {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ExtendedWindow } from './types';
|
|
2
|
+
|
|
3
|
+
export const generateElementId = () => {
|
|
4
|
+
const extendedWindow = window as unknown as ExtendedWindow;
|
|
5
|
+
|
|
6
|
+
return (
|
|
7
|
+
extendedWindow.elementorCommon?.helpers?.getUniqueId?.() ??
|
|
8
|
+
`el-${ Date.now() }-${ Math.random().toString( 36 ).substring( 2, 9 ) }`
|
|
9
|
+
);
|
|
10
|
+
};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { undoable } from '@elementor/editor-v1-adapters';
|
|
2
|
+
import { __ } from '@wordpress/i18n';
|
|
3
|
+
|
|
4
|
+
import { createElement } from './create-element';
|
|
5
|
+
import { deleteElement } from './delete-element';
|
|
6
|
+
import { getContainer } from './get-container';
|
|
7
|
+
import { type V1Element, type V1ElementModelProps } from './types';
|
|
8
|
+
|
|
9
|
+
type RemoveNestedElementsParams = {
|
|
10
|
+
elementIds: string[];
|
|
11
|
+
title: string;
|
|
12
|
+
subtitle?: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
type RemovedElement = {
|
|
16
|
+
elementId: string;
|
|
17
|
+
model: V1ElementModelProps;
|
|
18
|
+
parent: V1Element | null;
|
|
19
|
+
at: number;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
type RemovedElementsResult = {
|
|
23
|
+
elementIds: string[];
|
|
24
|
+
removedElements: RemovedElement[];
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type { RemoveNestedElementsParams, RemovedElement, RemovedElementsResult };
|
|
28
|
+
|
|
29
|
+
export const removeElements = ( {
|
|
30
|
+
elementIds,
|
|
31
|
+
title,
|
|
32
|
+
subtitle = __( 'Item removed', 'elementor' ),
|
|
33
|
+
}: RemoveNestedElementsParams ): RemovedElementsResult => {
|
|
34
|
+
const undoableRemove = undoable(
|
|
35
|
+
{
|
|
36
|
+
do: ( { elementIds: elementIdsParam }: { elementIds: string[] } ): RemovedElementsResult => {
|
|
37
|
+
const removedElements: RemovedElement[] = [];
|
|
38
|
+
|
|
39
|
+
elementIdsParam.forEach( ( elementId ) => {
|
|
40
|
+
const container = getContainer( elementId );
|
|
41
|
+
|
|
42
|
+
if ( container ) {
|
|
43
|
+
const model = container.model.toJSON();
|
|
44
|
+
const parent = container.parent;
|
|
45
|
+
|
|
46
|
+
const at = container.view?._index ?? 0;
|
|
47
|
+
|
|
48
|
+
removedElements.push( {
|
|
49
|
+
elementId,
|
|
50
|
+
model,
|
|
51
|
+
parent: parent ?? null,
|
|
52
|
+
at,
|
|
53
|
+
} );
|
|
54
|
+
}
|
|
55
|
+
} );
|
|
56
|
+
|
|
57
|
+
elementIdsParam.forEach( ( elementId ) => {
|
|
58
|
+
deleteElement( {
|
|
59
|
+
elementId,
|
|
60
|
+
options: { useHistory: false },
|
|
61
|
+
} );
|
|
62
|
+
} );
|
|
63
|
+
|
|
64
|
+
return { elementIds: elementIdsParam, removedElements };
|
|
65
|
+
},
|
|
66
|
+
undo: ( _: { elementIds: string[] }, { removedElements }: RemovedElementsResult ) => {
|
|
67
|
+
// Restore elements in reverse order to maintain proper hierarchy
|
|
68
|
+
[ ...removedElements ].reverse().forEach( ( { model, parent, at } ) => {
|
|
69
|
+
if ( parent && model ) {
|
|
70
|
+
createElement( {
|
|
71
|
+
containerId: parent.id,
|
|
72
|
+
settings: model.settings || {},
|
|
73
|
+
type: model.widgetType || model.elType,
|
|
74
|
+
id: model.id,
|
|
75
|
+
options: { useHistory: false, at },
|
|
76
|
+
} );
|
|
77
|
+
}
|
|
78
|
+
} );
|
|
79
|
+
},
|
|
80
|
+
redo: (
|
|
81
|
+
_: { elementIds: string[] },
|
|
82
|
+
{ elementIds: originalElementIds, removedElements }: RemovedElementsResult
|
|
83
|
+
): RemovedElementsResult => {
|
|
84
|
+
originalElementIds.forEach( ( elementId ) => {
|
|
85
|
+
deleteElement( {
|
|
86
|
+
elementId,
|
|
87
|
+
options: { useHistory: false },
|
|
88
|
+
} );
|
|
89
|
+
} );
|
|
90
|
+
|
|
91
|
+
return { elementIds: originalElementIds, removedElements };
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
title,
|
|
96
|
+
subtitle,
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
return undoableRemove( { elementIds } );
|
|
101
|
+
};
|
package/src/sync/types.ts
CHANGED
|
@@ -19,15 +19,24 @@ export type ExtendedWindow = Window & {
|
|
|
19
19
|
};
|
|
20
20
|
getContainer?: ( id: string ) => V1Element | undefined;
|
|
21
21
|
};
|
|
22
|
+
elementorCommon?: {
|
|
23
|
+
helpers?: {
|
|
24
|
+
getUniqueId?: () => string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
22
27
|
};
|
|
23
28
|
|
|
24
29
|
export type V1Element = {
|
|
25
30
|
id: string;
|
|
26
31
|
model: V1Model< V1ElementModelProps >;
|
|
27
32
|
settings: V1Model< V1ElementSettingsProps >;
|
|
28
|
-
children?: V1Element[]
|
|
33
|
+
children?: V1Element[] & {
|
|
34
|
+
findRecursive?: ( predicate: ( child: V1Element ) => boolean ) => V1Element | undefined;
|
|
35
|
+
forEachRecursive?: ( callback: ( child: V1Element ) => void ) => V1Element[];
|
|
36
|
+
};
|
|
29
37
|
view?: {
|
|
30
38
|
el?: HTMLElement;
|
|
39
|
+
_index?: number;
|
|
31
40
|
getDomElement?: () => {
|
|
32
41
|
get?: ( index: number ) => HTMLElement | undefined;
|
|
33
42
|
};
|