@elementor/editor-documents 0.11.4 → 0.11.5
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 +16 -105
- package/dist/index.js +41 -59
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +41 -59
- package/dist/index.mjs.map +1 -1
- package/package.json +42 -42
- package/src/hooks/__tests__/use-active-document-actions.test.ts +3 -11
- package/src/hooks/__tests__/use-active-document.test.tsx +1 -1
- package/src/hooks/__tests__/use-host-document.test.tsx +15 -11
- package/src/hooks/__tests__/use-sync-document-title.test.ts +42 -32
- package/src/hooks/use-sync-document-title.ts +2 -5
- package/src/index.ts +1 -3
- package/src/store/index.ts +11 -11
- package/src/store/selectors.ts +5 -13
- package/src/sync/__tests__/sync-store.test.ts +105 -108
- package/src/sync/__tests__/test-utils.ts +23 -19
- package/src/sync/sync-store.ts +52 -71
- package/src/sync/utils.ts +3 -2
- package/src/types.ts +58 -58
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-sync-document-title.ts","../src/hooks/use-host-document.ts","../src/store/selectors.ts","../src/hooks/use-active-document.ts","../src/components/logic-hooks.tsx","../src/hooks/use-active-document-actions.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';\nimport { injectIntoLogic } from '@elementor/editor';\nimport { LogicHooks } from './components/logic-hooks';\n\nexport default function init() {\n\tinitStore();\n\n\tinjectIntoLogic( {\n\t\tid: 'documents-hooks',\n\t\tcomponent: LogicHooks,\n\t} );\n}\n\nfunction initStore() {\n\t__registerSlice( slice );\n\n\tsyncStore();\n}\n","import { useEffect } from 'react';\nimport useHostDocument from './use-host-document';\nimport useActiveDocument from './use-active-document';\nimport { __ } from '@wordpress/i18n';\n\nexport default function useSyncDocumentTitle() {\n\tconst activeDocument = useActiveDocument();\n\tconst hostDocument = useHostDocument();\n\n\tconst document = activeDocument && activeDocument.type.value !== 'kit'\n\t\t? activeDocument\n\t\t: hostDocument;\n\n\tuseEffect( () => {\n\t\t// Allow empty string as title.\n\t\tif ( document?.title === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// translators: %s: Document title.\n\t\tconst title = __( 'Edit \"%s\" with Elementor', 'elementor' )\n\t\t\t.replace( '%s', document.title );\n\n\t\twindow.document.title = title;\n\t}, [ document?.title ] );\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 { 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 { __useSelector as useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import useSyncDocumentTitle from '../hooks/use-sync-document-title';\n\nexport function LogicHooks() {\n\tuseSyncDocumentTitle();\n\n\treturn 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 { 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"]}
|
|
1
|
+
{"version":3,"sources":["../src/store/index.ts","../src/sync/sync-store.ts","../src/sync/utils.ts","../src/init.ts","../src/hooks/use-sync-document-title.ts","../src/hooks/use-host-document.ts","../src/store/selectors.ts","../src/hooks/use-active-document.ts","../src/components/logic-hooks.tsx","../src/hooks/use-active-document-actions.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( v1ReadyEvent(), () => {\n\t\tconst documentsManager = getV1DocumentsManager();\n\n\t\tconst entities = Object.entries( documentsManager.documents ).reduce(\n\t\t\t( acc: Record< string, Document >, [ id, document ] ) => {\n\t\t\t\tacc[ id ] = normalizeV1Document( document );\n\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{}\n\t\t);\n\n\t\t__dispatch(\n\t\t\tinit( {\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( commandEndEvent( 'editor/documents/open' ), () => {\n\t\tconst documentsManager = getV1DocumentsManager();\n\t\tconst currentDocument = normalizeV1Document( documentsManager.getCurrent() );\n\n\t\t__dispatch( activateDocument( currentDocument ) );\n\n\t\tif ( documentsManager.getInitialId() === currentDocument.id ) {\n\t\t\t__dispatch( setAsHost( currentDocument.id ) );\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( commandStartEvent( 'document/save/save' ), ( e ) => {\n\t\tif ( isDraft( e ) ) {\n\t\t\t__dispatch( startSavingDraft() );\n\t\t\treturn;\n\t\t}\n\n\t\t__dispatch( startSaving() );\n\t} );\n\n\tlistenTo( commandEndEvent( 'document/save/save' ), ( e ) => {\n\t\tconst activeDocument = normalizeV1Document( getV1DocumentsManager().getCurrent() );\n\n\t\tif ( isDraft( e ) ) {\n\t\t\t__dispatch( endSavingDraft( activeDocument ) );\n\t\t} else {\n\t\t\t__dispatch( endSaving( activeDocument ) );\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( commandEndEvent( 'document/elements/settings' ), updateTitle );\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( commandEndEvent( 'document/elements/settings' ), updateExitTo );\n}\n\nfunction syncOnDocumentChange() {\n\tconst { markAsDirty, markAsPristine } = slice.actions;\n\n\tlistenTo( commandEndEvent( 'document/save/set-is-modified' ), () => {\n\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\n\t\tif ( currentDocument.editor.isChanged ) {\n\t\t\t__dispatch( markAsDirty() );\n\t\t\treturn;\n\t\t}\n\n\t\t__dispatch( markAsPristine() );\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 =\n\t\t( 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';\nimport { injectIntoLogic } from '@elementor/editor';\nimport { LogicHooks } from './components/logic-hooks';\n\nexport default function init() {\n\tinitStore();\n\n\tinjectIntoLogic( {\n\t\tid: 'documents-hooks',\n\t\tcomponent: LogicHooks,\n\t} );\n}\n\nfunction initStore() {\n\t__registerSlice( slice );\n\n\tsyncStore();\n}\n","import { useEffect } from 'react';\nimport useHostDocument from './use-host-document';\nimport useActiveDocument from './use-active-document';\nimport { __ } from '@wordpress/i18n';\n\nexport default function useSyncDocumentTitle() {\n\tconst activeDocument = useActiveDocument();\n\tconst hostDocument = useHostDocument();\n\n\tconst document = activeDocument && activeDocument.type.value !== 'kit' ? activeDocument : hostDocument;\n\n\tuseEffect( () => {\n\t\t// Allow empty string as title.\n\t\tif ( document?.title === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// translators: %s: Document title.\n\t\tconst title = __( 'Edit \"%s\" with Elementor', 'elementor' ).replace( '%s', document.title );\n\n\t\twindow.document.title = title;\n\t}, [ document?.title ] );\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 { 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( selectEntities, selectActiveId, ( entities, activeId ) =>\n\tactiveId && entities[ activeId ] ? entities[ activeId ] : null\n);\n\nexport const selectHostDocument = __createSelector( selectEntities, selectHostId, ( entities, hostId ) =>\n\thostId && entities[ hostId ] ? entities[ hostId ] : null\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 useSyncDocumentTitle from '../hooks/use-sync-document-title';\n\nexport function LogicHooks() {\n\tuseSyncDocumentTitle();\n\n\treturn 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 { 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 { slice } 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,44 +1,44 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
2
|
+
"name": "@elementor/editor-documents",
|
|
3
|
+
"version": "0.11.5",
|
|
4
|
+
"private": false,
|
|
5
|
+
"author": "Elementor Team",
|
|
6
|
+
"homepage": "https://elementor.com/",
|
|
7
|
+
"license": "GPL-3.0-or-later",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"module": "dist/index.mjs",
|
|
10
|
+
"types": "dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.mjs",
|
|
14
|
+
"require": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./package.json": "./package.json"
|
|
18
|
+
},
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/elementor/elementor-packages.git",
|
|
22
|
+
"directory": "packages/core/editor-documents"
|
|
23
|
+
},
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/elementor/elementor-packages/issues"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsup --config=../../tsup.build.ts",
|
|
32
|
+
"dev": "tsup --config=../../tsup.dev.ts"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@elementor/editor": "^0.11.2",
|
|
36
|
+
"@elementor/editor-v1-adapters": "^0.8.0",
|
|
37
|
+
"@elementor/store": "^0.8.4",
|
|
38
|
+
"@wordpress/i18n": "^4.45.0"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"react": "^18.3.1"
|
|
42
|
+
},
|
|
43
|
+
"gitHead": "10fd8663495a9ced2521f27a74879684ed0cf322"
|
|
44
44
|
}
|
|
@@ -7,7 +7,7 @@ import { renderHookWithStore } from 'test-utils';
|
|
|
7
7
|
jest.mock( '@elementor/editor-v1-adapters' );
|
|
8
8
|
|
|
9
9
|
describe( '@elementor/editor-documents - useActiveDocumentActions', () => {
|
|
10
|
-
let store: Store<SliceState<typeof slice
|
|
10
|
+
let store: Store< SliceState< typeof slice > >;
|
|
11
11
|
|
|
12
12
|
beforeEach( () => {
|
|
13
13
|
__registerSlice( slice );
|
|
@@ -18,11 +18,7 @@ describe( '@elementor/editor-documents - useActiveDocumentActions', () => {
|
|
|
18
18
|
// Arrange.
|
|
19
19
|
const { result } = renderHookWithStore( useActiveDocumentActions, store );
|
|
20
20
|
|
|
21
|
-
const {
|
|
22
|
-
save,
|
|
23
|
-
saveDraft,
|
|
24
|
-
saveTemplate,
|
|
25
|
-
} = result.current;
|
|
21
|
+
const { save, saveDraft, saveTemplate } = result.current;
|
|
26
22
|
|
|
27
23
|
// Act.
|
|
28
24
|
save();
|
|
@@ -43,11 +39,7 @@ describe( '@elementor/editor-documents - useActiveDocumentActions', () => {
|
|
|
43
39
|
// Arrange.
|
|
44
40
|
const { result, rerender } = renderHookWithStore( useActiveDocumentActions, store );
|
|
45
41
|
|
|
46
|
-
const {
|
|
47
|
-
save,
|
|
48
|
-
saveDraft,
|
|
49
|
-
saveTemplate,
|
|
50
|
-
} = result.current;
|
|
42
|
+
const { save, saveDraft, saveTemplate } = result.current;
|
|
51
43
|
|
|
52
44
|
// Act.
|
|
53
45
|
rerender();
|
|
@@ -4,7 +4,7 @@ import { __createStore, __dispatch, __registerSlice, SliceState, Store } from '@
|
|
|
4
4
|
import { createMockDocument, renderHookWithStore } from 'test-utils';
|
|
5
5
|
|
|
6
6
|
describe( '@elementor/editor-documents - useActiveDocument', () => {
|
|
7
|
-
let store: Store<SliceState<typeof slice
|
|
7
|
+
let store: Store< SliceState< typeof slice > >;
|
|
8
8
|
|
|
9
9
|
beforeEach( () => {
|
|
10
10
|
__registerSlice( slice );
|
|
@@ -6,7 +6,7 @@ import { createMockDocument, renderHookWithStore } from 'test-utils';
|
|
|
6
6
|
describe( '@elementor/editor-documents - useHostDocument', () => {
|
|
7
7
|
const mockDocument = createMockDocument();
|
|
8
8
|
|
|
9
|
-
let store: Store<SliceState<typeof slice
|
|
9
|
+
let store: Store< SliceState< typeof slice > >;
|
|
10
10
|
|
|
11
11
|
beforeEach( () => {
|
|
12
12
|
__registerSlice( slice );
|
|
@@ -15,11 +15,13 @@ describe( '@elementor/editor-documents - useHostDocument', () => {
|
|
|
15
15
|
|
|
16
16
|
it( 'should return the host document', () => {
|
|
17
17
|
// Arrange.
|
|
18
|
-
__dispatch(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
__dispatch(
|
|
19
|
+
slice.actions.init( {
|
|
20
|
+
entities: { [ mockDocument.id ]: mockDocument },
|
|
21
|
+
activeId: null,
|
|
22
|
+
hostId: mockDocument.id,
|
|
23
|
+
} )
|
|
24
|
+
);
|
|
23
25
|
|
|
24
26
|
// Act.
|
|
25
27
|
const { result } = renderHookWithStore( useHostDocument, store );
|
|
@@ -30,11 +32,13 @@ describe( '@elementor/editor-documents - useHostDocument', () => {
|
|
|
30
32
|
|
|
31
33
|
it( 'should return null when the host document is not found', () => {
|
|
32
34
|
// Arrange.
|
|
33
|
-
__dispatch(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
__dispatch(
|
|
36
|
+
slice.actions.init( {
|
|
37
|
+
entities: { [ mockDocument.id ]: mockDocument },
|
|
38
|
+
activeId: null,
|
|
39
|
+
hostId: null,
|
|
40
|
+
} )
|
|
41
|
+
);
|
|
38
42
|
|
|
39
43
|
// Act.
|
|
40
44
|
const { result } = renderHookWithStore( useHostDocument, store );
|
|
@@ -14,13 +14,15 @@ describe( 'useSyncDocumentTitle', () => {
|
|
|
14
14
|
|
|
15
15
|
it( 'should set the document title to be the active document', () => {
|
|
16
16
|
// Arrange - set the initial document.
|
|
17
|
-
jest.mocked( useActiveDocument ).mockReturnValue(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
jest.mocked( useActiveDocument ).mockReturnValue(
|
|
18
|
+
createMockDocument( {
|
|
19
|
+
type: {
|
|
20
|
+
value: 'page',
|
|
21
|
+
label: 'Page',
|
|
22
|
+
},
|
|
23
|
+
title: 'Initial Document',
|
|
24
|
+
} )
|
|
25
|
+
);
|
|
24
26
|
|
|
25
27
|
// Act.
|
|
26
28
|
const { rerender } = renderHook( useSyncDocumentTitle );
|
|
@@ -29,13 +31,15 @@ describe( 'useSyncDocumentTitle', () => {
|
|
|
29
31
|
expect( window.document.title ).toBe( 'Edit "Initial Document" with Elementor' );
|
|
30
32
|
|
|
31
33
|
// Arrange - set the new document.
|
|
32
|
-
jest.mocked( useActiveDocument ).mockReturnValue(
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
jest.mocked( useActiveDocument ).mockReturnValue(
|
|
35
|
+
createMockDocument( {
|
|
36
|
+
type: {
|
|
37
|
+
value: 'page',
|
|
38
|
+
label: 'Page',
|
|
39
|
+
},
|
|
40
|
+
title: 'New Document',
|
|
41
|
+
} )
|
|
42
|
+
);
|
|
39
43
|
|
|
40
44
|
// Act.
|
|
41
45
|
rerender();
|
|
@@ -46,21 +50,25 @@ describe( 'useSyncDocumentTitle', () => {
|
|
|
46
50
|
|
|
47
51
|
it( 'should use the host document title when the active document is a kit', () => {
|
|
48
52
|
// Arrange.
|
|
49
|
-
jest.mocked( useActiveDocument ).mockReturnValue(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
53
|
+
jest.mocked( useActiveDocument ).mockReturnValue(
|
|
54
|
+
createMockDocument( {
|
|
55
|
+
type: {
|
|
56
|
+
value: 'kit',
|
|
57
|
+
label: 'Kit',
|
|
58
|
+
},
|
|
59
|
+
title: 'My Kit',
|
|
60
|
+
} )
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
jest.mocked( useHostDocument ).mockReturnValue(
|
|
64
|
+
createMockDocument( {
|
|
65
|
+
type: {
|
|
66
|
+
value: 'page',
|
|
67
|
+
label: 'Page',
|
|
68
|
+
},
|
|
69
|
+
title: 'My Page',
|
|
70
|
+
} )
|
|
71
|
+
);
|
|
64
72
|
|
|
65
73
|
window.document.title = 'Old title';
|
|
66
74
|
|
|
@@ -86,9 +94,11 @@ describe( 'useSyncDocumentTitle', () => {
|
|
|
86
94
|
|
|
87
95
|
it( 'should allow empty string as title', () => {
|
|
88
96
|
// Arrange.
|
|
89
|
-
jest.mocked( useActiveDocument ).mockReturnValue(
|
|
90
|
-
|
|
91
|
-
|
|
97
|
+
jest.mocked( useActiveDocument ).mockReturnValue(
|
|
98
|
+
createMockDocument( {
|
|
99
|
+
title: '',
|
|
100
|
+
} )
|
|
101
|
+
);
|
|
92
102
|
|
|
93
103
|
// Act.
|
|
94
104
|
renderHook( useSyncDocumentTitle );
|
|
@@ -7,9 +7,7 @@ export default function useSyncDocumentTitle() {
|
|
|
7
7
|
const activeDocument = useActiveDocument();
|
|
8
8
|
const hostDocument = useHostDocument();
|
|
9
9
|
|
|
10
|
-
const document = activeDocument && activeDocument.type.value !== 'kit'
|
|
11
|
-
? activeDocument
|
|
12
|
-
: hostDocument;
|
|
10
|
+
const document = activeDocument && activeDocument.type.value !== 'kit' ? activeDocument : hostDocument;
|
|
13
11
|
|
|
14
12
|
useEffect( () => {
|
|
15
13
|
// Allow empty string as title.
|
|
@@ -18,8 +16,7 @@ export default function useSyncDocumentTitle() {
|
|
|
18
16
|
}
|
|
19
17
|
|
|
20
18
|
// translators: %s: Document title.
|
|
21
|
-
const title = __( 'Edit "%s" with Elementor', 'elementor' )
|
|
22
|
-
.replace( '%s', document.title );
|
|
19
|
+
const title = __( 'Edit "%s" with Elementor', 'elementor' ).replace( '%s', document.title );
|
|
23
20
|
|
|
24
21
|
window.document.title = title;
|
|
25
22
|
}, [ document?.title ] );
|
package/src/index.ts
CHANGED
package/src/store/index.ts
CHANGED
|
@@ -2,10 +2,10 @@ import { Document } from '../types';
|
|
|
2
2
|
import { __createSlice, PayloadAction } from '@elementor/store';
|
|
3
3
|
|
|
4
4
|
type State = {
|
|
5
|
-
entities: Record<Document['id'], Document
|
|
6
|
-
activeId: Document['id'] | null
|
|
7
|
-
hostId: Document['id'] | null
|
|
8
|
-
}
|
|
5
|
+
entities: Record< Document[ 'id' ], Document >;
|
|
6
|
+
activeId: Document[ 'id' ] | null; // The currently editing document.
|
|
7
|
+
hostId: Document[ 'id' ] | null; // The document that host all the other documents.
|
|
8
|
+
};
|
|
9
9
|
|
|
10
10
|
const initialState: State = {
|
|
11
11
|
entities: {},
|
|
@@ -13,7 +13,7 @@ const initialState: State = {
|
|
|
13
13
|
hostId: null,
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
-
type StateWithActiveId = Omit<State, 'activeId'> & { activeId: NonNullable<State['activeId']> };
|
|
16
|
+
type StateWithActiveId = Omit< State, 'activeId' > & { activeId: NonNullable< State[ 'activeId' ] > };
|
|
17
17
|
|
|
18
18
|
function hasActiveEntity( state: State ): state is StateWithActiveId {
|
|
19
19
|
return !! ( state.activeId && state.entities[ state.activeId ] );
|
|
@@ -23,22 +23,22 @@ export const slice = __createSlice( {
|
|
|
23
23
|
name: 'documents',
|
|
24
24
|
initialState,
|
|
25
25
|
reducers: {
|
|
26
|
-
init( state, { payload }
|
|
26
|
+
init( state, { payload }: PayloadAction< State > ) {
|
|
27
27
|
state.entities = payload.entities;
|
|
28
28
|
state.hostId = payload.hostId;
|
|
29
29
|
state.activeId = payload.activeId;
|
|
30
30
|
},
|
|
31
31
|
|
|
32
|
-
activateDocument( state, action: PayloadAction<Document> ) {
|
|
32
|
+
activateDocument( state, action: PayloadAction< Document > ) {
|
|
33
33
|
state.entities[ action.payload.id ] = action.payload;
|
|
34
34
|
state.activeId = action.payload.id;
|
|
35
35
|
},
|
|
36
36
|
|
|
37
|
-
setAsHost( state, action: PayloadAction<Document['id']> ) {
|
|
37
|
+
setAsHost( state, action: PayloadAction< Document[ 'id' ] > ) {
|
|
38
38
|
state.hostId = action.payload;
|
|
39
39
|
},
|
|
40
40
|
|
|
41
|
-
updateActiveDocument( state, action: PayloadAction<Partial<Document
|
|
41
|
+
updateActiveDocument( state, action: PayloadAction< Partial< Document > > ) {
|
|
42
42
|
if ( hasActiveEntity( state ) ) {
|
|
43
43
|
state.entities[ state.activeId ] = {
|
|
44
44
|
...state.entities[ state.activeId ],
|
|
@@ -53,7 +53,7 @@ export const slice = __createSlice( {
|
|
|
53
53
|
}
|
|
54
54
|
},
|
|
55
55
|
|
|
56
|
-
endSaving( state, action: PayloadAction<Document> ) {
|
|
56
|
+
endSaving( state, action: PayloadAction< Document > ) {
|
|
57
57
|
if ( hasActiveEntity( state ) ) {
|
|
58
58
|
state.entities[ state.activeId ] = {
|
|
59
59
|
...action.payload,
|
|
@@ -68,7 +68,7 @@ export const slice = __createSlice( {
|
|
|
68
68
|
}
|
|
69
69
|
},
|
|
70
70
|
|
|
71
|
-
endSavingDraft( state, action: PayloadAction<Document> ) {
|
|
71
|
+
endSavingDraft( state, action: PayloadAction< Document > ) {
|
|
72
72
|
if ( hasActiveEntity( state ) ) {
|
|
73
73
|
state.entities[ state.activeId ] = {
|
|
74
74
|
...action.payload,
|
package/src/store/selectors.ts
CHANGED
|
@@ -1,24 +1,16 @@
|
|
|
1
1
|
import { slice } from './index';
|
|
2
2
|
import { __createSelector, SliceState } from '@elementor/store';
|
|
3
3
|
|
|
4
|
-
type State = SliceState<typeof slice>;
|
|
4
|
+
type State = SliceState< typeof slice >;
|
|
5
5
|
|
|
6
6
|
const selectEntities = ( state: State ) => state.documents.entities;
|
|
7
7
|
const selectActiveId = ( state: State ) => state.documents.activeId;
|
|
8
8
|
const selectHostId = ( state: State ) => state.documents.hostId;
|
|
9
9
|
|
|
10
|
-
export const selectActiveDocument = __createSelector(
|
|
11
|
-
|
|
12
|
-
selectActiveId,
|
|
13
|
-
( entities, activeId ) => activeId && entities[ activeId ]
|
|
14
|
-
? entities[ activeId ]
|
|
15
|
-
: null,
|
|
10
|
+
export const selectActiveDocument = __createSelector( selectEntities, selectActiveId, ( entities, activeId ) =>
|
|
11
|
+
activeId && entities[ activeId ] ? entities[ activeId ] : null
|
|
16
12
|
);
|
|
17
13
|
|
|
18
|
-
export const selectHostDocument = __createSelector(
|
|
19
|
-
|
|
20
|
-
selectHostId,
|
|
21
|
-
( entities, hostId ) => hostId && entities[ hostId ]
|
|
22
|
-
? entities[ hostId ]
|
|
23
|
-
: null,
|
|
14
|
+
export const selectHostDocument = __createSelector( selectEntities, selectHostId, ( entities, hostId ) =>
|
|
15
|
+
hostId && entities[ hostId ] ? entities[ hostId ] : null
|
|
24
16
|
);
|