@elementor/editor-templates 4.0.0-591

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.
@@ -0,0 +1,7 @@
1
+ import * as _elementor_editor_elements from '@elementor/editor-elements';
2
+
3
+ declare function init(): void;
4
+
5
+ declare function useLoadedTemplates(): _elementor_editor_elements.V1ElementData[][];
6
+
7
+ export { init, useLoadedTemplates };
@@ -0,0 +1,7 @@
1
+ import * as _elementor_editor_elements from '@elementor/editor-elements';
2
+
3
+ declare function init(): void;
4
+
5
+ declare function useLoadedTemplates(): _elementor_editor_elements.V1ElementData[][];
6
+
7
+ export { init, useLoadedTemplates };
package/dist/index.js ADDED
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ init: () => init,
24
+ useLoadedTemplates: () => useLoadedTemplates
25
+ });
26
+ module.exports = __toCommonJS(index_exports);
27
+
28
+ // src/init.ts
29
+ var import_editor = require("@elementor/editor");
30
+ var import_editor_styles_repository2 = require("@elementor/editor-styles-repository");
31
+ var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
32
+ var import_store6 = require("@elementor/store");
33
+
34
+ // src/load-templates.ts
35
+ var import_editor_documents = require("@elementor/editor-documents");
36
+ var import_editor_v1_adapters = require("@elementor/editor-v1-adapters");
37
+ var import_store2 = require("@elementor/store");
38
+
39
+ // src/store.ts
40
+ var import_store = require("@elementor/store");
41
+ var initialState = {
42
+ entities: {}
43
+ };
44
+ var slice = (0, import_store.__createSlice)({
45
+ name: "templates",
46
+ initialState,
47
+ reducers: {
48
+ setTemplates(state, action) {
49
+ action.payload.forEach((doc) => {
50
+ state.entities[doc.id] = doc.elements ?? [];
51
+ });
52
+ },
53
+ clearTemplates(state) {
54
+ state.entities = {};
55
+ }
56
+ }
57
+ });
58
+ var selectEntities = (state) => state.templates.entities;
59
+ var selectTemplates = (0, import_store.__createSelector)(
60
+ [selectEntities],
61
+ (entities) => Object.values(entities)
62
+ );
63
+
64
+ // src/load-templates.ts
65
+ var TEMPLATE_ATTRIBUTE = 'data-elementor-post-type="elementor_library"';
66
+ var DOCUMENT_WRAPPER_ATTR = "data-elementor-id";
67
+ async function loadTemplates() {
68
+ const iframeDocument = (0, import_editor_v1_adapters.getCanvasIframeDocument)();
69
+ if (!iframeDocument) {
70
+ return;
71
+ }
72
+ const currentDocumentId = (0, import_editor_documents.getV1CurrentDocument)()?.id;
73
+ const templateIds = getTemplateIds(iframeDocument, currentDocumentId);
74
+ if (!templateIds.length) {
75
+ return;
76
+ }
77
+ const documents = await fetchDocuments(templateIds);
78
+ (0, import_store2.__dispatch)(slice.actions.setTemplates(documents));
79
+ }
80
+ function unloadTemplates() {
81
+ (0, import_store2.__dispatch)(slice.actions.clearTemplates());
82
+ }
83
+ function getTemplateIds(iframeDocument, currentDocumentId) {
84
+ const elements = [...iframeDocument.body.querySelectorAll(`[${TEMPLATE_ATTRIBUTE}]`)];
85
+ const ids = elements.map((el) => Number(el.getAttribute(DOCUMENT_WRAPPER_ATTR))).filter((id) => !isNaN(id) && id !== currentDocumentId);
86
+ return [...new Set(ids)];
87
+ }
88
+ async function fetchDocuments(ids) {
89
+ const results = await Promise.all(
90
+ ids.map(async (id) => {
91
+ try {
92
+ return await import_editor_v1_adapters.ajax.load({
93
+ data: { id },
94
+ action: "get_document_config",
95
+ unique_id: `template-${id}`
96
+ });
97
+ } catch {
98
+ return null;
99
+ }
100
+ })
101
+ );
102
+ return results.filter((doc) => doc !== null);
103
+ }
104
+
105
+ // src/render-template-styles.tsx
106
+ var import_react = require("react");
107
+
108
+ // src/templates-styles-provider.ts
109
+ var import_editor_styles_repository = require("@elementor/editor-styles-repository");
110
+ var styles = [];
111
+ var listeners = /* @__PURE__ */ new Set();
112
+ function addTemplateStyles(newStyles) {
113
+ styles = [...styles, ...newStyles];
114
+ listeners.forEach((cb) => cb());
115
+ }
116
+ function clearTemplatesStyles() {
117
+ styles = [];
118
+ listeners.forEach((cb) => cb());
119
+ }
120
+ var templatesStylesProvider = (0, import_editor_styles_repository.createStylesProvider)({
121
+ key: "templates-styles",
122
+ priority: 50,
123
+ subscribe: (cb) => {
124
+ listeners.add(cb);
125
+ return () => {
126
+ listeners.delete(cb);
127
+ };
128
+ },
129
+ actions: {
130
+ all: () => styles,
131
+ get: (id) => styles.find((style) => style.id === id) ?? null
132
+ }
133
+ });
134
+
135
+ // src/use-loaded-templates.ts
136
+ var import_store4 = require("@elementor/store");
137
+ function useLoadedTemplates() {
138
+ return (0, import_store4.__useSelector)(selectTemplates);
139
+ }
140
+
141
+ // src/render-template-styles.tsx
142
+ var RenderTemplateStyles = () => {
143
+ const templates = useLoadedTemplates();
144
+ (0, import_react.useEffect)(() => {
145
+ const styles2 = templates.flatMap(extractStylesFromDocument);
146
+ addTemplateStyles(styles2);
147
+ }, [templates]);
148
+ return null;
149
+ };
150
+ function extractStylesFromDocument(elements) {
151
+ if (!elements.length) {
152
+ return [];
153
+ }
154
+ return elements.flatMap(extractStylesFromElement);
155
+ }
156
+ function extractStylesFromElement(element) {
157
+ return [
158
+ ...Object.values(element.styles ?? {}),
159
+ ...(element.elements ?? []).flatMap(extractStylesFromElement)
160
+ ];
161
+ }
162
+
163
+ // src/init.ts
164
+ function init() {
165
+ (0, import_store6.__registerSlice)(slice);
166
+ import_editor_styles_repository2.stylesRepository.register(templatesStylesProvider);
167
+ (0, import_editor_v1_adapters2.registerDataHook)("after", "editor/documents/attach-preview", async () => {
168
+ unloadTemplates();
169
+ clearTemplatesStyles();
170
+ await loadTemplates();
171
+ });
172
+ (0, import_editor.injectIntoLogic)({
173
+ id: "templates-styles",
174
+ component: RenderTemplateStyles
175
+ });
176
+ }
177
+ // Annotate the CommonJS export names for ESM import in node:
178
+ 0 && (module.exports = {
179
+ init,
180
+ useLoadedTemplates
181
+ });
182
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/init.ts","../src/load-templates.ts","../src/store.ts","../src/render-template-styles.tsx","../src/templates-styles-provider.ts","../src/use-loaded-templates.ts"],"sourcesContent":["export { init } from './init';\nexport { useLoadedTemplates } from './use-loaded-templates';\n","import { injectIntoLogic } from '@elementor/editor';\nimport { stylesRepository } from '@elementor/editor-styles-repository';\nimport { registerDataHook } from '@elementor/editor-v1-adapters';\nimport { __registerSlice as registerSlice } from '@elementor/store';\n\nimport { loadTemplates, unloadTemplates } from './load-templates';\nimport { RenderTemplateStyles } from './render-template-styles';\nimport { slice } from './store';\nimport { clearTemplatesStyles, templatesStylesProvider } from './templates-styles-provider';\n\nexport function init() {\n\tregisterSlice( slice );\n\tstylesRepository.register( templatesStylesProvider );\n\n\tregisterDataHook( 'after', 'editor/documents/attach-preview', async () => {\n\t\tunloadTemplates();\n\t\tclearTemplatesStyles();\n\n\t\tawait loadTemplates();\n\t} );\n\n\tinjectIntoLogic( {\n\t\tid: 'templates-styles',\n\t\tcomponent: RenderTemplateStyles,\n\t} );\n}\n","import { type Document, getV1CurrentDocument } from '@elementor/editor-documents';\nimport { ajax, getCanvasIframeDocument } from '@elementor/editor-v1-adapters';\nimport { __dispatch as dispatch } from '@elementor/store';\n\nimport { slice } from './store';\n\nconst TEMPLATE_ATTRIBUTE = 'data-elementor-post-type=\"elementor_library\"';\nconst DOCUMENT_WRAPPER_ATTR = 'data-elementor-id';\n\nexport async function loadTemplates() {\n\tconst iframeDocument = getCanvasIframeDocument();\n\n\tif ( ! iframeDocument ) {\n\t\treturn;\n\t}\n\n\tconst currentDocumentId = getV1CurrentDocument()?.id;\n\tconst templateIds = getTemplateIds( iframeDocument, currentDocumentId );\n\n\tif ( ! templateIds.length ) {\n\t\treturn;\n\t}\n\n\tconst documents = await fetchDocuments( templateIds );\n\n\tdispatch( slice.actions.setTemplates( documents ) );\n}\n\nexport function unloadTemplates() {\n\tdispatch( slice.actions.clearTemplates() );\n}\n\nfunction getTemplateIds( iframeDocument: globalThis.Document, currentDocumentId?: number ): number[] {\n\tconst elements = [ ...iframeDocument.body.querySelectorAll< HTMLElement >( `[${ TEMPLATE_ATTRIBUTE }]` ) ];\n\n\tconst ids = elements\n\t\t.map( ( el ) => Number( el.getAttribute( DOCUMENT_WRAPPER_ATTR ) ) )\n\t\t.filter( ( id ) => ! isNaN( id ) && id !== currentDocumentId );\n\n\treturn [ ...new Set( ids ) ];\n}\n\nasync function fetchDocuments( ids: number[] ): Promise< Document[] > {\n\tconst results = await Promise.all(\n\t\tids.map( async ( id ) => {\n\t\t\ttry {\n\t\t\t\t// using ajax.load instead of the document-manager as the latter causes an issue when trying to edit a template\n\t\t\t\treturn await ajax.load< { id: number }, Document >( {\n\t\t\t\t\tdata: { id },\n\t\t\t\t\taction: 'get_document_config',\n\t\t\t\t\tunique_id: `template-${ id }`,\n\t\t\t\t} );\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} )\n\t);\n\n\treturn results.filter( ( doc ): doc is Document => doc !== null );\n}\n","import { type Document } from '@elementor/editor-documents';\nimport { type V1ElementData } from '@elementor/editor-elements';\nimport { __createSelector, __createSlice, type PayloadAction, type SliceState } from '@elementor/store';\n\ntype State = {\n\tentities: Record< Document[ 'id' ], V1ElementData[] >;\n};\n\nconst initialState: State = {\n\tentities: {},\n};\n\nexport const slice = __createSlice( {\n\tname: 'templates',\n\tinitialState,\n\treducers: {\n\t\tsetTemplates( state, action: PayloadAction< Document[] > ) {\n\t\t\taction.payload.forEach( ( doc ) => {\n\t\t\t\tstate.entities[ doc.id ] = doc.elements ?? [];\n\t\t\t} );\n\t\t},\n\n\t\tclearTemplates( state ) {\n\t\t\tstate.entities = {};\n\t\t},\n\t},\n} );\n\nexport type Slice = SliceState< typeof slice >;\n\nconst selectEntities = ( state: Slice ) => state.templates.entities;\n\nexport const selectTemplates = __createSelector( [ selectEntities ], ( entities ): V1ElementData[][] =>\n\tObject.values( entities )\n);\n","import { useEffect } from 'react';\nimport { type V1ElementData } from '@elementor/editor-elements';\nimport { type StyleDefinition } from '@elementor/editor-styles';\n\nimport { addTemplateStyles } from './templates-styles-provider';\nimport { useLoadedTemplates } from './use-loaded-templates';\n\nexport const RenderTemplateStyles = () => {\n\tconst templates = useLoadedTemplates();\n\n\tuseEffect( () => {\n\t\tconst styles = templates.flatMap( extractStylesFromDocument );\n\n\t\taddTemplateStyles( styles );\n\t}, [ templates ] );\n\n\treturn null;\n};\n\nfunction extractStylesFromDocument( elements: V1ElementData[] ): StyleDefinition[] {\n\tif ( ! elements.length ) {\n\t\treturn [];\n\t}\n\n\treturn elements.flatMap( extractStylesFromElement );\n}\n\nfunction extractStylesFromElement( element: V1ElementData ): StyleDefinition[] {\n\treturn [\n\t\t...Object.values( element.styles ?? {} ),\n\t\t...( element.elements ?? [] ).flatMap( extractStylesFromElement ),\n\t];\n}\n","import { type StyleDefinition } from '@elementor/editor-styles';\nimport { createStylesProvider } from '@elementor/editor-styles-repository';\n\nlet styles: StyleDefinition[] = [];\nconst listeners = new Set< () => void >();\n\nexport function addTemplateStyles( newStyles: StyleDefinition[] ) {\n\tstyles = [ ...styles, ...newStyles ];\n\tlisteners.forEach( ( cb ) => cb() );\n}\n\nexport function clearTemplatesStyles() {\n\tstyles = [];\n\tlisteners.forEach( ( cb ) => cb() );\n}\n\nexport const templatesStylesProvider = createStylesProvider( {\n\tkey: 'templates-styles',\n\tpriority: 50,\n\tsubscribe: ( cb ) => {\n\t\tlisteners.add( cb );\n\n\t\treturn () => {\n\t\t\tlisteners.delete( cb );\n\t\t};\n\t},\n\tactions: {\n\t\tall: () => styles,\n\t\tget: ( id ) => styles.find( ( style ) => style.id === id ) ?? null,\n\t},\n} );\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectTemplates } from './store';\n\nexport function useLoadedTemplates() {\n\treturn useSelector( selectTemplates );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,oBAAgC;AAChC,IAAAA,mCAAiC;AACjC,IAAAC,6BAAiC;AACjC,IAAAC,gBAAiD;;;ACHjD,8BAAoD;AACpD,gCAA8C;AAC9C,IAAAC,gBAAuC;;;ACAvC,mBAAqF;AAMrF,IAAM,eAAsB;AAAA,EAC3B,UAAU,CAAC;AACZ;AAEO,IAAM,YAAQ,4BAAe;AAAA,EACnC,MAAM;AAAA,EACN;AAAA,EACA,UAAU;AAAA,IACT,aAAc,OAAO,QAAsC;AAC1D,aAAO,QAAQ,QAAS,CAAE,QAAS;AAClC,cAAM,SAAU,IAAI,EAAG,IAAI,IAAI,YAAY,CAAC;AAAA,MAC7C,CAAE;AAAA,IACH;AAAA,IAEA,eAAgB,OAAQ;AACvB,YAAM,WAAW,CAAC;AAAA,IACnB;AAAA,EACD;AACD,CAAE;AAIF,IAAM,iBAAiB,CAAE,UAAkB,MAAM,UAAU;AAEpD,IAAM,sBAAkB;AAAA,EAAkB,CAAE,cAAe;AAAA,EAAG,CAAE,aACtE,OAAO,OAAQ,QAAS;AACzB;;;AD5BA,IAAM,qBAAqB;AAC3B,IAAM,wBAAwB;AAE9B,eAAsB,gBAAgB;AACrC,QAAM,qBAAiB,mDAAwB;AAE/C,MAAK,CAAE,gBAAiB;AACvB;AAAA,EACD;AAEA,QAAM,wBAAoB,8CAAqB,GAAG;AAClD,QAAM,cAAc,eAAgB,gBAAgB,iBAAkB;AAEtE,MAAK,CAAE,YAAY,QAAS;AAC3B;AAAA,EACD;AAEA,QAAM,YAAY,MAAM,eAAgB,WAAY;AAEpD,oBAAAC,YAAU,MAAM,QAAQ,aAAc,SAAU,CAAE;AACnD;AAEO,SAAS,kBAAkB;AACjC,oBAAAA,YAAU,MAAM,QAAQ,eAAe,CAAE;AAC1C;AAEA,SAAS,eAAgB,gBAAqC,mBAAuC;AACpG,QAAM,WAAW,CAAE,GAAG,eAAe,KAAK,iBAAiC,IAAK,kBAAmB,GAAI,CAAE;AAEzG,QAAM,MAAM,SACV,IAAK,CAAE,OAAQ,OAAQ,GAAG,aAAc,qBAAsB,CAAE,CAAE,EAClE,OAAQ,CAAE,OAAQ,CAAE,MAAO,EAAG,KAAK,OAAO,iBAAkB;AAE9D,SAAO,CAAE,GAAG,IAAI,IAAK,GAAI,CAAE;AAC5B;AAEA,eAAe,eAAgB,KAAuC;AACrE,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC7B,IAAI,IAAK,OAAQ,OAAQ;AACxB,UAAI;AAEH,eAAO,MAAM,+BAAK,KAAkC;AAAA,UACnD,MAAM,EAAE,GAAG;AAAA,UACX,QAAQ;AAAA,UACR,WAAW,YAAa,EAAG;AAAA,QAC5B,CAAE;AAAA,MACH,QAAQ;AACP,eAAO;AAAA,MACR;AAAA,IACD,CAAE;AAAA,EACH;AAEA,SAAO,QAAQ,OAAQ,CAAE,QAA0B,QAAQ,IAAK;AACjE;;;AE3DA,mBAA0B;;;ACC1B,sCAAqC;AAErC,IAAI,SAA4B,CAAC;AACjC,IAAM,YAAY,oBAAI,IAAkB;AAEjC,SAAS,kBAAmB,WAA+B;AACjE,WAAS,CAAE,GAAG,QAAQ,GAAG,SAAU;AACnC,YAAU,QAAS,CAAE,OAAQ,GAAG,CAAE;AACnC;AAEO,SAAS,uBAAuB;AACtC,WAAS,CAAC;AACV,YAAU,QAAS,CAAE,OAAQ,GAAG,CAAE;AACnC;AAEO,IAAM,8BAA0B,sDAAsB;AAAA,EAC5D,KAAK;AAAA,EACL,UAAU;AAAA,EACV,WAAW,CAAE,OAAQ;AACpB,cAAU,IAAK,EAAG;AAElB,WAAO,MAAM;AACZ,gBAAU,OAAQ,EAAG;AAAA,IACtB;AAAA,EACD;AAAA,EACA,SAAS;AAAA,IACR,KAAK,MAAM;AAAA,IACX,KAAK,CAAE,OAAQ,OAAO,KAAM,CAAE,UAAW,MAAM,OAAO,EAAG,KAAK;AAAA,EAC/D;AACD,CAAE;;;AC9BF,IAAAC,gBAA6C;AAItC,SAAS,qBAAqB;AACpC,aAAO,cAAAC,eAAa,eAAgB;AACrC;;;AFCO,IAAM,uBAAuB,MAAM;AACzC,QAAM,YAAY,mBAAmB;AAErC,8BAAW,MAAM;AAChB,UAAMC,UAAS,UAAU,QAAS,yBAA0B;AAE5D,sBAAmBA,OAAO;AAAA,EAC3B,GAAG,CAAE,SAAU,CAAE;AAEjB,SAAO;AACR;AAEA,SAAS,0BAA2B,UAA+C;AAClF,MAAK,CAAE,SAAS,QAAS;AACxB,WAAO,CAAC;AAAA,EACT;AAEA,SAAO,SAAS,QAAS,wBAAyB;AACnD;AAEA,SAAS,yBAA0B,SAA4C;AAC9E,SAAO;AAAA,IACN,GAAG,OAAO,OAAQ,QAAQ,UAAU,CAAC,CAAE;AAAA,IACvC,IAAK,QAAQ,YAAY,CAAC,GAAI,QAAS,wBAAyB;AAAA,EACjE;AACD;;;AHtBO,SAAS,OAAO;AACtB,oBAAAC,iBAAe,KAAM;AACrB,oDAAiB,SAAU,uBAAwB;AAEnD,mDAAkB,SAAS,mCAAmC,YAAY;AACzE,oBAAgB;AAChB,yBAAqB;AAErB,UAAM,cAAc;AAAA,EACrB,CAAE;AAEF,qCAAiB;AAAA,IAChB,IAAI;AAAA,IACJ,WAAW;AAAA,EACZ,CAAE;AACH;","names":["import_editor_styles_repository","import_editor_v1_adapters","import_store","import_store","dispatch","import_store","useSelector","styles","registerSlice"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,154 @@
1
+ // src/init.ts
2
+ import { injectIntoLogic } from "@elementor/editor";
3
+ import { stylesRepository } from "@elementor/editor-styles-repository";
4
+ import { registerDataHook } from "@elementor/editor-v1-adapters";
5
+ import { __registerSlice as registerSlice } from "@elementor/store";
6
+
7
+ // src/load-templates.ts
8
+ import { getV1CurrentDocument } from "@elementor/editor-documents";
9
+ import { ajax, getCanvasIframeDocument } from "@elementor/editor-v1-adapters";
10
+ import { __dispatch as dispatch } from "@elementor/store";
11
+
12
+ // src/store.ts
13
+ import { __createSelector, __createSlice } from "@elementor/store";
14
+ var initialState = {
15
+ entities: {}
16
+ };
17
+ var slice = __createSlice({
18
+ name: "templates",
19
+ initialState,
20
+ reducers: {
21
+ setTemplates(state, action) {
22
+ action.payload.forEach((doc) => {
23
+ state.entities[doc.id] = doc.elements ?? [];
24
+ });
25
+ },
26
+ clearTemplates(state) {
27
+ state.entities = {};
28
+ }
29
+ }
30
+ });
31
+ var selectEntities = (state) => state.templates.entities;
32
+ var selectTemplates = __createSelector(
33
+ [selectEntities],
34
+ (entities) => Object.values(entities)
35
+ );
36
+
37
+ // src/load-templates.ts
38
+ var TEMPLATE_ATTRIBUTE = 'data-elementor-post-type="elementor_library"';
39
+ var DOCUMENT_WRAPPER_ATTR = "data-elementor-id";
40
+ async function loadTemplates() {
41
+ const iframeDocument = getCanvasIframeDocument();
42
+ if (!iframeDocument) {
43
+ return;
44
+ }
45
+ const currentDocumentId = getV1CurrentDocument()?.id;
46
+ const templateIds = getTemplateIds(iframeDocument, currentDocumentId);
47
+ if (!templateIds.length) {
48
+ return;
49
+ }
50
+ const documents = await fetchDocuments(templateIds);
51
+ dispatch(slice.actions.setTemplates(documents));
52
+ }
53
+ function unloadTemplates() {
54
+ dispatch(slice.actions.clearTemplates());
55
+ }
56
+ function getTemplateIds(iframeDocument, currentDocumentId) {
57
+ const elements = [...iframeDocument.body.querySelectorAll(`[${TEMPLATE_ATTRIBUTE}]`)];
58
+ const ids = elements.map((el) => Number(el.getAttribute(DOCUMENT_WRAPPER_ATTR))).filter((id) => !isNaN(id) && id !== currentDocumentId);
59
+ return [...new Set(ids)];
60
+ }
61
+ async function fetchDocuments(ids) {
62
+ const results = await Promise.all(
63
+ ids.map(async (id) => {
64
+ try {
65
+ return await ajax.load({
66
+ data: { id },
67
+ action: "get_document_config",
68
+ unique_id: `template-${id}`
69
+ });
70
+ } catch {
71
+ return null;
72
+ }
73
+ })
74
+ );
75
+ return results.filter((doc) => doc !== null);
76
+ }
77
+
78
+ // src/render-template-styles.tsx
79
+ import { useEffect } from "react";
80
+
81
+ // src/templates-styles-provider.ts
82
+ import { createStylesProvider } from "@elementor/editor-styles-repository";
83
+ var styles = [];
84
+ var listeners = /* @__PURE__ */ new Set();
85
+ function addTemplateStyles(newStyles) {
86
+ styles = [...styles, ...newStyles];
87
+ listeners.forEach((cb) => cb());
88
+ }
89
+ function clearTemplatesStyles() {
90
+ styles = [];
91
+ listeners.forEach((cb) => cb());
92
+ }
93
+ var templatesStylesProvider = createStylesProvider({
94
+ key: "templates-styles",
95
+ priority: 50,
96
+ subscribe: (cb) => {
97
+ listeners.add(cb);
98
+ return () => {
99
+ listeners.delete(cb);
100
+ };
101
+ },
102
+ actions: {
103
+ all: () => styles,
104
+ get: (id) => styles.find((style) => style.id === id) ?? null
105
+ }
106
+ });
107
+
108
+ // src/use-loaded-templates.ts
109
+ import { __useSelector as useSelector } from "@elementor/store";
110
+ function useLoadedTemplates() {
111
+ return useSelector(selectTemplates);
112
+ }
113
+
114
+ // src/render-template-styles.tsx
115
+ var RenderTemplateStyles = () => {
116
+ const templates = useLoadedTemplates();
117
+ useEffect(() => {
118
+ const styles2 = templates.flatMap(extractStylesFromDocument);
119
+ addTemplateStyles(styles2);
120
+ }, [templates]);
121
+ return null;
122
+ };
123
+ function extractStylesFromDocument(elements) {
124
+ if (!elements.length) {
125
+ return [];
126
+ }
127
+ return elements.flatMap(extractStylesFromElement);
128
+ }
129
+ function extractStylesFromElement(element) {
130
+ return [
131
+ ...Object.values(element.styles ?? {}),
132
+ ...(element.elements ?? []).flatMap(extractStylesFromElement)
133
+ ];
134
+ }
135
+
136
+ // src/init.ts
137
+ function init() {
138
+ registerSlice(slice);
139
+ stylesRepository.register(templatesStylesProvider);
140
+ registerDataHook("after", "editor/documents/attach-preview", async () => {
141
+ unloadTemplates();
142
+ clearTemplatesStyles();
143
+ await loadTemplates();
144
+ });
145
+ injectIntoLogic({
146
+ id: "templates-styles",
147
+ component: RenderTemplateStyles
148
+ });
149
+ }
150
+ export {
151
+ init,
152
+ useLoadedTemplates
153
+ };
154
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/init.ts","../src/load-templates.ts","../src/store.ts","../src/render-template-styles.tsx","../src/templates-styles-provider.ts","../src/use-loaded-templates.ts"],"sourcesContent":["import { injectIntoLogic } from '@elementor/editor';\nimport { stylesRepository } from '@elementor/editor-styles-repository';\nimport { registerDataHook } from '@elementor/editor-v1-adapters';\nimport { __registerSlice as registerSlice } from '@elementor/store';\n\nimport { loadTemplates, unloadTemplates } from './load-templates';\nimport { RenderTemplateStyles } from './render-template-styles';\nimport { slice } from './store';\nimport { clearTemplatesStyles, templatesStylesProvider } from './templates-styles-provider';\n\nexport function init() {\n\tregisterSlice( slice );\n\tstylesRepository.register( templatesStylesProvider );\n\n\tregisterDataHook( 'after', 'editor/documents/attach-preview', async () => {\n\t\tunloadTemplates();\n\t\tclearTemplatesStyles();\n\n\t\tawait loadTemplates();\n\t} );\n\n\tinjectIntoLogic( {\n\t\tid: 'templates-styles',\n\t\tcomponent: RenderTemplateStyles,\n\t} );\n}\n","import { type Document, getV1CurrentDocument } from '@elementor/editor-documents';\nimport { ajax, getCanvasIframeDocument } from '@elementor/editor-v1-adapters';\nimport { __dispatch as dispatch } from '@elementor/store';\n\nimport { slice } from './store';\n\nconst TEMPLATE_ATTRIBUTE = 'data-elementor-post-type=\"elementor_library\"';\nconst DOCUMENT_WRAPPER_ATTR = 'data-elementor-id';\n\nexport async function loadTemplates() {\n\tconst iframeDocument = getCanvasIframeDocument();\n\n\tif ( ! iframeDocument ) {\n\t\treturn;\n\t}\n\n\tconst currentDocumentId = getV1CurrentDocument()?.id;\n\tconst templateIds = getTemplateIds( iframeDocument, currentDocumentId );\n\n\tif ( ! templateIds.length ) {\n\t\treturn;\n\t}\n\n\tconst documents = await fetchDocuments( templateIds );\n\n\tdispatch( slice.actions.setTemplates( documents ) );\n}\n\nexport function unloadTemplates() {\n\tdispatch( slice.actions.clearTemplates() );\n}\n\nfunction getTemplateIds( iframeDocument: globalThis.Document, currentDocumentId?: number ): number[] {\n\tconst elements = [ ...iframeDocument.body.querySelectorAll< HTMLElement >( `[${ TEMPLATE_ATTRIBUTE }]` ) ];\n\n\tconst ids = elements\n\t\t.map( ( el ) => Number( el.getAttribute( DOCUMENT_WRAPPER_ATTR ) ) )\n\t\t.filter( ( id ) => ! isNaN( id ) && id !== currentDocumentId );\n\n\treturn [ ...new Set( ids ) ];\n}\n\nasync function fetchDocuments( ids: number[] ): Promise< Document[] > {\n\tconst results = await Promise.all(\n\t\tids.map( async ( id ) => {\n\t\t\ttry {\n\t\t\t\t// using ajax.load instead of the document-manager as the latter causes an issue when trying to edit a template\n\t\t\t\treturn await ajax.load< { id: number }, Document >( {\n\t\t\t\t\tdata: { id },\n\t\t\t\t\taction: 'get_document_config',\n\t\t\t\t\tunique_id: `template-${ id }`,\n\t\t\t\t} );\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} )\n\t);\n\n\treturn results.filter( ( doc ): doc is Document => doc !== null );\n}\n","import { type Document } from '@elementor/editor-documents';\nimport { type V1ElementData } from '@elementor/editor-elements';\nimport { __createSelector, __createSlice, type PayloadAction, type SliceState } from '@elementor/store';\n\ntype State = {\n\tentities: Record< Document[ 'id' ], V1ElementData[] >;\n};\n\nconst initialState: State = {\n\tentities: {},\n};\n\nexport const slice = __createSlice( {\n\tname: 'templates',\n\tinitialState,\n\treducers: {\n\t\tsetTemplates( state, action: PayloadAction< Document[] > ) {\n\t\t\taction.payload.forEach( ( doc ) => {\n\t\t\t\tstate.entities[ doc.id ] = doc.elements ?? [];\n\t\t\t} );\n\t\t},\n\n\t\tclearTemplates( state ) {\n\t\t\tstate.entities = {};\n\t\t},\n\t},\n} );\n\nexport type Slice = SliceState< typeof slice >;\n\nconst selectEntities = ( state: Slice ) => state.templates.entities;\n\nexport const selectTemplates = __createSelector( [ selectEntities ], ( entities ): V1ElementData[][] =>\n\tObject.values( entities )\n);\n","import { useEffect } from 'react';\nimport { type V1ElementData } from '@elementor/editor-elements';\nimport { type StyleDefinition } from '@elementor/editor-styles';\n\nimport { addTemplateStyles } from './templates-styles-provider';\nimport { useLoadedTemplates } from './use-loaded-templates';\n\nexport const RenderTemplateStyles = () => {\n\tconst templates = useLoadedTemplates();\n\n\tuseEffect( () => {\n\t\tconst styles = templates.flatMap( extractStylesFromDocument );\n\n\t\taddTemplateStyles( styles );\n\t}, [ templates ] );\n\n\treturn null;\n};\n\nfunction extractStylesFromDocument( elements: V1ElementData[] ): StyleDefinition[] {\n\tif ( ! elements.length ) {\n\t\treturn [];\n\t}\n\n\treturn elements.flatMap( extractStylesFromElement );\n}\n\nfunction extractStylesFromElement( element: V1ElementData ): StyleDefinition[] {\n\treturn [\n\t\t...Object.values( element.styles ?? {} ),\n\t\t...( element.elements ?? [] ).flatMap( extractStylesFromElement ),\n\t];\n}\n","import { type StyleDefinition } from '@elementor/editor-styles';\nimport { createStylesProvider } from '@elementor/editor-styles-repository';\n\nlet styles: StyleDefinition[] = [];\nconst listeners = new Set< () => void >();\n\nexport function addTemplateStyles( newStyles: StyleDefinition[] ) {\n\tstyles = [ ...styles, ...newStyles ];\n\tlisteners.forEach( ( cb ) => cb() );\n}\n\nexport function clearTemplatesStyles() {\n\tstyles = [];\n\tlisteners.forEach( ( cb ) => cb() );\n}\n\nexport const templatesStylesProvider = createStylesProvider( {\n\tkey: 'templates-styles',\n\tpriority: 50,\n\tsubscribe: ( cb ) => {\n\t\tlisteners.add( cb );\n\n\t\treturn () => {\n\t\t\tlisteners.delete( cb );\n\t\t};\n\t},\n\tactions: {\n\t\tall: () => styles,\n\t\tget: ( id ) => styles.find( ( style ) => style.id === id ) ?? null,\n\t},\n} );\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectTemplates } from './store';\n\nexport function useLoadedTemplates() {\n\treturn useSelector( selectTemplates );\n}\n"],"mappings":"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","names":["styles"]}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@elementor/editor-templates",
3
+ "version": "4.0.0-591",
4
+ "private": false,
5
+ "author": "Elementor Team",
6
+ "homepage": "https://elementor.com/",
7
+ "license": "GPL-3.0-or-later",
8
+ "main": "dist/index.js",
9
+ "module": "dist/index.mjs",
10
+ "types": "dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.mjs",
15
+ "require": "./dist/index.js"
16
+ },
17
+ "./package.json": "./package.json"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/elementor/elementor.git",
22
+ "directory": "packages/core/editor-templates"
23
+ },
24
+ "bugs": {
25
+ "url": "https://github.com/elementor/elementor/issues"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "files": [
31
+ "README.md",
32
+ "CHANGELOG.md",
33
+ "/dist",
34
+ "/src",
35
+ "!**/__tests__"
36
+ ],
37
+ "scripts": {
38
+ "build": "tsup --config=../../tsup.build.ts",
39
+ "dev": "tsup --config=../../tsup.dev.ts"
40
+ },
41
+ "dependencies": {
42
+ "@elementor/editor": "4.0.0-591",
43
+ "@elementor/editor-documents": "4.0.0-591",
44
+ "@elementor/editor-styles-repository": "4.0.0-591",
45
+ "@elementor/editor-v1-adapters": "4.0.0-591",
46
+ "@elementor/store": "4.0.0-591"
47
+ },
48
+ "devDependencies": {
49
+ "tsup": "^8.3.5"
50
+ },
51
+ "peerDependencies": {
52
+ "react": "^18.3.1"
53
+ }
54
+ }
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { init } from './init';
2
+ export { useLoadedTemplates } from './use-loaded-templates';
package/src/init.ts ADDED
@@ -0,0 +1,26 @@
1
+ import { injectIntoLogic } from '@elementor/editor';
2
+ import { stylesRepository } from '@elementor/editor-styles-repository';
3
+ import { registerDataHook } from '@elementor/editor-v1-adapters';
4
+ import { __registerSlice as registerSlice } from '@elementor/store';
5
+
6
+ import { loadTemplates, unloadTemplates } from './load-templates';
7
+ import { RenderTemplateStyles } from './render-template-styles';
8
+ import { slice } from './store';
9
+ import { clearTemplatesStyles, templatesStylesProvider } from './templates-styles-provider';
10
+
11
+ export function init() {
12
+ registerSlice( slice );
13
+ stylesRepository.register( templatesStylesProvider );
14
+
15
+ registerDataHook( 'after', 'editor/documents/attach-preview', async () => {
16
+ unloadTemplates();
17
+ clearTemplatesStyles();
18
+
19
+ await loadTemplates();
20
+ } );
21
+
22
+ injectIntoLogic( {
23
+ id: 'templates-styles',
24
+ component: RenderTemplateStyles,
25
+ } );
26
+ }
@@ -0,0 +1,60 @@
1
+ import { type Document, getV1CurrentDocument } from '@elementor/editor-documents';
2
+ import { ajax, getCanvasIframeDocument } from '@elementor/editor-v1-adapters';
3
+ import { __dispatch as dispatch } from '@elementor/store';
4
+
5
+ import { slice } from './store';
6
+
7
+ const TEMPLATE_ATTRIBUTE = 'data-elementor-post-type="elementor_library"';
8
+ const DOCUMENT_WRAPPER_ATTR = 'data-elementor-id';
9
+
10
+ export async function loadTemplates() {
11
+ const iframeDocument = getCanvasIframeDocument();
12
+
13
+ if ( ! iframeDocument ) {
14
+ return;
15
+ }
16
+
17
+ const currentDocumentId = getV1CurrentDocument()?.id;
18
+ const templateIds = getTemplateIds( iframeDocument, currentDocumentId );
19
+
20
+ if ( ! templateIds.length ) {
21
+ return;
22
+ }
23
+
24
+ const documents = await fetchDocuments( templateIds );
25
+
26
+ dispatch( slice.actions.setTemplates( documents ) );
27
+ }
28
+
29
+ export function unloadTemplates() {
30
+ dispatch( slice.actions.clearTemplates() );
31
+ }
32
+
33
+ function getTemplateIds( iframeDocument: globalThis.Document, currentDocumentId?: number ): number[] {
34
+ const elements = [ ...iframeDocument.body.querySelectorAll< HTMLElement >( `[${ TEMPLATE_ATTRIBUTE }]` ) ];
35
+
36
+ const ids = elements
37
+ .map( ( el ) => Number( el.getAttribute( DOCUMENT_WRAPPER_ATTR ) ) )
38
+ .filter( ( id ) => ! isNaN( id ) && id !== currentDocumentId );
39
+
40
+ return [ ...new Set( ids ) ];
41
+ }
42
+
43
+ async function fetchDocuments( ids: number[] ): Promise< Document[] > {
44
+ const results = await Promise.all(
45
+ ids.map( async ( id ) => {
46
+ try {
47
+ // using ajax.load instead of the document-manager as the latter causes an issue when trying to edit a template
48
+ return await ajax.load< { id: number }, Document >( {
49
+ data: { id },
50
+ action: 'get_document_config',
51
+ unique_id: `template-${ id }`,
52
+ } );
53
+ } catch {
54
+ return null;
55
+ }
56
+ } )
57
+ );
58
+
59
+ return results.filter( ( doc ): doc is Document => doc !== null );
60
+ }
@@ -0,0 +1,33 @@
1
+ import { useEffect } from 'react';
2
+ import { type V1ElementData } from '@elementor/editor-elements';
3
+ import { type StyleDefinition } from '@elementor/editor-styles';
4
+
5
+ import { addTemplateStyles } from './templates-styles-provider';
6
+ import { useLoadedTemplates } from './use-loaded-templates';
7
+
8
+ export const RenderTemplateStyles = () => {
9
+ const templates = useLoadedTemplates();
10
+
11
+ useEffect( () => {
12
+ const styles = templates.flatMap( extractStylesFromDocument );
13
+
14
+ addTemplateStyles( styles );
15
+ }, [ templates ] );
16
+
17
+ return null;
18
+ };
19
+
20
+ function extractStylesFromDocument( elements: V1ElementData[] ): StyleDefinition[] {
21
+ if ( ! elements.length ) {
22
+ return [];
23
+ }
24
+
25
+ return elements.flatMap( extractStylesFromElement );
26
+ }
27
+
28
+ function extractStylesFromElement( element: V1ElementData ): StyleDefinition[] {
29
+ return [
30
+ ...Object.values( element.styles ?? {} ),
31
+ ...( element.elements ?? [] ).flatMap( extractStylesFromElement ),
32
+ ];
33
+ }
package/src/store.ts ADDED
@@ -0,0 +1,35 @@
1
+ import { type Document } from '@elementor/editor-documents';
2
+ import { type V1ElementData } from '@elementor/editor-elements';
3
+ import { __createSelector, __createSlice, type PayloadAction, type SliceState } from '@elementor/store';
4
+
5
+ type State = {
6
+ entities: Record< Document[ 'id' ], V1ElementData[] >;
7
+ };
8
+
9
+ const initialState: State = {
10
+ entities: {},
11
+ };
12
+
13
+ export const slice = __createSlice( {
14
+ name: 'templates',
15
+ initialState,
16
+ reducers: {
17
+ setTemplates( state, action: PayloadAction< Document[] > ) {
18
+ action.payload.forEach( ( doc ) => {
19
+ state.entities[ doc.id ] = doc.elements ?? [];
20
+ } );
21
+ },
22
+
23
+ clearTemplates( state ) {
24
+ state.entities = {};
25
+ },
26
+ },
27
+ } );
28
+
29
+ export type Slice = SliceState< typeof slice >;
30
+
31
+ const selectEntities = ( state: Slice ) => state.templates.entities;
32
+
33
+ export const selectTemplates = __createSelector( [ selectEntities ], ( entities ): V1ElementData[][] =>
34
+ Object.values( entities )
35
+ );
@@ -0,0 +1,31 @@
1
+ import { type StyleDefinition } from '@elementor/editor-styles';
2
+ import { createStylesProvider } from '@elementor/editor-styles-repository';
3
+
4
+ let styles: StyleDefinition[] = [];
5
+ const listeners = new Set< () => void >();
6
+
7
+ export function addTemplateStyles( newStyles: StyleDefinition[] ) {
8
+ styles = [ ...styles, ...newStyles ];
9
+ listeners.forEach( ( cb ) => cb() );
10
+ }
11
+
12
+ export function clearTemplatesStyles() {
13
+ styles = [];
14
+ listeners.forEach( ( cb ) => cb() );
15
+ }
16
+
17
+ export const templatesStylesProvider = createStylesProvider( {
18
+ key: 'templates-styles',
19
+ priority: 50,
20
+ subscribe: ( cb ) => {
21
+ listeners.add( cb );
22
+
23
+ return () => {
24
+ listeners.delete( cb );
25
+ };
26
+ },
27
+ actions: {
28
+ all: () => styles,
29
+ get: ( id ) => styles.find( ( style ) => style.id === id ) ?? null,
30
+ },
31
+ } );
@@ -0,0 +1,7 @@
1
+ import { __useSelector as useSelector } from '@elementor/store';
2
+
3
+ import { selectTemplates } from './store';
4
+
5
+ export function useLoadedTemplates() {
6
+ return useSelector( selectTemplates );
7
+ }