@elementor/editor-documents 0.10.4 → 0.11.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.
- package/CHANGELOG.md +19 -0
- package/dist/index.d.mts +37 -1
- package/dist/index.d.ts +37 -1
- package/dist/index.js +54 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +52 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/hooks/__tests__/use-active-document-actions.test.ts +12 -3
- package/src/hooks/use-active-document-actions.ts +10 -0
- package/src/index.ts +4 -0
- package/src/sync/__tests__/sync-store.test.ts +74 -8
- package/src/sync/__tests__/test-utils.ts +5 -0
- package/src/sync/sync-store.ts +25 -1
- package/src/sync/utils.ts +31 -1
- package/src/types.ts +15 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,25 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [0.11.0](https://github.com/elementor/elementor-packages/compare/@elementor/editor-documents@0.10.5...@elementor/editor-documents@0.11.0) (2024-05-09)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* conversions - add logic to top bar for links page ([#181](https://github.com/elementor/elementor-packages/issues/181)) ([19b3d82](https://github.com/elementor/elementor-packages/commit/19b3d82b3795917e8d0aaaf40da36309ec83da97))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## [0.10.5](https://github.com/elementor/elementor-packages/compare/@elementor/editor-documents@0.10.4...@elementor/editor-documents@0.10.5) (2024-05-07)
|
|
18
|
+
|
|
19
|
+
**Note:** Version bump only for package @elementor/editor-documents
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
6
25
|
## [0.10.4](https://github.com/elementor/elementor-packages/compare/@elementor/editor-documents@0.10.3...@elementor/editor-documents@0.10.4) (2024-04-16)
|
|
7
26
|
|
|
8
27
|
**Note:** Version bump only for package @elementor/editor-documents
|
package/dist/index.d.mts
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
|
+
import * as _elementor_store from '@elementor/store';
|
|
2
|
+
import { PayloadAction } from '@elementor/store';
|
|
3
|
+
import * as immer_dist_internal from 'immer/dist/internal';
|
|
4
|
+
|
|
1
5
|
declare function useActiveDocument(): Document | null;
|
|
2
6
|
|
|
3
7
|
declare function useActiveDocumentActions(): {
|
|
4
8
|
save: () => Promise<any>;
|
|
5
9
|
saveDraft: () => Promise<any>;
|
|
6
10
|
saveTemplate: () => Promise<unknown>;
|
|
11
|
+
copyAndShare: () => void;
|
|
7
12
|
};
|
|
8
13
|
|
|
9
14
|
declare function useHostDocument(): Document | null;
|
|
10
15
|
|
|
11
16
|
declare function useNavigateToDocument(): (id: number) => Promise<void>;
|
|
12
17
|
|
|
18
|
+
type ExitTo = 'dashboard' | 'all_posts' | 'this_post';
|
|
13
19
|
type Document = {
|
|
14
20
|
id: number;
|
|
15
21
|
title: string;
|
|
@@ -23,6 +29,7 @@ type Document = {
|
|
|
23
29
|
};
|
|
24
30
|
links: {
|
|
25
31
|
platformEdit: string;
|
|
32
|
+
permalink: string;
|
|
26
33
|
};
|
|
27
34
|
isDirty: boolean;
|
|
28
35
|
isSaving: boolean;
|
|
@@ -30,6 +37,10 @@ type Document = {
|
|
|
30
37
|
userCan: {
|
|
31
38
|
publish?: boolean;
|
|
32
39
|
};
|
|
40
|
+
permissions: {
|
|
41
|
+
allowAddingWidgets: boolean;
|
|
42
|
+
showCopyAndShare: boolean;
|
|
43
|
+
};
|
|
33
44
|
};
|
|
34
45
|
type ExtendedWindow = Window & {
|
|
35
46
|
elementor: {
|
|
@@ -39,6 +50,7 @@ type ExtendedWindow = Window & {
|
|
|
39
50
|
getInitialId: () => number;
|
|
40
51
|
getCurrent: () => V1Document;
|
|
41
52
|
};
|
|
53
|
+
getPreferences: (key: 'exit_to') => ExitTo;
|
|
42
54
|
};
|
|
43
55
|
};
|
|
44
56
|
type V1Document = {
|
|
@@ -53,6 +65,8 @@ type V1Document = {
|
|
|
53
65
|
};
|
|
54
66
|
panel: {
|
|
55
67
|
title: string;
|
|
68
|
+
allow_adding_widgets: boolean;
|
|
69
|
+
show_copy_and_share: boolean;
|
|
56
70
|
};
|
|
57
71
|
status: {
|
|
58
72
|
value: string;
|
|
@@ -60,6 +74,9 @@ type V1Document = {
|
|
|
60
74
|
};
|
|
61
75
|
urls: {
|
|
62
76
|
exit_to_dashboard: string;
|
|
77
|
+
permalink: string;
|
|
78
|
+
main_dashboard: string;
|
|
79
|
+
all_post_type: string;
|
|
63
80
|
};
|
|
64
81
|
};
|
|
65
82
|
editor: {
|
|
@@ -69,6 +86,7 @@ type V1Document = {
|
|
|
69
86
|
container: {
|
|
70
87
|
settings: V1Model<{
|
|
71
88
|
post_title: string;
|
|
89
|
+
exit_to: ExitTo;
|
|
72
90
|
}>;
|
|
73
91
|
};
|
|
74
92
|
};
|
|
@@ -76,4 +94,22 @@ type V1Model<T> = {
|
|
|
76
94
|
get: <K extends keyof T = keyof T>(key: K) => T[K];
|
|
77
95
|
};
|
|
78
96
|
|
|
79
|
-
|
|
97
|
+
type State = {
|
|
98
|
+
entities: Record<Document['id'], Document>;
|
|
99
|
+
activeId: Document['id'] | null;
|
|
100
|
+
hostId: Document['id'] | null;
|
|
101
|
+
};
|
|
102
|
+
declare const slice: _elementor_store.Slice<State, {
|
|
103
|
+
init(state: immer_dist_internal.WritableDraft<State>, { payload }: PayloadAction<State>): void;
|
|
104
|
+
activateDocument(state: immer_dist_internal.WritableDraft<State>, action: PayloadAction<Document>): void;
|
|
105
|
+
setAsHost(state: immer_dist_internal.WritableDraft<State>, action: PayloadAction<Document['id']>): void;
|
|
106
|
+
updateActiveDocument(state: immer_dist_internal.WritableDraft<State>, action: PayloadAction<Partial<Document>>): void;
|
|
107
|
+
startSaving(state: immer_dist_internal.WritableDraft<State>): void;
|
|
108
|
+
endSaving(state: immer_dist_internal.WritableDraft<State>, action: PayloadAction<Document>): void;
|
|
109
|
+
startSavingDraft: (state: immer_dist_internal.WritableDraft<State>) => void;
|
|
110
|
+
endSavingDraft(state: immer_dist_internal.WritableDraft<State>, action: PayloadAction<Document>): void;
|
|
111
|
+
markAsDirty(state: immer_dist_internal.WritableDraft<State>): void;
|
|
112
|
+
markAsPristine(state: immer_dist_internal.WritableDraft<State>): void;
|
|
113
|
+
}, "documents">;
|
|
114
|
+
|
|
115
|
+
export { Document, ExitTo, ExtendedWindow, V1Document, useActiveDocument as __useActiveDocument, useActiveDocumentActions as __useActiveDocumentActions, useHostDocument as __useHostDocument, useNavigateToDocument as __useNavigateToDocument, slice };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
|
+
import * as _elementor_store from '@elementor/store';
|
|
2
|
+
import { PayloadAction } from '@elementor/store';
|
|
3
|
+
import * as immer_dist_internal from 'immer/dist/internal';
|
|
4
|
+
|
|
1
5
|
declare function useActiveDocument(): Document | null;
|
|
2
6
|
|
|
3
7
|
declare function useActiveDocumentActions(): {
|
|
4
8
|
save: () => Promise<any>;
|
|
5
9
|
saveDraft: () => Promise<any>;
|
|
6
10
|
saveTemplate: () => Promise<unknown>;
|
|
11
|
+
copyAndShare: () => void;
|
|
7
12
|
};
|
|
8
13
|
|
|
9
14
|
declare function useHostDocument(): Document | null;
|
|
10
15
|
|
|
11
16
|
declare function useNavigateToDocument(): (id: number) => Promise<void>;
|
|
12
17
|
|
|
18
|
+
type ExitTo = 'dashboard' | 'all_posts' | 'this_post';
|
|
13
19
|
type Document = {
|
|
14
20
|
id: number;
|
|
15
21
|
title: string;
|
|
@@ -23,6 +29,7 @@ type Document = {
|
|
|
23
29
|
};
|
|
24
30
|
links: {
|
|
25
31
|
platformEdit: string;
|
|
32
|
+
permalink: string;
|
|
26
33
|
};
|
|
27
34
|
isDirty: boolean;
|
|
28
35
|
isSaving: boolean;
|
|
@@ -30,6 +37,10 @@ type Document = {
|
|
|
30
37
|
userCan: {
|
|
31
38
|
publish?: boolean;
|
|
32
39
|
};
|
|
40
|
+
permissions: {
|
|
41
|
+
allowAddingWidgets: boolean;
|
|
42
|
+
showCopyAndShare: boolean;
|
|
43
|
+
};
|
|
33
44
|
};
|
|
34
45
|
type ExtendedWindow = Window & {
|
|
35
46
|
elementor: {
|
|
@@ -39,6 +50,7 @@ type ExtendedWindow = Window & {
|
|
|
39
50
|
getInitialId: () => number;
|
|
40
51
|
getCurrent: () => V1Document;
|
|
41
52
|
};
|
|
53
|
+
getPreferences: (key: 'exit_to') => ExitTo;
|
|
42
54
|
};
|
|
43
55
|
};
|
|
44
56
|
type V1Document = {
|
|
@@ -53,6 +65,8 @@ type V1Document = {
|
|
|
53
65
|
};
|
|
54
66
|
panel: {
|
|
55
67
|
title: string;
|
|
68
|
+
allow_adding_widgets: boolean;
|
|
69
|
+
show_copy_and_share: boolean;
|
|
56
70
|
};
|
|
57
71
|
status: {
|
|
58
72
|
value: string;
|
|
@@ -60,6 +74,9 @@ type V1Document = {
|
|
|
60
74
|
};
|
|
61
75
|
urls: {
|
|
62
76
|
exit_to_dashboard: string;
|
|
77
|
+
permalink: string;
|
|
78
|
+
main_dashboard: string;
|
|
79
|
+
all_post_type: string;
|
|
63
80
|
};
|
|
64
81
|
};
|
|
65
82
|
editor: {
|
|
@@ -69,6 +86,7 @@ type V1Document = {
|
|
|
69
86
|
container: {
|
|
70
87
|
settings: V1Model<{
|
|
71
88
|
post_title: string;
|
|
89
|
+
exit_to: ExitTo;
|
|
72
90
|
}>;
|
|
73
91
|
};
|
|
74
92
|
};
|
|
@@ -76,4 +94,22 @@ type V1Model<T> = {
|
|
|
76
94
|
get: <K extends keyof T = keyof T>(key: K) => T[K];
|
|
77
95
|
};
|
|
78
96
|
|
|
79
|
-
|
|
97
|
+
type State = {
|
|
98
|
+
entities: Record<Document['id'], Document>;
|
|
99
|
+
activeId: Document['id'] | null;
|
|
100
|
+
hostId: Document['id'] | null;
|
|
101
|
+
};
|
|
102
|
+
declare const slice: _elementor_store.Slice<State, {
|
|
103
|
+
init(state: immer_dist_internal.WritableDraft<State>, { payload }: PayloadAction<State>): void;
|
|
104
|
+
activateDocument(state: immer_dist_internal.WritableDraft<State>, action: PayloadAction<Document>): void;
|
|
105
|
+
setAsHost(state: immer_dist_internal.WritableDraft<State>, action: PayloadAction<Document['id']>): void;
|
|
106
|
+
updateActiveDocument(state: immer_dist_internal.WritableDraft<State>, action: PayloadAction<Partial<Document>>): void;
|
|
107
|
+
startSaving(state: immer_dist_internal.WritableDraft<State>): void;
|
|
108
|
+
endSaving(state: immer_dist_internal.WritableDraft<State>, action: PayloadAction<Document>): void;
|
|
109
|
+
startSavingDraft: (state: immer_dist_internal.WritableDraft<State>) => void;
|
|
110
|
+
endSavingDraft(state: immer_dist_internal.WritableDraft<State>, action: PayloadAction<Document>): void;
|
|
111
|
+
markAsDirty(state: immer_dist_internal.WritableDraft<State>): void;
|
|
112
|
+
markAsPristine(state: immer_dist_internal.WritableDraft<State>): void;
|
|
113
|
+
}, "documents">;
|
|
114
|
+
|
|
115
|
+
export { Document, ExitTo, ExtendedWindow, V1Document, useActiveDocument as __useActiveDocument, useActiveDocumentActions as __useActiveDocumentActions, useHostDocument as __useHostDocument, useNavigateToDocument as __useNavigateToDocument, slice };
|
package/dist/index.js
CHANGED
|
@@ -23,7 +23,8 @@ __export(src_exports, {
|
|
|
23
23
|
__useActiveDocument: () => useActiveDocument,
|
|
24
24
|
__useActiveDocumentActions: () => useActiveDocumentActions,
|
|
25
25
|
__useHostDocument: () => useHostDocument,
|
|
26
|
-
__useNavigateToDocument: () => useNavigateToDocument
|
|
26
|
+
__useNavigateToDocument: () => useNavigateToDocument,
|
|
27
|
+
slice: () => slice
|
|
27
28
|
});
|
|
28
29
|
module.exports = __toCommonJS(src_exports);
|
|
29
30
|
|
|
@@ -111,8 +112,27 @@ function getV1DocumentsManager() {
|
|
|
111
112
|
}
|
|
112
113
|
return documentsManager;
|
|
113
114
|
}
|
|
115
|
+
function getV1DocumentsExitTo(documentData) {
|
|
116
|
+
const exitPreference = window.elementor?.getPreferences?.("exit_to") || "this_post";
|
|
117
|
+
switch (exitPreference) {
|
|
118
|
+
case "dashboard":
|
|
119
|
+
return documentData.config.urls.main_dashboard;
|
|
120
|
+
case "all_posts":
|
|
121
|
+
return documentData.config.urls.all_post_type;
|
|
122
|
+
case "this_post":
|
|
123
|
+
default:
|
|
124
|
+
return documentData.config.urls.exit_to_dashboard;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function getV1DocumentShowCopyAndShare(documentData) {
|
|
128
|
+
return documentData?.config?.panel?.show_copy_and_share ?? false;
|
|
129
|
+
}
|
|
130
|
+
function getV1DocumentPermalink(documentData) {
|
|
131
|
+
return documentData.config.urls.permalink ?? "";
|
|
132
|
+
}
|
|
114
133
|
function normalizeV1Document(documentData) {
|
|
115
134
|
const isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;
|
|
135
|
+
const exitToUrl = getV1DocumentsExitTo(documentData);
|
|
116
136
|
return {
|
|
117
137
|
id: documentData.id,
|
|
118
138
|
title: documentData.container.settings.get("post_title"),
|
|
@@ -125,11 +145,16 @@ function normalizeV1Document(documentData) {
|
|
|
125
145
|
label: documentData.config.status.label
|
|
126
146
|
},
|
|
127
147
|
links: {
|
|
128
|
-
|
|
148
|
+
permalink: getV1DocumentPermalink(documentData),
|
|
149
|
+
platformEdit: exitToUrl
|
|
129
150
|
},
|
|
130
151
|
isDirty: documentData.editor.isChanged || isUnpublishedRevision,
|
|
131
152
|
isSaving: documentData.editor.isSaving,
|
|
132
153
|
isSavingDraft: false,
|
|
154
|
+
permissions: {
|
|
155
|
+
allowAddingWidgets: documentData.config.panel?.allow_adding_widgets ?? true,
|
|
156
|
+
showCopyAndShare: getV1DocumentShowCopyAndShare(documentData)
|
|
157
|
+
},
|
|
133
158
|
userCan: {
|
|
134
159
|
publish: documentData.config.user.can_publish
|
|
135
160
|
}
|
|
@@ -144,6 +169,7 @@ function syncStore() {
|
|
|
144
169
|
syncOnDocumentSave();
|
|
145
170
|
syncOnTitleChange();
|
|
146
171
|
syncOnDocumentChange();
|
|
172
|
+
syncOnExitToChange();
|
|
147
173
|
}
|
|
148
174
|
function syncInitialization() {
|
|
149
175
|
const { init: init2 } = slice.actions;
|
|
@@ -223,6 +249,23 @@ function syncOnTitleChange() {
|
|
|
223
249
|
updateTitle
|
|
224
250
|
);
|
|
225
251
|
}
|
|
252
|
+
function syncOnExitToChange() {
|
|
253
|
+
const { updateActiveDocument } = slice.actions;
|
|
254
|
+
const updateExitTo = debounce((e) => {
|
|
255
|
+
const event = e;
|
|
256
|
+
if (!("exit_to" in event.args?.settings)) {
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
const currentDocument = getV1DocumentsManager().getCurrent();
|
|
260
|
+
const newExitTo = getV1DocumentsExitTo(currentDocument);
|
|
261
|
+
const permalink = getV1DocumentPermalink(currentDocument);
|
|
262
|
+
(0, import_store3.__dispatch)(updateActiveDocument({ links: { platformEdit: newExitTo, permalink } }));
|
|
263
|
+
}, 400);
|
|
264
|
+
(0, import_editor_v1_adapters.__privateListenTo)(
|
|
265
|
+
(0, import_editor_v1_adapters.commandEndEvent)("document/elements/settings"),
|
|
266
|
+
updateExitTo
|
|
267
|
+
);
|
|
268
|
+
}
|
|
226
269
|
function syncOnDocumentChange() {
|
|
227
270
|
const { markAsDirty, markAsPristine } = slice.actions;
|
|
228
271
|
(0, import_editor_v1_adapters.__privateListenTo)(
|
|
@@ -285,13 +328,19 @@ function useActiveDocument() {
|
|
|
285
328
|
var import_react = require("react");
|
|
286
329
|
var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
|
|
287
330
|
function useActiveDocumentActions() {
|
|
331
|
+
const document = useActiveDocument();
|
|
332
|
+
const permalink = document?.links?.permalink ?? "";
|
|
288
333
|
const save = (0, import_react.useCallback)(() => (0, import_editor_v1_adapters2.__privateRunCommand)("document/save/default"), []);
|
|
289
334
|
const saveDraft = (0, import_react.useCallback)(() => (0, import_editor_v1_adapters2.__privateRunCommand)("document/save/draft"), []);
|
|
290
335
|
const saveTemplate = (0, import_react.useCallback)(() => (0, import_editor_v1_adapters2.__privateOpenRoute)("library/save-template"), []);
|
|
336
|
+
const copyAndShare = (0, import_react.useCallback)(() => {
|
|
337
|
+
navigator.clipboard.writeText(permalink);
|
|
338
|
+
}, [permalink]);
|
|
291
339
|
return {
|
|
292
340
|
save,
|
|
293
341
|
saveDraft,
|
|
294
|
-
saveTemplate
|
|
342
|
+
saveTemplate,
|
|
343
|
+
copyAndShare
|
|
295
344
|
};
|
|
296
345
|
}
|
|
297
346
|
|
|
@@ -324,6 +373,7 @@ init();
|
|
|
324
373
|
__useActiveDocument,
|
|
325
374
|
__useActiveDocumentActions,
|
|
326
375
|
__useHostDocument,
|
|
327
|
-
__useNavigateToDocument
|
|
376
|
+
__useNavigateToDocument,
|
|
377
|
+
slice
|
|
328
378
|
});
|
|
329
379
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/store/index.ts","../src/sync/sync-store.ts","../src/sync/utils.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/hooks/use-navigate-to-document.ts"],"sourcesContent":["import init from './init';\n\nexport {\n\tuseActiveDocument as __useActiveDocument,\n\tuseNavigateToDocument as __useNavigateToDocument,\n\tuseHostDocument as __useHostDocument,\n\tuseActiveDocumentActions as __useActiveDocumentActions,\n} from './hooks';\n\nexport * from './types';\n\ninit();\n","import { Document } from '../types';\nimport { __createSlice, 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\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 const slice = __createSlice( {\n\tname: 'documents',\n\tinitialState,\n\treducers: {\n\t\tinit( state, { payload } : PayloadAction<State> ) {\n\t\t\tstate.entities = payload.entities;\n\t\t\tstate.hostId = payload.hostId;\n\t\t\tstate.activeId = payload.activeId;\n\t\t},\n\n\t\tactivateDocument( state, action: PayloadAction<Document> ) {\n\t\t\tstate.entities[ action.payload.id ] = action.payload;\n\t\t\tstate.activeId = action.payload.id;\n\t\t},\n\n\t\tsetAsHost( state, action: PayloadAction<Document['id']> ) {\n\t\t\tstate.hostId = action.payload;\n\t\t},\n\n\t\tupdateActiveDocument( state, action: PayloadAction<Partial<Document>> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...state.entities[ state.activeId ],\n\t\t\t\t\t...action.payload,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tstartSaving( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isSaving = true;\n\t\t\t}\n\t\t},\n\n\t\tendSaving( state, action: PayloadAction<Document> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...action.payload,\n\t\t\t\t\tisSaving: false,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tstartSavingDraft: ( state ) => {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isSavingDraft = true;\n\t\t\t}\n\t\t},\n\n\t\tendSavingDraft( state, action: PayloadAction<Document> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...action.payload,\n\t\t\t\t\tisSavingDraft: false,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tmarkAsDirty( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isDirty = true;\n\t\t\t}\n\t\t},\n\n\t\tmarkAsPristine( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isDirty = false;\n\t\t\t}\n\t\t},\n\t},\n} );\n","import { Document } from '../types';\nimport { slice } from '../store';\nimport { __dispatch } from '@elementor/store';\nimport { normalizeV1Document, getV1DocumentsManager } from './utils';\nimport {\n\tcommandEndEvent,\n\tCommandEvent,\n\tcommandStartEvent,\n\tListenerEvent,\n\t__privateListenTo as listenTo,\n\tv1ReadyEvent,\n} from '@elementor/editor-v1-adapters';\n\nexport function syncStore() {\n\tsyncInitialization();\n\tsyncActiveDocument();\n\tsyncOnDocumentSave();\n\tsyncOnTitleChange();\n\tsyncOnDocumentChange();\n}\n\nfunction syncInitialization() {\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\t__dispatch( 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() {\n\tconst { activateDocument, setAsHost } = 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\t__dispatch( activateDocument( currentDocument ) );\n\n\t\t\tif ( documentsManager.getInitialId() === currentDocument.id ) {\n\t\t\t\t__dispatch( setAsHost( currentDocument.id ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentSave() {\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\t__dispatch( startSavingDraft() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t__dispatch( 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\t__dispatch( endSavingDraft( activeDocument ) );\n\t\t\t} else {\n\t\t\t\t__dispatch( endSaving( activeDocument ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnTitleChange() {\n\tconst { updateActiveDocument } = slice.actions;\n\n\tconst updateTitle = debounce( ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ settings: { post_title?: string } }>;\n\n\t\tif ( ! ( 'post_title' in event.args?.settings ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\t\tconst newTitle = currentDocument.container.settings.get( 'post_title' );\n\n\t\t__dispatch( updateActiveDocument( { title: newTitle } ) );\n\t}, 400 );\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/elements/settings' ),\n\t\tupdateTitle\n\t);\n}\n\nfunction syncOnDocumentChange() {\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\t__dispatch( markAsDirty() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t__dispatch( markAsPristine() );\n\t\t}\n\t);\n}\n\nfunction debounce<TArgs extends unknown[]>( fn: ( ...args: TArgs ) => unknown, timeout: number ) {\n\tlet timer: ReturnType<typeof setTimeout>;\n\n\treturn ( ...args: TArgs ) => {\n\t\tclearTimeout( timer );\n\n\t\ttimer = setTimeout( () => {\n\t\t\tfn( ...args );\n\t\t}, timeout );\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\tlinks: {\n\t\t\tplatformEdit: documentData.config.urls.exit_to_dashboard,\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 { syncStore } from './sync';\nimport { __registerSlice } from '@elementor/store';\nimport { slice } from './store';\n\nexport default function init() {\n\tinitStore();\n}\n\nfunction initStore() {\n\t__registerSlice( slice );\n\n\tsyncStore();\n}\n","import { __useSelector as useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import { slice } from './index';\nimport { __createSelector, SliceState } from '@elementor/store';\n\ntype State = SliceState<typeof 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 { __privateOpenRoute as openRoute, __privateRunCommand as 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 as useSelector } from '@elementor/store';\nimport { selectHostDocument } from '../store/selectors';\n\nexport default function useHostDocument() {\n\treturn useSelector( selectHostDocument );\n}\n","import { useCallback } from 'react';\nimport { __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useNavigateToDocument() {\n\treturn useCallback( async ( id: number ) => {\n\t\tawait runCommand( 'editor/documents/switch', {\n\t\t\tid,\n\t\t\tsetAsInitial: true,\n\t\t} );\n\n\t\tconst url = new URL( window.location.href );\n\n\t\turl.searchParams.set( 'post', id.toString() );\n\t\turl.searchParams.delete( 'active-document' );\n\n\t\thistory.replaceState( {}, '', url );\n\t}, [] );\n}\n"],"mappings":"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","names":["import_store","init","listenTo","import_store","import_store","import_store","useSelector","import_editor_v1_adapters","runCommand","openRoute","import_store","useSelector","import_react","import_editor_v1_adapters","runCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/store/index.ts","../src/sync/sync-store.ts","../src/sync/utils.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/hooks/use-navigate-to-document.ts"],"sourcesContent":["import init from './init';\n\nexport {\n\tuseActiveDocument as __useActiveDocument,\n\tuseNavigateToDocument as __useNavigateToDocument,\n\tuseHostDocument as __useHostDocument,\n\tuseActiveDocumentActions as __useActiveDocumentActions,\n} from './hooks';\n\nexport {\n\tslice,\n} from './store';\n\nexport * from './types';\n\ninit();\n","import { Document } from '../types';\nimport { __createSlice, 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\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 const slice = __createSlice( {\n\tname: 'documents',\n\tinitialState,\n\treducers: {\n\t\tinit( state, { payload } : PayloadAction<State> ) {\n\t\t\tstate.entities = payload.entities;\n\t\t\tstate.hostId = payload.hostId;\n\t\t\tstate.activeId = payload.activeId;\n\t\t},\n\n\t\tactivateDocument( state, action: PayloadAction<Document> ) {\n\t\t\tstate.entities[ action.payload.id ] = action.payload;\n\t\t\tstate.activeId = action.payload.id;\n\t\t},\n\n\t\tsetAsHost( state, action: PayloadAction<Document['id']> ) {\n\t\t\tstate.hostId = action.payload;\n\t\t},\n\n\t\tupdateActiveDocument( state, action: PayloadAction<Partial<Document>> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...state.entities[ state.activeId ],\n\t\t\t\t\t...action.payload,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tstartSaving( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isSaving = true;\n\t\t\t}\n\t\t},\n\n\t\tendSaving( state, action: PayloadAction<Document> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...action.payload,\n\t\t\t\t\tisSaving: false,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tstartSavingDraft: ( state ) => {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isSavingDraft = true;\n\t\t\t}\n\t\t},\n\n\t\tendSavingDraft( state, action: PayloadAction<Document> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...action.payload,\n\t\t\t\t\tisSavingDraft: false,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tmarkAsDirty( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isDirty = true;\n\t\t\t}\n\t\t},\n\n\t\tmarkAsPristine( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isDirty = false;\n\t\t\t}\n\t\t},\n\t},\n} );\n","import { Document } from '../types';\nimport { slice } from '../store';\nimport { __dispatch } from '@elementor/store';\nimport { normalizeV1Document, getV1DocumentsManager, getV1DocumentsExitTo, getV1DocumentPermalink } from './utils';\nimport {\n\tcommandEndEvent,\n\tCommandEvent,\n\tcommandStartEvent,\n\tListenerEvent,\n\t__privateListenTo as listenTo,\n\tv1ReadyEvent,\n} from '@elementor/editor-v1-adapters';\n\nexport function syncStore() {\n\tsyncInitialization();\n\tsyncActiveDocument();\n\tsyncOnDocumentSave();\n\tsyncOnTitleChange();\n\tsyncOnDocumentChange();\n\tsyncOnExitToChange();\n}\n\nfunction syncInitialization() {\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\t__dispatch( 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() {\n\tconst { activateDocument, setAsHost } = 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\t__dispatch( activateDocument( currentDocument ) );\n\n\t\t\tif ( documentsManager.getInitialId() === currentDocument.id ) {\n\t\t\t\t__dispatch( setAsHost( currentDocument.id ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentSave() {\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\t__dispatch( startSavingDraft() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t__dispatch( 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\t__dispatch( endSavingDraft( activeDocument ) );\n\t\t\t} else {\n\t\t\t\t__dispatch( endSaving( activeDocument ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnTitleChange() {\n\tconst { updateActiveDocument } = slice.actions;\n\n\tconst updateTitle = debounce( ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ settings: { post_title?: string } }>;\n\n\t\tif ( ! ( 'post_title' in event.args?.settings ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\t\tconst newTitle = currentDocument.container.settings.get( 'post_title' );\n\n\t\t__dispatch( updateActiveDocument( { title: newTitle } ) );\n\t}, 400 );\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/elements/settings' ),\n\t\tupdateTitle\n\t);\n}\n\nfunction syncOnExitToChange() {\n\tconst { updateActiveDocument } = slice.actions;\n\n\tconst updateExitTo = debounce( ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ settings: { exit_to?: string } }>;\n\n\t\tif ( ! ( 'exit_to' in event.args?.settings ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\t\tconst newExitTo = getV1DocumentsExitTo( currentDocument );\n\t\tconst permalink = getV1DocumentPermalink( currentDocument );\n\n\t\t__dispatch( updateActiveDocument( { links: { platformEdit: newExitTo, permalink } } ) );\n\t}, 400 );\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/elements/settings' ),\n\t\tupdateExitTo\n\t);\n}\n\nfunction syncOnDocumentChange() {\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\t__dispatch( markAsDirty() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t__dispatch( markAsPristine() );\n\t\t}\n\t);\n}\n\nfunction debounce<TArgs extends unknown[]>( fn: ( ...args: TArgs ) => unknown, timeout: number ) {\n\tlet timer: ReturnType<typeof setTimeout>;\n\n\treturn ( ...args: TArgs ) => {\n\t\tclearTimeout( timer );\n\n\t\ttimer = setTimeout( () => {\n\t\t\tfn( ...args );\n\t\t}, timeout );\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 getV1DocumentsExitTo( documentData: V1Document ) {\n\tconst exitPreference = ( window as unknown as ExtendedWindow ).elementor?.getPreferences?.( 'exit_to' ) || 'this_post';\n\n\tswitch ( exitPreference ) {\n\t\tcase 'dashboard':\n\t\t\treturn documentData.config.urls.main_dashboard;\n\n\t\tcase 'all_posts':\n\t\t\treturn documentData.config.urls.all_post_type;\n\n\t\tcase 'this_post':\n\t\tdefault:\n\t\t\treturn documentData.config.urls.exit_to_dashboard;\n\t}\n}\n\nexport function getV1DocumentShowCopyAndShare( documentData: V1Document|null ) {\n\treturn documentData?.config?.panel?.show_copy_and_share ?? false;\n}\n\nexport function getV1DocumentPermalink( documentData: V1Document ) {\n\treturn documentData.config.urls.permalink ?? '';\n}\n\nexport function normalizeV1Document( documentData: V1Document ): Document {\n\t// Draft or autosave.\n\tconst isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;\n\tconst exitToUrl = getV1DocumentsExitTo( documentData );\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\tlinks: {\n\t\t\tpermalink: getV1DocumentPermalink( documentData ),\n\t\t\tplatformEdit: exitToUrl,\n\t\t},\n\t\tisDirty: documentData.editor.isChanged || isUnpublishedRevision,\n\t\tisSaving: documentData.editor.isSaving,\n\t\tisSavingDraft: false,\n\t\tpermissions: {\n\t\t\tallowAddingWidgets: documentData.config.panel?.allow_adding_widgets ?? true,\n\t\t\tshowCopyAndShare: getV1DocumentShowCopyAndShare( documentData ),\n\t\t},\n\t\tuserCan: {\n\t\t\tpublish: documentData.config.user.can_publish,\n\t\t},\n\t};\n}\n","import { syncStore } from './sync';\nimport { __registerSlice } from '@elementor/store';\nimport { slice } from './store';\n\nexport default function init() {\n\tinitStore();\n}\n\nfunction initStore() {\n\t__registerSlice( slice );\n\n\tsyncStore();\n}\n","import { __useSelector as useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import { slice } from './index';\nimport { __createSelector, SliceState } from '@elementor/store';\n\ntype State = SliceState<typeof 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 { __privateOpenRoute as openRoute, __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\nimport useActiveDocument from './use-active-document';\n\nexport default function useActiveDocumentActions() {\n\tconst document = useActiveDocument();\n\n\tconst permalink = document?.links?.permalink ?? '';\n\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\tconst copyAndShare = useCallback( () => {\n\t\tnavigator.clipboard.writeText( permalink );\n\t}, [ permalink ] );\n\n\treturn {\n\t\tsave,\n\t\tsaveDraft,\n\t\tsaveTemplate,\n\t\tcopyAndShare,\n\t};\n}\n","import { __useSelector as useSelector } from '@elementor/store';\nimport { selectHostDocument } from '../store/selectors';\n\nexport default function useHostDocument() {\n\treturn useSelector( selectHostDocument );\n}\n","import { useCallback } from 'react';\nimport { __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useNavigateToDocument() {\n\treturn useCallback( async ( id: number ) => {\n\t\tawait runCommand( 'editor/documents/switch', {\n\t\t\tid,\n\t\t\tsetAsInitial: true,\n\t\t} );\n\n\t\tconst url = new URL( window.location.href );\n\n\t\turl.searchParams.set( 'post', id.toString() );\n\t\turl.searchParams.delete( 'active-document' );\n\n\t\thistory.replaceState( {}, '', url );\n\t}, [] );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,mBAA6C;AAQ7C,IAAM,eAAsB;AAAA,EAC3B,UAAU,CAAC;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AACT;AAIA,SAAS,gBAAiB,OAA2C;AACpE,SAAO,CAAC,EAAI,MAAM,YAAY,MAAM,SAAU,MAAM,QAAS;AAC9D;AAEO,IAAM,YAAQ,4BAAe;AAAA,EACnC,MAAM;AAAA,EACN;AAAA,EACA,UAAU;AAAA,IACT,KAAM,OAAO,EAAE,QAAQ,GAA2B;AACjD,YAAM,WAAW,QAAQ;AACzB,YAAM,SAAS,QAAQ;AACvB,YAAM,WAAW,QAAQ;AAAA,IAC1B;AAAA,IAEA,iBAAkB,OAAO,QAAkC;AAC1D,YAAM,SAAU,OAAO,QAAQ,EAAG,IAAI,OAAO;AAC7C,YAAM,WAAW,OAAO,QAAQ;AAAA,IACjC;AAAA,IAEA,UAAW,OAAO,QAAwC;AACzD,YAAM,SAAS,OAAO;AAAA,IACvB;AAAA,IAEA,qBAAsB,OAAO,QAA2C;AACvE,UAAK,gBAAiB,KAAM,GAAI;AAC/B,cAAM,SAAU,MAAM,QAAS,IAAI;AAAA,UAClC,GAAG,MAAM,SAAU,MAAM,QAAS;AAAA,UAClC,GAAG,OAAO;AAAA,QACX;AAAA,MACD;AAAA,IACD;AAAA,IAEA,YAAa,OAAQ;AACpB,UAAK,gBAAiB,KAAM,GAAI;AAC/B,cAAM,SAAU,MAAM,QAAS,EAAE,WAAW;AAAA,MAC7C;AAAA,IACD;AAAA,IAEA,UAAW,OAAO,QAAkC;AACnD,UAAK,gBAAiB,KAAM,GAAI;AAC/B,cAAM,SAAU,MAAM,QAAS,IAAI;AAAA,UAClC,GAAG,OAAO;AAAA,UACV,UAAU;AAAA,QACX;AAAA,MACD;AAAA,IACD;AAAA,IAEA,kBAAkB,CAAE,UAAW;AAC9B,UAAK,gBAAiB,KAAM,GAAI;AAC/B,cAAM,SAAU,MAAM,QAAS,EAAE,gBAAgB;AAAA,MAClD;AAAA,IACD;AAAA,IAEA,eAAgB,OAAO,QAAkC;AACxD,UAAK,gBAAiB,KAAM,GAAI;AAC/B,cAAM,SAAU,MAAM,QAAS,IAAI;AAAA,UAClC,GAAG,OAAO;AAAA,UACV,eAAe;AAAA,QAChB;AAAA,MACD;AAAA,IACD;AAAA,IAEA,YAAa,OAAQ;AACpB,UAAK,gBAAiB,KAAM,GAAI;AAC/B,cAAM,SAAU,MAAM,QAAS,EAAE,UAAU;AAAA,MAC5C;AAAA,IACD;AAAA,IAEA,eAAgB,OAAQ;AACvB,UAAK,gBAAiB,KAAM,GAAI;AAC/B,cAAM,SAAU,MAAM,QAAS,EAAE,UAAU;AAAA,MAC5C;AAAA,IACD;AAAA,EACD;AACD,CAAE;;;ACzFF,IAAAA,gBAA2B;;;ACApB,SAAS,wBAAwB;AACvC,QAAM,mBAAqB,OAAsC,WAAW;AAE5E,MAAK,CAAE,kBAAmB;AACzB,UAAM,IAAI,MAAO,iDAAkD;AAAA,EACpE;AAEA,SAAO;AACR;AAEO,SAAS,qBAAsB,cAA2B;AAChE,QAAM,iBAAmB,OAAsC,WAAW,iBAAkB,SAAU,KAAK;AAE3G,UAAS,gBAAiB;AAAA,IACzB,KAAK;AACJ,aAAO,aAAa,OAAO,KAAK;AAAA,IAEjC,KAAK;AACJ,aAAO,aAAa,OAAO,KAAK;AAAA,IAEjC,KAAK;AAAA,IACL;AACC,aAAO,aAAa,OAAO,KAAK;AAAA,EAClC;AACD;AAEO,SAAS,8BAA+B,cAAgC;AAC9E,SAAO,cAAc,QAAQ,OAAO,uBAAuB;AAC5D;AAEO,SAAS,uBAAwB,cAA2B;AAClE,SAAO,aAAa,OAAO,KAAK,aAAa;AAC9C;AAEO,SAAS,oBAAqB,cAAqC;AAEzE,QAAM,wBAAwB,aAAa,OAAO,UAAU,eAAe,aAAa;AACxF,QAAM,YAAY,qBAAsB,YAAa;AAErD,SAAO;AAAA,IACN,IAAI,aAAa;AAAA,IACjB,OAAO,aAAa,UAAU,SAAS,IAAK,YAAa;AAAA,IACzD,MAAM;AAAA,MACL,OAAO,aAAa,OAAO;AAAA,MAC3B,OAAO,aAAa,OAAO,MAAM;AAAA,IAClC;AAAA,IACA,QAAQ;AAAA,MACP,OAAO,aAAa,OAAO,OAAO;AAAA,MAClC,OAAO,aAAa,OAAO,OAAO;AAAA,IACnC;AAAA,IACA,OAAO;AAAA,MACN,WAAW,uBAAwB,YAAa;AAAA,MAChD,cAAc;AAAA,IACf;AAAA,IACA,SAAS,aAAa,OAAO,aAAa;AAAA,IAC1C,UAAU,aAAa,OAAO;AAAA,IAC9B,eAAe;AAAA,IACf,aAAa;AAAA,MACZ,oBAAoB,aAAa,OAAO,OAAO,wBAAwB;AAAA,MACvE,kBAAkB,8BAA+B,YAAa;AAAA,IAC/D;AAAA,IACA,SAAS;AAAA,MACR,SAAS,aAAa,OAAO,KAAK;AAAA,IACnC;AAAA,EACD;AACD;;;AD/DA,gCAOO;AAEA,SAAS,YAAY;AAC3B,qBAAmB;AACnB,qBAAmB;AACnB,qBAAmB;AACnB,oBAAkB;AAClB,uBAAqB;AACrB,qBAAmB;AACpB;AAEA,SAAS,qBAAqB;AAC7B,QAAM,EAAE,MAAAC,MAAK,IAAI,MAAM;AAEvB,gCAAAC;AAAA,QACC,wCAAa;AAAA,IACb,MAAM;AACL,YAAM,mBAAmB,sBAAsB;AAE/C,YAAM,WAAW,OAAO,QAAS,iBAAiB,SAAU,EAC1D,OAAQ,CAAE,KAA+B,CAAE,IAAI,QAAS,MAAO;AAC/D,YAAK,EAAG,IAAI,oBAAqB,QAAS;AAE1C,eAAO;AAAA,MACR,GAAG,CAAC,CAAE;AAEP,oCAAYD,MAAM;AAAA,QACjB;AAAA,QACA,QAAQ,iBAAiB,aAAa;AAAA,QACtC,UAAU,iBAAiB,aAAa;AAAA,MACzC,CAAE,CAAE;AAAA,IACL;AAAA,EACD;AACD;AAEA,SAAS,qBAAqB;AAC7B,QAAM,EAAE,kBAAkB,UAAU,IAAI,MAAM;AAE9C,gCAAAC;AAAA,QACC,2CAAiB,uBAAwB;AAAA,IACzC,MAAM;AACL,YAAM,mBAAmB,sBAAsB;AAC/C,YAAM,kBAAkB,oBAAqB,iBAAiB,WAAW,CAAE;AAE3E,oCAAY,iBAAkB,eAAgB,CAAE;AAEhD,UAAK,iBAAiB,aAAa,MAAM,gBAAgB,IAAK;AAC7D,sCAAY,UAAW,gBAAgB,EAAG,CAAE;AAAA,MAC7C;AAAA,IACD;AAAA,EACD;AACD;AAEA,SAAS,qBAAqB;AAC7B,QAAM,EAAE,aAAa,WAAW,kBAAkB,eAAe,IAAI,MAAM;AAE3E,QAAM,UAAU,CAAE,MAAsB;AACvC,UAAM,QAAQ;AAKd,WAAO,MAAM,MAAM,WAAW;AAAA,EAC/B;AAEA,gCAAAA;AAAA,QACC,6CAAmB,oBAAqB;AAAA,IACxC,CAAE,MAAO;AACR,UAAK,QAAS,CAAE,GAAI;AACnB,sCAAY,iBAAiB,CAAE;AAC/B;AAAA,MACD;AAEA,oCAAY,YAAY,CAAE;AAAA,IAC3B;AAAA,EACD;AAEA,gCAAAA;AAAA,QACC,2CAAiB,oBAAqB;AAAA,IACtC,CAAE,MAAO;AACR,YAAM,iBAAiB;AAAA,QACtB,sBAAsB,EAAE,WAAW;AAAA,MACpC;AAEA,UAAK,QAAS,CAAE,GAAI;AACnB,sCAAY,eAAgB,cAAe,CAAE;AAAA,MAC9C,OAAO;AACN,sCAAY,UAAW,cAAe,CAAE;AAAA,MACzC;AAAA,IACD;AAAA,EACD;AACD;AAEA,SAAS,oBAAoB;AAC5B,QAAM,EAAE,qBAAqB,IAAI,MAAM;AAEvC,QAAM,cAAc,SAAU,CAAE,MAAsB;AACrD,UAAM,QAAQ;AAEd,QAAK,EAAI,gBAAgB,MAAM,MAAM,WAAa;AACjD;AAAA,IACD;AAEA,UAAM,kBAAkB,sBAAsB,EAAE,WAAW;AAC3D,UAAM,WAAW,gBAAgB,UAAU,SAAS,IAAK,YAAa;AAEtE,kCAAY,qBAAsB,EAAE,OAAO,SAAS,CAAE,CAAE;AAAA,EACzD,GAAG,GAAI;AAEP,gCAAAA;AAAA,QACC,2CAAiB,4BAA6B;AAAA,IAC9C;AAAA,EACD;AACD;AAEA,SAAS,qBAAqB;AAC7B,QAAM,EAAE,qBAAqB,IAAI,MAAM;AAEvC,QAAM,eAAe,SAAU,CAAE,MAAsB;AACtD,UAAM,QAAQ;AAEd,QAAK,EAAI,aAAa,MAAM,MAAM,WAAa;AAC9C;AAAA,IACD;AAEA,UAAM,kBAAkB,sBAAsB,EAAE,WAAW;AAC3D,UAAM,YAAY,qBAAsB,eAAgB;AACxD,UAAM,YAAY,uBAAwB,eAAgB;AAE1D,kCAAY,qBAAsB,EAAE,OAAO,EAAE,cAAc,WAAW,UAAU,EAAE,CAAE,CAAE;AAAA,EACvF,GAAG,GAAI;AAEP,gCAAAA;AAAA,QACC,2CAAiB,4BAA6B;AAAA,IAC9C;AAAA,EACD;AACD;AAEA,SAAS,uBAAuB;AAC/B,QAAM,EAAE,aAAa,eAAe,IAAI,MAAM;AAE9C,gCAAAA;AAAA,QACC,2CAAiB,+BAAgC;AAAA,IACjD,MAAM;AACL,YAAM,kBAAkB,sBAAsB,EAAE,WAAW;AAE3D,UAAK,gBAAgB,OAAO,WAAY;AACvC,sCAAY,YAAY,CAAE;AAC1B;AAAA,MACD;AAEA,oCAAY,eAAe,CAAE;AAAA,IAC9B;AAAA,EACD;AACD;AAEA,SAAS,SAAmC,IAAmC,SAAkB;AAChG,MAAI;AAEJ,SAAO,IAAK,SAAiB;AAC5B,iBAAc,KAAM;AAEpB,YAAQ,WAAY,MAAM;AACzB,SAAI,GAAG,IAAK;AAAA,IACb,GAAG,OAAQ;AAAA,EACZ;AACD;;;AEhLA,IAAAC,gBAAgC;AAGjB,SAAR,OAAwB;AAC9B,YAAU;AACX;AAEA,SAAS,YAAY;AACpB,qCAAiB,KAAM;AAEvB,YAAU;AACX;;;ACZA,IAAAC,gBAA6C;;;ACC7C,IAAAC,gBAA6C;AAI7C,IAAM,iBAAiB,CAAE,UAAkB,MAAM,UAAU;AAC3D,IAAM,iBAAiB,CAAE,UAAkB,MAAM,UAAU;AAC3D,IAAM,eAAe,CAAE,UAAkB,MAAM,UAAU;AAElD,IAAM,2BAAuB;AAAA,EACnC;AAAA,EACA;AAAA,EACA,CAAE,UAAU,aAAc,YAAY,SAAU,QAAS,IACtD,SAAU,QAAS,IACnB;AACJ;AAEO,IAAM,yBAAqB;AAAA,EACjC;AAAA,EACA;AAAA,EACA,CAAE,UAAU,WAAY,UAAU,SAAU,MAAO,IAChD,SAAU,MAAO,IACjB;AACJ;;;ADpBe,SAAR,oBAAqC;AAC3C,aAAO,cAAAC,eAAa,oBAAqB;AAC1C;;;AELA,mBAA4B;AAC5B,IAAAC,6BAAmF;AAGpE,SAAR,2BAA4C;AAClD,QAAM,WAAW,kBAAkB;AAEnC,QAAM,YAAY,UAAU,OAAO,aAAa;AAEhD,QAAM,WAAO,0BAAa,UAAM,2BAAAC,qBAAY,uBAAwB,GAAG,CAAC,CAAE;AAE1E,QAAM,gBAAY,0BAAa,UAAM,2BAAAA,qBAAY,qBAAsB,GAAG,CAAC,CAAE;AAE7E,QAAM,mBAAe,0BAAa,UAAM,2BAAAC,oBAAW,uBAAwB,GAAG,CAAC,CAAE;AAEjF,QAAM,mBAAe,0BAAa,MAAM;AACvC,cAAU,UAAU,UAAW,SAAU;AAAA,EAC1C,GAAG,CAAE,SAAU,CAAE;AAEjB,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;;;ACzBA,IAAAC,gBAA6C;AAG9B,SAAR,kBAAmC;AACzC,aAAO,cAAAC,eAAa,kBAAmB;AACxC;;;ACLA,IAAAC,gBAA4B;AAC5B,IAAAC,6BAAkD;AAEnC,SAAR,wBAAyC;AAC/C,aAAO,2BAAa,OAAQ,OAAgB;AAC3C,cAAM,2BAAAC,qBAAY,2BAA2B;AAAA,MAC5C;AAAA,MACA,cAAc;AAAA,IACf,CAAE;AAEF,UAAM,MAAM,IAAI,IAAK,OAAO,SAAS,IAAK;AAE1C,QAAI,aAAa,IAAK,QAAQ,GAAG,SAAS,CAAE;AAC5C,QAAI,aAAa,OAAQ,iBAAkB;AAE3C,YAAQ,aAAc,CAAC,GAAG,IAAI,GAAI;AAAA,EACnC,GAAG,CAAC,CAAE;AACP;;;ATFA,KAAK;","names":["import_store","init","listenTo","import_store","import_store","import_store","useSelector","import_editor_v1_adapters","runCommand","openRoute","import_store","useSelector","import_react","import_editor_v1_adapters","runCommand"]}
|
package/dist/index.mjs
CHANGED
|
@@ -82,8 +82,27 @@ function getV1DocumentsManager() {
|
|
|
82
82
|
}
|
|
83
83
|
return documentsManager;
|
|
84
84
|
}
|
|
85
|
+
function getV1DocumentsExitTo(documentData) {
|
|
86
|
+
const exitPreference = window.elementor?.getPreferences?.("exit_to") || "this_post";
|
|
87
|
+
switch (exitPreference) {
|
|
88
|
+
case "dashboard":
|
|
89
|
+
return documentData.config.urls.main_dashboard;
|
|
90
|
+
case "all_posts":
|
|
91
|
+
return documentData.config.urls.all_post_type;
|
|
92
|
+
case "this_post":
|
|
93
|
+
default:
|
|
94
|
+
return documentData.config.urls.exit_to_dashboard;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function getV1DocumentShowCopyAndShare(documentData) {
|
|
98
|
+
return documentData?.config?.panel?.show_copy_and_share ?? false;
|
|
99
|
+
}
|
|
100
|
+
function getV1DocumentPermalink(documentData) {
|
|
101
|
+
return documentData.config.urls.permalink ?? "";
|
|
102
|
+
}
|
|
85
103
|
function normalizeV1Document(documentData) {
|
|
86
104
|
const isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;
|
|
105
|
+
const exitToUrl = getV1DocumentsExitTo(documentData);
|
|
87
106
|
return {
|
|
88
107
|
id: documentData.id,
|
|
89
108
|
title: documentData.container.settings.get("post_title"),
|
|
@@ -96,11 +115,16 @@ function normalizeV1Document(documentData) {
|
|
|
96
115
|
label: documentData.config.status.label
|
|
97
116
|
},
|
|
98
117
|
links: {
|
|
99
|
-
|
|
118
|
+
permalink: getV1DocumentPermalink(documentData),
|
|
119
|
+
platformEdit: exitToUrl
|
|
100
120
|
},
|
|
101
121
|
isDirty: documentData.editor.isChanged || isUnpublishedRevision,
|
|
102
122
|
isSaving: documentData.editor.isSaving,
|
|
103
123
|
isSavingDraft: false,
|
|
124
|
+
permissions: {
|
|
125
|
+
allowAddingWidgets: documentData.config.panel?.allow_adding_widgets ?? true,
|
|
126
|
+
showCopyAndShare: getV1DocumentShowCopyAndShare(documentData)
|
|
127
|
+
},
|
|
104
128
|
userCan: {
|
|
105
129
|
publish: documentData.config.user.can_publish
|
|
106
130
|
}
|
|
@@ -120,6 +144,7 @@ function syncStore() {
|
|
|
120
144
|
syncOnDocumentSave();
|
|
121
145
|
syncOnTitleChange();
|
|
122
146
|
syncOnDocumentChange();
|
|
147
|
+
syncOnExitToChange();
|
|
123
148
|
}
|
|
124
149
|
function syncInitialization() {
|
|
125
150
|
const { init: init2 } = slice.actions;
|
|
@@ -199,6 +224,23 @@ function syncOnTitleChange() {
|
|
|
199
224
|
updateTitle
|
|
200
225
|
);
|
|
201
226
|
}
|
|
227
|
+
function syncOnExitToChange() {
|
|
228
|
+
const { updateActiveDocument } = slice.actions;
|
|
229
|
+
const updateExitTo = debounce((e) => {
|
|
230
|
+
const event = e;
|
|
231
|
+
if (!("exit_to" in event.args?.settings)) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const currentDocument = getV1DocumentsManager().getCurrent();
|
|
235
|
+
const newExitTo = getV1DocumentsExitTo(currentDocument);
|
|
236
|
+
const permalink = getV1DocumentPermalink(currentDocument);
|
|
237
|
+
__dispatch(updateActiveDocument({ links: { platformEdit: newExitTo, permalink } }));
|
|
238
|
+
}, 400);
|
|
239
|
+
listenTo(
|
|
240
|
+
commandEndEvent("document/elements/settings"),
|
|
241
|
+
updateExitTo
|
|
242
|
+
);
|
|
243
|
+
}
|
|
202
244
|
function syncOnDocumentChange() {
|
|
203
245
|
const { markAsDirty, markAsPristine } = slice.actions;
|
|
204
246
|
listenTo(
|
|
@@ -261,13 +303,19 @@ function useActiveDocument() {
|
|
|
261
303
|
import { useCallback } from "react";
|
|
262
304
|
import { __privateOpenRoute as openRoute, __privateRunCommand as runCommand } from "@elementor/editor-v1-adapters";
|
|
263
305
|
function useActiveDocumentActions() {
|
|
306
|
+
const document = useActiveDocument();
|
|
307
|
+
const permalink = document?.links?.permalink ?? "";
|
|
264
308
|
const save = useCallback(() => runCommand("document/save/default"), []);
|
|
265
309
|
const saveDraft = useCallback(() => runCommand("document/save/draft"), []);
|
|
266
310
|
const saveTemplate = useCallback(() => openRoute("library/save-template"), []);
|
|
311
|
+
const copyAndShare = useCallback(() => {
|
|
312
|
+
navigator.clipboard.writeText(permalink);
|
|
313
|
+
}, [permalink]);
|
|
267
314
|
return {
|
|
268
315
|
save,
|
|
269
316
|
saveDraft,
|
|
270
|
-
saveTemplate
|
|
317
|
+
saveTemplate,
|
|
318
|
+
copyAndShare
|
|
271
319
|
};
|
|
272
320
|
}
|
|
273
321
|
|
|
@@ -299,6 +347,7 @@ export {
|
|
|
299
347
|
useActiveDocument as __useActiveDocument,
|
|
300
348
|
useActiveDocumentActions as __useActiveDocumentActions,
|
|
301
349
|
useHostDocument as __useHostDocument,
|
|
302
|
-
useNavigateToDocument as __useNavigateToDocument
|
|
350
|
+
useNavigateToDocument as __useNavigateToDocument,
|
|
351
|
+
slice
|
|
303
352
|
};
|
|
304
353
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/store/index.ts","../src/sync/sync-store.ts","../src/sync/utils.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/hooks/use-navigate-to-document.ts","../src/index.ts"],"sourcesContent":["import { Document } from '../types';\nimport { __createSlice, 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\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 const slice = __createSlice( {\n\tname: 'documents',\n\tinitialState,\n\treducers: {\n\t\tinit( state, { payload } : PayloadAction<State> ) {\n\t\t\tstate.entities = payload.entities;\n\t\t\tstate.hostId = payload.hostId;\n\t\t\tstate.activeId = payload.activeId;\n\t\t},\n\n\t\tactivateDocument( state, action: PayloadAction<Document> ) {\n\t\t\tstate.entities[ action.payload.id ] = action.payload;\n\t\t\tstate.activeId = action.payload.id;\n\t\t},\n\n\t\tsetAsHost( state, action: PayloadAction<Document['id']> ) {\n\t\t\tstate.hostId = action.payload;\n\t\t},\n\n\t\tupdateActiveDocument( state, action: PayloadAction<Partial<Document>> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...state.entities[ state.activeId ],\n\t\t\t\t\t...action.payload,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tstartSaving( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isSaving = true;\n\t\t\t}\n\t\t},\n\n\t\tendSaving( state, action: PayloadAction<Document> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...action.payload,\n\t\t\t\t\tisSaving: false,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tstartSavingDraft: ( state ) => {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isSavingDraft = true;\n\t\t\t}\n\t\t},\n\n\t\tendSavingDraft( state, action: PayloadAction<Document> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...action.payload,\n\t\t\t\t\tisSavingDraft: false,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tmarkAsDirty( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isDirty = true;\n\t\t\t}\n\t\t},\n\n\t\tmarkAsPristine( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isDirty = false;\n\t\t\t}\n\t\t},\n\t},\n} );\n","import { Document } from '../types';\nimport { slice } from '../store';\nimport { __dispatch } from '@elementor/store';\nimport { normalizeV1Document, getV1DocumentsManager } from './utils';\nimport {\n\tcommandEndEvent,\n\tCommandEvent,\n\tcommandStartEvent,\n\tListenerEvent,\n\t__privateListenTo as listenTo,\n\tv1ReadyEvent,\n} from '@elementor/editor-v1-adapters';\n\nexport function syncStore() {\n\tsyncInitialization();\n\tsyncActiveDocument();\n\tsyncOnDocumentSave();\n\tsyncOnTitleChange();\n\tsyncOnDocumentChange();\n}\n\nfunction syncInitialization() {\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\t__dispatch( 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() {\n\tconst { activateDocument, setAsHost } = 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\t__dispatch( activateDocument( currentDocument ) );\n\n\t\t\tif ( documentsManager.getInitialId() === currentDocument.id ) {\n\t\t\t\t__dispatch( setAsHost( currentDocument.id ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentSave() {\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\t__dispatch( startSavingDraft() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t__dispatch( 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\t__dispatch( endSavingDraft( activeDocument ) );\n\t\t\t} else {\n\t\t\t\t__dispatch( endSaving( activeDocument ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnTitleChange() {\n\tconst { updateActiveDocument } = slice.actions;\n\n\tconst updateTitle = debounce( ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ settings: { post_title?: string } }>;\n\n\t\tif ( ! ( 'post_title' in event.args?.settings ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\t\tconst newTitle = currentDocument.container.settings.get( 'post_title' );\n\n\t\t__dispatch( updateActiveDocument( { title: newTitle } ) );\n\t}, 400 );\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/elements/settings' ),\n\t\tupdateTitle\n\t);\n}\n\nfunction syncOnDocumentChange() {\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\t__dispatch( markAsDirty() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t__dispatch( markAsPristine() );\n\t\t}\n\t);\n}\n\nfunction debounce<TArgs extends unknown[]>( fn: ( ...args: TArgs ) => unknown, timeout: number ) {\n\tlet timer: ReturnType<typeof setTimeout>;\n\n\treturn ( ...args: TArgs ) => {\n\t\tclearTimeout( timer );\n\n\t\ttimer = setTimeout( () => {\n\t\t\tfn( ...args );\n\t\t}, timeout );\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\tlinks: {\n\t\t\tplatformEdit: documentData.config.urls.exit_to_dashboard,\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 { syncStore } from './sync';\nimport { __registerSlice } from '@elementor/store';\nimport { slice } from './store';\n\nexport default function init() {\n\tinitStore();\n}\n\nfunction initStore() {\n\t__registerSlice( slice );\n\n\tsyncStore();\n}\n","import { __useSelector as useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import { slice } from './index';\nimport { __createSelector, SliceState } from '@elementor/store';\n\ntype State = SliceState<typeof 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 { __privateOpenRoute as openRoute, __privateRunCommand as 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 as useSelector } from '@elementor/store';\nimport { selectHostDocument } from '../store/selectors';\n\nexport default function useHostDocument() {\n\treturn useSelector( selectHostDocument );\n}\n","import { useCallback } from 'react';\nimport { __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useNavigateToDocument() {\n\treturn useCallback( async ( id: number ) => {\n\t\tawait runCommand( 'editor/documents/switch', {\n\t\t\tid,\n\t\t\tsetAsInitial: true,\n\t\t} );\n\n\t\tconst url = new URL( window.location.href );\n\n\t\turl.searchParams.set( 'post', id.toString() );\n\t\turl.searchParams.delete( 'active-document' );\n\n\t\thistory.replaceState( {}, '', url );\n\t}, [] );\n}\n","import init from './init';\n\nexport {\n\tuseActiveDocument as __useActiveDocument,\n\tuseNavigateToDocument as __useNavigateToDocument,\n\tuseHostDocument as __useHostDocument,\n\tuseActiveDocumentActions as __useActiveDocumentActions,\n} from './hooks';\n\nexport * from './types';\n\ninit();\n"],"mappings":"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","names":["init","useSelector","useSelector","useCallback","runCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/store/index.ts","../src/sync/sync-store.ts","../src/sync/utils.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/hooks/use-navigate-to-document.ts","../src/index.ts"],"sourcesContent":["import { Document } from '../types';\nimport { __createSlice, 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\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 const slice = __createSlice( {\n\tname: 'documents',\n\tinitialState,\n\treducers: {\n\t\tinit( state, { payload } : PayloadAction<State> ) {\n\t\t\tstate.entities = payload.entities;\n\t\t\tstate.hostId = payload.hostId;\n\t\t\tstate.activeId = payload.activeId;\n\t\t},\n\n\t\tactivateDocument( state, action: PayloadAction<Document> ) {\n\t\t\tstate.entities[ action.payload.id ] = action.payload;\n\t\t\tstate.activeId = action.payload.id;\n\t\t},\n\n\t\tsetAsHost( state, action: PayloadAction<Document['id']> ) {\n\t\t\tstate.hostId = action.payload;\n\t\t},\n\n\t\tupdateActiveDocument( state, action: PayloadAction<Partial<Document>> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...state.entities[ state.activeId ],\n\t\t\t\t\t...action.payload,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tstartSaving( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isSaving = true;\n\t\t\t}\n\t\t},\n\n\t\tendSaving( state, action: PayloadAction<Document> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...action.payload,\n\t\t\t\t\tisSaving: false,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tstartSavingDraft: ( state ) => {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isSavingDraft = true;\n\t\t\t}\n\t\t},\n\n\t\tendSavingDraft( state, action: PayloadAction<Document> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...action.payload,\n\t\t\t\t\tisSavingDraft: false,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tmarkAsDirty( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isDirty = true;\n\t\t\t}\n\t\t},\n\n\t\tmarkAsPristine( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isDirty = false;\n\t\t\t}\n\t\t},\n\t},\n} );\n","import { Document } from '../types';\nimport { slice } from '../store';\nimport { __dispatch } from '@elementor/store';\nimport { normalizeV1Document, getV1DocumentsManager, getV1DocumentsExitTo, getV1DocumentPermalink } from './utils';\nimport {\n\tcommandEndEvent,\n\tCommandEvent,\n\tcommandStartEvent,\n\tListenerEvent,\n\t__privateListenTo as listenTo,\n\tv1ReadyEvent,\n} from '@elementor/editor-v1-adapters';\n\nexport function syncStore() {\n\tsyncInitialization();\n\tsyncActiveDocument();\n\tsyncOnDocumentSave();\n\tsyncOnTitleChange();\n\tsyncOnDocumentChange();\n\tsyncOnExitToChange();\n}\n\nfunction syncInitialization() {\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\t__dispatch( 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() {\n\tconst { activateDocument, setAsHost } = 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\t__dispatch( activateDocument( currentDocument ) );\n\n\t\t\tif ( documentsManager.getInitialId() === currentDocument.id ) {\n\t\t\t\t__dispatch( setAsHost( currentDocument.id ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentSave() {\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\t__dispatch( startSavingDraft() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t__dispatch( 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\t__dispatch( endSavingDraft( activeDocument ) );\n\t\t\t} else {\n\t\t\t\t__dispatch( endSaving( activeDocument ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnTitleChange() {\n\tconst { updateActiveDocument } = slice.actions;\n\n\tconst updateTitle = debounce( ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ settings: { post_title?: string } }>;\n\n\t\tif ( ! ( 'post_title' in event.args?.settings ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\t\tconst newTitle = currentDocument.container.settings.get( 'post_title' );\n\n\t\t__dispatch( updateActiveDocument( { title: newTitle } ) );\n\t}, 400 );\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/elements/settings' ),\n\t\tupdateTitle\n\t);\n}\n\nfunction syncOnExitToChange() {\n\tconst { updateActiveDocument } = slice.actions;\n\n\tconst updateExitTo = debounce( ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ settings: { exit_to?: string } }>;\n\n\t\tif ( ! ( 'exit_to' in event.args?.settings ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\t\tconst newExitTo = getV1DocumentsExitTo( currentDocument );\n\t\tconst permalink = getV1DocumentPermalink( currentDocument );\n\n\t\t__dispatch( updateActiveDocument( { links: { platformEdit: newExitTo, permalink } } ) );\n\t}, 400 );\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/elements/settings' ),\n\t\tupdateExitTo\n\t);\n}\n\nfunction syncOnDocumentChange() {\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\t__dispatch( markAsDirty() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t__dispatch( markAsPristine() );\n\t\t}\n\t);\n}\n\nfunction debounce<TArgs extends unknown[]>( fn: ( ...args: TArgs ) => unknown, timeout: number ) {\n\tlet timer: ReturnType<typeof setTimeout>;\n\n\treturn ( ...args: TArgs ) => {\n\t\tclearTimeout( timer );\n\n\t\ttimer = setTimeout( () => {\n\t\t\tfn( ...args );\n\t\t}, timeout );\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 getV1DocumentsExitTo( documentData: V1Document ) {\n\tconst exitPreference = ( window as unknown as ExtendedWindow ).elementor?.getPreferences?.( 'exit_to' ) || 'this_post';\n\n\tswitch ( exitPreference ) {\n\t\tcase 'dashboard':\n\t\t\treturn documentData.config.urls.main_dashboard;\n\n\t\tcase 'all_posts':\n\t\t\treturn documentData.config.urls.all_post_type;\n\n\t\tcase 'this_post':\n\t\tdefault:\n\t\t\treturn documentData.config.urls.exit_to_dashboard;\n\t}\n}\n\nexport function getV1DocumentShowCopyAndShare( documentData: V1Document|null ) {\n\treturn documentData?.config?.panel?.show_copy_and_share ?? false;\n}\n\nexport function getV1DocumentPermalink( documentData: V1Document ) {\n\treturn documentData.config.urls.permalink ?? '';\n}\n\nexport function normalizeV1Document( documentData: V1Document ): Document {\n\t// Draft or autosave.\n\tconst isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;\n\tconst exitToUrl = getV1DocumentsExitTo( documentData );\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\tlinks: {\n\t\t\tpermalink: getV1DocumentPermalink( documentData ),\n\t\t\tplatformEdit: exitToUrl,\n\t\t},\n\t\tisDirty: documentData.editor.isChanged || isUnpublishedRevision,\n\t\tisSaving: documentData.editor.isSaving,\n\t\tisSavingDraft: false,\n\t\tpermissions: {\n\t\t\tallowAddingWidgets: documentData.config.panel?.allow_adding_widgets ?? true,\n\t\t\tshowCopyAndShare: getV1DocumentShowCopyAndShare( documentData ),\n\t\t},\n\t\tuserCan: {\n\t\t\tpublish: documentData.config.user.can_publish,\n\t\t},\n\t};\n}\n","import { syncStore } from './sync';\nimport { __registerSlice } from '@elementor/store';\nimport { slice } from './store';\n\nexport default function init() {\n\tinitStore();\n}\n\nfunction initStore() {\n\t__registerSlice( slice );\n\n\tsyncStore();\n}\n","import { __useSelector as useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import { slice } from './index';\nimport { __createSelector, SliceState } from '@elementor/store';\n\ntype State = SliceState<typeof 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 { __privateOpenRoute as openRoute, __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\nimport useActiveDocument from './use-active-document';\n\nexport default function useActiveDocumentActions() {\n\tconst document = useActiveDocument();\n\n\tconst permalink = document?.links?.permalink ?? '';\n\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\tconst copyAndShare = useCallback( () => {\n\t\tnavigator.clipboard.writeText( permalink );\n\t}, [ permalink ] );\n\n\treturn {\n\t\tsave,\n\t\tsaveDraft,\n\t\tsaveTemplate,\n\t\tcopyAndShare,\n\t};\n}\n","import { __useSelector as useSelector } from '@elementor/store';\nimport { selectHostDocument } from '../store/selectors';\n\nexport default function useHostDocument() {\n\treturn useSelector( selectHostDocument );\n}\n","import { useCallback } from 'react';\nimport { __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useNavigateToDocument() {\n\treturn useCallback( async ( id: number ) => {\n\t\tawait runCommand( 'editor/documents/switch', {\n\t\t\tid,\n\t\t\tsetAsInitial: true,\n\t\t} );\n\n\t\tconst url = new URL( window.location.href );\n\n\t\turl.searchParams.set( 'post', id.toString() );\n\t\turl.searchParams.delete( 'active-document' );\n\n\t\thistory.replaceState( {}, '', url );\n\t}, [] );\n}\n","import init from './init';\n\nexport {\n\tuseActiveDocument as __useActiveDocument,\n\tuseNavigateToDocument as __useNavigateToDocument,\n\tuseHostDocument as __useHostDocument,\n\tuseActiveDocumentActions as __useActiveDocumentActions,\n} from './hooks';\n\nexport {\n\tslice,\n} from './store';\n\nexport * from './types';\n\ninit();\n"],"mappings":"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","names":["init","useSelector","useSelector","useCallback","runCommand"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-documents",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Elementor Team",
|
|
6
6
|
"homepage": "https://elementor.com/",
|
|
@@ -41,5 +41,5 @@
|
|
|
41
41
|
"elementor": {
|
|
42
42
|
"type": "extension"
|
|
43
43
|
},
|
|
44
|
-
"gitHead": "
|
|
44
|
+
"gitHead": "5dab1aebf97fa6cea576503837f62abf4627b55f"
|
|
45
45
|
}
|
|
@@ -1,13 +1,22 @@
|
|
|
1
|
-
import { renderHook } from '@testing-library/react';
|
|
2
1
|
import useActiveDocumentActions from '../use-active-document-actions';
|
|
3
2
|
import { __privateOpenRoute as openRoute, __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';
|
|
3
|
+
import { __createStore, __registerSlice, SliceState, Store } from '@elementor/store';
|
|
4
|
+
import { slice } from '../../store';
|
|
5
|
+
import { renderHookWithStore } from 'test-utils';
|
|
4
6
|
|
|
5
7
|
jest.mock( '@elementor/editor-v1-adapters' );
|
|
6
8
|
|
|
7
9
|
describe( '@elementor/editor-documents - useActiveDocumentActions', () => {
|
|
10
|
+
let store: Store<SliceState<typeof slice>>;
|
|
11
|
+
|
|
12
|
+
beforeEach( () => {
|
|
13
|
+
__registerSlice( slice );
|
|
14
|
+
store = __createStore();
|
|
15
|
+
} );
|
|
16
|
+
|
|
8
17
|
it( 'should run documents actions', () => {
|
|
9
18
|
// Arrange.
|
|
10
|
-
const { result } =
|
|
19
|
+
const { result } = renderHookWithStore( useActiveDocumentActions, store );
|
|
11
20
|
|
|
12
21
|
const {
|
|
13
22
|
save,
|
|
@@ -32,7 +41,7 @@ describe( '@elementor/editor-documents - useActiveDocumentActions', () => {
|
|
|
32
41
|
|
|
33
42
|
it( 'should return memoized callbacks', () => {
|
|
34
43
|
// Arrange.
|
|
35
|
-
const { result, rerender } =
|
|
44
|
+
const { result, rerender } = renderHookWithStore( useActiveDocumentActions, store );
|
|
36
45
|
|
|
37
46
|
const {
|
|
38
47
|
save,
|
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
import { useCallback } from 'react';
|
|
2
2
|
import { __privateOpenRoute as openRoute, __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';
|
|
3
|
+
import useActiveDocument from './use-active-document';
|
|
3
4
|
|
|
4
5
|
export default function useActiveDocumentActions() {
|
|
6
|
+
const document = useActiveDocument();
|
|
7
|
+
|
|
8
|
+
const permalink = document?.links?.permalink ?? '';
|
|
9
|
+
|
|
5
10
|
const save = useCallback( () => runCommand( 'document/save/default' ), [] );
|
|
6
11
|
|
|
7
12
|
const saveDraft = useCallback( () => runCommand( 'document/save/draft' ), [] );
|
|
8
13
|
|
|
9
14
|
const saveTemplate = useCallback( () => openRoute( 'library/save-template' ), [] );
|
|
10
15
|
|
|
16
|
+
const copyAndShare = useCallback( () => {
|
|
17
|
+
navigator.clipboard.writeText( permalink );
|
|
18
|
+
}, [ permalink ] );
|
|
19
|
+
|
|
11
20
|
return {
|
|
12
21
|
save,
|
|
13
22
|
saveDraft,
|
|
14
23
|
saveTemplate,
|
|
24
|
+
copyAndShare,
|
|
15
25
|
};
|
|
16
26
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { syncStore } from '../index';
|
|
2
2
|
import { slice } from '../../store';
|
|
3
|
-
import { ExtendedWindow, V1Document, Document } from '../../types';
|
|
3
|
+
import { ExtendedWindow, V1Document, Document, ExitTo } from '../../types';
|
|
4
4
|
import { __createStore, __registerSlice, SliceState, Store } from '@elementor/store';
|
|
5
5
|
import {
|
|
6
6
|
dispatchCommandAfter,
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
makeMockV1Document,
|
|
11
11
|
} from './test-utils';
|
|
12
12
|
import { selectActiveDocument } from '../../store/selectors';
|
|
13
|
+
import { getV1DocumentPermalink, getV1DocumentsExitTo } from '../utils';
|
|
13
14
|
|
|
14
15
|
type WindowWithOptionalElementor = Omit<ExtendedWindow, 'elementor'> & {
|
|
15
16
|
elementor?: ExtendedWindow['elementor'];
|
|
@@ -36,7 +37,7 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
36
37
|
mockV1DocumentsManager( [
|
|
37
38
|
makeMockV1Document( { id: 1 } ),
|
|
38
39
|
makeMockV1Document( { id: 2 } ),
|
|
39
|
-
] );
|
|
40
|
+
], 'this_post' );
|
|
40
41
|
|
|
41
42
|
// Act.
|
|
42
43
|
dispatchV1ReadyEvent();
|
|
@@ -58,6 +59,7 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
58
59
|
},
|
|
59
60
|
links: {
|
|
60
61
|
platformEdit: 'https://localhost/wp-admin/post.php?post=1&action=edit',
|
|
62
|
+
permalink: 'https://localhost/?p=1',
|
|
61
63
|
},
|
|
62
64
|
isDirty: false,
|
|
63
65
|
isSaving: false,
|
|
@@ -65,6 +67,10 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
65
67
|
userCan: {
|
|
66
68
|
publish: true,
|
|
67
69
|
},
|
|
70
|
+
permissions: {
|
|
71
|
+
allowAddingWidgets: true,
|
|
72
|
+
showCopyAndShare: false,
|
|
73
|
+
},
|
|
68
74
|
},
|
|
69
75
|
2: {
|
|
70
76
|
id: 2,
|
|
@@ -79,6 +85,7 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
79
85
|
},
|
|
80
86
|
links: {
|
|
81
87
|
platformEdit: 'https://localhost/wp-admin/post.php?post=2&action=edit',
|
|
88
|
+
permalink: 'https://localhost/?p=2',
|
|
82
89
|
},
|
|
83
90
|
isDirty: false,
|
|
84
91
|
isSaving: false,
|
|
@@ -86,6 +93,10 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
86
93
|
userCan: {
|
|
87
94
|
publish: true,
|
|
88
95
|
},
|
|
96
|
+
permissions: {
|
|
97
|
+
allowAddingWidgets: true,
|
|
98
|
+
showCopyAndShare: false,
|
|
99
|
+
},
|
|
89
100
|
},
|
|
90
101
|
} );
|
|
91
102
|
} );
|
|
@@ -104,7 +115,7 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
104
115
|
mockV1DocumentsManager( [
|
|
105
116
|
makeMockV1Document( { id: 1 } ),
|
|
106
117
|
makeMockV1Document( { id: 2 } ),
|
|
107
|
-
], 2 );
|
|
118
|
+
], 'this_post', 2 );
|
|
108
119
|
|
|
109
120
|
// Act.
|
|
110
121
|
dispatchEvent();
|
|
@@ -121,6 +132,7 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
121
132
|
},
|
|
122
133
|
links: {
|
|
123
134
|
platformEdit: 'https://localhost/wp-admin/post.php?post=2&action=edit',
|
|
135
|
+
permalink: 'https://localhost/?p=2',
|
|
124
136
|
},
|
|
125
137
|
status: {
|
|
126
138
|
value: 'publish',
|
|
@@ -132,6 +144,10 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
132
144
|
userCan: {
|
|
133
145
|
publish: true,
|
|
134
146
|
},
|
|
147
|
+
permissions: {
|
|
148
|
+
allowAddingWidgets: true,
|
|
149
|
+
showCopyAndShare: false,
|
|
150
|
+
},
|
|
135
151
|
} );
|
|
136
152
|
} );
|
|
137
153
|
|
|
@@ -152,7 +168,7 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
152
168
|
mockV1DocumentsManager( [
|
|
153
169
|
mockDocument1,
|
|
154
170
|
mockDocument2,
|
|
155
|
-
], 1, 1 );
|
|
171
|
+
], 'this_post', 1, 1 );
|
|
156
172
|
|
|
157
173
|
// Populate the documents state.
|
|
158
174
|
dispatchV1ReadyEvent();
|
|
@@ -161,7 +177,7 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
161
177
|
mockV1DocumentsManager( [
|
|
162
178
|
mockDocument1,
|
|
163
179
|
mockDocument2,
|
|
164
|
-
], 2, openAsHost ? 2 : 1 );
|
|
180
|
+
], 'this_post', 2, openAsHost ? 2 : 1 );
|
|
165
181
|
|
|
166
182
|
dispatchCommandAfter( 'editor/documents/open' );
|
|
167
183
|
|
|
@@ -363,7 +379,7 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
363
379
|
status: 'draft',
|
|
364
380
|
title: 'test',
|
|
365
381
|
} ),
|
|
366
|
-
] );
|
|
382
|
+
], 'this_post' );
|
|
367
383
|
|
|
368
384
|
// Populate the documents state.
|
|
369
385
|
dispatchV1ReadyEvent();
|
|
@@ -375,11 +391,12 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
375
391
|
status: 'publish',
|
|
376
392
|
title: 'test title changed',
|
|
377
393
|
} ),
|
|
378
|
-
] );
|
|
394
|
+
], 'dashboard' );
|
|
379
395
|
|
|
380
396
|
// Assert.
|
|
381
397
|
expect( selectActiveDocument( store.getState() )?.title ).toBe( 'test' );
|
|
382
398
|
expect( selectActiveDocument( store.getState() )?.status.value ).toBe( 'draft' );
|
|
399
|
+
expect( selectActiveDocument( store.getState() )?.links.platformEdit ).toBe( 'https://localhost/wp-admin/post.php?post=1&action=edit' );
|
|
383
400
|
|
|
384
401
|
// Act.
|
|
385
402
|
dispatchCommandAfter( 'document/save/save' );
|
|
@@ -387,11 +404,60 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
387
404
|
// Assert.
|
|
388
405
|
expect( selectActiveDocument( store.getState() )?.title ).toBe( 'test title changed' );
|
|
389
406
|
expect( selectActiveDocument( store.getState() )?.status.value ).toBe( 'publish' );
|
|
407
|
+
expect( selectActiveDocument( store.getState() )?.links.platformEdit ).toBe( 'https://localhost/wp-admin/' );
|
|
408
|
+
} );
|
|
409
|
+
|
|
410
|
+
it.each( [
|
|
411
|
+
'dashboard',
|
|
412
|
+
'this_post',
|
|
413
|
+
'all_posts',
|
|
414
|
+
] as ExitTo[] )( 'should sync active document $ExitTo', ( exitTo ) => {
|
|
415
|
+
// Arrange.
|
|
416
|
+
const mockDocument = makeMockV1Document( { id: 1 } );
|
|
417
|
+
mockV1DocumentsManager( [
|
|
418
|
+
mockDocument,
|
|
419
|
+
], exitTo );
|
|
420
|
+
|
|
421
|
+
// Populate the documents state.
|
|
422
|
+
dispatchV1ReadyEvent();
|
|
423
|
+
|
|
424
|
+
// Assert.
|
|
425
|
+
const currentDocument = selectActiveDocument( store.getState() );
|
|
426
|
+
const platformEdit = getV1DocumentsExitTo( mockDocument );
|
|
427
|
+
const permalink = getV1DocumentPermalink( mockDocument );
|
|
428
|
+
|
|
429
|
+
expect( currentDocument ).toEqual<Document>( {
|
|
430
|
+
id: 1,
|
|
431
|
+
title: 'Document 1',
|
|
432
|
+
type: {
|
|
433
|
+
value: 'wp-page',
|
|
434
|
+
label: 'WP-PAGE',
|
|
435
|
+
},
|
|
436
|
+
links: {
|
|
437
|
+
platformEdit,
|
|
438
|
+
permalink,
|
|
439
|
+
},
|
|
440
|
+
status: {
|
|
441
|
+
value: 'publish',
|
|
442
|
+
label: 'PUBLISH',
|
|
443
|
+
},
|
|
444
|
+
isDirty: false,
|
|
445
|
+
isSaving: false,
|
|
446
|
+
isSavingDraft: false,
|
|
447
|
+
userCan: {
|
|
448
|
+
publish: true,
|
|
449
|
+
},
|
|
450
|
+
permissions: {
|
|
451
|
+
allowAddingWidgets: true,
|
|
452
|
+
showCopyAndShare: false,
|
|
453
|
+
},
|
|
454
|
+
} );
|
|
390
455
|
} );
|
|
391
456
|
} );
|
|
392
457
|
|
|
393
|
-
function mockV1DocumentsManager( documentsArray: V1Document[], current = 1, initial = 1 ) {
|
|
458
|
+
function mockV1DocumentsManager( documentsArray: V1Document[], exitTo: ExitTo = 'this_post', current = 1, initial = 1 ) {
|
|
394
459
|
( window as unknown as WindowWithOptionalElementor ).elementor = {
|
|
460
|
+
getPreferences: () => exitTo,
|
|
395
461
|
documents: makeDocumentsManager( documentsArray, current, initial ),
|
|
396
462
|
};
|
|
397
463
|
}
|
|
@@ -70,6 +70,8 @@ export function makeMockV1Document( {
|
|
|
70
70
|
},
|
|
71
71
|
panel: {
|
|
72
72
|
title: type.toUpperCase(),
|
|
73
|
+
allow_adding_widgets: true,
|
|
74
|
+
show_copy_and_share: false,
|
|
73
75
|
},
|
|
74
76
|
status: {
|
|
75
77
|
label: status.toUpperCase(),
|
|
@@ -77,6 +79,9 @@ export function makeMockV1Document( {
|
|
|
77
79
|
},
|
|
78
80
|
urls: {
|
|
79
81
|
exit_to_dashboard: `https://localhost/wp-admin/post.php?post=${ id }&action=edit`,
|
|
82
|
+
main_dashboard: `https://localhost/wp-admin/`,
|
|
83
|
+
all_post_type: `https://localhost/wp-admin/post.php`,
|
|
84
|
+
permalink: `https://localhost/?p=${ id }`,
|
|
80
85
|
},
|
|
81
86
|
},
|
|
82
87
|
editor: {
|
package/src/sync/sync-store.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Document } from '../types';
|
|
2
2
|
import { slice } from '../store';
|
|
3
3
|
import { __dispatch } from '@elementor/store';
|
|
4
|
-
import { normalizeV1Document, getV1DocumentsManager } from './utils';
|
|
4
|
+
import { normalizeV1Document, getV1DocumentsManager, getV1DocumentsExitTo, getV1DocumentPermalink } from './utils';
|
|
5
5
|
import {
|
|
6
6
|
commandEndEvent,
|
|
7
7
|
CommandEvent,
|
|
@@ -17,6 +17,7 @@ export function syncStore() {
|
|
|
17
17
|
syncOnDocumentSave();
|
|
18
18
|
syncOnTitleChange();
|
|
19
19
|
syncOnDocumentChange();
|
|
20
|
+
syncOnExitToChange();
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
function syncInitialization() {
|
|
@@ -123,6 +124,29 @@ function syncOnTitleChange() {
|
|
|
123
124
|
);
|
|
124
125
|
}
|
|
125
126
|
|
|
127
|
+
function syncOnExitToChange() {
|
|
128
|
+
const { updateActiveDocument } = slice.actions;
|
|
129
|
+
|
|
130
|
+
const updateExitTo = debounce( ( e: ListenerEvent ) => {
|
|
131
|
+
const event = e as CommandEvent<{ settings: { exit_to?: string } }>;
|
|
132
|
+
|
|
133
|
+
if ( ! ( 'exit_to' in event.args?.settings ) ) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const currentDocument = getV1DocumentsManager().getCurrent();
|
|
138
|
+
const newExitTo = getV1DocumentsExitTo( currentDocument );
|
|
139
|
+
const permalink = getV1DocumentPermalink( currentDocument );
|
|
140
|
+
|
|
141
|
+
__dispatch( updateActiveDocument( { links: { platformEdit: newExitTo, permalink } } ) );
|
|
142
|
+
}, 400 );
|
|
143
|
+
|
|
144
|
+
listenTo(
|
|
145
|
+
commandEndEvent( 'document/elements/settings' ),
|
|
146
|
+
updateExitTo
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
126
150
|
function syncOnDocumentChange() {
|
|
127
151
|
const { markAsDirty, markAsPristine } = slice.actions;
|
|
128
152
|
|
package/src/sync/utils.ts
CHANGED
|
@@ -10,9 +10,34 @@ export function getV1DocumentsManager() {
|
|
|
10
10
|
return documentsManager;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
export function getV1DocumentsExitTo( documentData: V1Document ) {
|
|
14
|
+
const exitPreference = ( window as unknown as ExtendedWindow ).elementor?.getPreferences?.( 'exit_to' ) || 'this_post';
|
|
15
|
+
|
|
16
|
+
switch ( exitPreference ) {
|
|
17
|
+
case 'dashboard':
|
|
18
|
+
return documentData.config.urls.main_dashboard;
|
|
19
|
+
|
|
20
|
+
case 'all_posts':
|
|
21
|
+
return documentData.config.urls.all_post_type;
|
|
22
|
+
|
|
23
|
+
case 'this_post':
|
|
24
|
+
default:
|
|
25
|
+
return documentData.config.urls.exit_to_dashboard;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function getV1DocumentShowCopyAndShare( documentData: V1Document|null ) {
|
|
30
|
+
return documentData?.config?.panel?.show_copy_and_share ?? false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function getV1DocumentPermalink( documentData: V1Document ) {
|
|
34
|
+
return documentData.config.urls.permalink ?? '';
|
|
35
|
+
}
|
|
36
|
+
|
|
13
37
|
export function normalizeV1Document( documentData: V1Document ): Document {
|
|
14
38
|
// Draft or autosave.
|
|
15
39
|
const isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;
|
|
40
|
+
const exitToUrl = getV1DocumentsExitTo( documentData );
|
|
16
41
|
|
|
17
42
|
return {
|
|
18
43
|
id: documentData.id,
|
|
@@ -26,11 +51,16 @@ export function normalizeV1Document( documentData: V1Document ): Document {
|
|
|
26
51
|
label: documentData.config.status.label,
|
|
27
52
|
},
|
|
28
53
|
links: {
|
|
29
|
-
|
|
54
|
+
permalink: getV1DocumentPermalink( documentData ),
|
|
55
|
+
platformEdit: exitToUrl,
|
|
30
56
|
},
|
|
31
57
|
isDirty: documentData.editor.isChanged || isUnpublishedRevision,
|
|
32
58
|
isSaving: documentData.editor.isSaving,
|
|
33
59
|
isSavingDraft: false,
|
|
60
|
+
permissions: {
|
|
61
|
+
allowAddingWidgets: documentData.config.panel?.allow_adding_widgets ?? true,
|
|
62
|
+
showCopyAndShare: getV1DocumentShowCopyAndShare( documentData ),
|
|
63
|
+
},
|
|
34
64
|
userCan: {
|
|
35
65
|
publish: documentData.config.user.can_publish,
|
|
36
66
|
},
|
package/src/types.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export type ExitTo = 'dashboard' | 'all_posts' | 'this_post';
|
|
2
|
+
|
|
1
3
|
export type Document = {
|
|
2
4
|
id: number,
|
|
3
5
|
title: string,
|
|
@@ -11,6 +13,7 @@ export type Document = {
|
|
|
11
13
|
},
|
|
12
14
|
links: {
|
|
13
15
|
platformEdit: string,
|
|
16
|
+
permalink: string,
|
|
14
17
|
}
|
|
15
18
|
isDirty: boolean,
|
|
16
19
|
isSaving: boolean,
|
|
@@ -18,6 +21,10 @@ export type Document = {
|
|
|
18
21
|
userCan: {
|
|
19
22
|
publish?: boolean,
|
|
20
23
|
},
|
|
24
|
+
permissions: {
|
|
25
|
+
allowAddingWidgets: boolean,
|
|
26
|
+
showCopyAndShare: boolean,
|
|
27
|
+
},
|
|
21
28
|
};
|
|
22
29
|
|
|
23
30
|
export type ExtendedWindow = Window & {
|
|
@@ -27,7 +34,8 @@ export type ExtendedWindow = Window & {
|
|
|
27
34
|
getCurrentId: () => number,
|
|
28
35
|
getInitialId: () => number,
|
|
29
36
|
getCurrent: () => V1Document,
|
|
30
|
-
}
|
|
37
|
+
},
|
|
38
|
+
getPreferences: ( key: 'exit_to' ) => ExitTo,
|
|
31
39
|
}
|
|
32
40
|
}
|
|
33
41
|
|
|
@@ -43,6 +51,8 @@ export type V1Document = {
|
|
|
43
51
|
}
|
|
44
52
|
panel: {
|
|
45
53
|
title: string,
|
|
54
|
+
allow_adding_widgets: boolean,
|
|
55
|
+
show_copy_and_share: boolean,
|
|
46
56
|
}
|
|
47
57
|
status: {
|
|
48
58
|
value: string,
|
|
@@ -50,6 +60,9 @@ export type V1Document = {
|
|
|
50
60
|
},
|
|
51
61
|
urls: {
|
|
52
62
|
exit_to_dashboard: string,
|
|
63
|
+
permalink: string,
|
|
64
|
+
main_dashboard: string,
|
|
65
|
+
all_post_type: string,
|
|
53
66
|
},
|
|
54
67
|
},
|
|
55
68
|
editor: {
|
|
@@ -59,6 +72,7 @@ export type V1Document = {
|
|
|
59
72
|
container: {
|
|
60
73
|
settings: V1Model<{
|
|
61
74
|
post_title: string,
|
|
75
|
+
exit_to: ExitTo,
|
|
62
76
|
}>,
|
|
63
77
|
}
|
|
64
78
|
}
|