@elementor/editor-components 3.33.0-215 → 3.33.0-216
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 +73 -24
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +77 -25
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -15
- package/src/api.ts +31 -0
- package/src/components/in-edit-mode.tsx +43 -0
- package/src/create-component-type.ts +39 -23
- package/src/init.ts +9 -2
package/dist/index.mjs
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
// src/init.ts
|
|
2
2
|
import { injectIntoLogic, injectIntoTop } from "@elementor/editor";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
registerElementType,
|
|
5
|
+
settingsTransformersRegistry
|
|
6
|
+
} from "@elementor/editor-canvas";
|
|
4
7
|
import { getV1CurrentDocument } from "@elementor/editor-documents";
|
|
5
8
|
import { injectTab } from "@elementor/editor-elements-panel";
|
|
6
9
|
import { stylesRepository } from "@elementor/editor-styles-repository";
|
|
7
10
|
import { __privateListenTo as listenTo, commandStartEvent, registerDataHook } from "@elementor/editor-v1-adapters";
|
|
8
11
|
import { __registerSlice as registerSlice } from "@elementor/store";
|
|
9
|
-
import { __ as
|
|
12
|
+
import { __ as __7 } from "@wordpress/i18n";
|
|
10
13
|
|
|
11
14
|
// src/component-id-transformer.ts
|
|
12
15
|
import { createTransformer } from "@elementor/editor-canvas";
|
|
@@ -25,6 +28,9 @@ import { __createAsyncThunk as createAsyncThunk } from "@elementor/store";
|
|
|
25
28
|
import { ajax } from "@elementor/editor-v1-adapters";
|
|
26
29
|
import { httpService } from "@elementor/http-client";
|
|
27
30
|
var BASE_URL = "elementor/v1/components";
|
|
31
|
+
var LOCK_COMPONENT = `${BASE_URL}/lock`;
|
|
32
|
+
var UNLOCK_COMPONENT = `${BASE_URL}/unlock`;
|
|
33
|
+
var BASE_URL_LOCK_STATUS = `${BASE_URL}/lock-status`;
|
|
28
34
|
var getParams = (id) => ({
|
|
29
35
|
action: "get_document_config",
|
|
30
36
|
unique_id: `document-config-${id}`,
|
|
@@ -34,7 +40,21 @@ var apiClient = {
|
|
|
34
40
|
get: () => httpService().get(`${BASE_URL}`).then((res) => res.data.data),
|
|
35
41
|
create: (payload) => httpService().post(`${BASE_URL}`, payload).then((res) => res.data.data),
|
|
36
42
|
getComponentConfig: (id) => ajax.load(getParams(id)),
|
|
37
|
-
invalidateComponentConfigCache: (id) => ajax.invalidateCache(getParams(id))
|
|
43
|
+
invalidateComponentConfigCache: (id) => ajax.invalidateCache(getParams(id)),
|
|
44
|
+
getComponentLockStatus: async (componentId) => await httpService().get(`${BASE_URL_LOCK_STATUS}`, {
|
|
45
|
+
params: {
|
|
46
|
+
componentId
|
|
47
|
+
}
|
|
48
|
+
}).then((res) => {
|
|
49
|
+
const { is_current_user_allow_to_edit: isAllowedToSwitchDocument, locked_by: lockedBy } = res.data.data;
|
|
50
|
+
return { isAllowedToSwitchDocument, lockedBy: lockedBy || "" };
|
|
51
|
+
}),
|
|
52
|
+
lockComponent: async (componentId) => await httpService().post(LOCK_COMPONENT, {
|
|
53
|
+
componentId
|
|
54
|
+
}).then((res) => res.data),
|
|
55
|
+
unlockComponent: async (componentId) => await httpService().post(UNLOCK_COMPONENT, {
|
|
56
|
+
componentId
|
|
57
|
+
}).then((res) => res.data)
|
|
38
58
|
};
|
|
39
59
|
|
|
40
60
|
// src/store/thunks.ts
|
|
@@ -687,12 +707,31 @@ var generateTempId = () => {
|
|
|
687
707
|
return Date.now() + Math.floor(Math.random() * 1e6);
|
|
688
708
|
};
|
|
689
709
|
|
|
710
|
+
// src/components/in-edit-mode.tsx
|
|
711
|
+
import * as React8 from "react";
|
|
712
|
+
import { closeDialog, openDialog } from "@elementor/editor-ui";
|
|
713
|
+
import { InfoCircleFilledIcon } from "@elementor/icons";
|
|
714
|
+
import { Box as Box5, Button as Button2, DialogActions, DialogContent, DialogHeader, Icon as Icon2, Stack as Stack5, Typography as Typography4 } from "@elementor/ui";
|
|
715
|
+
import { __ as __5 } from "@wordpress/i18n";
|
|
716
|
+
var openEditModeDialog = (lockedBy) => {
|
|
717
|
+
openDialog({
|
|
718
|
+
component: /* @__PURE__ */ React8.createElement(EditModeDialog, { lockedBy })
|
|
719
|
+
});
|
|
720
|
+
};
|
|
721
|
+
var EditModeDialog = ({ lockedBy }) => {
|
|
722
|
+
const content = __5("%s is currently editing this document", "elementor").replace("%s", lockedBy);
|
|
723
|
+
return /* @__PURE__ */ React8.createElement(React8.Fragment, null, /* @__PURE__ */ React8.createElement(DialogHeader, { logo: false }, /* @__PURE__ */ React8.createElement(Box5, { display: "flex", alignItems: "center", gap: 1 }, /* @__PURE__ */ React8.createElement(Icon2, { color: "secondary" }, /* @__PURE__ */ React8.createElement(InfoCircleFilledIcon, { fontSize: "medium" })), /* @__PURE__ */ React8.createElement(Typography4, { variant: "subtitle1" }, content))), /* @__PURE__ */ React8.createElement(DialogContent, null, /* @__PURE__ */ React8.createElement(Stack5, { spacing: 2, direction: "column" }, /* @__PURE__ */ React8.createElement(Typography4, { variant: "body2" }, __5(
|
|
724
|
+
"You can wait for them to finish or reach out to coordinate your changes together.",
|
|
725
|
+
"elementor"
|
|
726
|
+
)), /* @__PURE__ */ React8.createElement(DialogActions, null, /* @__PURE__ */ React8.createElement(Button2, { color: "secondary", variant: "contained", onClick: closeDialog }, __5("Close", "elementor"))))));
|
|
727
|
+
};
|
|
728
|
+
|
|
690
729
|
// src/create-component-type.ts
|
|
691
730
|
import {
|
|
692
731
|
createTemplatedElementView
|
|
693
732
|
} from "@elementor/editor-canvas";
|
|
694
733
|
import { __privateRunCommand as runCommand } from "@elementor/editor-v1-adapters";
|
|
695
|
-
import { __ as
|
|
734
|
+
import { __ as __6 } from "@wordpress/i18n";
|
|
696
735
|
var TYPE = "e-component";
|
|
697
736
|
function createComponentType(options) {
|
|
698
737
|
const legacyWindow = window;
|
|
@@ -732,26 +771,36 @@ function createComponentView(options) {
|
|
|
732
771
|
if (!componentId) {
|
|
733
772
|
return filteredGroups;
|
|
734
773
|
}
|
|
735
|
-
const newGroup =
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
774
|
+
const newGroup = [
|
|
775
|
+
{
|
|
776
|
+
name: "edit component",
|
|
777
|
+
actions: [
|
|
778
|
+
{
|
|
779
|
+
name: "edit component",
|
|
780
|
+
icon: "eicon-edit",
|
|
781
|
+
title: () => __6("Edit Component", "elementor"),
|
|
782
|
+
isEnabled: () => true,
|
|
783
|
+
callback: () => this.switchDocument()
|
|
784
|
+
}
|
|
785
|
+
]
|
|
786
|
+
}
|
|
787
|
+
];
|
|
788
|
+
return [...filteredGroups, ...newGroup];
|
|
748
789
|
}
|
|
749
|
-
switchDocument() {
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
790
|
+
async switchDocument() {
|
|
791
|
+
const { isAllowedToSwitchDocument, lockedBy } = await apiClient.getComponentLockStatus(
|
|
792
|
+
this.getComponentId()?.value
|
|
793
|
+
);
|
|
794
|
+
if (!isAllowedToSwitchDocument) {
|
|
795
|
+
options.showLockedByModal?.(lockedBy || "");
|
|
796
|
+
} else {
|
|
797
|
+
runCommand("editor/documents/switch", {
|
|
798
|
+
id: this.getComponentId()?.value,
|
|
799
|
+
mode: "autosave",
|
|
800
|
+
selector: `[data-id="${this.model.get("id")}"]`
|
|
801
|
+
});
|
|
802
|
+
apiClient.lockComponent(this.getComponentId()?.value);
|
|
803
|
+
}
|
|
755
804
|
}
|
|
756
805
|
ui() {
|
|
757
806
|
return {
|
|
@@ -937,7 +986,10 @@ var COMPONENT_DOCUMENT_TYPE = "elementor_component";
|
|
|
937
986
|
function init() {
|
|
938
987
|
stylesRepository.register(componentsStylesProvider);
|
|
939
988
|
registerSlice(slice);
|
|
940
|
-
registerElementType(
|
|
989
|
+
registerElementType(
|
|
990
|
+
TYPE,
|
|
991
|
+
(options) => createComponentType({ ...options, showLockedByModal: openEditModeDialog })
|
|
992
|
+
);
|
|
941
993
|
registerDataHook("dependency", "editor/documents/close", (args) => {
|
|
942
994
|
const document = getV1CurrentDocument();
|
|
943
995
|
if (document.config.type === COMPONENT_DOCUMENT_TYPE) {
|
|
@@ -948,7 +1000,7 @@ function init() {
|
|
|
948
1000
|
window.elementorCommon.__beforeSave = beforeSave;
|
|
949
1001
|
injectTab({
|
|
950
1002
|
id: "components",
|
|
951
|
-
label:
|
|
1003
|
+
label: __7("Components", "elementor"),
|
|
952
1004
|
component: Components
|
|
953
1005
|
});
|
|
954
1006
|
injectIntoTop({
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/init.ts","../src/component-id-transformer.ts","../src/store/store.ts","../src/store/thunks.ts","../src/api.ts","../src/components/components-tab/components.tsx","../src/components/components-tab/component-search.tsx","../src/components/components-tab/search-provider.tsx","../src/components/components-tab/components-list.tsx","../src/hooks/use-components.ts","../src/components/components-tab/components-item.tsx","../src/utils/get-container-for-new-element.ts","../src/components/create-component-form/utils/replace-element-with-component.ts","../src/components/components-tab/loading-components.tsx","../src/components/create-component-form/create-component-form.tsx","../src/components/create-component-form/hooks/use-form.ts","../src/components/create-component-form/utils/component-form-schema.ts","../src/create-component-type.ts","../src/populate-store.ts","../src/store/components-styles-provider.ts","../src/store/load-components-styles.ts","../src/utils/get-component-ids.ts","../src/store/remove-component-styles.ts","../src/utils/before-save.ts"],"sourcesContent":["import { injectIntoLogic, injectIntoTop } from '@elementor/editor';\nimport { registerElementType, settingsTransformersRegistry } from '@elementor/editor-canvas';\nimport { getV1CurrentDocument } from '@elementor/editor-documents';\nimport { injectTab } from '@elementor/editor-elements-panel';\nimport { stylesRepository } from '@elementor/editor-styles-repository';\nimport { __privateListenTo as listenTo, commandStartEvent, registerDataHook } from '@elementor/editor-v1-adapters';\nimport { __registerSlice as registerSlice } from '@elementor/store';\nimport { __ } from '@wordpress/i18n';\n\nimport { componentIdTransformer } from './component-id-transformer';\nimport { Components } from './components/components-tab/components';\nimport { CreateComponentForm } from './components/create-component-form/create-component-form';\nimport { createComponentType, TYPE } from './create-component-type';\nimport { PopulateStore } from './populate-store';\nimport { componentsStylesProvider } from './store/components-styles-provider';\nimport { loadComponentsStyles } from './store/load-components-styles';\nimport { removeComponentStyles } from './store/remove-component-styles';\nimport { slice } from './store/store';\nimport { type Element, type ExtendedWindow } from './types';\nimport { beforeSave } from './utils/before-save';\n\nconst COMPONENT_DOCUMENT_TYPE = 'elementor_component';\n\nexport function init() {\n\tstylesRepository.register( componentsStylesProvider );\n\tregisterSlice( slice );\n\tregisterElementType( TYPE, createComponentType );\n\tregisterDataHook( 'dependency', 'editor/documents/close', ( args ) => {\n\t\tconst document = getV1CurrentDocument();\n\t\tif ( document.config.type === COMPONENT_DOCUMENT_TYPE ) {\n\t\t\targs.mode = 'autosave';\n\t\t}\n\t\treturn true;\n\t} );\n\n\t( window as unknown as ExtendedWindow ).elementorCommon.__beforeSave = beforeSave;\n\n\tinjectTab( {\n\t\tid: 'components',\n\t\tlabel: __( 'Components', 'elementor' ),\n\t\tcomponent: Components,\n\t} );\n\n\tinjectIntoTop( {\n\t\tid: 'create-component-popup',\n\t\tcomponent: CreateComponentForm,\n\t} );\n\n\tinjectIntoLogic( {\n\t\tid: 'components-populate-store',\n\t\tcomponent: PopulateStore,\n\t} );\n\n\tlistenTo( commandStartEvent( 'editor/documents/attach-preview' ), () => {\n\t\tconst { id, config } = getV1CurrentDocument();\n\n\t\tif ( id ) {\n\t\t\tremoveComponentStyles( id );\n\t\t}\n\n\t\tloadComponentsStyles( ( config?.elements as Element[] ) ?? [] );\n\t} );\n\n\tsettingsTransformersRegistry.register( 'component-id', componentIdTransformer );\n}\n","import { createTransformer } from '@elementor/editor-canvas';\nimport { __getState as getState } from '@elementor/store';\n\nimport { selectUnpublishedComponents } from './store/store';\n\ntype ComponentIdTransformerWindow = Window & {\n\telementor?: {\n\t\tdocuments?: {\n\t\t\trequest: ( id: number ) => Promise< { elements?: unknown[] } >;\n\t\t};\n\t};\n};\n\nexport const componentIdTransformer = createTransformer( async ( id: number ) => {\n\tconst unpublishedComponents = selectUnpublishedComponents( getState() );\n\n\tconst unpublishedComponent = unpublishedComponents.find( ( component ) => component.id === id );\n\tif ( unpublishedComponent ) {\n\t\treturn structuredClone( unpublishedComponent.elements );\n\t}\n\n\tconst extendedWindow = window as unknown as ComponentIdTransformerWindow;\n\n\tconst documentManager = extendedWindow.elementor?.documents;\n\n\tif ( ! documentManager ) {\n\t\tthrow new Error( 'Elementor documents manager not found' );\n\t}\n\n\tconst data = await documentManager.request( id );\n\n\treturn data.elements ?? [];\n} );\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport {\n\t__createSelector as createSelector,\n\t__createSlice as createSlice,\n\ttype PayloadAction,\n\ttype SliceState,\n} from '@elementor/store';\n\nimport { type Component, type ComponentId, type StylesDefinition } from '../types';\nimport { loadComponents } from './thunks';\n\ntype GetComponentResponse = Component[];\n\nexport type UnpublishedComponent = Component & {\n\telements: V1ElementData[];\n};\n\ntype Status = 'idle' | 'pending' | 'error';\n\ntype ComponentsState = {\n\tdata: Component[];\n\tunpublishedData: UnpublishedComponent[];\n\tloadStatus: Status;\n\tstyles: StylesDefinition;\n};\n\ntype ComponentsSlice = SliceState< typeof slice >;\n\nexport const initialState: ComponentsState = {\n\tdata: [],\n\tunpublishedData: [],\n\tloadStatus: 'idle',\n\tstyles: {},\n};\n\nexport const SLICE_NAME = 'components';\nexport const slice = createSlice( {\n\tname: SLICE_NAME,\n\tinitialState,\n\treducers: {\n\t\tadd: ( state, { payload }: PayloadAction< Component | Component[] > ) => {\n\t\t\tif ( Array.isArray( payload ) ) {\n\t\t\t\tstate.data = [ ...state.data, ...payload ];\n\t\t\t} else {\n\t\t\t\tstate.data.unshift( payload );\n\t\t\t}\n\t\t},\n\t\tload: ( state, { payload }: PayloadAction< Component[] > ) => {\n\t\t\tstate.data = payload;\n\t\t},\n\t\taddUnpublished: ( state, { payload } ) => {\n\t\t\tstate.unpublishedData.unshift( payload );\n\t\t},\n\t\tresetUnpublished: ( state ) => {\n\t\t\tstate.unpublishedData = [];\n\t\t},\n\t\tremoveStyles( state, { payload }: PayloadAction< { id: ComponentId } > ) {\n\t\t\tconst { [ payload.id ]: _, ...rest } = state.styles;\n\n\t\t\tstate.styles = rest;\n\t\t},\n\t\taddStyles: ( state, { payload } ) => {\n\t\t\tstate.styles = { ...state.styles, ...payload };\n\t\t},\n\t},\n\textraReducers: ( builder ) => {\n\t\tbuilder.addCase( loadComponents.fulfilled, ( state, { payload }: PayloadAction< GetComponentResponse > ) => {\n\t\t\tstate.data = payload;\n\t\t\tstate.loadStatus = 'idle';\n\t\t} );\n\t\tbuilder.addCase( loadComponents.pending, ( state ) => {\n\t\t\tstate.loadStatus = 'pending';\n\t\t} );\n\t\tbuilder.addCase( loadComponents.rejected, ( state ) => {\n\t\t\tstate.loadStatus = 'error';\n\t\t} );\n\t},\n} );\n\nconst selectData = ( state: ComponentsSlice ) => state[ SLICE_NAME ].data;\nconst selectLoadStatus = ( state: ComponentsSlice ) => state[ SLICE_NAME ].loadStatus;\nconst selectStylesDefinitions = ( state: ComponentsSlice ) => state[ SLICE_NAME ].styles ?? {};\nconst selectUnpublishedData = ( state: ComponentsSlice ) => state[ SLICE_NAME ].unpublishedData;\n\nexport const selectComponents = createSelector(\n\tselectData,\n\tselectUnpublishedData,\n\t( data: Component[], unpublishedData: UnpublishedComponent[] ) => [\n\t\t...unpublishedData.map( ( item ) => ( { id: item.id, name: item.name } ) ),\n\t\t...data,\n\t]\n);\nexport const selectUnpublishedComponents = createSelector(\n\tselectUnpublishedData,\n\t( unpublishedData: UnpublishedComponent[] ) => unpublishedData\n);\nexport const selectLoadIsPending = createSelector( selectLoadStatus, ( status ) => status === 'pending' );\nexport const selectLoadIsError = createSelector( selectLoadStatus, ( status ) => status === 'error' );\nexport const selectStyles = ( state: ComponentsSlice ) => state[ SLICE_NAME ].styles ?? {};\nexport const selectFlatStyles = createSelector( selectStylesDefinitions, ( data ) => Object.values( data ).flat() );\n","import { __createAsyncThunk as createAsyncThunk } from '@elementor/store';\n\nimport { apiClient } from '../api';\n\nconst loadComponents = createAsyncThunk( 'components/load', async () => {\n\tconst response = await apiClient.get();\n\treturn response;\n} );\n\nexport { loadComponents };\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport { ajax } from '@elementor/editor-v1-adapters';\nimport { type HttpResponse, httpService } from '@elementor/http-client';\n\nimport { type Component, type DocumentStatus } from './types';\n\nconst BASE_URL = 'elementor/v1/components';\n\nexport type CreateComponentPayload = {\n\tstatus: DocumentStatus;\n\titems: Array< {\n\t\ttemp_id: number;\n\t\ttitle: string;\n\t\telements: V1ElementData[];\n\t} >;\n};\n\ntype GetComponentResponse = Array< Component >;\n\nexport type CreateComponentResponse = Record< number, number >;\n\nexport const getParams = ( id: number ) => ( {\n\taction: 'get_document_config',\n\tunique_id: `document-config-${ id }`,\n\tdata: { id },\n} );\n\nexport const apiClient = {\n\tget: () =>\n\t\thttpService()\n\t\t\t.get< HttpResponse< GetComponentResponse > >( `${ BASE_URL }` )\n\t\t\t.then( ( res ) => res.data.data ),\n\tcreate: ( payload: CreateComponentPayload ) =>\n\t\thttpService()\n\t\t\t.post< HttpResponse< CreateComponentResponse > >( `${ BASE_URL }`, payload )\n\t\t\t.then( ( res ) => res.data.data ),\n\tgetComponentConfig: ( id: number ) => ajax.load< { id: number }, V1ElementData >( getParams( id ) ),\n\tinvalidateComponentConfigCache: ( id: number ) => ajax.invalidateCache< { id: number } >( getParams( id ) ),\n};\n","import * as React from 'react';\nimport { ThemeProvider } from '@elementor/editor-ui';\n\nimport { ComponentSearch } from './component-search';\nimport { ComponentsList } from './components-list';\nimport { SearchProvider } from './search-provider';\n\nexport const Components = () => {\n\treturn (\n\t\t<ThemeProvider>\n\t\t\t<SearchProvider localStorageKey=\"elementor-components-search\">\n\t\t\t\t<ComponentSearch />\n\t\t\t\t<ComponentsList />\n\t\t\t</SearchProvider>\n\t\t</ThemeProvider>\n\t);\n};\n","import * as React from 'react';\nimport { SearchIcon } from '@elementor/icons';\nimport { Box, InputAdornment, Stack, TextField } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useSearch } from './search-provider';\n\nexport const ComponentSearch = () => {\n\tconst { inputValue, handleChange } = useSearch();\n\n\treturn (\n\t\t<Stack direction=\"row\" gap={ 0.5 } sx={ { width: '100%', px: 2, py: 1.5 } }>\n\t\t\t<Box sx={ { flexGrow: 1 } }>\n\t\t\t\t<TextField\n\t\t\t\t\trole={ 'search' }\n\t\t\t\t\tfullWidth\n\t\t\t\t\tsize={ 'tiny' }\n\t\t\t\t\tvalue={ inputValue }\n\t\t\t\t\tplaceholder={ __( 'Search', 'elementor' ) }\n\t\t\t\t\tonChange={ ( e: React.ChangeEvent< HTMLInputElement > ) => handleChange( e.target.value ) }\n\t\t\t\t\tInputProps={ {\n\t\t\t\t\t\tstartAdornment: (\n\t\t\t\t\t\t\t<InputAdornment position=\"start\">\n\t\t\t\t\t\t\t\t<SearchIcon fontSize={ 'tiny' } />\n\t\t\t\t\t\t\t</InputAdornment>\n\t\t\t\t\t\t),\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t</Box>\n\t\t</Stack>\n\t);\n};\n","import * as React from 'react';\nimport { createContext, useContext } from 'react';\nimport { useSearchState, type UseSearchStateResult } from '@elementor/utils';\n\ntype SearchContextType = Pick< UseSearchStateResult, 'handleChange' | 'inputValue' > & {\n\tsearchValue: UseSearchStateResult[ 'debouncedValue' ];\n\tclearSearch: () => void;\n};\n\nconst SearchContext = createContext< SearchContextType | undefined >( undefined );\n\nexport const SearchProvider = ( {\n\tchildren,\n\tlocalStorageKey,\n}: {\n\tchildren: React.ReactNode;\n\tlocalStorageKey: string;\n} ) => {\n\tconst { debouncedValue, handleChange, inputValue } = useSearchState( { localStorageKey } );\n\n\tconst clearSearch = () => {\n\t\thandleChange( '' );\n\t};\n\n\treturn (\n\t\t<SearchContext.Provider value={ { handleChange, clearSearch, searchValue: debouncedValue, inputValue } }>\n\t\t\t{ children }\n\t\t</SearchContext.Provider>\n\t);\n};\n\nexport const useSearch = () => {\n\tconst context = useContext( SearchContext );\n\tif ( ! context ) {\n\t\tthrow new Error( 'useSearch must be used within a SearchProvider' );\n\t}\n\treturn context;\n};\n","import * as React from 'react';\nimport { ComponentsIcon, EyeIcon } from '@elementor/icons';\nimport { Box, Divider, Icon, Link, List, Stack, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useComponents } from '../../hooks/use-components';\nimport { ComponentItem } from './components-item';\nimport { LoadingComponents } from './loading-components';\nimport { useSearch } from './search-provider';\n\nexport function ComponentsList() {\n\tconst { components, isLoading, searchValue } = useFilteredComponents();\n\n\tif ( isLoading ) {\n\t\treturn <LoadingComponents />;\n\t}\n\tconst isEmpty = ! components || components.length === 0;\n\tif ( isEmpty ) {\n\t\tif ( searchValue.length > 0 ) {\n\t\t\treturn <EmptySearchResult />;\n\t\t}\n\t\treturn <EmptyState />;\n\t}\n\n\treturn (\n\t\t<List sx={ { display: 'flex', flexDirection: 'column', gap: 1, px: 2 } }>\n\t\t\t{ components.map( ( component ) => (\n\t\t\t\t<ComponentItem key={ component.id } component={ component } />\n\t\t\t) ) }\n\t\t</List>\n\t);\n}\n\nconst EmptyState = () => {\n\treturn (\n\t\t<Stack\n\t\t\talignItems=\"center\"\n\t\t\tjustifyContent=\"center\"\n\t\t\theight=\"100%\"\n\t\t\tsx={ { px: 2.5, pt: 10 } }\n\t\t\tgap={ 1.75 }\n\t\t\toverflow=\"hidden\"\n\t\t>\n\t\t\t<Icon fontSize=\"large\">\n\t\t\t\t<EyeIcon fontSize=\"large\" />\n\t\t\t</Icon>\n\t\t\t<Typography align=\"center\" variant=\"subtitle2\" color=\"text.secondary\" fontWeight=\"bold\">\n\t\t\t\t{ __( 'Text that explains that there are no Components yet.', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Typography variant=\"caption\" align=\"center\" color=\"text.secondary\">\n\t\t\t\t{ __(\n\t\t\t\t\t'Once you have Components, this is where you can manage them—rearrange, duplicate, rename and delete irrelevant classes.',\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\t\t\t<Divider sx={ { width: '100%' } } color=\"text.secondary\" />\n\t\t\t<Typography align=\"left\" variant=\"caption\" color=\"text.secondary\">\n\t\t\t\t{ __( 'To create a component, first design it, then choose one of three options:', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Typography\n\t\t\t\talign=\"left\"\n\t\t\t\tvariant=\"caption\"\n\t\t\t\tcolor=\"text.secondary\"\n\t\t\t\tsx={ { display: 'flex', flexDirection: 'column' } }\n\t\t\t>\n\t\t\t\t<span>{ __( '1. Right-click and select Create Component', 'elementor' ) }</span>\n\t\t\t\t<span>{ __( '2. Use the component icon in the Structure panel', 'elementor' ) }</span>\n\t\t\t\t<span>{ __( '3. Use the component icon in the Edit panel header', 'elementor' ) }</span>\n\t\t\t</Typography>\n\t\t</Stack>\n\t);\n};\n\nconst EmptySearchResult = () => {\n\tconst { searchValue, clearSearch } = useSearch();\n\treturn (\n\t\t<Stack\n\t\t\tcolor={ 'text.secondary' }\n\t\t\tpt={ 5 }\n\t\t\talignItems=\"center\"\n\t\t\tgap={ 1 }\n\t\t\toverflow={ 'hidden' }\n\t\t\tjustifySelf={ 'center' }\n\t\t>\n\t\t\t<ComponentsIcon />\n\t\t\t<Box\n\t\t\t\tsx={ {\n\t\t\t\t\twidth: '100%',\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<Typography align=\"center\" variant=\"subtitle2\" color=\"inherit\">\n\t\t\t\t\t{ __( 'Sorry, nothing matched', 'elementor' ) }\n\t\t\t\t</Typography>\n\t\t\t\t{ searchValue && (\n\t\t\t\t\t<Typography\n\t\t\t\t\t\tvariant=\"subtitle2\"\n\t\t\t\t\t\tcolor=\"inherit\"\n\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>“</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={ {\n\t\t\t\t\t\t\t\tmaxWidth: '80%',\n\t\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\t\ttextOverflow: 'ellipsis',\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ searchValue }\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span>”.</span>\n\t\t\t\t\t</Typography>\n\t\t\t\t) }\n\t\t\t</Box>\n\t\t\t<Typography align=\"center\" variant=\"caption\" color=\"inherit\">\n\t\t\t\t{ __( 'Try something else.', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Typography align=\"center\" variant=\"caption\" color=\"inherit\">\n\t\t\t\t<Link color=\"secondary\" variant=\"caption\" component=\"button\" onClick={ clearSearch }>\n\t\t\t\t\t{ __( 'Clear & try again', 'elementor' ) }\n\t\t\t\t</Link>\n\t\t\t</Typography>\n\t\t</Stack>\n\t);\n};\n\nconst useFilteredComponents = () => {\n\tconst { components, isLoading } = useComponents();\n\tconst { searchValue } = useSearch();\n\n\treturn {\n\t\tcomponents: components.filter( ( component ) =>\n\t\t\tcomponent.name.toLowerCase().includes( searchValue.toLowerCase() )\n\t\t),\n\t\tisLoading,\n\t\tsearchValue,\n\t};\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectComponents, selectLoadIsPending } from '../store/store';\n\nexport const useComponents = () => {\n\tconst components = useSelector( selectComponents );\n\tconst isLoading = useSelector( selectLoadIsPending );\n\n\treturn { components, isLoading };\n};\n","import * as React from 'react';\nimport { endDragElementFromPanel, startDragElementFromPanel } from '@elementor/editor-canvas';\nimport { dropElement, type DropElementParams } from '@elementor/editor-elements';\nimport { ComponentsIcon } from '@elementor/icons';\nimport { Box, ListItemButton, ListItemIcon, ListItemText, Typography } from '@elementor/ui';\n\nimport { type Component } from '../../types';\nimport { getContainerForNewElement } from '../../utils/get-container-for-new-element';\nimport { createComponentModel } from '../create-component-form/utils/replace-element-with-component';\n\nexport const ComponentItem = ( { component }: { component: Component } ) => {\n\tconst componentModel = createComponentModel( { id: component.id, name: component.name } );\n\n\tconst handleClick = () => {\n\t\taddComponentToPage( componentModel );\n\t};\n\n\treturn (\n\t\t<ListItemButton\n\t\t\tdraggable\n\t\t\tonDragStart={ () => startDragElementFromPanel( componentModel ) }\n\t\t\tonDragEnd={ endDragElementFromPanel }\n\t\t\tshape=\"rounded\"\n\t\t\tsx={ { border: 'solid 1px', borderColor: 'divider', py: 0.5, px: 1 } }\n\t\t>\n\t\t\t<Box sx={ { display: 'flex', width: '100%', alignItems: 'center', gap: 1 } } onClick={ handleClick }>\n\t\t\t\t<ListItemIcon size=\"tiny\">\n\t\t\t\t\t<ComponentsIcon fontSize=\"tiny\" />\n\t\t\t\t</ListItemIcon>\n\t\t\t\t<ListItemText\n\t\t\t\t\tprimary={\n\t\t\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'text.primary' } }>\n\t\t\t\t\t\t\t{ component.name }\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</Box>\n\t\t</ListItemButton>\n\t);\n};\n\nconst addComponentToPage = ( model: DropElementParams[ 'model' ] ) => {\n\tconst { container, options } = getContainerForNewElement();\n\n\tif ( ! container ) {\n\t\tthrow new Error( `Can't find container to drop new component instance at` );\n\t}\n\n\tdropElement( {\n\t\tcontainerId: container.id,\n\t\tmodel,\n\t\toptions: { ...options, useHistory: false, scrollIntoView: true },\n\t} );\n};\n","import {\n\tgetContainer,\n\tgetCurrentDocumentContainer,\n\tgetSelectedElements,\n\ttype V1Element,\n} from '@elementor/editor-elements';\n\nexport const getContainerForNewElement = (): { container: V1Element | null; options?: { at: number } } => {\n\tconst currentDocumentContainer = getCurrentDocumentContainer();\n\tconst selectedElement = getSelectedElementContainer();\n\n\tlet container, options;\n\n\tif ( selectedElement ) {\n\t\tswitch ( selectedElement.model.get( 'elType' ) ) {\n\t\t\tcase 'widget': {\n\t\t\t\tcontainer = selectedElement?.parent;\n\n\t\t\t\tconst selectedElIndex = selectedElement.view?._index ?? -1;\n\n\t\t\t\tif ( selectedElIndex > -1 ) {\n\t\t\t\t\toptions = { at: selectedElIndex + 1 };\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'section': {\n\t\t\t\tcontainer = selectedElement?.children?.[ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tcontainer = selectedElement;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { container: container ?? currentDocumentContainer, options };\n};\n\nfunction getSelectedElementContainer() {\n\tconst selectedElements = getSelectedElements();\n\n\tif ( selectedElements.length !== 1 ) {\n\t\treturn undefined;\n\t}\n\n\treturn getContainer( selectedElements[ 0 ].id );\n}\n","import { replaceElement, type V1Element } from '@elementor/editor-elements';\n\nimport { type Component } from '../../../types';\n\nexport const replaceElementWithComponent = ( element: V1Element, component: Component ) => {\n\treplaceElement( {\n\t\tcurrentElement: element,\n\t\tnewElement: createComponentModel( component ),\n\t\twithHistory: false,\n\t} );\n};\n\nexport const createComponentModel = ( component: Component ) => {\n\treturn {\n\t\telType: 'widget',\n\t\twidgetType: 'e-component',\n\t\tsettings: {\n\t\t\tcomponent: {\n\t\t\t\t$$type: 'component-id',\n\t\t\t\tvalue: component.id,\n\t\t\t},\n\t\t},\n\t\teditor_settings: {\n\t\t\ttitle: component.name,\n\t\t},\n\t};\n};\n","import * as React from 'react';\nimport { Box, ListItemButton, Skeleton, Stack } from '@elementor/ui';\nconst ROWS_COUNT = 6;\n\nconst rows = Array.from( { length: ROWS_COUNT }, ( _, index ) => index );\n\nexport const LoadingComponents = () => {\n\treturn (\n\t\t<Stack\n\t\t\taria-label=\"Loading components\"\n\t\t\tgap={ 1 }\n\t\t\tsx={ {\n\t\t\t\tpointerEvents: 'none',\n\t\t\t\tposition: 'relative',\n\t\t\t\tmaxHeight: '300px',\n\t\t\t\toverflow: 'hidden',\n\t\t\t\t'&:after': {\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tcontent: '\"\"',\n\t\t\t\t\tleft: 0,\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\theight: '300px',\n\t\t\t\t\tbackground: 'linear-gradient(to top, white, transparent)',\n\t\t\t\t\tpointerEvents: 'none',\n\t\t\t\t},\n\t\t\t} }\n\t\t>\n\t\t\t{ rows.map( ( row ) => (\n\t\t\t\t<ListItemButton\n\t\t\t\t\tkey={ row }\n\t\t\t\t\tsx={ { border: 'solid 1px', borderColor: 'divider', py: 0.5, px: 1 } }\n\t\t\t\t\tshape=\"rounded\"\n\t\t\t\t>\n\t\t\t\t\t<Box display=\"flex\" gap={ 1 } width=\"100%\">\n\t\t\t\t\t\t<Skeleton variant=\"text\" width={ '24px' } height={ '36px' } />\n\t\t\t\t\t\t<Skeleton variant=\"text\" width={ '100%' } height={ '36px' } />\n\t\t\t\t\t</Box>\n\t\t\t\t</ListItemButton>\n\t\t\t) ) }\n\t\t</Stack>\n\t);\n};\n","import * as React from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { getElementLabel, type V1Element } from '@elementor/editor-elements';\nimport { ThemeProvider } from '@elementor/editor-ui';\nimport { StarIcon } from '@elementor/icons';\nimport { __useDispatch as useDispatch } from '@elementor/store';\nimport { Alert, Button, FormLabel, Grid, Popover, Snackbar, Stack, TextField, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useComponents } from '../../hooks/use-components';\nimport { slice } from '../../store/store';\nimport { type ComponentFormValues } from '../../types';\nimport { useForm } from './hooks/use-form';\nimport { createBaseComponentSchema, createSubmitComponentSchema } from './utils/component-form-schema';\nimport { replaceElementWithComponent } from './utils/replace-element-with-component';\n\ntype SaveAsComponentEventData = {\n\telement: V1Element;\n\tanchorPosition: { top: number; left: number };\n};\n\ntype ResultNotification = {\n\tshow: boolean;\n\tmessage: string;\n\ttype: 'success' | 'error';\n};\n\nexport function CreateComponentForm() {\n\tconst [ element, setElement ] = useState< {\n\t\telement: V1Element;\n\t\telementLabel: string;\n\t} | null >( null );\n\n\tconst [ anchorPosition, setAnchorPosition ] = useState< { top: number; left: number } >();\n\n\tconst [ resultNotification, setResultNotification ] = useState< ResultNotification | null >( null );\n\n\tconst dispatch = useDispatch();\n\n\tuseEffect( () => {\n\t\tconst OPEN_SAVE_AS_COMPONENT_FORM_EVENT = 'elementor/editor/open-save-as-component-form';\n\n\t\tconst openPopup = ( event: CustomEvent< SaveAsComponentEventData > ) => {\n\t\t\tsetElement( { element: event.detail.element, elementLabel: getElementLabel( event.detail.element.id ) } );\n\t\t\tsetAnchorPosition( event.detail.anchorPosition );\n\t\t};\n\n\t\twindow.addEventListener( OPEN_SAVE_AS_COMPONENT_FORM_EVENT, openPopup as EventListener );\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener( OPEN_SAVE_AS_COMPONENT_FORM_EVENT, openPopup as EventListener );\n\t\t};\n\t}, [] );\n\n\tconst handleSave = async ( values: ComponentFormValues ) => {\n\t\ttry {\n\t\t\tif ( ! element ) {\n\t\t\t\tthrow new Error( `Can't save element as component: element not found` );\n\t\t\t}\n\n\t\t\tconst tempId = generateTempId();\n\n\t\t\tdispatch(\n\t\t\t\tslice.actions.addUnpublished( {\n\t\t\t\t\tid: tempId,\n\t\t\t\t\tname: values.componentName,\n\t\t\t\t\telements: [ element.element.model.toJSON( { remove: [ 'default' ] } ) ],\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\treplaceElementWithComponent( element.element, {\n\t\t\t\tid: tempId,\n\t\t\t\tname: values.componentName,\n\t\t\t} );\n\n\t\t\tsetResultNotification( {\n\t\t\t\tshow: true,\n\t\t\t\t// Translators: %1$s: Component name, %2$s: Component temp ID\n\t\t\t\tmessage: __( 'Component saved successfully as: %1$s (temp ID: %2$s)', 'elementor' )\n\t\t\t\t\t.replace( '%1$s', values.componentName )\n\t\t\t\t\t.replace( '%2$s', tempId.toString() ),\n\t\t\t\ttype: 'success',\n\t\t\t} );\n\n\t\t\tresetAndClosePopup();\n\t\t} catch {\n\t\t\tconst errorMessage = __( 'Failed to save component. Please try again.', 'elementor' );\n\t\t\tsetResultNotification( {\n\t\t\t\tshow: true,\n\t\t\t\tmessage: errorMessage,\n\t\t\t\ttype: 'error',\n\t\t\t} );\n\t\t}\n\t};\n\n\tconst resetAndClosePopup = () => {\n\t\tsetElement( null );\n\t\tsetAnchorPosition( undefined );\n\t};\n\n\treturn (\n\t\t<ThemeProvider>\n\t\t\t<Popover\n\t\t\t\topen={ element !== null }\n\t\t\t\tonClose={ resetAndClosePopup }\n\t\t\t\tanchorReference=\"anchorPosition\"\n\t\t\t\tanchorPosition={ anchorPosition }\n\t\t\t>\n\t\t\t\t{ element !== null && (\n\t\t\t\t\t<Form\n\t\t\t\t\t\tinitialValues={ { componentName: element.elementLabel } }\n\t\t\t\t\t\thandleSave={ handleSave }\n\t\t\t\t\t\tclosePopup={ resetAndClosePopup }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t</Popover>\n\t\t\t<Snackbar open={ resultNotification?.show } onClose={ () => setResultNotification( null ) }>\n\t\t\t\t<Alert\n\t\t\t\t\tonClose={ () => setResultNotification( null ) }\n\t\t\t\t\tseverity={ resultNotification?.type }\n\t\t\t\t\tsx={ { width: '100%' } }\n\t\t\t\t>\n\t\t\t\t\t{ resultNotification?.message }\n\t\t\t\t</Alert>\n\t\t\t</Snackbar>\n\t\t</ThemeProvider>\n\t);\n}\n\nconst FONT_SIZE = 'tiny';\n\nconst Form = ( {\n\tinitialValues,\n\thandleSave,\n\tclosePopup,\n}: {\n\tinitialValues: ComponentFormValues;\n\thandleSave: ( values: ComponentFormValues ) => void;\n\tclosePopup: () => void;\n} ) => {\n\tconst { values, errors, isValid, handleChange, validateForm } = useForm< ComponentFormValues >( initialValues );\n\n\tconst { components } = useComponents();\n\n\tconst existingComponentNames = useMemo( () => {\n\t\treturn components?.map( ( component ) => component.name ) ?? [];\n\t}, [ components ] );\n\n\tconst changeValidationSchema = useMemo(\n\t\t() => createBaseComponentSchema( existingComponentNames ),\n\t\t[ existingComponentNames ]\n\t);\n\tconst submitValidationSchema = useMemo(\n\t\t() => createSubmitComponentSchema( existingComponentNames ),\n\t\t[ existingComponentNames ]\n\t);\n\n\tconst handleSubmit = () => {\n\t\tconst { success, parsedValues } = validateForm( submitValidationSchema );\n\n\t\tif ( success ) {\n\t\t\thandleSave( parsedValues );\n\t\t}\n\t};\n\n\treturn (\n\t\t<Stack alignItems=\"start\" width=\"268px\">\n\t\t\t<Stack\n\t\t\t\tdirection=\"row\"\n\t\t\t\talignItems=\"center\"\n\t\t\t\tpy={ 1 }\n\t\t\t\tpx={ 1.5 }\n\t\t\t\tsx={ { columnGap: 0.5, borderBottom: '1px solid', borderColor: 'divider', width: '100%' } }\n\t\t\t>\n\t\t\t\t<StarIcon fontSize={ FONT_SIZE } />\n\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'text.primary', fontWeight: '500', lineHeight: 1 } }>\n\t\t\t\t\t{ __( 'Save as a component', 'elementor' ) }\n\t\t\t\t</Typography>\n\t\t\t</Stack>\n\t\t\t<Grid container gap={ 0.75 } alignItems=\"start\" p={ 1.5 }>\n\t\t\t\t<Grid item xs={ 12 }>\n\t\t\t\t\t<FormLabel htmlFor={ 'component-name' } size=\"tiny\">\n\t\t\t\t\t\t{ __( 'Name', 'elementor' ) }\n\t\t\t\t\t</FormLabel>\n\t\t\t\t</Grid>\n\t\t\t\t<Grid item xs={ 12 }>\n\t\t\t\t\t<TextField\n\t\t\t\t\t\tid={ 'component-name' }\n\t\t\t\t\t\tsize={ FONT_SIZE }\n\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\tvalue={ values.componentName }\n\t\t\t\t\t\tonChange={ ( e: React.ChangeEvent< HTMLInputElement > ) =>\n\t\t\t\t\t\t\thandleChange( e, 'componentName', changeValidationSchema )\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinputProps={ { style: { color: 'text.primary', fontWeight: '600' } } }\n\t\t\t\t\t\terror={ Boolean( errors.componentName ) }\n\t\t\t\t\t\thelperText={ errors.componentName }\n\t\t\t\t\t/>\n\t\t\t\t</Grid>\n\t\t\t</Grid>\n\t\t\t<Stack direction=\"row\" justifyContent=\"flex-end\" alignSelf=\"end\" py={ 1 } px={ 1.5 }>\n\t\t\t\t<Button onClick={ closePopup } color=\"secondary\" variant=\"text\" size=\"small\">\n\t\t\t\t\t{ __( 'Cancel', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\tonClick={ handleSubmit }\n\t\t\t\t\tdisabled={ ! isValid }\n\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t>\n\t\t\t\t\t{ __( 'Create', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t</Stack>\n\t\t</Stack>\n\t);\n};\n\nexport const generateTempId = () => {\n\treturn Date.now() + Math.floor( Math.random() * 1000000 );\n};\n","import { useMemo, useState } from 'react';\nimport { type z } from '@elementor/schema';\n\nexport const useForm = < TValues extends Record< string, unknown > >( initialValues: TValues ) => {\n\tconst [ values, setValues ] = useState< TValues >( initialValues );\n\tconst [ errors, setErrors ] = useState< Partial< Record< keyof TValues, string > > >( {} );\n\n\tconst isValid = useMemo( () => {\n\t\treturn ! Object.values( errors ).some( ( error ) => error );\n\t}, [ errors ] );\n\n\tconst handleChange = (\n\t\te: React.ChangeEvent< HTMLInputElement >,\n\t\tfield: keyof TValues,\n\t\tvalidationSchema: z.ZodType< TValues >\n\t) => {\n\t\tconst updated = { ...values, [ field ]: e.target.value };\n\t\tsetValues( updated );\n\n\t\tconst { success, errors: validationErrors } = validateForm( updated, validationSchema );\n\n\t\tif ( ! success ) {\n\t\t\tsetErrors( validationErrors );\n\t\t} else {\n\t\t\tsetErrors( {} );\n\t\t}\n\t};\n\n\tconst validate = (\n\t\tvalidationSchema: z.ZodType< TValues >\n\t): { success: true; parsedValues: TValues } | { success: false; parsedValues?: never } => {\n\t\tconst { success, errors: validationErrors, parsedValues } = validateForm( values, validationSchema );\n\n\t\tif ( ! success ) {\n\t\t\tsetErrors( validationErrors );\n\t\t\treturn { success };\n\t\t}\n\t\tsetErrors( {} );\n\t\treturn { success, parsedValues };\n\t};\n\n\treturn {\n\t\tvalues,\n\t\terrors,\n\t\tisValid,\n\t\thandleChange,\n\t\tvalidateForm: validate,\n\t};\n};\n\nconst validateForm = < TValues extends Record< string, unknown > >(\n\tvalues: TValues,\n\tschema: z.ZodType< TValues >\n):\n\t| { success: false; parsedValues?: never; errors: Partial< Record< keyof TValues, string > > }\n\t| { success: true; parsedValues: TValues; errors?: never } => {\n\tconst result = schema.safeParse( values );\n\n\tif ( result.success ) {\n\t\treturn { success: true, parsedValues: result.data };\n\t}\n\n\tconst errors = {} as Partial< Record< keyof TValues, string > >;\n\n\t( Object.entries( result.error.formErrors.fieldErrors ) as Array< [ keyof TValues, string[] ] > ).forEach(\n\t\t( [ field, error ] ) => {\n\t\t\terrors[ field ] = error[ 0 ];\n\t\t}\n\t);\n\n\treturn { success: false, errors };\n};\n","import { z } from '@elementor/schema';\nimport { __ } from '@wordpress/i18n';\n\nconst MIN_NAME_LENGTH = 2;\nconst MAX_NAME_LENGTH = 50;\n\nexport const createBaseComponentSchema = ( existingNames: string[] ) => {\n\treturn z.object( {\n\t\tcomponentName: z\n\t\t\t.string()\n\t\t\t.trim()\n\t\t\t.max(\n\t\t\t\tMAX_NAME_LENGTH,\n\t\t\t\t__( 'Component name is too long. Please keep it under 50 characters.', 'elementor' )\n\t\t\t)\n\t\t\t.refine( ( value ) => ! existingNames.includes( value ), {\n\t\t\t\tmessage: __( 'Component name already exists', 'elementor' ),\n\t\t\t} ),\n\t} );\n};\n\nexport const createSubmitComponentSchema = ( existingNames: string[] ) => {\n\tconst baseSchema = createBaseComponentSchema( existingNames );\n\n\treturn baseSchema.extend( {\n\t\tcomponentName: baseSchema.shape.componentName\n\t\t\t.refine( ( value ) => value.length > 0, {\n\t\t\t\tmessage: __( 'Component name is required.', 'elementor' ),\n\t\t\t} )\n\t\t\t.refine( ( value ) => value.length >= MIN_NAME_LENGTH, {\n\t\t\t\tmessage: __( 'Component name is too short. Please enter at least 2 characters.', 'elementor' ),\n\t\t\t} ),\n\t} );\n};\n","import {\n\ttype CreateTemplatedElementTypeOptions,\n\tcreateTemplatedElementView,\n\ttype ElementType,\n\ttype ElementView,\n\ttype LegacyWindow,\n} from '@elementor/editor-canvas';\nimport { type NumberPropValue } from '@elementor/editor-props';\nimport { __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\nimport { __ } from '@wordpress/i18n';\n\nexport const TYPE = 'e-component';\n\nexport function createComponentType( options: CreateTemplatedElementTypeOptions ): typeof ElementType {\n\tconst legacyWindow = window as unknown as LegacyWindow;\n\n\treturn class extends legacyWindow.elementor.modules.elements.types.Widget {\n\t\tgetType() {\n\t\t\treturn options.type;\n\t\t}\n\n\t\tgetView() {\n\t\t\treturn createComponentView( options );\n\t\t}\n\t};\n}\n\nfunction createComponentView( options: CreateTemplatedElementTypeOptions ): typeof ElementView {\n\treturn class extends createTemplatedElementView( options ) {\n\t\tlegacyWindow = window as unknown as LegacyWindow;\n\n\t\tafterSettingsResolve( settings: { [ key: string ]: unknown } ) {\n\t\t\tif ( settings.component ) {\n\t\t\t\tthis.collection = this.legacyWindow.elementor.createBackboneElementsCollection( settings.component );\n\n\t\t\t\tsettings.component = '<template data-children-placeholder></template>';\n\t\t\t}\n\n\t\t\treturn settings;\n\t\t}\n\n\t\tattachBuffer( collectionView: this, buffer: DocumentFragment ): void {\n\t\t\tconst childrenPlaceholder = collectionView.$el.find( '[data-children-placeholder]' ).get( 0 );\n\n\t\t\tif ( ! childrenPlaceholder ) {\n\t\t\t\tsuper.attachBuffer( collectionView, buffer );\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tchildrenPlaceholder.replaceWith( buffer );\n\t\t}\n\n\t\tgetComponentId() {\n\t\t\treturn this.options?.model?.get( 'settings' )?.get( 'component' ) as NumberPropValue;\n\t\t}\n\n\t\tgetContextMenuGroups() {\n\t\t\tconst filteredGroups = super.getContextMenuGroups().filter( ( group ) => group.name !== 'save' );\n\t\t\tconst componentId = this.getComponentId()?.value;\n\n\t\t\tif ( ! componentId ) {\n\t\t\t\treturn filteredGroups;\n\t\t\t}\n\n\t\t\tconst newGroup = {\n\t\t\t\tname: 'edit component',\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'edit component',\n\t\t\t\t\t\ticon: 'eicon-edit',\n\t\t\t\t\t\ttitle: () => __( 'Edit Component', 'elementor' ),\n\t\t\t\t\t\tisEnabled: () => true,\n\t\t\t\t\t\tcallback: () => this.switchDocument(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\treturn [ ...filteredGroups, newGroup ];\n\t\t}\n\n\t\tswitchDocument() {\n\t\t\trunCommand( 'editor/documents/switch', {\n\t\t\t\tid: this.getComponentId().value,\n\t\t\t\tselector: `[data-id=\"${ this.model.get( 'id' ) }\"]`,\n\t\t\t\tmode: 'autosave',\n\t\t\t} );\n\t\t}\n\n\t\tui() {\n\t\t\treturn {\n\t\t\t\t...super.ui(),\n\t\t\t\tdoubleClick: '.e-component:not(:has(.elementor-edit-area))',\n\t\t\t};\n\t\t}\n\n\t\tevents() {\n\t\t\treturn {\n\t\t\t\t...super.events(),\n\t\t\t\t'dblclick @ui.doubleClick': this.switchDocument,\n\t\t\t};\n\t\t}\n\t};\n}\n","import { useEffect } from 'react';\nimport { __dispatch as dispatch } from '@elementor/store';\n\nimport { loadComponents } from './store/thunks';\n\nexport function PopulateStore() {\n\tuseEffect( () => {\n\t\tdispatch( loadComponents() );\n\t}, [] );\n\n\treturn null;\n}\n","import { createStylesProvider } from '@elementor/editor-styles-repository';\nimport { __getState as getState, __subscribeWithSelector as subscribeWithSelector } from '@elementor/store';\n\nimport { selectFlatStyles, SLICE_NAME } from './store';\n\nexport const componentsStylesProvider = createStylesProvider( {\n\tkey: 'components-styles',\n\tpriority: 100,\n\tsubscribe: ( cb ) =>\n\t\tsubscribeWithSelector(\n\t\t\t( state ) => state[ SLICE_NAME ],\n\t\t\t() => {\n\t\t\t\tcb();\n\t\t\t}\n\t\t),\n\tactions: {\n\t\tall: () => {\n\t\t\treturn selectFlatStyles( getState() );\n\t\t},\n\t\tget: ( id ) => {\n\t\t\treturn selectFlatStyles( getState() ).find( ( style ) => style.id === id ) ?? null;\n\t\t},\n\t},\n} );\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport { type StyleDefinition } from '@elementor/editor-styles';\nimport { __dispatch as dispatch, __getState as getState } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { type ComponentId, type Element } from '../types';\nimport { getComponentIds } from '../utils/get-component-ids';\nimport { selectStyles, slice } from './store';\n\nexport async function loadComponentsStyles( elements: Element[] ) {\n\tconst componentIds = Array.from( new Set( getComponentIds( elements ) ) );\n\n\tif ( ! componentIds.length ) {\n\t\treturn;\n\t}\n\n\tconst knownComponents = selectStyles( getState() );\n\tconst unknownComponentIds = componentIds.filter( ( id ) => ! knownComponents[ id ] );\n\n\tif ( ! unknownComponentIds.length ) {\n\t\treturn;\n\t}\n\n\taddComponentStyles( unknownComponentIds );\n}\n\nasync function addComponentStyles( ids: ComponentId[] ) {\n\tconst newComponents = await loadStyles( ids );\n\n\taddStyles( newComponents );\n\n\tObject.values( newComponents ).forEach( ( [ , data ] ) => {\n\t\tloadComponentsStyles( data.elements as Element[] );\n\t} );\n}\n\nasync function loadStyles( ids: number[] ): Promise< [ number, V1ElementData ][] > {\n\treturn Promise.all( ids.map( async ( id ) => [ id, await apiClient.getComponentConfig( id ) ] ) );\n}\n\nfunction addStyles( data: ( readonly [ ComponentId, V1ElementData ] )[] ) {\n\tconst styles = Object.fromEntries(\n\t\tdata.map( ( [ componentId, componentData ] ) => [ componentId, extractStyles( componentData ) ] )\n\t);\n\n\tdispatch( slice.actions.addStyles( styles ) );\n}\n\nfunction extractStyles( element: V1ElementData ): Array< StyleDefinition > {\n\treturn [ ...Object.values( element.styles ?? {} ), ...( element.elements ?? [] ).flatMap( extractStyles ) ];\n}\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport { isTransformable } from '@elementor/editor-props';\n\nexport const getComponentIds = ( elements: V1ElementData[] ) => {\n\treturn elements.flatMap( ( element ) => {\n\t\tconst ids: number[] = [];\n\n\t\tconst type = element.widgetType || element.elType;\n\n\t\tif ( type === 'e-component' && element.settings?.component && isTransformable( element.settings?.component ) ) {\n\t\t\tids.push( element.settings.component.value );\n\t\t}\n\n\t\tif ( element.elements ) {\n\t\t\tids.push( ...getComponentIds( element.elements ) );\n\t\t}\n\n\t\treturn ids;\n\t} );\n};\n","import { __dispatch as dispatch } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { slice } from './store';\n\nexport function removeComponentStyles( id: number ) {\n\tapiClient.invalidateComponentConfigCache( id );\n\tdispatch( slice.actions.removeStyles( { id } ) );\n}\n","import { updateElementSettings, type V1ElementData } from '@elementor/editor-elements';\nimport { type TransformablePropValue } from '@elementor/editor-props';\nimport { __dispatch as dispatch, __getState as getState } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { selectUnpublishedComponents, slice, type UnpublishedComponent } from '../store/store';\nimport { type DocumentStatus } from '../types';\n\ntype Container = {\n\tmodel: {\n\t\tget: ( key: 'elements' ) => {\n\t\t\ttoJSON: () => V1ElementData[];\n\t\t};\n\t};\n};\n\nexport const beforeSave = async ( { container, status }: { container: Container; status: DocumentStatus } ) => {\n\tconst unpublishedComponents = selectUnpublishedComponents( getState() );\n\n\tif ( ! unpublishedComponents.length ) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst tempIdToComponentId = await createComponents( unpublishedComponents, status );\n\n\t\tconst elements = container.model.get( 'elements' ).toJSON();\n\t\tupdateComponentInstances( elements, tempIdToComponentId );\n\n\t\tdispatch(\n\t\t\tslice.actions.add(\n\t\t\t\tunpublishedComponents.map( ( component ) => ( {\n\t\t\t\t\tid: tempIdToComponentId.get( component.id ) as number,\n\t\t\t\t\tname: component.name,\n\t\t\t\t} ) )\n\t\t\t)\n\t\t);\n\t\tdispatch( slice.actions.resetUnpublished() );\n\t} catch ( error ) {\n\t\tthrow new Error( `Failed to publish components and update component instances: ${ error }` );\n\t}\n};\n\nasync function createComponents(\n\tcomponents: UnpublishedComponent[],\n\tstatus: DocumentStatus\n): Promise< Map< number, number > > {\n\tconst response = await apiClient.create( {\n\t\tstatus,\n\t\titems: components.map( ( component ) => ( {\n\t\t\ttemp_id: component.id,\n\t\t\ttitle: component.name,\n\t\t\telements: component.elements,\n\t\t} ) ),\n\t} );\n\n\tconst map = new Map< number, number >();\n\n\tObject.entries( response ).forEach( ( [ key, value ] ) => {\n\t\tmap.set( Number( key ), value );\n\t} );\n\n\treturn map;\n}\n\nfunction updateComponentInstances( elements: V1ElementData[], tempIdToComponentId: Map< number, number > ): void {\n\telements.forEach( ( element ) => {\n\t\tconst { shouldUpdate, newComponentId } = shouldUpdateElement( element, tempIdToComponentId );\n\t\tif ( shouldUpdate ) {\n\t\t\tupdateElementComponentId( element.id, newComponentId );\n\t\t}\n\n\t\tif ( element.elements ) {\n\t\t\tupdateComponentInstances( element.elements, tempIdToComponentId );\n\t\t}\n\t} );\n}\n\nfunction shouldUpdateElement(\n\telement: V1ElementData,\n\ttempIdToComponentId: Map< number, number >\n): { shouldUpdate: true; newComponentId: number } | { shouldUpdate: false; newComponentId: null } {\n\tif ( element.widgetType === 'e-component' ) {\n\t\tconst currentComponentId = ( element.settings?.component as TransformablePropValue< 'component-id', number > )\n\t\t\t?.value;\n\t\tif ( currentComponentId && tempIdToComponentId.has( currentComponentId ) ) {\n\t\t\treturn { shouldUpdate: true, newComponentId: tempIdToComponentId.get( currentComponentId ) as number };\n\t\t}\n\t}\n\treturn { shouldUpdate: false, newComponentId: null };\n}\n\nfunction updateElementComponentId( elementId: string, componentId: number ): void {\n\tupdateElementSettings( {\n\t\tid: elementId,\n\t\tprops: {\n\t\t\tcomponent: {\n\t\t\t\t$$type: 'component-id',\n\t\t\t\tvalue: componentId,\n\t\t\t},\n\t\t},\n\t\twithHistory: false,\n\t} );\n}\n"],"mappings":"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","names":["__","React","React","React","ComponentsIcon","Box","Stack","Typography","__","React","Box","Box","React","Box","ListItemButton","Stack","Stack","Typography","__","ComponentsIcon","Box","React","useMemo","useState","ThemeProvider","Stack","TextField","Typography","__","__","useState","dispatch","__","ThemeProvider","validateForm","useMemo","Stack","Typography","TextField","__","useEffect","useEffect","getState","getState","dispatch","getState","getState","dispatch","dispatch","dispatch","dispatch","getState","getState","dispatch","__"]}
|
|
1
|
+
{"version":3,"sources":["../src/init.ts","../src/component-id-transformer.ts","../src/store/store.ts","../src/store/thunks.ts","../src/api.ts","../src/components/components-tab/components.tsx","../src/components/components-tab/component-search.tsx","../src/components/components-tab/search-provider.tsx","../src/components/components-tab/components-list.tsx","../src/hooks/use-components.ts","../src/components/components-tab/components-item.tsx","../src/utils/get-container-for-new-element.ts","../src/components/create-component-form/utils/replace-element-with-component.ts","../src/components/components-tab/loading-components.tsx","../src/components/create-component-form/create-component-form.tsx","../src/components/create-component-form/hooks/use-form.ts","../src/components/create-component-form/utils/component-form-schema.ts","../src/components/in-edit-mode.tsx","../src/create-component-type.ts","../src/populate-store.ts","../src/store/components-styles-provider.ts","../src/store/load-components-styles.ts","../src/utils/get-component-ids.ts","../src/store/remove-component-styles.ts","../src/utils/before-save.ts"],"sourcesContent":["import { injectIntoLogic, injectIntoTop } from '@elementor/editor';\nimport {\n\ttype CreateTemplatedElementTypeOptions,\n\tregisterElementType,\n\tsettingsTransformersRegistry,\n} from '@elementor/editor-canvas';\nimport { getV1CurrentDocument } from '@elementor/editor-documents';\nimport { injectTab } from '@elementor/editor-elements-panel';\nimport { stylesRepository } from '@elementor/editor-styles-repository';\nimport { __privateListenTo as listenTo, commandStartEvent, registerDataHook } from '@elementor/editor-v1-adapters';\nimport { __registerSlice as registerSlice } from '@elementor/store';\nimport { __ } from '@wordpress/i18n';\n\nimport { componentIdTransformer } from './component-id-transformer';\nimport { Components } from './components/components-tab/components';\nimport { CreateComponentForm } from './components/create-component-form/create-component-form';\nimport { openEditModeDialog } from './components/in-edit-mode';\nimport { createComponentType, TYPE } from './create-component-type';\nimport { PopulateStore } from './populate-store';\nimport { componentsStylesProvider } from './store/components-styles-provider';\nimport { loadComponentsStyles } from './store/load-components-styles';\nimport { removeComponentStyles } from './store/remove-component-styles';\nimport { slice } from './store/store';\nimport { type Element, type ExtendedWindow } from './types';\nimport { beforeSave } from './utils/before-save';\n\nconst COMPONENT_DOCUMENT_TYPE = 'elementor_component';\n\nexport function init() {\n\tstylesRepository.register( componentsStylesProvider );\n\tregisterSlice( slice );\n\tregisterElementType( TYPE, ( options: CreateTemplatedElementTypeOptions ) =>\n\t\tcreateComponentType( { ...options, showLockedByModal: openEditModeDialog } )\n\t);\n\tregisterDataHook( 'dependency', 'editor/documents/close', ( args ) => {\n\t\tconst document = getV1CurrentDocument();\n\t\tif ( document.config.type === COMPONENT_DOCUMENT_TYPE ) {\n\t\t\targs.mode = 'autosave';\n\t\t}\n\t\treturn true;\n\t} );\n\n\t( window as unknown as ExtendedWindow ).elementorCommon.__beforeSave = beforeSave;\n\n\tinjectTab( {\n\t\tid: 'components',\n\t\tlabel: __( 'Components', 'elementor' ),\n\t\tcomponent: Components,\n\t} );\n\n\tinjectIntoTop( {\n\t\tid: 'create-component-popup',\n\t\tcomponent: CreateComponentForm,\n\t} );\n\n\tinjectIntoLogic( {\n\t\tid: 'components-populate-store',\n\t\tcomponent: PopulateStore,\n\t} );\n\n\tlistenTo( commandStartEvent( 'editor/documents/attach-preview' ), () => {\n\t\tconst { id, config } = getV1CurrentDocument();\n\n\t\tif ( id ) {\n\t\t\tremoveComponentStyles( id );\n\t\t}\n\n\t\tloadComponentsStyles( ( config?.elements as Element[] ) ?? [] );\n\t} );\n\n\tsettingsTransformersRegistry.register( 'component-id', componentIdTransformer );\n}\n","import { createTransformer } from '@elementor/editor-canvas';\nimport { __getState as getState } from '@elementor/store';\n\nimport { selectUnpublishedComponents } from './store/store';\n\ntype ComponentIdTransformerWindow = Window & {\n\telementor?: {\n\t\tdocuments?: {\n\t\t\trequest: ( id: number ) => Promise< { elements?: unknown[] } >;\n\t\t};\n\t};\n};\n\nexport const componentIdTransformer = createTransformer( async ( id: number ) => {\n\tconst unpublishedComponents = selectUnpublishedComponents( getState() );\n\n\tconst unpublishedComponent = unpublishedComponents.find( ( component ) => component.id === id );\n\tif ( unpublishedComponent ) {\n\t\treturn structuredClone( unpublishedComponent.elements );\n\t}\n\n\tconst extendedWindow = window as unknown as ComponentIdTransformerWindow;\n\n\tconst documentManager = extendedWindow.elementor?.documents;\n\n\tif ( ! documentManager ) {\n\t\tthrow new Error( 'Elementor documents manager not found' );\n\t}\n\n\tconst data = await documentManager.request( id );\n\n\treturn data.elements ?? [];\n} );\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport {\n\t__createSelector as createSelector,\n\t__createSlice as createSlice,\n\ttype PayloadAction,\n\ttype SliceState,\n} from '@elementor/store';\n\nimport { type Component, type ComponentId, type StylesDefinition } from '../types';\nimport { loadComponents } from './thunks';\n\ntype GetComponentResponse = Component[];\n\nexport type UnpublishedComponent = Component & {\n\telements: V1ElementData[];\n};\n\ntype Status = 'idle' | 'pending' | 'error';\n\ntype ComponentsState = {\n\tdata: Component[];\n\tunpublishedData: UnpublishedComponent[];\n\tloadStatus: Status;\n\tstyles: StylesDefinition;\n};\n\ntype ComponentsSlice = SliceState< typeof slice >;\n\nexport const initialState: ComponentsState = {\n\tdata: [],\n\tunpublishedData: [],\n\tloadStatus: 'idle',\n\tstyles: {},\n};\n\nexport const SLICE_NAME = 'components';\nexport const slice = createSlice( {\n\tname: SLICE_NAME,\n\tinitialState,\n\treducers: {\n\t\tadd: ( state, { payload }: PayloadAction< Component | Component[] > ) => {\n\t\t\tif ( Array.isArray( payload ) ) {\n\t\t\t\tstate.data = [ ...state.data, ...payload ];\n\t\t\t} else {\n\t\t\t\tstate.data.unshift( payload );\n\t\t\t}\n\t\t},\n\t\tload: ( state, { payload }: PayloadAction< Component[] > ) => {\n\t\t\tstate.data = payload;\n\t\t},\n\t\taddUnpublished: ( state, { payload } ) => {\n\t\t\tstate.unpublishedData.unshift( payload );\n\t\t},\n\t\tresetUnpublished: ( state ) => {\n\t\t\tstate.unpublishedData = [];\n\t\t},\n\t\tremoveStyles( state, { payload }: PayloadAction< { id: ComponentId } > ) {\n\t\t\tconst { [ payload.id ]: _, ...rest } = state.styles;\n\n\t\t\tstate.styles = rest;\n\t\t},\n\t\taddStyles: ( state, { payload } ) => {\n\t\t\tstate.styles = { ...state.styles, ...payload };\n\t\t},\n\t},\n\textraReducers: ( builder ) => {\n\t\tbuilder.addCase( loadComponents.fulfilled, ( state, { payload }: PayloadAction< GetComponentResponse > ) => {\n\t\t\tstate.data = payload;\n\t\t\tstate.loadStatus = 'idle';\n\t\t} );\n\t\tbuilder.addCase( loadComponents.pending, ( state ) => {\n\t\t\tstate.loadStatus = 'pending';\n\t\t} );\n\t\tbuilder.addCase( loadComponents.rejected, ( state ) => {\n\t\t\tstate.loadStatus = 'error';\n\t\t} );\n\t},\n} );\n\nconst selectData = ( state: ComponentsSlice ) => state[ SLICE_NAME ].data;\nconst selectLoadStatus = ( state: ComponentsSlice ) => state[ SLICE_NAME ].loadStatus;\nconst selectStylesDefinitions = ( state: ComponentsSlice ) => state[ SLICE_NAME ].styles ?? {};\nconst selectUnpublishedData = ( state: ComponentsSlice ) => state[ SLICE_NAME ].unpublishedData;\n\nexport const selectComponents = createSelector(\n\tselectData,\n\tselectUnpublishedData,\n\t( data: Component[], unpublishedData: UnpublishedComponent[] ) => [\n\t\t...unpublishedData.map( ( item ) => ( { id: item.id, name: item.name } ) ),\n\t\t...data,\n\t]\n);\nexport const selectUnpublishedComponents = createSelector(\n\tselectUnpublishedData,\n\t( unpublishedData: UnpublishedComponent[] ) => unpublishedData\n);\nexport const selectLoadIsPending = createSelector( selectLoadStatus, ( status ) => status === 'pending' );\nexport const selectLoadIsError = createSelector( selectLoadStatus, ( status ) => status === 'error' );\nexport const selectStyles = ( state: ComponentsSlice ) => state[ SLICE_NAME ].styles ?? {};\nexport const selectFlatStyles = createSelector( selectStylesDefinitions, ( data ) => Object.values( data ).flat() );\n","import { __createAsyncThunk as createAsyncThunk } from '@elementor/store';\n\nimport { apiClient } from '../api';\n\nconst loadComponents = createAsyncThunk( 'components/load', async () => {\n\tconst response = await apiClient.get();\n\treturn response;\n} );\n\nexport { loadComponents };\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport { ajax } from '@elementor/editor-v1-adapters';\nimport { type HttpResponse, httpService } from '@elementor/http-client';\n\nimport { type Component, type DocumentStatus } from './types';\n\nconst BASE_URL = 'elementor/v1/components';\nconst LOCK_COMPONENT = `${ BASE_URL }/lock`;\nconst UNLOCK_COMPONENT = `${ BASE_URL }/unlock`;\nconst BASE_URL_LOCK_STATUS = `${ BASE_URL }/lock-status`;\n\nexport type CreateComponentPayload = {\n\tstatus: DocumentStatus;\n\titems: Array< {\n\t\ttemp_id: number;\n\t\ttitle: string;\n\t\telements: V1ElementData[];\n\t} >;\n};\n\ntype ComponentLockStatusResponse = {\n\tis_current_user_allow_to_edit: boolean;\n\tlocked_by: string;\n};\n\ntype GetComponentResponse = Array< Component >;\n\nexport type CreateComponentResponse = Record< number, number >;\n\nexport const getParams = ( id: number ) => ( {\n\taction: 'get_document_config',\n\tunique_id: `document-config-${ id }`,\n\tdata: { id },\n} );\n\nexport const apiClient = {\n\tget: () =>\n\t\thttpService()\n\t\t\t.get< HttpResponse< GetComponentResponse > >( `${ BASE_URL }` )\n\t\t\t.then( ( res ) => res.data.data ),\n\tcreate: ( payload: CreateComponentPayload ) =>\n\t\thttpService()\n\t\t\t.post< HttpResponse< CreateComponentResponse > >( `${ BASE_URL }`, payload )\n\t\t\t.then( ( res ) => res.data.data ),\n\tgetComponentConfig: ( id: number ) => ajax.load< { id: number }, V1ElementData >( getParams( id ) ),\n\tinvalidateComponentConfigCache: ( id: number ) => ajax.invalidateCache< { id: number } >( getParams( id ) ),\n\tgetComponentLockStatus: async ( componentId: number ) =>\n\t\tawait httpService()\n\t\t\t.get< { data: ComponentLockStatusResponse } >( `${ BASE_URL_LOCK_STATUS }`, {\n\t\t\t\tparams: {\n\t\t\t\t\tcomponentId,\n\t\t\t\t},\n\t\t\t} )\n\t\t\t.then( ( res ) => {\n\t\t\t\tconst { is_current_user_allow_to_edit: isAllowedToSwitchDocument, locked_by: lockedBy } = res.data.data;\n\t\t\t\treturn { isAllowedToSwitchDocument, lockedBy: lockedBy || '' };\n\t\t\t} ),\n\tlockComponent: async ( componentId: number ) =>\n\t\tawait httpService()\n\t\t\t.post< { success: boolean } >( LOCK_COMPONENT, {\n\t\t\t\tcomponentId,\n\t\t\t} )\n\t\t\t.then( ( res ) => res.data ),\n\tunlockComponent: async ( componentId: number ) =>\n\t\tawait httpService()\n\t\t\t.post< { success: boolean } >( UNLOCK_COMPONENT, {\n\t\t\t\tcomponentId,\n\t\t\t} )\n\t\t\t.then( ( res ) => res.data ),\n};\n","import * as React from 'react';\nimport { ThemeProvider } from '@elementor/editor-ui';\n\nimport { ComponentSearch } from './component-search';\nimport { ComponentsList } from './components-list';\nimport { SearchProvider } from './search-provider';\n\nexport const Components = () => {\n\treturn (\n\t\t<ThemeProvider>\n\t\t\t<SearchProvider localStorageKey=\"elementor-components-search\">\n\t\t\t\t<ComponentSearch />\n\t\t\t\t<ComponentsList />\n\t\t\t</SearchProvider>\n\t\t</ThemeProvider>\n\t);\n};\n","import * as React from 'react';\nimport { SearchIcon } from '@elementor/icons';\nimport { Box, InputAdornment, Stack, TextField } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useSearch } from './search-provider';\n\nexport const ComponentSearch = () => {\n\tconst { inputValue, handleChange } = useSearch();\n\n\treturn (\n\t\t<Stack direction=\"row\" gap={ 0.5 } sx={ { width: '100%', px: 2, py: 1.5 } }>\n\t\t\t<Box sx={ { flexGrow: 1 } }>\n\t\t\t\t<TextField\n\t\t\t\t\trole={ 'search' }\n\t\t\t\t\tfullWidth\n\t\t\t\t\tsize={ 'tiny' }\n\t\t\t\t\tvalue={ inputValue }\n\t\t\t\t\tplaceholder={ __( 'Search', 'elementor' ) }\n\t\t\t\t\tonChange={ ( e: React.ChangeEvent< HTMLInputElement > ) => handleChange( e.target.value ) }\n\t\t\t\t\tInputProps={ {\n\t\t\t\t\t\tstartAdornment: (\n\t\t\t\t\t\t\t<InputAdornment position=\"start\">\n\t\t\t\t\t\t\t\t<SearchIcon fontSize={ 'tiny' } />\n\t\t\t\t\t\t\t</InputAdornment>\n\t\t\t\t\t\t),\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t</Box>\n\t\t</Stack>\n\t);\n};\n","import * as React from 'react';\nimport { createContext, useContext } from 'react';\nimport { useSearchState, type UseSearchStateResult } from '@elementor/utils';\n\ntype SearchContextType = Pick< UseSearchStateResult, 'handleChange' | 'inputValue' > & {\n\tsearchValue: UseSearchStateResult[ 'debouncedValue' ];\n\tclearSearch: () => void;\n};\n\nconst SearchContext = createContext< SearchContextType | undefined >( undefined );\n\nexport const SearchProvider = ( {\n\tchildren,\n\tlocalStorageKey,\n}: {\n\tchildren: React.ReactNode;\n\tlocalStorageKey: string;\n} ) => {\n\tconst { debouncedValue, handleChange, inputValue } = useSearchState( { localStorageKey } );\n\n\tconst clearSearch = () => {\n\t\thandleChange( '' );\n\t};\n\n\treturn (\n\t\t<SearchContext.Provider value={ { handleChange, clearSearch, searchValue: debouncedValue, inputValue } }>\n\t\t\t{ children }\n\t\t</SearchContext.Provider>\n\t);\n};\n\nexport const useSearch = () => {\n\tconst context = useContext( SearchContext );\n\tif ( ! context ) {\n\t\tthrow new Error( 'useSearch must be used within a SearchProvider' );\n\t}\n\treturn context;\n};\n","import * as React from 'react';\nimport { ComponentsIcon, EyeIcon } from '@elementor/icons';\nimport { Box, Divider, Icon, Link, List, Stack, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useComponents } from '../../hooks/use-components';\nimport { ComponentItem } from './components-item';\nimport { LoadingComponents } from './loading-components';\nimport { useSearch } from './search-provider';\n\nexport function ComponentsList() {\n\tconst { components, isLoading, searchValue } = useFilteredComponents();\n\n\tif ( isLoading ) {\n\t\treturn <LoadingComponents />;\n\t}\n\tconst isEmpty = ! components || components.length === 0;\n\tif ( isEmpty ) {\n\t\tif ( searchValue.length > 0 ) {\n\t\t\treturn <EmptySearchResult />;\n\t\t}\n\t\treturn <EmptyState />;\n\t}\n\n\treturn (\n\t\t<List sx={ { display: 'flex', flexDirection: 'column', gap: 1, px: 2 } }>\n\t\t\t{ components.map( ( component ) => (\n\t\t\t\t<ComponentItem key={ component.id } component={ component } />\n\t\t\t) ) }\n\t\t</List>\n\t);\n}\n\nconst EmptyState = () => {\n\treturn (\n\t\t<Stack\n\t\t\talignItems=\"center\"\n\t\t\tjustifyContent=\"center\"\n\t\t\theight=\"100%\"\n\t\t\tsx={ { px: 2.5, pt: 10 } }\n\t\t\tgap={ 1.75 }\n\t\t\toverflow=\"hidden\"\n\t\t>\n\t\t\t<Icon fontSize=\"large\">\n\t\t\t\t<EyeIcon fontSize=\"large\" />\n\t\t\t</Icon>\n\t\t\t<Typography align=\"center\" variant=\"subtitle2\" color=\"text.secondary\" fontWeight=\"bold\">\n\t\t\t\t{ __( 'Text that explains that there are no Components yet.', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Typography variant=\"caption\" align=\"center\" color=\"text.secondary\">\n\t\t\t\t{ __(\n\t\t\t\t\t'Once you have Components, this is where you can manage them—rearrange, duplicate, rename and delete irrelevant classes.',\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\t\t\t<Divider sx={ { width: '100%' } } color=\"text.secondary\" />\n\t\t\t<Typography align=\"left\" variant=\"caption\" color=\"text.secondary\">\n\t\t\t\t{ __( 'To create a component, first design it, then choose one of three options:', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Typography\n\t\t\t\talign=\"left\"\n\t\t\t\tvariant=\"caption\"\n\t\t\t\tcolor=\"text.secondary\"\n\t\t\t\tsx={ { display: 'flex', flexDirection: 'column' } }\n\t\t\t>\n\t\t\t\t<span>{ __( '1. Right-click and select Create Component', 'elementor' ) }</span>\n\t\t\t\t<span>{ __( '2. Use the component icon in the Structure panel', 'elementor' ) }</span>\n\t\t\t\t<span>{ __( '3. Use the component icon in the Edit panel header', 'elementor' ) }</span>\n\t\t\t</Typography>\n\t\t</Stack>\n\t);\n};\n\nconst EmptySearchResult = () => {\n\tconst { searchValue, clearSearch } = useSearch();\n\treturn (\n\t\t<Stack\n\t\t\tcolor={ 'text.secondary' }\n\t\t\tpt={ 5 }\n\t\t\talignItems=\"center\"\n\t\t\tgap={ 1 }\n\t\t\toverflow={ 'hidden' }\n\t\t\tjustifySelf={ 'center' }\n\t\t>\n\t\t\t<ComponentsIcon />\n\t\t\t<Box\n\t\t\t\tsx={ {\n\t\t\t\t\twidth: '100%',\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<Typography align=\"center\" variant=\"subtitle2\" color=\"inherit\">\n\t\t\t\t\t{ __( 'Sorry, nothing matched', 'elementor' ) }\n\t\t\t\t</Typography>\n\t\t\t\t{ searchValue && (\n\t\t\t\t\t<Typography\n\t\t\t\t\t\tvariant=\"subtitle2\"\n\t\t\t\t\t\tcolor=\"inherit\"\n\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>“</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={ {\n\t\t\t\t\t\t\t\tmaxWidth: '80%',\n\t\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\t\ttextOverflow: 'ellipsis',\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ searchValue }\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span>”.</span>\n\t\t\t\t\t</Typography>\n\t\t\t\t) }\n\t\t\t</Box>\n\t\t\t<Typography align=\"center\" variant=\"caption\" color=\"inherit\">\n\t\t\t\t{ __( 'Try something else.', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Typography align=\"center\" variant=\"caption\" color=\"inherit\">\n\t\t\t\t<Link color=\"secondary\" variant=\"caption\" component=\"button\" onClick={ clearSearch }>\n\t\t\t\t\t{ __( 'Clear & try again', 'elementor' ) }\n\t\t\t\t</Link>\n\t\t\t</Typography>\n\t\t</Stack>\n\t);\n};\n\nconst useFilteredComponents = () => {\n\tconst { components, isLoading } = useComponents();\n\tconst { searchValue } = useSearch();\n\n\treturn {\n\t\tcomponents: components.filter( ( component ) =>\n\t\t\tcomponent.name.toLowerCase().includes( searchValue.toLowerCase() )\n\t\t),\n\t\tisLoading,\n\t\tsearchValue,\n\t};\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectComponents, selectLoadIsPending } from '../store/store';\n\nexport const useComponents = () => {\n\tconst components = useSelector( selectComponents );\n\tconst isLoading = useSelector( selectLoadIsPending );\n\n\treturn { components, isLoading };\n};\n","import * as React from 'react';\nimport { endDragElementFromPanel, startDragElementFromPanel } from '@elementor/editor-canvas';\nimport { dropElement, type DropElementParams } from '@elementor/editor-elements';\nimport { ComponentsIcon } from '@elementor/icons';\nimport { Box, ListItemButton, ListItemIcon, ListItemText, Typography } from '@elementor/ui';\n\nimport { type Component } from '../../types';\nimport { getContainerForNewElement } from '../../utils/get-container-for-new-element';\nimport { createComponentModel } from '../create-component-form/utils/replace-element-with-component';\n\nexport const ComponentItem = ( { component }: { component: Component } ) => {\n\tconst componentModel = createComponentModel( { id: component.id, name: component.name } );\n\n\tconst handleClick = () => {\n\t\taddComponentToPage( componentModel );\n\t};\n\n\treturn (\n\t\t<ListItemButton\n\t\t\tdraggable\n\t\t\tonDragStart={ () => startDragElementFromPanel( componentModel ) }\n\t\t\tonDragEnd={ endDragElementFromPanel }\n\t\t\tshape=\"rounded\"\n\t\t\tsx={ { border: 'solid 1px', borderColor: 'divider', py: 0.5, px: 1 } }\n\t\t>\n\t\t\t<Box sx={ { display: 'flex', width: '100%', alignItems: 'center', gap: 1 } } onClick={ handleClick }>\n\t\t\t\t<ListItemIcon size=\"tiny\">\n\t\t\t\t\t<ComponentsIcon fontSize=\"tiny\" />\n\t\t\t\t</ListItemIcon>\n\t\t\t\t<ListItemText\n\t\t\t\t\tprimary={\n\t\t\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'text.primary' } }>\n\t\t\t\t\t\t\t{ component.name }\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</Box>\n\t\t</ListItemButton>\n\t);\n};\n\nconst addComponentToPage = ( model: DropElementParams[ 'model' ] ) => {\n\tconst { container, options } = getContainerForNewElement();\n\n\tif ( ! container ) {\n\t\tthrow new Error( `Can't find container to drop new component instance at` );\n\t}\n\n\tdropElement( {\n\t\tcontainerId: container.id,\n\t\tmodel,\n\t\toptions: { ...options, useHistory: false, scrollIntoView: true },\n\t} );\n};\n","import {\n\tgetContainer,\n\tgetCurrentDocumentContainer,\n\tgetSelectedElements,\n\ttype V1Element,\n} from '@elementor/editor-elements';\n\nexport const getContainerForNewElement = (): { container: V1Element | null; options?: { at: number } } => {\n\tconst currentDocumentContainer = getCurrentDocumentContainer();\n\tconst selectedElement = getSelectedElementContainer();\n\n\tlet container, options;\n\n\tif ( selectedElement ) {\n\t\tswitch ( selectedElement.model.get( 'elType' ) ) {\n\t\t\tcase 'widget': {\n\t\t\t\tcontainer = selectedElement?.parent;\n\n\t\t\t\tconst selectedElIndex = selectedElement.view?._index ?? -1;\n\n\t\t\t\tif ( selectedElIndex > -1 ) {\n\t\t\t\t\toptions = { at: selectedElIndex + 1 };\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'section': {\n\t\t\t\tcontainer = selectedElement?.children?.[ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tcontainer = selectedElement;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { container: container ?? currentDocumentContainer, options };\n};\n\nfunction getSelectedElementContainer() {\n\tconst selectedElements = getSelectedElements();\n\n\tif ( selectedElements.length !== 1 ) {\n\t\treturn undefined;\n\t}\n\n\treturn getContainer( selectedElements[ 0 ].id );\n}\n","import { replaceElement, type V1Element } from '@elementor/editor-elements';\n\nimport { type Component } from '../../../types';\n\nexport const replaceElementWithComponent = ( element: V1Element, component: Component ) => {\n\treplaceElement( {\n\t\tcurrentElement: element,\n\t\tnewElement: createComponentModel( component ),\n\t\twithHistory: false,\n\t} );\n};\n\nexport const createComponentModel = ( component: Component ) => {\n\treturn {\n\t\telType: 'widget',\n\t\twidgetType: 'e-component',\n\t\tsettings: {\n\t\t\tcomponent: {\n\t\t\t\t$$type: 'component-id',\n\t\t\t\tvalue: component.id,\n\t\t\t},\n\t\t},\n\t\teditor_settings: {\n\t\t\ttitle: component.name,\n\t\t},\n\t};\n};\n","import * as React from 'react';\nimport { Box, ListItemButton, Skeleton, Stack } from '@elementor/ui';\nconst ROWS_COUNT = 6;\n\nconst rows = Array.from( { length: ROWS_COUNT }, ( _, index ) => index );\n\nexport const LoadingComponents = () => {\n\treturn (\n\t\t<Stack\n\t\t\taria-label=\"Loading components\"\n\t\t\tgap={ 1 }\n\t\t\tsx={ {\n\t\t\t\tpointerEvents: 'none',\n\t\t\t\tposition: 'relative',\n\t\t\t\tmaxHeight: '300px',\n\t\t\t\toverflow: 'hidden',\n\t\t\t\t'&:after': {\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tcontent: '\"\"',\n\t\t\t\t\tleft: 0,\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\theight: '300px',\n\t\t\t\t\tbackground: 'linear-gradient(to top, white, transparent)',\n\t\t\t\t\tpointerEvents: 'none',\n\t\t\t\t},\n\t\t\t} }\n\t\t>\n\t\t\t{ rows.map( ( row ) => (\n\t\t\t\t<ListItemButton\n\t\t\t\t\tkey={ row }\n\t\t\t\t\tsx={ { border: 'solid 1px', borderColor: 'divider', py: 0.5, px: 1 } }\n\t\t\t\t\tshape=\"rounded\"\n\t\t\t\t>\n\t\t\t\t\t<Box display=\"flex\" gap={ 1 } width=\"100%\">\n\t\t\t\t\t\t<Skeleton variant=\"text\" width={ '24px' } height={ '36px' } />\n\t\t\t\t\t\t<Skeleton variant=\"text\" width={ '100%' } height={ '36px' } />\n\t\t\t\t\t</Box>\n\t\t\t\t</ListItemButton>\n\t\t\t) ) }\n\t\t</Stack>\n\t);\n};\n","import * as React from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { getElementLabel, type V1Element } from '@elementor/editor-elements';\nimport { ThemeProvider } from '@elementor/editor-ui';\nimport { StarIcon } from '@elementor/icons';\nimport { __useDispatch as useDispatch } from '@elementor/store';\nimport { Alert, Button, FormLabel, Grid, Popover, Snackbar, Stack, TextField, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useComponents } from '../../hooks/use-components';\nimport { slice } from '../../store/store';\nimport { type ComponentFormValues } from '../../types';\nimport { useForm } from './hooks/use-form';\nimport { createBaseComponentSchema, createSubmitComponentSchema } from './utils/component-form-schema';\nimport { replaceElementWithComponent } from './utils/replace-element-with-component';\n\ntype SaveAsComponentEventData = {\n\telement: V1Element;\n\tanchorPosition: { top: number; left: number };\n};\n\ntype ResultNotification = {\n\tshow: boolean;\n\tmessage: string;\n\ttype: 'success' | 'error';\n};\n\nexport function CreateComponentForm() {\n\tconst [ element, setElement ] = useState< {\n\t\telement: V1Element;\n\t\telementLabel: string;\n\t} | null >( null );\n\n\tconst [ anchorPosition, setAnchorPosition ] = useState< { top: number; left: number } >();\n\n\tconst [ resultNotification, setResultNotification ] = useState< ResultNotification | null >( null );\n\n\tconst dispatch = useDispatch();\n\n\tuseEffect( () => {\n\t\tconst OPEN_SAVE_AS_COMPONENT_FORM_EVENT = 'elementor/editor/open-save-as-component-form';\n\n\t\tconst openPopup = ( event: CustomEvent< SaveAsComponentEventData > ) => {\n\t\t\tsetElement( { element: event.detail.element, elementLabel: getElementLabel( event.detail.element.id ) } );\n\t\t\tsetAnchorPosition( event.detail.anchorPosition );\n\t\t};\n\n\t\twindow.addEventListener( OPEN_SAVE_AS_COMPONENT_FORM_EVENT, openPopup as EventListener );\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener( OPEN_SAVE_AS_COMPONENT_FORM_EVENT, openPopup as EventListener );\n\t\t};\n\t}, [] );\n\n\tconst handleSave = async ( values: ComponentFormValues ) => {\n\t\ttry {\n\t\t\tif ( ! element ) {\n\t\t\t\tthrow new Error( `Can't save element as component: element not found` );\n\t\t\t}\n\n\t\t\tconst tempId = generateTempId();\n\n\t\t\tdispatch(\n\t\t\t\tslice.actions.addUnpublished( {\n\t\t\t\t\tid: tempId,\n\t\t\t\t\tname: values.componentName,\n\t\t\t\t\telements: [ element.element.model.toJSON( { remove: [ 'default' ] } ) ],\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\treplaceElementWithComponent( element.element, {\n\t\t\t\tid: tempId,\n\t\t\t\tname: values.componentName,\n\t\t\t} );\n\n\t\t\tsetResultNotification( {\n\t\t\t\tshow: true,\n\t\t\t\t// Translators: %1$s: Component name, %2$s: Component temp ID\n\t\t\t\tmessage: __( 'Component saved successfully as: %1$s (temp ID: %2$s)', 'elementor' )\n\t\t\t\t\t.replace( '%1$s', values.componentName )\n\t\t\t\t\t.replace( '%2$s', tempId.toString() ),\n\t\t\t\ttype: 'success',\n\t\t\t} );\n\n\t\t\tresetAndClosePopup();\n\t\t} catch {\n\t\t\tconst errorMessage = __( 'Failed to save component. Please try again.', 'elementor' );\n\t\t\tsetResultNotification( {\n\t\t\t\tshow: true,\n\t\t\t\tmessage: errorMessage,\n\t\t\t\ttype: 'error',\n\t\t\t} );\n\t\t}\n\t};\n\n\tconst resetAndClosePopup = () => {\n\t\tsetElement( null );\n\t\tsetAnchorPosition( undefined );\n\t};\n\n\treturn (\n\t\t<ThemeProvider>\n\t\t\t<Popover\n\t\t\t\topen={ element !== null }\n\t\t\t\tonClose={ resetAndClosePopup }\n\t\t\t\tanchorReference=\"anchorPosition\"\n\t\t\t\tanchorPosition={ anchorPosition }\n\t\t\t>\n\t\t\t\t{ element !== null && (\n\t\t\t\t\t<Form\n\t\t\t\t\t\tinitialValues={ { componentName: element.elementLabel } }\n\t\t\t\t\t\thandleSave={ handleSave }\n\t\t\t\t\t\tclosePopup={ resetAndClosePopup }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t</Popover>\n\t\t\t<Snackbar open={ resultNotification?.show } onClose={ () => setResultNotification( null ) }>\n\t\t\t\t<Alert\n\t\t\t\t\tonClose={ () => setResultNotification( null ) }\n\t\t\t\t\tseverity={ resultNotification?.type }\n\t\t\t\t\tsx={ { width: '100%' } }\n\t\t\t\t>\n\t\t\t\t\t{ resultNotification?.message }\n\t\t\t\t</Alert>\n\t\t\t</Snackbar>\n\t\t</ThemeProvider>\n\t);\n}\n\nconst FONT_SIZE = 'tiny';\n\nconst Form = ( {\n\tinitialValues,\n\thandleSave,\n\tclosePopup,\n}: {\n\tinitialValues: ComponentFormValues;\n\thandleSave: ( values: ComponentFormValues ) => void;\n\tclosePopup: () => void;\n} ) => {\n\tconst { values, errors, isValid, handleChange, validateForm } = useForm< ComponentFormValues >( initialValues );\n\n\tconst { components } = useComponents();\n\n\tconst existingComponentNames = useMemo( () => {\n\t\treturn components?.map( ( component ) => component.name ) ?? [];\n\t}, [ components ] );\n\n\tconst changeValidationSchema = useMemo(\n\t\t() => createBaseComponentSchema( existingComponentNames ),\n\t\t[ existingComponentNames ]\n\t);\n\tconst submitValidationSchema = useMemo(\n\t\t() => createSubmitComponentSchema( existingComponentNames ),\n\t\t[ existingComponentNames ]\n\t);\n\n\tconst handleSubmit = () => {\n\t\tconst { success, parsedValues } = validateForm( submitValidationSchema );\n\n\t\tif ( success ) {\n\t\t\thandleSave( parsedValues );\n\t\t}\n\t};\n\n\treturn (\n\t\t<Stack alignItems=\"start\" width=\"268px\">\n\t\t\t<Stack\n\t\t\t\tdirection=\"row\"\n\t\t\t\talignItems=\"center\"\n\t\t\t\tpy={ 1 }\n\t\t\t\tpx={ 1.5 }\n\t\t\t\tsx={ { columnGap: 0.5, borderBottom: '1px solid', borderColor: 'divider', width: '100%' } }\n\t\t\t>\n\t\t\t\t<StarIcon fontSize={ FONT_SIZE } />\n\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'text.primary', fontWeight: '500', lineHeight: 1 } }>\n\t\t\t\t\t{ __( 'Save as a component', 'elementor' ) }\n\t\t\t\t</Typography>\n\t\t\t</Stack>\n\t\t\t<Grid container gap={ 0.75 } alignItems=\"start\" p={ 1.5 }>\n\t\t\t\t<Grid item xs={ 12 }>\n\t\t\t\t\t<FormLabel htmlFor={ 'component-name' } size=\"tiny\">\n\t\t\t\t\t\t{ __( 'Name', 'elementor' ) }\n\t\t\t\t\t</FormLabel>\n\t\t\t\t</Grid>\n\t\t\t\t<Grid item xs={ 12 }>\n\t\t\t\t\t<TextField\n\t\t\t\t\t\tid={ 'component-name' }\n\t\t\t\t\t\tsize={ FONT_SIZE }\n\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\tvalue={ values.componentName }\n\t\t\t\t\t\tonChange={ ( e: React.ChangeEvent< HTMLInputElement > ) =>\n\t\t\t\t\t\t\thandleChange( e, 'componentName', changeValidationSchema )\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinputProps={ { style: { color: 'text.primary', fontWeight: '600' } } }\n\t\t\t\t\t\terror={ Boolean( errors.componentName ) }\n\t\t\t\t\t\thelperText={ errors.componentName }\n\t\t\t\t\t/>\n\t\t\t\t</Grid>\n\t\t\t</Grid>\n\t\t\t<Stack direction=\"row\" justifyContent=\"flex-end\" alignSelf=\"end\" py={ 1 } px={ 1.5 }>\n\t\t\t\t<Button onClick={ closePopup } color=\"secondary\" variant=\"text\" size=\"small\">\n\t\t\t\t\t{ __( 'Cancel', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\tonClick={ handleSubmit }\n\t\t\t\t\tdisabled={ ! isValid }\n\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t>\n\t\t\t\t\t{ __( 'Create', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t</Stack>\n\t\t</Stack>\n\t);\n};\n\nexport const generateTempId = () => {\n\treturn Date.now() + Math.floor( Math.random() * 1000000 );\n};\n","import { useMemo, useState } from 'react';\nimport { type z } from '@elementor/schema';\n\nexport const useForm = < TValues extends Record< string, unknown > >( initialValues: TValues ) => {\n\tconst [ values, setValues ] = useState< TValues >( initialValues );\n\tconst [ errors, setErrors ] = useState< Partial< Record< keyof TValues, string > > >( {} );\n\n\tconst isValid = useMemo( () => {\n\t\treturn ! Object.values( errors ).some( ( error ) => error );\n\t}, [ errors ] );\n\n\tconst handleChange = (\n\t\te: React.ChangeEvent< HTMLInputElement >,\n\t\tfield: keyof TValues,\n\t\tvalidationSchema: z.ZodType< TValues >\n\t) => {\n\t\tconst updated = { ...values, [ field ]: e.target.value };\n\t\tsetValues( updated );\n\n\t\tconst { success, errors: validationErrors } = validateForm( updated, validationSchema );\n\n\t\tif ( ! success ) {\n\t\t\tsetErrors( validationErrors );\n\t\t} else {\n\t\t\tsetErrors( {} );\n\t\t}\n\t};\n\n\tconst validate = (\n\t\tvalidationSchema: z.ZodType< TValues >\n\t): { success: true; parsedValues: TValues } | { success: false; parsedValues?: never } => {\n\t\tconst { success, errors: validationErrors, parsedValues } = validateForm( values, validationSchema );\n\n\t\tif ( ! success ) {\n\t\t\tsetErrors( validationErrors );\n\t\t\treturn { success };\n\t\t}\n\t\tsetErrors( {} );\n\t\treturn { success, parsedValues };\n\t};\n\n\treturn {\n\t\tvalues,\n\t\terrors,\n\t\tisValid,\n\t\thandleChange,\n\t\tvalidateForm: validate,\n\t};\n};\n\nconst validateForm = < TValues extends Record< string, unknown > >(\n\tvalues: TValues,\n\tschema: z.ZodType< TValues >\n):\n\t| { success: false; parsedValues?: never; errors: Partial< Record< keyof TValues, string > > }\n\t| { success: true; parsedValues: TValues; errors?: never } => {\n\tconst result = schema.safeParse( values );\n\n\tif ( result.success ) {\n\t\treturn { success: true, parsedValues: result.data };\n\t}\n\n\tconst errors = {} as Partial< Record< keyof TValues, string > >;\n\n\t( Object.entries( result.error.formErrors.fieldErrors ) as Array< [ keyof TValues, string[] ] > ).forEach(\n\t\t( [ field, error ] ) => {\n\t\t\terrors[ field ] = error[ 0 ];\n\t\t}\n\t);\n\n\treturn { success: false, errors };\n};\n","import { z } from '@elementor/schema';\nimport { __ } from '@wordpress/i18n';\n\nconst MIN_NAME_LENGTH = 2;\nconst MAX_NAME_LENGTH = 50;\n\nexport const createBaseComponentSchema = ( existingNames: string[] ) => {\n\treturn z.object( {\n\t\tcomponentName: z\n\t\t\t.string()\n\t\t\t.trim()\n\t\t\t.max(\n\t\t\t\tMAX_NAME_LENGTH,\n\t\t\t\t__( 'Component name is too long. Please keep it under 50 characters.', 'elementor' )\n\t\t\t)\n\t\t\t.refine( ( value ) => ! existingNames.includes( value ), {\n\t\t\t\tmessage: __( 'Component name already exists', 'elementor' ),\n\t\t\t} ),\n\t} );\n};\n\nexport const createSubmitComponentSchema = ( existingNames: string[] ) => {\n\tconst baseSchema = createBaseComponentSchema( existingNames );\n\n\treturn baseSchema.extend( {\n\t\tcomponentName: baseSchema.shape.componentName\n\t\t\t.refine( ( value ) => value.length > 0, {\n\t\t\t\tmessage: __( 'Component name is required.', 'elementor' ),\n\t\t\t} )\n\t\t\t.refine( ( value ) => value.length >= MIN_NAME_LENGTH, {\n\t\t\t\tmessage: __( 'Component name is too short. Please enter at least 2 characters.', 'elementor' ),\n\t\t\t} ),\n\t} );\n};\n","import * as React from 'react';\nimport { closeDialog, openDialog } from '@elementor/editor-ui';\nimport { InfoCircleFilledIcon } from '@elementor/icons';\nimport { Box, Button, DialogActions, DialogContent, DialogHeader, Icon, Stack, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nexport const openEditModeDialog = ( lockedBy: string ) => {\n\topenDialog( {\n\t\tcomponent: <EditModeDialog lockedBy={ lockedBy } />,\n\t} );\n};\n\nconst EditModeDialog = ( { lockedBy }: { lockedBy: string } ) => {\n\t/* translators: %s is the name of the user who is currently editing the document */\n\tconst content = __( '%s is currently editing this document', 'elementor' ).replace( '%s', lockedBy );\n\treturn (\n\t\t<>\n\t\t\t<DialogHeader logo={ false }>\n\t\t\t\t<Box display=\"flex\" alignItems=\"center\" gap={ 1 }>\n\t\t\t\t\t<Icon color=\"secondary\">\n\t\t\t\t\t\t<InfoCircleFilledIcon fontSize=\"medium\" />\n\t\t\t\t\t</Icon>\n\t\t\t\t\t<Typography variant=\"subtitle1\">{ content }</Typography>\n\t\t\t\t</Box>\n\t\t\t</DialogHeader>\n\t\t\t<DialogContent>\n\t\t\t\t<Stack spacing={ 2 } direction=\"column\">\n\t\t\t\t\t<Typography variant=\"body2\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'You can wait for them to finish or reach out to coordinate your changes together.',\n\t\t\t\t\t\t\t'elementor'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<DialogActions>\n\t\t\t\t\t\t<Button color=\"secondary\" variant=\"contained\" onClick={ closeDialog }>\n\t\t\t\t\t\t\t{ __( 'Close', 'elementor' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</DialogActions>\n\t\t\t\t</Stack>\n\t\t\t</DialogContent>\n\t\t</>\n\t);\n};\n","import {\n\ttype CreateTemplatedElementTypeOptions,\n\tcreateTemplatedElementView,\n\ttype ElementType,\n\ttype ElementView,\n\ttype LegacyWindow,\n} from '@elementor/editor-canvas';\nimport { type NumberPropValue } from '@elementor/editor-props';\nimport { __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\nimport { __ } from '@wordpress/i18n';\n\nimport { apiClient } from './api';\n\nexport const TYPE = 'e-component';\n\nexport function createComponentType(\n\toptions: CreateTemplatedElementTypeOptions & { showLockedByModal?: ( lockedBy: string ) => void }\n): typeof ElementType {\n\tconst legacyWindow = window as unknown as LegacyWindow;\n\n\treturn class extends legacyWindow.elementor.modules.elements.types.Widget {\n\t\tgetType() {\n\t\t\treturn options.type;\n\t\t}\n\n\t\tgetView() {\n\t\t\treturn createComponentView( options );\n\t\t}\n\t};\n}\n\nfunction createComponentView(\n\toptions: CreateTemplatedElementTypeOptions & { showLockedByModal?: ( lockedBy: string ) => void }\n): typeof ElementView {\n\treturn class extends createTemplatedElementView( options ) {\n\t\tlegacyWindow = window as unknown as LegacyWindow;\n\n\t\tafterSettingsResolve( settings: { [ key: string ]: unknown } ) {\n\t\t\tif ( settings.component ) {\n\t\t\t\tthis.collection = this.legacyWindow.elementor.createBackboneElementsCollection( settings.component );\n\n\t\t\t\tsettings.component = '<template data-children-placeholder></template>';\n\t\t\t}\n\n\t\t\treturn settings;\n\t\t}\n\n\t\tattachBuffer( collectionView: this, buffer: DocumentFragment ): void {\n\t\t\tconst childrenPlaceholder = collectionView.$el.find( '[data-children-placeholder]' ).get( 0 );\n\n\t\t\tif ( ! childrenPlaceholder ) {\n\t\t\t\tsuper.attachBuffer( collectionView, buffer );\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tchildrenPlaceholder.replaceWith( buffer );\n\t\t}\n\n\t\tgetComponentId() {\n\t\t\treturn this.options?.model?.get( 'settings' )?.get( 'component' ) as NumberPropValue;\n\t\t}\n\n\t\tgetContextMenuGroups() {\n\t\t\tconst filteredGroups = super.getContextMenuGroups().filter( ( group ) => group.name !== 'save' );\n\t\t\tconst componentId = this.getComponentId()?.value as number;\n\t\t\tif ( ! componentId ) {\n\t\t\t\treturn filteredGroups;\n\t\t\t}\n\n\t\t\tconst newGroup = [\n\t\t\t\t{\n\t\t\t\t\tname: 'edit component',\n\t\t\t\t\tactions: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: 'edit component',\n\t\t\t\t\t\t\ticon: 'eicon-edit',\n\t\t\t\t\t\t\ttitle: () => __( 'Edit Component', 'elementor' ),\n\t\t\t\t\t\t\tisEnabled: () => true,\n\t\t\t\t\t\t\tcallback: () => this.switchDocument(),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t];\n\t\t\treturn [ ...filteredGroups, ...newGroup ];\n\t\t}\n\n\t\tasync switchDocument() {\n\t\t\tconst { isAllowedToSwitchDocument, lockedBy } = await apiClient.getComponentLockStatus(\n\t\t\t\tthis.getComponentId()?.value as number\n\t\t\t);\n\n\t\t\tif ( ! isAllowedToSwitchDocument ) {\n\t\t\t\toptions.showLockedByModal?.( lockedBy || '' );\n\t\t\t} else {\n\t\t\t\trunCommand( 'editor/documents/switch', {\n\t\t\t\t\tid: this.getComponentId()?.value as number,\n\t\t\t\t\tmode: 'autosave',\n\t\t\t\t\tselector: `[data-id=\"${ this.model.get( 'id' ) }\"]`,\n\t\t\t\t} );\n\t\t\t\tapiClient.lockComponent( this.getComponentId()?.value as number );\n\t\t\t}\n\t\t}\n\n\t\tui() {\n\t\t\treturn {\n\t\t\t\t...super.ui(),\n\t\t\t\tdoubleClick: '.e-component:not(:has(.elementor-edit-area))',\n\t\t\t};\n\t\t}\n\n\t\tevents() {\n\t\t\treturn {\n\t\t\t\t...super.events(),\n\t\t\t\t'dblclick @ui.doubleClick': this.switchDocument,\n\t\t\t};\n\t\t}\n\t};\n}\n","import { useEffect } from 'react';\nimport { __dispatch as dispatch } from '@elementor/store';\n\nimport { loadComponents } from './store/thunks';\n\nexport function PopulateStore() {\n\tuseEffect( () => {\n\t\tdispatch( loadComponents() );\n\t}, [] );\n\n\treturn null;\n}\n","import { createStylesProvider } from '@elementor/editor-styles-repository';\nimport { __getState as getState, __subscribeWithSelector as subscribeWithSelector } from '@elementor/store';\n\nimport { selectFlatStyles, SLICE_NAME } from './store';\n\nexport const componentsStylesProvider = createStylesProvider( {\n\tkey: 'components-styles',\n\tpriority: 100,\n\tsubscribe: ( cb ) =>\n\t\tsubscribeWithSelector(\n\t\t\t( state ) => state[ SLICE_NAME ],\n\t\t\t() => {\n\t\t\t\tcb();\n\t\t\t}\n\t\t),\n\tactions: {\n\t\tall: () => {\n\t\t\treturn selectFlatStyles( getState() );\n\t\t},\n\t\tget: ( id ) => {\n\t\t\treturn selectFlatStyles( getState() ).find( ( style ) => style.id === id ) ?? null;\n\t\t},\n\t},\n} );\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport { type StyleDefinition } from '@elementor/editor-styles';\nimport { __dispatch as dispatch, __getState as getState } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { type ComponentId, type Element } from '../types';\nimport { getComponentIds } from '../utils/get-component-ids';\nimport { selectStyles, slice } from './store';\n\nexport async function loadComponentsStyles( elements: Element[] ) {\n\tconst componentIds = Array.from( new Set( getComponentIds( elements ) ) );\n\n\tif ( ! componentIds.length ) {\n\t\treturn;\n\t}\n\n\tconst knownComponents = selectStyles( getState() );\n\tconst unknownComponentIds = componentIds.filter( ( id ) => ! knownComponents[ id ] );\n\n\tif ( ! unknownComponentIds.length ) {\n\t\treturn;\n\t}\n\n\taddComponentStyles( unknownComponentIds );\n}\n\nasync function addComponentStyles( ids: ComponentId[] ) {\n\tconst newComponents = await loadStyles( ids );\n\n\taddStyles( newComponents );\n\n\tObject.values( newComponents ).forEach( ( [ , data ] ) => {\n\t\tloadComponentsStyles( data.elements as Element[] );\n\t} );\n}\n\nasync function loadStyles( ids: number[] ): Promise< [ number, V1ElementData ][] > {\n\treturn Promise.all( ids.map( async ( id ) => [ id, await apiClient.getComponentConfig( id ) ] ) );\n}\n\nfunction addStyles( data: ( readonly [ ComponentId, V1ElementData ] )[] ) {\n\tconst styles = Object.fromEntries(\n\t\tdata.map( ( [ componentId, componentData ] ) => [ componentId, extractStyles( componentData ) ] )\n\t);\n\n\tdispatch( slice.actions.addStyles( styles ) );\n}\n\nfunction extractStyles( element: V1ElementData ): Array< StyleDefinition > {\n\treturn [ ...Object.values( element.styles ?? {} ), ...( element.elements ?? [] ).flatMap( extractStyles ) ];\n}\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport { isTransformable } from '@elementor/editor-props';\n\nexport const getComponentIds = ( elements: V1ElementData[] ) => {\n\treturn elements.flatMap( ( element ) => {\n\t\tconst ids: number[] = [];\n\n\t\tconst type = element.widgetType || element.elType;\n\n\t\tif ( type === 'e-component' && element.settings?.component && isTransformable( element.settings?.component ) ) {\n\t\t\tids.push( element.settings.component.value );\n\t\t}\n\n\t\tif ( element.elements ) {\n\t\t\tids.push( ...getComponentIds( element.elements ) );\n\t\t}\n\n\t\treturn ids;\n\t} );\n};\n","import { __dispatch as dispatch } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { slice } from './store';\n\nexport function removeComponentStyles( id: number ) {\n\tapiClient.invalidateComponentConfigCache( id );\n\tdispatch( slice.actions.removeStyles( { id } ) );\n}\n","import { updateElementSettings, type V1ElementData } from '@elementor/editor-elements';\nimport { type TransformablePropValue } from '@elementor/editor-props';\nimport { __dispatch as dispatch, __getState as getState } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { selectUnpublishedComponents, slice, type UnpublishedComponent } from '../store/store';\nimport { type DocumentStatus } from '../types';\n\ntype Container = {\n\tmodel: {\n\t\tget: ( key: 'elements' ) => {\n\t\t\ttoJSON: () => V1ElementData[];\n\t\t};\n\t};\n};\n\nexport const beforeSave = async ( { container, status }: { container: Container; status: DocumentStatus } ) => {\n\tconst unpublishedComponents = selectUnpublishedComponents( getState() );\n\n\tif ( ! unpublishedComponents.length ) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst tempIdToComponentId = await createComponents( unpublishedComponents, status );\n\n\t\tconst elements = container.model.get( 'elements' ).toJSON();\n\t\tupdateComponentInstances( elements, tempIdToComponentId );\n\n\t\tdispatch(\n\t\t\tslice.actions.add(\n\t\t\t\tunpublishedComponents.map( ( component ) => ( {\n\t\t\t\t\tid: tempIdToComponentId.get( component.id ) as number,\n\t\t\t\t\tname: component.name,\n\t\t\t\t} ) )\n\t\t\t)\n\t\t);\n\t\tdispatch( slice.actions.resetUnpublished() );\n\t} catch ( error ) {\n\t\tthrow new Error( `Failed to publish components and update component instances: ${ error }` );\n\t}\n};\n\nasync function createComponents(\n\tcomponents: UnpublishedComponent[],\n\tstatus: DocumentStatus\n): Promise< Map< number, number > > {\n\tconst response = await apiClient.create( {\n\t\tstatus,\n\t\titems: components.map( ( component ) => ( {\n\t\t\ttemp_id: component.id,\n\t\t\ttitle: component.name,\n\t\t\telements: component.elements,\n\t\t} ) ),\n\t} );\n\n\tconst map = new Map< number, number >();\n\n\tObject.entries( response ).forEach( ( [ key, value ] ) => {\n\t\tmap.set( Number( key ), value );\n\t} );\n\n\treturn map;\n}\n\nfunction updateComponentInstances( elements: V1ElementData[], tempIdToComponentId: Map< number, number > ): void {\n\telements.forEach( ( element ) => {\n\t\tconst { shouldUpdate, newComponentId } = shouldUpdateElement( element, tempIdToComponentId );\n\t\tif ( shouldUpdate ) {\n\t\t\tupdateElementComponentId( element.id, newComponentId );\n\t\t}\n\n\t\tif ( element.elements ) {\n\t\t\tupdateComponentInstances( element.elements, tempIdToComponentId );\n\t\t}\n\t} );\n}\n\nfunction shouldUpdateElement(\n\telement: V1ElementData,\n\ttempIdToComponentId: Map< number, number >\n): { shouldUpdate: true; newComponentId: number } | { shouldUpdate: false; newComponentId: null } {\n\tif ( element.widgetType === 'e-component' ) {\n\t\tconst currentComponentId = ( element.settings?.component as TransformablePropValue< 'component-id', number > )\n\t\t\t?.value;\n\t\tif ( currentComponentId && tempIdToComponentId.has( currentComponentId ) ) {\n\t\t\treturn { shouldUpdate: true, newComponentId: tempIdToComponentId.get( currentComponentId ) as number };\n\t\t}\n\t}\n\treturn { shouldUpdate: false, newComponentId: null };\n}\n\nfunction updateElementComponentId( elementId: string, componentId: number ): void {\n\tupdateElementSettings( {\n\t\tid: elementId,\n\t\tprops: {\n\t\t\tcomponent: {\n\t\t\t\t$$type: 'component-id',\n\t\t\t\tvalue: componentId,\n\t\t\t},\n\t\t},\n\t\twithHistory: false,\n\t} );\n}\n"],"mappings":"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","names":["__","React","React","React","ComponentsIcon","Box","Stack","Typography","__","React","Box","Box","React","Box","ListItemButton","Stack","Stack","Typography","__","ComponentsIcon","Box","React","useMemo","useState","ThemeProvider","Stack","TextField","Typography","__","__","useState","dispatch","__","ThemeProvider","validateForm","useMemo","Stack","Typography","TextField","React","Box","Button","Icon","Stack","Typography","__","__","__","useEffect","useEffect","getState","getState","dispatch","getState","getState","dispatch","dispatch","dispatch","dispatch","getState","getState","dispatch","__"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-components",
|
|
3
3
|
"description": "Elementor editor components",
|
|
4
|
-
"version": "3.33.0-
|
|
4
|
+
"version": "3.33.0-216",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "Elementor Team",
|
|
7
7
|
"homepage": "https://elementor.com/",
|
|
@@ -40,22 +40,22 @@
|
|
|
40
40
|
"dev": "tsup --config=../../tsup.dev.ts"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@elementor/editor": "3.33.0-
|
|
44
|
-
"@elementor/editor-canvas": "3.33.0-
|
|
45
|
-
"@elementor/editor-documents": "3.33.0-
|
|
46
|
-
"@elementor/editor-elements": "3.33.0-
|
|
47
|
-
"@elementor/editor-elements-panel": "3.33.0-
|
|
48
|
-
"@elementor/editor-props": "3.33.0-
|
|
49
|
-
"@elementor/editor-styles-repository": "3.33.0-
|
|
50
|
-
"@elementor/editor-ui": "3.33.0-
|
|
51
|
-
"@elementor/editor-v1-adapters": "3.33.0-
|
|
52
|
-
"@elementor/http-client": "3.33.0-
|
|
43
|
+
"@elementor/editor": "3.33.0-216",
|
|
44
|
+
"@elementor/editor-canvas": "3.33.0-216",
|
|
45
|
+
"@elementor/editor-documents": "3.33.0-216",
|
|
46
|
+
"@elementor/editor-elements": "3.33.0-216",
|
|
47
|
+
"@elementor/editor-elements-panel": "3.33.0-216",
|
|
48
|
+
"@elementor/editor-props": "3.33.0-216",
|
|
49
|
+
"@elementor/editor-styles-repository": "3.33.0-216",
|
|
50
|
+
"@elementor/editor-ui": "3.33.0-216",
|
|
51
|
+
"@elementor/editor-v1-adapters": "3.33.0-216",
|
|
52
|
+
"@elementor/http-client": "3.33.0-216",
|
|
53
53
|
"@elementor/icons": "1.53.0",
|
|
54
|
-
"@elementor/query": "3.33.0-
|
|
55
|
-
"@elementor/schema": "3.33.0-
|
|
56
|
-
"@elementor/store": "3.33.0-
|
|
54
|
+
"@elementor/query": "3.33.0-216",
|
|
55
|
+
"@elementor/schema": "3.33.0-216",
|
|
56
|
+
"@elementor/store": "3.33.0-216",
|
|
57
57
|
"@elementor/ui": "1.36.15",
|
|
58
|
-
"@elementor/utils": "3.33.0-
|
|
58
|
+
"@elementor/utils": "3.33.0-216",
|
|
59
59
|
"@wordpress/i18n": "^5.13.0"
|
|
60
60
|
},
|
|
61
61
|
"peerDependencies": {
|
package/src/api.ts
CHANGED
|
@@ -5,6 +5,9 @@ import { type HttpResponse, httpService } from '@elementor/http-client';
|
|
|
5
5
|
import { type Component, type DocumentStatus } from './types';
|
|
6
6
|
|
|
7
7
|
const BASE_URL = 'elementor/v1/components';
|
|
8
|
+
const LOCK_COMPONENT = `${ BASE_URL }/lock`;
|
|
9
|
+
const UNLOCK_COMPONENT = `${ BASE_URL }/unlock`;
|
|
10
|
+
const BASE_URL_LOCK_STATUS = `${ BASE_URL }/lock-status`;
|
|
8
11
|
|
|
9
12
|
export type CreateComponentPayload = {
|
|
10
13
|
status: DocumentStatus;
|
|
@@ -15,6 +18,11 @@ export type CreateComponentPayload = {
|
|
|
15
18
|
} >;
|
|
16
19
|
};
|
|
17
20
|
|
|
21
|
+
type ComponentLockStatusResponse = {
|
|
22
|
+
is_current_user_allow_to_edit: boolean;
|
|
23
|
+
locked_by: string;
|
|
24
|
+
};
|
|
25
|
+
|
|
18
26
|
type GetComponentResponse = Array< Component >;
|
|
19
27
|
|
|
20
28
|
export type CreateComponentResponse = Record< number, number >;
|
|
@@ -36,4 +44,27 @@ export const apiClient = {
|
|
|
36
44
|
.then( ( res ) => res.data.data ),
|
|
37
45
|
getComponentConfig: ( id: number ) => ajax.load< { id: number }, V1ElementData >( getParams( id ) ),
|
|
38
46
|
invalidateComponentConfigCache: ( id: number ) => ajax.invalidateCache< { id: number } >( getParams( id ) ),
|
|
47
|
+
getComponentLockStatus: async ( componentId: number ) =>
|
|
48
|
+
await httpService()
|
|
49
|
+
.get< { data: ComponentLockStatusResponse } >( `${ BASE_URL_LOCK_STATUS }`, {
|
|
50
|
+
params: {
|
|
51
|
+
componentId,
|
|
52
|
+
},
|
|
53
|
+
} )
|
|
54
|
+
.then( ( res ) => {
|
|
55
|
+
const { is_current_user_allow_to_edit: isAllowedToSwitchDocument, locked_by: lockedBy } = res.data.data;
|
|
56
|
+
return { isAllowedToSwitchDocument, lockedBy: lockedBy || '' };
|
|
57
|
+
} ),
|
|
58
|
+
lockComponent: async ( componentId: number ) =>
|
|
59
|
+
await httpService()
|
|
60
|
+
.post< { success: boolean } >( LOCK_COMPONENT, {
|
|
61
|
+
componentId,
|
|
62
|
+
} )
|
|
63
|
+
.then( ( res ) => res.data ),
|
|
64
|
+
unlockComponent: async ( componentId: number ) =>
|
|
65
|
+
await httpService()
|
|
66
|
+
.post< { success: boolean } >( UNLOCK_COMPONENT, {
|
|
67
|
+
componentId,
|
|
68
|
+
} )
|
|
69
|
+
.then( ( res ) => res.data ),
|
|
39
70
|
};
|