1$(function () { 2 require(['jquery', 'mockup-patterns-select2'], function ($) { 3 var decode_json = function (str) { 4 return $('<div />').html(str).text(); 5 }; 6 7 var $blog_nav = $('li.portaltab-blog'); 8 var blog_url = $blog_nav.find('> a').attr('href').replace(/\/?$/, '/'); 9 10 $.ajax({ 11 url: blog_url + 'wp-json/wp/v2/categories?_jsonp=?', 12 cache: true, 13 dataType: 'jsonp', 14 jsonpCallback : '_render_blog_submenu' 15 }).done( 16 function (data) { 17 var $nav_link, $submenu, category, i; 18 if (data.length) { 19 $submenu = $('<ul class=submenu></ul>').appendTo($blog_nav); 20 } 21 for (i = 0; i < data.length; i++) { 22 category = data[i]; 23 $nav_link = $('<a></a>').attr('href', category.link) 24 .attr('title', decode_json(category.description)) 25 .html(decode_json(category.name)); 26 $('<li></li>').append($nav_link).appendTo($submenu); 27 } 28 } 29 ); 30 31 // Enable blog specific category and tag selection 32 var setup_blog_portlet_form = function () { 33 var auto_reset = true; 34 var $category_input = $('input#form-widgets-blog_category'); 35 var $tag_input = $('input#form-widgets-blog_tag'); 36 var $blog_url_input = $('input#form-widgets-blog_url'); 37 var blog_cat = $category_input.val(); 38 var blog_tag = $tag_input.val(); 39 var blog_url = $blog_url_input.val(); 40 var update_select = function (blog_url) { 41 var api_url = blog_url.replace(/\/?$/, '/') + 'wp-json/wp/v2/categories'; 42 // We can't use select2 AJAX unless API has CORS Access-Control-Allow-Origin 43 $.ajax({ 44 url: api_url + '?_jsonp=?', 45 cache: true, 46 dataType: 'jsonp', 47 jsonpCallback : '_render_blog_category_filter' 48 }).done( 49 function (data) { 50 var results = [{ id: '', text: 'All Categories' }]; 51 var i; 52 for (i = 0; i < data.length; i++){ 53 results.push({id: data[i].id, text: data[i].name}); 54 } 55 $category_input.select2({ 56 data: results, 57 placeholder: 'Select an optional category' 58 }) 59 } 60 ); 61 }; 62 var update_tags = function(blog_url) { 63 var api_url = blog_url.replace(/\/?$/, '/'); 64 api_url += 'wp-json/wp/v2/tags?_jsonp=?&search='; 65 $tag_input.select2({ 66 minimumInputLength: 3, 67 ajax: { 68 cache: true, 69 dataType: 'jsonp', 70 crossDomain: true, 71 jsonpCallback: '_render_blog_tag_filter', 72 quietMillis: 1000, 73 url: function (params) { 74 return api_url + params; 75 }, 76 results: function (data) { 77 data.unshift({ id: '', name: 'All Tags'}); 78 return { 79 results: data.map(el => ({id: el.id, text: el.name}) ) 80 } 81 }, 82 }, 83 initSelection: function(el, callback) { 84 var initid = $(el).val(); 85 if (initid !== '') { 86 var api_tag_url = blog_url.replace(/\/?$/, '/'); 87 api_tag_url += 'wp-json/wp/v2/tags/' + initid + '?_jsonp=?'; 88 $.ajax( 89 api_tag_url, 90 { 91 cache: true, 92 dataType: 'jsonp', 93 jsonpCallback: '_render_tag_name' 94 } 95 ).done( data => callback({id: data.id, text: data.name}) ); 96 } 97 }, 98 placeholder: 'Select an optional tag' 99 }); 100 101 }; 102 if (blog_url) { 103 update_select(blog_url); 104 update_tags(blog_url); 105 } else { 106 $category_input.select2({placeholder: 'Select an optional category', data: [{id: blog_cat, text: blog_cat}]}); 107 $tag_input.select2({placeholder: 'Select an optional tag', data: [{id: blog_tag, text: blog_tag}]}); 108 } 109 110 $('input#form-widgets-blog_url').on('blur', function () { 111 var blog_url = $('input#form-widgets-blog_url').val(); 112 if (blog_url) { 113 update_select(blog_url); 114 update_tags(blog_url); 115 } 116 }); 117 $category_input.on('change', function () { 118 if (auto_reset) { 119 auto_reset = false;
120 $tag_input.val(null).trigger('change'); 121 } else { 122 auto_reset = true; 123 } 124 }); 125 $tag_input.on('change', function () { 126 if (auto_reset) { 127 auto_reset = false; 128 $category_input.val(null).trigger('change'); 129 } else { 130 auto_reset = true; 131 } 132 }); 133 }; 134 setup_blog_portlet_form(); 135 $('body').on('shown.plone-modal.patterns', setup_blog_portlet_form); 136 var insert_post_image = function ($container, post) { 137 var image_url; 138 var caption; 139 var embedded = post._embedded['wp:featuredmedia']; 140 if (embedded && embedded.length) { 141 image_url = embedded[0].media_details.sizes.thumbnail.source_url; 142 caption = embedded[0].caption.rendered; 143 } 144 if (!image_url) { 145 image_url = 'https://ncascades.org/++theme++ncascades/images/icons/chattermarks.svg'; 146 } 147 if (!caption) { 148 caption = post.title.rendered; 149 } 150 $container.append($('<img />').attr('src', image_url) 151 .attr('alt', decode_json(caption))); 152 } 153 // Render blog portlet 154 $('.wp-blog-portlet').each(function (i, e) { 155 var $portlet = $(e); 156 var blog_url = $portlet.find('a.wp-blog-link').attr('href'); 157 if (!blog_url) { 158 return; 159 } 160 var $holder = $portlet.find('.articles'); 161 var count = $holder.data('count'); 162 var category = $holder.data('category'); 163 var tag = $holder.data('tag'); 164 var images = $holder.data('images'); 165 var api_url = blog_url.replace(/\/?$/, '/') + 'wp-json/wp/v2/posts'; 166 api_url = api_url + '?per_page=' + count; 167 if (category) { 168 api_url = api_url + '&categories=' + category; 169 } else if (tag) { 170 api_url = api_url + '&tags=' + tag; 171 } 172 $.ajax({url: api_url + '&_embed=1&_jsonp=?', 173 cache: true, 174 dataType: 'jsonp', 175 jsonpCallback : '_fetch_blog_posts' 176 }).done(function (data) { 177 for (var i=0; i < data.length; i++) { 178 var post = data[i]; 179 var date = new Date(post.date); 180 var $elem = $('<article></article>').appendTo($holder); 181 if (images) { 182 var $image_holder = $('<a></a>').attr('href', post.link).appendTo( 183 $('<div class="blog-post-image"></div>').appendTo($elem)); 184 insert_post_image($image_holder, post); 185 } 186 var $article_holder = $('<div class="article-body"></div>').appendTo($elem); 187 var $title_link = $('<a></a>').attr('href', post.link) 188 .attr('title', decode_json(post.excerpt.rendered)) 189 .text(decode_json(post.title.rendered)); 190 $article_holder.append($('<h3></h3>').append($title_link)); 191 $article_holder.append($('<div class="date"></div>').text(date.toLocaleDateString('en-US', {month: 'short', day: 'numeric', year: 'numeric'}))); 192 } 193 }) 194 }); 195 }); 196});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.