1 | "use strict";
|
2 |
|
3 | var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
4 |
|
5 | Object.defineProperty(exports, "__esModule", {
|
6 | value: true
|
7 | });
|
8 | exports.defaultColumnsNumber = defaultColumnsNumber;
|
9 | exports.default = exports.pickRelevantMediaFiles = void 0;
|
10 |
|
11 | var _element = require("@wordpress/element");
|
12 |
|
13 | var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
14 |
|
15 | var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
16 |
|
17 | var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
|
18 |
|
19 | var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
20 |
|
21 | var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
22 |
|
23 | var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
24 |
|
25 | var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
26 |
|
27 | var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
28 |
|
29 | var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
|
30 |
|
31 | var _classnames2 = _interopRequireDefault(require("classnames"));
|
32 |
|
33 | var _lodash = require("lodash");
|
34 |
|
35 | var _components = require("@wordpress/components");
|
36 |
|
37 | var _blockEditor = require("@wordpress/block-editor");
|
38 |
|
39 | var _editor = require("@wordpress/editor");
|
40 |
|
41 | var _i18n = require("@wordpress/i18n");
|
42 |
|
43 | var _galleryImage = _interopRequireDefault(require("./gallery-image"));
|
44 |
|
45 | var _icon = _interopRequireDefault(require("./icon"));
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 | var MAX_COLUMNS = 8;
|
59 | var 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 | }];
|
69 | var ALLOWED_MEDIA_TYPES = ['image'];
|
70 |
|
71 | function defaultColumnsNumber(attributes) {
|
72 | return Math.min(3, attributes.images.length);
|
73 | }
|
74 |
|
75 | var 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 |
|
81 | exports.pickRelevantMediaFiles = pickRelevantMediaFiles;
|
82 |
|
83 | var GalleryEdit =
|
84 |
|
85 | function (_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 |
|
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 |
|
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 |
|
359 | var _default = (0, _components.withNotices)(GalleryEdit);
|
360 |
|
361 | exports.default = _default;
|
362 |
|
\ | No newline at end of file |