@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
202 lines (200 loc) • 7.7 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// packages/editor/src/components/post-revisions-timeline/index.js
var post_revisions_timeline_exports = {};
__export(post_revisions_timeline_exports, {
default: () => PostRevisionsTimeline
});
module.exports = __toCommonJS(post_revisions_timeline_exports);
var import_data = require("@wordpress/data");
var import_core_data = require("@wordpress/core-data");
var import_dataviews = require("@wordpress/dataviews");
var import_date = require("@wordpress/date");
var import_element = require("@wordpress/element");
var import_i18n = require("@wordpress/i18n");
var import_fields = require("@wordpress/fields");
var import_ui = require("@wordpress/ui");
var import_store = require("../../store/index.cjs");
var import_lock_unlock = require("../../lock-unlock.cjs");
var import_post_content_information = require("../post-content-information/index.cjs");
var import_jsx_runtime = require("react/jsx-runtime");
var PAGE_SIZE = 10;
var EMPTY_ARRAY = [];
var defaultLayouts = { pickerActivity: true };
var baseView = {
type: "pickerActivity",
titleField: "date",
descriptionField: "details",
fields: ["author"],
layout: { density: "compact" },
page: 1,
perPage: PAGE_SIZE
};
var DAY_IN_MILLISECONDS = 864e5;
function getDisplayDate(value) {
const dateNowInMs = (0, import_date.getDate)(null).getTime();
const date = (0, import_date.getDate)(value ?? null);
return dateNowInMs - date.getTime() > DAY_IN_MILLISECONDS ? (0, import_date.dateI18n)((0, import_date.getSettings)().formats.datetimeAbbreviated, date) : (0, import_date.humanTimeDiff)(date);
}
function isAutosaveRevision(item) {
return item.slug?.endsWith("-autosave-v1") ?? false;
}
function RevisionBadges({ item }) {
if (!isAutosaveRevision(item)) {
return null;
}
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.Badge, { intent: "none", children: (0, import_i18n.__)("Autosave") });
}
function PostRevisionsTimeline() {
const { setCurrentRevisionId } = (0, import_lock_unlock.unlock)((0, import_data.useDispatch)(import_store.store));
const [view, setView] = (0, import_element.useState)(baseView);
const { revisions, revisionKey, currentRevisionId } = (0, import_data.useSelect)(
(select) => {
const { getCurrentPostType } = select(import_store.store);
const {
getCurrentRevisionId: _getCurrentRevisionId,
getRevisionPage,
getPageRevisions
} = (0, import_lock_unlock.unlock)(select(import_store.store));
const { getEntityConfig } = select(import_core_data.store);
const _postType = getCurrentPostType();
const entityConfig = getEntityConfig("postType", _postType);
const _revisionKey = entityConfig?.revisionKey || "id";
const _currentRevisionId = _getCurrentRevisionId();
return {
// Same desc-ordered window the header slider renders (warm cache).
revisions: getPageRevisions(getRevisionPage()),
revisionKey: _revisionKey,
currentRevisionId: _currentRevisionId
};
},
[]
);
const isLoading = !revisions;
const fields = (0, import_element.useMemo)(
() => [
{
id: "date",
label: (0, import_i18n.__)("Date"),
// Return the humanized label the row renders so the picker
// option's accessible name announces e.g. "5 minutes ago"
// instead of the raw ISO timestamp.
getValue: ({ item }) => {
const displayDate = getDisplayDate(item.date);
if (!isAutosaveRevision(item)) {
return displayDate;
}
return (0, import_i18n.sprintf)(
/* translators: 1: revision date, 2: revision type. */
(0, import_i18n.__)("%1$s, %2$s"),
displayDate,
(0, import_i18n.__)("Autosave")
);
},
render: ({ item }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_ui.Stack, { direction: "row", align: "center", gap: "sm", children: [
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
import_ui.Text,
{
variant: "heading-sm",
render: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("time", { dateTime: item.date }),
children: getDisplayDate(item.date)
}
),
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(RevisionBadges, { item })
] }),
enableSorting: false,
enableHiding: false
},
import_fields.authorField,
{
id: "details",
label: (0, import_i18n.__)("Details"),
render: ({ item }) => {
if (String(item[revisionKey]) !== String(currentRevisionId)) {
return null;
}
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
import_post_content_information.PostContentInformationUI,
{
postContent: item.content?.raw
}
);
},
enableSorting: false,
enableHiding: false
}
],
[revisionKey, currentRevisionId]
);
const { data: shownRevisions, paginationInfo } = (0, import_element.useMemo)(
() => (0, import_dataviews.filterSortAndPaginate)(revisions || EMPTY_ARRAY, view, fields),
[revisions, view, fields]
);
(0, import_element.useEffect)(() => {
if (!currentRevisionId || !revisions) {
return;
}
const index = revisions.findIndex(
(r) => String(r[revisionKey]) === String(currentRevisionId)
);
if (index < 0) {
return;
}
const page = Math.floor(index / view.perPage) + 1;
setView((v) => v.page === page ? v : { ...v, page });
}, [currentRevisionId, revisions, revisionKey, view.perPage]);
const selection = (0, import_element.useMemo)(
() => currentRevisionId ? [String(currentRevisionId)] : EMPTY_ARRAY,
[currentRevisionId]
);
const onChangeSelection = (0, import_element.useCallback)(
(newSelection) => {
if (newSelection.length === 0) {
return;
}
const selectedId = newSelection[newSelection.length - 1];
setCurrentRevisionId(Number(selectedId));
},
[setCurrentRevisionId]
);
const getItemId = (0, import_element.useCallback)(
(item) => String(item[revisionKey]),
[revisionKey]
);
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "editor-post-revisions-timeline", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
import_dataviews.DataViewsPicker,
{
view,
onChangeView: setView,
fields,
data: shownRevisions,
isLoading,
paginationInfo,
defaultLayouts,
getItemId,
selection,
onChangeSelection,
children: [
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dataviews.DataViewsPicker.Layout, {}),
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dataviews.DataViewsPicker.Footer, {})
]
}
) });
}
//# sourceMappingURL=index.cjs.map