UNPKG

@wordpress/block-library

Version:
200 lines (195 loc) 8.05 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = PostDateEdit; exports.is12HourFormat = is12HourFormat; var _clsx = _interopRequireDefault(require("clsx")); var _coreData = require("@wordpress/core-data"); var _element = require("@wordpress/element"); var _date = require("@wordpress/date"); var _blockEditor = require("@wordpress/block-editor"); var _components = require("@wordpress/components"); var _i18n = require("@wordpress/i18n"); var _icons = require("@wordpress/icons"); var _keycodes = require("@wordpress/keycodes"); var _data = require("@wordpress/data"); var _hooks = require("../utils/hooks"); var _jsxRuntime = require("react/jsx-runtime"); /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function PostDateEdit({ attributes: { textAlign, format, isLink, displayType }, context: { postId, postType: postTypeSlug, queryId }, setAttributes }) { const blockProps = (0, _blockEditor.useBlockProps)({ className: (0, _clsx.default)({ [`has-text-align-${textAlign}`]: textAlign, [`wp-block-post-date__modified-date`]: displayType === 'modified' }) }); const dropdownMenuProps = (0, _hooks.useToolsPanelDropdownMenuProps)(); // Use internal state instead of a ref to make sure that the component // re-renders when the popover's anchor updates. const [popoverAnchor, setPopoverAnchor] = (0, _element.useState)(null); // Memoize popoverProps to avoid returning a new object every time. const popoverProps = (0, _element.useMemo)(() => ({ anchor: popoverAnchor }), [popoverAnchor]); const isDescendentOfQueryLoop = Number.isFinite(queryId); const dateSettings = (0, _date.getSettings)(); const [siteFormat = dateSettings.formats.date] = (0, _coreData.useEntityProp)('root', 'site', 'date_format'); const [siteTimeFormat = dateSettings.formats.time] = (0, _coreData.useEntityProp)('root', 'site', 'time_format'); const [date, setDate] = (0, _coreData.useEntityProp)('postType', postTypeSlug, displayType, postId); const postType = (0, _data.useSelect)(select => postTypeSlug ? select(_coreData.store).getPostType(postTypeSlug) : null, [postTypeSlug]); const dateLabel = displayType === 'date' ? (0, _i18n.__)('Post Date') : (0, _i18n.__)('Post Modified Date'); let postDate = date ? /*#__PURE__*/(0, _jsxRuntime.jsx)("time", { dateTime: (0, _date.dateI18n)('c', date), ref: setPopoverAnchor, children: format === 'human-diff' ? (0, _date.humanTimeDiff)(date) : (0, _date.dateI18n)(format || siteFormat, date) }) : dateLabel; if (isLink && date) { postDate = /*#__PURE__*/(0, _jsxRuntime.jsx)("a", { href: "#post-date-pseudo-link", onClick: event => event.preventDefault(), children: postDate }); } return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, { children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_blockEditor.BlockControls, { group: "block", children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_blockEditor.AlignmentControl, { value: textAlign, onChange: nextAlign => { setAttributes({ textAlign: nextAlign }); } }), date && displayType === 'date' && !isDescendentOfQueryLoop && /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.ToolbarGroup, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Dropdown, { popoverProps: popoverProps, renderContent: ({ onClose }) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_blockEditor.__experimentalPublishDateTimePicker, { currentDate: date, onChange: setDate, is12Hour: is12HourFormat(siteTimeFormat), onClose: onClose, dateOrder: /* translators: Order of day, month, and year. Available formats are 'dmy', 'mdy', and 'ymd'. */ (0, _i18n._x)('dmy', 'date order') }), renderToggle: ({ isOpen, onToggle }) => { const openOnArrowDown = event => { if (!isOpen && event.keyCode === _keycodes.DOWN) { event.preventDefault(); onToggle(); } }; return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.ToolbarButton, { "aria-expanded": isOpen, icon: _icons.edit, title: (0, _i18n.__)('Change Date'), onClick: onToggle, onKeyDown: openOnArrowDown }); } }) })] }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_blockEditor.InspectorControls, { children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_components.__experimentalToolsPanel, { label: (0, _i18n.__)('Settings'), resetAll: () => { setAttributes({ format: undefined, isLink: false, displayType: 'date' }); }, dropdownMenuProps: dropdownMenuProps, children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_components.__experimentalToolsPanelItem, { hasValue: () => !!format, label: (0, _i18n.__)('Date Format'), onDeselect: () => setAttributes({ format: undefined }), isShownByDefault: true, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_blockEditor.__experimentalDateFormatPicker, { format: format, defaultFormat: siteFormat, onChange: nextFormat => setAttributes({ format: nextFormat }) }) }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.__experimentalToolsPanelItem, { hasValue: () => isLink !== false, label: postType?.labels.singular_name ? (0, _i18n.sprintf)( // translators: %s: Name of the post type e.g: "post". (0, _i18n.__)('Link to %s'), postType.labels.singular_name.toLowerCase()) : (0, _i18n.__)('Link to post'), onDeselect: () => setAttributes({ isLink: false }), isShownByDefault: true, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.ToggleControl, { __nextHasNoMarginBottom: true, label: postType?.labels.singular_name ? (0, _i18n.sprintf)( // translators: %s: Name of the post type e.g: "post". (0, _i18n.__)('Link to %s'), postType.labels.singular_name.toLowerCase()) : (0, _i18n.__)('Link to post'), onChange: () => setAttributes({ isLink: !isLink }), checked: isLink }) }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.__experimentalToolsPanelItem, { hasValue: () => displayType !== 'date', label: (0, _i18n.__)('Display last modified date'), onDeselect: () => setAttributes({ displayType: 'date' }), isShownByDefault: true, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.ToggleControl, { __nextHasNoMarginBottom: true, label: (0, _i18n.__)('Display last modified date'), onChange: value => setAttributes({ displayType: value ? 'modified' : 'date' }), checked: displayType === 'modified', help: (0, _i18n.__)('Only shows if the post has been modified') }) })] }) }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { ...blockProps, children: postDate })] }); } function is12HourFormat(format) { // To know if the time format is a 12 hour time, look for any of the 12 hour // format characters: 'a', 'A', 'g', and 'h'. The character must be // unescaped, i.e. not preceded by a '\'. Coincidentally, 'aAgh' is how I // feel when working with regular expressions. // https://www.php.net/manual/en/datetime.format.php return /(?:^|[^\\])[aAgh]/.test(format); } //# sourceMappingURL=edit.js.map