UNPKG

13.4 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.defaultColumnsNumber = defaultColumnsNumber;
9exports.default = exports.pickRelevantMediaFiles = void 0;
10
11var _element = require("@wordpress/element");
12
13var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
15var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
16
17var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
18
19var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
20
21var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
22
23var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
24
25var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
26
27var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
28
29var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
30
31var _classnames2 = _interopRequireDefault(require("classnames"));
32
33var _lodash = require("lodash");
34
35var _components = require("@wordpress/components");
36
37var _blockEditor = require("@wordpress/block-editor");
38
39var _editor = require("@wordpress/editor");
40
41var _i18n = require("@wordpress/i18n");
42
43var _galleryImage = _interopRequireDefault(require("./gallery-image"));
44
45var _icon = _interopRequireDefault(require("./icon"));
46
47/**
48 * External dependencies
49 */
50
51/**
52 * WordPress dependencies
53 */
54
55/**
56 * Internal dependencies
57 */
58var MAX_COLUMNS = 8;
59var linkOptions = [{
60 value: 'attachment',
61 label: (0, _i18n.__)('Attachment Page')
62}, {
63 value: 'media',
64 label: (0, _i18n.__)('Media File')
65}, {
66 value: 'none',
67 label: (0, _i18n.__)('None')
68}];
69var ALLOWED_MEDIA_TYPES = ['image'];
70
71function defaultColumnsNumber(attributes) {
72 return Math.min(3, attributes.images.length);
73}
74
75var pickRelevantMediaFiles = function pickRelevantMediaFiles(image) {
76 var imageProps = (0, _lodash.pick)(image, ['alt', 'id', 'link', 'caption']);
77 imageProps.url = (0, _lodash.get)(image, ['sizes', 'large', 'url']) || (0, _lodash.get)(image, ['media_details', 'sizes', 'large', 'source_url']) || image.url;
78 return imageProps;
79};
80
81exports.pickRelevantMediaFiles = pickRelevantMediaFiles;
82
83var GalleryEdit =
84/*#__PURE__*/
85function (_Component) {
86 (0, _inherits2.default)(GalleryEdit, _Component);
87
88 function GalleryEdit() {
89 var _this;
90
91 (0, _classCallCheck2.default)(this, GalleryEdit);
92 _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(GalleryEdit).apply(this, arguments));
93 _this.onSelectImage = _this.onSelectImage.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
94 _this.onSelectImages = _this.onSelectImages.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
95 _this.setLinkTo = _this.setLinkTo.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
96 _this.setColumnsNumber = _this.setColumnsNumber.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
97 _this.toggleImageCrop = _this.toggleImageCrop.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
98 _this.onRemoveImage = _this.onRemoveImage.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
99 _this.setImageAttributes = _this.setImageAttributes.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
100 _this.addFiles = _this.addFiles.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
101 _this.uploadFromFiles = _this.uploadFromFiles.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
102 _this.setAttributes = _this.setAttributes.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
103 _this.state = {
104 selectedImage: null
105 };
106 return _this;
107 }
108
109 (0, _createClass2.default)(GalleryEdit, [{
110 key: "setAttributes",
111 value: function setAttributes(attributes) {
112 if (attributes.ids) {
113 throw new Error('The "ids" attribute should not be changed directly. It is managed automatically when "images" attribute changes');
114 }
115
116 if (attributes.images) {
117 attributes = (0, _objectSpread2.default)({}, attributes, {
118 ids: (0, _lodash.map)(attributes.images, 'id')
119 });
120 }
121
122 this.props.setAttributes(attributes);
123 }
124 }, {
125 key: "onSelectImage",
126 value: function onSelectImage(index) {
127 var _this2 = this;
128
129 return function () {
130 if (_this2.state.selectedImage !== index) {
131 _this2.setState({
132 selectedImage: index
133 });
134 }
135 };
136 }
137 }, {
138 key: "onRemoveImage",
139 value: function onRemoveImage(index) {
140 var _this3 = this;
141
142 return function () {
143 var images = (0, _lodash.filter)(_this3.props.attributes.images, function (img, i) {
144 return index !== i;
145 });
146 var columns = _this3.props.attributes.columns;
147
148 _this3.setState({
149 selectedImage: null
150 });
151
152 _this3.setAttributes({
153 images: images,
154 columns: columns ? Math.min(images.length, columns) : columns
155 });
156 };
157 }
158 }, {
159 key: "onSelectImages",
160 value: function onSelectImages(images) {
161 var columns = this.props.attributes.columns;
162 this.setAttributes({
163 images: images.map(function (image) {
164 return pickRelevantMediaFiles(image);
165 }),
166 columns: columns ? Math.min(images.length, columns) : columns
167 });
168 }
169 }, {
170 key: "setLinkTo",
171 value: function setLinkTo(value) {
172 this.setAttributes({
173 linkTo: value
174 });
175 }
176 }, {
177 key: "setColumnsNumber",
178 value: function setColumnsNumber(value) {
179 this.setAttributes({
180 columns: value
181 });
182 }
183 }, {
184 key: "toggleImageCrop",
185 value: function toggleImageCrop() {
186 this.setAttributes({
187 imageCrop: !this.props.attributes.imageCrop
188 });
189 }
190 }, {
191 key: "getImageCropHelp",
192 value: function getImageCropHelp(checked) {
193 return checked ? (0, _i18n.__)('Thumbnails are cropped to align.') : (0, _i18n.__)('Thumbnails are not cropped.');
194 }
195 }, {
196 key: "setImageAttributes",
197 value: function setImageAttributes(index, attributes) {
198 var images = this.props.attributes.images;
199 var setAttributes = this.setAttributes;
200
201 if (!images[index]) {
202 return;
203 }
204
205 setAttributes({
206 images: [].concat((0, _toConsumableArray2.default)(images.slice(0, index)), [(0, _objectSpread2.default)({}, images[index], attributes)], (0, _toConsumableArray2.default)(images.slice(index + 1)))
207 });
208 }
209 }, {
210 key: "uploadFromFiles",
211 value: function uploadFromFiles(event) {
212 this.addFiles(event.target.files);
213 }
214 }, {
215 key: "addFiles",
216 value: function addFiles(files) {
217 var currentImages = this.props.attributes.images || [];
218 var noticeOperations = this.props.noticeOperations;
219 var setAttributes = this.setAttributes;
220 (0, _editor.mediaUpload)({
221 allowedTypes: ALLOWED_MEDIA_TYPES,
222 filesList: files,
223 onFileChange: function onFileChange(images) {
224 var imagesNormalized = images.map(function (image) {
225 return pickRelevantMediaFiles(image);
226 });
227 setAttributes({
228 images: currentImages.concat(imagesNormalized)
229 });
230 },
231 onError: noticeOperations.createErrorNotice
232 });
233 }
234 }, {
235 key: "componentDidUpdate",
236 value: function componentDidUpdate(prevProps) {
237 // Deselect images when deselecting the block
238 if (!this.props.isSelected && prevProps.isSelected) {
239 this.setState({
240 selectedImage: null,
241 captionSelected: false
242 });
243 }
244 }
245 }, {
246 key: "render",
247 value: function render() {
248 var _classnames,
249 _this4 = this;
250
251 var _this$props = this.props,
252 attributes = _this$props.attributes,
253 isSelected = _this$props.isSelected,
254 className = _this$props.className,
255 noticeOperations = _this$props.noticeOperations,
256 noticeUI = _this$props.noticeUI;
257 var images = attributes.images,
258 _attributes$columns = attributes.columns,
259 columns = _attributes$columns === void 0 ? defaultColumnsNumber(attributes) : _attributes$columns,
260 align = attributes.align,
261 imageCrop = attributes.imageCrop,
262 linkTo = attributes.linkTo;
263 var dropZone = (0, _element.createElement)(_components.DropZone, {
264 onFilesDrop: this.addFiles
265 });
266 var controls = (0, _element.createElement)(_blockEditor.BlockControls, null, !!images.length && (0, _element.createElement)(_components.Toolbar, null, (0, _element.createElement)(_blockEditor.MediaUpload, {
267 onSelect: this.onSelectImages,
268 allowedTypes: ALLOWED_MEDIA_TYPES,
269 multiple: true,
270 gallery: true,
271 value: images.map(function (img) {
272 return img.id;
273 }),
274 render: function render(_ref) {
275 var open = _ref.open;
276 return (0, _element.createElement)(_components.IconButton, {
277 className: "components-toolbar__control",
278 label: (0, _i18n.__)('Edit gallery'),
279 icon: "edit",
280 onClick: open
281 });
282 }
283 })));
284
285 if (images.length === 0) {
286 return (0, _element.createElement)(_element.Fragment, null, controls, (0, _element.createElement)(_blockEditor.MediaPlaceholder, {
287 icon: (0, _element.createElement)(_blockEditor.BlockIcon, {
288 icon: _icon.default
289 }),
290 className: className,
291 labels: {
292 title: (0, _i18n.__)('Gallery'),
293 instructions: (0, _i18n.__)('Drag images, upload new ones or select files from your library.')
294 },
295 onSelect: this.onSelectImages,
296 accept: "image/*",
297 allowedTypes: ALLOWED_MEDIA_TYPES,
298 multiple: true,
299 notices: noticeUI,
300 onError: noticeOperations.createErrorNotice
301 }));
302 }
303
304 return (0, _element.createElement)(_element.Fragment, null, controls, (0, _element.createElement)(_blockEditor.InspectorControls, null, (0, _element.createElement)(_components.PanelBody, {
305 title: (0, _i18n.__)('Gallery Settings')
306 }, images.length > 1 && (0, _element.createElement)(_components.RangeControl, {
307 label: (0, _i18n.__)('Columns'),
308 value: columns,
309 onChange: this.setColumnsNumber,
310 min: 1,
311 max: Math.min(MAX_COLUMNS, images.length),
312 required: true
313 }), (0, _element.createElement)(_components.ToggleControl, {
314 label: (0, _i18n.__)('Crop Images'),
315 checked: !!imageCrop,
316 onChange: this.toggleImageCrop,
317 help: this.getImageCropHelp
318 }), (0, _element.createElement)(_components.SelectControl, {
319 label: (0, _i18n.__)('Link To'),
320 value: linkTo,
321 onChange: this.setLinkTo,
322 options: linkOptions
323 }))), noticeUI, (0, _element.createElement)("ul", {
324 className: (0, _classnames2.default)(className, (_classnames = {}, (0, _defineProperty2.default)(_classnames, "align".concat(align), align), (0, _defineProperty2.default)(_classnames, "columns-".concat(columns), columns), (0, _defineProperty2.default)(_classnames, 'is-cropped', imageCrop), _classnames))
325 }, dropZone, images.map(function (img, index) {
326 /* translators: %1$d is the order number of the image, %2$d is the total number of images. */
327 var ariaLabel = (0, _i18n.sprintf)((0, _i18n.__)('image %1$d of %2$d in gallery'), index + 1, images.length);
328 return (0, _element.createElement)("li", {
329 className: "blocks-gallery-item",
330 key: img.id || img.url
331 }, (0, _element.createElement)(_galleryImage.default, {
332 url: img.url,
333 alt: img.alt,
334 id: img.id,
335 isSelected: isSelected && _this4.state.selectedImage === index,
336 onRemove: _this4.onRemoveImage(index),
337 onSelect: _this4.onSelectImage(index),
338 setAttributes: function setAttributes(attrs) {
339 return _this4.setImageAttributes(index, attrs);
340 },
341 caption: img.caption,
342 "aria-label": ariaLabel
343 }));
344 }), isSelected && (0, _element.createElement)("li", {
345 className: "blocks-gallery-item has-add-item-button"
346 }, (0, _element.createElement)(_components.FormFileUpload, {
347 multiple: true,
348 isLarge: true,
349 className: "block-library-gallery-add-item-button",
350 onChange: this.uploadFromFiles,
351 accept: "image/*",
352 icon: "insert"
353 }, (0, _i18n.__)('Upload an image')))));
354 }
355 }]);
356 return GalleryEdit;
357}(_element.Component);
358
359var _default = (0, _components.withNotices)(GalleryEdit);
360
361exports.default = _default;
362//# sourceMappingURL=edit.js.map
\No newline at end of file