@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
8 lines (7 loc) • 10.4 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/components/post-revisions-timeline/index.js"],
"sourcesContent": ["import { useSelect, useDispatch } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { DataViewsPicker, filterSortAndPaginate } from '@wordpress/dataviews';\nimport { dateI18n, getDate, humanTimeDiff, getSettings } from '@wordpress/date';\nimport { useCallback, useEffect, useMemo, useState } from '@wordpress/element';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { authorField } from '@wordpress/fields';\nimport { Badge, Stack, Text } from '@wordpress/ui';\nimport { store as editorStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\nimport { PostContentInformationUI } from '../post-content-information';\n\nconst PAGE_SIZE = 10;\nconst EMPTY_ARRAY = [];\nconst defaultLayouts = { pickerActivity: true };\nconst baseView = {\n\ttype: 'pickerActivity',\n\ttitleField: 'date',\n\tdescriptionField: 'details',\n\tfields: [ 'author' ],\n\tlayout: { density: 'compact' },\n\tpage: 1,\n\tperPage: PAGE_SIZE,\n};\n\nconst DAY_IN_MILLISECONDS = 86400000;\n\nfunction getDisplayDate( value ) {\n\tconst dateNowInMs = getDate( null ).getTime();\n\tconst date = getDate( value ?? null );\n\treturn dateNowInMs - date.getTime() > DAY_IN_MILLISECONDS\n\t\t? dateI18n( getSettings().formats.datetimeAbbreviated, date )\n\t\t: humanTimeDiff( date );\n}\n\nfunction isAutosaveRevision( item ) {\n\t// Autosaves use the `{parent_id}-autosave-v1` slug, like Core's `wp_is_post_autosave()`.\n\treturn item.slug?.endsWith( '-autosave-v1' ) ?? false;\n}\n\nfunction RevisionBadges( { item } ) {\n\tif ( ! isAutosaveRevision( item ) ) {\n\t\treturn null;\n\t}\n\n\treturn <Badge intent=\"none\">{ __( 'Autosave' ) }</Badge>;\n}\n\nexport default function PostRevisionsTimeline() {\n\tconst { setCurrentRevisionId } = unlock( useDispatch( editorStore ) );\n\tconst [ view, setView ] = useState( baseView );\n\n\tconst { revisions, revisionKey, currentRevisionId } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getCurrentPostType } = select( editorStore );\n\t\t\tconst {\n\t\t\t\tgetCurrentRevisionId: _getCurrentRevisionId,\n\t\t\t\tgetRevisionPage,\n\t\t\t\tgetPageRevisions,\n\t\t\t} = unlock( select( editorStore ) );\n\t\t\tconst { getEntityConfig } = select( coreStore );\n\n\t\t\tconst _postType = getCurrentPostType();\n\t\t\tconst entityConfig = getEntityConfig( 'postType', _postType );\n\t\t\tconst _revisionKey = entityConfig?.revisionKey || 'id';\n\t\t\tconst _currentRevisionId = _getCurrentRevisionId();\n\n\t\t\treturn {\n\t\t\t\t// Same desc-ordered window the header slider renders (warm cache).\n\t\t\t\trevisions: getPageRevisions( getRevisionPage() ),\n\t\t\t\trevisionKey: _revisionKey,\n\t\t\t\tcurrentRevisionId: _currentRevisionId,\n\t\t\t};\n\t\t},\n\t\t[]\n\t);\n\n\tconst isLoading = ! revisions;\n\n\tconst fields = useMemo(\n\t\t() => [\n\t\t\t{\n\t\t\t\tid: 'date',\n\t\t\t\tlabel: __( 'Date' ),\n\t\t\t\t// Return the humanized label the row renders so the picker\n\t\t\t\t// option's accessible name announces e.g. \"5 minutes ago\"\n\t\t\t\t// instead of the raw ISO timestamp.\n\t\t\t\tgetValue: ( { item } ) => {\n\t\t\t\t\tconst displayDate = getDisplayDate( item.date );\n\n\t\t\t\t\tif ( ! isAutosaveRevision( item ) ) {\n\t\t\t\t\t\treturn displayDate;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn sprintf(\n\t\t\t\t\t\t/* translators: 1: revision date, 2: revision type. */\n\t\t\t\t\t\t__( '%1$s, %2$s' ),\n\t\t\t\t\t\tdisplayDate,\n\t\t\t\t\t\t__( 'Autosave' )\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\trender: ( { item } ) => (\n\t\t\t\t\t<Stack direction=\"row\" align=\"center\" gap=\"sm\">\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\tvariant=\"heading-sm\"\n\t\t\t\t\t\t\trender={ <time dateTime={ item.date } /> }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ getDisplayDate( item.date ) }\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<RevisionBadges item={ item } />\n\t\t\t\t\t</Stack>\n\t\t\t\t),\n\t\t\t\tenableSorting: false,\n\t\t\t\tenableHiding: false,\n\t\t\t},\n\t\t\tauthorField,\n\t\t\t{\n\t\t\t\tid: 'details',\n\t\t\t\tlabel: __( 'Details' ),\n\t\t\t\trender: ( { item } ) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tString( item[ revisionKey ] ) !==\n\t\t\t\t\t\tString( currentRevisionId )\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<PostContentInformationUI\n\t\t\t\t\t\t\tpostContent={ item.content?.raw }\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tenableSorting: false,\n\t\t\t\tenableHiding: false,\n\t\t\t},\n\t\t],\n\t\t[ revisionKey, currentRevisionId ]\n\t);\n\n\tconst { data: shownRevisions, paginationInfo } = useMemo(\n\t\t() => filterSortAndPaginate( revisions || EMPTY_ARRAY, view, fields ),\n\t\t[ revisions, view, fields ]\n\t);\n\n\t// Keep the selected revision visible: when it changes (e.g. the slider\n\t// scrubs), jump to the client-side page that contains it. Keyed on the\n\t// selection/data, not view.page, so manual paging stays free browsing.\n\tuseEffect( () => {\n\t\tif ( ! currentRevisionId || ! revisions ) {\n\t\t\treturn;\n\t\t}\n\t\tconst index = revisions.findIndex(\n\t\t\t( r ) => String( r[ revisionKey ] ) === String( currentRevisionId )\n\t\t);\n\t\tif ( index < 0 ) {\n\t\t\treturn;\n\t\t}\n\t\tconst page = Math.floor( index / view.perPage ) + 1;\n\t\tsetView( ( v ) => ( v.page === page ? v : { ...v, page } ) );\n\t}, [ currentRevisionId, revisions, revisionKey, view.perPage ] );\n\n\tconst selection = useMemo(\n\t\t() =>\n\t\t\tcurrentRevisionId ? [ String( currentRevisionId ) ] : EMPTY_ARRAY,\n\t\t[ currentRevisionId ]\n\t);\n\n\tconst onChangeSelection = useCallback(\n\t\t( newSelection ) => {\n\t\t\t// Revisions mode always keeps one revision selected. Clicking the\n\t\t\t// active revision yields an empty selection, which we ignore so the\n\t\t\t// timeline never ends up with nothing selected.\n\t\t\tif ( newSelection.length === 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst selectedId = newSelection[ newSelection.length - 1 ];\n\t\t\tsetCurrentRevisionId( Number( selectedId ) );\n\t\t},\n\t\t[ setCurrentRevisionId ]\n\t);\n\n\tconst getItemId = useCallback(\n\t\t( item ) => String( item[ revisionKey ] ),\n\t\t[ revisionKey ]\n\t);\n\n\treturn (\n\t\t<div className=\"editor-post-revisions-timeline\">\n\t\t\t<DataViewsPicker\n\t\t\t\tview={ view }\n\t\t\t\tonChangeView={ setView }\n\t\t\t\tfields={ fields }\n\t\t\t\tdata={ shownRevisions }\n\t\t\t\tisLoading={ isLoading }\n\t\t\t\tpaginationInfo={ paginationInfo }\n\t\t\t\tdefaultLayouts={ defaultLayouts }\n\t\t\t\tgetItemId={ getItemId }\n\t\t\t\tselection={ selection }\n\t\t\t\tonChangeSelection={ onChangeSelection }\n\t\t\t>\n\t\t\t\t<DataViewsPicker.Layout />\n\t\t\t\t<DataViewsPicker.Footer />\n\t\t\t</DataViewsPicker>\n\t\t</div>\n\t);\n}\n"],
"mappings": "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",
"names": []
}