@elementor/editor-components 4.1.0-748 → 4.1.0-749
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 +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +246 -179
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +230 -158
- package/dist/index.mjs.map +1 -1
- package/package.json +23 -23
- package/src/components/errors.ts +7 -0
- package/src/components/instance-editing-panel/override-prop-control.tsx +57 -143
- package/src/components/instance-editing-panel/utils/resolve-element-settings.ts +1 -1
- package/src/components/instance-editing-panel/utils/use-override-dependencies.ts +73 -0
- package/src/components/instance-editing-panel/utils/use-resolved-inner-element.ts +111 -0
- package/src/provider/component-instance-context.tsx +13 -3
- package/src/utils/resolve-override-prop-value.ts +9 -7
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-components",
|
|
3
3
|
"description": "Elementor editor components",
|
|
4
|
-
"version": "4.1.0-
|
|
4
|
+
"version": "4.1.0-749",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "Elementor Team",
|
|
7
7
|
"homepage": "https://elementor.com/",
|
|
@@ -40,31 +40,31 @@
|
|
|
40
40
|
"dev": "tsup --config=../../tsup.dev.ts"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@elementor/editor": "4.1.0-
|
|
44
|
-
"@elementor/editor-canvas": "4.1.0-
|
|
45
|
-
"@elementor/editor-controls": "4.1.0-
|
|
46
|
-
"@elementor/editor-documents": "4.1.0-
|
|
47
|
-
"@elementor/editor-editing-panel": "4.1.0-
|
|
48
|
-
"@elementor/editor-elements": "4.1.0-
|
|
49
|
-
"@elementor/editor-elements-panel": "4.1.0-
|
|
50
|
-
"@elementor/editor-mcp": "4.1.0-
|
|
51
|
-
"@elementor/editor-templates": "4.1.0-
|
|
52
|
-
"@elementor/editor-panels": "4.1.0-
|
|
53
|
-
"@elementor/editor-props": "4.1.0-
|
|
54
|
-
"@elementor/editor-styles-repository": "4.1.0-
|
|
55
|
-
"@elementor/editor-ui": "4.1.0-
|
|
56
|
-
"@elementor/editor-v1-adapters": "4.1.0-
|
|
57
|
-
"@elementor/http-client": "4.1.0-
|
|
43
|
+
"@elementor/editor": "4.1.0-749",
|
|
44
|
+
"@elementor/editor-canvas": "4.1.0-749",
|
|
45
|
+
"@elementor/editor-controls": "4.1.0-749",
|
|
46
|
+
"@elementor/editor-documents": "4.1.0-749",
|
|
47
|
+
"@elementor/editor-editing-panel": "4.1.0-749",
|
|
48
|
+
"@elementor/editor-elements": "4.1.0-749",
|
|
49
|
+
"@elementor/editor-elements-panel": "4.1.0-749",
|
|
50
|
+
"@elementor/editor-mcp": "4.1.0-749",
|
|
51
|
+
"@elementor/editor-templates": "4.1.0-749",
|
|
52
|
+
"@elementor/editor-panels": "4.1.0-749",
|
|
53
|
+
"@elementor/editor-props": "4.1.0-749",
|
|
54
|
+
"@elementor/editor-styles-repository": "4.1.0-749",
|
|
55
|
+
"@elementor/editor-ui": "4.1.0-749",
|
|
56
|
+
"@elementor/editor-v1-adapters": "4.1.0-749",
|
|
57
|
+
"@elementor/http-client": "4.1.0-749",
|
|
58
58
|
"@elementor/icons": "^1.68.0",
|
|
59
|
-
"@elementor/events": "4.1.0-
|
|
60
|
-
"@elementor/query": "4.1.0-
|
|
61
|
-
"@elementor/schema": "4.1.0-
|
|
62
|
-
"@elementor/store": "4.1.0-
|
|
59
|
+
"@elementor/events": "4.1.0-749",
|
|
60
|
+
"@elementor/query": "4.1.0-749",
|
|
61
|
+
"@elementor/schema": "4.1.0-749",
|
|
62
|
+
"@elementor/store": "4.1.0-749",
|
|
63
63
|
"@elementor/ui": "1.36.17",
|
|
64
|
-
"@elementor/utils": "4.1.0-
|
|
64
|
+
"@elementor/utils": "4.1.0-749",
|
|
65
65
|
"@wordpress/i18n": "^5.13.0",
|
|
66
|
-
"@elementor/editor-notifications": "4.1.0-
|
|
67
|
-
"@elementor/editor-current-user": "4.1.0-
|
|
66
|
+
"@elementor/editor-notifications": "4.1.0-749",
|
|
67
|
+
"@elementor/editor-current-user": "4.1.0-749"
|
|
68
68
|
},
|
|
69
69
|
"peerDependencies": {
|
|
70
70
|
"react": "^18.3.1",
|
package/src/components/errors.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { createError } from '@elementor/utils';
|
|
2
2
|
|
|
3
|
+
import { type OverridableProp } from '../types';
|
|
4
|
+
|
|
3
5
|
export const OverrideControlInnerElementNotFoundError = createError< { componentId: number; elementId: string } >( {
|
|
4
6
|
code: 'override_control_inner_element_not_found',
|
|
5
7
|
message: `Component inner element not found for override control. The element may have been deleted without updating the overridable props, or the component has not finished rendering yet.`,
|
|
6
8
|
} );
|
|
9
|
+
|
|
10
|
+
export const OverrideControlPropTypeNotFoundError = createError< { overridableProp: OverridableProp } >( {
|
|
11
|
+
code: 'override_control_prop_type_not_found',
|
|
12
|
+
message: 'Prop type not found for override control.',
|
|
13
|
+
} );
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { useMemo } from 'react';
|
|
3
2
|
import {
|
|
4
3
|
ControlReplacementsProvider,
|
|
5
4
|
getControlReplacements,
|
|
@@ -18,7 +17,7 @@ import {
|
|
|
18
17
|
SettingsField,
|
|
19
18
|
useElement,
|
|
20
19
|
} from '@elementor/editor-editing-panel';
|
|
21
|
-
import { type Control
|
|
20
|
+
import { type Control } from '@elementor/editor-elements';
|
|
22
21
|
import { type AnyTransformable, type PropType, type PropValue } from '@elementor/editor-props';
|
|
23
22
|
import { Box } from '@elementor/ui';
|
|
24
23
|
|
|
@@ -30,7 +29,6 @@ import {
|
|
|
30
29
|
import {
|
|
31
30
|
type ComponentInstanceOverride,
|
|
32
31
|
componentInstanceOverridesPropTypeUtil,
|
|
33
|
-
type ComponentInstanceOverridesPropValue,
|
|
34
32
|
} from '../../prop-types/component-instance-overrides-prop-type';
|
|
35
33
|
import { componentInstancePropTypeUtil } from '../../prop-types/component-instance-prop-type';
|
|
36
34
|
import {
|
|
@@ -49,15 +47,12 @@ import { type OriginPropFields, type OverridableProp, type OverridableProps } fr
|
|
|
49
47
|
import { getPropTypeForComponentOverride } from '../../utils/get-prop-type-for-component-override';
|
|
50
48
|
import { getMatchingOverride } from '../../utils/overridable-props-utils';
|
|
51
49
|
import { resolveOverridePropValue } from '../../utils/resolve-override-prop-value';
|
|
52
|
-
import { resolveOverridesChain } from '../../utils/resolve-overrides-chain';
|
|
53
50
|
import { ControlLabel } from '../control-label';
|
|
54
|
-
import {
|
|
51
|
+
import { OverrideControlPropTypeNotFoundError } from '../errors';
|
|
55
52
|
import { correctExposedEmptyOverride } from './utils/correct-exposed-empty-override';
|
|
56
|
-
import {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
unwrapOverridableSettings,
|
|
60
|
-
} from './utils/resolve-element-settings';
|
|
53
|
+
import { unwrapOverridableSettings } from './utils/resolve-element-settings';
|
|
54
|
+
import { useOverrideControlDependencies } from './utils/use-override-dependencies';
|
|
55
|
+
import { useResolvedInnerElement } from './utils/use-resolved-inner-element';
|
|
61
56
|
|
|
62
57
|
type Props = {
|
|
63
58
|
overrideKey: string;
|
|
@@ -65,7 +60,7 @@ type Props = {
|
|
|
65
60
|
|
|
66
61
|
export function OverridePropControl( { overrideKey }: Props ) {
|
|
67
62
|
const overridableProps = useComponentOverridableProps();
|
|
68
|
-
const overridableProp = overridableProps
|
|
63
|
+
const overridableProp = overridableProps.props[ overrideKey ];
|
|
69
64
|
|
|
70
65
|
if ( ! overridableProp ) {
|
|
71
66
|
return null;
|
|
@@ -92,75 +87,38 @@ function OverrideControl( { overridableProp }: InternalProps ) {
|
|
|
92
87
|
const overrides = useComponentInstanceOverrides();
|
|
93
88
|
|
|
94
89
|
const controls = useControlsByWidgetType(
|
|
95
|
-
overridableProp
|
|
90
|
+
overridableProp.originPropFields?.widgetType ?? overridableProp.widgetType
|
|
96
91
|
);
|
|
97
92
|
const controlReplacements = getControlReplacements();
|
|
98
93
|
|
|
99
94
|
const matchingOverride = getMatchingOverride( overrides, overridableProp.overrideKey );
|
|
100
95
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
96
|
+
const { propKey } = overridableProp.originPropFields ?? overridableProp;
|
|
97
|
+
const propType = getPropTypeForComponentOverride( overridableProp );
|
|
104
98
|
|
|
105
|
-
if ( !
|
|
106
|
-
throw new
|
|
99
|
+
if ( ! propType ) {
|
|
100
|
+
throw new OverrideControlPropTypeNotFoundError( { context: { overridableProp } } );
|
|
107
101
|
}
|
|
108
102
|
|
|
109
|
-
const {
|
|
110
|
-
|
|
111
|
-
widgetType,
|
|
112
|
-
elType,
|
|
113
|
-
propKey,
|
|
114
|
-
} = overridableProp.originPropFields ?? overridableProp;
|
|
115
|
-
const type = elType === 'widget' ? widgetType : elType;
|
|
116
|
-
const elementType = getElementType( type );
|
|
117
|
-
|
|
118
|
-
const { elementId, overridesMapping } = useMemo( () => {
|
|
119
|
-
const overridesChainResult = resolveOverridesChain( {
|
|
120
|
-
outerOverridableProp: overridableProp,
|
|
121
|
-
outerInstanceId: componentInstanceElement.element.id,
|
|
122
|
-
} );
|
|
123
|
-
|
|
124
|
-
if ( overridesChainResult.isChainBroken ) {
|
|
125
|
-
throw new OverrideControlInnerElementNotFoundError( {
|
|
126
|
-
context: { componentId, elementId: originElementId },
|
|
127
|
-
} );
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return {
|
|
131
|
-
elementId: overridesChainResult.innerElement.id,
|
|
132
|
-
overridesMapping: overridesChainResult.overridesMapping,
|
|
133
|
-
};
|
|
134
|
-
}, [ overridableProp, componentInstanceElement.element.id, componentId, originElementId ] );
|
|
135
|
-
|
|
136
|
-
// Not reactive to inner element store changes — intentional.
|
|
137
|
-
// Inner element settings can only change in component edit mode, which unmounts this component.
|
|
138
|
-
const settingsWithInnerOverrides = useMemo( () => {
|
|
139
|
-
const settings = getElementSettings< AnyTransformable >(
|
|
140
|
-
elementId,
|
|
141
|
-
Object.keys( elementType?.propsSchema ?? {} )
|
|
142
|
-
);
|
|
143
|
-
|
|
144
|
-
return applyOverridesToSettings( settings, overridesMapping );
|
|
145
|
-
}, [ elementId, elementType?.propsSchema, overridesMapping ] );
|
|
146
|
-
|
|
147
|
-
const resolvedElementSettings = useMemo( () => {
|
|
148
|
-
const withAllOverrides = applyOverridesToSettings(
|
|
149
|
-
settingsWithInnerOverrides,
|
|
150
|
-
formatOverridesToApply( overrides )
|
|
151
|
-
);
|
|
152
|
-
return unwrapOverridableSettings( withAllOverrides );
|
|
153
|
-
}, [ settingsWithInnerOverrides, overrides ] );
|
|
103
|
+
const { elementId, elementType, resolvedElementSettings, resolvedOriginValues } =
|
|
104
|
+
useResolvedInnerElement( overridableProp );
|
|
154
105
|
|
|
155
|
-
const
|
|
106
|
+
const { overrideValue, isDisabled, isHidden } = useOverrideControlDependencies( {
|
|
107
|
+
existingOverride: matchingOverride,
|
|
108
|
+
resolvedElementSettings,
|
|
109
|
+
elementType,
|
|
110
|
+
elementId,
|
|
111
|
+
propKey,
|
|
112
|
+
} );
|
|
156
113
|
|
|
157
|
-
if (
|
|
114
|
+
if ( isHidden ) {
|
|
158
115
|
return null;
|
|
159
116
|
}
|
|
160
117
|
|
|
161
118
|
const { propValue, placeholderValue } = resolveValueAndPlaceholder(
|
|
162
119
|
matchingOverride,
|
|
163
|
-
|
|
120
|
+
overrideValue,
|
|
121
|
+
resolvedOriginValues,
|
|
164
122
|
propKey
|
|
165
123
|
);
|
|
166
124
|
|
|
@@ -172,16 +130,17 @@ function OverrideControl( { overridableProp }: InternalProps ) {
|
|
|
172
130
|
[ overridableProp.overrideKey ]: placeholderValue,
|
|
173
131
|
} as OverridesSchema;
|
|
174
132
|
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
} );
|
|
133
|
+
const { control, controlProps, layout } = getControlParams(
|
|
134
|
+
controls,
|
|
135
|
+
overridableProp.originPropFields ?? overridableProp,
|
|
136
|
+
overridableProp.label
|
|
137
|
+
);
|
|
181
138
|
|
|
182
|
-
|
|
183
|
-
}
|
|
139
|
+
const propTypeSchema = createTopLevelObjectType( {
|
|
140
|
+
schema: { [ overridableProp.overrideKey ]: propType },
|
|
141
|
+
} );
|
|
184
142
|
|
|
143
|
+
const setValue = ( newValue: OverridesSchema ) => {
|
|
185
144
|
let newPropValue = getTempNewValueForDynamicProp(
|
|
186
145
|
propType,
|
|
187
146
|
propValue,
|
|
@@ -228,52 +187,34 @@ function OverrideControl( { overridableProp }: InternalProps ) {
|
|
|
228
187
|
}
|
|
229
188
|
};
|
|
230
189
|
|
|
231
|
-
const { control, controlProps, layout } = getControlParams(
|
|
232
|
-
controls,
|
|
233
|
-
overridableProp?.originPropFields ?? overridableProp,
|
|
234
|
-
overridableProp.label
|
|
235
|
-
);
|
|
236
|
-
|
|
237
|
-
const propTypeSchema = createTopLevelObjectType( {
|
|
238
|
-
schema: {
|
|
239
|
-
[ overridableProp.overrideKey ]: propType,
|
|
240
|
-
},
|
|
241
|
-
} );
|
|
242
|
-
|
|
243
190
|
return (
|
|
244
191
|
<OverridablePropProvider
|
|
245
192
|
value={ componentOverridablePropTypeUtil.extract( matchingOverride ) ?? undefined }
|
|
246
193
|
componentInstanceElement={ componentInstanceElement }
|
|
247
194
|
>
|
|
248
195
|
<ElementProvider
|
|
249
|
-
element={ { id: elementId, type } }
|
|
196
|
+
element={ { id: elementId, type: elementType.key } }
|
|
250
197
|
elementType={ elementType }
|
|
251
198
|
settings={ resolvedElementSettings }
|
|
252
199
|
>
|
|
253
|
-
<
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
</ControlTypeContainer>
|
|
272
|
-
</Box>
|
|
273
|
-
</ControlReplacementsProvider>
|
|
274
|
-
</PropKeyProvider>
|
|
275
|
-
</PropProvider>
|
|
276
|
-
</SettingsField>
|
|
200
|
+
<PropProvider
|
|
201
|
+
propType={ propTypeSchema }
|
|
202
|
+
value={ value }
|
|
203
|
+
setValue={ setValue }
|
|
204
|
+
placeholder={ placeholder }
|
|
205
|
+
isDisabled={ isDisabled }
|
|
206
|
+
>
|
|
207
|
+
<PropKeyProvider bind={ overridableProp.overrideKey }>
|
|
208
|
+
<ControlReplacementsProvider replacements={ controlReplacements }>
|
|
209
|
+
<Box mb={ 1.5 }>
|
|
210
|
+
<ControlTypeContainer layout={ layout }>
|
|
211
|
+
{ layout !== 'custom' && <ControlLabel>{ overridableProp.label }</ControlLabel> }
|
|
212
|
+
<OriginalControl control={ control } controlProps={ controlProps } />
|
|
213
|
+
</ControlTypeContainer>
|
|
214
|
+
</Box>
|
|
215
|
+
</ControlReplacementsProvider>
|
|
216
|
+
</PropKeyProvider>
|
|
217
|
+
</PropProvider>
|
|
277
218
|
</ElementProvider>
|
|
278
219
|
</OverridablePropProvider>
|
|
279
220
|
);
|
|
@@ -283,16 +224,17 @@ type ElementSettings = Record< string, AnyTransformable | null >;
|
|
|
283
224
|
|
|
284
225
|
function resolveValueAndPlaceholder(
|
|
285
226
|
matchingOverride: ComponentInstanceOverride | null,
|
|
286
|
-
|
|
227
|
+
overrideValue: AnyTransformable | null,
|
|
228
|
+
resolvedOriginValues: ElementSettings,
|
|
287
229
|
propKey: string
|
|
288
230
|
) {
|
|
289
|
-
const
|
|
290
|
-
|
|
291
|
-
const placeholderSettings = unwrapOverridableSettings( settingsWithInnerOverrides );
|
|
231
|
+
const placeholderSettings = unwrapOverridableSettings( resolvedOriginValues );
|
|
292
232
|
const inheritedValue = placeholderSettings[ propKey ] ?? null;
|
|
293
233
|
const isInheritedDynamic = isDynamicPropValue( inheritedValue );
|
|
294
234
|
|
|
295
|
-
const
|
|
235
|
+
const shouldUseInheritedAsValue = isInheritedDynamic && ! matchingOverride;
|
|
236
|
+
|
|
237
|
+
const propValue = shouldUseInheritedAsValue ? inheritedValue : overrideValue;
|
|
296
238
|
const placeholderValue = matchingOverride || isInheritedDynamic ? null : inheritedValue;
|
|
297
239
|
|
|
298
240
|
return { propValue, placeholderValue };
|
|
@@ -408,31 +350,3 @@ function isValidOverride( overridableProps: OverridableProps, override: Componen
|
|
|
408
350
|
|
|
409
351
|
return !! overridableProps.props[ overridableKey ];
|
|
410
352
|
}
|
|
411
|
-
|
|
412
|
-
function formatOverridesToApply( overrides: ComponentInstanceOverridesPropValue ): OverridesMapping {
|
|
413
|
-
if ( ! overrides ) {
|
|
414
|
-
return {};
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
const result: OverridesMapping = {};
|
|
418
|
-
|
|
419
|
-
for ( const item of overrides ) {
|
|
420
|
-
const overridable = componentOverridablePropTypeUtil.extract( item );
|
|
421
|
-
let override: PropValue = item;
|
|
422
|
-
|
|
423
|
-
if ( overridable ) {
|
|
424
|
-
override = overridable.origin_value;
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
const extractedOverride = componentInstanceOverridePropTypeUtil.extract( override );
|
|
428
|
-
if ( ! extractedOverride ) {
|
|
429
|
-
continue;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
result[ extractedOverride.override_key ] = {
|
|
433
|
-
value: extractedOverride.override_value as AnyTransformable | null,
|
|
434
|
-
};
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
return result;
|
|
438
|
-
}
|
|
@@ -2,7 +2,7 @@ import { type AnyTransformable } from '@elementor/editor-props';
|
|
|
2
2
|
|
|
3
3
|
import { componentOverridablePropTypeUtil } from '../../../prop-types/component-overridable-prop-type';
|
|
4
4
|
|
|
5
|
-
type ElementSettings = Record< string, AnyTransformable | null >;
|
|
5
|
+
export type ElementSettings = Record< string, AnyTransformable | null >;
|
|
6
6
|
|
|
7
7
|
export type OverridesMapping = {
|
|
8
8
|
[ key: string ]: {
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
type DependencyEffect,
|
|
4
|
+
extractDependencyEffect,
|
|
5
|
+
extractOrderedDependencies,
|
|
6
|
+
getElementSettingsWithDefaults,
|
|
7
|
+
getUpdatedValues,
|
|
8
|
+
} from '@elementor/editor-editing-panel';
|
|
9
|
+
import { type ElementType } from '@elementor/editor-elements';
|
|
10
|
+
import { type AnyTransformable } from '@elementor/editor-props';
|
|
11
|
+
|
|
12
|
+
import { type ComponentInstanceOverride } from '../../../prop-types/component-instance-overrides-prop-type';
|
|
13
|
+
import { resolveOverridePropValue } from '../../../utils/resolve-override-prop-value';
|
|
14
|
+
import { type ElementSettings } from './resolve-element-settings';
|
|
15
|
+
|
|
16
|
+
type OverrideDependenciesResult = DependencyEffect & {
|
|
17
|
+
overrideValue: AnyTransformable | null;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export function useOverrideControlDependencies( {
|
|
21
|
+
existingOverride,
|
|
22
|
+
resolvedElementSettings,
|
|
23
|
+
elementId,
|
|
24
|
+
elementType,
|
|
25
|
+
propKey,
|
|
26
|
+
}: {
|
|
27
|
+
existingOverride: ComponentInstanceOverride | null;
|
|
28
|
+
resolvedElementSettings: ElementSettings;
|
|
29
|
+
elementType: ElementType;
|
|
30
|
+
elementId: string;
|
|
31
|
+
propKey: string;
|
|
32
|
+
} ): OverrideDependenciesResult {
|
|
33
|
+
return useMemo( () => {
|
|
34
|
+
const { isDisabled, isHidden } = extractDependencyEffect(
|
|
35
|
+
propKey,
|
|
36
|
+
elementType.propsSchema,
|
|
37
|
+
resolvedElementSettings
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
const existingOverrideValue = existingOverride ? resolveOverridePropValue( existingOverride ) : null;
|
|
41
|
+
const settingsForDepsNewValuesCalculation = { ...resolvedElementSettings, [ propKey ]: existingOverrideValue };
|
|
42
|
+
|
|
43
|
+
const resolvedSettingsWithDefaults = getElementSettingsWithDefaults(
|
|
44
|
+
elementType.propsSchema,
|
|
45
|
+
settingsForDepsNewValuesCalculation
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const dependents = extractOrderedDependencies( elementType.dependenciesPerTargetMapping ?? {} );
|
|
49
|
+
|
|
50
|
+
const settingsWithDepsNewValues = getUpdatedValues(
|
|
51
|
+
settingsForDepsNewValuesCalculation,
|
|
52
|
+
dependents,
|
|
53
|
+
elementType.propsSchema,
|
|
54
|
+
resolvedSettingsWithDefaults,
|
|
55
|
+
elementId
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
const overrideValue = settingsWithDepsNewValues[ propKey ];
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
overrideValue,
|
|
62
|
+
isDisabled,
|
|
63
|
+
isHidden,
|
|
64
|
+
};
|
|
65
|
+
}, [
|
|
66
|
+
existingOverride,
|
|
67
|
+
resolvedElementSettings,
|
|
68
|
+
propKey,
|
|
69
|
+
elementType.propsSchema,
|
|
70
|
+
elementType.dependenciesPerTargetMapping,
|
|
71
|
+
elementId,
|
|
72
|
+
] );
|
|
73
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { useElement } from '@elementor/editor-editing-panel';
|
|
3
|
+
import { type ElementType, getElementSettings, getElementType } from '@elementor/editor-elements';
|
|
4
|
+
import { type AnyTransformable, type PropValue } from '@elementor/editor-props';
|
|
5
|
+
|
|
6
|
+
import { componentInstanceOverridePropTypeUtil } from '../../../prop-types/component-instance-override-prop-type';
|
|
7
|
+
import { type ComponentInstanceOverridesPropValue } from '../../../prop-types/component-instance-overrides-prop-type';
|
|
8
|
+
import { componentOverridablePropTypeUtil } from '../../../prop-types/component-overridable-prop-type';
|
|
9
|
+
import { useComponentId, useComponentInstanceOverrides } from '../../../provider/component-instance-context';
|
|
10
|
+
import { type OverridableProp } from '../../../types';
|
|
11
|
+
import { resolveOverridesChain } from '../../../utils/resolve-overrides-chain';
|
|
12
|
+
import { OverrideControlInnerElementNotFoundError } from '../../errors';
|
|
13
|
+
import {
|
|
14
|
+
applyOverridesToSettings,
|
|
15
|
+
type ElementSettings,
|
|
16
|
+
type OverridesMapping,
|
|
17
|
+
unwrapOverridableSettings,
|
|
18
|
+
} from './resolve-element-settings';
|
|
19
|
+
|
|
20
|
+
type ResolvedInnerElement = {
|
|
21
|
+
elementId: string;
|
|
22
|
+
elementType: ElementType;
|
|
23
|
+
resolvedOriginValues: ElementSettings;
|
|
24
|
+
resolvedElementSettings: ElementSettings;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export function useResolvedInnerElement( overridableProp: OverridableProp ): ResolvedInnerElement {
|
|
28
|
+
const componentInstanceElement = useElement();
|
|
29
|
+
const componentId = useComponentId();
|
|
30
|
+
const overrides = useComponentInstanceOverrides();
|
|
31
|
+
|
|
32
|
+
const { elementId: originElementId, widgetType, elType } = overridableProp.originPropFields ?? overridableProp;
|
|
33
|
+
const type = elType === 'widget' ? widgetType : elType;
|
|
34
|
+
const elementType = getElementType( type );
|
|
35
|
+
|
|
36
|
+
if ( ! elementType ) {
|
|
37
|
+
throw new Error( `Element type not found for ${ type }` );
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const { elementId, overridesMapping } = useMemo( () => {
|
|
41
|
+
const overridesChainResult = resolveOverridesChain( {
|
|
42
|
+
outerOverridableProp: overridableProp,
|
|
43
|
+
outerInstanceId: componentInstanceElement.element.id,
|
|
44
|
+
} );
|
|
45
|
+
|
|
46
|
+
if ( overridesChainResult.isChainBroken ) {
|
|
47
|
+
throw new OverrideControlInnerElementNotFoundError( {
|
|
48
|
+
context: { componentId, elementId: originElementId },
|
|
49
|
+
} );
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
elementId: overridesChainResult.innerElement.id,
|
|
54
|
+
overridesMapping: overridesChainResult.overridesMapping,
|
|
55
|
+
};
|
|
56
|
+
}, [ overridableProp, componentInstanceElement.element.id, componentId, originElementId ] );
|
|
57
|
+
|
|
58
|
+
// Not reactive to inner element store changes — intentional.
|
|
59
|
+
// Inner element settings can only change in component edit mode, which unmounts this component.
|
|
60
|
+
const settingsWithInnerOverrides = useMemo( () => {
|
|
61
|
+
const settings = getElementSettings< AnyTransformable >(
|
|
62
|
+
elementId,
|
|
63
|
+
Object.keys( elementType?.propsSchema ?? {} )
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
return applyOverridesToSettings( settings, overridesMapping );
|
|
67
|
+
}, [ elementId, elementType?.propsSchema, overridesMapping ] );
|
|
68
|
+
|
|
69
|
+
const resolvedElementSettings = useMemo( () => {
|
|
70
|
+
const withAllOverrides = applyOverridesToSettings(
|
|
71
|
+
settingsWithInnerOverrides,
|
|
72
|
+
formatOverridesToApply( overrides )
|
|
73
|
+
);
|
|
74
|
+
return unwrapOverridableSettings( withAllOverrides );
|
|
75
|
+
}, [ settingsWithInnerOverrides, overrides ] );
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
elementId,
|
|
79
|
+
elementType,
|
|
80
|
+
resolvedOriginValues: settingsWithInnerOverrides,
|
|
81
|
+
resolvedElementSettings,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function formatOverridesToApply( overrides: ComponentInstanceOverridesPropValue ): OverridesMapping {
|
|
86
|
+
if ( ! overrides ) {
|
|
87
|
+
return {};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const result: OverridesMapping = {};
|
|
91
|
+
|
|
92
|
+
for ( const item of overrides ) {
|
|
93
|
+
const overridable = componentOverridablePropTypeUtil.extract( item );
|
|
94
|
+
let override: PropValue = item;
|
|
95
|
+
|
|
96
|
+
if ( overridable ) {
|
|
97
|
+
override = overridable.origin_value;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const extractedOverride = componentInstanceOverridePropTypeUtil.extract( override );
|
|
101
|
+
if ( ! extractedOverride ) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
result[ extractedOverride.override_key ] = {
|
|
106
|
+
value: extractedOverride.override_value as AnyTransformable | null,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
@@ -16,6 +16,16 @@ export function ComponentInstanceProvider( { children, ...props }: PropsWithChil
|
|
|
16
16
|
return <ComponentInstanceContext.Provider value={ props }>{ children }</ComponentInstanceContext.Provider>;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
function useComponentInstanceContext() {
|
|
20
|
+
const context = useContext( ComponentInstanceContext );
|
|
21
|
+
|
|
22
|
+
if ( ! context ) {
|
|
23
|
+
throw new Error( 'useComponentInstanceContext must be used within a ComponentInstanceProvider' );
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return context;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const useComponentId = () => useComponentInstanceContext().componentId;
|
|
30
|
+
export const useComponentInstanceOverrides = () => useComponentInstanceContext().overrides;
|
|
31
|
+
export const useComponentOverridableProps = () => useComponentInstanceContext().overridableProps;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type PropValue } from '@elementor/editor-props';
|
|
1
|
+
import { type AnyTransformable, type PropValue } from '@elementor/editor-props';
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
type ComponentInstanceOverrideProp,
|
|
@@ -10,7 +10,9 @@ import {
|
|
|
10
10
|
componentOverridablePropTypeUtil,
|
|
11
11
|
} from '../prop-types/component-overridable-prop-type';
|
|
12
12
|
|
|
13
|
-
export const resolveOverridePropValue = (
|
|
13
|
+
export const resolveOverridePropValue = (
|
|
14
|
+
originalPropValue: ComponentInstanceOverride | PropValue
|
|
15
|
+
): AnyTransformable | null => {
|
|
14
16
|
const isOverridable = componentOverridablePropTypeUtil.isValid( originalPropValue );
|
|
15
17
|
if ( isOverridable ) {
|
|
16
18
|
return getOverridableValue( originalPropValue as ComponentOverridableProp );
|
|
@@ -21,10 +23,10 @@ export const resolveOverridePropValue = ( originalPropValue: ComponentInstanceOv
|
|
|
21
23
|
return getOverrideValue( originalPropValue );
|
|
22
24
|
}
|
|
23
25
|
|
|
24
|
-
return originalPropValue;
|
|
26
|
+
return originalPropValue as AnyTransformable | null;
|
|
25
27
|
};
|
|
26
28
|
|
|
27
|
-
function getOverridableValue( overridableProp: ComponentOverridableProp | null ):
|
|
29
|
+
function getOverridableValue( overridableProp: ComponentOverridableProp | null ): AnyTransformable | null {
|
|
28
30
|
const overridableValue = componentOverridablePropTypeUtil.extract( overridableProp );
|
|
29
31
|
|
|
30
32
|
if ( ! overridableValue ) {
|
|
@@ -37,15 +39,15 @@ function getOverridableValue( overridableProp: ComponentOverridableProp | null )
|
|
|
37
39
|
return getOverrideValue( overridableValue.origin_value as ComponentInstanceOverrideProp );
|
|
38
40
|
}
|
|
39
41
|
|
|
40
|
-
return overridableValue.origin_value;
|
|
42
|
+
return overridableValue.origin_value as AnyTransformable | null;
|
|
41
43
|
}
|
|
42
44
|
|
|
43
|
-
function getOverrideValue( overrideProp: ComponentInstanceOverrideProp | null ):
|
|
45
|
+
function getOverrideValue( overrideProp: ComponentInstanceOverrideProp | null ): AnyTransformable | null {
|
|
44
46
|
const overrideValue = componentInstanceOverridePropTypeUtil.extract( overrideProp );
|
|
45
47
|
|
|
46
48
|
if ( ! overrideValue ) {
|
|
47
49
|
return null;
|
|
48
50
|
}
|
|
49
51
|
|
|
50
|
-
return overrideValue.override_value as
|
|
52
|
+
return overrideValue.override_value as AnyTransformable | null;
|
|
51
53
|
}
|