@elementor/editor-documents 0.1.0

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,71 @@
1
+ declare function useActiveDocument(): Document | null;
2
+
3
+ declare function useActiveDocumentActions(): {
4
+ save: () => Promise<any>;
5
+ saveDraft: () => Promise<any>;
6
+ saveTemplate: () => Promise<void>;
7
+ };
8
+
9
+ declare function useHostDocument(): Document | null;
10
+
11
+ type Document = {
12
+ id: number;
13
+ title: string;
14
+ type: {
15
+ value: string;
16
+ label: string;
17
+ };
18
+ status: {
19
+ value: string;
20
+ label: string;
21
+ };
22
+ isDirty: boolean;
23
+ isSaving: boolean;
24
+ isSavingDraft: boolean;
25
+ userCan: {
26
+ publish?: boolean;
27
+ };
28
+ };
29
+ type ExtendedWindow = Window & {
30
+ elementor: {
31
+ documents: {
32
+ documents: Record<string, V1Document>;
33
+ getCurrentId: () => number;
34
+ getInitialId: () => number;
35
+ getCurrent: () => V1Document;
36
+ };
37
+ };
38
+ };
39
+ type V1Document = {
40
+ id: number;
41
+ config: {
42
+ type: string;
43
+ user: {
44
+ can_publish: boolean;
45
+ };
46
+ revisions: {
47
+ current_id: number;
48
+ };
49
+ panel: {
50
+ title: string;
51
+ };
52
+ status: {
53
+ value: string;
54
+ label: string;
55
+ };
56
+ };
57
+ editor: {
58
+ isChanged: boolean;
59
+ isSaving: boolean;
60
+ };
61
+ container: {
62
+ settings: V1Model<{
63
+ post_title: string;
64
+ }>;
65
+ };
66
+ };
67
+ type V1Model<T> = {
68
+ get: <K extends keyof T = keyof T>(key: K) => T[K];
69
+ };
70
+
71
+ export { Document, ExtendedWindow, V1Document, useActiveDocument, useActiveDocumentActions, useHostDocument };
package/dist/index.js ADDED
@@ -0,0 +1,269 @@
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 src_exports = {};
22
+ __export(src_exports, {
23
+ useActiveDocument: () => useActiveDocument,
24
+ useActiveDocumentActions: () => useActiveDocumentActions,
25
+ useHostDocument: () => useHostDocument
26
+ });
27
+ module.exports = __toCommonJS(src_exports);
28
+
29
+ // src/sync/sync-store.ts
30
+ var import_store = require("@elementor/store");
31
+
32
+ // src/sync/utils.ts
33
+ function getV1DocumentsManager() {
34
+ const documentsManager = window.elementor?.documents;
35
+ if (!documentsManager) {
36
+ throw new Error("Elementor Editor V1 documents manager not found");
37
+ }
38
+ return documentsManager;
39
+ }
40
+ function normalizeV1Document(documentData) {
41
+ const isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;
42
+ return {
43
+ id: documentData.id,
44
+ title: documentData.container.settings.get("post_title"),
45
+ type: {
46
+ value: documentData.config.type,
47
+ label: documentData.config.panel.title
48
+ },
49
+ status: {
50
+ value: documentData.config.status.value,
51
+ label: documentData.config.status.label
52
+ },
53
+ isDirty: documentData.editor.isChanged || isUnpublishedRevision,
54
+ isSaving: documentData.editor.isSaving,
55
+ isSavingDraft: false,
56
+ userCan: {
57
+ publish: documentData.config.user.can_publish
58
+ }
59
+ };
60
+ }
61
+
62
+ // src/sync/sync-store.ts
63
+ var import_editor_v1_adapters = require("@elementor/editor-v1-adapters");
64
+ function syncStore(slice) {
65
+ syncInitialization(slice);
66
+ syncActiveDocument(slice);
67
+ syncOnDocumentSave(slice);
68
+ syncOnDocumentChange(slice);
69
+ }
70
+ function syncInitialization(slice) {
71
+ const { init: init2 } = slice.actions;
72
+ (0, import_editor_v1_adapters.listenTo)(
73
+ (0, import_editor_v1_adapters.v1ReadyEvent)(),
74
+ () => {
75
+ const documentsManager = getV1DocumentsManager();
76
+ const entities = Object.entries(documentsManager.documents).reduce((acc, [id, document]) => {
77
+ acc[id] = normalizeV1Document(document);
78
+ return acc;
79
+ }, {});
80
+ (0, import_store.dispatch)(init2({
81
+ entities,
82
+ hostId: documentsManager.getInitialId(),
83
+ activeId: documentsManager.getCurrentId()
84
+ }));
85
+ }
86
+ );
87
+ }
88
+ function syncActiveDocument(slice) {
89
+ const { activateDocument } = slice.actions;
90
+ (0, import_editor_v1_adapters.listenTo)(
91
+ (0, import_editor_v1_adapters.commandEndEvent)("editor/documents/open"),
92
+ () => {
93
+ const documentsManager = getV1DocumentsManager();
94
+ const currentDocument = normalizeV1Document(documentsManager.getCurrent());
95
+ (0, import_store.dispatch)(activateDocument(currentDocument));
96
+ }
97
+ );
98
+ }
99
+ function syncOnDocumentSave(slice) {
100
+ const { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;
101
+ const isDraft = (e) => {
102
+ const event = e;
103
+ return event.args?.status === "autosave";
104
+ };
105
+ (0, import_editor_v1_adapters.listenTo)(
106
+ (0, import_editor_v1_adapters.commandStartEvent)("document/save/save"),
107
+ (e) => {
108
+ if (isDraft(e)) {
109
+ (0, import_store.dispatch)(startSavingDraft());
110
+ return;
111
+ }
112
+ (0, import_store.dispatch)(startSaving());
113
+ }
114
+ );
115
+ (0, import_editor_v1_adapters.listenTo)(
116
+ (0, import_editor_v1_adapters.commandEndEvent)("document/save/save"),
117
+ (e) => {
118
+ const activeDocument = normalizeV1Document(
119
+ getV1DocumentsManager().getCurrent()
120
+ );
121
+ if (isDraft(e)) {
122
+ (0, import_store.dispatch)(endSavingDraft(activeDocument));
123
+ } else {
124
+ (0, import_store.dispatch)(endSaving(activeDocument));
125
+ }
126
+ }
127
+ );
128
+ }
129
+ function syncOnDocumentChange(slice) {
130
+ const { markAsDirty, markAsPristine } = slice.actions;
131
+ (0, import_editor_v1_adapters.listenTo)(
132
+ (0, import_editor_v1_adapters.commandEndEvent)("document/save/set-is-modified"),
133
+ () => {
134
+ const currentDocument = getV1DocumentsManager().getCurrent();
135
+ if (currentDocument.editor.isChanged) {
136
+ (0, import_store.dispatch)(markAsDirty());
137
+ return;
138
+ }
139
+ (0, import_store.dispatch)(markAsPristine());
140
+ }
141
+ );
142
+ }
143
+
144
+ // src/store/index.ts
145
+ var import_store2 = require("@elementor/store");
146
+ var initialState = {
147
+ entities: {},
148
+ activeId: null,
149
+ hostId: null
150
+ };
151
+ function hasActiveEntity(state) {
152
+ return !!(state.activeId && state.entities[state.activeId]);
153
+ }
154
+ function createSlice() {
155
+ return (0, import_store2.addSlice)({
156
+ name: "documents",
157
+ initialState,
158
+ reducers: {
159
+ init(state, { payload }) {
160
+ state.entities = payload.entities;
161
+ state.hostId = payload.hostId;
162
+ state.activeId = payload.activeId;
163
+ },
164
+ activateDocument(state, action) {
165
+ state.entities[action.payload.id] = action.payload;
166
+ state.activeId = action.payload.id;
167
+ },
168
+ startSaving(state) {
169
+ if (hasActiveEntity(state)) {
170
+ state.entities[state.activeId].isSaving = true;
171
+ }
172
+ },
173
+ endSaving(state, action) {
174
+ if (hasActiveEntity(state)) {
175
+ state.entities[state.activeId] = {
176
+ ...action.payload,
177
+ isSaving: false
178
+ };
179
+ }
180
+ },
181
+ startSavingDraft: (state) => {
182
+ if (hasActiveEntity(state)) {
183
+ state.entities[state.activeId].isSavingDraft = true;
184
+ }
185
+ },
186
+ endSavingDraft(state, action) {
187
+ if (hasActiveEntity(state)) {
188
+ state.entities[state.activeId] = {
189
+ ...action.payload,
190
+ isSavingDraft: false
191
+ };
192
+ }
193
+ },
194
+ markAsDirty(state) {
195
+ if (hasActiveEntity(state)) {
196
+ state.entities[state.activeId].isDirty = true;
197
+ }
198
+ },
199
+ markAsPristine(state) {
200
+ if (hasActiveEntity(state)) {
201
+ state.entities[state.activeId].isDirty = false;
202
+ }
203
+ }
204
+ }
205
+ });
206
+ }
207
+
208
+ // src/init.ts
209
+ function init() {
210
+ initStore();
211
+ }
212
+ function initStore() {
213
+ const slice = createSlice();
214
+ syncStore(slice);
215
+ }
216
+
217
+ // src/hooks/use-active-document.ts
218
+ var import_store5 = require("@elementor/store");
219
+
220
+ // src/store/selectors.ts
221
+ var import_store4 = require("@elementor/store");
222
+ var selectEntities = (state) => state.documents.entities;
223
+ var selectActiveId = (state) => state.documents.activeId;
224
+ var selectHostId = (state) => state.documents.hostId;
225
+ var selectActiveDocument = (0, import_store4.createSelector)(
226
+ selectEntities,
227
+ selectActiveId,
228
+ (entities, activeId) => activeId && entities[activeId] ? entities[activeId] : null
229
+ );
230
+ var selectHostDocument = (0, import_store4.createSelector)(
231
+ selectEntities,
232
+ selectHostId,
233
+ (entities, hostId) => hostId && entities[hostId] ? entities[hostId] : null
234
+ );
235
+
236
+ // src/hooks/use-active-document.ts
237
+ function useActiveDocument() {
238
+ return (0, import_store5.useSelector)(selectActiveDocument);
239
+ }
240
+
241
+ // src/hooks/use-active-document-actions.ts
242
+ var import_react = require("react");
243
+ var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
244
+ function useActiveDocumentActions() {
245
+ const save = (0, import_react.useCallback)(() => (0, import_editor_v1_adapters2.runCommand)("document/save/default"), []);
246
+ const saveDraft = (0, import_react.useCallback)(() => (0, import_editor_v1_adapters2.runCommand)("document/save/draft"), []);
247
+ const saveTemplate = (0, import_react.useCallback)(() => (0, import_editor_v1_adapters2.openRoute)("library/save-template"), []);
248
+ return {
249
+ save,
250
+ saveDraft,
251
+ saveTemplate
252
+ };
253
+ }
254
+
255
+ // src/hooks/use-host-document.ts
256
+ var import_store6 = require("@elementor/store");
257
+ function useHostDocument() {
258
+ return (0, import_store6.useSelector)(selectHostDocument);
259
+ }
260
+
261
+ // src/index.ts
262
+ init();
263
+ // Annotate the CommonJS export names for ESM import in node:
264
+ 0 && (module.exports = {
265
+ useActiveDocument,
266
+ useActiveDocumentActions,
267
+ useHostDocument
268
+ });
269
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/sync/sync-store.ts","../src/sync/utils.ts","../src/store/index.ts","../src/init.ts","../src/hooks/use-active-document.ts","../src/store/selectors.ts","../src/hooks/use-active-document-actions.ts","../src/hooks/use-host-document.ts"],"sourcesContent":["import init from './init';\n\nexport * from './hooks';\nexport * from './types';\n\ninit();\n","import { Slice } from '../store';\nimport { Document } from '../types';\nimport { dispatch } from '@elementor/store';\nimport { normalizeV1Document, getV1DocumentsManager } from './utils';\nimport {\n\tcommandEndEvent,\n\tCommandEvent,\n\tcommandStartEvent,\n\tListenerEvent,\n\tlistenTo,\n\tv1ReadyEvent,\n} from '@elementor/editor-v1-adapters';\n\nexport function syncStore( slice: Slice ) {\n\tsyncInitialization( slice );\n\tsyncActiveDocument( slice );\n\tsyncOnDocumentSave( slice );\n\tsyncOnDocumentChange( slice );\n}\n\nfunction syncInitialization( slice: Slice ) {\n\tconst { init } = slice.actions;\n\n\tlistenTo(\n\t\tv1ReadyEvent(),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\n\t\t\tconst entities = Object.entries( documentsManager.documents )\n\t\t\t\t.reduce( ( acc: Record<string, Document>, [ id, document ] ) => {\n\t\t\t\t\tacc[ id ] = normalizeV1Document( document );\n\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {} );\n\n\t\t\tdispatch( init( {\n\t\t\t\tentities,\n\t\t\t\thostId: documentsManager.getInitialId(),\n\t\t\t\tactiveId: documentsManager.getCurrentId(),\n\t\t\t} ) );\n\t\t}\n\t);\n}\n\nfunction syncActiveDocument( slice: Slice ) {\n\tconst { activateDocument } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'editor/documents/open' ),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\t\t\tconst currentDocument = normalizeV1Document( documentsManager.getCurrent() );\n\n\t\t\tdispatch( activateDocument( currentDocument ) );\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentSave( slice: Slice ) {\n\tconst { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;\n\n\tconst isDraft = ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ status: string }>;\n\n\t\t/**\n\t\t * @see https://github.com/elementor/elementor/blob/5f815d40a/assets/dev/js/editor/document/save/hooks/ui/save/before.js#L18-L22\n\t\t */\n\t\treturn event.args?.status === 'autosave';\n\t};\n\n\tlistenTo(\n\t\tcommandStartEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( startSavingDraft() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( startSaving() );\n\t\t}\n\t);\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tconst activeDocument = normalizeV1Document(\n\t\t\t\tgetV1DocumentsManager().getCurrent()\n\t\t\t);\n\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( endSavingDraft( activeDocument ) );\n\t\t\t} else {\n\t\t\t\tdispatch( endSaving( activeDocument ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentChange( slice: Slice ) {\n\tconst { markAsDirty, markAsPristine } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/set-is-modified' ),\n\t\t() => {\n\t\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\n\t\t\tif ( currentDocument.editor.isChanged ) {\n\t\t\t\tdispatch( markAsDirty() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( markAsPristine() );\n\t\t}\n\t);\n}\n","import { Document, ExtendedWindow, V1Document } from '../types';\n\nexport function getV1DocumentsManager() {\n\tconst documentsManager = ( window as unknown as ExtendedWindow ).elementor?.documents;\n\n\tif ( ! documentsManager ) {\n\t\tthrow new Error( 'Elementor Editor V1 documents manager not found' );\n\t}\n\n\treturn documentsManager;\n}\n\nexport function normalizeV1Document( documentData: V1Document ): Document {\n\t// Draft or autosave.\n\tconst isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;\n\n\treturn {\n\t\tid: documentData.id,\n\t\ttitle: documentData.container.settings.get( 'post_title' ),\n\t\ttype: {\n\t\t\tvalue: documentData.config.type,\n\t\t\tlabel: documentData.config.panel.title,\n\t\t},\n\t\tstatus: {\n\t\t\tvalue: documentData.config.status.value,\n\t\t\tlabel: documentData.config.status.label,\n\t\t},\n\t\tisDirty: documentData.editor.isChanged || isUnpublishedRevision,\n\t\tisSaving: documentData.editor.isSaving,\n\t\tisSavingDraft: false,\n\t\tuserCan: {\n\t\t\tpublish: documentData.config.user.can_publish,\n\t\t},\n\t};\n}\n","import { Document } from '../types';\nimport { addSlice, PayloadAction } from '@elementor/store';\n\ntype State = {\n\tentities: Record<Document['id'], Document>,\n\tactiveId: Document['id'] | null, // The currently editing document.\n\thostId: Document['id'] | null, // The document that host all the other documents.\n}\n\nexport type Slice = ReturnType<typeof createSlice>;\n\nconst initialState: State = {\n\tentities: {},\n\tactiveId: null,\n\thostId: null,\n};\n\ntype StateWithActiveId = Omit<State, 'activeId'> & { activeId: NonNullable<State['activeId']> };\n\nfunction hasActiveEntity( state: State ): state is StateWithActiveId {\n\treturn !! ( state.activeId && state.entities[ state.activeId ] );\n}\n\nexport function createSlice() {\n\treturn addSlice( {\n\t\tname: 'documents',\n\t\tinitialState,\n\t\treducers: {\n\t\t\tinit( state, { payload } : PayloadAction<State> ) {\n\t\t\t\tstate.entities = payload.entities;\n\t\t\t\tstate.hostId = payload.hostId;\n\t\t\t\tstate.activeId = payload.activeId;\n\t\t\t},\n\n\t\t\tactivateDocument( state, action: PayloadAction<Document> ) {\n\t\t\t\tstate.entities[ action.payload.id ] = action.payload;\n\t\t\t\tstate.activeId = action.payload.id;\n\t\t\t},\n\n\t\t\tstartSaving( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSaving = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSaving( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSaving: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tstartSavingDraft: ( state ) => {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSavingDraft = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSavingDraft( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSavingDraft: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsDirty( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsPristine( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = false;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t} );\n}\n","import { syncStore } from './sync';\nimport { createSlice } from './store';\n\nexport default function init() {\n\tinitStore();\n}\n\nfunction initStore() {\n\tconst slice = createSlice();\n\n\tsyncStore( slice );\n}\n","import { useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import type { Slice } from './index';\nimport { createSelector, SliceState } from '@elementor/store';\n\ntype State = SliceState<Slice>;\n\nconst selectEntities = ( state: State ) => state.documents.entities;\nconst selectActiveId = ( state: State ) => state.documents.activeId;\nconst selectHostId = ( state: State ) => state.documents.hostId;\n\nexport const selectActiveDocument = createSelector(\n\tselectEntities,\n\tselectActiveId,\n\t( entities, activeId ) => activeId && entities[ activeId ]\n\t\t? entities[ activeId ]\n\t\t: null,\n);\n\nexport const selectHostDocument = createSelector(\n\tselectEntities,\n\tselectHostId,\n\t( entities, hostId ) => hostId && entities[ hostId ]\n\t\t? entities[ hostId ]\n\t\t: null,\n);\n","import { useCallback } from 'react';\nimport { openRoute, runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useActiveDocumentActions() {\n\tconst save = useCallback( () => runCommand( 'document/save/default' ), [] );\n\n\tconst saveDraft = useCallback( () => runCommand( 'document/save/draft' ), [] );\n\n\tconst saveTemplate = useCallback( () => openRoute( 'library/save-template' ), [] );\n\n\treturn {\n\t\tsave,\n\t\tsaveDraft,\n\t\tsaveTemplate,\n\t};\n}\n","import { useSelector } from '@elementor/store';\nimport { selectHostDocument } from '../store/selectors';\n\nexport default function useHostDocument() {\n\treturn useSelector( selectHostDocument );\n}\n"],"mappings":"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","names":["init","import_store","import_store","import_store","import_editor_v1_adapters","import_store"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,245 @@
1
+ // src/sync/sync-store.ts
2
+ import { dispatch } from "@elementor/store";
3
+
4
+ // src/sync/utils.ts
5
+ function getV1DocumentsManager() {
6
+ const documentsManager = window.elementor?.documents;
7
+ if (!documentsManager) {
8
+ throw new Error("Elementor Editor V1 documents manager not found");
9
+ }
10
+ return documentsManager;
11
+ }
12
+ function normalizeV1Document(documentData) {
13
+ const isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;
14
+ return {
15
+ id: documentData.id,
16
+ title: documentData.container.settings.get("post_title"),
17
+ type: {
18
+ value: documentData.config.type,
19
+ label: documentData.config.panel.title
20
+ },
21
+ status: {
22
+ value: documentData.config.status.value,
23
+ label: documentData.config.status.label
24
+ },
25
+ isDirty: documentData.editor.isChanged || isUnpublishedRevision,
26
+ isSaving: documentData.editor.isSaving,
27
+ isSavingDraft: false,
28
+ userCan: {
29
+ publish: documentData.config.user.can_publish
30
+ }
31
+ };
32
+ }
33
+
34
+ // src/sync/sync-store.ts
35
+ import {
36
+ commandEndEvent,
37
+ commandStartEvent,
38
+ listenTo,
39
+ v1ReadyEvent
40
+ } from "@elementor/editor-v1-adapters";
41
+ function syncStore(slice) {
42
+ syncInitialization(slice);
43
+ syncActiveDocument(slice);
44
+ syncOnDocumentSave(slice);
45
+ syncOnDocumentChange(slice);
46
+ }
47
+ function syncInitialization(slice) {
48
+ const { init: init2 } = slice.actions;
49
+ listenTo(
50
+ v1ReadyEvent(),
51
+ () => {
52
+ const documentsManager = getV1DocumentsManager();
53
+ const entities = Object.entries(documentsManager.documents).reduce((acc, [id, document]) => {
54
+ acc[id] = normalizeV1Document(document);
55
+ return acc;
56
+ }, {});
57
+ dispatch(init2({
58
+ entities,
59
+ hostId: documentsManager.getInitialId(),
60
+ activeId: documentsManager.getCurrentId()
61
+ }));
62
+ }
63
+ );
64
+ }
65
+ function syncActiveDocument(slice) {
66
+ const { activateDocument } = slice.actions;
67
+ listenTo(
68
+ commandEndEvent("editor/documents/open"),
69
+ () => {
70
+ const documentsManager = getV1DocumentsManager();
71
+ const currentDocument = normalizeV1Document(documentsManager.getCurrent());
72
+ dispatch(activateDocument(currentDocument));
73
+ }
74
+ );
75
+ }
76
+ function syncOnDocumentSave(slice) {
77
+ const { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;
78
+ const isDraft = (e) => {
79
+ const event = e;
80
+ return event.args?.status === "autosave";
81
+ };
82
+ listenTo(
83
+ commandStartEvent("document/save/save"),
84
+ (e) => {
85
+ if (isDraft(e)) {
86
+ dispatch(startSavingDraft());
87
+ return;
88
+ }
89
+ dispatch(startSaving());
90
+ }
91
+ );
92
+ listenTo(
93
+ commandEndEvent("document/save/save"),
94
+ (e) => {
95
+ const activeDocument = normalizeV1Document(
96
+ getV1DocumentsManager().getCurrent()
97
+ );
98
+ if (isDraft(e)) {
99
+ dispatch(endSavingDraft(activeDocument));
100
+ } else {
101
+ dispatch(endSaving(activeDocument));
102
+ }
103
+ }
104
+ );
105
+ }
106
+ function syncOnDocumentChange(slice) {
107
+ const { markAsDirty, markAsPristine } = slice.actions;
108
+ listenTo(
109
+ commandEndEvent("document/save/set-is-modified"),
110
+ () => {
111
+ const currentDocument = getV1DocumentsManager().getCurrent();
112
+ if (currentDocument.editor.isChanged) {
113
+ dispatch(markAsDirty());
114
+ return;
115
+ }
116
+ dispatch(markAsPristine());
117
+ }
118
+ );
119
+ }
120
+
121
+ // src/store/index.ts
122
+ import { addSlice } from "@elementor/store";
123
+ var initialState = {
124
+ entities: {},
125
+ activeId: null,
126
+ hostId: null
127
+ };
128
+ function hasActiveEntity(state) {
129
+ return !!(state.activeId && state.entities[state.activeId]);
130
+ }
131
+ function createSlice() {
132
+ return addSlice({
133
+ name: "documents",
134
+ initialState,
135
+ reducers: {
136
+ init(state, { payload }) {
137
+ state.entities = payload.entities;
138
+ state.hostId = payload.hostId;
139
+ state.activeId = payload.activeId;
140
+ },
141
+ activateDocument(state, action) {
142
+ state.entities[action.payload.id] = action.payload;
143
+ state.activeId = action.payload.id;
144
+ },
145
+ startSaving(state) {
146
+ if (hasActiveEntity(state)) {
147
+ state.entities[state.activeId].isSaving = true;
148
+ }
149
+ },
150
+ endSaving(state, action) {
151
+ if (hasActiveEntity(state)) {
152
+ state.entities[state.activeId] = {
153
+ ...action.payload,
154
+ isSaving: false
155
+ };
156
+ }
157
+ },
158
+ startSavingDraft: (state) => {
159
+ if (hasActiveEntity(state)) {
160
+ state.entities[state.activeId].isSavingDraft = true;
161
+ }
162
+ },
163
+ endSavingDraft(state, action) {
164
+ if (hasActiveEntity(state)) {
165
+ state.entities[state.activeId] = {
166
+ ...action.payload,
167
+ isSavingDraft: false
168
+ };
169
+ }
170
+ },
171
+ markAsDirty(state) {
172
+ if (hasActiveEntity(state)) {
173
+ state.entities[state.activeId].isDirty = true;
174
+ }
175
+ },
176
+ markAsPristine(state) {
177
+ if (hasActiveEntity(state)) {
178
+ state.entities[state.activeId].isDirty = false;
179
+ }
180
+ }
181
+ }
182
+ });
183
+ }
184
+
185
+ // src/init.ts
186
+ function init() {
187
+ initStore();
188
+ }
189
+ function initStore() {
190
+ const slice = createSlice();
191
+ syncStore(slice);
192
+ }
193
+
194
+ // src/hooks/use-active-document.ts
195
+ import { useSelector } from "@elementor/store";
196
+
197
+ // src/store/selectors.ts
198
+ import { createSelector } from "@elementor/store";
199
+ var selectEntities = (state) => state.documents.entities;
200
+ var selectActiveId = (state) => state.documents.activeId;
201
+ var selectHostId = (state) => state.documents.hostId;
202
+ var selectActiveDocument = createSelector(
203
+ selectEntities,
204
+ selectActiveId,
205
+ (entities, activeId) => activeId && entities[activeId] ? entities[activeId] : null
206
+ );
207
+ var selectHostDocument = createSelector(
208
+ selectEntities,
209
+ selectHostId,
210
+ (entities, hostId) => hostId && entities[hostId] ? entities[hostId] : null
211
+ );
212
+
213
+ // src/hooks/use-active-document.ts
214
+ function useActiveDocument() {
215
+ return useSelector(selectActiveDocument);
216
+ }
217
+
218
+ // src/hooks/use-active-document-actions.ts
219
+ import { useCallback } from "react";
220
+ import { openRoute, runCommand } from "@elementor/editor-v1-adapters";
221
+ function useActiveDocumentActions() {
222
+ const save = useCallback(() => runCommand("document/save/default"), []);
223
+ const saveDraft = useCallback(() => runCommand("document/save/draft"), []);
224
+ const saveTemplate = useCallback(() => openRoute("library/save-template"), []);
225
+ return {
226
+ save,
227
+ saveDraft,
228
+ saveTemplate
229
+ };
230
+ }
231
+
232
+ // src/hooks/use-host-document.ts
233
+ import { useSelector as useSelector2 } from "@elementor/store";
234
+ function useHostDocument() {
235
+ return useSelector2(selectHostDocument);
236
+ }
237
+
238
+ // src/index.ts
239
+ init();
240
+ export {
241
+ useActiveDocument,
242
+ useActiveDocumentActions,
243
+ useHostDocument
244
+ };
245
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sync/sync-store.ts","../src/sync/utils.ts","../src/store/index.ts","../src/init.ts","../src/hooks/use-active-document.ts","../src/store/selectors.ts","../src/hooks/use-active-document-actions.ts","../src/hooks/use-host-document.ts","../src/index.ts"],"sourcesContent":["import { Slice } from '../store';\nimport { Document } from '../types';\nimport { dispatch } from '@elementor/store';\nimport { normalizeV1Document, getV1DocumentsManager } from './utils';\nimport {\n\tcommandEndEvent,\n\tCommandEvent,\n\tcommandStartEvent,\n\tListenerEvent,\n\tlistenTo,\n\tv1ReadyEvent,\n} from '@elementor/editor-v1-adapters';\n\nexport function syncStore( slice: Slice ) {\n\tsyncInitialization( slice );\n\tsyncActiveDocument( slice );\n\tsyncOnDocumentSave( slice );\n\tsyncOnDocumentChange( slice );\n}\n\nfunction syncInitialization( slice: Slice ) {\n\tconst { init } = slice.actions;\n\n\tlistenTo(\n\t\tv1ReadyEvent(),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\n\t\t\tconst entities = Object.entries( documentsManager.documents )\n\t\t\t\t.reduce( ( acc: Record<string, Document>, [ id, document ] ) => {\n\t\t\t\t\tacc[ id ] = normalizeV1Document( document );\n\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {} );\n\n\t\t\tdispatch( init( {\n\t\t\t\tentities,\n\t\t\t\thostId: documentsManager.getInitialId(),\n\t\t\t\tactiveId: documentsManager.getCurrentId(),\n\t\t\t} ) );\n\t\t}\n\t);\n}\n\nfunction syncActiveDocument( slice: Slice ) {\n\tconst { activateDocument } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'editor/documents/open' ),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\t\t\tconst currentDocument = normalizeV1Document( documentsManager.getCurrent() );\n\n\t\t\tdispatch( activateDocument( currentDocument ) );\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentSave( slice: Slice ) {\n\tconst { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;\n\n\tconst isDraft = ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ status: string }>;\n\n\t\t/**\n\t\t * @see https://github.com/elementor/elementor/blob/5f815d40a/assets/dev/js/editor/document/save/hooks/ui/save/before.js#L18-L22\n\t\t */\n\t\treturn event.args?.status === 'autosave';\n\t};\n\n\tlistenTo(\n\t\tcommandStartEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( startSavingDraft() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( startSaving() );\n\t\t}\n\t);\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tconst activeDocument = normalizeV1Document(\n\t\t\t\tgetV1DocumentsManager().getCurrent()\n\t\t\t);\n\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( endSavingDraft( activeDocument ) );\n\t\t\t} else {\n\t\t\t\tdispatch( endSaving( activeDocument ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentChange( slice: Slice ) {\n\tconst { markAsDirty, markAsPristine } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/set-is-modified' ),\n\t\t() => {\n\t\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\n\t\t\tif ( currentDocument.editor.isChanged ) {\n\t\t\t\tdispatch( markAsDirty() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( markAsPristine() );\n\t\t}\n\t);\n}\n","import { Document, ExtendedWindow, V1Document } from '../types';\n\nexport function getV1DocumentsManager() {\n\tconst documentsManager = ( window as unknown as ExtendedWindow ).elementor?.documents;\n\n\tif ( ! documentsManager ) {\n\t\tthrow new Error( 'Elementor Editor V1 documents manager not found' );\n\t}\n\n\treturn documentsManager;\n}\n\nexport function normalizeV1Document( documentData: V1Document ): Document {\n\t// Draft or autosave.\n\tconst isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;\n\n\treturn {\n\t\tid: documentData.id,\n\t\ttitle: documentData.container.settings.get( 'post_title' ),\n\t\ttype: {\n\t\t\tvalue: documentData.config.type,\n\t\t\tlabel: documentData.config.panel.title,\n\t\t},\n\t\tstatus: {\n\t\t\tvalue: documentData.config.status.value,\n\t\t\tlabel: documentData.config.status.label,\n\t\t},\n\t\tisDirty: documentData.editor.isChanged || isUnpublishedRevision,\n\t\tisSaving: documentData.editor.isSaving,\n\t\tisSavingDraft: false,\n\t\tuserCan: {\n\t\t\tpublish: documentData.config.user.can_publish,\n\t\t},\n\t};\n}\n","import { Document } from '../types';\nimport { addSlice, PayloadAction } from '@elementor/store';\n\ntype State = {\n\tentities: Record<Document['id'], Document>,\n\tactiveId: Document['id'] | null, // The currently editing document.\n\thostId: Document['id'] | null, // The document that host all the other documents.\n}\n\nexport type Slice = ReturnType<typeof createSlice>;\n\nconst initialState: State = {\n\tentities: {},\n\tactiveId: null,\n\thostId: null,\n};\n\ntype StateWithActiveId = Omit<State, 'activeId'> & { activeId: NonNullable<State['activeId']> };\n\nfunction hasActiveEntity( state: State ): state is StateWithActiveId {\n\treturn !! ( state.activeId && state.entities[ state.activeId ] );\n}\n\nexport function createSlice() {\n\treturn addSlice( {\n\t\tname: 'documents',\n\t\tinitialState,\n\t\treducers: {\n\t\t\tinit( state, { payload } : PayloadAction<State> ) {\n\t\t\t\tstate.entities = payload.entities;\n\t\t\t\tstate.hostId = payload.hostId;\n\t\t\t\tstate.activeId = payload.activeId;\n\t\t\t},\n\n\t\t\tactivateDocument( state, action: PayloadAction<Document> ) {\n\t\t\t\tstate.entities[ action.payload.id ] = action.payload;\n\t\t\t\tstate.activeId = action.payload.id;\n\t\t\t},\n\n\t\t\tstartSaving( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSaving = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSaving( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSaving: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tstartSavingDraft: ( state ) => {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSavingDraft = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSavingDraft( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSavingDraft: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsDirty( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsPristine( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = false;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t} );\n}\n","import { syncStore } from './sync';\nimport { createSlice } from './store';\n\nexport default function init() {\n\tinitStore();\n}\n\nfunction initStore() {\n\tconst slice = createSlice();\n\n\tsyncStore( slice );\n}\n","import { useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import type { Slice } from './index';\nimport { createSelector, SliceState } from '@elementor/store';\n\ntype State = SliceState<Slice>;\n\nconst selectEntities = ( state: State ) => state.documents.entities;\nconst selectActiveId = ( state: State ) => state.documents.activeId;\nconst selectHostId = ( state: State ) => state.documents.hostId;\n\nexport const selectActiveDocument = createSelector(\n\tselectEntities,\n\tselectActiveId,\n\t( entities, activeId ) => activeId && entities[ activeId ]\n\t\t? entities[ activeId ]\n\t\t: null,\n);\n\nexport const selectHostDocument = createSelector(\n\tselectEntities,\n\tselectHostId,\n\t( entities, hostId ) => hostId && entities[ hostId ]\n\t\t? entities[ hostId ]\n\t\t: null,\n);\n","import { useCallback } from 'react';\nimport { openRoute, runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useActiveDocumentActions() {\n\tconst save = useCallback( () => runCommand( 'document/save/default' ), [] );\n\n\tconst saveDraft = useCallback( () => runCommand( 'document/save/draft' ), [] );\n\n\tconst saveTemplate = useCallback( () => openRoute( 'library/save-template' ), [] );\n\n\treturn {\n\t\tsave,\n\t\tsaveDraft,\n\t\tsaveTemplate,\n\t};\n}\n","import { useSelector } from '@elementor/store';\nimport { selectHostDocument } from '../store/selectors';\n\nexport default function useHostDocument() {\n\treturn useSelector( selectHostDocument );\n}\n","import init from './init';\n\nexport * from './hooks';\nexport * from './types';\n\ninit();\n"],"mappings":"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","names":["init","useSelector","useSelector"]}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@elementor/editor-documents",
3
+ "version": "0.1.0",
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
+ "import": "./dist/index.mjs",
14
+ "require": "./dist/index.js",
15
+ "types": "./dist/index.d.ts"
16
+ },
17
+ "./package.json": "./package.json"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/elementor/elementor-packages.git",
22
+ "directory": "packages/editor-documents"
23
+ },
24
+ "bugs": {
25
+ "url": "https://github.com/elementor/elementor-packages/issues"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "scripts": {
31
+ "build": "tsup --config=../../tsup.build.ts",
32
+ "dev": "tsup --config=../../tsup.dev.ts"
33
+ },
34
+ "dependencies": {
35
+ "@elementor/editor-v1-adapters": "^0.1.0",
36
+ "@elementor/store": "^0.1.0"
37
+ },
38
+ "peerDependencies": {
39
+ "react": "17.x"
40
+ },
41
+ "elementor": {
42
+ "type": "extension"
43
+ },
44
+ "gitHead": "2ba9f13a9dbd085eb6ed8e6e303e9275ce626b8d"
45
+ }