PluginProbe
Gutenberg / 12.5.1
Gutenberg v12.5.1
24.0.0 23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 12.6.0 All 403 releases
gutenberg / build / widgets / index.js

index.js in Gutenberg 12.5.1, at build/widgets/index.js

1,807 lines 54.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /******/ (function() { // webpackBootstrap
2 /******/ var __webpack_modules__ = ({
3
4 /***/ 4184:
5 /***/ (function(module, exports) {
6
7 var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
8 Copyright (c) 2018 Jed Watson.
9 Licensed under the MIT License (MIT), see
10 http://jedwatson.github.io/classnames
11 */
12 /* global define */
13
14 (function () {
15 'use strict';
16
17 var hasOwn = {}.hasOwnProperty;
18
19 function classNames() {
20 var classes = [];
21
22 for (var i = 0; i < arguments.length; i++) {
23 var arg = arguments[i];
24 if (!arg) continue;
25
26 var argType = typeof arg;
27
28 if (argType === 'string' || argType === 'number') {
29 classes.push(arg);
30 } else if (Array.isArray(arg)) {
31 if (arg.length) {
32 var inner = classNames.apply(null, arg);
33 if (inner) {
34 classes.push(inner);
35 }
36 }
37 } else if (argType === 'object') {
38 if (arg.toString === Object.prototype.toString) {
39 for (var key in arg) {
40 if (hasOwn.call(arg, key) && arg[key]) {
41 classes.push(key);
42 }
43 }
44 } else {
45 classes.push(arg.toString());
46 }
47 }
48 }
49
50 return classes.join(' ');
51 }
52
53 if ( true && module.exports) {
54 classNames.default = classNames;
55 module.exports = classNames;
56 } else if (true) {
57 // register as 'classnames', consistent with npm package name
58 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {
59 return classNames;
60 }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
61 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
62 } else {}
63 }());
64
65
66 /***/ })
67
68 /******/ });
69 /************************************************************************/
70 /******/ // The module cache
71 /******/ var __webpack_module_cache__ = {};
72 /******/
73 /******/ // The require function
74 /******/ function __webpack_require__(moduleId) {
75 /******/ // Check if module is in cache
76 /******/ var cachedModule = __webpack_module_cache__[moduleId];
77 /******/ if (cachedModule !== undefined) {
78 /******/ return cachedModule.exports;
79 /******/ }
80 /******/ // Create a new module (and put it into the cache)
81 /******/ var module = __webpack_module_cache__[moduleId] = {
82 /******/ // no module.id needed
83 /******/ // no module.loaded needed
84 /******/ exports: {}
85 /******/ };
86 /******/
87 /******/ // Execute the module function
88 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
89 /******/
90 /******/ // Return the exports of the module
91 /******/ return module.exports;
92 /******/ }
93 /******/
94 /************************************************************************/
95 /******/ /* webpack/runtime/compat get default export */
96 /******/ !function() {
97 /******/ // getDefaultExport function for compatibility with non-harmony modules
98 /******/ __webpack_require__.n = function(module) {
99 /******/ var getter = module && module.__esModule ?
100 /******/ function() { return module['default']; } :
101 /******/ function() { return module; };
102 /******/ __webpack_require__.d(getter, { a: getter });
103 /******/ return getter;
104 /******/ };
105 /******/ }();
106 /******/
107 /******/ /* webpack/runtime/define property getters */
108 /******/ !function() {
109 /******/ // define getter functions for harmony exports
110 /******/ __webpack_require__.d = function(exports, definition) {
111 /******/ for(var key in definition) {
112 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
113 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
114 /******/ }
115 /******/ }
116 /******/ };
117 /******/ }();
118 /******/
119 /******/ /* webpack/runtime/hasOwnProperty shorthand */
120 /******/ !function() {
121 /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
122 /******/ }();
123 /******/
124 /******/ /* webpack/runtime/make namespace object */
125 /******/ !function() {
126 /******/ // define __esModule on exports
127 /******/ __webpack_require__.r = function(exports) {
128 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
129 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
130 /******/ }
131 /******/ Object.defineProperty(exports, '__esModule', { value: true });
132 /******/ };
133 /******/ }();
134 /******/
135 /************************************************************************/
136 var __webpack_exports__ = {};
137 // This entry need to be wrapped in an IIFE because it need to be in strict mode.
138 !function() {
139 "use strict";
140 // ESM COMPAT FLAG
141 __webpack_require__.r(__webpack_exports__);
142
143 // EXPORTS
144 __webpack_require__.d(__webpack_exports__, {
145 "MoveToWidgetArea": function() { return /* reexport */ MoveToWidgetArea; },
146 "addWidgetIdToBlock": function() { return /* reexport */ addWidgetIdToBlock; },
147 "getWidgetIdFromBlock": function() { return /* reexport */ getWidgetIdFromBlock; },
148 "registerLegacyWidgetBlock": function() { return /* binding */ registerLegacyWidgetBlock; },
149 "registerLegacyWidgetVariations": function() { return /* reexport */ registerLegacyWidgetVariations; },
150 "registerWidgetGroupBlock": function() { return /* binding */ registerWidgetGroupBlock; }
151 });
152
153 // NAMESPACE OBJECT: ./packages/widgets/build-module/blocks/legacy-widget/index.js
154 var legacy_widget_namespaceObject = {};
155 __webpack_require__.r(legacy_widget_namespaceObject);
156 __webpack_require__.d(legacy_widget_namespaceObject, {
157 "metadata": function() { return metadata; },
158 "name": function() { return legacy_widget_name; },
159 "settings": function() { return settings; }
160 });
161
162 // NAMESPACE OBJECT: ./packages/widgets/build-module/blocks/widget-group/index.js
163 var widget_group_namespaceObject = {};
164 __webpack_require__.r(widget_group_namespaceObject);
165 __webpack_require__.d(widget_group_namespaceObject, {
166 "metadata": function() { return widget_group_metadata; },
167 "name": function() { return widget_group_name; },
168 "settings": function() { return widget_group_settings; }
169 });
170
171 ;// CONCATENATED MODULE: external ["wp","blocks"]
172 var external_wp_blocks_namespaceObject = window["wp"]["blocks"];
173 ;// CONCATENATED MODULE: external ["wp","element"]
174 var external_wp_element_namespaceObject = window["wp"]["element"];
175 ;// CONCATENATED MODULE: external ["wp","primitives"]
176 var external_wp_primitives_namespaceObject = window["wp"]["primitives"];
177 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/widget.js
178
179
180 /**
181 * WordPress dependencies
182 */
183
184 const widget = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
185 xmlns: "http://www.w3.org/2000/svg",
186 viewBox: "0 0 24 24"
187 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
188 d: "M6 3H8V5H16V3H18V5C19.1046 5 20 5.89543 20 7V19C20 20.1046 19.1046 21 18 21H6C4.89543 21 4 20.1046 4 19V7C4 5.89543 4.89543 5 6 5V3ZM18 6.5H6C5.72386 6.5 5.5 6.72386 5.5 7V8H18.5V7C18.5 6.72386 18.2761 6.5 18 6.5ZM18.5 9.5H5.5V19C5.5 19.2761 5.72386 19.5 6 19.5H18C18.2761 19.5 18.5 19.2761 18.5 19V9.5ZM11 11H13V13H11V11ZM7 11V13H9V11H7ZM15 13V11H17V13H15Z"
189 }));
190 /* harmony default export */ var library_widget = (widget);
191 //# sourceMappingURL=widget.js.map
192 // EXTERNAL MODULE: ./node_modules/classnames/index.js
193 var classnames = __webpack_require__(4184);
194 var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);
195 ;// CONCATENATED MODULE: external ["wp","blockEditor"]
196 var external_wp_blockEditor_namespaceObject = window["wp"]["blockEditor"];
197 ;// CONCATENATED MODULE: external ["wp","components"]
198 var external_wp_components_namespaceObject = window["wp"]["components"];
199 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/brush.js
200
201
202 /**
203 * WordPress dependencies
204 */
205
206 const brush = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
207 xmlns: "http://www.w3.org/2000/svg",
208 viewBox: "0 0 24 24"
209 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
210 d: "M4 20h8v-1.5H4V20zM18.9 3.5c-.6-.6-1.5-.6-2.1 0l-7.2 7.2c-.4-.1-.7 0-1.1.1-.5.2-1.5.7-1.9 2.2-.4 1.7-.8 2.2-1.1 2.7-.1.1-.2.3-.3.4l-.6 1.1H6c2 0 3.4-.4 4.7-1.4.8-.6 1.2-1.4 1.3-2.3 0-.3 0-.5-.1-.7L19 5.7c.5-.6.5-1.6-.1-2.2zM9.7 14.7c-.7.5-1.5.8-2.4 1 .2-.5.5-1.2.8-2.3.2-.6.4-1 .8-1.1.5-.1 1 .1 1.3.3.2.2.3.5.2.8 0 .3-.1.9-.7 1.3z"
211 }));
212 /* harmony default export */ var library_brush = (brush);
213 //# sourceMappingURL=brush.js.map
214 ;// CONCATENATED MODULE: external ["wp","i18n"]
215 var external_wp_i18n_namespaceObject = window["wp"]["i18n"];
216 ;// CONCATENATED MODULE: external ["wp","data"]
217 var external_wp_data_namespaceObject = window["wp"]["data"];
218 ;// CONCATENATED MODULE: external ["wp","coreData"]
219 var external_wp_coreData_namespaceObject = window["wp"]["coreData"];
220 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/widget-type-selector.js
221
222
223 /**
224 * WordPress dependencies
225 */
226
227
228
229
230
231 function WidgetTypeSelector(_ref) {
232 let {
233 selectedId,
234 onSelect
235 } = _ref;
236 const widgetTypes = (0,external_wp_data_namespaceObject.useSelect)(select => {
237 var _select$getSettings$w, _select$getSettings, _select$getWidgetType;
238
239 const hiddenIds = (_select$getSettings$w = (_select$getSettings = select(external_wp_blockEditor_namespaceObject.store).getSettings()) === null || _select$getSettings === void 0 ? void 0 : _select$getSettings.widgetTypesToHideFromLegacyWidgetBlock) !== null && _select$getSettings$w !== void 0 ? _select$getSettings$w : [];
240 return (_select$getWidgetType = select(external_wp_coreData_namespaceObject.store).getWidgetTypes({
241 per_page: -1
242 })) === null || _select$getWidgetType === void 0 ? void 0 : _select$getWidgetType.filter(widgetType => !hiddenIds.includes(widgetType.id));
243 }, []);
244
245 if (!widgetTypes) {
246 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Spinner, null);
247 }
248
249 if (widgetTypes.length === 0) {
250 return (0,external_wp_i18n_namespaceObject.__)('There are no widgets available.');
251 }
252
253 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.SelectControl, {
254 label: (0,external_wp_i18n_namespaceObject.__)('Select a legacy widget to display:'),
255 value: selectedId !== null && selectedId !== void 0 ? selectedId : '',
256 options: [{
257 value: '',
258 label: (0,external_wp_i18n_namespaceObject.__)('Select widget')
259 }, ...widgetTypes.map(widgetType => ({
260 value: widgetType.id,
261 label: widgetType.name
262 }))],
263 onChange: value => {
264 if (value) {
265 const selected = widgetTypes.find(widgetType => widgetType.id === value);
266 onSelect({
267 selectedId: selected.id,
268 isMulti: selected.is_multi
269 });
270 } else {
271 onSelect({
272 selectedId: null
273 });
274 }
275 }
276 });
277 }
278 //# sourceMappingURL=widget-type-selector.js.map
279 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/inspector-card.js
280
281 function InspectorCard(_ref) {
282 let {
283 name,
284 description
285 } = _ref;
286 return (0,external_wp_element_namespaceObject.createElement)("div", {
287 className: "wp-block-legacy-widget-inspector-card"
288 }, (0,external_wp_element_namespaceObject.createElement)("h3", {
289 className: "wp-block-legacy-widget-inspector-card__name"
290 }, name), (0,external_wp_element_namespaceObject.createElement)("span", null, description));
291 }
292 //# sourceMappingURL=inspector-card.js.map
293 ;// CONCATENATED MODULE: external ["wp","notices"]
294 var external_wp_notices_namespaceObject = window["wp"]["notices"];
295 ;// CONCATENATED MODULE: external ["wp","compose"]
296 var external_wp_compose_namespaceObject = window["wp"]["compose"];
297 ;// CONCATENATED MODULE: external "lodash"
298 var external_lodash_namespaceObject = window["lodash"];
299 ;// CONCATENATED MODULE: external ["wp","apiFetch"]
300 var external_wp_apiFetch_namespaceObject = window["wp"]["apiFetch"];
301 var external_wp_apiFetch_default = /*#__PURE__*/__webpack_require__.n(external_wp_apiFetch_namespaceObject);
302 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/control.js
303 /**
304 * External dependencies
305 */
306
307 /**
308 * WordPress dependencies
309 */
310
311
312
313 /**
314 * An API for creating and loading a widget control (a <div class="widget">
315 * element) that is compatible with most third party widget scripts. By not
316 * using React for this, we ensure that we have complete contorl over the DOM
317 * and do not accidentally remove any elements that a third party widget script
318 * has attached an event listener to.
319 *
320 * @property {Element} element The control's DOM element.
321 */
322
323 class Control {
324 /**
325 * Creates and loads a new control.
326 *
327 * @access public
328 * @param {Object} params
329 * @param {string} params.id
330 * @param {string} params.idBase
331 * @param {Object} params.instance
332 * @param {Function} params.onChangeInstance
333 * @param {Function} params.onChangeHasPreview
334 * @param {Function} params.onError
335 */
336 constructor(_ref) {
337 let {
338 id,
339 idBase,
340 instance,
341 onChangeInstance,
342 onChangeHasPreview,
343 onError
344 } = _ref;
345 this.id = id;
346 this.idBase = idBase;
347 this._instance = instance;
348 this._hasPreview = null;
349 this.onChangeInstance = onChangeInstance;
350 this.onChangeHasPreview = onChangeHasPreview;
351 this.onError = onError; // We can't use the real widget number as this is calculated by the
352 // server and we may not ever *actually* save this widget. Instead, use
353 // a fake but unique number.
354
355 this.number = ++lastNumber;
356 this.handleFormChange = (0,external_lodash_namespaceObject.debounce)(this.handleFormChange.bind(this), 200);
357 this.handleFormSubmit = this.handleFormSubmit.bind(this);
358 this.initDOM();
359 this.bindEvents();
360 this.loadContent();
361 }
362 /**
363 * Clean up the control so that it can be garabge collected.
364 *
365 * @access public
366 */
367
368
369 destroy() {
370 this.unbindEvents();
371 this.element.remove(); // TODO: How do we make third party widget scripts remove their event
372 // listeners?
373 }
374 /**
375 * Creates the control's DOM structure.
376 *
377 * @access private
378 */
379
380
381 initDOM() {
382 var _this$id, _this$idBase;
383
384 this.element = el('div', {
385 class: 'widget open'
386 }, [el('div', {
387 class: 'widget-inside'
388 }, [this.form = el('form', {
389 class: 'form',
390 method: 'post'
391 }, [// These hidden form inputs are what most widgets' scripts
392 // use to access data about the widget.
393 el('input', {
394 class: 'widget-id',
395 type: 'hidden',
396 name: 'widget-id',
397 value: (_this$id = this.id) !== null && _this$id !== void 0 ? _this$id : `${this.idBase}-${this.number}`
398 }), el('input', {
399 class: 'id_base',
400 type: 'hidden',
401 name: 'id_base',
402 value: (_this$idBase = this.idBase) !== null && _this$idBase !== void 0 ? _this$idBase : this.id
403 }), el('input', {
404 class: 'widget-width',
405 type: 'hidden',
406 name: 'widget-width',
407 value: '250'
408 }), el('input', {
409 class: 'widget-height',
410 type: 'hidden',
411 name: 'widget-height',
412 value: '200'
413 }), el('input', {
414 class: 'widget_number',
415 type: 'hidden',
416 name: 'widget_number',
417 value: this.idBase ? this.number.toString() : ''
418 }), this.content = el('div', {
419 class: 'widget-content'
420 }), // Non-multi widgets can be saved via a Save button.
421 this.id && el('button', {
422 class: 'button is-primary',
423 type: 'submit'
424 }, (0,external_wp_i18n_namespaceObject.__)('Save'))])])]);
425 }
426 /**
427 * Adds the control's event listeners.
428 *
429 * @access private
430 */
431
432
433 bindEvents() {
434 // Prefer jQuery 'change' event instead of the native 'change' event
435 // because many widgets use jQuery's event bus to trigger an update.
436 if (window.jQuery) {
437 const {
438 jQuery: $
439 } = window;
440 $(this.form).on('change', null, this.handleFormChange);
441 $(this.form).on('input', null, this.handleFormChange);
442 $(this.form).on('submit', this.handleFormSubmit);
443 } else {
444 this.form.addEventListener('change', this.handleFormChange);
445 this.form.addEventListener('input', this.handleFormChange);
446 this.form.addEventListener('submit', this.handleFormSubmit);
447 }
448 }
449 /**
450 * Removes the control's event listeners.
451 *
452 * @access private
453 */
454
455
456 unbindEvents() {
457 if (window.jQuery) {
458 const {
459 jQuery: $
460 } = window;
461 $(this.form).off('change', null, this.handleFormChange);
462 $(this.form).off('input', null, this.handleFormChange);
463 $(this.form).off('submit', this.handleFormSubmit);
464 } else {
465 this.form.removeEventListener('change', this.handleFormChange);
466 this.form.removeEventListener('input', this.handleFormChange);
467 this.form.removeEventListener('submit', this.handleFormSubmit);
468 }
469 }
470 /**
471 * Fetches the widget's form HTML from the REST API and loads it into the
472 * control's form.
473 *
474 * @access private
475 */
476
477
478 async loadContent() {
479 try {
480 if (this.id) {
481 const {
482 form
483 } = await saveWidget(this.id);
484 this.content.innerHTML = form;
485 } else if (this.idBase) {
486 const {
487 form,
488 preview
489 } = await encodeWidget({
490 idBase: this.idBase,
491 instance: this.instance,
492 number: this.number
493 });
494 this.content.innerHTML = form;
495 this.hasPreview = !isEmptyHTML(preview); // If we don't have an instance, perform a save right away. This
496 // happens when creating a new Legacy Widget block.
497
498 if (!this.instance.hash) {
499 const {
500 instance
501 } = await encodeWidget({
502 idBase: this.idBase,
503 instance: this.instance,
504 number: this.number,
505 formData: serializeForm(this.form)
506 });
507 this.instance = instance;
508 }
509 } // Trigger 'widget-added' when widget is ready. This event is what
510 // widgets' scripts use to initialize, attach events, etc. The event
511 // must be fired using jQuery's event bus as this is what widget
512 // scripts expect. If jQuery is not loaded, do nothing - some
513 // widgets will still work regardless.
514
515
516 if (window.jQuery) {
517 const {
518 jQuery: $
519 } = window;
520 $(document).trigger('widget-added', [$(this.element)]);
521 }
522 } catch (error) {
523 this.onError(error);
524 }
525 }
526 /**
527 * Perform a save when a multi widget's form is changed. Non-multi widgets
528 * are saved manually.
529 *
530 * @access private
531 */
532
533
534 handleFormChange() {
535 if (this.idBase) {
536 this.saveForm();
537 }
538 }
539 /**
540 * Perform a save when the control's form is manually submitted.
541 *
542 * @access private
543 * @param {Event} event
544 */
545
546
547 handleFormSubmit(event) {
548 event.preventDefault();
549 this.saveForm();
550 }
551 /**
552 * Serialize the control's form, send it to the REST API, and update the
553 * instance with the encoded instance that the REST API returns.
554 *
555 * @access private
556 */
557
558
559 async saveForm() {
560 const formData = serializeForm(this.form);
561
562 try {
563 if (this.id) {
564 const {
565 form
566 } = await saveWidget(this.id, formData);
567 this.content.innerHTML = form;
568
569 if (window.jQuery) {
570 const {
571 jQuery: $
572 } = window;
573 $(document).trigger('widget-updated', [$(this.element)]);
574 }
575 } else if (this.idBase) {
576 const {
577 instance,
578 preview
579 } = await encodeWidget({
580 idBase: this.idBase,
581 instance: this.instance,
582 number: this.number,
583 formData
584 });
585 this.instance = instance;
586 this.hasPreview = !isEmptyHTML(preview);
587 }
588 } catch (error) {
589 this.onError(error);
590 }
591 }
592 /**
593 * The widget's instance object.
594 *
595 * @access private
596 */
597
598
599 get instance() {
600 return this._instance;
601 }
602 /**
603 * The widget's instance object.
604 *
605 * @access private
606 */
607
608
609 set instance(instance) {
610 if (this._instance !== instance) {
611 this._instance = instance;
612 this.onChangeInstance(instance);
613 }
614 }
615 /**
616 * Whether or not the widget can be previewed.
617 *
618 * @access public
619 */
620
621
622 get hasPreview() {
623 return this._hasPreview;
624 }
625 /**
626 * Whether or not the widget can be previewed.
627 *
628 * @access private
629 */
630
631
632 set hasPreview(hasPreview) {
633 if (this._hasPreview !== hasPreview) {
634 this._hasPreview = hasPreview;
635 this.onChangeHasPreview(hasPreview);
636 }
637 }
638
639 }
640 let lastNumber = 0;
641
642 function el(tagName) {
643 let attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
644 let content = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
645 const element = document.createElement(tagName);
646
647 for (const [attribute, value] of Object.entries(attributes)) {
648 element.setAttribute(attribute, value);
649 }
650
651 if (Array.isArray(content)) {
652 for (const child of content) {
653 if (child) {
654 element.appendChild(child);
655 }
656 }
657 } else if (typeof content === 'string') {
658 element.innerText = content;
659 }
660
661 return element;
662 }
663
664 async function saveWidget(id) {
665 let formData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
666 let widget;
667
668 if (formData) {
669 widget = await external_wp_apiFetch_default()({
670 path: `/wp/v2/widgets/${id}?context=edit`,
671 method: 'PUT',
672 data: {
673 form_data: formData
674 }
675 });
676 } else {
677 widget = await external_wp_apiFetch_default()({
678 path: `/wp/v2/widgets/${id}?context=edit`,
679 method: 'GET'
680 });
681 }
682
683 return {
684 form: widget.rendered_form
685 };
686 }
687
688 async function encodeWidget(_ref2) {
689 let {
690 idBase,
691 instance,
692 number,
693 formData = null
694 } = _ref2;
695 const response = await external_wp_apiFetch_default()({
696 path: `/wp/v2/widget-types/${idBase}/encode`,
697 method: 'POST',
698 data: {
699 instance,
700 number,
701 form_data: formData
702 }
703 });
704 return {
705 instance: response.instance,
706 form: response.form,
707 preview: response.preview
708 };
709 }
710
711 function isEmptyHTML(html) {
712 const element = document.createElement('div');
713 element.innerHTML = html;
714 return isEmptyNode(element);
715 }
716
717 function isEmptyNode(node) {
718 switch (node.nodeType) {
719 case node.TEXT_NODE:
720 // Text nodes are empty if it's entirely whitespace.
721 return node.nodeValue.trim() === '';
722
723 case node.ELEMENT_NODE:
724 // Elements that are "embedded content" are not empty.
725 // https://dev.w3.org/html5/spec-LC/content-models.html#embedded-content-0
726 if (['AUDIO', 'CANVAS', 'EMBED', 'IFRAME', 'IMG', 'MATH', 'OBJECT', 'SVG', 'VIDEO'].includes(node.tagName)) {
727 return false;
728 } // Elements with no children are empty.
729
730
731 if (!node.hasChildNodes()) {
732 return true;
733 } // Elements with children are empty if all their children are empty.
734
735
736 return Array.from(node.childNodes).every(isEmptyNode);
737
738 default:
739 return true;
740 }
741 }
742
743 function serializeForm(form) {
744 return new window.URLSearchParams(Array.from(new window.FormData(form))).toString();
745 }
746 //# sourceMappingURL=control.js.map
747 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/form.js
748
749
750 /**
751 * External dependencies
752 */
753
754 /**
755 * WordPress dependencies
756 */
757
758
759
760
761
762
763
764 /**
765 * Internal dependencies
766 */
767
768
769 function Form(_ref) {
770 let {
771 title,
772 isVisible,
773 id,
774 idBase,
775 instance,
776 isWide,
777 onChangeInstance,
778 onChangeHasPreview
779 } = _ref;
780 const ref = (0,external_wp_element_namespaceObject.useRef)();
781 const isMediumLargeViewport = (0,external_wp_compose_namespaceObject.useViewportMatch)('small'); // We only want to remount the control when the instance changes
782 // *externally*. For example, if the user performs an undo. To do this, we
783 // keep track of changes made to instance by the control itself and then
784 // ignore those.
785
786 const outgoingInstances = (0,external_wp_element_namespaceObject.useRef)(new Set());
787 const incomingInstances = (0,external_wp_element_namespaceObject.useRef)(new Set());
788 const {
789 createNotice
790 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_notices_namespaceObject.store);
791 (0,external_wp_element_namespaceObject.useEffect)(() => {
792 if (incomingInstances.current.has(instance)) {
793 incomingInstances.current.delete(instance);
794 return;
795 }
796
797 const control = new Control({
798 id,
799 idBase,
800 instance,
801
802 onChangeInstance(nextInstance) {
803 outgoingInstances.current.add(instance);
804 incomingInstances.current.add(nextInstance);
805 onChangeInstance(nextInstance);
806 },
807
808 onChangeHasPreview,
809
810 onError(error) {
811 window.console.error(error);
812 createNotice('error', (0,external_wp_i18n_namespaceObject.sprintf)(
813 /* translators: %s: the name of the affected block. */
814 (0,external_wp_i18n_namespaceObject.__)('The "%s" block was affected by errors and may not function properly. Check the developer tools for more details.'), idBase || id));
815 }
816
817 });
818 ref.current.appendChild(control.element);
819 return () => {
820 if (outgoingInstances.current.has(instance)) {
821 outgoingInstances.current.delete(instance);
822 return;
823 }
824
825 control.destroy();
826 };
827 }, [id, idBase, instance, onChangeInstance, onChangeHasPreview, isMediumLargeViewport]);
828
829 if (isWide && isMediumLargeViewport) {
830 return (0,external_wp_element_namespaceObject.createElement)("div", {
831 className: classnames_default()({
832 'wp-block-legacy-widget__container': isVisible
833 })
834 }, isVisible && (0,external_wp_element_namespaceObject.createElement)("h3", {
835 className: "wp-block-legacy-widget__edit-form-title"
836 }, title), (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Popover, {
837 focusOnMount: false,
838 position: "middle right",
839 __unstableForceXAlignment: true
840 }, (0,external_wp_element_namespaceObject.createElement)("div", {
841 ref: ref,
842 className: "wp-block-legacy-widget__edit-form",
843 hidden: !isVisible
844 })));
845 }
846
847 return (0,external_wp_element_namespaceObject.createElement)("div", {
848 ref: ref,
849 className: "wp-block-legacy-widget__edit-form",
850 hidden: !isVisible
851 }, (0,external_wp_element_namespaceObject.createElement)("h3", {
852 className: "wp-block-legacy-widget__edit-form-title"
853 }, title));
854 }
855 //# sourceMappingURL=form.js.map
856 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/preview.js
857
858
859 /**
860 * External dependencies
861 */
862
863 /**
864 * WordPress dependencies
865 */
866
867
868
869
870
871
872 function Preview(_ref) {
873 let {
874 idBase,
875 instance,
876 isVisible
877 } = _ref;
878 const [isLoaded, setIsLoaded] = (0,external_wp_element_namespaceObject.useState)(false);
879 const [srcDoc, setSrcDoc] = (0,external_wp_element_namespaceObject.useState)('');
880 (0,external_wp_element_namespaceObject.useEffect)(() => {
881 const abortController = typeof window.AbortController === 'undefined' ? undefined : new window.AbortController();
882
883 async function fetchPreviewHTML() {
884 const restRoute = `/wp/v2/widget-types/${idBase}/render`;
885 return await external_wp_apiFetch_default()({
886 path: restRoute,
887 method: 'POST',
888 signal: abortController === null || abortController === void 0 ? void 0 : abortController.signal,
889 data: instance ? {
890 instance
891 } : {}
892 });
893 }
894
895 fetchPreviewHTML().then(response => {
896 setSrcDoc(response.preview);
897 }).catch(error => {
898 if ('AbortError' === error.name) {
899 // We don't want to log aborted requests.
900 return;
901 }
902
903 throw error;
904 });
905 return () => abortController === null || abortController === void 0 ? void 0 : abortController.abort();
906 }, [idBase, instance]); // Resize the iframe on either the load event, or when the iframe becomes visible.
907
908 const ref = (0,external_wp_compose_namespaceObject.useRefEffect)(iframe => {
909 // Only set height if the iframe is loaded,
910 // or it will grow to an unexpected large height in Safari if it's hidden initially.
911 if (!isLoaded) {
912 return;
913 } // If the preview frame has another origin then this won't work.
914 // One possible solution is to add custom script to call `postMessage` in the preview frame.
915 // Or, better yet, we migrate away from iframe.
916
917
918 function setHeight() {
919 // Pick the maximum of these two values to account for margin collapsing.
920 const height = Math.max(iframe.contentDocument.documentElement.offsetHeight, iframe.contentDocument.body.offsetHeight);
921 iframe.style.height = `${height}px`;
922 }
923
924 const {
925 IntersectionObserver
926 } = iframe.ownerDocument.defaultView; // Observe for intersections that might cause a change in the height of
927 // the iframe, e.g. a Widget Area becoming expanded.
928
929 const intersectionObserver = new IntersectionObserver(_ref2 => {
930 let [entry] = _ref2;
931
932 if (entry.isIntersecting) {
933 setHeight();
934 }
935 }, {
936 threshold: 1
937 });
938 intersectionObserver.observe(iframe);
939 iframe.addEventListener('load', setHeight);
940 return () => {
941 intersectionObserver.disconnect();
942 iframe.removeEventListener('load', setHeight);
943 };
944 }, [isLoaded]);
945 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, isVisible && !isLoaded && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Placeholder, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Spinner, null)), (0,external_wp_element_namespaceObject.createElement)("div", {
946 className: classnames_default()('wp-block-legacy-widget__edit-preview', {
947 'is-offscreen': !isVisible || !isLoaded
948 })
949 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Disabled, null, (0,external_wp_element_namespaceObject.createElement)("iframe", {
950 ref: ref,
951 className: "wp-block-legacy-widget__edit-preview-iframe",
952 tabIndex: "-1",
953 title: (0,external_wp_i18n_namespaceObject.__)('Legacy Widget Preview'),
954 srcDoc: srcDoc,
955 onLoad: event => {
956 // To hide the scrollbars of the preview frame for some edge cases,
957 // such as negative margins in the Gallery Legacy Widget.
958 // It can't be scrolled anyway.
959 // TODO: Ideally, this should be fixed in core.
960 event.target.contentDocument.body.style.overflow = 'hidden';
961 setIsLoaded(true);
962 },
963 height: 100
964 }))));
965 }
966 //# sourceMappingURL=preview.js.map
967 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/no-preview.js
968
969
970 /**
971 * WordPress dependencies
972 */
973
974 function NoPreview(_ref) {
975 let {
976 name
977 } = _ref;
978 return (0,external_wp_element_namespaceObject.createElement)("div", {
979 className: "wp-block-legacy-widget__edit-no-preview"
980 }, name && (0,external_wp_element_namespaceObject.createElement)("h3", null, name), (0,external_wp_element_namespaceObject.createElement)("p", null, (0,external_wp_i18n_namespaceObject.__)('No preview available.')));
981 }
982 //# sourceMappingURL=no-preview.js.map
983 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/convert-to-blocks-button.js
984
985
986 /**
987 * WordPress dependencies
988 */
989
990
991
992
993
994 function ConvertToBlocksButton(_ref) {
995 let {
996 clientId,
997 rawInstance
998 } = _ref;
999 const {
1000 replaceBlocks
1001 } = (0,external_wp_data_namespaceObject.useDispatch)(external_wp_blockEditor_namespaceObject.store);
1002 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarButton, {
1003 onClick: () => {
1004 if (rawInstance.title) {
1005 replaceBlocks(clientId, [(0,external_wp_blocks_namespaceObject.createBlock)('core/heading', {
1006 content: rawInstance.title
1007 }), ...(0,external_wp_blocks_namespaceObject.rawHandler)({
1008 HTML: rawInstance.text
1009 })]);
1010 } else {
1011 replaceBlocks(clientId, (0,external_wp_blocks_namespaceObject.rawHandler)({
1012 HTML: rawInstance.text
1013 }));
1014 }
1015 }
1016 }, (0,external_wp_i18n_namespaceObject.__)('Convert to blocks'));
1017 }
1018 //# sourceMappingURL=convert-to-blocks-button.js.map
1019 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/edit/index.js
1020
1021
1022 /**
1023 * External dependencies
1024 */
1025
1026 /**
1027 * WordPress dependencies
1028 */
1029
1030
1031
1032
1033
1034
1035
1036
1037 /**
1038 * Internal dependencies
1039 */
1040
1041
1042
1043
1044
1045
1046
1047 function Edit(props) {
1048 const {
1049 id,
1050 idBase
1051 } = props.attributes;
1052 const {
1053 isWide = false
1054 } = props;
1055 const blockProps = (0,external_wp_blockEditor_namespaceObject.useBlockProps)({
1056 className: classnames_default()({
1057 'is-wide-widget': isWide
1058 })
1059 });
1060 return (0,external_wp_element_namespaceObject.createElement)("div", blockProps, !id && !idBase ? (0,external_wp_element_namespaceObject.createElement)(Empty, props) : (0,external_wp_element_namespaceObject.createElement)(NotEmpty, props));
1061 }
1062
1063 function Empty(_ref) {
1064 let {
1065 attributes: {
1066 id,
1067 idBase
1068 },
1069 setAttributes
1070 } = _ref;
1071 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Placeholder, {
1072 icon: (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockIcon, {
1073 icon: library_brush
1074 }),
1075 label: (0,external_wp_i18n_namespaceObject.__)('Legacy Widget')
1076 }, (0,external_wp_element_namespaceObject.createElement)(WidgetTypeSelector, {
1077 selectedId: id !== null && id !== void 0 ? id : idBase,
1078 onSelect: _ref2 => {
1079 let {
1080 selectedId,
1081 isMulti
1082 } = _ref2;
1083
1084 if (!selectedId) {
1085 setAttributes({
1086 id: null,
1087 idBase: null,
1088 instance: null
1089 });
1090 } else if (isMulti) {
1091 setAttributes({
1092 id: null,
1093 idBase: selectedId,
1094 instance: {}
1095 });
1096 } else {
1097 setAttributes({
1098 id: selectedId,
1099 idBase: null,
1100 instance: null
1101 });
1102 }
1103 }
1104 }));
1105 }
1106
1107 function NotEmpty(_ref3) {
1108 let {
1109 attributes: {
1110 id,
1111 idBase,
1112 instance
1113 },
1114 setAttributes,
1115 clientId,
1116 isSelected,
1117 isWide = false
1118 } = _ref3;
1119 const [hasPreview, setHasPreview] = (0,external_wp_element_namespaceObject.useState)(null);
1120 const {
1121 widgetType,
1122 hasResolvedWidgetType,
1123 isNavigationMode
1124 } = (0,external_wp_data_namespaceObject.useSelect)(select => {
1125 const widgetTypeId = id !== null && id !== void 0 ? id : idBase;
1126 return {
1127 widgetType: select(external_wp_coreData_namespaceObject.store).getWidgetType(widgetTypeId),
1128 hasResolvedWidgetType: select(external_wp_coreData_namespaceObject.store).hasFinishedResolution('getWidgetType', [widgetTypeId]),
1129 isNavigationMode: select(external_wp_blockEditor_namespaceObject.store).isNavigationMode()
1130 };
1131 }, [id, idBase]);
1132 const setInstance = (0,external_wp_element_namespaceObject.useCallback)(nextInstance => {
1133 setAttributes({
1134 instance: nextInstance
1135 });
1136 }, []);
1137
1138 if (!widgetType && hasResolvedWidgetType) {
1139 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Placeholder, {
1140 icon: (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockIcon, {
1141 icon: library_brush
1142 }),
1143 label: (0,external_wp_i18n_namespaceObject.__)('Legacy Widget')
1144 }, (0,external_wp_i18n_namespaceObject.__)('Widget is missing.'));
1145 }
1146
1147 if (!hasResolvedWidgetType) {
1148 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Placeholder, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Spinner, null));
1149 }
1150
1151 const mode = idBase && (isNavigationMode || !isSelected) ? 'preview' : 'edit';
1152 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, idBase === 'text' && (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockControls, {
1153 group: "other"
1154 }, (0,external_wp_element_namespaceObject.createElement)(ConvertToBlocksButton, {
1155 clientId: clientId,
1156 rawInstance: instance.raw
1157 })), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.InspectorControls, null, (0,external_wp_element_namespaceObject.createElement)(InspectorCard, {
1158 name: widgetType.name,
1159 description: widgetType.description
1160 })), (0,external_wp_element_namespaceObject.createElement)(Form, {
1161 title: widgetType.name,
1162 isVisible: mode === 'edit',
1163 id: id,
1164 idBase: idBase,
1165 instance: instance,
1166 isWide: isWide,
1167 onChangeInstance: setInstance,
1168 onChangeHasPreview: setHasPreview
1169 }), idBase && (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, hasPreview === null && mode === 'preview' && (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Placeholder, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Spinner, null)), hasPreview === true && (0,external_wp_element_namespaceObject.createElement)(Preview, {
1170 idBase: idBase,
1171 instance: instance,
1172 isVisible: mode === 'preview'
1173 }), hasPreview === false && mode === 'preview' && (0,external_wp_element_namespaceObject.createElement)(NoPreview, {
1174 name: widgetType.name
1175 })));
1176 }
1177 //# sourceMappingURL=index.js.map
1178 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/transforms.js
1179 /**
1180 * WordPress dependencies
1181 */
1182
1183 const legacyWidgetTransforms = [{
1184 block: 'core/calendar',
1185 widget: 'calendar'
1186 }, {
1187 block: 'core/search',
1188 widget: 'search'
1189 }, {
1190 block: 'core/html',
1191 widget: 'custom_html',
1192 transform: _ref => {
1193 let {
1194 content
1195 } = _ref;
1196 return {
1197 content
1198 };
1199 }
1200 }, {
1201 block: 'core/archives',
1202 widget: 'archives',
1203 transform: _ref2 => {
1204 let {
1205 count,
1206 dropdown
1207 } = _ref2;
1208 return {
1209 displayAsDropdown: !!dropdown,
1210 showPostCounts: !!count
1211 };
1212 }
1213 }, {
1214 block: 'core/latest-posts',
1215 widget: 'recent-posts',
1216 transform: _ref3 => {
1217 let {
1218 show_date: displayPostDate,
1219 number
1220 } = _ref3;
1221 return {
1222 displayPostDate: !!displayPostDate,
1223 postsToShow: number
1224 };
1225 }
1226 }, {
1227 block: 'core/latest-comments',
1228 widget: 'recent-comments',
1229 transform: _ref4 => {
1230 let {
1231 number
1232 } = _ref4;
1233 return {
1234 commentsToShow: number
1235 };
1236 }
1237 }, {
1238 block: 'core/tag-cloud',
1239 widget: 'tag_cloud',
1240 transform: _ref5 => {
1241 let {
1242 taxonomy,
1243 count
1244 } = _ref5;
1245 return {
1246 showTagCounts: !!count,
1247 taxonomy
1248 };
1249 }
1250 }, {
1251 block: 'core/categories',
1252 widget: 'categories',
1253 transform: _ref6 => {
1254 let {
1255 count,
1256 dropdown,
1257 hierarchical
1258 } = _ref6;
1259 return {
1260 displayAsDropdown: !!dropdown,
1261 showPostCounts: !!count,
1262 showHierarchy: !!hierarchical
1263 };
1264 }
1265 }, {
1266 block: 'core/audio',
1267 widget: 'media_audio',
1268 transform: _ref7 => {
1269 let {
1270 url,
1271 preload,
1272 loop,
1273 attachment_id: id
1274 } = _ref7;
1275 return {
1276 src: url,
1277 id,
1278 preload,
1279 loop
1280 };
1281 }
1282 }, {
1283 block: 'core/video',
1284 widget: 'media_video',
1285 transform: _ref8 => {
1286 let {
1287 url,
1288 preload,
1289 loop,
1290 attachment_id: id
1291 } = _ref8;
1292 return {
1293 src: url,
1294 id,
1295 preload,
1296 loop
1297 };
1298 }
1299 }, {
1300 block: 'core/image',
1301 widget: 'media_image',
1302 transform: _ref9 => {
1303 let {
1304 alt,
1305 attachment_id: id,
1306 caption,
1307 height,
1308 link_classes: linkClass,
1309 link_rel: rel,
1310 link_target_blank: targetBlack,
1311 link_type: linkDestination,
1312 link_url: link,
1313 size: sizeSlug,
1314 url,
1315 width
1316 } = _ref9;
1317 return {
1318 alt,
1319 caption,
1320 height,
1321 id,
1322 link,
1323 linkClass,
1324 linkDestination,
1325 linkTarget: targetBlack ? '_blank' : undefined,
1326 rel,
1327 sizeSlug,
1328 url,
1329 width
1330 };
1331 }
1332 }, {
1333 block: 'core/gallery',
1334 widget: 'media_gallery',
1335 transform: _ref10 => {
1336 let {
1337 ids,
1338 link_type: linkTo,
1339 size,
1340 number
1341 } = _ref10;
1342 return {
1343 ids,
1344 columns: number,
1345 linkTo,
1346 sizeSlug: size,
1347 images: ids.map(id => ({
1348 id
1349 }))
1350 };
1351 }
1352 }, {
1353 block: 'core/rss',
1354 widget: 'rss',
1355 transform: _ref11 => {
1356 let {
1357 url,
1358 show_author: displayAuthor,
1359 show_date: displayDate,
1360 show_summary: displayExcerpt,
1361 items
1362 } = _ref11;
1363 return {
1364 feedURL: url,
1365 displayAuthor: !!displayAuthor,
1366 displayDate: !!displayDate,
1367 displayExcerpt: !!displayExcerpt,
1368 itemsToShow: items
1369 };
1370 }
1371 }].map(_ref12 => {
1372 let {
1373 block,
1374 widget,
1375 transform
1376 } = _ref12;
1377 return {
1378 type: 'block',
1379 blocks: [block],
1380 isMatch: _ref13 => {
1381 let {
1382 idBase,
1383 instance
1384 } = _ref13;
1385 return idBase === widget && !!(instance !== null && instance !== void 0 && instance.raw);
1386 },
1387 transform: _ref14 => {
1388 var _instance$raw;
1389
1390 let {
1391 instance
1392 } = _ref14;
1393 const transformedBlock = (0,external_wp_blocks_namespaceObject.createBlock)(block, transform ? transform(instance.raw) : undefined);
1394
1395 if (!((_instance$raw = instance.raw) !== null && _instance$raw !== void 0 && _instance$raw.title)) {
1396 return transformedBlock;
1397 }
1398
1399 return [(0,external_wp_blocks_namespaceObject.createBlock)('core/heading', {
1400 content: instance.raw.title
1401 }), transformedBlock];
1402 }
1403 };
1404 });
1405 const transforms = {
1406 to: legacyWidgetTransforms
1407 };
1408 /* harmony default export */ var legacy_widget_transforms = (transforms);
1409 //# sourceMappingURL=transforms.js.map
1410 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/legacy-widget/index.js
1411 /**
1412 * WordPress dependencies
1413 */
1414
1415 /**
1416 * Internal dependencies
1417 */
1418
1419 const metadata = {
1420 apiVersion: 2,
1421 name: "core/legacy-widget",
1422 title: "Legacy Widget",
1423 category: "widgets",
1424 description: "Display a legacy widget.",
1425 textdomain: "default",
1426 attributes: {
1427 id: {
1428 type: "string",
1429 "default": null
1430 },
1431 idBase: {
1432 type: "string",
1433 "default": null
1434 },
1435 instance: {
1436 type: "object",
1437 "default": null
1438 }
1439 },
1440 supports: {
1441 html: false,
1442 customClassName: false,
1443 reusable: false
1444 },
1445 editorStyle: "wp-block-legacy-widget-editor"
1446 };
1447
1448
1449 const {
1450 name: legacy_widget_name
1451 } = metadata;
1452
1453 const settings = {
1454 icon: library_widget,
1455 edit: Edit,
1456 transforms: legacy_widget_transforms
1457 };
1458 //# sourceMappingURL=index.js.map
1459 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/group.js
1460
1461
1462 /**
1463 * WordPress dependencies
1464 */
1465
1466 const group = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
1467 viewBox: "0 0 24 24",
1468 xmlns: "http://www.w3.org/2000/svg"
1469 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
1470 d: "M18 4h-7c-1.1 0-2 .9-2 2v3H6c-1.1 0-2 .9-2 2v7c0 1.1.9 2 2 2h7c1.1 0 2-.9 2-2v-3h3c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-4.5 14c0 .3-.2.5-.5.5H6c-.3 0-.5-.2-.5-.5v-7c0-.3.2-.5.5-.5h3V13c0 1.1.9 2 2 2h2.5v3zm0-4.5H11c-.3 0-.5-.2-.5-.5v-2.5H13c.3 0 .5.2.5.5v2.5zm5-.5c0 .3-.2.5-.5.5h-3V11c0-1.1-.9-2-2-2h-2.5V6c0-.3.2-.5.5-.5h7c.3 0 .5.2.5.5v7z"
1471 }));
1472 /* harmony default export */ var library_group = (group);
1473 //# sourceMappingURL=group.js.map
1474 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/widget-group/edit.js
1475
1476
1477 /**
1478 * WordPress dependencies
1479 */
1480
1481
1482
1483
1484
1485 function edit_Edit(props) {
1486 const {
1487 clientId
1488 } = props;
1489 const {
1490 innerBlocks
1491 } = (0,external_wp_data_namespaceObject.useSelect)(select => select(external_wp_blockEditor_namespaceObject.store).getBlock(clientId), [clientId]);
1492 return (0,external_wp_element_namespaceObject.createElement)("div", (0,external_wp_blockEditor_namespaceObject.useBlockProps)({
1493 className: 'widget'
1494 }), innerBlocks.length === 0 ? (0,external_wp_element_namespaceObject.createElement)(PlaceholderContent, props) : (0,external_wp_element_namespaceObject.createElement)(PreviewContent, props));
1495 }
1496
1497 function PlaceholderContent(_ref) {
1498 let {
1499 clientId
1500 } = _ref;
1501 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.Placeholder, {
1502 className: "wp-block-widget-group__placeholder",
1503 icon: (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.BlockIcon, {
1504 icon: library_group
1505 }),
1506 label: (0,external_wp_i18n_namespaceObject.__)('Widget Group')
1507 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.ButtonBlockAppender, {
1508 rootClientId: clientId
1509 })), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.InnerBlocks, {
1510 renderAppender: false
1511 }));
1512 }
1513
1514 function PreviewContent(_ref2) {
1515 var _attributes$title;
1516
1517 let {
1518 attributes,
1519 setAttributes
1520 } = _ref2;
1521 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichText, {
1522 tagName: "h2",
1523 className: "widget-title",
1524 allowedFormats: [],
1525 placeholder: (0,external_wp_i18n_namespaceObject.__)('Title'),
1526 value: (_attributes$title = attributes.title) !== null && _attributes$title !== void 0 ? _attributes$title : '',
1527 onChange: title => setAttributes({
1528 title
1529 })
1530 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.InnerBlocks, null));
1531 }
1532 //# sourceMappingURL=edit.js.map
1533 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/widget-group/save.js
1534
1535
1536 /**
1537 * WordPress dependencies
1538 */
1539
1540 function save(_ref) {
1541 let {
1542 attributes
1543 } = _ref;
1544 return (0,external_wp_element_namespaceObject.createElement)(external_wp_element_namespaceObject.Fragment, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.RichText.Content, {
1545 tagName: "h2",
1546 className: "widget-title",
1547 value: attributes.title
1548 }), (0,external_wp_element_namespaceObject.createElement)(external_wp_blockEditor_namespaceObject.InnerBlocks.Content, null));
1549 }
1550 //# sourceMappingURL=save.js.map
1551 ;// CONCATENATED MODULE: ./packages/widgets/build-module/blocks/widget-group/index.js
1552 /**
1553 * WordPress dependencies
1554 */
1555
1556
1557
1558 /**
1559 * Internal dependencies
1560 */
1561
1562 const widget_group_metadata = {
1563 apiVersion: 2,
1564 name: "core/widget-group",
1565 category: "widgets",
1566 attributes: {
1567 title: {
1568 type: "string"
1569 }
1570 },
1571 supports: {
1572 html: false,
1573 inserter: true,
1574 customClassName: true,
1575 reusable: false
1576 },
1577 editorStyle: "wp-block-widget-group-editor",
1578 style: "wp-block-widget-group"
1579 };
1580
1581
1582 const {
1583 name: widget_group_name
1584 } = widget_group_metadata;
1585
1586 const widget_group_settings = {
1587 title: (0,external_wp_i18n_namespaceObject.__)('Widget Group'),
1588 description: (0,external_wp_i18n_namespaceObject.__)('Create a classic widget layout with a title that’s styled by your theme for your widget areas.'),
1589 icon: library_group,
1590 __experimentalLabel: _ref => {
1591 let {
1592 name: label
1593 } = _ref;
1594 return label;
1595 },
1596 edit: edit_Edit,
1597 save: save,
1598 transforms: {
1599 from: [{
1600 type: 'block',
1601 isMultiBlock: true,
1602 blocks: ['*'],
1603
1604 isMatch(attributes, blocks) {
1605 // Avoid transforming existing `widget-group` blocks.
1606 return !blocks.some(block => block.name === 'core/widget-group');
1607 },
1608
1609 __experimentalConvert(blocks) {
1610 // Put the selected blocks inside the new Widget Group's innerBlocks.
1611 let innerBlocks = [...blocks.map(block => {
1612 return (0,external_wp_blocks_namespaceObject.createBlock)(block.name, block.attributes, block.innerBlocks);
1613 })]; // If the first block is a heading then assume this is intended
1614 // to be the Widget's "title".
1615
1616 const firstHeadingBlock = innerBlocks[0].name === 'core/heading' ? innerBlocks[0] : null; // Remove the first heading block as we're copying
1617 // it's content into the Widget Group's title attribute.
1618
1619 innerBlocks = innerBlocks.filter(block => block !== firstHeadingBlock);
1620 return (0,external_wp_blocks_namespaceObject.createBlock)('core/widget-group', { ...(firstHeadingBlock && {
1621 title: firstHeadingBlock.attributes.content
1622 })
1623 }, innerBlocks);
1624 }
1625
1626 }]
1627 }
1628 };
1629 //# sourceMappingURL=index.js.map
1630 ;// CONCATENATED MODULE: ./packages/icons/build-module/library/move-to.js
1631
1632
1633 /**
1634 * WordPress dependencies
1635 */
1636
1637 const moveTo = (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.SVG, {
1638 xmlns: "http://www.w3.org/2000/svg",
1639 viewBox: "0 0 24 24"
1640 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_primitives_namespaceObject.Path, {
1641 d: "M19.75 9c0-1.257-.565-2.197-1.39-2.858-.797-.64-1.827-1.017-2.815-1.247-1.802-.42-3.703-.403-4.383-.396L11 4.5V6l.177-.001c.696-.006 2.416-.02 4.028.356.887.207 1.67.518 2.216.957.52.416.829.945.829 1.688 0 .592-.167.966-.407 1.23-.255.281-.656.508-1.236.674-1.19.34-2.82.346-4.607.346h-.077c-1.692 0-3.527 0-4.942.404-.732.209-1.424.545-1.935 1.108-.526.579-.796 1.33-.796 2.238 0 1.257.565 2.197 1.39 2.858.797.64 1.827 1.017 2.815 1.247 1.802.42 3.703.403 4.383.396L13 19.5h.714V22L18 18.5 13.714 15v3H13l-.177.001c-.696.006-2.416.02-4.028-.356-.887-.207-1.67-.518-2.216-.957-.52-.416-.829-.945-.829-1.688 0-.592.167-.966.407-1.23.255-.281.656-.508 1.237-.674 1.189-.34 2.819-.346 4.606-.346h.077c1.692 0 3.527 0 4.941-.404.732-.209 1.425-.545 1.936-1.108.526-.579.796-1.33.796-2.238z"
1642 }));
1643 /* harmony default export */ var move_to = (moveTo);
1644 //# sourceMappingURL=move-to.js.map
1645 ;// CONCATENATED MODULE: ./packages/widgets/build-module/components/move-to-widget-area/index.js
1646
1647
1648 /**
1649 * WordPress dependencies
1650 */
1651
1652
1653
1654 function MoveToWidgetArea(_ref) {
1655 let {
1656 currentWidgetAreaId,
1657 widgetAreas,
1658 onSelect
1659 } = _ref;
1660 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarGroup, null, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.ToolbarItem, null, toggleProps => (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.DropdownMenu, {
1661 icon: move_to,
1662 label: (0,external_wp_i18n_namespaceObject.__)('Move to widget area'),
1663 toggleProps: toggleProps
1664 }, _ref2 => {
1665 let {
1666 onClose
1667 } = _ref2;
1668 return (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuGroup, {
1669 label: (0,external_wp_i18n_namespaceObject.__)('Move to')
1670 }, (0,external_wp_element_namespaceObject.createElement)(external_wp_components_namespaceObject.MenuItemsChoice, {
1671 choices: widgetAreas.map(widgetArea => ({
1672 value: widgetArea.id,
1673 label: widgetArea.name,
1674 info: widgetArea.description
1675 })),
1676 value: currentWidgetAreaId,
1677 onSelect: value => {
1678 onSelect(value);
1679 onClose();
1680 }
1681 }));
1682 })));
1683 }
1684 //# sourceMappingURL=index.js.map
1685 ;// CONCATENATED MODULE: ./packages/widgets/build-module/components/index.js
1686
1687 //# sourceMappingURL=index.js.map
1688 ;// CONCATENATED MODULE: ./packages/widgets/build-module/utils.js
1689 // @ts-check
1690
1691 /**
1692 * Get the internal widget id from block.
1693 *
1694 * @typedef {Object} Attributes
1695 * @property {string} __internalWidgetId The internal widget id.
1696 * @typedef {Object} Block
1697 * @property {Attributes} attributes The attributes of the block.
1698 *
1699 * @param {Block} block The block.
1700 * @return {string} The internal widget id.
1701 */
1702 function getWidgetIdFromBlock(block) {
1703 return block.attributes.__internalWidgetId;
1704 }
1705 /**
1706 * Add internal widget id to block's attributes.
1707 *
1708 * @param {Block} block The block.
1709 * @param {string} widgetId The widget id.
1710 * @return {Block} The updated block.
1711 */
1712
1713 function addWidgetIdToBlock(block, widgetId) {
1714 return { ...block,
1715 attributes: { ...(block.attributes || {}),
1716 __internalWidgetId: widgetId
1717 }
1718 };
1719 }
1720 //# sourceMappingURL=utils.js.map
1721 ;// CONCATENATED MODULE: ./packages/widgets/build-module/register-legacy-widget-variations.js
1722 /**
1723 * WordPress dependencies
1724 */
1725
1726
1727
1728 function registerLegacyWidgetVariations(settings) {
1729 const unsubscribe = (0,external_wp_data_namespaceObject.subscribe)(() => {
1730 var _settings$widgetTypes, _select$getWidgetType;
1731
1732 const hiddenIds = (_settings$widgetTypes = settings === null || settings === void 0 ? void 0 : settings.widgetTypesToHideFromLegacyWidgetBlock) !== null && _settings$widgetTypes !== void 0 ? _settings$widgetTypes : [];
1733 const widgetTypes = (_select$getWidgetType = (0,external_wp_data_namespaceObject.select)(external_wp_coreData_namespaceObject.store).getWidgetTypes({
1734 per_page: -1
1735 })) === null || _select$getWidgetType === void 0 ? void 0 : _select$getWidgetType.filter(widgetType => !hiddenIds.includes(widgetType.id));
1736
1737 if (widgetTypes) {
1738 unsubscribe();
1739 (0,external_wp_data_namespaceObject.dispatch)(external_wp_blocks_namespaceObject.store).addBlockVariations('core/legacy-widget', widgetTypes.map(widgetType => ({
1740 name: widgetType.id,
1741 title: widgetType.name,
1742 description: widgetType.description,
1743 attributes: widgetType.is_multi ? {
1744 idBase: widgetType.id,
1745 instance: {}
1746 } : {
1747 id: widgetType.id
1748 }
1749 })));
1750 }
1751 });
1752 }
1753 //# sourceMappingURL=register-legacy-widget-variations.js.map
1754 ;// CONCATENATED MODULE: ./packages/widgets/build-module/index.js
1755 /**
1756 * WordPress dependencies
1757 */
1758
1759 /**
1760 * Internal dependencies
1761 */
1762
1763
1764
1765
1766
1767 /**
1768 * Registers the Legacy Widget block.
1769 *
1770 * Note that for the block to be useful, any scripts required by a widget must
1771 * be loaded into the page.
1772 *
1773 * @see https://developer.wordpress.org/block-editor/how-to-guides/widgets/legacy-widget-block/
1774 */
1775
1776 function registerLegacyWidgetBlock() {
1777 const {
1778 metadata,
1779 settings,
1780 name
1781 } = legacy_widget_namespaceObject;
1782 (0,external_wp_blocks_namespaceObject.registerBlockType)({
1783 name,
1784 ...metadata
1785 }, settings);
1786 }
1787 /**
1788 * Registers the Widget Group block.
1789 */
1790
1791 function registerWidgetGroupBlock() {
1792 const {
1793 metadata,
1794 settings,
1795 name
1796 } = widget_group_namespaceObject;
1797 (0,external_wp_blocks_namespaceObject.registerBlockType)({
1798 name,
1799 ...metadata
1800 }, settings);
1801 }
1802
1803 //# sourceMappingURL=index.js.map
1804 }();
1805 (window.wp = window.wp || {}).widgets = __webpack_exports__;
1806 /******/ })()
1807 ;