@elementor/editor-documents 0.2.0 → 0.3.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 +15 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/sync/__tests__/sync-store.test.ts +12 -3
- package/src/sync/__tests__/test-utils.ts +3 -0
- package/src/sync/utils.ts +3 -0
- package/src/types.ts +7 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Change Log
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
|
+
|
|
6
|
+
# 0.3.0 (2023-05-16)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **editor-app-bar:** change exit to wordpress link functionality [ED-10275] ([#37](https://github.com/elementor/elementor-packages/issues/37)) ([e0f5b6e](https://github.com/elementor/elementor-packages/commit/e0f5b6e3a50473f8a6d9c9e00474baedeb1b3664))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# 0.2.0 (2023-05-09)
|
package/dist/index.d.ts
CHANGED
|
@@ -19,6 +19,9 @@ type Document = {
|
|
|
19
19
|
value: string;
|
|
20
20
|
label: string;
|
|
21
21
|
};
|
|
22
|
+
links: {
|
|
23
|
+
platformEdit: string;
|
|
24
|
+
};
|
|
22
25
|
isDirty: boolean;
|
|
23
26
|
isSaving: boolean;
|
|
24
27
|
isSavingDraft: boolean;
|
|
@@ -53,6 +56,9 @@ type V1Document = {
|
|
|
53
56
|
value: string;
|
|
54
57
|
label: string;
|
|
55
58
|
};
|
|
59
|
+
urls: {
|
|
60
|
+
exit_to_dashboard: string;
|
|
61
|
+
};
|
|
56
62
|
};
|
|
57
63
|
editor: {
|
|
58
64
|
isChanged: boolean;
|
package/dist/index.js
CHANGED
|
@@ -50,6 +50,9 @@ function normalizeV1Document(documentData) {
|
|
|
50
50
|
value: documentData.config.status.value,
|
|
51
51
|
label: documentData.config.status.label
|
|
52
52
|
},
|
|
53
|
+
links: {
|
|
54
|
+
platformEdit: documentData.config.urls.exit_to_dashboard
|
|
55
|
+
},
|
|
53
56
|
isDirty: documentData.editor.isChanged || isUnpublishedRevision,
|
|
54
57
|
isSaving: documentData.editor.isSaving,
|
|
55
58
|
isSavingDraft: false,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/sync/sync-store.ts","../src/sync/utils.ts","../src/store/index.ts","../src/init.ts","../src/hooks/use-active-document.ts","../src/store/selectors.ts","../src/hooks/use-active-document-actions.ts","../src/hooks/use-host-document.ts"],"sourcesContent":["import init from './init';\n\nexport * from './hooks';\nexport * from './types';\n\ninit();\n","import { Slice } from '../store';\nimport { Document } from '../types';\nimport { dispatch } from '@elementor/store';\nimport { normalizeV1Document, getV1DocumentsManager } from './utils';\nimport {\n\tcommandEndEvent,\n\tCommandEvent,\n\tcommandStartEvent,\n\tListenerEvent,\n\tlistenTo,\n\tv1ReadyEvent,\n} from '@elementor/editor-v1-adapters';\n\nexport function syncStore( slice: Slice ) {\n\tsyncInitialization( slice );\n\tsyncActiveDocument( slice );\n\tsyncOnDocumentSave( slice );\n\tsyncOnDocumentChange( slice );\n}\n\nfunction syncInitialization( slice: Slice ) {\n\tconst { init } = slice.actions;\n\n\tlistenTo(\n\t\tv1ReadyEvent(),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\n\t\t\tconst entities = Object.entries( documentsManager.documents )\n\t\t\t\t.reduce( ( acc: Record<string, Document>, [ id, document ] ) => {\n\t\t\t\t\tacc[ id ] = normalizeV1Document( document );\n\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {} );\n\n\t\t\tdispatch( init( {\n\t\t\t\tentities,\n\t\t\t\thostId: documentsManager.getInitialId(),\n\t\t\t\tactiveId: documentsManager.getCurrentId(),\n\t\t\t} ) );\n\t\t}\n\t);\n}\n\nfunction syncActiveDocument( slice: Slice ) {\n\tconst { activateDocument } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'editor/documents/open' ),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\t\t\tconst currentDocument = normalizeV1Document( documentsManager.getCurrent() );\n\n\t\t\tdispatch( activateDocument( currentDocument ) );\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentSave( slice: Slice ) {\n\tconst { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;\n\n\tconst isDraft = ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ status: string }>;\n\n\t\t/**\n\t\t * @see https://github.com/elementor/elementor/blob/5f815d40a/assets/dev/js/editor/document/save/hooks/ui/save/before.js#L18-L22\n\t\t */\n\t\treturn event.args?.status === 'autosave';\n\t};\n\n\tlistenTo(\n\t\tcommandStartEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( startSavingDraft() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( startSaving() );\n\t\t}\n\t);\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tconst activeDocument = normalizeV1Document(\n\t\t\t\tgetV1DocumentsManager().getCurrent()\n\t\t\t);\n\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( endSavingDraft( activeDocument ) );\n\t\t\t} else {\n\t\t\t\tdispatch( endSaving( activeDocument ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentChange( slice: Slice ) {\n\tconst { markAsDirty, markAsPristine } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/set-is-modified' ),\n\t\t() => {\n\t\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\n\t\t\tif ( currentDocument.editor.isChanged ) {\n\t\t\t\tdispatch( markAsDirty() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( markAsPristine() );\n\t\t}\n\t);\n}\n","import { Document, ExtendedWindow, V1Document } from '../types';\n\nexport function getV1DocumentsManager() {\n\tconst documentsManager = ( window as unknown as ExtendedWindow ).elementor?.documents;\n\n\tif ( ! documentsManager ) {\n\t\tthrow new Error( 'Elementor Editor V1 documents manager not found' );\n\t}\n\n\treturn documentsManager;\n}\n\nexport function normalizeV1Document( documentData: V1Document ): Document {\n\t// Draft or autosave.\n\tconst isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;\n\n\treturn {\n\t\tid: documentData.id,\n\t\ttitle: documentData.container.settings.get( 'post_title' ),\n\t\ttype: {\n\t\t\tvalue: documentData.config.type,\n\t\t\tlabel: documentData.config.panel.title,\n\t\t},\n\t\tstatus: {\n\t\t\tvalue: documentData.config.status.value,\n\t\t\tlabel: documentData.config.status.label,\n\t\t},\n\t\tisDirty: documentData.editor.isChanged || isUnpublishedRevision,\n\t\tisSaving: documentData.editor.isSaving,\n\t\tisSavingDraft: false,\n\t\tuserCan: {\n\t\t\tpublish: documentData.config.user.can_publish,\n\t\t},\n\t};\n}\n","import { Document } from '../types';\nimport { addSlice, PayloadAction } from '@elementor/store';\n\ntype State = {\n\tentities: Record<Document['id'], Document>,\n\tactiveId: Document['id'] | null, // The currently editing document.\n\thostId: Document['id'] | null, // The document that host all the other documents.\n}\n\nexport type Slice = ReturnType<typeof createSlice>;\n\nconst initialState: State = {\n\tentities: {},\n\tactiveId: null,\n\thostId: null,\n};\n\ntype StateWithActiveId = Omit<State, 'activeId'> & { activeId: NonNullable<State['activeId']> };\n\nfunction hasActiveEntity( state: State ): state is StateWithActiveId {\n\treturn !! ( state.activeId && state.entities[ state.activeId ] );\n}\n\nexport function createSlice() {\n\treturn addSlice( {\n\t\tname: 'documents',\n\t\tinitialState,\n\t\treducers: {\n\t\t\tinit( state, { payload } : PayloadAction<State> ) {\n\t\t\t\tstate.entities = payload.entities;\n\t\t\t\tstate.hostId = payload.hostId;\n\t\t\t\tstate.activeId = payload.activeId;\n\t\t\t},\n\n\t\t\tactivateDocument( state, action: PayloadAction<Document> ) {\n\t\t\t\tstate.entities[ action.payload.id ] = action.payload;\n\t\t\t\tstate.activeId = action.payload.id;\n\t\t\t},\n\n\t\t\tstartSaving( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSaving = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSaving( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSaving: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tstartSavingDraft: ( state ) => {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSavingDraft = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSavingDraft( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSavingDraft: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsDirty( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsPristine( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = false;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t} );\n}\n","import { syncStore } from './sync';\nimport { createSlice } from './store';\n\nexport default function init() {\n\tinitStore();\n}\n\nfunction initStore() {\n\tconst slice = createSlice();\n\n\tsyncStore( slice );\n}\n","import { useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import type { Slice } from './index';\nimport { createSelector, SliceState } from '@elementor/store';\n\ntype State = SliceState<Slice>;\n\nconst selectEntities = ( state: State ) => state.documents.entities;\nconst selectActiveId = ( state: State ) => state.documents.activeId;\nconst selectHostId = ( state: State ) => state.documents.hostId;\n\nexport const selectActiveDocument = createSelector(\n\tselectEntities,\n\tselectActiveId,\n\t( entities, activeId ) => activeId && entities[ activeId ]\n\t\t? entities[ activeId ]\n\t\t: null,\n);\n\nexport const selectHostDocument = createSelector(\n\tselectEntities,\n\tselectHostId,\n\t( entities, hostId ) => hostId && entities[ hostId ]\n\t\t? entities[ hostId ]\n\t\t: null,\n);\n","import { useCallback } from 'react';\nimport { openRoute, runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useActiveDocumentActions() {\n\tconst save = useCallback( () => runCommand( 'document/save/default' ), [] );\n\n\tconst saveDraft = useCallback( () => runCommand( 'document/save/draft' ), [] );\n\n\tconst saveTemplate = useCallback( () => openRoute( 'library/save-template' ), [] );\n\n\treturn {\n\t\tsave,\n\t\tsaveDraft,\n\t\tsaveTemplate,\n\t};\n}\n","import { useSelector } from '@elementor/store';\nimport { selectHostDocument } from '../store/selectors';\n\nexport default function useHostDocument() {\n\treturn useSelector( selectHostDocument );\n}\n"],"mappings":"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","names":["init","import_store","import_store","import_store","import_editor_v1_adapters","import_store"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/sync/sync-store.ts","../src/sync/utils.ts","../src/store/index.ts","../src/init.ts","../src/hooks/use-active-document.ts","../src/store/selectors.ts","../src/hooks/use-active-document-actions.ts","../src/hooks/use-host-document.ts"],"sourcesContent":["import init from './init';\n\nexport * from './hooks';\nexport * from './types';\n\ninit();\n","import { Slice } from '../store';\nimport { Document } from '../types';\nimport { dispatch } from '@elementor/store';\nimport { normalizeV1Document, getV1DocumentsManager } from './utils';\nimport {\n\tcommandEndEvent,\n\tCommandEvent,\n\tcommandStartEvent,\n\tListenerEvent,\n\tlistenTo,\n\tv1ReadyEvent,\n} from '@elementor/editor-v1-adapters';\n\nexport function syncStore( slice: Slice ) {\n\tsyncInitialization( slice );\n\tsyncActiveDocument( slice );\n\tsyncOnDocumentSave( slice );\n\tsyncOnDocumentChange( slice );\n}\n\nfunction syncInitialization( slice: Slice ) {\n\tconst { init } = slice.actions;\n\n\tlistenTo(\n\t\tv1ReadyEvent(),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\n\t\t\tconst entities = Object.entries( documentsManager.documents )\n\t\t\t\t.reduce( ( acc: Record<string, Document>, [ id, document ] ) => {\n\t\t\t\t\tacc[ id ] = normalizeV1Document( document );\n\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {} );\n\n\t\t\tdispatch( init( {\n\t\t\t\tentities,\n\t\t\t\thostId: documentsManager.getInitialId(),\n\t\t\t\tactiveId: documentsManager.getCurrentId(),\n\t\t\t} ) );\n\t\t}\n\t);\n}\n\nfunction syncActiveDocument( slice: Slice ) {\n\tconst { activateDocument } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'editor/documents/open' ),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\t\t\tconst currentDocument = normalizeV1Document( documentsManager.getCurrent() );\n\n\t\t\tdispatch( activateDocument( currentDocument ) );\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentSave( slice: Slice ) {\n\tconst { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;\n\n\tconst isDraft = ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ status: string }>;\n\n\t\t/**\n\t\t * @see https://github.com/elementor/elementor/blob/5f815d40a/assets/dev/js/editor/document/save/hooks/ui/save/before.js#L18-L22\n\t\t */\n\t\treturn event.args?.status === 'autosave';\n\t};\n\n\tlistenTo(\n\t\tcommandStartEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( startSavingDraft() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( startSaving() );\n\t\t}\n\t);\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tconst activeDocument = normalizeV1Document(\n\t\t\t\tgetV1DocumentsManager().getCurrent()\n\t\t\t);\n\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( endSavingDraft( activeDocument ) );\n\t\t\t} else {\n\t\t\t\tdispatch( endSaving( activeDocument ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentChange( slice: Slice ) {\n\tconst { markAsDirty, markAsPristine } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/set-is-modified' ),\n\t\t() => {\n\t\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\n\t\t\tif ( currentDocument.editor.isChanged ) {\n\t\t\t\tdispatch( markAsDirty() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( markAsPristine() );\n\t\t}\n\t);\n}\n","import { Document, ExtendedWindow, V1Document } from '../types';\n\nexport function getV1DocumentsManager() {\n\tconst documentsManager = ( window as unknown as ExtendedWindow ).elementor?.documents;\n\n\tif ( ! documentsManager ) {\n\t\tthrow new Error( 'Elementor Editor V1 documents manager not found' );\n\t}\n\n\treturn documentsManager;\n}\n\nexport function normalizeV1Document( documentData: V1Document ): Document {\n\t// Draft or autosave.\n\tconst isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;\n\n\treturn {\n\t\tid: documentData.id,\n\t\ttitle: documentData.container.settings.get( 'post_title' ),\n\t\ttype: {\n\t\t\tvalue: documentData.config.type,\n\t\t\tlabel: documentData.config.panel.title,\n\t\t},\n\t\tstatus: {\n\t\t\tvalue: documentData.config.status.value,\n\t\t\tlabel: documentData.config.status.label,\n\t\t},\n\t\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 { Document } from '../types';\nimport { addSlice, PayloadAction } from '@elementor/store';\n\ntype State = {\n\tentities: Record<Document['id'], Document>,\n\tactiveId: Document['id'] | null, // The currently editing document.\n\thostId: Document['id'] | null, // The document that host all the other documents.\n}\n\nexport type Slice = ReturnType<typeof createSlice>;\n\nconst initialState: State = {\n\tentities: {},\n\tactiveId: null,\n\thostId: null,\n};\n\ntype StateWithActiveId = Omit<State, 'activeId'> & { activeId: NonNullable<State['activeId']> };\n\nfunction hasActiveEntity( state: State ): state is StateWithActiveId {\n\treturn !! ( state.activeId && state.entities[ state.activeId ] );\n}\n\nexport function createSlice() {\n\treturn addSlice( {\n\t\tname: 'documents',\n\t\tinitialState,\n\t\treducers: {\n\t\t\tinit( state, { payload } : PayloadAction<State> ) {\n\t\t\t\tstate.entities = payload.entities;\n\t\t\t\tstate.hostId = payload.hostId;\n\t\t\t\tstate.activeId = payload.activeId;\n\t\t\t},\n\n\t\t\tactivateDocument( state, action: PayloadAction<Document> ) {\n\t\t\t\tstate.entities[ action.payload.id ] = action.payload;\n\t\t\t\tstate.activeId = action.payload.id;\n\t\t\t},\n\n\t\t\tstartSaving( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSaving = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSaving( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSaving: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tstartSavingDraft: ( state ) => {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSavingDraft = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSavingDraft( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSavingDraft: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsDirty( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsPristine( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = false;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t} );\n}\n","import { syncStore } from './sync';\nimport { createSlice } from './store';\n\nexport default function init() {\n\tinitStore();\n}\n\nfunction initStore() {\n\tconst slice = createSlice();\n\n\tsyncStore( slice );\n}\n","import { useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import type { Slice } from './index';\nimport { createSelector, SliceState } from '@elementor/store';\n\ntype State = SliceState<Slice>;\n\nconst selectEntities = ( state: State ) => state.documents.entities;\nconst selectActiveId = ( state: State ) => state.documents.activeId;\nconst selectHostId = ( state: State ) => state.documents.hostId;\n\nexport const selectActiveDocument = createSelector(\n\tselectEntities,\n\tselectActiveId,\n\t( entities, activeId ) => activeId && entities[ activeId ]\n\t\t? entities[ activeId ]\n\t\t: null,\n);\n\nexport const selectHostDocument = createSelector(\n\tselectEntities,\n\tselectHostId,\n\t( entities, hostId ) => hostId && entities[ hostId ]\n\t\t? entities[ hostId ]\n\t\t: null,\n);\n","import { useCallback } from 'react';\nimport { openRoute, runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useActiveDocumentActions() {\n\tconst save = useCallback( () => runCommand( 'document/save/default' ), [] );\n\n\tconst saveDraft = useCallback( () => runCommand( 'document/save/draft' ), [] );\n\n\tconst saveTemplate = useCallback( () => openRoute( 'library/save-template' ), [] );\n\n\treturn {\n\t\tsave,\n\t\tsaveDraft,\n\t\tsaveTemplate,\n\t};\n}\n","import { useSelector } from '@elementor/store';\nimport { selectHostDocument } from '../store/selectors';\n\nexport default function useHostDocument() {\n\treturn useSelector( selectHostDocument );\n}\n"],"mappings":"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","names":["init","import_store","import_store","import_store","import_editor_v1_adapters","import_store"]}
|
package/dist/index.mjs
CHANGED
|
@@ -22,6 +22,9 @@ function normalizeV1Document(documentData) {
|
|
|
22
22
|
value: documentData.config.status.value,
|
|
23
23
|
label: documentData.config.status.label
|
|
24
24
|
},
|
|
25
|
+
links: {
|
|
26
|
+
platformEdit: documentData.config.urls.exit_to_dashboard
|
|
27
|
+
},
|
|
25
28
|
isDirty: documentData.editor.isChanged || isUnpublishedRevision,
|
|
26
29
|
isSaving: documentData.editor.isSaving,
|
|
27
30
|
isSavingDraft: false,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sync/sync-store.ts","../src/sync/utils.ts","../src/store/index.ts","../src/init.ts","../src/hooks/use-active-document.ts","../src/store/selectors.ts","../src/hooks/use-active-document-actions.ts","../src/hooks/use-host-document.ts","../src/index.ts"],"sourcesContent":["import { Slice } from '../store';\nimport { Document } from '../types';\nimport { dispatch } from '@elementor/store';\nimport { normalizeV1Document, getV1DocumentsManager } from './utils';\nimport {\n\tcommandEndEvent,\n\tCommandEvent,\n\tcommandStartEvent,\n\tListenerEvent,\n\tlistenTo,\n\tv1ReadyEvent,\n} from '@elementor/editor-v1-adapters';\n\nexport function syncStore( slice: Slice ) {\n\tsyncInitialization( slice );\n\tsyncActiveDocument( slice );\n\tsyncOnDocumentSave( slice );\n\tsyncOnDocumentChange( slice );\n}\n\nfunction syncInitialization( slice: Slice ) {\n\tconst { init } = slice.actions;\n\n\tlistenTo(\n\t\tv1ReadyEvent(),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\n\t\t\tconst entities = Object.entries( documentsManager.documents )\n\t\t\t\t.reduce( ( acc: Record<string, Document>, [ id, document ] ) => {\n\t\t\t\t\tacc[ id ] = normalizeV1Document( document );\n\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {} );\n\n\t\t\tdispatch( init( {\n\t\t\t\tentities,\n\t\t\t\thostId: documentsManager.getInitialId(),\n\t\t\t\tactiveId: documentsManager.getCurrentId(),\n\t\t\t} ) );\n\t\t}\n\t);\n}\n\nfunction syncActiveDocument( slice: Slice ) {\n\tconst { activateDocument } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'editor/documents/open' ),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\t\t\tconst currentDocument = normalizeV1Document( documentsManager.getCurrent() );\n\n\t\t\tdispatch( activateDocument( currentDocument ) );\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentSave( slice: Slice ) {\n\tconst { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;\n\n\tconst isDraft = ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ status: string }>;\n\n\t\t/**\n\t\t * @see https://github.com/elementor/elementor/blob/5f815d40a/assets/dev/js/editor/document/save/hooks/ui/save/before.js#L18-L22\n\t\t */\n\t\treturn event.args?.status === 'autosave';\n\t};\n\n\tlistenTo(\n\t\tcommandStartEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( startSavingDraft() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( startSaving() );\n\t\t}\n\t);\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tconst activeDocument = normalizeV1Document(\n\t\t\t\tgetV1DocumentsManager().getCurrent()\n\t\t\t);\n\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( endSavingDraft( activeDocument ) );\n\t\t\t} else {\n\t\t\t\tdispatch( endSaving( activeDocument ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentChange( slice: Slice ) {\n\tconst { markAsDirty, markAsPristine } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/set-is-modified' ),\n\t\t() => {\n\t\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\n\t\t\tif ( currentDocument.editor.isChanged ) {\n\t\t\t\tdispatch( markAsDirty() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( markAsPristine() );\n\t\t}\n\t);\n}\n","import { Document, ExtendedWindow, V1Document } from '../types';\n\nexport function getV1DocumentsManager() {\n\tconst documentsManager = ( window as unknown as ExtendedWindow ).elementor?.documents;\n\n\tif ( ! documentsManager ) {\n\t\tthrow new Error( 'Elementor Editor V1 documents manager not found' );\n\t}\n\n\treturn documentsManager;\n}\n\nexport function normalizeV1Document( documentData: V1Document ): Document {\n\t// Draft or autosave.\n\tconst isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;\n\n\treturn {\n\t\tid: documentData.id,\n\t\ttitle: documentData.container.settings.get( 'post_title' ),\n\t\ttype: {\n\t\t\tvalue: documentData.config.type,\n\t\t\tlabel: documentData.config.panel.title,\n\t\t},\n\t\tstatus: {\n\t\t\tvalue: documentData.config.status.value,\n\t\t\tlabel: documentData.config.status.label,\n\t\t},\n\t\tisDirty: documentData.editor.isChanged || isUnpublishedRevision,\n\t\tisSaving: documentData.editor.isSaving,\n\t\tisSavingDraft: false,\n\t\tuserCan: {\n\t\t\tpublish: documentData.config.user.can_publish,\n\t\t},\n\t};\n}\n","import { Document } from '../types';\nimport { addSlice, PayloadAction } from '@elementor/store';\n\ntype State = {\n\tentities: Record<Document['id'], Document>,\n\tactiveId: Document['id'] | null, // The currently editing document.\n\thostId: Document['id'] | null, // The document that host all the other documents.\n}\n\nexport type Slice = ReturnType<typeof createSlice>;\n\nconst initialState: State = {\n\tentities: {},\n\tactiveId: null,\n\thostId: null,\n};\n\ntype StateWithActiveId = Omit<State, 'activeId'> & { activeId: NonNullable<State['activeId']> };\n\nfunction hasActiveEntity( state: State ): state is StateWithActiveId {\n\treturn !! ( state.activeId && state.entities[ state.activeId ] );\n}\n\nexport function createSlice() {\n\treturn addSlice( {\n\t\tname: 'documents',\n\t\tinitialState,\n\t\treducers: {\n\t\t\tinit( state, { payload } : PayloadAction<State> ) {\n\t\t\t\tstate.entities = payload.entities;\n\t\t\t\tstate.hostId = payload.hostId;\n\t\t\t\tstate.activeId = payload.activeId;\n\t\t\t},\n\n\t\t\tactivateDocument( state, action: PayloadAction<Document> ) {\n\t\t\t\tstate.entities[ action.payload.id ] = action.payload;\n\t\t\t\tstate.activeId = action.payload.id;\n\t\t\t},\n\n\t\t\tstartSaving( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSaving = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSaving( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSaving: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tstartSavingDraft: ( state ) => {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSavingDraft = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSavingDraft( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSavingDraft: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsDirty( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsPristine( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = false;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t} );\n}\n","import { syncStore } from './sync';\nimport { createSlice } from './store';\n\nexport default function init() {\n\tinitStore();\n}\n\nfunction initStore() {\n\tconst slice = createSlice();\n\n\tsyncStore( slice );\n}\n","import { useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import type { Slice } from './index';\nimport { createSelector, SliceState } from '@elementor/store';\n\ntype State = SliceState<Slice>;\n\nconst selectEntities = ( state: State ) => state.documents.entities;\nconst selectActiveId = ( state: State ) => state.documents.activeId;\nconst selectHostId = ( state: State ) => state.documents.hostId;\n\nexport const selectActiveDocument = createSelector(\n\tselectEntities,\n\tselectActiveId,\n\t( entities, activeId ) => activeId && entities[ activeId ]\n\t\t? entities[ activeId ]\n\t\t: null,\n);\n\nexport const selectHostDocument = createSelector(\n\tselectEntities,\n\tselectHostId,\n\t( entities, hostId ) => hostId && entities[ hostId ]\n\t\t? entities[ hostId ]\n\t\t: null,\n);\n","import { useCallback } from 'react';\nimport { openRoute, runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useActiveDocumentActions() {\n\tconst save = useCallback( () => runCommand( 'document/save/default' ), [] );\n\n\tconst saveDraft = useCallback( () => runCommand( 'document/save/draft' ), [] );\n\n\tconst saveTemplate = useCallback( () => openRoute( 'library/save-template' ), [] );\n\n\treturn {\n\t\tsave,\n\t\tsaveDraft,\n\t\tsaveTemplate,\n\t};\n}\n","import { useSelector } from '@elementor/store';\nimport { selectHostDocument } from '../store/selectors';\n\nexport default function useHostDocument() {\n\treturn useSelector( selectHostDocument );\n}\n","import init from './init';\n\nexport * from './hooks';\nexport * from './types';\n\ninit();\n"],"mappings":"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","names":["init","useSelector","useSelector"]}
|
|
1
|
+
{"version":3,"sources":["../src/sync/sync-store.ts","../src/sync/utils.ts","../src/store/index.ts","../src/init.ts","../src/hooks/use-active-document.ts","../src/store/selectors.ts","../src/hooks/use-active-document-actions.ts","../src/hooks/use-host-document.ts","../src/index.ts"],"sourcesContent":["import { Slice } from '../store';\nimport { Document } from '../types';\nimport { dispatch } from '@elementor/store';\nimport { normalizeV1Document, getV1DocumentsManager } from './utils';\nimport {\n\tcommandEndEvent,\n\tCommandEvent,\n\tcommandStartEvent,\n\tListenerEvent,\n\tlistenTo,\n\tv1ReadyEvent,\n} from '@elementor/editor-v1-adapters';\n\nexport function syncStore( slice: Slice ) {\n\tsyncInitialization( slice );\n\tsyncActiveDocument( slice );\n\tsyncOnDocumentSave( slice );\n\tsyncOnDocumentChange( slice );\n}\n\nfunction syncInitialization( slice: Slice ) {\n\tconst { init } = slice.actions;\n\n\tlistenTo(\n\t\tv1ReadyEvent(),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\n\t\t\tconst entities = Object.entries( documentsManager.documents )\n\t\t\t\t.reduce( ( acc: Record<string, Document>, [ id, document ] ) => {\n\t\t\t\t\tacc[ id ] = normalizeV1Document( document );\n\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {} );\n\n\t\t\tdispatch( init( {\n\t\t\t\tentities,\n\t\t\t\thostId: documentsManager.getInitialId(),\n\t\t\t\tactiveId: documentsManager.getCurrentId(),\n\t\t\t} ) );\n\t\t}\n\t);\n}\n\nfunction syncActiveDocument( slice: Slice ) {\n\tconst { activateDocument } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'editor/documents/open' ),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\t\t\tconst currentDocument = normalizeV1Document( documentsManager.getCurrent() );\n\n\t\t\tdispatch( activateDocument( currentDocument ) );\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentSave( slice: Slice ) {\n\tconst { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;\n\n\tconst isDraft = ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ status: string }>;\n\n\t\t/**\n\t\t * @see https://github.com/elementor/elementor/blob/5f815d40a/assets/dev/js/editor/document/save/hooks/ui/save/before.js#L18-L22\n\t\t */\n\t\treturn event.args?.status === 'autosave';\n\t};\n\n\tlistenTo(\n\t\tcommandStartEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( startSavingDraft() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( startSaving() );\n\t\t}\n\t);\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tconst activeDocument = normalizeV1Document(\n\t\t\t\tgetV1DocumentsManager().getCurrent()\n\t\t\t);\n\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( endSavingDraft( activeDocument ) );\n\t\t\t} else {\n\t\t\t\tdispatch( endSaving( activeDocument ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentChange( slice: Slice ) {\n\tconst { markAsDirty, markAsPristine } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/set-is-modified' ),\n\t\t() => {\n\t\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\n\t\t\tif ( currentDocument.editor.isChanged ) {\n\t\t\t\tdispatch( markAsDirty() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( markAsPristine() );\n\t\t}\n\t);\n}\n","import { Document, ExtendedWindow, V1Document } from '../types';\n\nexport function getV1DocumentsManager() {\n\tconst documentsManager = ( window as unknown as ExtendedWindow ).elementor?.documents;\n\n\tif ( ! documentsManager ) {\n\t\tthrow new Error( 'Elementor Editor V1 documents manager not found' );\n\t}\n\n\treturn documentsManager;\n}\n\nexport function normalizeV1Document( documentData: V1Document ): Document {\n\t// Draft or autosave.\n\tconst isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;\n\n\treturn {\n\t\tid: documentData.id,\n\t\ttitle: documentData.container.settings.get( 'post_title' ),\n\t\ttype: {\n\t\t\tvalue: documentData.config.type,\n\t\t\tlabel: documentData.config.panel.title,\n\t\t},\n\t\tstatus: {\n\t\t\tvalue: documentData.config.status.value,\n\t\t\tlabel: documentData.config.status.label,\n\t\t},\n\t\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 { Document } from '../types';\nimport { addSlice, PayloadAction } from '@elementor/store';\n\ntype State = {\n\tentities: Record<Document['id'], Document>,\n\tactiveId: Document['id'] | null, // The currently editing document.\n\thostId: Document['id'] | null, // The document that host all the other documents.\n}\n\nexport type Slice = ReturnType<typeof createSlice>;\n\nconst initialState: State = {\n\tentities: {},\n\tactiveId: null,\n\thostId: null,\n};\n\ntype StateWithActiveId = Omit<State, 'activeId'> & { activeId: NonNullable<State['activeId']> };\n\nfunction hasActiveEntity( state: State ): state is StateWithActiveId {\n\treturn !! ( state.activeId && state.entities[ state.activeId ] );\n}\n\nexport function createSlice() {\n\treturn addSlice( {\n\t\tname: 'documents',\n\t\tinitialState,\n\t\treducers: {\n\t\t\tinit( state, { payload } : PayloadAction<State> ) {\n\t\t\t\tstate.entities = payload.entities;\n\t\t\t\tstate.hostId = payload.hostId;\n\t\t\t\tstate.activeId = payload.activeId;\n\t\t\t},\n\n\t\t\tactivateDocument( state, action: PayloadAction<Document> ) {\n\t\t\t\tstate.entities[ action.payload.id ] = action.payload;\n\t\t\t\tstate.activeId = action.payload.id;\n\t\t\t},\n\n\t\t\tstartSaving( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSaving = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSaving( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSaving: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tstartSavingDraft: ( state ) => {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSavingDraft = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSavingDraft( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSavingDraft: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsDirty( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsPristine( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = false;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t} );\n}\n","import { syncStore } from './sync';\nimport { createSlice } from './store';\n\nexport default function init() {\n\tinitStore();\n}\n\nfunction initStore() {\n\tconst slice = createSlice();\n\n\tsyncStore( slice );\n}\n","import { useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import type { Slice } from './index';\nimport { createSelector, SliceState } from '@elementor/store';\n\ntype State = SliceState<Slice>;\n\nconst selectEntities = ( state: State ) => state.documents.entities;\nconst selectActiveId = ( state: State ) => state.documents.activeId;\nconst selectHostId = ( state: State ) => state.documents.hostId;\n\nexport const selectActiveDocument = createSelector(\n\tselectEntities,\n\tselectActiveId,\n\t( entities, activeId ) => activeId && entities[ activeId ]\n\t\t? entities[ activeId ]\n\t\t: null,\n);\n\nexport const selectHostDocument = createSelector(\n\tselectEntities,\n\tselectHostId,\n\t( entities, hostId ) => hostId && entities[ hostId ]\n\t\t? entities[ hostId ]\n\t\t: null,\n);\n","import { useCallback } from 'react';\nimport { openRoute, runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useActiveDocumentActions() {\n\tconst save = useCallback( () => runCommand( 'document/save/default' ), [] );\n\n\tconst saveDraft = useCallback( () => runCommand( 'document/save/draft' ), [] );\n\n\tconst saveTemplate = useCallback( () => openRoute( 'library/save-template' ), [] );\n\n\treturn {\n\t\tsave,\n\t\tsaveDraft,\n\t\tsaveTemplate,\n\t};\n}\n","import { useSelector } from '@elementor/store';\nimport { selectHostDocument } from '../store/selectors';\n\nexport default function useHostDocument() {\n\treturn useSelector( selectHostDocument );\n}\n","import init from './init';\n\nexport * from './hooks';\nexport * from './types';\n\ninit();\n"],"mappings":"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","names":["init","useSelector","useSelector"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-documents",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.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": "ccd6099031737d52202ba98812e21d16fac4bef2"
|
|
45
45
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { syncStore } from '../index';
|
|
2
2
|
import { Slice, createSlice } from '../../store';
|
|
3
|
-
import { ExtendedWindow, V1Document } from '../../types';
|
|
3
|
+
import { ExtendedWindow, V1Document, Document } from '../../types';
|
|
4
4
|
import { createStore, SliceState, Store } from '@elementor/store';
|
|
5
5
|
import {
|
|
6
6
|
dispatchCommandAfter,
|
|
@@ -39,7 +39,7 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
39
39
|
// Assert.
|
|
40
40
|
const storeState = store.getState();
|
|
41
41
|
|
|
42
|
-
expect( storeState.documents.entities ).toEqual( {
|
|
42
|
+
expect( storeState.documents.entities ).toEqual<Record<number, Document>>( {
|
|
43
43
|
1: {
|
|
44
44
|
id: 1,
|
|
45
45
|
title: 'Document 1',
|
|
@@ -51,6 +51,9 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
51
51
|
value: 'publish',
|
|
52
52
|
label: 'PUBLISH',
|
|
53
53
|
},
|
|
54
|
+
links: {
|
|
55
|
+
platformEdit: 'https://localhost/wp-admin/post.php?post=1&action=edit',
|
|
56
|
+
},
|
|
54
57
|
isDirty: false,
|
|
55
58
|
isSaving: false,
|
|
56
59
|
isSavingDraft: false,
|
|
@@ -69,6 +72,9 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
69
72
|
value: 'publish',
|
|
70
73
|
label: 'PUBLISH',
|
|
71
74
|
},
|
|
75
|
+
links: {
|
|
76
|
+
platformEdit: 'https://localhost/wp-admin/post.php?post=2&action=edit',
|
|
77
|
+
},
|
|
72
78
|
isDirty: false,
|
|
73
79
|
isSaving: false,
|
|
74
80
|
isSavingDraft: false,
|
|
@@ -101,13 +107,16 @@ describe( '@elementor/editor-documents - Sync Store', () => {
|
|
|
101
107
|
// Assert.
|
|
102
108
|
const currentDocument = selectActiveDocument( store.getState() );
|
|
103
109
|
|
|
104
|
-
expect( currentDocument ).toEqual( {
|
|
110
|
+
expect( currentDocument ).toEqual<Document>( {
|
|
105
111
|
id: 2,
|
|
106
112
|
title: 'Document 2',
|
|
107
113
|
type: {
|
|
108
114
|
value: 'wp-page',
|
|
109
115
|
label: 'WP-PAGE',
|
|
110
116
|
},
|
|
117
|
+
links: {
|
|
118
|
+
platformEdit: 'https://localhost/wp-admin/post.php?post=2&action=edit',
|
|
119
|
+
},
|
|
111
120
|
status: {
|
|
112
121
|
value: 'publish',
|
|
113
122
|
label: 'PUBLISH',
|
package/src/sync/utils.ts
CHANGED
|
@@ -25,6 +25,9 @@ export function normalizeV1Document( documentData: V1Document ): Document {
|
|
|
25
25
|
value: documentData.config.status.value,
|
|
26
26
|
label: documentData.config.status.label,
|
|
27
27
|
},
|
|
28
|
+
links: {
|
|
29
|
+
platformEdit: documentData.config.urls.exit_to_dashboard,
|
|
30
|
+
},
|
|
28
31
|
isDirty: documentData.editor.isChanged || isUnpublishedRevision,
|
|
29
32
|
isSaving: documentData.editor.isSaving,
|
|
30
33
|
isSavingDraft: false,
|
package/src/types.ts
CHANGED
|
@@ -9,6 +9,9 @@ export type Document = {
|
|
|
9
9
|
value: string,
|
|
10
10
|
label: string,
|
|
11
11
|
},
|
|
12
|
+
links: {
|
|
13
|
+
platformEdit: string,
|
|
14
|
+
}
|
|
12
15
|
isDirty: boolean,
|
|
13
16
|
isSaving: boolean,
|
|
14
17
|
isSavingDraft: boolean,
|
|
@@ -44,7 +47,10 @@ export type V1Document = {
|
|
|
44
47
|
status: {
|
|
45
48
|
value: string,
|
|
46
49
|
label: string,
|
|
47
|
-
}
|
|
50
|
+
},
|
|
51
|
+
urls: {
|
|
52
|
+
exit_to_dashboard: string,
|
|
53
|
+
},
|
|
48
54
|
},
|
|
49
55
|
editor: {
|
|
50
56
|
isChanged: boolean,
|