From de0a1027054d5c3dd151a6e03335ba322931c6dd Mon Sep 17 00:00:00 2001 From: djanelle-mit Date: Wed, 9 Sep 2026 15:29:11 -0400 Subject: [PATCH 1/4] First draft select a featured librarian --- .../featured-and-events-section/block.json | 4 ++ .../featured-and-events-section/edit.js | 37 ++++++++++++- .../featured-and-events-section/render.php | 53 +++++++++++++++++-- .../mitlib-blocks/build/blocks-manifest.php | 4 ++ .../featured-and-events-section/block.json | 4 ++ .../index.asset.php | 2 +- .../featured-and-events-section/index.js | 2 +- .../featured-and-events-section/render.php | 53 +++++++++++++++++-- web/app/plugins/mitlib-blocks/package.json | 2 + 9 files changed, 149 insertions(+), 12 deletions(-) diff --git a/web/app/plugins/mitlib-blocks/blocks/featured-and-events-section/block.json b/web/app/plugins/mitlib-blocks/blocks/featured-and-events-section/block.json index 6911fa56..1c4de72e 100644 --- a/web/app/plugins/mitlib-blocks/blocks/featured-and-events-section/block.json +++ b/web/app/plugins/mitlib-blocks/blocks/featured-and-events-section/block.json @@ -12,6 +12,10 @@ "heading": { "type": "string", "default": "Featured" + }, + "featuredExpertId": { + "type": "number", + "default": 0 } }, "supports": { diff --git a/web/app/plugins/mitlib-blocks/blocks/featured-and-events-section/edit.js b/web/app/plugins/mitlib-blocks/blocks/featured-and-events-section/edit.js index 63db88f0..b731d6a3 100644 --- a/web/app/plugins/mitlib-blocks/blocks/featured-and-events-section/edit.js +++ b/web/app/plugins/mitlib-blocks/blocks/featured-and-events-section/edit.js @@ -4,14 +4,47 @@ * @see https://developer.wordpress.org/block-editor/reference-guides/packages/packages-i18n/ */ import { __ } from '@wordpress/i18n'; -import { useBlockProps, RichText } from '@wordpress/block-editor'; +import { useBlockProps, RichText, InspectorControls } from '@wordpress/block-editor'; +import { PanelBody, SelectControl, Spinner } from '@wordpress/components'; +import { useSelect } from '@wordpress/data'; +import { store as coreStore } from '@wordpress/core-data'; import './editor.scss'; export default function Edit( { attributes, setAttributes } ) { - const { heading } = attributes; + const { heading, featuredExpertId } = attributes; + + const { experts, hasResolvedExperts } = useSelect( ( select ) => { + const query = { per_page: -1, status: 'publish', orderby: 'title', order: 'asc' }; + return { + experts: select( coreStore ).getEntityRecords( 'postType', 'experts', query ), + hasResolvedExperts: select( coreStore ).hasFinishedResolution( 'getEntityRecords', [ 'postType', 'experts', query ] ), + }; + }, [] ); + + const expertOptions = [ + { label: __( 'Select a librarian…', 'mitlib-blocks' ), value: 0 }, + ...( experts || [] ).map( ( expert ) => ( { + label: expert.title.rendered, + value: expert.id, + } ) ), + ]; return (
+ + + { hasResolvedExperts ? ( + setAttributes( { featuredExpertId: Number( value ) } ) } + /> + ) : ( + + ) } + + post_type && 'publish' === $maybe_expert->post_status ) { + $featured_expert = $maybe_expert; + } +} + +// Fallback used when no librarian has been selected in the block editor. +$default_expert = array( + 'name' => 'Alejandro Paz', + 'first_name' => 'Alejandro', + 'url' => 'https://libguides.mit.edu/profiles/apaz', + 'image' => 'https://libapps.s3.amazonaws.com/accounts/349/images/apaz-100x100.jpg', + 'excerpt' => 'Librarian for Energy and Environment', +); ?>
diff --git a/web/app/plugins/mitlib-blocks/build/featured-and-events-section/index.asset.php b/web/app/plugins/mitlib-blocks/build/featured-and-events-section/index.asset.php index 46bbd824..bb409504 100644 --- a/web/app/plugins/mitlib-blocks/build/featured-and-events-section/index.asset.php +++ b/web/app/plugins/mitlib-blocks/build/featured-and-events-section/index.asset.php @@ -1 +1 @@ - array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-i18n'), 'version' => '5535245262429d5d7ae1'); + array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-i18n'), 'version' => '08aea560c65be378d62e'); diff --git a/web/app/plugins/mitlib-blocks/build/featured-and-events-section/index.js b/web/app/plugins/mitlib-blocks/build/featured-and-events-section/index.js index 515375ab..8e01b976 100644 --- a/web/app/plugins/mitlib-blocks/build/featured-and-events-section/index.js +++ b/web/app/plugins/mitlib-blocks/build/featured-and-events-section/index.js @@ -1 +1 @@ -(()=>{"use strict";var e={839(){const e=window.wp.blocks,t=window.wp.i18n,r=window.wp.blockEditor,o=window.wp.components,s=window.wp.data,n=window.wp.coreData,i=window.ReactJSXRuntime,l=JSON.parse('{"UU":"mitlib/featured-and-events-section"}');(0,e.registerBlockType)(l.UU,{edit:function({attributes:e,setAttributes:l}){const{heading:a,featuredExpertId:c}=e,{experts:d,hasResolvedExperts:p}=(0,s.useSelect)(e=>{const t={per_page:-1,status:"publish",orderby:"title",order:"asc"};return{experts:e(n.store).getEntityRecords("postType","experts",t),hasResolvedExperts:e(n.store).hasFinishedResolution("getEntityRecords",["postType","experts",t])}},[]),u=[{label:(0,t.__)("Select a librarian…","mitlib-blocks"),value:0},...(d||[]).map(e=>({label:e.title.rendered,value:e.id}))];return(0,i.jsxs)("div",{...(0,r.useBlockProps)(),children:[(0,i.jsx)(r.InspectorControls,{children:(0,i.jsx)(o.PanelBody,{title:(0,t.__)("Featured Librarian","mitlib-blocks"),children:p?(0,i.jsx)(o.SelectControl,{label:(0,t.__)("Featured librarian","mitlib-blocks"),value:c,options:u,onChange:e=>l({featuredExpertId:Number(e)})}):(0,i.jsx)(o.Spinner,{})})}),(0,i.jsx)(r.RichText,{tagName:"h2",value:a,onChange:e=>l({heading:e}),placeholder:(0,t.__)("Featured","mitlib-blocks"),allowedFormats:[]})]})},save:function(){return null}})}};const t={};function r(o){const s=t[o];if(void 0!==s)return s.exports;const n=t[o]={exports:{}};return e[o](n,n.exports,r),n.exports}r.m=e,(()=>{const e=[];r.O=(t,o,s,n)=>{if(o){n||=0;for(var i=e.length;i>0&&e[i-1][2]>n;i--)e[i]=e[i-1];return void(e[i]=[o,s,n])}let l=1/0;for(i=0;i=n)||!Object.keys(r.O).every(e=>r.O[e](o[a]))?(c=!1,nObject.hasOwn(e,t),(()=>{const e={226:0,238:0};r.O.j=t=>0===e[t];const t=(t,o)=>{let[s,n,i]=o;var l,a,c=0;if(s.some(t=>0!==e[t])){for(l in n)r.o(n,l)&&(r.m[l]=n[l]);if(i)var d=i(r)}for(t&&t(o);cr(839));o=r.O(o)})(); \ No newline at end of file +(()=>{"use strict";var e={839(){const e=window.wp.blocks,t=window.wp.i18n,o=window.wp.blockEditor,r=window.wp.components,s=window.wp.data,n=window.wp.coreData,i=window.ReactJSXRuntime,l=JSON.parse('{"UU":"mitlib/featured-and-events-section"}');(0,e.registerBlockType)(l.UU,{edit:function({attributes:e,setAttributes:l}){const{heading:a,featuredExpertId:c}=e,{experts:d,hasResolvedExperts:p}=(0,s.useSelect)(e=>{const t={per_page:-1,status:"publish",orderby:"title",order:"asc"};return{experts:e(n.store).getEntityRecords("postType","experts",t),hasResolvedExperts:e(n.store).hasFinishedResolution("getEntityRecords",["postType","experts",t])}},[]),u=[{label:(0,t.__)("Select an expert…","mitlib-blocks"),value:0},...(d||[]).map(e=>({label:e.title.rendered,value:e.id}))];return(0,i.jsxs)("div",{...(0,o.useBlockProps)(),children:[(0,i.jsx)(o.InspectorControls,{children:(0,i.jsx)(r.PanelBody,{title:(0,t.__)("Featured Expert","mitlib-blocks"),children:p?(0,i.jsx)(r.SelectControl,{label:(0,t.__)("Featured expert","mitlib-blocks"),value:c,options:u,onChange:e=>l({featuredExpertId:Number(e)})}):(0,i.jsx)(r.Spinner,{})})}),(0,i.jsx)(o.RichText,{tagName:"h2",value:a,onChange:e=>l({heading:e}),placeholder:(0,t.__)("Featured","mitlib-blocks"),allowedFormats:[]})]})},save:function(){return null}})}};const t={};function o(r){const s=t[r];if(void 0!==s)return s.exports;const n=t[r]={exports:{}};return e[r](n,n.exports,o),n.exports}o.m=e,(()=>{const e=[];o.O=(t,r,s,n)=>{if(r){n||=0;for(var i=e.length;i>0&&e[i-1][2]>n;i--)e[i]=e[i-1];return void(e[i]=[r,s,n])}let l=1/0;for(i=0;i=n)||!Object.keys(o.O).every(e=>o.O[e](r[a]))?(c=!1,nObject.hasOwn(e,t),(()=>{const e={226:0,238:0};o.O.j=t=>0===e[t];const t=(t,r)=>{let[s,n,i]=r;var l,a,c=0;if(s.some(t=>0!==e[t])){for(l in n)o.o(n,l)&&(o.m[l]=n[l]);if(i)var d=i(o)}for(t&&t(r);co(839));r=o.O(r)})(); \ No newline at end of file diff --git a/web/app/plugins/mitlib-blocks/build/featured-and-events-section/render.php b/web/app/plugins/mitlib-blocks/build/featured-and-events-section/render.php index d60ca367..f54e7e24 100644 --- a/web/app/plugins/mitlib-blocks/build/featured-and-events-section/render.php +++ b/web/app/plugins/mitlib-blocks/build/featured-and-events-section/render.php @@ -9,7 +9,7 @@ // Look up the librarian chosen in the block editor's "Featured Librarian" panel. $featured_expert = null; -$featured_expert_id = ! empty( $attributes['featuredExpertId'] ) ? absint( $attributes['featuredExpertId'] ) : 0; +$featured_expert_id = absint( $attributes['featuredExpertId'] ?? 0 ); if ( $featured_expert_id ) { $maybe_expert = get_post( $featured_expert_id ); if ( $maybe_expert && 'experts' === $maybe_expert->post_type && 'publish' === $maybe_expert->post_status ) { @@ -25,6 +25,25 @@ 'image' => 'https://libapps.s3.amazonaws.com/accounts/349/images/apaz-100x100.jpg', 'excerpt' => 'Librarian for Energy and Environment', ); + +// If we have a valid expert, use those values. If not, use the fallback values. +if ( $featured_expert ) { + $expert_name = get_the_title( $featured_expert ); + $expert_first_name = strtok( $expert_name, ' ' ); + $expert_url = get_post_meta( $featured_expert->ID, 'expert_url', true ); + $expert_image = get_the_post_thumbnail_url( $featured_expert, 'thumbnail' ); + $expert_excerpt = get_the_excerpt( $featured_expert ); +} else { + $expert_name = $default_expert['name']; + $expert_first_name = $default_expert['first_name']; + $expert_url = $default_expert['url']; + $expert_image = $default_expert['image']; + $expert_excerpt = $default_expert['excerpt']; +} + +// Generate the string for the "How can NAME help you?" link text. +$expert_help_link_text = "How can " . $expert_first_name . " help you?"; + ?>