@elementor/editor-components 3.33.0-201 → 3.33.0-203
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 +205 -121
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +196 -112
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -15
- package/src/api.ts +4 -3
- package/src/component-id-transformer.ts +12 -2
- package/src/components/create-component-form/create-component-form.tsx +26 -22
- package/src/components/create-component-form/utils/replace-element-with-component.ts +1 -1
- package/src/init.ts +4 -1
- package/src/store/store.ts +33 -4
- package/src/types.ts +10 -2
- package/src/utils/before-save.ts +99 -0
package/dist/index.js
CHANGED
|
@@ -41,80 +41,11 @@ var import_editor_documents = require("@elementor/editor-documents");
|
|
|
41
41
|
var import_editor_elements_panel = require("@elementor/editor-elements-panel");
|
|
42
42
|
var import_editor_styles_repository2 = require("@elementor/editor-styles-repository");
|
|
43
43
|
var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
|
|
44
|
-
var
|
|
44
|
+
var import_store18 = require("@elementor/store");
|
|
45
45
|
var import_i18n6 = require("@wordpress/i18n");
|
|
46
46
|
|
|
47
47
|
// src/component-id-transformer.ts
|
|
48
48
|
var import_editor_canvas = require("@elementor/editor-canvas");
|
|
49
|
-
var componentIdTransformer = (0, import_editor_canvas.createTransformer)(async (id) => {
|
|
50
|
-
const extendedWindow = window;
|
|
51
|
-
const documentManager = extendedWindow.elementor?.documents;
|
|
52
|
-
if (!documentManager) {
|
|
53
|
-
throw new Error("Elementor documents manager not found");
|
|
54
|
-
}
|
|
55
|
-
const data = await documentManager.request(id);
|
|
56
|
-
return data.elements ?? [];
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
// src/components/components-tab/components.tsx
|
|
60
|
-
var React6 = __toESM(require("react"));
|
|
61
|
-
var import_editor_ui = require("@elementor/editor-ui");
|
|
62
|
-
|
|
63
|
-
// src/components/components-tab/component-search.tsx
|
|
64
|
-
var React2 = __toESM(require("react"));
|
|
65
|
-
var import_icons = require("@elementor/icons");
|
|
66
|
-
var import_ui = require("@elementor/ui");
|
|
67
|
-
var import_i18n = require("@wordpress/i18n");
|
|
68
|
-
|
|
69
|
-
// src/components/components-tab/search-provider.tsx
|
|
70
|
-
var React = __toESM(require("react"));
|
|
71
|
-
var import_react = require("react");
|
|
72
|
-
var import_utils = require("@elementor/utils");
|
|
73
|
-
var SearchContext = (0, import_react.createContext)(void 0);
|
|
74
|
-
var SearchProvider = ({
|
|
75
|
-
children,
|
|
76
|
-
localStorageKey
|
|
77
|
-
}) => {
|
|
78
|
-
const { debouncedValue, handleChange, inputValue } = (0, import_utils.useSearchState)({ localStorageKey });
|
|
79
|
-
const clearSearch = () => {
|
|
80
|
-
handleChange("");
|
|
81
|
-
};
|
|
82
|
-
return /* @__PURE__ */ React.createElement(SearchContext.Provider, { value: { handleChange, clearSearch, searchValue: debouncedValue, inputValue } }, children);
|
|
83
|
-
};
|
|
84
|
-
var useSearch = () => {
|
|
85
|
-
const context = (0, import_react.useContext)(SearchContext);
|
|
86
|
-
if (!context) {
|
|
87
|
-
throw new Error("useSearch must be used within a SearchProvider");
|
|
88
|
-
}
|
|
89
|
-
return context;
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
// src/components/components-tab/component-search.tsx
|
|
93
|
-
var ComponentSearch = () => {
|
|
94
|
-
const { inputValue, handleChange } = useSearch();
|
|
95
|
-
return /* @__PURE__ */ React2.createElement(import_ui.Stack, { direction: "row", gap: 0.5, sx: { width: "100%", px: 2, py: 1.5 } }, /* @__PURE__ */ React2.createElement(import_ui.Box, { sx: { flexGrow: 1 } }, /* @__PURE__ */ React2.createElement(
|
|
96
|
-
import_ui.TextField,
|
|
97
|
-
{
|
|
98
|
-
role: "search",
|
|
99
|
-
fullWidth: true,
|
|
100
|
-
size: "tiny",
|
|
101
|
-
value: inputValue,
|
|
102
|
-
placeholder: (0, import_i18n.__)("Search", "elementor"),
|
|
103
|
-
onChange: (e) => handleChange(e.target.value),
|
|
104
|
-
InputProps: {
|
|
105
|
-
startAdornment: /* @__PURE__ */ React2.createElement(import_ui.InputAdornment, { position: "start" }, /* @__PURE__ */ React2.createElement(import_icons.SearchIcon, { fontSize: "tiny" }))
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
)));
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
// src/components/components-tab/components-list.tsx
|
|
112
|
-
var React5 = __toESM(require("react"));
|
|
113
|
-
var import_icons3 = require("@elementor/icons");
|
|
114
|
-
var import_ui4 = require("@elementor/ui");
|
|
115
|
-
var import_i18n2 = require("@wordpress/i18n");
|
|
116
|
-
|
|
117
|
-
// src/hooks/use-components.ts
|
|
118
49
|
var import_store3 = require("@elementor/store");
|
|
119
50
|
|
|
120
51
|
// src/store/store.ts
|
|
@@ -155,6 +86,7 @@ var loadComponents = (0, import_store.__createAsyncThunk)("components/load", asy
|
|
|
155
86
|
// src/store/store.ts
|
|
156
87
|
var initialState = {
|
|
157
88
|
data: [],
|
|
89
|
+
unpublishedData: [],
|
|
158
90
|
loadStatus: "idle",
|
|
159
91
|
createStatus: "idle",
|
|
160
92
|
styles: {}
|
|
@@ -165,11 +97,21 @@ var slice = (0, import_store2.__createSlice)({
|
|
|
165
97
|
initialState,
|
|
166
98
|
reducers: {
|
|
167
99
|
add: (state, { payload }) => {
|
|
168
|
-
|
|
100
|
+
if (Array.isArray(payload)) {
|
|
101
|
+
state.data = [...state.data, ...payload];
|
|
102
|
+
} else {
|
|
103
|
+
state.data.unshift(payload);
|
|
104
|
+
}
|
|
169
105
|
},
|
|
170
106
|
load: (state, { payload }) => {
|
|
171
107
|
state.data = payload;
|
|
172
108
|
},
|
|
109
|
+
addUnpublished: (state, { payload }) => {
|
|
110
|
+
state.unpublishedData.unshift(payload);
|
|
111
|
+
},
|
|
112
|
+
resetUnpublished: (state) => {
|
|
113
|
+
state.unpublishedData = [];
|
|
114
|
+
},
|
|
173
115
|
removeStyles(state, { payload }) {
|
|
174
116
|
const { [payload.id]: _, ...rest } = state.styles;
|
|
175
117
|
state.styles = rest;
|
|
@@ -208,7 +150,19 @@ var selectData = (state) => state[SLICE_NAME].data;
|
|
|
208
150
|
var selectLoadStatus = (state) => state[SLICE_NAME].loadStatus;
|
|
209
151
|
var selectCreateStatus = (state) => state[SLICE_NAME].createStatus;
|
|
210
152
|
var selectStylesDefinitions = (state) => state[SLICE_NAME].styles ?? {};
|
|
211
|
-
var
|
|
153
|
+
var selectUnpublishedData = (state) => state[SLICE_NAME].unpublishedData;
|
|
154
|
+
var selectComponents = (0, import_store2.__createSelector)(
|
|
155
|
+
selectData,
|
|
156
|
+
selectUnpublishedData,
|
|
157
|
+
(data, unpublishedData) => [
|
|
158
|
+
...unpublishedData.map((item) => ({ id: item.id, name: item.name })),
|
|
159
|
+
...data
|
|
160
|
+
]
|
|
161
|
+
);
|
|
162
|
+
var selectUnpublishedComponents = (0, import_store2.__createSelector)(
|
|
163
|
+
selectUnpublishedData,
|
|
164
|
+
(unpublishedData) => unpublishedData
|
|
165
|
+
);
|
|
212
166
|
var selectLoadIsPending = (0, import_store2.__createSelector)(selectLoadStatus, (status) => status === "pending");
|
|
213
167
|
var selectLoadIsError = (0, import_store2.__createSelector)(selectLoadStatus, (status) => status === "error");
|
|
214
168
|
var selectCreateIsPending = (0, import_store2.__createSelector)(selectCreateStatus, (status) => status === "pending");
|
|
@@ -216,10 +170,85 @@ var selectCreateIsError = (0, import_store2.__createSelector)(selectCreateStatus
|
|
|
216
170
|
var selectStyles = (state) => state[SLICE_NAME].styles ?? {};
|
|
217
171
|
var selectFlatStyles = (0, import_store2.__createSelector)(selectStylesDefinitions, (data) => Object.values(data).flat());
|
|
218
172
|
|
|
173
|
+
// src/component-id-transformer.ts
|
|
174
|
+
var componentIdTransformer = (0, import_editor_canvas.createTransformer)(async (id) => {
|
|
175
|
+
const unpublishedComponents = selectUnpublishedComponents((0, import_store3.__getState)());
|
|
176
|
+
const unpublishedComponent = unpublishedComponents.find((component) => component.id === id);
|
|
177
|
+
if (unpublishedComponent) {
|
|
178
|
+
return structuredClone(unpublishedComponent.content);
|
|
179
|
+
}
|
|
180
|
+
const extendedWindow = window;
|
|
181
|
+
const documentManager = extendedWindow.elementor?.documents;
|
|
182
|
+
if (!documentManager) {
|
|
183
|
+
throw new Error("Elementor documents manager not found");
|
|
184
|
+
}
|
|
185
|
+
const data = await documentManager.request(id);
|
|
186
|
+
return data.elements ?? [];
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// src/components/components-tab/components.tsx
|
|
190
|
+
var React6 = __toESM(require("react"));
|
|
191
|
+
var import_editor_ui = require("@elementor/editor-ui");
|
|
192
|
+
|
|
193
|
+
// src/components/components-tab/component-search.tsx
|
|
194
|
+
var React2 = __toESM(require("react"));
|
|
195
|
+
var import_icons = require("@elementor/icons");
|
|
196
|
+
var import_ui = require("@elementor/ui");
|
|
197
|
+
var import_i18n = require("@wordpress/i18n");
|
|
198
|
+
|
|
199
|
+
// src/components/components-tab/search-provider.tsx
|
|
200
|
+
var React = __toESM(require("react"));
|
|
201
|
+
var import_react = require("react");
|
|
202
|
+
var import_utils = require("@elementor/utils");
|
|
203
|
+
var SearchContext = (0, import_react.createContext)(void 0);
|
|
204
|
+
var SearchProvider = ({
|
|
205
|
+
children,
|
|
206
|
+
localStorageKey
|
|
207
|
+
}) => {
|
|
208
|
+
const { debouncedValue, handleChange, inputValue } = (0, import_utils.useSearchState)({ localStorageKey });
|
|
209
|
+
const clearSearch = () => {
|
|
210
|
+
handleChange("");
|
|
211
|
+
};
|
|
212
|
+
return /* @__PURE__ */ React.createElement(SearchContext.Provider, { value: { handleChange, clearSearch, searchValue: debouncedValue, inputValue } }, children);
|
|
213
|
+
};
|
|
214
|
+
var useSearch = () => {
|
|
215
|
+
const context = (0, import_react.useContext)(SearchContext);
|
|
216
|
+
if (!context) {
|
|
217
|
+
throw new Error("useSearch must be used within a SearchProvider");
|
|
218
|
+
}
|
|
219
|
+
return context;
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
// src/components/components-tab/component-search.tsx
|
|
223
|
+
var ComponentSearch = () => {
|
|
224
|
+
const { inputValue, handleChange } = useSearch();
|
|
225
|
+
return /* @__PURE__ */ React2.createElement(import_ui.Stack, { direction: "row", gap: 0.5, sx: { width: "100%", px: 2, py: 1.5 } }, /* @__PURE__ */ React2.createElement(import_ui.Box, { sx: { flexGrow: 1 } }, /* @__PURE__ */ React2.createElement(
|
|
226
|
+
import_ui.TextField,
|
|
227
|
+
{
|
|
228
|
+
role: "search",
|
|
229
|
+
fullWidth: true,
|
|
230
|
+
size: "tiny",
|
|
231
|
+
value: inputValue,
|
|
232
|
+
placeholder: (0, import_i18n.__)("Search", "elementor"),
|
|
233
|
+
onChange: (e) => handleChange(e.target.value),
|
|
234
|
+
InputProps: {
|
|
235
|
+
startAdornment: /* @__PURE__ */ React2.createElement(import_ui.InputAdornment, { position: "start" }, /* @__PURE__ */ React2.createElement(import_icons.SearchIcon, { fontSize: "tiny" }))
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
)));
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
// src/components/components-tab/components-list.tsx
|
|
242
|
+
var React5 = __toESM(require("react"));
|
|
243
|
+
var import_icons3 = require("@elementor/icons");
|
|
244
|
+
var import_ui4 = require("@elementor/ui");
|
|
245
|
+
var import_i18n2 = require("@wordpress/i18n");
|
|
246
|
+
|
|
219
247
|
// src/hooks/use-components.ts
|
|
248
|
+
var import_store5 = require("@elementor/store");
|
|
220
249
|
var useComponents = () => {
|
|
221
|
-
const components = (0,
|
|
222
|
-
const isLoading = (0,
|
|
250
|
+
const components = (0, import_store5.__useSelector)(selectComponents);
|
|
251
|
+
const isLoading = (0, import_store5.__useSelector)(selectLoadIsPending);
|
|
223
252
|
return { components, isLoading };
|
|
224
253
|
};
|
|
225
254
|
|
|
@@ -268,7 +297,7 @@ function getSelectedElementContainer() {
|
|
|
268
297
|
|
|
269
298
|
// src/components/create-component-form/utils/replace-element-with-component.ts
|
|
270
299
|
var import_editor_elements2 = require("@elementor/editor-elements");
|
|
271
|
-
var replaceElementWithComponent =
|
|
300
|
+
var replaceElementWithComponent = (element, component) => {
|
|
272
301
|
(0, import_editor_elements2.replaceElement)({
|
|
273
302
|
currentElement: element,
|
|
274
303
|
newElement: createComponentModel(component),
|
|
@@ -488,26 +517,10 @@ var import_react3 = require("react");
|
|
|
488
517
|
var import_editor_elements4 = require("@elementor/editor-elements");
|
|
489
518
|
var import_editor_ui2 = require("@elementor/editor-ui");
|
|
490
519
|
var import_icons4 = require("@elementor/icons");
|
|
520
|
+
var import_store7 = require("@elementor/store");
|
|
491
521
|
var import_ui5 = require("@elementor/ui");
|
|
492
522
|
var import_i18n4 = require("@wordpress/i18n");
|
|
493
523
|
|
|
494
|
-
// src/hooks/use-create-component.ts
|
|
495
|
-
var import_store5 = require("@elementor/store");
|
|
496
|
-
var useCreateComponent = () => {
|
|
497
|
-
const dispatch4 = (0, import_store5.__useDispatch)();
|
|
498
|
-
const isPending = (0, import_store5.__useSelector)(selectCreateIsPending);
|
|
499
|
-
const isError = (0, import_store5.__useSelector)(selectCreateIsError);
|
|
500
|
-
const createComponentAction = async (payload) => {
|
|
501
|
-
const result = await dispatch4(createComponent(payload));
|
|
502
|
-
return result.payload;
|
|
503
|
-
};
|
|
504
|
-
return {
|
|
505
|
-
createComponent: createComponentAction,
|
|
506
|
-
isPending,
|
|
507
|
-
isError
|
|
508
|
-
};
|
|
509
|
-
};
|
|
510
|
-
|
|
511
524
|
// src/components/create-component-form/hooks/use-form.ts
|
|
512
525
|
var import_react2 = require("react");
|
|
513
526
|
var useForm = (initialValues) => {
|
|
@@ -588,7 +601,7 @@ function CreateComponentForm() {
|
|
|
588
601
|
const [element, setElement] = (0, import_react3.useState)(null);
|
|
589
602
|
const [anchorPosition, setAnchorPosition] = (0, import_react3.useState)();
|
|
590
603
|
const [resultNotification, setResultNotification] = (0, import_react3.useState)(null);
|
|
591
|
-
const
|
|
604
|
+
const dispatch5 = (0, import_store7.__useDispatch)();
|
|
592
605
|
(0, import_react3.useEffect)(() => {
|
|
593
606
|
const OPEN_SAVE_AS_COMPONENT_FORM_EVENT = "elementor/editor/open-save-as-component-form";
|
|
594
607
|
const openPopup = (event) => {
|
|
@@ -601,25 +614,26 @@ function CreateComponentForm() {
|
|
|
601
614
|
};
|
|
602
615
|
}, []);
|
|
603
616
|
const handleSave = async (values) => {
|
|
604
|
-
if (!element) {
|
|
605
|
-
throw new Error(`Can't save element as component: element not found`);
|
|
606
|
-
}
|
|
607
617
|
try {
|
|
608
|
-
const result = await createComponent2({
|
|
609
|
-
name: values.componentName,
|
|
610
|
-
content: [element.element.model.toJSON({ remove: ["default"] })]
|
|
611
|
-
});
|
|
612
618
|
if (!element) {
|
|
613
|
-
throw new Error(`Can't
|
|
619
|
+
throw new Error(`Can't save element as component: element not found`);
|
|
614
620
|
}
|
|
621
|
+
const tempId = generateTempId();
|
|
622
|
+
dispatch5(
|
|
623
|
+
slice.actions.addUnpublished({
|
|
624
|
+
id: tempId,
|
|
625
|
+
name: values.componentName,
|
|
626
|
+
content: [element.element.model.toJSON({ remove: ["default"] })]
|
|
627
|
+
})
|
|
628
|
+
);
|
|
615
629
|
replaceElementWithComponent(element.element, {
|
|
616
|
-
id:
|
|
630
|
+
id: tempId,
|
|
617
631
|
name: values.componentName
|
|
618
632
|
});
|
|
619
633
|
setResultNotification({
|
|
620
634
|
show: true,
|
|
621
|
-
// Translators: %1$s: Component name, %2$s: Component ID
|
|
622
|
-
message: (0, import_i18n4.__)("Component saved successfully as: %1$s (ID: %2$s)", "elementor").replace("%1$s", values.componentName).replace("%2$s",
|
|
635
|
+
// Translators: %1$s: Component name, %2$s: Component temp ID
|
|
636
|
+
message: (0, import_i18n4.__)("Component saved successfully as: %1$s (temp ID: %2$s)", "elementor").replace("%1$s", values.componentName).replace("%2$s", tempId.toString()),
|
|
623
637
|
type: "success"
|
|
624
638
|
});
|
|
625
639
|
resetAndClosePopup();
|
|
@@ -649,7 +663,6 @@ function CreateComponentForm() {
|
|
|
649
663
|
{
|
|
650
664
|
initialValues: { componentName: element.elementLabel },
|
|
651
665
|
handleSave,
|
|
652
|
-
isSubmitting: isPending,
|
|
653
666
|
closePopup: resetAndClosePopup
|
|
654
667
|
}
|
|
655
668
|
)
|
|
@@ -667,7 +680,6 @@ var FONT_SIZE = "tiny";
|
|
|
667
680
|
var Form = ({
|
|
668
681
|
initialValues,
|
|
669
682
|
handleSave,
|
|
670
|
-
isSubmitting,
|
|
671
683
|
closePopup
|
|
672
684
|
}) => {
|
|
673
685
|
const { values, errors, isValid, handleChange, validateForm: validateForm2 } = useForm(initialValues);
|
|
@@ -712,18 +724,21 @@ var Form = ({
|
|
|
712
724
|
error: Boolean(errors.componentName),
|
|
713
725
|
helperText: errors.componentName
|
|
714
726
|
}
|
|
715
|
-
))), /* @__PURE__ */ React7.createElement(import_ui5.Stack, { direction: "row", justifyContent: "flex-end", alignSelf: "end", py: 1, px: 1.5 }, /* @__PURE__ */ React7.createElement(import_ui5.Button, { onClick: closePopup,
|
|
727
|
+
))), /* @__PURE__ */ React7.createElement(import_ui5.Stack, { direction: "row", justifyContent: "flex-end", alignSelf: "end", py: 1, px: 1.5 }, /* @__PURE__ */ React7.createElement(import_ui5.Button, { onClick: closePopup, color: "secondary", variant: "text", size: "small" }, (0, import_i18n4.__)("Cancel", "elementor")), /* @__PURE__ */ React7.createElement(
|
|
716
728
|
import_ui5.Button,
|
|
717
729
|
{
|
|
718
730
|
onClick: handleSubmit,
|
|
719
|
-
disabled:
|
|
731
|
+
disabled: !isValid,
|
|
720
732
|
variant: "contained",
|
|
721
733
|
color: "primary",
|
|
722
734
|
size: "small"
|
|
723
735
|
},
|
|
724
|
-
|
|
736
|
+
(0, import_i18n4.__)("Create", "elementor")
|
|
725
737
|
)));
|
|
726
738
|
};
|
|
739
|
+
var generateTempId = () => {
|
|
740
|
+
return Date.now() + Math.floor(Math.random() * 1e6);
|
|
741
|
+
};
|
|
727
742
|
|
|
728
743
|
// src/create-component-type.ts
|
|
729
744
|
var import_editor_canvas3 = require("@elementor/editor-canvas");
|
|
@@ -806,21 +821,21 @@ function createComponentView(options) {
|
|
|
806
821
|
|
|
807
822
|
// src/populate-store.ts
|
|
808
823
|
var import_react4 = require("react");
|
|
809
|
-
var
|
|
824
|
+
var import_store9 = require("@elementor/store");
|
|
810
825
|
function PopulateStore() {
|
|
811
826
|
(0, import_react4.useEffect)(() => {
|
|
812
|
-
(0,
|
|
827
|
+
(0, import_store9.__dispatch)(loadComponents());
|
|
813
828
|
}, []);
|
|
814
829
|
return null;
|
|
815
830
|
}
|
|
816
831
|
|
|
817
832
|
// src/store/components-styles-provider.ts
|
|
818
833
|
var import_editor_styles_repository = require("@elementor/editor-styles-repository");
|
|
819
|
-
var
|
|
834
|
+
var import_store10 = require("@elementor/store");
|
|
820
835
|
var componentsStylesProvider = (0, import_editor_styles_repository.createStylesProvider)({
|
|
821
836
|
key: "components-styles",
|
|
822
837
|
priority: 100,
|
|
823
|
-
subscribe: (cb) => (0,
|
|
838
|
+
subscribe: (cb) => (0, import_store10.__subscribeWithSelector)(
|
|
824
839
|
(state) => state[SLICE_NAME],
|
|
825
840
|
() => {
|
|
826
841
|
cb();
|
|
@@ -828,16 +843,16 @@ var componentsStylesProvider = (0, import_editor_styles_repository.createStylesP
|
|
|
828
843
|
),
|
|
829
844
|
actions: {
|
|
830
845
|
all: () => {
|
|
831
|
-
return selectFlatStyles((0,
|
|
846
|
+
return selectFlatStyles((0, import_store10.__getState)());
|
|
832
847
|
},
|
|
833
848
|
get: (id) => {
|
|
834
|
-
return selectFlatStyles((0,
|
|
849
|
+
return selectFlatStyles((0, import_store10.__getState)()).find((style) => style.id === id) ?? null;
|
|
835
850
|
}
|
|
836
851
|
}
|
|
837
852
|
});
|
|
838
853
|
|
|
839
854
|
// src/store/load-components-styles.ts
|
|
840
|
-
var
|
|
855
|
+
var import_store12 = require("@elementor/store");
|
|
841
856
|
|
|
842
857
|
// src/utils/get-component-ids.ts
|
|
843
858
|
var import_editor_props = require("@elementor/editor-props");
|
|
@@ -861,7 +876,7 @@ async function loadComponentsStyles(elements) {
|
|
|
861
876
|
if (!componentIds.length) {
|
|
862
877
|
return;
|
|
863
878
|
}
|
|
864
|
-
const knownComponents = selectStyles((0,
|
|
879
|
+
const knownComponents = selectStyles((0, import_store12.__getState)());
|
|
865
880
|
const unknownComponentIds = componentIds.filter((id) => !knownComponents[id]);
|
|
866
881
|
if (!unknownComponentIds.length) {
|
|
867
882
|
return;
|
|
@@ -882,24 +897,92 @@ function addStyles(data) {
|
|
|
882
897
|
const styles = Object.fromEntries(
|
|
883
898
|
data.map(([componentId, componentData]) => [componentId, extractStyles(componentData)])
|
|
884
899
|
);
|
|
885
|
-
(0,
|
|
900
|
+
(0, import_store12.__dispatch)(slice.actions.addStyles(styles));
|
|
886
901
|
}
|
|
887
902
|
function extractStyles(element) {
|
|
888
903
|
return [...Object.values(element.styles ?? {}), ...(element.elements ?? []).flatMap(extractStyles)];
|
|
889
904
|
}
|
|
890
905
|
|
|
891
906
|
// src/store/remove-component-styles.ts
|
|
892
|
-
var
|
|
907
|
+
var import_store14 = require("@elementor/store");
|
|
893
908
|
function removeComponentStyles(id) {
|
|
894
909
|
apiClient.invalidateComponentConfigCache(id);
|
|
895
|
-
(0,
|
|
910
|
+
(0, import_store14.__dispatch)(slice.actions.removeStyles({ id }));
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
// src/utils/before-save.ts
|
|
914
|
+
var import_editor_elements5 = require("@elementor/editor-elements");
|
|
915
|
+
var import_store16 = require("@elementor/store");
|
|
916
|
+
var beforeSave = async ({ container, status }) => {
|
|
917
|
+
const unpublishedComponents = selectUnpublishedComponents((0, import_store16.__getState)());
|
|
918
|
+
if (!unpublishedComponents.length) {
|
|
919
|
+
return;
|
|
920
|
+
}
|
|
921
|
+
try {
|
|
922
|
+
const tempIdToComponentId = await createComponents(unpublishedComponents, status);
|
|
923
|
+
const elements = container.model.get("elements").toJSON();
|
|
924
|
+
updateComponentInstances(elements, tempIdToComponentId);
|
|
925
|
+
(0, import_store16.__dispatch)(
|
|
926
|
+
slice.actions.add(
|
|
927
|
+
unpublishedComponents.map((component) => ({
|
|
928
|
+
id: tempIdToComponentId.get(component.id),
|
|
929
|
+
name: component.name
|
|
930
|
+
}))
|
|
931
|
+
)
|
|
932
|
+
);
|
|
933
|
+
(0, import_store16.__dispatch)(slice.actions.resetUnpublished());
|
|
934
|
+
} catch (error) {
|
|
935
|
+
throw new Error(`Failed to publish components and update component instances: ${error}`);
|
|
936
|
+
}
|
|
937
|
+
};
|
|
938
|
+
async function createComponents(components, status) {
|
|
939
|
+
const tempIdToComponentId = /* @__PURE__ */ new Map();
|
|
940
|
+
const promises = components.map((component) => {
|
|
941
|
+
return apiClient.create({ name: component.name, content: component.content, status }).then((response) => {
|
|
942
|
+
tempIdToComponentId.set(component.id, response.component_id);
|
|
943
|
+
});
|
|
944
|
+
});
|
|
945
|
+
await Promise.all(promises);
|
|
946
|
+
return tempIdToComponentId;
|
|
947
|
+
}
|
|
948
|
+
function updateComponentInstances(elements, tempIdToComponentId) {
|
|
949
|
+
elements.forEach((element) => {
|
|
950
|
+
const { shouldUpdate, newComponentId } = shouldUpdateElement(element, tempIdToComponentId);
|
|
951
|
+
if (shouldUpdate) {
|
|
952
|
+
updateElementComponentId(element.id, newComponentId);
|
|
953
|
+
}
|
|
954
|
+
if (element.elements) {
|
|
955
|
+
updateComponentInstances(element.elements, tempIdToComponentId);
|
|
956
|
+
}
|
|
957
|
+
});
|
|
958
|
+
}
|
|
959
|
+
function shouldUpdateElement(element, tempIdToComponentId) {
|
|
960
|
+
if (element.widgetType === "e-component") {
|
|
961
|
+
const currentComponentId = element.settings?.component?.value;
|
|
962
|
+
if (currentComponentId && tempIdToComponentId.has(currentComponentId)) {
|
|
963
|
+
return { shouldUpdate: true, newComponentId: tempIdToComponentId.get(currentComponentId) };
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
return { shouldUpdate: false, newComponentId: null };
|
|
967
|
+
}
|
|
968
|
+
function updateElementComponentId(elementId, componentId) {
|
|
969
|
+
(0, import_editor_elements5.updateElementSettings)({
|
|
970
|
+
id: elementId,
|
|
971
|
+
props: {
|
|
972
|
+
component: {
|
|
973
|
+
$$type: "component-id",
|
|
974
|
+
value: componentId
|
|
975
|
+
}
|
|
976
|
+
},
|
|
977
|
+
withHistory: false
|
|
978
|
+
});
|
|
896
979
|
}
|
|
897
980
|
|
|
898
981
|
// src/init.ts
|
|
899
982
|
var COMPONENT_DOCUMENT_TYPE = "elementor_component";
|
|
900
983
|
function init() {
|
|
901
984
|
import_editor_styles_repository2.stylesRepository.register(componentsStylesProvider);
|
|
902
|
-
(0,
|
|
985
|
+
(0, import_store18.__registerSlice)(slice);
|
|
903
986
|
(0, import_editor_canvas4.registerElementType)(TYPE, createComponentType);
|
|
904
987
|
(0, import_editor_v1_adapters3.registerDataHook)("dependency", "editor/documents/close", (args) => {
|
|
905
988
|
const document = (0, import_editor_documents.getV1CurrentDocument)();
|
|
@@ -908,6 +991,7 @@ function init() {
|
|
|
908
991
|
}
|
|
909
992
|
return true;
|
|
910
993
|
});
|
|
994
|
+
window.elementorCommon.__beforeSave = beforeSave;
|
|
911
995
|
(0, import_editor_elements_panel.injectTab)({
|
|
912
996
|
id: "components",
|
|
913
997
|
label: (0, import_i18n6.__)("Components", "elementor"),
|