@wordpress/widgets 4.32.0 → 4.32.1-next.ff1cebbba.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/build/blocks/legacy-widget/block.json +29 -0
  2. package/build/blocks/legacy-widget/edit/control.js +137 -167
  3. package/build/blocks/legacy-widget/edit/control.js.map +7 -1
  4. package/build/blocks/legacy-widget/edit/convert-to-blocks-button.js +51 -39
  5. package/build/blocks/legacy-widget/edit/convert-to-blocks-button.js.map +7 -1
  6. package/build/blocks/legacy-widget/edit/form.js +105 -75
  7. package/build/blocks/legacy-widget/edit/form.js.map +7 -1
  8. package/build/blocks/legacy-widget/edit/index.js +121 -131
  9. package/build/blocks/legacy-widget/edit/index.js.map +7 -1
  10. package/build/blocks/legacy-widget/edit/inspector-card.js +28 -20
  11. package/build/blocks/legacy-widget/edit/inspector-card.js.map +7 -1
  12. package/build/blocks/legacy-widget/edit/no-preview.js +29 -23
  13. package/build/blocks/legacy-widget/edit/no-preview.js.map +7 -1
  14. package/build/blocks/legacy-widget/edit/preview.js +107 -108
  15. package/build/blocks/legacy-widget/edit/preview.js.map +7 -1
  16. package/build/blocks/legacy-widget/edit/widget-type-selector.js +61 -52
  17. package/build/blocks/legacy-widget/edit/widget-type-selector.js.map +7 -1
  18. package/build/blocks/legacy-widget/index.js +49 -53
  19. package/build/blocks/legacy-widget/index.js.map +7 -1
  20. package/build/blocks/legacy-widget/transforms.js +189 -198
  21. package/build/blocks/legacy-widget/transforms.js.map +7 -1
  22. package/build/blocks/widget-group/block.json +20 -0
  23. package/build/blocks/widget-group/deprecated.js +38 -24
  24. package/build/blocks/widget-group/deprecated.js.map +7 -1
  25. package/build/blocks/widget-group/edit.js +63 -67
  26. package/build/blocks/widget-group/edit.js.map +7 -1
  27. package/build/blocks/widget-group/index.js +93 -80
  28. package/build/blocks/widget-group/index.js.map +7 -1
  29. package/build/blocks/widget-group/save.js +36 -25
  30. package/build/blocks/widget-group/save.js.map +7 -1
  31. package/build/components/index.js +36 -12
  32. package/build/components/index.js.map +7 -1
  33. package/build/components/move-to-widget-area/index.js +48 -37
  34. package/build/components/move-to-widget-area/index.js.map +7 -1
  35. package/build/index.js +67 -98
  36. package/build/index.js.map +7 -1
  37. package/build/register-legacy-widget-variations.js +42 -30
  38. package/build/register-legacy-widget-variations.js.map +7 -1
  39. package/build/utils.js +29 -29
  40. package/build/utils.js.map +7 -1
  41. package/build-module/blocks/legacy-widget/block.json +29 -0
  42. package/build-module/blocks/legacy-widget/edit/control.js +107 -158
  43. package/build-module/blocks/legacy-widget/edit/control.js.map +7 -1
  44. package/build-module/blocks/legacy-widget/edit/convert-to-blocks-button.js +33 -33
  45. package/build-module/blocks/legacy-widget/edit/convert-to-blocks-button.js.map +7 -1
  46. package/build-module/blocks/legacy-widget/edit/form.js +75 -64
  47. package/build-module/blocks/legacy-widget/edit/form.js.map +7 -1
  48. package/build-module/blocks/legacy-widget/edit/index.js +96 -122
  49. package/build-module/blocks/legacy-widget/edit/index.js.map +7 -1
  50. package/build-module/blocks/legacy-widget/edit/inspector-card.js +10 -15
  51. package/build-module/blocks/legacy-widget/edit/inspector-card.js.map +7 -1
  52. package/build-module/blocks/legacy-widget/edit/no-preview.js +11 -17
  53. package/build-module/blocks/legacy-widget/edit/no-preview.js.map +7 -1
  54. package/build-module/blocks/legacy-widget/edit/preview.js +76 -98
  55. package/build-module/blocks/legacy-widget/edit/preview.js.map +7 -1
  56. package/build-module/blocks/legacy-widget/edit/widget-type-selector.js +43 -46
  57. package/build-module/blocks/legacy-widget/edit/widget-type-selector.js.map +7 -1
  58. package/build-module/blocks/legacy-widget/index.js +12 -45
  59. package/build-module/blocks/legacy-widget/index.js.map +7 -1
  60. package/build-module/blocks/legacy-widget/transforms.js +171 -192
  61. package/build-module/blocks/legacy-widget/transforms.js.map +7 -1
  62. package/build-module/blocks/widget-group/block.json +20 -0
  63. package/build-module/blocks/widget-group/deprecated.js +20 -18
  64. package/build-module/blocks/widget-group/deprecated.js.map +7 -1
  65. package/build-module/blocks/widget-group/edit.js +53 -62
  66. package/build-module/blocks/widget-group/edit.js.map +7 -1
  67. package/build-module/blocks/widget-group/index.js +55 -71
  68. package/build-module/blocks/widget-group/index.js.map +7 -1
  69. package/build-module/blocks/widget-group/save.js +18 -19
  70. package/build-module/blocks/widget-group/save.js.map +7 -1
  71. package/build-module/components/index.js +5 -2
  72. package/build-module/components/index.js.map +7 -1
  73. package/build-module/components/move-to-widget-area/index.js +37 -32
  74. package/build-module/components/move-to-widget-area/index.js.map +7 -1
  75. package/build-module/index.js +34 -60
  76. package/build-module/index.js.map +7 -1
  77. package/build-module/register-legacy-widget-variations.js +24 -24
  78. package/build-module/register-legacy-widget-variations.js.map +7 -1
  79. package/build-module/utils.js +8 -25
  80. package/build-module/utils.js.map +7 -1
  81. package/build-style/style-rtl.css +10 -145
  82. package/build-style/style.css +10 -145
  83. package/package.json +21 -14
  84. package/src/blocks/legacy-widget/editor.scss +3 -0
  85. package/src/blocks/widget-group/editor.scss +3 -0
  86. package/src/style.scss +3 -2
@@ -1,21 +1,7 @@
1
- /* wp:polyfill */
2
- /**
3
- * WordPress dependencies
4
- */
5
- import apiFetch from '@wordpress/api-fetch';
6
- import { debounce } from '@wordpress/compose';
7
- import { __ } from '@wordpress/i18n';
8
-
9
- /**
10
- * An API for creating and loading a widget control (a <div class="widget">
11
- * element) that is compatible with most third party widget scripts. By not
12
- * using React for this, we ensure that we have complete control over the DOM
13
- * and do not accidentally remove any elements that a third party widget script
14
- * has attached an event listener to.
15
- *
16
- * @property {Element} element The control's DOM element.
17
- */
18
- export default class Control {
1
+ import apiFetch from "@wordpress/api-fetch";
2
+ import { debounce } from "@wordpress/compose";
3
+ import { __ } from "@wordpress/i18n";
4
+ class Control {
19
5
  /**
20
6
  * Creates and loads a new control.
21
7
  *
@@ -43,18 +29,16 @@ export default class Control {
43
29
  this.onChangeInstance = onChangeInstance;
44
30
  this.onChangeHasPreview = onChangeHasPreview;
45
31
  this.onError = onError;
46
-
47
- // We can't use the real widget number as this is calculated by the
48
- // server and we may not ever *actually* save this widget. Instead, use
49
- // a fake but unique number.
50
32
  this.number = ++lastNumber;
51
- this.handleFormChange = debounce(this.handleFormChange.bind(this), 200);
33
+ this.handleFormChange = debounce(
34
+ this.handleFormChange.bind(this),
35
+ 200
36
+ );
52
37
  this.handleFormSubmit = this.handleFormSubmit.bind(this);
53
38
  this.initDOM();
54
39
  this.bindEvents();
55
40
  this.loadContent();
56
41
  }
57
-
58
42
  /**
59
43
  * Clean up the control so that it can be garbage collected.
60
44
  *
@@ -63,84 +47,79 @@ export default class Control {
63
47
  destroy() {
64
48
  this.unbindEvents();
65
49
  this.element.remove();
66
- // TODO: How do we make third party widget scripts remove their event
67
- // listeners?
68
50
  }
69
-
70
51
  /**
71
52
  * Creates the control's DOM structure.
72
53
  *
73
54
  * @access private
74
55
  */
75
56
  initDOM() {
76
- var _this$id, _this$idBase;
77
- this.element = el('div', {
78
- class: 'widget open'
79
- }, [el('div', {
80
- class: 'widget-inside'
81
- }, [this.form = el('form', {
82
- class: 'form',
83
- method: 'post'
84
- }, [
85
- // These hidden form inputs are what most widgets' scripts
86
- // use to access data about the widget.
87
- el('input', {
88
- class: 'widget-id',
89
- type: 'hidden',
90
- name: 'widget-id',
91
- value: (_this$id = this.id) !== null && _this$id !== void 0 ? _this$id : `${this.idBase}-${this.number}`
92
- }), el('input', {
93
- class: 'id_base',
94
- type: 'hidden',
95
- name: 'id_base',
96
- value: (_this$idBase = this.idBase) !== null && _this$idBase !== void 0 ? _this$idBase : this.id
97
- }), el('input', {
98
- class: 'widget-width',
99
- type: 'hidden',
100
- name: 'widget-width',
101
- value: '250'
102
- }), el('input', {
103
- class: 'widget-height',
104
- type: 'hidden',
105
- name: 'widget-height',
106
- value: '200'
107
- }), el('input', {
108
- class: 'widget_number',
109
- type: 'hidden',
110
- name: 'widget_number',
111
- value: this.idBase ? this.number.toString() : ''
112
- }), this.content = el('div', {
113
- class: 'widget-content'
114
- }),
115
- // Non-multi widgets can be saved via a Save button.
116
- this.id && el('button', {
117
- class: 'button is-primary',
118
- type: 'submit'
119
- }, __('Save'))])])]);
57
+ this.element = el("div", { class: "widget open" }, [
58
+ el("div", { class: "widget-inside" }, [
59
+ this.form = el("form", { class: "form", method: "post" }, [
60
+ // These hidden form inputs are what most widgets' scripts
61
+ // use to access data about the widget.
62
+ el("input", {
63
+ class: "widget-id",
64
+ type: "hidden",
65
+ name: "widget-id",
66
+ value: this.id ?? `${this.idBase}-${this.number}`
67
+ }),
68
+ el("input", {
69
+ class: "id_base",
70
+ type: "hidden",
71
+ name: "id_base",
72
+ value: this.idBase ?? this.id
73
+ }),
74
+ el("input", {
75
+ class: "widget-width",
76
+ type: "hidden",
77
+ name: "widget-width",
78
+ value: "250"
79
+ }),
80
+ el("input", {
81
+ class: "widget-height",
82
+ type: "hidden",
83
+ name: "widget-height",
84
+ value: "200"
85
+ }),
86
+ el("input", {
87
+ class: "widget_number",
88
+ type: "hidden",
89
+ name: "widget_number",
90
+ value: this.idBase ? this.number.toString() : ""
91
+ }),
92
+ this.content = el("div", { class: "widget-content" }),
93
+ // Non-multi widgets can be saved via a Save button.
94
+ this.id && el(
95
+ "button",
96
+ {
97
+ class: "button is-primary",
98
+ type: "submit"
99
+ },
100
+ __("Save")
101
+ )
102
+ ])
103
+ ])
104
+ ]);
120
105
  }
121
-
122
106
  /**
123
107
  * Adds the control's event listeners.
124
108
  *
125
109
  * @access private
126
110
  */
127
111
  bindEvents() {
128
- // Prefer jQuery 'change' event instead of the native 'change' event
129
- // because many widgets use jQuery's event bus to trigger an update.
130
112
  if (window.jQuery) {
131
- const {
132
- jQuery: $
133
- } = window;
134
- $(this.form).on('change', null, this.handleFormChange);
135
- $(this.form).on('input', null, this.handleFormChange);
136
- $(this.form).on('submit', this.handleFormSubmit);
113
+ const { jQuery: $ } = window;
114
+ $(this.form).on("change", null, this.handleFormChange);
115
+ $(this.form).on("input", null, this.handleFormChange);
116
+ $(this.form).on("submit", this.handleFormSubmit);
137
117
  } else {
138
- this.form.addEventListener('change', this.handleFormChange);
139
- this.form.addEventListener('input', this.handleFormChange);
140
- this.form.addEventListener('submit', this.handleFormSubmit);
118
+ this.form.addEventListener("change", this.handleFormChange);
119
+ this.form.addEventListener("input", this.handleFormChange);
120
+ this.form.addEventListener("submit", this.handleFormSubmit);
141
121
  }
142
122
  }
143
-
144
123
  /**
145
124
  * Removes the control's event listeners.
146
125
  *
@@ -148,19 +127,16 @@ export default class Control {
148
127
  */
149
128
  unbindEvents() {
150
129
  if (window.jQuery) {
151
- const {
152
- jQuery: $
153
- } = window;
154
- $(this.form).off('change', null, this.handleFormChange);
155
- $(this.form).off('input', null, this.handleFormChange);
156
- $(this.form).off('submit', this.handleFormSubmit);
130
+ const { jQuery: $ } = window;
131
+ $(this.form).off("change", null, this.handleFormChange);
132
+ $(this.form).off("input", null, this.handleFormChange);
133
+ $(this.form).off("submit", this.handleFormSubmit);
157
134
  } else {
158
- this.form.removeEventListener('change', this.handleFormChange);
159
- this.form.removeEventListener('input', this.handleFormChange);
160
- this.form.removeEventListener('submit', this.handleFormSubmit);
135
+ this.form.removeEventListener("change", this.handleFormChange);
136
+ this.form.removeEventListener("input", this.handleFormChange);
137
+ this.form.removeEventListener("submit", this.handleFormSubmit);
161
138
  }
162
139
  }
163
-
164
140
  /**
165
141
  * Fetches the widget's form HTML from the REST API and loads it into the
166
142
  * control's form.
@@ -170,28 +146,18 @@ export default class Control {
170
146
  async loadContent() {
171
147
  try {
172
148
  if (this.id) {
173
- const {
174
- form
175
- } = await saveWidget(this.id);
149
+ const { form } = await saveWidget(this.id);
176
150
  this.content.innerHTML = form;
177
151
  } else if (this.idBase) {
178
- const {
179
- form,
180
- preview
181
- } = await encodeWidget({
152
+ const { form, preview } = await encodeWidget({
182
153
  idBase: this.idBase,
183
154
  instance: this.instance,
184
155
  number: this.number
185
156
  });
186
157
  this.content.innerHTML = form;
187
158
  this.hasPreview = !isEmptyHTML(preview);
188
-
189
- // If we don't have an instance, perform a save right away. This
190
- // happens when creating a new Legacy Widget block.
191
159
  if (!this.instance.hash) {
192
- const {
193
- instance
194
- } = await encodeWidget({
160
+ const { instance } = await encodeWidget({
195
161
  idBase: this.idBase,
196
162
  instance: this.instance,
197
163
  number: this.number,
@@ -200,23 +166,14 @@ export default class Control {
200
166
  this.instance = instance;
201
167
  }
202
168
  }
203
-
204
- // Trigger 'widget-added' when widget is ready. This event is what
205
- // widgets' scripts use to initialize, attach events, etc. The event
206
- // must be fired using jQuery's event bus as this is what widget
207
- // scripts expect. If jQuery is not loaded, do nothing - some
208
- // widgets will still work regardless.
209
169
  if (window.jQuery) {
210
- const {
211
- jQuery: $
212
- } = window;
213
- $(document).trigger('widget-added', [$(this.element)]);
170
+ const { jQuery: $ } = window;
171
+ $(document).trigger("widget-added", [$(this.element)]);
214
172
  }
215
173
  } catch (error) {
216
174
  this.onError(error);
217
175
  }
218
176
  }
219
-
220
177
  /**
221
178
  * Perform a save when a multi widget's form is changed. Non-multi widgets
222
179
  * are saved manually.
@@ -228,7 +185,6 @@ export default class Control {
228
185
  this.saveForm();
229
186
  }
230
187
  }
231
-
232
188
  /**
233
189
  * Perform a save when the control's form is manually submitted.
234
190
  *
@@ -239,7 +195,6 @@ export default class Control {
239
195
  event.preventDefault();
240
196
  this.saveForm();
241
197
  }
242
-
243
198
  /**
244
199
  * Serialize the control's form, send it to the REST API, and update the
245
200
  * instance with the encoded instance that the REST API returns.
@@ -250,21 +205,16 @@ export default class Control {
250
205
  const formData = serializeForm(this.form);
251
206
  try {
252
207
  if (this.id) {
253
- const {
254
- form
255
- } = await saveWidget(this.id, formData);
208
+ const { form } = await saveWidget(this.id, formData);
256
209
  this.content.innerHTML = form;
257
210
  if (window.jQuery) {
258
- const {
259
- jQuery: $
260
- } = window;
261
- $(document).trigger('widget-updated', [$(this.element)]);
211
+ const { jQuery: $ } = window;
212
+ $(document).trigger("widget-updated", [
213
+ $(this.element)
214
+ ]);
262
215
  }
263
216
  } else if (this.idBase) {
264
- const {
265
- instance,
266
- preview
267
- } = await encodeWidget({
217
+ const { instance, preview } = await encodeWidget({
268
218
  idBase: this.idBase,
269
219
  instance: this.instance,
270
220
  number: this.number,
@@ -277,7 +227,6 @@ export default class Control {
277
227
  this.onError(error);
278
228
  }
279
229
  }
280
-
281
230
  /**
282
231
  * The widget's instance object.
283
232
  *
@@ -286,7 +235,6 @@ export default class Control {
286
235
  get instance() {
287
236
  return this._instance;
288
237
  }
289
-
290
238
  /**
291
239
  * The widget's instance object.
292
240
  *
@@ -298,7 +246,6 @@ export default class Control {
298
246
  this.onChangeInstance(instance);
299
247
  }
300
248
  }
301
-
302
249
  /**
303
250
  * Whether or not the widget can be previewed.
304
251
  *
@@ -307,7 +254,6 @@ export default class Control {
307
254
  get hasPreview() {
308
255
  return this._hasPreview;
309
256
  }
310
-
311
257
  /**
312
258
  * Whether or not the widget can be previewed.
313
259
  *
@@ -332,7 +278,7 @@ function el(tagName, attributes = {}, content = null) {
332
278
  element.appendChild(child);
333
279
  }
334
280
  }
335
- } else if (typeof content === 'string') {
281
+ } else if (typeof content === "string") {
336
282
  element.innerText = content;
337
283
  }
338
284
  return element;
@@ -342,7 +288,7 @@ async function saveWidget(id, formData = null) {
342
288
  if (formData) {
343
289
  widget = await apiFetch({
344
290
  path: `/wp/v2/widgets/${id}?context=edit`,
345
- method: 'PUT',
291
+ method: "PUT",
346
292
  data: {
347
293
  form_data: formData
348
294
  }
@@ -350,22 +296,15 @@ async function saveWidget(id, formData = null) {
350
296
  } else {
351
297
  widget = await apiFetch({
352
298
  path: `/wp/v2/widgets/${id}?context=edit`,
353
- method: 'GET'
299
+ method: "GET"
354
300
  });
355
301
  }
356
- return {
357
- form: widget.rendered_form
358
- };
302
+ return { form: widget.rendered_form };
359
303
  }
360
- async function encodeWidget({
361
- idBase,
362
- instance,
363
- number,
364
- formData = null
365
- }) {
304
+ async function encodeWidget({ idBase, instance, number, formData = null }) {
366
305
  const response = await apiFetch({
367
306
  path: `/wp/v2/widget-types/${idBase}/encode`,
368
- method: 'POST',
307
+ method: "POST",
369
308
  data: {
370
309
  instance,
371
310
  number,
@@ -379,32 +318,42 @@ async function encodeWidget({
379
318
  };
380
319
  }
381
320
  function isEmptyHTML(html) {
382
- const element = document.createElement('div');
321
+ const element = document.createElement("div");
383
322
  element.innerHTML = html;
384
323
  return isEmptyNode(element);
385
324
  }
386
325
  function isEmptyNode(node) {
387
326
  switch (node.nodeType) {
388
327
  case node.TEXT_NODE:
389
- // Text nodes are empty if it's entirely whitespace.
390
- return node.nodeValue.trim() === '';
328
+ return node.nodeValue.trim() === "";
391
329
  case node.ELEMENT_NODE:
392
- // Elements that are "embedded content" are not empty.
393
- // https://dev.w3.org/html5/spec-LC/content-models.html#embedded-content-0
394
- if (['AUDIO', 'CANVAS', 'EMBED', 'IFRAME', 'IMG', 'MATH', 'OBJECT', 'SVG', 'VIDEO'].includes(node.tagName)) {
330
+ if ([
331
+ "AUDIO",
332
+ "CANVAS",
333
+ "EMBED",
334
+ "IFRAME",
335
+ "IMG",
336
+ "MATH",
337
+ "OBJECT",
338
+ "SVG",
339
+ "VIDEO"
340
+ ].includes(node.tagName)) {
395
341
  return false;
396
342
  }
397
- // Elements with no children are empty.
398
343
  if (!node.hasChildNodes()) {
399
344
  return true;
400
345
  }
401
- // Elements with children are empty if all their children are empty.
402
346
  return Array.from(node.childNodes).every(isEmptyNode);
403
347
  default:
404
348
  return true;
405
349
  }
406
350
  }
407
351
  function serializeForm(form) {
408
- return new window.URLSearchParams(Array.from(new window.FormData(form))).toString();
352
+ return new window.URLSearchParams(
353
+ Array.from(new window.FormData(form))
354
+ ).toString();
409
355
  }
410
- //# sourceMappingURL=control.js.map
356
+ export {
357
+ Control as default
358
+ };
359
+ //# sourceMappingURL=control.js.map
@@ -1 +1,7 @@
1
- {"version":3,"names":["apiFetch","debounce","__","Control","constructor","id","idBase","instance","onChangeInstance","onChangeHasPreview","onError","_instance","_hasPreview","number","lastNumber","handleFormChange","bind","handleFormSubmit","initDOM","bindEvents","loadContent","destroy","unbindEvents","element","remove","_this$id","_this$idBase","el","class","form","method","type","name","value","toString","content","window","jQuery","$","on","addEventListener","off","removeEventListener","saveWidget","innerHTML","preview","encodeWidget","hasPreview","isEmptyHTML","hash","formData","serializeForm","document","trigger","error","saveForm","event","preventDefault","tagName","attributes","createElement","attribute","Object","entries","setAttribute","Array","isArray","child","appendChild","innerText","widget","path","data","form_data","rendered_form","response","html","isEmptyNode","node","nodeType","TEXT_NODE","nodeValue","trim","ELEMENT_NODE","includes","hasChildNodes","from","childNodes","every","URLSearchParams","FormData"],"sources":["@wordpress/widgets/src/blocks/legacy-widget/edit/control.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport apiFetch from '@wordpress/api-fetch';\nimport { debounce } from '@wordpress/compose';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * An API for creating and loading a widget control (a <div class=\"widget\">\n * element) that is compatible with most third party widget scripts. By not\n * using React for this, we ensure that we have complete control over the DOM\n * and do not accidentally remove any elements that a third party widget script\n * has attached an event listener to.\n *\n * @property {Element} element The control's DOM element.\n */\nexport default class Control {\n\t/**\n\t * Creates and loads a new control.\n\t *\n\t * @access public\n\t * @param {Object} params\n\t * @param {string} params.id\n\t * @param {string} params.idBase\n\t * @param {Object} params.instance\n\t * @param {Function} params.onChangeInstance\n\t * @param {Function} params.onChangeHasPreview\n\t * @param {Function} params.onError\n\t */\n\tconstructor( {\n\t\tid,\n\t\tidBase,\n\t\tinstance,\n\t\tonChangeInstance,\n\t\tonChangeHasPreview,\n\t\tonError,\n\t} ) {\n\t\tthis.id = id;\n\t\tthis.idBase = idBase;\n\t\tthis._instance = instance;\n\t\tthis._hasPreview = null;\n\t\tthis.onChangeInstance = onChangeInstance;\n\t\tthis.onChangeHasPreview = onChangeHasPreview;\n\t\tthis.onError = onError;\n\n\t\t// We can't use the real widget number as this is calculated by the\n\t\t// server and we may not ever *actually* save this widget. Instead, use\n\t\t// a fake but unique number.\n\t\tthis.number = ++lastNumber;\n\n\t\tthis.handleFormChange = debounce(\n\t\t\tthis.handleFormChange.bind( this ),\n\t\t\t200\n\t\t);\n\t\tthis.handleFormSubmit = this.handleFormSubmit.bind( this );\n\n\t\tthis.initDOM();\n\t\tthis.bindEvents();\n\t\tthis.loadContent();\n\t}\n\n\t/**\n\t * Clean up the control so that it can be garbage collected.\n\t *\n\t * @access public\n\t */\n\tdestroy() {\n\t\tthis.unbindEvents();\n\t\tthis.element.remove();\n\t\t// TODO: How do we make third party widget scripts remove their event\n\t\t// listeners?\n\t}\n\n\t/**\n\t * Creates the control's DOM structure.\n\t *\n\t * @access private\n\t */\n\tinitDOM() {\n\t\tthis.element = el( 'div', { class: 'widget open' }, [\n\t\t\tel( 'div', { class: 'widget-inside' }, [\n\t\t\t\t( this.form = el( 'form', { class: 'form', method: 'post' }, [\n\t\t\t\t\t// These hidden form inputs are what most widgets' scripts\n\t\t\t\t\t// use to access data about the widget.\n\t\t\t\t\tel( 'input', {\n\t\t\t\t\t\tclass: 'widget-id',\n\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\tname: 'widget-id',\n\t\t\t\t\t\tvalue: this.id ?? `${ this.idBase }-${ this.number }`,\n\t\t\t\t\t} ),\n\t\t\t\t\tel( 'input', {\n\t\t\t\t\t\tclass: 'id_base',\n\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\tname: 'id_base',\n\t\t\t\t\t\tvalue: this.idBase ?? this.id,\n\t\t\t\t\t} ),\n\t\t\t\t\tel( 'input', {\n\t\t\t\t\t\tclass: 'widget-width',\n\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\tname: 'widget-width',\n\t\t\t\t\t\tvalue: '250',\n\t\t\t\t\t} ),\n\t\t\t\t\tel( 'input', {\n\t\t\t\t\t\tclass: 'widget-height',\n\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\tname: 'widget-height',\n\t\t\t\t\t\tvalue: '200',\n\t\t\t\t\t} ),\n\t\t\t\t\tel( 'input', {\n\t\t\t\t\t\tclass: 'widget_number',\n\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\tname: 'widget_number',\n\t\t\t\t\t\tvalue: this.idBase ? this.number.toString() : '',\n\t\t\t\t\t} ),\n\t\t\t\t\t( this.content = el( 'div', { class: 'widget-content' } ) ),\n\t\t\t\t\t// Non-multi widgets can be saved via a Save button.\n\t\t\t\t\tthis.id &&\n\t\t\t\t\t\tel(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tclass: 'button is-primary',\n\t\t\t\t\t\t\t\ttype: 'submit',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t__( 'Save' )\n\t\t\t\t\t\t),\n\t\t\t\t] ) ),\n\t\t\t] ),\n\t\t] );\n\t}\n\n\t/**\n\t * Adds the control's event listeners.\n\t *\n\t * @access private\n\t */\n\tbindEvents() {\n\t\t// Prefer jQuery 'change' event instead of the native 'change' event\n\t\t// because many widgets use jQuery's event bus to trigger an update.\n\t\tif ( window.jQuery ) {\n\t\t\tconst { jQuery: $ } = window;\n\t\t\t$( this.form ).on( 'change', null, this.handleFormChange );\n\t\t\t$( this.form ).on( 'input', null, this.handleFormChange );\n\t\t\t$( this.form ).on( 'submit', this.handleFormSubmit );\n\t\t} else {\n\t\t\tthis.form.addEventListener( 'change', this.handleFormChange );\n\t\t\tthis.form.addEventListener( 'input', this.handleFormChange );\n\t\t\tthis.form.addEventListener( 'submit', this.handleFormSubmit );\n\t\t}\n\t}\n\n\t/**\n\t * Removes the control's event listeners.\n\t *\n\t * @access private\n\t */\n\tunbindEvents() {\n\t\tif ( window.jQuery ) {\n\t\t\tconst { jQuery: $ } = window;\n\t\t\t$( this.form ).off( 'change', null, this.handleFormChange );\n\t\t\t$( this.form ).off( 'input', null, this.handleFormChange );\n\t\t\t$( this.form ).off( 'submit', this.handleFormSubmit );\n\t\t} else {\n\t\t\tthis.form.removeEventListener( 'change', this.handleFormChange );\n\t\t\tthis.form.removeEventListener( 'input', this.handleFormChange );\n\t\t\tthis.form.removeEventListener( 'submit', this.handleFormSubmit );\n\t\t}\n\t}\n\n\t/**\n\t * Fetches the widget's form HTML from the REST API and loads it into the\n\t * control's form.\n\t *\n\t * @access private\n\t */\n\tasync loadContent() {\n\t\ttry {\n\t\t\tif ( this.id ) {\n\t\t\t\tconst { form } = await saveWidget( this.id );\n\t\t\t\tthis.content.innerHTML = form;\n\t\t\t} else if ( this.idBase ) {\n\t\t\t\tconst { form, preview } = await encodeWidget( {\n\t\t\t\t\tidBase: this.idBase,\n\t\t\t\t\tinstance: this.instance,\n\t\t\t\t\tnumber: this.number,\n\t\t\t\t} );\n\t\t\t\tthis.content.innerHTML = form;\n\t\t\t\tthis.hasPreview = ! isEmptyHTML( preview );\n\n\t\t\t\t// If we don't have an instance, perform a save right away. This\n\t\t\t\t// happens when creating a new Legacy Widget block.\n\t\t\t\tif ( ! this.instance.hash ) {\n\t\t\t\t\tconst { instance } = await encodeWidget( {\n\t\t\t\t\t\tidBase: this.idBase,\n\t\t\t\t\t\tinstance: this.instance,\n\t\t\t\t\t\tnumber: this.number,\n\t\t\t\t\t\tformData: serializeForm( this.form ),\n\t\t\t\t\t} );\n\t\t\t\t\tthis.instance = instance;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Trigger 'widget-added' when widget is ready. This event is what\n\t\t\t// widgets' scripts use to initialize, attach events, etc. The event\n\t\t\t// must be fired using jQuery's event bus as this is what widget\n\t\t\t// scripts expect. If jQuery is not loaded, do nothing - some\n\t\t\t// widgets will still work regardless.\n\t\t\tif ( window.jQuery ) {\n\t\t\t\tconst { jQuery: $ } = window;\n\t\t\t\t$( document ).trigger( 'widget-added', [ $( this.element ) ] );\n\t\t\t}\n\t\t} catch ( error ) {\n\t\t\tthis.onError( error );\n\t\t}\n\t}\n\n\t/**\n\t * Perform a save when a multi widget's form is changed. Non-multi widgets\n\t * are saved manually.\n\t *\n\t * @access private\n\t */\n\thandleFormChange() {\n\t\tif ( this.idBase ) {\n\t\t\tthis.saveForm();\n\t\t}\n\t}\n\n\t/**\n\t * Perform a save when the control's form is manually submitted.\n\t *\n\t * @access private\n\t * @param {Event} event\n\t */\n\thandleFormSubmit( event ) {\n\t\tevent.preventDefault();\n\t\tthis.saveForm();\n\t}\n\n\t/**\n\t * Serialize the control's form, send it to the REST API, and update the\n\t * instance with the encoded instance that the REST API returns.\n\t *\n\t * @access private\n\t */\n\tasync saveForm() {\n\t\tconst formData = serializeForm( this.form );\n\n\t\ttry {\n\t\t\tif ( this.id ) {\n\t\t\t\tconst { form } = await saveWidget( this.id, formData );\n\t\t\t\tthis.content.innerHTML = form;\n\n\t\t\t\tif ( window.jQuery ) {\n\t\t\t\t\tconst { jQuery: $ } = window;\n\t\t\t\t\t$( document ).trigger( 'widget-updated', [\n\t\t\t\t\t\t$( this.element ),\n\t\t\t\t\t] );\n\t\t\t\t}\n\t\t\t} else if ( this.idBase ) {\n\t\t\t\tconst { instance, preview } = await encodeWidget( {\n\t\t\t\t\tidBase: this.idBase,\n\t\t\t\t\tinstance: this.instance,\n\t\t\t\t\tnumber: this.number,\n\t\t\t\t\tformData,\n\t\t\t\t} );\n\t\t\t\tthis.instance = instance;\n\t\t\t\tthis.hasPreview = ! isEmptyHTML( preview );\n\t\t\t}\n\t\t} catch ( error ) {\n\t\t\tthis.onError( error );\n\t\t}\n\t}\n\n\t/**\n\t * The widget's instance object.\n\t *\n\t * @access private\n\t */\n\tget instance() {\n\t\treturn this._instance;\n\t}\n\n\t/**\n\t * The widget's instance object.\n\t *\n\t * @access private\n\t */\n\tset instance( instance ) {\n\t\tif ( this._instance !== instance ) {\n\t\t\tthis._instance = instance;\n\t\t\tthis.onChangeInstance( instance );\n\t\t}\n\t}\n\n\t/**\n\t * Whether or not the widget can be previewed.\n\t *\n\t * @access public\n\t */\n\tget hasPreview() {\n\t\treturn this._hasPreview;\n\t}\n\n\t/**\n\t * Whether or not the widget can be previewed.\n\t *\n\t * @access private\n\t */\n\tset hasPreview( hasPreview ) {\n\t\tif ( this._hasPreview !== hasPreview ) {\n\t\t\tthis._hasPreview = hasPreview;\n\t\t\tthis.onChangeHasPreview( hasPreview );\n\t\t}\n\t}\n}\n\nlet lastNumber = 0;\n\nfunction el( tagName, attributes = {}, content = null ) {\n\tconst element = document.createElement( tagName );\n\tfor ( const [ attribute, value ] of Object.entries( attributes ) ) {\n\t\telement.setAttribute( attribute, value );\n\t}\n\tif ( Array.isArray( content ) ) {\n\t\tfor ( const child of content ) {\n\t\t\tif ( child ) {\n\t\t\t\telement.appendChild( child );\n\t\t\t}\n\t\t}\n\t} else if ( typeof content === 'string' ) {\n\t\telement.innerText = content;\n\t}\n\treturn element;\n}\n\nasync function saveWidget( id, formData = null ) {\n\tlet widget;\n\tif ( formData ) {\n\t\twidget = await apiFetch( {\n\t\t\tpath: `/wp/v2/widgets/${ id }?context=edit`,\n\t\t\tmethod: 'PUT',\n\t\t\tdata: {\n\t\t\t\tform_data: formData,\n\t\t\t},\n\t\t} );\n\t} else {\n\t\twidget = await apiFetch( {\n\t\t\tpath: `/wp/v2/widgets/${ id }?context=edit`,\n\t\t\tmethod: 'GET',\n\t\t} );\n\t}\n\treturn { form: widget.rendered_form };\n}\n\nasync function encodeWidget( { idBase, instance, number, formData = null } ) {\n\tconst response = await apiFetch( {\n\t\tpath: `/wp/v2/widget-types/${ idBase }/encode`,\n\t\tmethod: 'POST',\n\t\tdata: {\n\t\t\tinstance,\n\t\t\tnumber,\n\t\t\tform_data: formData,\n\t\t},\n\t} );\n\treturn {\n\t\tinstance: response.instance,\n\t\tform: response.form,\n\t\tpreview: response.preview,\n\t};\n}\n\nfunction isEmptyHTML( html ) {\n\tconst element = document.createElement( 'div' );\n\telement.innerHTML = html;\n\treturn isEmptyNode( element );\n}\n\nfunction isEmptyNode( node ) {\n\tswitch ( node.nodeType ) {\n\t\tcase node.TEXT_NODE:\n\t\t\t// Text nodes are empty if it's entirely whitespace.\n\t\t\treturn node.nodeValue.trim() === '';\n\t\tcase node.ELEMENT_NODE:\n\t\t\t// Elements that are \"embedded content\" are not empty.\n\t\t\t// https://dev.w3.org/html5/spec-LC/content-models.html#embedded-content-0\n\t\t\tif (\n\t\t\t\t[\n\t\t\t\t\t'AUDIO',\n\t\t\t\t\t'CANVAS',\n\t\t\t\t\t'EMBED',\n\t\t\t\t\t'IFRAME',\n\t\t\t\t\t'IMG',\n\t\t\t\t\t'MATH',\n\t\t\t\t\t'OBJECT',\n\t\t\t\t\t'SVG',\n\t\t\t\t\t'VIDEO',\n\t\t\t\t].includes( node.tagName )\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Elements with no children are empty.\n\t\t\tif ( ! node.hasChildNodes() ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t// Elements with children are empty if all their children are empty.\n\t\t\treturn Array.from( node.childNodes ).every( isEmptyNode );\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\nfunction serializeForm( form ) {\n\treturn new window.URLSearchParams(\n\t\tArray.from( new window.FormData( form ) )\n\t).toString();\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/blocks/legacy-widget/edit/control.js"],
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport apiFetch from '@wordpress/api-fetch';\nimport { debounce } from '@wordpress/compose';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * An API for creating and loading a widget control (a <div class=\"widget\">\n * element) that is compatible with most third party widget scripts. By not\n * using React for this, we ensure that we have complete control over the DOM\n * and do not accidentally remove any elements that a third party widget script\n * has attached an event listener to.\n *\n * @property {Element} element The control's DOM element.\n */\nexport default class Control {\n\t/**\n\t * Creates and loads a new control.\n\t *\n\t * @access public\n\t * @param {Object} params\n\t * @param {string} params.id\n\t * @param {string} params.idBase\n\t * @param {Object} params.instance\n\t * @param {Function} params.onChangeInstance\n\t * @param {Function} params.onChangeHasPreview\n\t * @param {Function} params.onError\n\t */\n\tconstructor( {\n\t\tid,\n\t\tidBase,\n\t\tinstance,\n\t\tonChangeInstance,\n\t\tonChangeHasPreview,\n\t\tonError,\n\t} ) {\n\t\tthis.id = id;\n\t\tthis.idBase = idBase;\n\t\tthis._instance = instance;\n\t\tthis._hasPreview = null;\n\t\tthis.onChangeInstance = onChangeInstance;\n\t\tthis.onChangeHasPreview = onChangeHasPreview;\n\t\tthis.onError = onError;\n\n\t\t// We can't use the real widget number as this is calculated by the\n\t\t// server and we may not ever *actually* save this widget. Instead, use\n\t\t// a fake but unique number.\n\t\tthis.number = ++lastNumber;\n\n\t\tthis.handleFormChange = debounce(\n\t\t\tthis.handleFormChange.bind( this ),\n\t\t\t200\n\t\t);\n\t\tthis.handleFormSubmit = this.handleFormSubmit.bind( this );\n\n\t\tthis.initDOM();\n\t\tthis.bindEvents();\n\t\tthis.loadContent();\n\t}\n\n\t/**\n\t * Clean up the control so that it can be garbage collected.\n\t *\n\t * @access public\n\t */\n\tdestroy() {\n\t\tthis.unbindEvents();\n\t\tthis.element.remove();\n\t\t// TODO: How do we make third party widget scripts remove their event\n\t\t// listeners?\n\t}\n\n\t/**\n\t * Creates the control's DOM structure.\n\t *\n\t * @access private\n\t */\n\tinitDOM() {\n\t\tthis.element = el( 'div', { class: 'widget open' }, [\n\t\t\tel( 'div', { class: 'widget-inside' }, [\n\t\t\t\t( this.form = el( 'form', { class: 'form', method: 'post' }, [\n\t\t\t\t\t// These hidden form inputs are what most widgets' scripts\n\t\t\t\t\t// use to access data about the widget.\n\t\t\t\t\tel( 'input', {\n\t\t\t\t\t\tclass: 'widget-id',\n\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\tname: 'widget-id',\n\t\t\t\t\t\tvalue: this.id ?? `${ this.idBase }-${ this.number }`,\n\t\t\t\t\t} ),\n\t\t\t\t\tel( 'input', {\n\t\t\t\t\t\tclass: 'id_base',\n\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\tname: 'id_base',\n\t\t\t\t\t\tvalue: this.idBase ?? this.id,\n\t\t\t\t\t} ),\n\t\t\t\t\tel( 'input', {\n\t\t\t\t\t\tclass: 'widget-width',\n\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\tname: 'widget-width',\n\t\t\t\t\t\tvalue: '250',\n\t\t\t\t\t} ),\n\t\t\t\t\tel( 'input', {\n\t\t\t\t\t\tclass: 'widget-height',\n\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\tname: 'widget-height',\n\t\t\t\t\t\tvalue: '200',\n\t\t\t\t\t} ),\n\t\t\t\t\tel( 'input', {\n\t\t\t\t\t\tclass: 'widget_number',\n\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\tname: 'widget_number',\n\t\t\t\t\t\tvalue: this.idBase ? this.number.toString() : '',\n\t\t\t\t\t} ),\n\t\t\t\t\t( this.content = el( 'div', { class: 'widget-content' } ) ),\n\t\t\t\t\t// Non-multi widgets can be saved via a Save button.\n\t\t\t\t\tthis.id &&\n\t\t\t\t\t\tel(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tclass: 'button is-primary',\n\t\t\t\t\t\t\t\ttype: 'submit',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t__( 'Save' )\n\t\t\t\t\t\t),\n\t\t\t\t] ) ),\n\t\t\t] ),\n\t\t] );\n\t}\n\n\t/**\n\t * Adds the control's event listeners.\n\t *\n\t * @access private\n\t */\n\tbindEvents() {\n\t\t// Prefer jQuery 'change' event instead of the native 'change' event\n\t\t// because many widgets use jQuery's event bus to trigger an update.\n\t\tif ( window.jQuery ) {\n\t\t\tconst { jQuery: $ } = window;\n\t\t\t$( this.form ).on( 'change', null, this.handleFormChange );\n\t\t\t$( this.form ).on( 'input', null, this.handleFormChange );\n\t\t\t$( this.form ).on( 'submit', this.handleFormSubmit );\n\t\t} else {\n\t\t\tthis.form.addEventListener( 'change', this.handleFormChange );\n\t\t\tthis.form.addEventListener( 'input', this.handleFormChange );\n\t\t\tthis.form.addEventListener( 'submit', this.handleFormSubmit );\n\t\t}\n\t}\n\n\t/**\n\t * Removes the control's event listeners.\n\t *\n\t * @access private\n\t */\n\tunbindEvents() {\n\t\tif ( window.jQuery ) {\n\t\t\tconst { jQuery: $ } = window;\n\t\t\t$( this.form ).off( 'change', null, this.handleFormChange );\n\t\t\t$( this.form ).off( 'input', null, this.handleFormChange );\n\t\t\t$( this.form ).off( 'submit', this.handleFormSubmit );\n\t\t} else {\n\t\t\tthis.form.removeEventListener( 'change', this.handleFormChange );\n\t\t\tthis.form.removeEventListener( 'input', this.handleFormChange );\n\t\t\tthis.form.removeEventListener( 'submit', this.handleFormSubmit );\n\t\t}\n\t}\n\n\t/**\n\t * Fetches the widget's form HTML from the REST API and loads it into the\n\t * control's form.\n\t *\n\t * @access private\n\t */\n\tasync loadContent() {\n\t\ttry {\n\t\t\tif ( this.id ) {\n\t\t\t\tconst { form } = await saveWidget( this.id );\n\t\t\t\tthis.content.innerHTML = form;\n\t\t\t} else if ( this.idBase ) {\n\t\t\t\tconst { form, preview } = await encodeWidget( {\n\t\t\t\t\tidBase: this.idBase,\n\t\t\t\t\tinstance: this.instance,\n\t\t\t\t\tnumber: this.number,\n\t\t\t\t} );\n\t\t\t\tthis.content.innerHTML = form;\n\t\t\t\tthis.hasPreview = ! isEmptyHTML( preview );\n\n\t\t\t\t// If we don't have an instance, perform a save right away. This\n\t\t\t\t// happens when creating a new Legacy Widget block.\n\t\t\t\tif ( ! this.instance.hash ) {\n\t\t\t\t\tconst { instance } = await encodeWidget( {\n\t\t\t\t\t\tidBase: this.idBase,\n\t\t\t\t\t\tinstance: this.instance,\n\t\t\t\t\t\tnumber: this.number,\n\t\t\t\t\t\tformData: serializeForm( this.form ),\n\t\t\t\t\t} );\n\t\t\t\t\tthis.instance = instance;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Trigger 'widget-added' when widget is ready. This event is what\n\t\t\t// widgets' scripts use to initialize, attach events, etc. The event\n\t\t\t// must be fired using jQuery's event bus as this is what widget\n\t\t\t// scripts expect. If jQuery is not loaded, do nothing - some\n\t\t\t// widgets will still work regardless.\n\t\t\tif ( window.jQuery ) {\n\t\t\t\tconst { jQuery: $ } = window;\n\t\t\t\t$( document ).trigger( 'widget-added', [ $( this.element ) ] );\n\t\t\t}\n\t\t} catch ( error ) {\n\t\t\tthis.onError( error );\n\t\t}\n\t}\n\n\t/**\n\t * Perform a save when a multi widget's form is changed. Non-multi widgets\n\t * are saved manually.\n\t *\n\t * @access private\n\t */\n\thandleFormChange() {\n\t\tif ( this.idBase ) {\n\t\t\tthis.saveForm();\n\t\t}\n\t}\n\n\t/**\n\t * Perform a save when the control's form is manually submitted.\n\t *\n\t * @access private\n\t * @param {Event} event\n\t */\n\thandleFormSubmit( event ) {\n\t\tevent.preventDefault();\n\t\tthis.saveForm();\n\t}\n\n\t/**\n\t * Serialize the control's form, send it to the REST API, and update the\n\t * instance with the encoded instance that the REST API returns.\n\t *\n\t * @access private\n\t */\n\tasync saveForm() {\n\t\tconst formData = serializeForm( this.form );\n\n\t\ttry {\n\t\t\tif ( this.id ) {\n\t\t\t\tconst { form } = await saveWidget( this.id, formData );\n\t\t\t\tthis.content.innerHTML = form;\n\n\t\t\t\tif ( window.jQuery ) {\n\t\t\t\t\tconst { jQuery: $ } = window;\n\t\t\t\t\t$( document ).trigger( 'widget-updated', [\n\t\t\t\t\t\t$( this.element ),\n\t\t\t\t\t] );\n\t\t\t\t}\n\t\t\t} else if ( this.idBase ) {\n\t\t\t\tconst { instance, preview } = await encodeWidget( {\n\t\t\t\t\tidBase: this.idBase,\n\t\t\t\t\tinstance: this.instance,\n\t\t\t\t\tnumber: this.number,\n\t\t\t\t\tformData,\n\t\t\t\t} );\n\t\t\t\tthis.instance = instance;\n\t\t\t\tthis.hasPreview = ! isEmptyHTML( preview );\n\t\t\t}\n\t\t} catch ( error ) {\n\t\t\tthis.onError( error );\n\t\t}\n\t}\n\n\t/**\n\t * The widget's instance object.\n\t *\n\t * @access private\n\t */\n\tget instance() {\n\t\treturn this._instance;\n\t}\n\n\t/**\n\t * The widget's instance object.\n\t *\n\t * @access private\n\t */\n\tset instance( instance ) {\n\t\tif ( this._instance !== instance ) {\n\t\t\tthis._instance = instance;\n\t\t\tthis.onChangeInstance( instance );\n\t\t}\n\t}\n\n\t/**\n\t * Whether or not the widget can be previewed.\n\t *\n\t * @access public\n\t */\n\tget hasPreview() {\n\t\treturn this._hasPreview;\n\t}\n\n\t/**\n\t * Whether or not the widget can be previewed.\n\t *\n\t * @access private\n\t */\n\tset hasPreview( hasPreview ) {\n\t\tif ( this._hasPreview !== hasPreview ) {\n\t\t\tthis._hasPreview = hasPreview;\n\t\t\tthis.onChangeHasPreview( hasPreview );\n\t\t}\n\t}\n}\n\nlet lastNumber = 0;\n\nfunction el( tagName, attributes = {}, content = null ) {\n\tconst element = document.createElement( tagName );\n\tfor ( const [ attribute, value ] of Object.entries( attributes ) ) {\n\t\telement.setAttribute( attribute, value );\n\t}\n\tif ( Array.isArray( content ) ) {\n\t\tfor ( const child of content ) {\n\t\t\tif ( child ) {\n\t\t\t\telement.appendChild( child );\n\t\t\t}\n\t\t}\n\t} else if ( typeof content === 'string' ) {\n\t\telement.innerText = content;\n\t}\n\treturn element;\n}\n\nasync function saveWidget( id, formData = null ) {\n\tlet widget;\n\tif ( formData ) {\n\t\twidget = await apiFetch( {\n\t\t\tpath: `/wp/v2/widgets/${ id }?context=edit`,\n\t\t\tmethod: 'PUT',\n\t\t\tdata: {\n\t\t\t\tform_data: formData,\n\t\t\t},\n\t\t} );\n\t} else {\n\t\twidget = await apiFetch( {\n\t\t\tpath: `/wp/v2/widgets/${ id }?context=edit`,\n\t\t\tmethod: 'GET',\n\t\t} );\n\t}\n\treturn { form: widget.rendered_form };\n}\n\nasync function encodeWidget( { idBase, instance, number, formData = null } ) {\n\tconst response = await apiFetch( {\n\t\tpath: `/wp/v2/widget-types/${ idBase }/encode`,\n\t\tmethod: 'POST',\n\t\tdata: {\n\t\t\tinstance,\n\t\t\tnumber,\n\t\t\tform_data: formData,\n\t\t},\n\t} );\n\treturn {\n\t\tinstance: response.instance,\n\t\tform: response.form,\n\t\tpreview: response.preview,\n\t};\n}\n\nfunction isEmptyHTML( html ) {\n\tconst element = document.createElement( 'div' );\n\telement.innerHTML = html;\n\treturn isEmptyNode( element );\n}\n\nfunction isEmptyNode( node ) {\n\tswitch ( node.nodeType ) {\n\t\tcase node.TEXT_NODE:\n\t\t\t// Text nodes are empty if it's entirely whitespace.\n\t\t\treturn node.nodeValue.trim() === '';\n\t\tcase node.ELEMENT_NODE:\n\t\t\t// Elements that are \"embedded content\" are not empty.\n\t\t\t// https://dev.w3.org/html5/spec-LC/content-models.html#embedded-content-0\n\t\t\tif (\n\t\t\t\t[\n\t\t\t\t\t'AUDIO',\n\t\t\t\t\t'CANVAS',\n\t\t\t\t\t'EMBED',\n\t\t\t\t\t'IFRAME',\n\t\t\t\t\t'IMG',\n\t\t\t\t\t'MATH',\n\t\t\t\t\t'OBJECT',\n\t\t\t\t\t'SVG',\n\t\t\t\t\t'VIDEO',\n\t\t\t\t].includes( node.tagName )\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Elements with no children are empty.\n\t\t\tif ( ! node.hasChildNodes() ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t// Elements with children are empty if all their children are empty.\n\t\t\treturn Array.from( node.childNodes ).every( isEmptyNode );\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\nfunction serializeForm( form ) {\n\treturn new window.URLSearchParams(\n\t\tArray.from( new window.FormData( form ) )\n\t).toString();\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,34 +1,34 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import { useDispatch } from '@wordpress/data';
5
- import { store as blockEditorStore } from '@wordpress/block-editor';
6
- import { ToolbarButton } from '@wordpress/components';
7
- import { createBlock, rawHandler } from '@wordpress/blocks';
8
- import { __ } from '@wordpress/i18n';
9
- import { jsx as _jsx } from "react/jsx-runtime";
10
- export default function ConvertToBlocksButton({
11
- clientId,
12
- rawInstance
13
- }) {
14
- const {
15
- replaceBlocks
16
- } = useDispatch(blockEditorStore);
17
- return /*#__PURE__*/_jsx(ToolbarButton, {
18
- onClick: () => {
19
- if (rawInstance.title) {
20
- replaceBlocks(clientId, [createBlock('core/heading', {
21
- content: rawInstance.title
22
- }), ...rawHandler({
23
- HTML: rawInstance.text
24
- })]);
25
- } else {
26
- replaceBlocks(clientId, rawHandler({
27
- HTML: rawInstance.text
28
- }));
29
- }
30
- },
31
- children: __('Convert to blocks')
32
- });
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useDispatch } from "@wordpress/data";
3
+ import { store as blockEditorStore } from "@wordpress/block-editor";
4
+ import { ToolbarButton } from "@wordpress/components";
5
+ import { createBlock, rawHandler } from "@wordpress/blocks";
6
+ import { __ } from "@wordpress/i18n";
7
+ function ConvertToBlocksButton({ clientId, rawInstance }) {
8
+ const { replaceBlocks } = useDispatch(blockEditorStore);
9
+ return /* @__PURE__ */ jsx(
10
+ ToolbarButton,
11
+ {
12
+ onClick: () => {
13
+ if (rawInstance.title) {
14
+ replaceBlocks(clientId, [
15
+ createBlock("core/heading", {
16
+ content: rawInstance.title
17
+ }),
18
+ ...rawHandler({ HTML: rawInstance.text })
19
+ ]);
20
+ } else {
21
+ replaceBlocks(
22
+ clientId,
23
+ rawHandler({ HTML: rawInstance.text })
24
+ );
25
+ }
26
+ },
27
+ children: __("Convert to blocks")
28
+ }
29
+ );
33
30
  }
34
- //# sourceMappingURL=convert-to-blocks-button.js.map
31
+ export {
32
+ ConvertToBlocksButton as default
33
+ };
34
+ //# sourceMappingURL=convert-to-blocks-button.js.map
@@ -1 +1,7 @@
1
- {"version":3,"names":["useDispatch","store","blockEditorStore","ToolbarButton","createBlock","rawHandler","__","jsx","_jsx","ConvertToBlocksButton","clientId","rawInstance","replaceBlocks","onClick","title","content","HTML","text","children"],"sources":["@wordpress/widgets/src/blocks/legacy-widget/edit/convert-to-blocks-button.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useDispatch } from '@wordpress/data';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { ToolbarButton } from '@wordpress/components';\nimport { createBlock, rawHandler } from '@wordpress/blocks';\nimport { __ } from '@wordpress/i18n';\n\nexport default function ConvertToBlocksButton( { clientId, rawInstance } ) {\n\tconst { replaceBlocks } = useDispatch( blockEditorStore );\n\n\treturn (\n\t\t<ToolbarButton\n\t\t\tonClick={ () => {\n\t\t\t\tif ( rawInstance.title ) {\n\t\t\t\t\treplaceBlocks( clientId, [\n\t\t\t\t\t\tcreateBlock( 'core/heading', {\n\t\t\t\t\t\t\tcontent: rawInstance.title,\n\t\t\t\t\t\t} ),\n\t\t\t\t\t\t...rawHandler( { HTML: rawInstance.text } ),\n\t\t\t\t\t] );\n\t\t\t\t} else {\n\t\t\t\t\treplaceBlocks(\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\trawHandler( { HTML: rawInstance.text } )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} }\n\t\t>\n\t\t\t{ __( 'Convert to blocks' ) }\n\t\t</ToolbarButton>\n\t);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,WAAW,QAAQ,iBAAiB;AAC7C,SAASC,KAAK,IAAIC,gBAAgB,QAAQ,yBAAyB;AACnE,SAASC,aAAa,QAAQ,uBAAuB;AACrD,SAASC,WAAW,EAAEC,UAAU,QAAQ,mBAAmB;AAC3D,SAASC,EAAE,QAAQ,iBAAiB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAErC,eAAe,SAASC,qBAAqBA,CAAE;EAAEC,QAAQ;EAAEC;AAAY,CAAC,EAAG;EAC1E,MAAM;IAAEC;EAAc,CAAC,GAAGZ,WAAW,CAAEE,gBAAiB,CAAC;EAEzD,oBACCM,IAAA,CAACL,aAAa;IACbU,OAAO,EAAGA,CAAA,KAAM;MACf,IAAKF,WAAW,CAACG,KAAK,EAAG;QACxBF,aAAa,CAAEF,QAAQ,EAAE,CACxBN,WAAW,CAAE,cAAc,EAAE;UAC5BW,OAAO,EAAEJ,WAAW,CAACG;QACtB,CAAE,CAAC,EACH,GAAGT,UAAU,CAAE;UAAEW,IAAI,EAAEL,WAAW,CAACM;QAAK,CAAE,CAAC,CAC1C,CAAC;MACJ,CAAC,MAAM;QACNL,aAAa,CACZF,QAAQ,EACRL,UAAU,CAAE;UAAEW,IAAI,EAAEL,WAAW,CAACM;QAAK,CAAE,CACxC,CAAC;MACF;IACD,CAAG;IAAAC,QAAA,EAEDZ,EAAE,CAAE,mBAAoB;EAAC,CACb,CAAC;AAElB","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/blocks/legacy-widget/edit/convert-to-blocks-button.js"],
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useDispatch } from '@wordpress/data';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { ToolbarButton } from '@wordpress/components';\nimport { createBlock, rawHandler } from '@wordpress/blocks';\nimport { __ } from '@wordpress/i18n';\n\nexport default function ConvertToBlocksButton( { clientId, rawInstance } ) {\n\tconst { replaceBlocks } = useDispatch( blockEditorStore );\n\n\treturn (\n\t\t<ToolbarButton\n\t\t\tonClick={ () => {\n\t\t\t\tif ( rawInstance.title ) {\n\t\t\t\t\treplaceBlocks( clientId, [\n\t\t\t\t\t\tcreateBlock( 'core/heading', {\n\t\t\t\t\t\t\tcontent: rawInstance.title,\n\t\t\t\t\t\t} ),\n\t\t\t\t\t\t...rawHandler( { HTML: rawInstance.text } ),\n\t\t\t\t\t] );\n\t\t\t\t} else {\n\t\t\t\t\treplaceBlocks(\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\trawHandler( { HTML: rawInstance.text } )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} }\n\t\t>\n\t\t\t{ __( 'Convert to blocks' ) }\n\t\t</ToolbarButton>\n\t);\n}\n"],
5
+ "mappings": "AAaE;AAVF,SAAS,mBAAmB;AAC5B,SAAS,SAAS,wBAAwB;AAC1C,SAAS,qBAAqB;AAC9B,SAAS,aAAa,kBAAkB;AACxC,SAAS,UAAU;AAEJ,SAAR,sBAAwC,EAAE,UAAU,YAAY,GAAI;AAC1E,QAAM,EAAE,cAAc,IAAI,YAAa,gBAAiB;AAExD,SACC;AAAA,IAAC;AAAA;AAAA,MACA,SAAU,MAAM;AACf,YAAK,YAAY,OAAQ;AACxB,wBAAe,UAAU;AAAA,YACxB,YAAa,gBAAgB;AAAA,cAC5B,SAAS,YAAY;AAAA,YACtB,CAAE;AAAA,YACF,GAAG,WAAY,EAAE,MAAM,YAAY,KAAK,CAAE;AAAA,UAC3C,CAAE;AAAA,QACH,OAAO;AACN;AAAA,YACC;AAAA,YACA,WAAY,EAAE,MAAM,YAAY,KAAK,CAAE;AAAA,UACxC;AAAA,QACD;AAAA,MACD;AAAA,MAEE,aAAI,mBAAoB;AAAA;AAAA,EAC3B;AAEF;",
6
+ "names": []
7
+ }