UNPKG

@wordpress/block-editor

Version:
128 lines (125 loc) 5.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = DateFormatPicker; var _i18n = require("@wordpress/i18n"); var _date = require("@wordpress/date"); var _element = require("@wordpress/element"); var _components = require("@wordpress/components"); var _jsxRuntime = require("react/jsx-runtime"); /** * WordPress dependencies */ // So that we illustrate the different formats in the dropdown properly, show a date that is // somewhat recent, has a day greater than 12, and a month with more than three letters. const exampleDate = new Date(); exampleDate.setDate(20); exampleDate.setMonth(exampleDate.getMonth() - 3); if (exampleDate.getMonth() === 4) { // May has three letters, so use March. exampleDate.setMonth(3); } /** * The `DateFormatPicker` component renders controls that let the user choose a * _date format_. That is, how they want their dates to be formatted. * * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/date-format-picker/README.md * * @param {Object} props * @param {string|null} props.format The selected date format. If `null`, _Default_ is selected. * @param {string} props.defaultFormat The date format that will be used if the user selects 'Default'. * @param {Function} props.onChange Called when a selection is made. If `null`, _Default_ is selected. */ function DateFormatPicker({ format, defaultFormat, onChange }) { return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_components.__experimentalVStack, { as: "fieldset", spacing: 4, className: "block-editor-date-format-picker", children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_components.VisuallyHidden, { as: "legend", children: (0, _i18n.__)('Date format') }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.ToggleControl, { __nextHasNoMarginBottom: true, label: (0, _i18n.__)('Default format'), help: `${(0, _i18n.__)('Example:')} ${(0, _date.dateI18n)(defaultFormat, exampleDate)}`, checked: !format, onChange: checked => onChange(checked ? null : defaultFormat) }), format && /*#__PURE__*/(0, _jsxRuntime.jsx)(NonDefaultControls, { format: format, onChange: onChange })] }); } function NonDefaultControls({ format, onChange }) { var _suggestedOptions$fin; // Suggest a short format, medium format, long format, and a standardised // (YYYY-MM-DD) format. The short, medium, and long formats are localised as // different languages have different ways of writing these. For example, 'F // j, Y' (April 20, 2022) in American English (en_US) is 'j. F Y' (20. April // 2022) in German (de). The resultant array is de-duplicated as some // languages will use the same format string for short, medium, and long // formats. const suggestedFormats = [...new Set([/* translators: See https://www.php.net/manual/datetime.format.php */ 'Y-m-d', /* translators: See https://www.php.net/manual/datetime.format.php */ (0, _i18n._x)('n/j/Y', 'short date format'), /* translators: See https://www.php.net/manual/datetime.format.php */ (0, _i18n._x)('n/j/Y g:i A', 'short date format with time'), /* translators: See https://www.php.net/manual/datetime.format.php */ (0, _i18n._x)('M j, Y', 'medium date format'), /* translators: See https://www.php.net/manual/datetime.format.php */ (0, _i18n._x)('M j, Y g:i A', 'medium date format with time'), /* translators: See https://www.php.net/manual/datetime.format.php */ (0, _i18n._x)('F j, Y', 'long date format'), /* translators: See https://www.php.net/manual/datetime.format.php */ (0, _i18n._x)('M j', 'short date format without the year')])]; const suggestedOptions = [...suggestedFormats.map((suggestedFormat, index) => ({ key: `suggested-${index}`, name: (0, _date.dateI18n)(suggestedFormat, exampleDate), format: suggestedFormat })), { key: 'human-diff', name: (0, _date.humanTimeDiff)(exampleDate), format: 'human-diff' }]; const customOption = { key: 'custom', name: (0, _i18n.__)('Custom'), className: 'block-editor-date-format-picker__custom-format-select-control__custom-option', hint: (0, _i18n.__)('Enter your own date format') }; const [isCustom, setIsCustom] = (0, _element.useState)(() => !!format && !suggestedOptions.some(option => option.format === format)); return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_components.__experimentalVStack, { children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_components.CustomSelectControl, { __next40pxDefaultSize: true, label: (0, _i18n.__)('Choose a format'), options: [...suggestedOptions, customOption], value: isCustom ? customOption : (_suggestedOptions$fin = suggestedOptions.find(option => option.format === format)) !== null && _suggestedOptions$fin !== void 0 ? _suggestedOptions$fin : customOption, onChange: ({ selectedItem }) => { if (selectedItem === customOption) { setIsCustom(true); } else { setIsCustom(false); onChange(selectedItem.format); } } }), isCustom && /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.TextControl, { __next40pxDefaultSize: true, __nextHasNoMarginBottom: true, label: (0, _i18n.__)('Custom format'), hideLabelFromVision: true, help: (0, _element.createInterpolateElement)((0, _i18n.__)('Enter a date or time <Link>format string</Link>.'), { Link: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.ExternalLink, { href: (0, _i18n.__)('https://wordpress.org/documentation/article/customize-date-and-time-format/') }) }), value: format, onChange: value => onChange(value) })] }); } //# sourceMappingURL=index.js.map