@automattic/newspack-blocks 1.37.0 → 1.48.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 (292) hide show
  1. package/.cache/babel/00255e6096be9e31ec354db849dfefaa.json.gz +0 -0
  2. package/.cache/babel/0265bee20d709ac92f56456637727f4b.json.gz +0 -0
  3. package/.cache/babel/02986ba19dc461a152ea1c45f3f36a27.json.gz +0 -0
  4. package/.cache/babel/06a1700c1a4a989fc7886c86bf6223f7.json.gz +0 -0
  5. package/.cache/babel/07169c73863508b392f15022920bd0b6.json.gz +0 -0
  6. package/.cache/babel/0a5083e561829e3884cb5c71388adc3f.json.gz +0 -0
  7. package/.cache/babel/0a713997b6e4f45849ed6a4bff79cca5.json.gz +0 -0
  8. package/.cache/babel/0a9506bf649ffbe854e75459cf6b8972.json.gz +0 -0
  9. package/.cache/babel/0c12c4398bbbf2d771b13dd1d0e64097.json.gz +0 -0
  10. package/.cache/babel/0f8c18da204f4cc2777ca3191f10c309.json.gz +0 -0
  11. package/.cache/babel/0fced15ed787cc4239bb53c1d12892e6.json.gz +0 -0
  12. package/.cache/babel/10faf7c74a89e9aa4d8b9528a654913e.json.gz +0 -0
  13. package/.cache/babel/1353b411b65a123b5dc35012db11aa1d.json.gz +0 -0
  14. package/.cache/babel/1729336f326db1cf54b9c1671dc5e36c.json.gz +0 -0
  15. package/.cache/babel/17a433ab631a32d0712f3f75cf85ea99.json.gz +0 -0
  16. package/.cache/babel/1948e72d907f681ff771881ad6800ee1.json.gz +0 -0
  17. package/.cache/babel/1ab4bf44aa14d2eb7e6911900a3b2c12.json.gz +0 -0
  18. package/.cache/babel/1decfd137cac87a75bd83ffbd39c9106.json.gz +0 -0
  19. package/.cache/babel/2143ceff6d186bc13bc902e0f1f33dbf.json.gz +0 -0
  20. package/.cache/babel/23c63332718e167968a7c2a8a5f730eb.json.gz +0 -0
  21. package/.cache/babel/24bf53676e12293cbf88d01e649fd167.json.gz +0 -0
  22. package/.cache/babel/26ba0bb46844575022e54a8819fbf405.json.gz +0 -0
  23. package/.cache/babel/281ca171ce8947f87f574df11059e00b.json.gz +0 -0
  24. package/.cache/babel/28700b83434e4dbfb9a20d7ec0a7e7a4.json.gz +0 -0
  25. package/.cache/babel/29cf8eeea8630ade027e34459f2e49ee.json.gz +0 -0
  26. package/.cache/babel/2b0dd254a46223a93e6259d2b797a7e7.json.gz +0 -0
  27. package/.cache/babel/2da6786ede3ddda4c86eeac524a6a796.json.gz +0 -0
  28. package/.cache/babel/2e7ce10fdee94274b48d528f94c32b34.json.gz +0 -0
  29. package/.cache/babel/2f93fed1706a40d82122281cc3677074.json.gz +0 -0
  30. package/.cache/babel/3a59b710e9745ef93148d6d74ee7d16f.json.gz +0 -0
  31. package/.cache/babel/3b2c440027c793c8f7978d7622cbfca0.json.gz +0 -0
  32. package/.cache/babel/3ca939ace4af88e266942d93837ab37a.json.gz +0 -0
  33. package/.cache/babel/3e671670c4d395cd1804ef4be31955e4.json.gz +0 -0
  34. package/.cache/babel/3e69fe002d9973c0030152a51da9477a.json.gz +0 -0
  35. package/.cache/babel/3f5f8ea603fd57850c6683c750fe53d8.json.gz +0 -0
  36. package/.cache/babel/41abaaadb68b0657a95fa0c356873def.json.gz +0 -0
  37. package/.cache/babel/421ac952d6b472ba18e1cb95ef65f42a.json.gz +0 -0
  38. package/.cache/babel/424185dd50e91d8dee5fdae43086010e.json.gz +0 -0
  39. package/.cache/babel/427a6423ebde76bcb488747127e47351.json.gz +0 -0
  40. package/.cache/babel/43e800659f23430a181fb4fc328eb6ef.json.gz +0 -0
  41. package/.cache/babel/469651017a2b6f3b9f63fda034974b3a.json.gz +0 -0
  42. package/.cache/babel/480d26447b7ee019a37e4e18422403e9.json.gz +0 -0
  43. package/.cache/babel/4b58fad313d90a4c1577a2766e6c924c.json.gz +0 -0
  44. package/.cache/babel/4d2d42fea63650192d1a3a5648b621c5.json.gz +0 -0
  45. package/.cache/babel/4d8c26a76e77fa64d01f30a5f2d62f85.json.gz +0 -0
  46. package/.cache/babel/4f606ce6656565507a74aaac8dc21eea.json.gz +0 -0
  47. package/.cache/babel/505f37592f4c601ccdc1581ca89d9009.json.gz +0 -0
  48. package/.cache/babel/50aaf34aa54b2cd3058518e42850bb62.json.gz +0 -0
  49. package/.cache/babel/51fbf389462feb111228ba7ec64c631d.json.gz +0 -0
  50. package/.cache/babel/51fc90ae5fe129a095172032f304dc2c.json.gz +0 -0
  51. package/.cache/babel/53dbf5484c5601528c2fd8d7fe728b78.json.gz +0 -0
  52. package/.cache/babel/58e4535574062eb2d8fa56d002e7190d.json.gz +0 -0
  53. package/.cache/babel/5aa5e8d1492938c62999de022c4b220e.json.gz +0 -0
  54. package/.cache/babel/5d64e475284e52c104df17e26066b17b.json.gz +0 -0
  55. package/.cache/babel/6333c664d69f13036f42bcf575c8e65d.json.gz +0 -0
  56. package/.cache/babel/635c439786b8522888342779b28ee9ee.json.gz +0 -0
  57. package/.cache/babel/648cffdd5ec4a2446f8935a17b98080b.json.gz +0 -0
  58. package/.cache/babel/64b0dd478e6f2dd51de5ee20e311aee7.json.gz +0 -0
  59. package/.cache/babel/6531721abbc0b3906b28b268ed7914af.json.gz +0 -0
  60. package/.cache/babel/66bf5585c7901a76c7d4014fa9ffed40.json.gz +0 -0
  61. package/.cache/babel/6ef313cb6d3a59f73a6b78e1a729fb13.json.gz +0 -0
  62. package/.cache/babel/6f14eed506421f15710d3dfafe3dcd93.json.gz +0 -0
  63. package/.cache/babel/70f6c01d8c6bc3efc41c97eaf49f7617.json.gz +0 -0
  64. package/.cache/babel/72321dde68f0bb9c334d90d6f4584be8.json.gz +0 -0
  65. package/.cache/babel/76c815fab58595f57e01af6591791d57.json.gz +0 -0
  66. package/.cache/babel/7c10f4d554daa8efe1e0a4457fb6d27b.json.gz +0 -0
  67. package/.cache/babel/7dffccddd9780ab37fb79f809947c2cd.json.gz +0 -0
  68. package/.cache/babel/7e5162e3319cd5d6fca6c0db0516aaeb.json.gz +0 -0
  69. package/.cache/babel/803192c922f7d419648bab7e1201b22e.json.gz +0 -0
  70. package/.cache/babel/81f3f0f896d29cdf88f8543dedb77787.json.gz +0 -0
  71. package/.cache/babel/84c019d3d643195fb37d08110f15f8c9.json.gz +0 -0
  72. package/.cache/babel/853c31db7c4351f2f36d1021c667224d.json.gz +0 -0
  73. package/.cache/babel/88ec99735ea4f314937736f04360ff8c.json.gz +0 -0
  74. package/.cache/babel/8959ab8fcfa783cb56e9418b99c0951c.json.gz +0 -0
  75. package/.cache/babel/8b9624d721f8706682e33fe1853c8287.json.gz +0 -0
  76. package/.cache/babel/8de5c373bbc4b6fbeec373d582935887.json.gz +0 -0
  77. package/.cache/babel/8f24517cff634d2e91c19e51be8816cc.json.gz +0 -0
  78. package/.cache/babel/901e1bb823eca196b594baa35a35a81c.json.gz +0 -0
  79. package/.cache/babel/90dbc666ff9fa3b88f305fe90a9917bf.json.gz +0 -0
  80. package/.cache/babel/91b62dfd9475df7a39dc08fbd43847f9.json.gz +0 -0
  81. package/.cache/babel/956daf27323e3b87bf8bf9bbf58881ed.json.gz +0 -0
  82. package/.cache/babel/959e9b81103c539a9d85ac60955451b9.json.gz +0 -0
  83. package/.cache/babel/963b1e44be998c4dcc6845745c377369.json.gz +0 -0
  84. package/.cache/babel/966b41ac1317b3e03ca1e59f7eb57e8c.json.gz +0 -0
  85. package/.cache/babel/969d5992cc682e3b43761ef02c10b851.json.gz +0 -0
  86. package/.cache/babel/99df128bb528d0f95a56b311801d14c1.json.gz +0 -0
  87. package/.cache/babel/9b33e7d21f3fc4955a536a033cced71b.json.gz +0 -0
  88. package/.cache/babel/9c5ec84f77314a621c01ad77da7ccb58.json.gz +0 -0
  89. package/.cache/babel/9d325af12a88623602a5f8c2fce04847.json.gz +0 -0
  90. package/.cache/babel/a413e4d325543836d0800684bb26ed04.json.gz +0 -0
  91. package/.cache/babel/a5405f86b8d1485e62a125275507e60f.json.gz +0 -0
  92. package/.cache/babel/a7f7461321ca6fd4360df04bb894c106.json.gz +0 -0
  93. package/.cache/babel/a8a6812e1c7b65cc6d0bdebe2a35c8ca.json.gz +0 -0
  94. package/.cache/babel/aa89cfc4c88fcc465b8d74af824e7f6b.json.gz +0 -0
  95. package/.cache/babel/adbaeb5ddf5612b3dcd233a3f6f17bf2.json.gz +0 -0
  96. package/.cache/babel/ae18cd6ec42a3366c73435b62a9f5f70.json.gz +0 -0
  97. package/.cache/babel/aea149ee1ec6fa3ca7839c63f5edd78d.json.gz +0 -0
  98. package/.cache/babel/af1b34067a69854e109c0b0e45d90e43.json.gz +0 -0
  99. package/.cache/babel/b3a335ab950f502914013810b43b0ad5.json.gz +0 -0
  100. package/.cache/babel/b6cfba15cda3404d4b1041df448ed2b2.json.gz +0 -0
  101. package/.cache/babel/ba711530bd319618a0510d8361bebb45.json.gz +0 -0
  102. package/.cache/babel/ba77e682225df6126b636458055601d9.json.gz +0 -0
  103. package/.cache/babel/bab8189a74eee8d72702d1510b52b3b3.json.gz +0 -0
  104. package/.cache/babel/bd8741020db56bb5d999252812d1d717.json.gz +0 -0
  105. package/.cache/babel/beaa874c5e01203d9dbe23cb89405276.json.gz +0 -0
  106. package/.cache/babel/c196c9b8c21953c474acdaa9029b3cbf.json.gz +0 -0
  107. package/.cache/babel/c1e31e6c217023eb3d3fd5d3de486ac3.json.gz +0 -0
  108. package/.cache/babel/c3aa996443e7f377aa423bcc03ffc617.json.gz +0 -0
  109. package/.cache/babel/c481eae84d69b65405a44af442dbfea7.json.gz +0 -0
  110. package/.cache/babel/c4a817d6c4bf6eb3687ffccc5c2df801.json.gz +0 -0
  111. package/.cache/babel/c8b10cf6f706fb669d6dd7564385768d.json.gz +0 -0
  112. package/.cache/babel/caa2f98ba4af6eba0605543f690693c6.json.gz +0 -0
  113. package/.cache/babel/cada4b2cecb2c1fcc48b7a7ecda54907.json.gz +0 -0
  114. package/.cache/babel/d1bed5404789c427c32965ac6ecad0d9.json.gz +0 -0
  115. package/.cache/babel/d395e8c0a9c63680f2dcf90ca0e91d4a.json.gz +0 -0
  116. package/.cache/babel/d4672090e0dd9a73bfb00bd770b23643.json.gz +0 -0
  117. package/.cache/babel/d4c81f65fe6d78cdbdcf1ef901b7ba1b.json.gz +0 -0
  118. package/.cache/babel/d515ddc0797ea256ff7271507737e9ce.json.gz +0 -0
  119. package/.cache/babel/d742848d263503f79168f1a6b8a52097.json.gz +0 -0
  120. package/.cache/babel/d834b41d7028519ecd0cbc8c65d33dde.json.gz +0 -0
  121. package/.cache/babel/d9060b9162e7caf974db0b90b6134727.json.gz +0 -0
  122. package/.cache/babel/d946975b9beac51a39f600461e84b1b6.json.gz +0 -0
  123. package/.cache/babel/daf0af780cff2270b1ae0e4b97a5a4ab.json.gz +0 -0
  124. package/.cache/babel/db5215643b0737dc5245972a5c25f736.json.gz +0 -0
  125. package/.cache/babel/dd57b8d31664b147b9f1e3f5cd18cc2a.json.gz +0 -0
  126. package/.cache/babel/e0c78bdaae19f15e2dd4a773e842422b.json.gz +0 -0
  127. package/.cache/babel/e1a2c7e4fc3afe9cc6e03d60f4e4a23d.json.gz +0 -0
  128. package/.cache/babel/e210ff9aa99df972b8d81c4bda70f642.json.gz +0 -0
  129. package/.cache/babel/e259a73f84d5b92b94e6d094719264c3.json.gz +0 -0
  130. package/.cache/babel/e6ce03a9908c9c4dc2c723531f1073f6.json.gz +0 -0
  131. package/.cache/babel/e8a1501dd8e4b3389ecdc8f722622359.json.gz +0 -0
  132. package/.cache/babel/eb3bb371036da362c42db50248d0b180.json.gz +0 -0
  133. package/.cache/babel/eb854e03c810bdb969497b2a36119bfa.json.gz +0 -0
  134. package/.cache/babel/ec25bb53826070b7f301e64f02355b8c.json.gz +0 -0
  135. package/.cache/babel/edbaca20e4a65f850c3d8321c1945718.json.gz +0 -0
  136. package/.cache/babel/f059f1ca9e49d5c3e655d20339860dce.json.gz +0 -0
  137. package/.cache/babel/f24c559fb42ef906405966598baf5f80.json.gz +0 -0
  138. package/.cache/babel/f2f333c3c546ad711d722d782decd450.json.gz +0 -0
  139. package/.cache/babel/f42c854ce8f1dc1a6e6fe7c510b033a5.json.gz +0 -0
  140. package/.cache/babel/f5211608f22c2e12594eafdbc4e66aa5.json.gz +0 -0
  141. package/.cache/babel/f645b8c88a49718cd778e3595212d4eb.json.gz +0 -0
  142. package/.cache/babel/f66dda5c4e4e9d04eb6b7411fcb12a65.json.gz +0 -0
  143. package/.cache/babel/f9d5b6f3f5438342dba75c2ce6143eef.json.gz +0 -0
  144. package/.cache/babel/fc9c60ee1d2e8783ba4c08db5cf97d40.json.gz +0 -0
  145. package/.cache/babel/fd558798cea72d04fb826468a89d72aa.json.gz +0 -0
  146. package/.cache/babel/fe735cbd0f6e131e28d8b6eb1f39141b.json.gz +0 -0
  147. package/.eslintrc.js +3 -26
  148. package/.nvmrc +1 -0
  149. package/CHANGELOG.md +422 -0
  150. package/babel.config.js +6 -0
  151. package/block-list.json +1 -1
  152. package/composer.json +2 -2
  153. package/composer.lock +446 -161
  154. package/dist/author-list/view.asset.php +1 -0
  155. package/dist/author-list/view.css +1 -0
  156. package/dist/author-list/view.js +1 -0
  157. package/dist/author-list/view.rtl.css +1 -0
  158. package/dist/author-profile/view.asset.php +1 -0
  159. package/dist/author-profile/view.css +1 -0
  160. package/dist/author-profile/view.js +1 -0
  161. package/dist/author-profile/view.rtl.css +1 -0
  162. package/dist/block_styles.asset.php +1 -0
  163. package/dist/block_styles.css +1 -0
  164. package/dist/block_styles.js +1 -0
  165. package/dist/block_styles.rtl.css +1 -0
  166. package/dist/carousel/view.asset.php +1 -0
  167. package/dist/carousel/view.css +1 -0
  168. package/dist/carousel/view.js +1 -0
  169. package/dist/carousel/view.rtl.css +1 -0
  170. package/dist/donate/view.asset.php +1 -0
  171. package/dist/donate/view.css +1 -0
  172. package/dist/donate/view.js +1 -0
  173. package/dist/donate/view.rtl.css +1 -0
  174. package/dist/donateStreamlined.asset.php +1 -0
  175. package/dist/donateStreamlined.css +1 -0
  176. package/dist/donateStreamlined.js +1 -0
  177. package/dist/donateStreamlined.rtl.css +1 -0
  178. package/dist/editor.asset.php +1 -0
  179. package/dist/editor.css +1 -0
  180. package/dist/editor.js +41 -0
  181. package/dist/editor.rtl.css +1 -0
  182. package/dist/homepage-articles/view.asset.php +1 -0
  183. package/dist/homepage-articles/view.css +1 -0
  184. package/dist/homepage-articles/view.js +1 -0
  185. package/dist/homepage-articles/view.rtl.css +1 -0
  186. package/dist/iframe/view.asset.php +1 -0
  187. package/dist/iframe/view.css +1 -0
  188. package/dist/iframe/view.js +1 -0
  189. package/dist/iframe/view.rtl.css +1 -0
  190. package/includes/class-newspack-blocks-api.php +14 -69
  191. package/includes/class-newspack-blocks-patterns.php +4 -1
  192. package/includes/class-newspack-blocks.php +421 -95
  193. package/newspack-blocks.php +26 -2
  194. package/package.json +31 -129
  195. package/postcss.config.js +11 -0
  196. package/src/block-patterns/subscribe-2.php +1 -1
  197. package/src/block-patterns/subscribe-3.php +1 -1
  198. package/src/block-patterns/subscribe-7.php +12 -0
  199. package/src/block-patterns/subscribe-8.php +12 -0
  200. package/src/block-patterns/subscribe-9.php +12 -0
  201. package/src/block-styles/core/columns/editor.scss +5 -8
  202. package/src/block-styles/core/columns/view.scss +83 -42
  203. package/src/blocks/author-list/block.json +82 -0
  204. package/src/blocks/author-list/class-wp-rest-newspack-author-list-controller.php +387 -0
  205. package/src/blocks/author-list/edit.js +527 -0
  206. package/src/blocks/author-list/editor.js +7 -0
  207. package/src/blocks/author-list/editor.scss +1 -0
  208. package/src/blocks/author-list/index.js +45 -0
  209. package/src/blocks/author-list/view.js +5 -0
  210. package/src/blocks/author-list/view.php +175 -0
  211. package/src/blocks/author-list/view.scss +46 -0
  212. package/src/blocks/author-profile/block.json +8 -0
  213. package/src/blocks/author-profile/class-wp-rest-newspack-authors-controller.php +69 -14
  214. package/src/blocks/author-profile/edit.js +212 -189
  215. package/src/blocks/author-profile/editor.scss +1 -1
  216. package/src/blocks/author-profile/single-author.js +100 -0
  217. package/src/blocks/author-profile/view.php +38 -92
  218. package/src/blocks/author-profile/view.scss +120 -1
  219. package/src/blocks/carousel/create-swiper.js +14 -5
  220. package/src/blocks/carousel/edit.js +4 -2
  221. package/src/blocks/carousel/editor.scss +3 -12
  222. package/src/blocks/carousel/view.js +1 -1
  223. package/src/blocks/carousel/view.php +9 -5
  224. package/src/blocks/carousel/view.scss +29 -3
  225. package/src/blocks/donate/class-wp-rest-newspack-donate-controller.php +22 -24
  226. package/src/blocks/donate/edit.js +49 -42
  227. package/src/blocks/donate/editor.scss +27 -3
  228. package/src/blocks/donate/index.js +31 -4
  229. package/src/blocks/donate/streamlined/index.js +248 -0
  230. package/src/blocks/donate/streamlined/index.test.js +125 -0
  231. package/src/blocks/donate/streamlined/style.scss +324 -0
  232. package/src/blocks/donate/streamlined/utils.js +174 -0
  233. package/src/blocks/donate/streamlined/utils.test.js +18 -0
  234. package/src/blocks/donate/view.php +77 -36
  235. package/src/blocks/donate/view.scss +291 -0
  236. package/src/blocks/homepage-articles/block.json +8 -0
  237. package/src/blocks/homepage-articles/class-wp-rest-newspack-articles-controller.php +24 -78
  238. package/src/blocks/homepage-articles/edit.js +26 -0
  239. package/src/blocks/homepage-articles/store.js +11 -1
  240. package/src/blocks/homepage-articles/templates/article.php +31 -3
  241. package/src/blocks/homepage-articles/templates/articles-loop.php +6 -5
  242. package/src/blocks/homepage-articles/utils.js +11 -10
  243. package/src/blocks/homepage-articles/view.php +4 -1
  244. package/src/blocks/homepage-articles/view.scss +69 -24
  245. package/src/blocks/iframe/block.json +34 -0
  246. package/src/blocks/iframe/class-wp-rest-newspack-iframe-controller.php +345 -0
  247. package/src/blocks/iframe/edit.js +252 -0
  248. package/src/blocks/iframe/editor.js +7 -0
  249. package/src/blocks/iframe/editor.scss +84 -0
  250. package/src/blocks/iframe/icons.js +10 -0
  251. package/src/blocks/iframe/iframe-placeholder.js +180 -0
  252. package/src/blocks/iframe/index.js +48 -0
  253. package/src/blocks/iframe/view.js +5 -0
  254. package/src/blocks/iframe/view.php +130 -0
  255. package/src/blocks/iframe/view.scss +9 -0
  256. package/src/blocks/video-playlist/view.php +4 -3
  257. package/src/components/query-controls.js +5 -4
  258. package/src/setup/editor.js +0 -1
  259. package/src/shared/js/utils.js +1 -1
  260. package/src/templates/author-profile-card.php +99 -0
  261. package/vendor/autoload.php +7 -0
  262. package/vendor/composer/ClassLoader.php +572 -0
  263. package/vendor/composer/InstalledVersions.php +350 -0
  264. package/vendor/composer/LICENSE +21 -0
  265. package/vendor/composer/autoload_classmap.php +10 -0
  266. package/vendor/composer/autoload_namespaces.php +9 -0
  267. package/vendor/composer/autoload_psr4.php +9 -0
  268. package/vendor/composer/autoload_real.php +55 -0
  269. package/vendor/composer/autoload_static.php +20 -0
  270. package/vendor/composer/installed.json +5 -0
  271. package/vendor/composer/installed.php +23 -0
  272. package/webpack.config.js +2 -3
  273. package/.circleci/config.yml +0 -96
  274. package/.distignore +0 -36
  275. package/.editorconfig +0 -22
  276. package/.github/ISSUE_TEMPLATE/Bug_report.md +0 -21
  277. package/.github/ISSUE_TEMPLATE/Enhancement.md +0 -17
  278. package/.github/ISSUE_TEMPLATE/Feature_request.md +0 -17
  279. package/.github/PULL_REQUEST_TEMPLATE.md +0 -29
  280. package/.github/workflows/main.yml +0 -15
  281. package/.phpcs.xml.dist +0 -55
  282. package/.prettierrc +0 -10
  283. package/.stylelintrc +0 -21
  284. package/.travis.yml +0 -67
  285. package/phpunit.xml.dist +0 -16
  286. package/src/blocks/author-profile/shared.scss +0 -95
  287. package/src/blocks/donate/streamlined.js +0 -180
  288. package/src/blocks/donate/streamlined.scss +0 -124
  289. package/src/setup/public-path.js +0 -13
  290. package/src/setup/view.js +0 -4
  291. package/tests/bootstrap.php +0 -31
  292. package/tests/test-sample.php +0 -20
@@ -0,0 +1,175 @@
1
+ <?php
2
+ /**
3
+ * Server-side render functions for the Author List block.
4
+ *
5
+ * @package WordPress
6
+ */
7
+
8
+ /**
9
+ * Dynamic block registration.
10
+ */
11
+ function newspack_blocks_register_author_list() {
12
+ $block_json = json_decode(
13
+ file_get_contents( __DIR__ . '/block.json' ), // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
14
+ true
15
+ );
16
+
17
+ register_block_type(
18
+ 'newspack-blocks/' . $block_json['name'],
19
+ [
20
+ 'attributes' => $block_json['attributes'],
21
+ 'render_callback' => 'newspack_blocks_render_block_author_list',
22
+ ]
23
+ );
24
+ }
25
+
26
+ /**
27
+ * Block render callback.
28
+ *
29
+ * @param array $attributes Block attributes.
30
+ */
31
+ function newspack_blocks_render_block_author_list( $attributes ) {
32
+ if ( ! class_exists( 'WP_REST_Newspack_Author_List_Controller' ) ) {
33
+ return;
34
+ }
35
+
36
+ // Gather attributes.
37
+ $exclude_ids = array_map(
38
+ function( $exclusion ) {
39
+ return (int) $exclusion['value'];
40
+ },
41
+ $attributes['exclude']
42
+ );
43
+ $exclude_empty = $attributes['excludeEmpty'];
44
+ $author_roles = $attributes['authorRoles'];
45
+ $author_type = $attributes['authorType'];
46
+ $is_columns = 'columns' === $attributes['layout'];
47
+ $number_of_columns = $attributes['columns'];
48
+ $show_separators = $attributes['showSeparators'];
49
+ $separator_sections = $attributes['separatorSections'];
50
+ $avatar_hide_default = $attributes['avatarHideDefault'];
51
+ $params = [
52
+ 'author_type' => $author_type,
53
+ 'author_roles' => $author_roles,
54
+ 'exclude' => $exclude_ids, // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_exclude
55
+ 'fields' => [ 'id', 'name', 'bio', 'email', 'social', 'avatar', 'url' ],
56
+ ];
57
+
58
+ if ( $exclude_empty ) {
59
+ $params['exclude_empty'] = true;
60
+ }
61
+
62
+ if ( $avatar_hide_default ) {
63
+ $params['avatar_hide_default'] = true;
64
+ }
65
+
66
+ $author_list_controller = new WP_REST_Newspack_Author_List_Controller();
67
+ $authors = $author_list_controller->get_all_authors( $params );
68
+
69
+ $anchor_id = uniqid();
70
+
71
+ if ( empty( $authors ) ) {
72
+ return;
73
+ }
74
+
75
+ // Enqueue required front-end assets.
76
+ Newspack_Blocks::enqueue_view_assets( 'author-list' );
77
+ Newspack_Blocks::enqueue_view_assets( 'author-profile' );
78
+
79
+ // Class names for the list container.
80
+ $container_classes = [ 'newspack-blocks__author-list-container' ];
81
+ if ( $is_columns ) {
82
+ $container_classes[] = 'is-columns';
83
+ $container_classes[] = 'columns-' . (string) $number_of_columns;
84
+ }
85
+
86
+ ob_start();
87
+ ?>
88
+ <div class="wp-block-newspack-blocks-author-list <?php echo esc_attr( $attributes['className'] ); ?>">
89
+
90
+ <?php
91
+ // Columns WITH alphabetical separator sections.
92
+ if ( $is_columns && $show_separators && $separator_sections ) :
93
+ // Associative array to store authors chunked by alphabet, if separatorSections is true.
94
+ $chunked_authors = [];
95
+ foreach ( $authors as $author ) {
96
+ $first_letter = strtoupper( substr( $author['last_name'], 0, 1 ) );
97
+ if ( ! isset( $chunked_authors[ $first_letter ] ) ) {
98
+ $chunked_authors[ $first_letter ] = [];
99
+ }
100
+ $chunked_authors[ $first_letter ][] = $author;
101
+ }
102
+
103
+ foreach ( $chunked_authors as $separator_letter => $separator_authors ) :
104
+ ?>
105
+ <h2
106
+ class="newspack-blocks__author-list-separator"
107
+ id="newspack-blocks__author-list-separator__<?php echo esc_attr( $anchor_id ); ?>__<?php echo esc_attr( $separator_letter ); ?>"
108
+ >
109
+ <?php echo esc_html( $separator_letter ); ?>
110
+ </h2>
111
+ <ul class="<?php echo esc_attr( implode( ' ', $container_classes ) ); ?>">
112
+ <?php
113
+ foreach ( $separator_authors as $author ) :
114
+ $author_card = Newspack_Blocks::template_include(
115
+ 'author-profile-card',
116
+ [
117
+ 'attributes' => $attributes,
118
+ 'author' => $author,
119
+ ]
120
+ );
121
+ ?>
122
+ <li class="newspack-blocks__author-list-item">
123
+ <?php echo wp_kses_post( $author_card ); ?>
124
+ </li>
125
+ <?php endforeach; ?>
126
+ </ul>
127
+ <?php endforeach; ?>
128
+ <?php
129
+ // List view or columns without alphabetical separator sections.
130
+ else :
131
+ $separators = [];
132
+ ?>
133
+
134
+ <ul class="<?php echo esc_attr( implode( ' ', $container_classes ) ); ?>">
135
+ <?php
136
+ foreach ( $authors as $author ) :
137
+ $first_letter = strtoupper( substr( $author['last_name'], 0, 1 ) );
138
+ $show_separator = ! in_array( $first_letter, $separators, true );
139
+
140
+ if ( $show_separator ) {
141
+ $separators[] = $first_letter;
142
+ }
143
+
144
+ $author_card = Newspack_Blocks::template_include(
145
+ 'author-profile-card',
146
+ [
147
+ 'attributes' => $attributes,
148
+ 'author' => $author,
149
+ ]
150
+ );
151
+
152
+ if ( $show_separators && $show_separator ) :
153
+ ?>
154
+ <li class="newspack-blocks__author-list-item">
155
+ <h2
156
+ class="newspack-blocks__author-list-separator"
157
+ id="newspack-blocks__author-list-separator__<?php echo esc_attr( $anchor_id ); ?>__<?php echo esc_attr( $first_letter ); ?>"
158
+ >
159
+ <?php echo esc_html( $first_letter ); ?>
160
+ </h2>
161
+ </li>
162
+ <?php endif; ?>
163
+ <li class="newspack-blocks__author-list-item">
164
+ <?php echo wp_kses_post( $author_card ); ?>
165
+ </li>
166
+ <?php endforeach; ?>
167
+ </ul>
168
+ <?php endif; ?>
169
+ </div>
170
+ <?php
171
+
172
+ return ob_get_clean();
173
+ }
174
+
175
+ add_action( 'init', 'newspack_blocks_register_author_list' );
@@ -0,0 +1,46 @@
1
+ .wp-block-newspack-blocks-author-list {
2
+ .newspack-blocks__author-list-container {
3
+ list-style: none;
4
+ margin-left: 0;
5
+ margin-right: 0;
6
+ padding-left: 0;
7
+ padding-right: 0;
8
+
9
+ .newspack-blocks__author-list-item {
10
+ display: inline-block;
11
+ margin-bottom: 2.5rem;
12
+ width: 100%;
13
+ }
14
+ }
15
+
16
+ .is-columns {
17
+ column-width: auto;
18
+ page-break-inside: avoid;
19
+ break-inside: avoid;
20
+ }
21
+
22
+ .columns-2 {
23
+ column-count: 2;
24
+ }
25
+
26
+ .columns-3 {
27
+ column-count: 3;
28
+ }
29
+
30
+ .columns-4 {
31
+ column-count: 4;
32
+ }
33
+
34
+ .columns-5 {
35
+ column-count: 5;
36
+ }
37
+
38
+ .columns-6 {
39
+ column-count: 6;
40
+ }
41
+
42
+ h2.newspack-blocks__author-list-separator {
43
+ margin-bottom: 0;
44
+ margin-top: 0;
45
+ }
46
+ }
@@ -26,6 +26,10 @@
26
26
  "type": "boolean",
27
27
  "default": true
28
28
  },
29
+ "textSize": {
30
+ "type": "string",
31
+ "default": "medium"
32
+ },
29
33
  "showAvatar": {
30
34
  "type": "boolean",
31
35
  "default": true
@@ -41,6 +45,10 @@
41
45
  "avatarSize": {
42
46
  "type": "number",
43
47
  "default": 128
48
+ },
49
+ "avatarHideDefault": {
50
+ "type": "boolean",
51
+ "default": false
44
52
  }
45
53
  }
46
54
  }
@@ -66,11 +66,13 @@ class WP_REST_Newspack_Authors_Controller extends WP_REST_Controller {
66
66
  * @return WP_REST_Response
67
67
  */
68
68
  public function get_authors( $request ) {
69
- $author_id = ! empty( $request->get_param( 'author_id' ) ) ? $request->get_param( 'author_id' ) : 0; // Fetch a specific user or guest author by ID.
70
- $search = ! empty( $request->get_param( 'search' ) ) ? $request->get_param( 'search' ) : null; // Fetch authors by search string.
71
- $offset = ! empty( $request->get_param( 'offset' ) ) ? $request->get_param( 'offset' ) : 0; // Offset results (for pagination).
72
- $per_page = ! empty( $request->get_param( 'per_page' ) ) ? $request->get_param( 'per_page' ) : 10; // Number of results to return per page. This is applied to each query, so the actual number of results returned may be up to 2x this number.
73
- $fields = ! empty( $request->get_param( 'fields' ) ) ? explode( ',', $request->get_param( 'fields' ) ) : [ 'id' ]; // Fields to get. Will return at least id.
69
+ $author_id = ! empty( $request->get_param( 'authorId' ) ) ? $request->get_param( 'authorId' ) : 0; // Fetch a specific user or guest author by ID.
70
+ $search = ! empty( $request->get_param( 'search' ) ) ? $request->get_param( 'search' ) : null; // Fetch authors by search string.
71
+ $offset = ! empty( $request->get_param( 'offset' ) ) ? $request->get_param( 'offset' ) : 0; // Offset results (for pagination).
72
+ $per_page = ! empty( $request->get_param( 'perPage' ) ) ? $request->get_param( 'perPage' ) : 10; // Number of results to return per page. This is applied to each query, so the actual number of results returned may be up to 2x this number.
73
+ $avatar_hide_default = ! empty( $request->get_param( 'avatarHideDefault' ) ) ? true : false; // Hide the default avatar if the user has no custom avatar.
74
+ $fields = ! empty( $request->get_param( 'fields' ) ) ? explode( ',', $request->get_param( 'fields' ) ) : [ 'id' ]; // Fields to get. Will return at least id.
75
+ $include = ! empty( $request->get_param( 'include' ) ) ? explode( ',', $request->get_param( 'include' ) ) : null; // Fetch authors by multiple IDs.
74
76
 
75
77
  // Total number of users and guest authors.
76
78
  $guest_author_total = 0;
@@ -89,13 +91,33 @@ class WP_REST_Newspack_Authors_Controller extends WP_REST_Controller {
89
91
  if ( $author_id ) {
90
92
  $guest_author_args['p'] = $author_id;
91
93
  }
94
+ if ( $include ) {
95
+ $guest_author_args['post__in'] = $include;
96
+ $guest_author_args['ignore_sticky_posts'] = true;
97
+ }
92
98
 
93
- $guest_authors = new \WP_Query( $guest_author_args );
94
- $guest_author_total = $guest_authors->found_posts;
99
+ $guest_authors = get_posts( $guest_author_args );
100
+ $guest_author_total = count( $guest_authors );
101
+ $users = [];
95
102
 
96
- // Get standard WP users.
103
+ // If passed an author ID.
97
104
  if ( $author_id ) {
98
- $users = 0 === $guest_author_total ? [ get_user_by( 'id', $author_id ) ] : []; // If passed an author_id and we already found it as guest author, no need to run this query.
105
+ if ( 0 === $guest_author_total ) {
106
+ $user = get_user_by( 'id', $author_id ); // Get the WP user.
107
+
108
+ // We have a WP user, let's use it.
109
+ if ( $user ) {
110
+ // But wait, there's more! Let's see if this user is linked to a guest author.
111
+ $linked_guest_author = self::get_linked_guest_author( $user->user_login );
112
+
113
+ // If it is, let's use that instead.
114
+ if ( $linked_guest_author ) {
115
+ $guest_authors = [ $linked_guest_author ];
116
+ } else {
117
+ $users = [ $user ];
118
+ }
119
+ }
120
+ }
99
121
  } else {
100
122
  $user_args = [
101
123
  'role__in' => [ 'Administrator', 'Editor', 'Author', 'Contributor' ],
@@ -110,6 +132,11 @@ class WP_REST_Newspack_Authors_Controller extends WP_REST_Controller {
110
132
  $user_args['search'] = '*' . $search . '*';
111
133
  }
112
134
 
135
+ // If passed an array of IDs.
136
+ if ( $include ) {
137
+ $user_args['include'] = $include;
138
+ }
139
+
113
140
  $user_query = new \WP_User_Query( $user_args );
114
141
  $users = $user_query->get_results();
115
142
  $user_total = $user_query->get_total();
@@ -118,8 +145,8 @@ class WP_REST_Newspack_Authors_Controller extends WP_REST_Controller {
118
145
  // Format and combine results.
119
146
  $combined_authors = array_merge(
120
147
  array_reduce(
121
- ! empty( $guest_authors->posts ) ? $guest_authors->posts : [],
122
- function( $acc, $guest_author ) use ( $fields ) {
148
+ ! empty( $guest_authors ) ? $guest_authors : [],
149
+ function( $acc, $guest_author ) use ( $fields, $avatar_hide_default ) {
123
150
  if ( $guest_author ) {
124
151
  if ( class_exists( 'CoAuthors_Guest_Authors' ) ) {
125
152
  $guest_author_data = [
@@ -147,7 +174,11 @@ class WP_REST_Newspack_Authors_Controller extends WP_REST_Controller {
147
174
  }
148
175
  }
149
176
  if ( in_array( 'avatar', $fields, true ) && function_exists( 'coauthors_get_avatar' ) ) {
150
- $guest_author_data['avatar'] = coauthors_get_avatar( $guest_author, 256 );
177
+ $avatar = coauthors_get_avatar( $guest_author, 256 );
178
+
179
+ if ( $avatar && ( false === strpos( $avatar, 'avatar-default' ) || ! $avatar_hide_default ) ) {
180
+ $guest_author_data['avatar'] = $avatar;
181
+ }
151
182
  }
152
183
  if ( in_array( 'url', $fields, true ) ) {
153
184
  $guest_author_data['url'] = esc_urL(
@@ -167,7 +198,7 @@ class WP_REST_Newspack_Authors_Controller extends WP_REST_Controller {
167
198
  ),
168
199
  array_reduce(
169
200
  $users,
170
- function( $acc, $user ) use ( $fields ) {
201
+ function( $acc, $user ) use ( $fields, $avatar_hide_default ) {
171
202
  if ( $user ) {
172
203
  $user_data = [
173
204
  'id' => intval( $user->data->ID ),
@@ -192,7 +223,11 @@ class WP_REST_Newspack_Authors_Controller extends WP_REST_Controller {
192
223
  }
193
224
  }
194
225
  if ( in_array( 'avatar', $fields, true ) ) {
195
- $user_data['avatar'] = get_avatar( $user->data->ID, 256 );
226
+ $avatar = get_avatar( $user->data->ID, 256 );
227
+
228
+ if ( $avatar && ( false === strpos( $avatar, 'avatar-default' ) || ! $avatar_hide_default ) ) {
229
+ $user_data['avatar'] = $avatar;
230
+ }
196
231
  }
197
232
  if ( in_array( 'url', $fields, true ) ) {
198
233
  $user_data['url'] = esc_urL( get_author_posts_url( $user->data->ID ) );
@@ -223,6 +258,26 @@ class WP_REST_Newspack_Authors_Controller extends WP_REST_Controller {
223
258
  return rest_ensure_response( $response );
224
259
  }
225
260
 
261
+ /**
262
+ * Given a WP user login, get the linked guest author, if any.
263
+ *
264
+ * @param string $user_login WP user login name.
265
+ *
266
+ * @return WP_Post|boolean Linked guest author in post form, or false if none.
267
+ */
268
+ public static function get_linked_guest_author( $user_login ) {
269
+ $linked_guest_authors = get_posts(
270
+ [
271
+ 'post_type' => 'guest-author',
272
+ 'posts_per_page' => 1,
273
+ 'meta_key' => 'cap-linked_account', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
274
+ 'meta_value' => $user_login, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
275
+ ]
276
+ );
277
+
278
+ return 0 < count( $linked_guest_authors ) ? reset( $linked_guest_authors ) : false;
279
+ }
280
+
226
281
  /**
227
282
  * Get author email address and SVG icon, if available.
228
283
  *