list-reusable-blocks.js (14157B)
1 this["wp"] = this["wp"] || {}; this["wp"]["listReusableBlocks"] = 2 /******/ (function(modules) { // webpackBootstrap 3 /******/ // The module cache 4 /******/ var installedModules = {}; 5 /******/ 6 /******/ // The require function 7 /******/ function __webpack_require__(moduleId) { 8 /******/ 9 /******/ // Check if module is in cache 10 /******/ if(installedModules[moduleId]) { 11 /******/ return installedModules[moduleId].exports; 12 /******/ } 13 /******/ // Create a new module (and put it into the cache) 14 /******/ var module = installedModules[moduleId] = { 15 /******/ i: moduleId, 16 /******/ l: false, 17 /******/ exports: {} 18 /******/ }; 19 /******/ 20 /******/ // Execute the module function 21 /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 22 /******/ 23 /******/ // Flag the module as loaded 24 /******/ module.l = true; 25 /******/ 26 /******/ // Return the exports of the module 27 /******/ return module.exports; 28 /******/ } 29 /******/ 30 /******/ 31 /******/ // expose the modules object (__webpack_modules__) 32 /******/ __webpack_require__.m = modules; 33 /******/ 34 /******/ // expose the module cache 35 /******/ __webpack_require__.c = installedModules; 36 /******/ 37 /******/ // define getter function for harmony exports 38 /******/ __webpack_require__.d = function(exports, name, getter) { 39 /******/ if(!__webpack_require__.o(exports, name)) { 40 /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); 41 /******/ } 42 /******/ }; 43 /******/ 44 /******/ // define __esModule on exports 45 /******/ __webpack_require__.r = function(exports) { 46 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 47 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 48 /******/ } 49 /******/ Object.defineProperty(exports, '__esModule', { value: true }); 50 /******/ }; 51 /******/ 52 /******/ // create a fake namespace object 53 /******/ // mode & 1: value is a module id, require it 54 /******/ // mode & 2: merge all properties of value into the ns 55 /******/ // mode & 4: return value when already ns object 56 /******/ // mode & 8|1: behave like require 57 /******/ __webpack_require__.t = function(value, mode) { 58 /******/ if(mode & 1) value = __webpack_require__(value); 59 /******/ if(mode & 8) return value; 60 /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; 61 /******/ var ns = Object.create(null); 62 /******/ __webpack_require__.r(ns); 63 /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); 64 /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); 65 /******/ return ns; 66 /******/ }; 67 /******/ 68 /******/ // getDefaultExport function for compatibility with non-harmony modules 69 /******/ __webpack_require__.n = function(module) { 70 /******/ var getter = module && module.__esModule ? 71 /******/ function getDefault() { return module['default']; } : 72 /******/ function getModuleExports() { return module; }; 73 /******/ __webpack_require__.d(getter, 'a', getter); 74 /******/ return getter; 75 /******/ }; 76 /******/ 77 /******/ // Object.prototype.hasOwnProperty.call 78 /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 79 /******/ 80 /******/ // __webpack_public_path__ 81 /******/ __webpack_require__.p = ""; 82 /******/ 83 /******/ 84 /******/ // Load entry module and return exports 85 /******/ return __webpack_require__(__webpack_require__.s = "SdGz"); 86 /******/ }) 87 /************************************************************************/ 88 /******/ ({ 89 90 /***/ "GRId": 91 /***/ (function(module, exports) { 92 93 (function() { module.exports = window["wp"]["element"]; }()); 94 95 /***/ }), 96 97 /***/ "K9lf": 98 /***/ (function(module, exports) { 99 100 (function() { module.exports = window["wp"]["compose"]; }()); 101 102 /***/ }), 103 104 /***/ "SdGz": 105 /***/ (function(module, __webpack_exports__, __webpack_require__) { 106 107 "use strict"; 108 // ESM COMPAT FLAG 109 __webpack_require__.r(__webpack_exports__); 110 111 // EXTERNAL MODULE: external ["wp","element"] 112 var external_wp_element_ = __webpack_require__("GRId"); 113 114 // EXTERNAL MODULE: external ["wp","i18n"] 115 var external_wp_i18n_ = __webpack_require__("l3Sj"); 116 117 // EXTERNAL MODULE: external "lodash" 118 var external_lodash_ = __webpack_require__("YLtl"); 119 120 // EXTERNAL MODULE: external ["wp","apiFetch"] 121 var external_wp_apiFetch_ = __webpack_require__("ywyh"); 122 var external_wp_apiFetch_default = /*#__PURE__*/__webpack_require__.n(external_wp_apiFetch_); 123 124 // CONCATENATED MODULE: ./node_modules/@wordpress/list-reusable-blocks/build-module/utils/file.js 125 /** 126 * Downloads a file. 127 * 128 * @param {string} fileName File Name. 129 * @param {string} content File Content. 130 * @param {string} contentType File mime type. 131 */ 132 function download(fileName, content, contentType) { 133 const file = new window.Blob([content], { 134 type: contentType 135 }); // IE11 can't use the click to download technique 136 // we use a specific IE11 technique instead. 137 138 if (window.navigator.msSaveOrOpenBlob) { 139 window.navigator.msSaveOrOpenBlob(file, fileName); 140 } else { 141 const a = document.createElement('a'); 142 a.href = URL.createObjectURL(file); 143 a.download = fileName; 144 a.style.display = 'none'; 145 document.body.appendChild(a); 146 a.click(); 147 document.body.removeChild(a); 148 } 149 } 150 /** 151 * Reads the textual content of the given file. 152 * 153 * @param {File} file File. 154 * @return {Promise<string>} Content of the file. 155 */ 156 157 function readTextFile(file) { 158 const reader = new window.FileReader(); 159 return new Promise(resolve => { 160 reader.onload = () => { 161 resolve(reader.result); 162 }; 163 164 reader.readAsText(file); 165 }); 166 } 167 168 // CONCATENATED MODULE: ./node_modules/@wordpress/list-reusable-blocks/build-module/utils/export.js 169 /** 170 * External dependencies 171 */ 172 173 /** 174 * WordPress dependencies 175 */ 176 177 178 /** 179 * Internal dependencies 180 */ 181 182 183 /** 184 * Export a reusable block as a JSON file. 185 * 186 * @param {number} id 187 */ 188 189 async function exportReusableBlock(id) { 190 const postType = await external_wp_apiFetch_default()({ 191 path: `/wp/v2/types/wp_block` 192 }); 193 const post = await external_wp_apiFetch_default()({ 194 path: `/wp/v2/${postType.rest_base}/${id}?context=edit` 195 }); 196 const title = post.title.raw; 197 const content = post.content.raw; 198 const fileContent = JSON.stringify({ 199 __file: 'wp_block', 200 title, 201 content 202 }, null, 2); 203 const fileName = Object(external_lodash_["kebabCase"])(title) + '.json'; 204 download(fileName, fileContent, 'application/json'); 205 } 206 207 /* harmony default export */ var utils_export = (exportReusableBlock); 208 209 // EXTERNAL MODULE: external ["wp","components"] 210 var external_wp_components_ = __webpack_require__("tI+e"); 211 212 // EXTERNAL MODULE: external ["wp","compose"] 213 var external_wp_compose_ = __webpack_require__("K9lf"); 214 215 // CONCATENATED MODULE: ./node_modules/@wordpress/list-reusable-blocks/build-module/utils/import.js 216 /** 217 * External dependencies 218 */ 219 220 /** 221 * WordPress dependencies 222 */ 223 224 225 /** 226 * Internal dependencies 227 */ 228 229 230 /** 231 * Import a reusable block from a JSON file. 232 * 233 * @param {File} file File. 234 * @return {Promise} Promise returning the imported reusable block. 235 */ 236 237 async function importReusableBlock(file) { 238 const fileContent = await readTextFile(file); 239 let parsedContent; 240 241 try { 242 parsedContent = JSON.parse(fileContent); 243 } catch (e) { 244 throw new Error('Invalid JSON file'); 245 } 246 247 if (parsedContent.__file !== 'wp_block' || !parsedContent.title || !parsedContent.content || !Object(external_lodash_["isString"])(parsedContent.title) || !Object(external_lodash_["isString"])(parsedContent.content)) { 248 throw new Error('Invalid Reusable block JSON file'); 249 } 250 251 const postType = await external_wp_apiFetch_default()({ 252 path: `/wp/v2/types/wp_block` 253 }); 254 const reusableBlock = await external_wp_apiFetch_default()({ 255 path: `/wp/v2/${postType.rest_base}`, 256 data: { 257 title: parsedContent.title, 258 content: parsedContent.content, 259 status: 'publish' 260 }, 261 method: 'POST' 262 }); 263 return reusableBlock; 264 } 265 266 /* harmony default export */ var utils_import = (importReusableBlock); 267 268 // CONCATENATED MODULE: ./node_modules/@wordpress/list-reusable-blocks/build-module/components/import-form/index.js 269 270 271 /** 272 * WordPress dependencies 273 */ 274 275 276 277 278 /** 279 * Internal dependencies 280 */ 281 282 283 284 class import_form_ImportForm extends external_wp_element_["Component"] { 285 constructor() { 286 super(...arguments); 287 this.state = { 288 isLoading: false, 289 error: null, 290 file: null 291 }; 292 this.isStillMounted = true; 293 this.onChangeFile = this.onChangeFile.bind(this); 294 this.onSubmit = this.onSubmit.bind(this); 295 } 296 297 componentWillUnmount() { 298 this.isStillMounted = false; 299 } 300 301 onChangeFile(event) { 302 this.setState({ 303 file: event.target.files[0], 304 error: null 305 }); 306 } 307 308 onSubmit(event) { 309 event.preventDefault(); 310 const { 311 file 312 } = this.state; 313 const { 314 onUpload 315 } = this.props; 316 317 if (!file) { 318 return; 319 } 320 321 this.setState({ 322 isLoading: true 323 }); 324 utils_import(file).then(reusableBlock => { 325 if (!this.isStillMounted) { 326 return; 327 } 328 329 this.setState({ 330 isLoading: false 331 }); 332 onUpload(reusableBlock); 333 }).catch(error => { 334 if (!this.isStillMounted) { 335 return; 336 } 337 338 let uiMessage; 339 340 switch (error.message) { 341 case 'Invalid JSON file': 342 uiMessage = Object(external_wp_i18n_["__"])('Invalid JSON file'); 343 break; 344 345 case 'Invalid Reusable block JSON file': 346 uiMessage = Object(external_wp_i18n_["__"])('Invalid Reusable block JSON file'); 347 break; 348 349 default: 350 uiMessage = Object(external_wp_i18n_["__"])('Unknown error'); 351 } 352 353 this.setState({ 354 isLoading: false, 355 error: uiMessage 356 }); 357 }); 358 } 359 360 onDismissError() { 361 this.setState({ 362 error: null 363 }); 364 } 365 366 render() { 367 const { 368 instanceId 369 } = this.props; 370 const { 371 file, 372 isLoading, 373 error 374 } = this.state; 375 const inputId = 'list-reusable-blocks-import-form-' + instanceId; 376 return Object(external_wp_element_["createElement"])("form", { 377 className: "list-reusable-blocks-import-form", 378 onSubmit: this.onSubmit 379 }, error && Object(external_wp_element_["createElement"])(external_wp_components_["Notice"], { 380 status: "error", 381 onRemove: () => this.onDismissError() 382 }, error), Object(external_wp_element_["createElement"])("label", { 383 htmlFor: inputId, 384 className: "list-reusable-blocks-import-form__label" 385 }, Object(external_wp_i18n_["__"])('File')), Object(external_wp_element_["createElement"])("input", { 386 id: inputId, 387 type: "file", 388 onChange: this.onChangeFile 389 }), Object(external_wp_element_["createElement"])(external_wp_components_["Button"], { 390 type: "submit", 391 isBusy: isLoading, 392 disabled: !file || isLoading, 393 isSecondary: true, 394 className: "list-reusable-blocks-import-form__button" 395 }, Object(external_wp_i18n_["_x"])('Import', 'button label'))); 396 } 397 398 } 399 400 /* harmony default export */ var import_form = (Object(external_wp_compose_["withInstanceId"])(import_form_ImportForm)); 401 402 // CONCATENATED MODULE: ./node_modules/@wordpress/list-reusable-blocks/build-module/components/import-dropdown/index.js 403 404 405 /** 406 * External dependencies 407 */ 408 409 /** 410 * WordPress dependencies 411 */ 412 413 414 415 /** 416 * Internal dependencies 417 */ 418 419 420 421 function ImportDropdown({ 422 onUpload 423 }) { 424 return Object(external_wp_element_["createElement"])(external_wp_components_["Dropdown"], { 425 position: "bottom right", 426 contentClassName: "list-reusable-blocks-import-dropdown__content", 427 renderToggle: ({ 428 isOpen, 429 onToggle 430 }) => Object(external_wp_element_["createElement"])(external_wp_components_["Button"], { 431 "aria-expanded": isOpen, 432 onClick: onToggle, 433 isPrimary: true 434 }, Object(external_wp_i18n_["__"])('Import from JSON')), 435 renderContent: ({ 436 onClose 437 }) => Object(external_wp_element_["createElement"])(import_form, { 438 onUpload: Object(external_lodash_["flow"])(onClose, onUpload) 439 }) 440 }); 441 } 442 443 /* harmony default export */ var import_dropdown = (ImportDropdown); 444 445 // CONCATENATED MODULE: ./node_modules/@wordpress/list-reusable-blocks/build-module/index.js 446 447 448 /** 449 * WordPress dependencies 450 */ 451 452 453 /** 454 * Internal dependencies 455 */ 456 457 458 // Setup Export Links 459 460 document.body.addEventListener('click', event => { 461 if (!event.target.classList.contains('wp-list-reusable-blocks__export')) { 462 return; 463 } 464 465 event.preventDefault(); 466 utils_export(event.target.dataset.id); 467 }); // Setup Import Form 468 469 document.addEventListener('DOMContentLoaded', () => { 470 const button = document.querySelector('.page-title-action'); 471 472 if (!button) { 473 return; 474 } 475 476 const showNotice = () => { 477 const notice = document.createElement('div'); 478 notice.className = 'notice notice-success is-dismissible'; 479 notice.innerHTML = `<p>${Object(external_wp_i18n_["__"])('Reusable block imported successfully!')}</p>`; 480 const headerEnd = document.querySelector('.wp-header-end'); 481 482 if (!headerEnd) { 483 return; 484 } 485 486 headerEnd.parentNode.insertBefore(notice, headerEnd); 487 }; 488 489 const container = document.createElement('div'); 490 container.className = 'list-reusable-blocks__container'; 491 button.parentNode.insertBefore(container, button); 492 Object(external_wp_element_["render"])(Object(external_wp_element_["createElement"])(import_dropdown, { 493 onUpload: showNotice 494 }), container); 495 }); 496 497 498 /***/ }), 499 500 /***/ "YLtl": 501 /***/ (function(module, exports) { 502 503 (function() { module.exports = window["lodash"]; }()); 504 505 /***/ }), 506 507 /***/ "l3Sj": 508 /***/ (function(module, exports) { 509 510 (function() { module.exports = window["wp"]["i18n"]; }()); 511 512 /***/ }), 513 514 /***/ "tI+e": 515 /***/ (function(module, exports) { 516 517 (function() { module.exports = window["wp"]["components"]; }()); 518 519 /***/ }), 520 521 /***/ "ywyh": 522 /***/ (function(module, exports) { 523 524 (function() { module.exports = window["wp"]["apiFetch"]; }()); 525 526 /***/ }) 527 528 /******/ });