@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 CHANGED
@@ -43,9 +43,13 @@ type V1Element = {
43
43
  id: string;
44
44
  model: V1Model<V1ElementModelProps>;
45
45
  settings: V1Model<V1ElementSettingsProps>;
46
- children?: V1Element[];
46
+ children?: V1Element[] & {
47
+ findRecursive?: (predicate: (child: V1Element) => boolean) => V1Element | undefined;
48
+ forEachRecursive?: (callback: (child: V1Element) => void) => V1Element[];
49
+ };
47
50
  view?: {
48
51
  el?: HTMLElement;
52
+ _index?: number;
49
53
  getDomElement?: () => {
50
54
  get?: (index: number) => HTMLElement | undefined;
51
55
  };
@@ -102,23 +106,60 @@ declare function useElementChildren<T extends ElementChildren>(elementId: Elemen
102
106
 
103
107
  type Options$1 = {
104
108
  useHistory?: boolean;
109
+ at?: number;
105
110
  };
106
- declare function createElement({ containerId, settings, type, id, options, }: {
111
+ type CreateElementParams = {
107
112
  settings: V1ElementSettingsProps;
108
113
  type: string;
109
114
  containerId: string;
110
115
  id?: string;
111
116
  options?: Options$1;
112
- }): V1Element;
117
+ };
118
+ declare function createElement({ containerId, settings, type, id, options }: CreateElementParams): V1Element;
119
+
120
+ type CreateNestedElementsParams = {
121
+ elements: CreateElementParams[];
122
+ title: string;
123
+ subtitle?: string;
124
+ };
125
+ type CreatedElement = {
126
+ elementId: string;
127
+ model: V1ElementModelProps;
128
+ createParams: CreateElementParams;
129
+ };
130
+ type CreatedElementsResult = {
131
+ createdElements: CreatedElement[];
132
+ };
133
+
134
+ declare const createElements: ({ elements, title, subtitle, }: CreateNestedElementsParams) => CreatedElementsResult;
113
135
 
114
136
  type Options = {
115
137
  useHistory?: boolean;
138
+ at?: number;
116
139
  };
117
140
  declare function deleteElement({ elementId, options }: {
118
141
  elementId: string;
119
142
  options?: Options;
120
143
  }): void;
121
144
 
145
+ type RemoveNestedElementsParams = {
146
+ elementIds: string[];
147
+ title: string;
148
+ subtitle?: string;
149
+ };
150
+ type RemovedElement = {
151
+ elementId: string;
152
+ model: V1ElementModelProps;
153
+ parent: V1Element | null;
154
+ at: number;
155
+ };
156
+ type RemovedElementsResult = {
157
+ elementIds: string[];
158
+ removedElements: RemovedElement[];
159
+ };
160
+
161
+ declare const removeElements: ({ elementIds, title, subtitle, }: RemoveNestedElementsParams) => RemovedElementsResult;
162
+
122
163
  declare function getContainer(id: string): V1Element | null;
123
164
  declare const selectElement: (elementId: string) => void;
124
165
 
@@ -144,6 +185,8 @@ type UpdateElementSettingsArgs = {
144
185
  };
145
186
  declare const updateElementSettings: ({ id, props, withHistory }: UpdateElementSettingsArgs) => void;
146
187
 
188
+ declare const generateElementId: () => string;
189
+
147
190
  declare const ELEMENT_STYLE_CHANGE_EVENT = "elementor/editor-v2/editor-elements/style";
148
191
  declare const styleRerenderEvents: (_elementor_editor_v1_adapters.CommandEventDescriptor | _elementor_editor_v1_adapters.WindowEventDescriptor)[];
149
192
 
@@ -188,4 +231,4 @@ declare function getAnchoredDescendantId(elementId: string): string | null;
188
231
  declare function getAnchoredAncestorId(elementId: string): string | null;
189
232
  declare function isElementAnchored(elementId: string): boolean;
190
233
 
191
- export { type Control, type ControlItem, type ControlLayout, type ControlsSection, type CreateElementStyleArgs, ELEMENT_STYLE_CHANGE_EVENT, type Element, type ElementChildren, type ElementID, type ElementType, type LinkInLinkRestriction, type UpdateElementSettingsArgs, type UpdateElementStyleArgs, type V1Element, type V1ElementConfig, type V1ElementModelProps, type V1ElementSettingsProps, createElement, createElementStyle, deleteElement, deleteElementStyle, getAnchoredAncestorId, getAnchoredDescendantId, getContainer, getCurrentDocumentId, getElementLabel, getElementSetting, getElementSettings, getElementStyles, getElements, getLinkInLinkRestriction, getSelectedElements, getWidgetsCache, isElementAnchored, selectElement, shouldCreateNewLocalStyle, styleRerenderEvents, updateElementSettings, updateElementStyle, useElementChildren, useElementSetting, useElementSettings, useElementType, useParentElement, useSelectedElement };
234
+ export { type Control, type ControlItem, type ControlLayout, type ControlsSection, type CreateElementParams, type CreateElementStyleArgs, ELEMENT_STYLE_CHANGE_EVENT, type Element, type ElementChildren, type ElementID, type ElementType, type LinkInLinkRestriction, type UpdateElementSettingsArgs, type UpdateElementStyleArgs, type V1Element, type V1ElementConfig, type V1ElementModelProps, type V1ElementSettingsProps, createElement, createElementStyle, createElements, deleteElement, deleteElementStyle, generateElementId, getAnchoredAncestorId, getAnchoredDescendantId, getContainer, getCurrentDocumentId, getElementLabel, getElementSetting, getElementSettings, getElementStyles, getElements, getLinkInLinkRestriction, getSelectedElements, getWidgetsCache, isElementAnchored, removeElements, selectElement, shouldCreateNewLocalStyle, styleRerenderEvents, updateElementSettings, updateElementStyle, useElementChildren, useElementSetting, useElementSettings, useElementType, useParentElement, useSelectedElement };
package/dist/index.d.ts CHANGED
@@ -43,9 +43,13 @@ type V1Element = {
43
43
  id: string;
44
44
  model: V1Model<V1ElementModelProps>;
45
45
  settings: V1Model<V1ElementSettingsProps>;
46
- children?: V1Element[];
46
+ children?: V1Element[] & {
47
+ findRecursive?: (predicate: (child: V1Element) => boolean) => V1Element | undefined;
48
+ forEachRecursive?: (callback: (child: V1Element) => void) => V1Element[];
49
+ };
47
50
  view?: {
48
51
  el?: HTMLElement;
52
+ _index?: number;
49
53
  getDomElement?: () => {
50
54
  get?: (index: number) => HTMLElement | undefined;
51
55
  };
@@ -102,23 +106,60 @@ declare function useElementChildren<T extends ElementChildren>(elementId: Elemen
102
106
 
103
107
  type Options$1 = {
104
108
  useHistory?: boolean;
109
+ at?: number;
105
110
  };
106
- declare function createElement({ containerId, settings, type, id, options, }: {
111
+ type CreateElementParams = {
107
112
  settings: V1ElementSettingsProps;
108
113
  type: string;
109
114
  containerId: string;
110
115
  id?: string;
111
116
  options?: Options$1;
112
- }): V1Element;
117
+ };
118
+ declare function createElement({ containerId, settings, type, id, options }: CreateElementParams): V1Element;
119
+
120
+ type CreateNestedElementsParams = {
121
+ elements: CreateElementParams[];
122
+ title: string;
123
+ subtitle?: string;
124
+ };
125
+ type CreatedElement = {
126
+ elementId: string;
127
+ model: V1ElementModelProps;
128
+ createParams: CreateElementParams;
129
+ };
130
+ type CreatedElementsResult = {
131
+ createdElements: CreatedElement[];
132
+ };
133
+
134
+ declare const createElements: ({ elements, title, subtitle, }: CreateNestedElementsParams) => CreatedElementsResult;
113
135
 
114
136
  type Options = {
115
137
  useHistory?: boolean;
138
+ at?: number;
116
139
  };
117
140
  declare function deleteElement({ elementId, options }: {
118
141
  elementId: string;
119
142
  options?: Options;
120
143
  }): void;
121
144
 
145
+ type RemoveNestedElementsParams = {
146
+ elementIds: string[];
147
+ title: string;
148
+ subtitle?: string;
149
+ };
150
+ type RemovedElement = {
151
+ elementId: string;
152
+ model: V1ElementModelProps;
153
+ parent: V1Element | null;
154
+ at: number;
155
+ };
156
+ type RemovedElementsResult = {
157
+ elementIds: string[];
158
+ removedElements: RemovedElement[];
159
+ };
160
+
161
+ declare const removeElements: ({ elementIds, title, subtitle, }: RemoveNestedElementsParams) => RemovedElementsResult;
162
+
122
163
  declare function getContainer(id: string): V1Element | null;
123
164
  declare const selectElement: (elementId: string) => void;
124
165
 
@@ -144,6 +185,8 @@ type UpdateElementSettingsArgs = {
144
185
  };
145
186
  declare const updateElementSettings: ({ id, props, withHistory }: UpdateElementSettingsArgs) => void;
146
187
 
188
+ declare const generateElementId: () => string;
189
+
147
190
  declare const ELEMENT_STYLE_CHANGE_EVENT = "elementor/editor-v2/editor-elements/style";
148
191
  declare const styleRerenderEvents: (_elementor_editor_v1_adapters.CommandEventDescriptor | _elementor_editor_v1_adapters.WindowEventDescriptor)[];
149
192
 
@@ -188,4 +231,4 @@ declare function getAnchoredDescendantId(elementId: string): string | null;
188
231
  declare function getAnchoredAncestorId(elementId: string): string | null;
189
232
  declare function isElementAnchored(elementId: string): boolean;
190
233
 
191
- export { type Control, type ControlItem, type ControlLayout, type ControlsSection, type CreateElementStyleArgs, ELEMENT_STYLE_CHANGE_EVENT, type Element, type ElementChildren, type ElementID, type ElementType, type LinkInLinkRestriction, type UpdateElementSettingsArgs, type UpdateElementStyleArgs, type V1Element, type V1ElementConfig, type V1ElementModelProps, type V1ElementSettingsProps, createElement, createElementStyle, deleteElement, deleteElementStyle, getAnchoredAncestorId, getAnchoredDescendantId, getContainer, getCurrentDocumentId, getElementLabel, getElementSetting, getElementSettings, getElementStyles, getElements, getLinkInLinkRestriction, getSelectedElements, getWidgetsCache, isElementAnchored, selectElement, shouldCreateNewLocalStyle, styleRerenderEvents, updateElementSettings, updateElementStyle, useElementChildren, useElementSetting, useElementSettings, useElementType, useParentElement, useSelectedElement };
234
+ export { type Control, type ControlItem, type ControlLayout, type ControlsSection, type CreateElementParams, type CreateElementStyleArgs, ELEMENT_STYLE_CHANGE_EVENT, type Element, type ElementChildren, type ElementID, type ElementType, type LinkInLinkRestriction, type UpdateElementSettingsArgs, type UpdateElementStyleArgs, type V1Element, type V1ElementConfig, type V1ElementModelProps, type V1ElementSettingsProps, createElement, createElementStyle, createElements, deleteElement, deleteElementStyle, generateElementId, getAnchoredAncestorId, getAnchoredDescendantId, getContainer, getCurrentDocumentId, getElementLabel, getElementSetting, getElementSettings, getElementStyles, getElements, getLinkInLinkRestriction, getSelectedElements, getWidgetsCache, isElementAnchored, removeElements, selectElement, shouldCreateNewLocalStyle, styleRerenderEvents, updateElementSettings, updateElementStyle, useElementChildren, useElementSetting, useElementSettings, useElementType, useParentElement, useSelectedElement };
package/dist/index.js CHANGED
@@ -23,8 +23,10 @@ __export(index_exports, {
23
23
  ELEMENT_STYLE_CHANGE_EVENT: () => ELEMENT_STYLE_CHANGE_EVENT,
24
24
  createElement: () => createElement,
25
25
  createElementStyle: () => createElementStyle,
26
+ createElements: () => createElements,
26
27
  deleteElement: () => deleteElement,
27
28
  deleteElementStyle: () => deleteElementStyle,
29
+ generateElementId: () => generateElementId,
28
30
  getAnchoredAncestorId: () => getAnchoredAncestorId,
29
31
  getAnchoredDescendantId: () => getAnchoredDescendantId,
30
32
  getContainer: () => getContainer,
@@ -38,6 +40,7 @@ __export(index_exports, {
38
40
  getSelectedElements: () => getSelectedElements,
39
41
  getWidgetsCache: () => getWidgetsCache,
40
42
  isElementAnchored: () => isElementAnchored,
43
+ removeElements: () => removeElements,
41
44
  selectElement: () => selectElement,
42
45
  shouldCreateNewLocalStyle: () => shouldCreateNewLocalStyle,
43
46
  styleRerenderEvents: () => styleRerenderEvents,
@@ -209,14 +212,17 @@ function useElementChildren(elementId, childrenTypes) {
209
212
  ],
210
213
  () => {
211
214
  const container = getContainer(elementId);
212
- const children = container?.children || [];
213
- return childrenTypes.reduce((acc, type) => {
214
- const childElements = children.filter((child) => child.model?.get("widgetType") === type).map((child) => ({ id: child.id }));
215
- if (childElements) {
216
- acc[type] = childElements;
217
- }
215
+ const elementChildren = childrenTypes.reduce((acc, type) => {
216
+ acc[type] = [];
218
217
  return acc;
219
218
  }, {});
219
+ container?.children?.forEachRecursive?.(({ model, id }) => {
220
+ const widgetType = model.get("widgetType");
221
+ if (widgetType && widgetType in elementChildren) {
222
+ elementChildren[widgetType].push({ id });
223
+ }
224
+ });
225
+ return elementChildren;
220
226
  },
221
227
  [elementId]
222
228
  );
@@ -224,13 +230,7 @@ function useElementChildren(elementId, childrenTypes) {
224
230
 
225
231
  // src/sync/create-element.ts
226
232
  var import_editor_v1_adapters7 = require("@elementor/editor-v1-adapters");
227
- function createElement({
228
- containerId,
229
- settings,
230
- type,
231
- id,
232
- options
233
- }) {
233
+ function createElement({ containerId, settings, type, id, options }) {
234
234
  const container = getContainer(containerId);
235
235
  const model = createElementModel({ settings, type, id });
236
236
  if (!container) {
@@ -253,9 +253,13 @@ function createElementModel({ settings, type, id }) {
253
253
  };
254
254
  }
255
255
 
256
+ // src/sync/create-elements.ts
257
+ var import_editor_v1_adapters9 = require("@elementor/editor-v1-adapters");
258
+ var import_i18n = require("@wordpress/i18n");
259
+
256
260
  // src/sync/delete-element.ts
257
261
  var import_editor_v1_adapters8 = require("@elementor/editor-v1-adapters");
258
- function deleteElement({ elementId, options }) {
262
+ function deleteElement({ elementId, options = {} }) {
259
263
  const container = getContainer(elementId);
260
264
  if (!container) {
261
265
  throw new Error(`Element with ID "${elementId}" not found`);
@@ -266,6 +270,135 @@ function deleteElement({ elementId, options }) {
266
270
  });
267
271
  }
268
272
 
273
+ // src/sync/create-elements.ts
274
+ var createElements = ({
275
+ elements,
276
+ title,
277
+ subtitle = (0, import_i18n.__)("Item added", "elementor")
278
+ }) => {
279
+ const undoableCreate = (0, import_editor_v1_adapters9.undoable)(
280
+ {
281
+ do: ({ elements: elementsParam }) => {
282
+ const createdElements = [];
283
+ elementsParam.forEach((createParams) => {
284
+ const { options, ...elementParams } = createParams;
285
+ const element = createElement({
286
+ ...elementParams,
287
+ options: { ...options, useHistory: false }
288
+ });
289
+ const elementId = element.id;
290
+ createdElements.push({
291
+ elementId,
292
+ model: element.model?.toJSON() || {},
293
+ createParams: {
294
+ ...createParams,
295
+ id: elementId
296
+ }
297
+ });
298
+ });
299
+ return { createdElements };
300
+ },
301
+ undo: (_, { createdElements }) => {
302
+ [...createdElements].reverse().forEach(({ elementId }) => {
303
+ deleteElement({
304
+ elementId,
305
+ options: { useHistory: false }
306
+ });
307
+ });
308
+ },
309
+ redo: (_, { createdElements }) => {
310
+ const newElements = [];
311
+ createdElements.forEach(({ createParams }) => {
312
+ const element = createElement({
313
+ ...createParams,
314
+ options: { ...createParams.options, useHistory: false }
315
+ });
316
+ const elementId = element.id;
317
+ const container = getContainer(elementId);
318
+ if (container) {
319
+ newElements.push({
320
+ elementId,
321
+ model: container.model.toJSON(),
322
+ createParams
323
+ });
324
+ }
325
+ });
326
+ return { createdElements: newElements };
327
+ }
328
+ },
329
+ {
330
+ title,
331
+ subtitle
332
+ }
333
+ );
334
+ return undoableCreate({ elements });
335
+ };
336
+
337
+ // src/sync/remove-elements.ts
338
+ var import_editor_v1_adapters10 = require("@elementor/editor-v1-adapters");
339
+ var import_i18n2 = require("@wordpress/i18n");
340
+ var removeElements = ({
341
+ elementIds,
342
+ title,
343
+ subtitle = (0, import_i18n2.__)("Item removed", "elementor")
344
+ }) => {
345
+ const undoableRemove = (0, import_editor_v1_adapters10.undoable)(
346
+ {
347
+ do: ({ elementIds: elementIdsParam }) => {
348
+ const removedElements = [];
349
+ elementIdsParam.forEach((elementId) => {
350
+ const container = getContainer(elementId);
351
+ if (container) {
352
+ const model = container.model.toJSON();
353
+ const parent = container.parent;
354
+ const at = container.view?._index ?? 0;
355
+ removedElements.push({
356
+ elementId,
357
+ model,
358
+ parent: parent ?? null,
359
+ at
360
+ });
361
+ }
362
+ });
363
+ elementIdsParam.forEach((elementId) => {
364
+ deleteElement({
365
+ elementId,
366
+ options: { useHistory: false }
367
+ });
368
+ });
369
+ return { elementIds: elementIdsParam, removedElements };
370
+ },
371
+ undo: (_, { removedElements }) => {
372
+ [...removedElements].reverse().forEach(({ model, parent, at }) => {
373
+ if (parent && model) {
374
+ createElement({
375
+ containerId: parent.id,
376
+ settings: model.settings || {},
377
+ type: model.widgetType || model.elType,
378
+ id: model.id,
379
+ options: { useHistory: false, at }
380
+ });
381
+ }
382
+ });
383
+ },
384
+ redo: (_, { elementIds: originalElementIds, removedElements }) => {
385
+ originalElementIds.forEach((elementId) => {
386
+ deleteElement({
387
+ elementId,
388
+ options: { useHistory: false }
389
+ });
390
+ });
391
+ return { elementIds: originalElementIds, removedElements };
392
+ }
393
+ },
394
+ {
395
+ title,
396
+ subtitle
397
+ }
398
+ );
399
+ return undoableRemove({ elementIds });
400
+ };
401
+
269
402
  // src/sync/get-element-styles.ts
270
403
  var getElementStyles = (elementID) => {
271
404
  const container = getContainer(elementID);
@@ -330,7 +463,7 @@ function getCurrentDocumentId() {
330
463
  }
331
464
 
332
465
  // src/sync/update-element-settings.ts
333
- var import_editor_v1_adapters9 = require("@elementor/editor-v1-adapters");
466
+ var import_editor_v1_adapters11 = require("@elementor/editor-v1-adapters");
334
467
  var updateElementSettings = ({ id, props, withHistory = true }) => {
335
468
  const container = getContainer(id);
336
469
  const args = {
@@ -338,21 +471,27 @@ var updateElementSettings = ({ id, props, withHistory = true }) => {
338
471
  settings: { ...props }
339
472
  };
340
473
  if (withHistory) {
341
- (0, import_editor_v1_adapters9.__privateRunCommandSync)("document/elements/settings", args);
474
+ (0, import_editor_v1_adapters11.__privateRunCommandSync)("document/elements/settings", args);
342
475
  } else {
343
- (0, import_editor_v1_adapters9.__privateRunCommandSync)("document/elements/set-settings", args, { internal: true });
476
+ (0, import_editor_v1_adapters11.__privateRunCommandSync)("document/elements/set-settings", args, { internal: true });
344
477
  }
345
478
  };
346
479
 
480
+ // src/sync/generate-element-id.ts
481
+ var generateElementId = () => {
482
+ const extendedWindow = window;
483
+ return extendedWindow.elementorCommon?.helpers?.getUniqueId?.() ?? `el-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
484
+ };
485
+
347
486
  // src/styles/consts.ts
348
- var import_editor_v1_adapters10 = require("@elementor/editor-v1-adapters");
487
+ var import_editor_v1_adapters12 = require("@elementor/editor-v1-adapters");
349
488
  var ELEMENT_STYLE_CHANGE_EVENT = "elementor/editor-v2/editor-elements/style";
350
489
  var styleRerenderEvents = [
351
- (0, import_editor_v1_adapters10.commandEndEvent)("document/elements/create"),
352
- (0, import_editor_v1_adapters10.commandEndEvent)("document/elements/duplicate"),
353
- (0, import_editor_v1_adapters10.commandEndEvent)("document/elements/import"),
354
- (0, import_editor_v1_adapters10.commandEndEvent)("document/elements/paste"),
355
- (0, import_editor_v1_adapters10.windowEvent)(ELEMENT_STYLE_CHANGE_EVENT)
490
+ (0, import_editor_v1_adapters12.commandEndEvent)("document/elements/create"),
491
+ (0, import_editor_v1_adapters12.commandEndEvent)("document/elements/duplicate"),
492
+ (0, import_editor_v1_adapters12.commandEndEvent)("document/elements/import"),
493
+ (0, import_editor_v1_adapters12.commandEndEvent)("document/elements/paste"),
494
+ (0, import_editor_v1_adapters12.windowEvent)(ELEMENT_STYLE_CHANGE_EVENT)
356
495
  ];
357
496
 
358
497
  // src/styles/create-element-style.ts
@@ -361,7 +500,7 @@ var import_editor_styles = require("@elementor/editor-styles");
361
500
 
362
501
  // src/styles/mutate-element-styles.ts
363
502
  var import_editor_props = require("@elementor/editor-props");
364
- var import_editor_v1_adapters11 = require("@elementor/editor-v1-adapters");
503
+ var import_editor_v1_adapters13 = require("@elementor/editor-v1-adapters");
365
504
  function mutateElementStyles(elementId, mutator) {
366
505
  const container = getContainer(elementId);
367
506
  if (!container) {
@@ -417,7 +556,7 @@ function getClassesProps(container) {
417
556
  }
418
557
  function notifyChanges() {
419
558
  dispatchChangeEvent();
420
- (0, import_editor_v1_adapters11.__privateRunCommandSync)("document/save/set-is-modified", { status: true }, { internal: true });
559
+ (0, import_editor_v1_adapters13.__privateRunCommandSync)("document/save/set-is-modified", { status: true }, { internal: true });
421
560
  }
422
561
  function dispatchChangeEvent() {
423
562
  window.dispatchEvent(new CustomEvent(ELEMENT_STYLE_CHANGE_EVENT));
@@ -586,8 +725,10 @@ function isElementorElement(element) {
586
725
  ELEMENT_STYLE_CHANGE_EVENT,
587
726
  createElement,
588
727
  createElementStyle,
728
+ createElements,
589
729
  deleteElement,
590
730
  deleteElementStyle,
731
+ generateElementId,
591
732
  getAnchoredAncestorId,
592
733
  getAnchoredDescendantId,
593
734
  getContainer,
@@ -601,6 +742,7 @@ function isElementorElement(element) {
601
742
  getSelectedElements,
602
743
  getWidgetsCache,
603
744
  isElementAnchored,
745
+ removeElements,
604
746
  selectElement,
605
747
  shouldCreateNewLocalStyle,
606
748
  styleRerenderEvents,