@elementor/editor-components 4.3.0-999 → 4.3.0-beta2

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 CHANGED
@@ -91,11 +91,11 @@ module.exports = __toCommonJS(index_exports);
91
91
  // src/init.ts
92
92
  var import_editor = require("@elementor/editor");
93
93
  var import_editor_canvas6 = require("@elementor/editor-canvas");
94
- var import_editor_documents6 = require("@elementor/editor-documents");
94
+ var import_editor_documents5 = require("@elementor/editor-documents");
95
95
  var import_editor_editing_panel7 = require("@elementor/editor-editing-panel");
96
96
  var import_editor_elements_panel = require("@elementor/editor-elements-panel");
97
97
  var import_editor_embedded_documents_manager2 = require("@elementor/editor-embedded-documents-manager");
98
- var import_editor_v1_adapters6 = require("@elementor/editor-v1-adapters");
98
+ var import_editor_v1_adapters7 = require("@elementor/editor-v1-adapters");
99
99
  var import_store28 = require("@elementor/store");
100
100
  var import_i18n16 = require("@wordpress/i18n");
101
101
 
@@ -417,14 +417,21 @@ var useIsSanitizedComponent = (componentId, key) => {
417
417
  };
418
418
 
419
419
  // src/utils/component-document-data.ts
420
- var import_editor_documents = require("@elementor/editor-documents");
421
- var getComponentDocumentData = async (id) => {
422
- const documentManager = (0, import_editor_documents.getV1DocumentsManager)();
423
- try {
424
- return await documentManager.request(id);
425
- } catch {
426
- return null;
427
- }
420
+ var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
421
+ var getComponentDocumentParams = (id) => ({
422
+ action: "get_document_config",
423
+ unique_id: `document-${id}`,
424
+ data: { id }
425
+ });
426
+ var pendingRequests = /* @__PURE__ */ new Map();
427
+ var getComponentDocumentData = (id) => {
428
+ const pendingRequest = pendingRequests.get(id);
429
+ if (pendingRequest) {
430
+ return pendingRequest;
431
+ }
432
+ const request = import_editor_v1_adapters2.ajax.load(getComponentDocumentParams(id)).catch(() => null).finally(() => pendingRequests.delete(id));
433
+ pendingRequests.set(id, request);
434
+ return request;
428
435
  };
429
436
 
430
437
  // src/component-instance-transformer.ts
@@ -458,23 +465,27 @@ var import_editor_canvas2 = require("@elementor/editor-canvas");
458
465
  var componentOverridableTransformer = (0, import_editor_canvas2.createTransformer)(
459
466
  (value, options) => {
460
467
  const { overrides } = options.renderContext ?? {};
468
+ const originValue = normalizeOriginValue(value.origin_value);
461
469
  const overrideValue = overrides?.[value.override_key];
462
470
  if (overrideValue) {
463
- const isOverride = isOriginValueOverride(value.origin_value);
464
- if (isOverride) {
465
- return transformOverride(value, options, overrideValue);
471
+ if (isOriginValueOverride(originValue)) {
472
+ return transformOverride(originValue, options, overrideValue);
466
473
  }
467
474
  return overrideValue;
468
475
  }
469
- return value.origin_value;
476
+ return originValue;
470
477
  }
471
478
  );
472
- function transformOverride(value, options, overrideValue) {
479
+ function normalizeOriginValue(originValue) {
480
+ const isEmpty = !!originValue && Object.keys(originValue).length === 0;
481
+ return isEmpty ? null : originValue;
482
+ }
483
+ function transformOverride(originValue, options, overrideValue) {
473
484
  const transformer = import_editor_canvas2.settingsTransformersRegistry.get("override");
474
485
  if (!transformer) {
475
486
  return null;
476
487
  }
477
- const transformedValue = transformer(value.origin_value.value, options);
488
+ const transformedValue = transformer(originValue.value, options);
478
489
  if (!transformedValue) {
479
490
  return null;
480
491
  }
@@ -484,7 +495,7 @@ function transformOverride(value, options, overrideValue) {
484
495
  };
485
496
  }
486
497
  function isOriginValueOverride(originValue) {
487
- return originValue.$$type === "override";
498
+ return originValue?.$$type === "override";
488
499
  }
489
500
 
490
501
  // src/component-override-transformer.ts
@@ -1126,7 +1137,7 @@ var import_i18n10 = require("@wordpress/i18n");
1126
1137
  // src/utils/detach-component-instance/detach-component-instance.ts
1127
1138
  var import_editor_canvas4 = require("@elementor/editor-canvas");
1128
1139
  var import_editor_elements3 = require("@elementor/editor-elements");
1129
- var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
1140
+ var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
1130
1141
  var import_store10 = require("@elementor/store");
1131
1142
  var import_i18n9 = require("@wordpress/i18n");
1132
1143
 
@@ -1406,7 +1417,7 @@ async function detachComponentInstance({
1406
1417
  if (!rootElement) {
1407
1418
  throw new Error(`Component with ID "${componentId}" has no root element.`);
1408
1419
  }
1409
- const undoableDetach = (0, import_editor_v1_adapters2.undoable)(
1420
+ const undoableDetach = (0, import_editor_v1_adapters3.undoable)(
1410
1421
  {
1411
1422
  do: () => {
1412
1423
  const overrides = extractInstanceOverrides(instanceContainer);
@@ -2548,7 +2559,7 @@ var import_react10 = require("react");
2548
2559
  var import_editor_templates = require("@elementor/editor-templates");
2549
2560
 
2550
2561
  // src/store/actions/load-components-assets.ts
2551
- var import_editor_documents2 = require("@elementor/editor-documents");
2562
+ var import_editor_documents = require("@elementor/editor-documents");
2552
2563
  var import_editor_embedded_documents_manager = require("@elementor/editor-embedded-documents-manager");
2553
2564
 
2554
2565
  // src/utils/get-component-documents.ts
@@ -2624,9 +2635,9 @@ async function loadComponentsAssets(elements) {
2624
2635
  await loadComponentsOverridableProps([...documents.keys()]);
2625
2636
  }
2626
2637
  function updateDocumentState(documents) {
2627
- const isDrafted = [...documents.values()].some(import_editor_documents2.isDocumentDirty);
2638
+ const isDrafted = [...documents.values()].some(import_editor_documents.isDocumentDirty);
2628
2639
  if (isDrafted) {
2629
- (0, import_editor_documents2.setDocumentModifiedStatus)(true);
2640
+ (0, import_editor_documents.setDocumentModifiedStatus)(true);
2630
2641
  }
2631
2642
  }
2632
2643
 
@@ -2647,10 +2658,10 @@ function LoadTemplateComponentsInternal() {
2647
2658
 
2648
2659
  // src/create-component-type.ts
2649
2660
  var import_editor_canvas5 = require("@elementor/editor-canvas");
2650
- var import_editor_documents4 = require("@elementor/editor-documents");
2661
+ var import_editor_documents3 = require("@elementor/editor-documents");
2651
2662
  var import_editor_notifications2 = require("@elementor/editor-notifications");
2652
2663
  var import_store23 = require("@elementor/store");
2653
- var import_utils5 = require("@elementor/utils");
2664
+ var import_utils6 = require("@elementor/utils");
2654
2665
  var import_i18n13 = require("@wordpress/i18n");
2655
2666
 
2656
2667
  // src/utils/format-component-elements-id.ts
@@ -2669,29 +2680,85 @@ function formatComponentElementsId(elements, path) {
2669
2680
  });
2670
2681
  }
2671
2682
 
2672
- // src/utils/switch-to-component.ts
2673
- var import_editor_documents3 = require("@elementor/editor-documents");
2683
+ // src/utils/reconcile-component-instance-elements.ts
2674
2684
  var import_editor_elements8 = require("@elementor/editor-elements");
2675
- var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
2685
+ var import_utils5 = require("@elementor/utils");
2686
+ var ELEMENT_ID_LENGTH2 = 7;
2687
+ function overridesRecordToMapping(overrides) {
2688
+ const mapping = {};
2689
+ for (const [key, value] of Object.entries(overrides)) {
2690
+ mapping[key] = { value };
2691
+ }
2692
+ return mapping;
2693
+ }
2694
+ function getElementConfig(element) {
2695
+ const type = element.elType === "widget" ? element.widgetType : element.elType;
2696
+ if (!type) {
2697
+ return void 0;
2698
+ }
2699
+ return (0, import_editor_elements8.getWidgetsCache)()?.[type];
2700
+ }
2701
+ function deriveIds(element, seed) {
2702
+ const id = (0, import_utils5.hashString)(seed, ELEMENT_ID_LENGTH2);
2703
+ return {
2704
+ ...element,
2705
+ id,
2706
+ elements: (element.elements ?? []).map((child, index) => deriveIds(child, `${id}_${index}`))
2707
+ };
2708
+ }
2709
+ function reconcileElementTree(element, overridesMapping) {
2710
+ const elementConfig = getElementConfig(element);
2711
+ const withOverrides = applyOverridesToSettings(element.settings ?? {}, overridesMapping);
2712
+ const effectiveSettings = unwrapOverridableSettings(withOverrides);
2713
+ const originalChildren = element.elements ?? [];
2714
+ const originalChildIds = new Set(originalChildren.map((child) => child.id));
2715
+ const attributes = {
2716
+ elements: [...originalChildren],
2717
+ settings: effectiveSettings
2718
+ };
2719
+ if (elementConfig?.children_dependencies?.length) {
2720
+ (0, import_editor_elements8.reconcileInitialChildren)({
2721
+ elementId: element.id,
2722
+ elementConfig,
2723
+ attributes
2724
+ });
2725
+ }
2726
+ const reconciledChildren = (attributes.elements ?? []).map(
2727
+ (child) => originalChildIds.has(child.id) ? child : deriveIds(child, `${element.id}_${child.elType}`)
2728
+ ).map((child) => reconcileElementTree(child, overridesMapping));
2729
+ return {
2730
+ ...element,
2731
+ elements: reconciledChildren
2732
+ };
2733
+ }
2734
+ function reconcileComponentInstanceElements(elements, overrides = {}) {
2735
+ const overridesMapping = overridesRecordToMapping(overrides);
2736
+ return elements.map((element) => reconcileElementTree(element, overridesMapping));
2737
+ }
2738
+
2739
+ // src/utils/switch-to-component.ts
2740
+ var import_editor_documents2 = require("@elementor/editor-documents");
2741
+ var import_editor_elements9 = require("@elementor/editor-elements");
2742
+ var import_editor_v1_adapters4 = require("@elementor/editor-v1-adapters");
2676
2743
  async function switchToComponent(componentId, componentInstanceId, element) {
2677
2744
  const selector = getSelector(element, componentInstanceId);
2678
- (0, import_editor_documents3.invalidateDocumentData)(componentId);
2679
- await (0, import_editor_documents3.switchToDocument)(componentId, {
2745
+ (0, import_editor_documents2.invalidateDocumentData)(componentId);
2746
+ await (0, import_editor_documents2.switchToDocument)(componentId, {
2680
2747
  selector,
2681
2748
  mode: "autosave",
2682
2749
  setAsInitial: false,
2683
2750
  shouldScroll: false
2684
2751
  });
2685
2752
  await loadComponentsOverridableProps([componentId], { force: true });
2686
- const currentDocumentContainer = (0, import_editor_elements8.getCurrentDocumentContainer)();
2753
+ const currentDocumentContainer = (0, import_editor_elements9.getCurrentDocumentContainer)();
2687
2754
  const topLevelElement = currentDocumentContainer?.children?.[0];
2688
2755
  if (topLevelElement) {
2689
- (0, import_editor_elements8.selectElement)(topLevelElement.id);
2756
+ (0, import_editor_elements9.selectElement)(topLevelElement.id);
2690
2757
  expandNavigator();
2691
2758
  }
2692
2759
  }
2693
2760
  async function expandNavigator() {
2694
- await (0, import_editor_v1_adapters3.__privateRunCommand)("navigator/expand-all");
2761
+ await (0, import_editor_v1_adapters4.__privateRunCommand)("navigator/expand-all");
2695
2762
  }
2696
2763
  function getSelector(element, componentInstanceId) {
2697
2764
  if (element) {
@@ -2802,7 +2869,7 @@ function createComponentView(options) {
2802
2869
  eventsManagerConfig = legacyWindow.elementorCommon.eventsManager.config;
2803
2870
  #componentRenderContext;
2804
2871
  isComponentCurrentlyEdited() {
2805
- const currentDocument = (0, import_editor_documents4.getCurrentDocument)();
2872
+ const currentDocument = (0, import_editor_documents3.getCurrentDocument)();
2806
2873
  return currentDocument?.id === this.getComponentId();
2807
2874
  }
2808
2875
  getRenderContext() {
@@ -2845,7 +2912,11 @@ function createComponentView(options) {
2845
2912
  };
2846
2913
  const instanceId = this.model.get("id");
2847
2914
  const elements = componentInstance.elements ?? [];
2848
- const formattedElements = formatComponentElementsId(elements, [instanceId]);
2915
+ const reconciledElements = reconcileComponentInstanceElements(
2916
+ elements,
2917
+ componentInstance.overrides ?? {}
2918
+ );
2919
+ const formattedElements = formatComponentElementsId(reconciledElements, [instanceId]);
2849
2920
  this.collection = legacyWindow.elementor.createBackboneElementsCollection(formattedElements);
2850
2921
  this.collection.models.forEach(setInactiveRecursively);
2851
2922
  settings.component_instance = "<template data-children-placeholder></template>";
@@ -2881,7 +2952,7 @@ function createComponentView(options) {
2881
2952
  }
2882
2953
  _getContextMenuConfig() {
2883
2954
  const isAdministrator = isUserAdministrator();
2884
- const hasPro = (0, import_utils5.hasProInstalled)();
2955
+ const hasPro = (0, import_utils6.hasProInstalled)();
2885
2956
  const isOutdated = isProOutdatedForComponents();
2886
2957
  const showPromoBadge = !hasPro && !isOutdated;
2887
2958
  const badgeClass = "elementor-context-menu-list__item__shortcut__promotion-badge";
@@ -2975,7 +3046,7 @@ function createComponentView(options) {
2975
3046
  notifyComponentEditUpdate();
2976
3047
  return;
2977
3048
  }
2978
- if (!(0, import_utils5.hasProInstalled)()) {
3049
+ if (!(0, import_utils6.hasProInstalled)()) {
2979
3050
  notifyComponentEditUpgrade();
2980
3051
  return;
2981
3052
  }
@@ -3072,9 +3143,9 @@ function PopulateStore() {
3072
3143
  }
3073
3144
 
3074
3145
  // src/prevent-circular-nesting.ts
3075
- var import_editor_elements9 = require("@elementor/editor-elements");
3146
+ var import_editor_elements10 = require("@elementor/editor-elements");
3076
3147
  var import_editor_notifications3 = require("@elementor/editor-notifications");
3077
- var import_editor_v1_adapters4 = require("@elementor/editor-v1-adapters");
3148
+ var import_editor_v1_adapters5 = require("@elementor/editor-v1-adapters");
3078
3149
  var import_store26 = require("@elementor/store");
3079
3150
  var import_i18n14 = require("@wordpress/i18n");
3080
3151
  var COMPONENT_TYPE = "e-component";
@@ -3084,15 +3155,15 @@ var COMPONENT_CIRCULAR_NESTING_ALERT = {
3084
3155
  id: "circular-component-nesting-blocked"
3085
3156
  };
3086
3157
  function initCircularNestingPrevention() {
3087
- (0, import_editor_v1_adapters4.blockCommand)({
3158
+ (0, import_editor_v1_adapters5.blockCommand)({
3088
3159
  command: "document/elements/create",
3089
3160
  condition: blockCircularCreate
3090
3161
  });
3091
- (0, import_editor_v1_adapters4.blockCommand)({
3162
+ (0, import_editor_v1_adapters5.blockCommand)({
3092
3163
  command: "document/elements/move",
3093
3164
  condition: blockCircularMove
3094
3165
  });
3095
- (0, import_editor_v1_adapters4.blockCommand)({
3166
+ (0, import_editor_v1_adapters5.blockCommand)({
3096
3167
  command: "document/elements/paste",
3097
3168
  condition: blockCircularPaste
3098
3169
  });
@@ -3167,7 +3238,7 @@ function blockCircularMove(args) {
3167
3238
  if (!container) {
3168
3239
  return false;
3169
3240
  }
3170
- const allElements = (0, import_editor_elements9.getAllDescendants)(container);
3241
+ const allElements = (0, import_editor_elements10.getAllDescendants)(container);
3171
3242
  return allElements.some((element) => {
3172
3243
  const componentId = extractComponentIdFromContainer(element);
3173
3244
  if (componentId === null) {
@@ -3204,7 +3275,7 @@ function removeComponentStyles(id) {
3204
3275
  }
3205
3276
 
3206
3277
  // src/sync/publish-draft-components-in-page-before-save.ts
3207
- var import_editor_documents5 = require("@elementor/editor-documents");
3278
+ var import_editor_documents4 = require("@elementor/editor-documents");
3208
3279
  var import_editor_notifications4 = require("@elementor/editor-notifications");
3209
3280
  var import_http_client2 = require("@elementor/http-client");
3210
3281
  var import_i18n15 = require("@wordpress/i18n");
@@ -3216,7 +3287,7 @@ async function publishDraftComponentsInPageBeforeSave({ status, elements }) {
3216
3287
  return;
3217
3288
  }
3218
3289
  const documents = await getComponentDocuments({ elements });
3219
- const draftIds = [...documents.values()].filter(import_editor_documents5.isDocumentDirty).map((document2) => document2.id);
3290
+ const draftIds = [...documents.values()].filter(import_editor_documents4.isDocumentDirty).map((document2) => document2.id);
3220
3291
  if (draftIds.length === 0) {
3221
3292
  return;
3222
3293
  }
@@ -3229,7 +3300,7 @@ async function publishDraftComponentsInPageBeforeSave({ status, elements }) {
3229
3300
  }
3230
3301
  throw error;
3231
3302
  }
3232
- draftIds.forEach((id) => (0, import_editor_documents5.invalidateDocumentData)(id));
3303
+ draftIds.forEach((id) => (0, import_editor_documents4.invalidateDocumentData)(id));
3233
3304
  }
3234
3305
  function isInsufficientPermissionsError(error) {
3235
3306
  return error instanceof import_http_client2.AxiosError && error.response?.data?.code === INSUFFICIENT_PERMISSIONS_ERROR_CODE;
@@ -3262,12 +3333,12 @@ var beforeSave = ({ container, status }) => {
3262
3333
  };
3263
3334
 
3264
3335
  // src/sync/load-component-data-after-instance-added.ts
3265
- var import_editor_v1_adapters5 = require("@elementor/editor-v1-adapters");
3336
+ var import_editor_v1_adapters6 = require("@elementor/editor-v1-adapters");
3266
3337
  function initLoadComponentDataAfterInstanceAdded() {
3267
- (0, import_editor_v1_adapters5.registerDataHook)("after", "document/elements/paste", (_args, result) => {
3338
+ (0, import_editor_v1_adapters6.registerDataHook)("after", "document/elements/paste", (_args, result) => {
3268
3339
  load(result);
3269
3340
  });
3270
- (0, import_editor_v1_adapters5.registerDataHook)("after", "document/elements/import", (_args, result) => {
3341
+ (0, import_editor_v1_adapters6.registerDataHook)("after", "document/elements/import", (_args, result) => {
3271
3342
  load(result);
3272
3343
  });
3273
3344
  }
@@ -3302,8 +3373,8 @@ function init() {
3302
3373
  id: "components-populate-store",
3303
3374
  component: PopulateStore
3304
3375
  });
3305
- (0, import_editor_v1_adapters6.registerDataHook)("after", "editor/documents/attach-preview", () => {
3306
- const { id, config } = (0, import_editor_documents6.getV1CurrentDocument)() ?? {};
3376
+ (0, import_editor_v1_adapters7.registerDataHook)("after", "editor/documents/attach-preview", () => {
3377
+ const { id, config } = (0, import_editor_documents5.getV1CurrentDocument)() ?? {};
3307
3378
  if (!id) {
3308
3379
  return;
3309
3380
  }