• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar

Sweet Family Table

  • Home
  • Recipe Index
  • Budget
  • Cheat Meal
  • Healthy
  • Keto
  • Quick
  • Vegan
  • About
  • Contact

Sweet Family Table

  • Home
  • Recipe Index
  • Budget
  • Cheat Meal
  • Healthy
  • Keto
  • Quick
  • Vegan
  • About
  • Contact

Pumpkin Protein Balls (No-Bake)

Jump to Recipe·Print Recipe

If you’re looking for a delightful and nutritious snack that’s perfect for fall, you’ve found it in these Pumpkin Protein Balls (No-Bake). These little energy bites are not only delicious but also packed with quality protein to keep you fueled throughout your busy days. They make a fantastic treat for family gatherings or simply to enjoy during a cozy evening at home.

Pumpkin Protein Balls (No-Bake) image 2

What I love most about these pumpkin protein balls is how easy they are to whip up! In just about half an hour, you can have a batch ready to go. Plus, they’re a hit with both kids and adults, making them a versatile choice for any occasion.

Pumpkin Protein Balls (No-Bake) image 3
Pumpkin Protein Balls (No-Bake) image 4

Why You’ll Love This Recipe

  • Quick and Easy: With only 20 minutes of prep time, these protein balls come together in no time!
  • Make-Ahead Convenience: They store well in the fridge or freezer, perfect for meal prepping or snacking on the go.
  • Nutritious Boost: Each ball delivers 5 grams of protein, making them a satisfying option that curbs cravings.
  • Family-Friendly Flavor: The cozy pumpkin spice flavor is loved by all ages—perfect for sharing!
  • Customizable Options: Adjust the ingredients to suit your taste and dietary needs.

Ingredients You’ll Need

These pumpkin protein balls are made with simple, wholesome ingredients that you probably already have in your pantry. Enjoy the rich flavors of pumpkin and spices combined with nutritious oats and almond butter!

For the Base

  • 2 ½ cups old-fashioned rolled oats
  • ½ cup Puori PW1 Vanilla Protein Powder (40 g)
  • ¼ cup unsweetened shredded coconut
  • ¼ cup ground flaxseed (flax meal)
  • 2 teaspoons pumpkin pie spice
  • ½ teaspoon ground cinnamon
  • Pinch of fine salt

For the Flavor

  • ½ cup creamy almond butter (use sunflower seed butter for nut free)
  • â…“ cup canned pumpkin puree
  • 3 tablespoons pure maple syrup
  • 1 tablespoon coconut oil, melted
  • 1 teaspoon pure vanilla extract

For the Crunch

  • â…“ cup mini chocolate chips (semi-sweet, milk, dark, or dairy-free)
  • 3 tablespoons roasted pumpkin seeds, roughly chopped

Variations

The beauty of this recipe lies in its flexibility! Feel free to experiment with different ingredients to make these protein balls your own.

  • Swap the protein: Use your favorite plant-based or whey protein powder instead of vanilla.
  • Change up the nut butter: Almond butter can be replaced with peanut butter or sunflower seed butter for different tastes.
  • Add some spice: Amp up the flavor by adding extra spices like nutmeg or ginger.
  • Mix in dried fruit: Throw in some chopped dried cranberries or raisins for added sweetness and texture.

How to Make Pumpkin Protein Balls (No-Bake)

Step 1: Combine the Dry Ingredients

In a medium bowl, combine the oats, protein powder, shredded coconut, ground flaxseed, pumpkin pie spice, cinnamon, and salt. Stir everything together until well mixed. This step is crucial as it ensures that all those lovely flavors blend harmoniously.

Step 2: Mix in the Wet Ingredients

Now it’s time to add the creamy goodness! Add in the almond butter, canned pumpkin puree, maple syrup, melted coconut oil, vanilla extract, chocolate chips, and roasted pumpkin seeds. Stir until everything is thoroughly combined; this mixture should be sticky enough to form into balls easily.

Step 3: Chill Out

Chill the mixture in the refrigerator for about 10-20 minutes. Chilling helps it firm up a bit so you can roll it into perfect little bites without making a mess.

Step 4: Roll Into Balls

Once chilled, take small portions of the mixture and roll them into 20-25 balls using your hands. This is where you can get creative—if you’d like them larger or smaller, adjust accordingly!

Step 5: Store for Enjoyment

Store your delicious pumpkin protein balls in an airtight container in the refrigerator for up to two weeks. You can also freeze them for up to three months—just grab one whenever you need a quick snack!

Pro Tips for Making Pumpkin Protein Balls (No-Bake)

Making these pumpkin protein balls is a breeze, but here are some tips to ensure they turn out perfect every time!

  • Chill the Mixture: Letting the mixture chill for 10-20 minutes makes it easier to roll into balls and helps them hold their shape better.

  • Use Fresh Ingredients: Ensure your spices and protein powder are fresh for the best flavor and nutritional benefits. Stale ingredients can dull the taste of your delicious treats.

  • Adjust Sweetness: If you prefer a sweeter treat, feel free to add an extra tablespoon of maple syrup. Just remember to adjust the dry ingredients slightly to maintain the right consistency.

  • Experiment with Add-ins: Don’t hesitate to get creative! Adding chopped nuts, dried fruits, or seeds can give your protein balls a unique twist while boosting their nutritional value.

  • Store Properly: For optimal freshness, store your pumpkin protein balls in an airtight container in the refrigerator. They also freeze well, perfect for meal prep!

How to Serve Pumpkin Protein Balls (No-Bake)

These pumpkin protein balls make a delightful snack or a healthy treat for any occasion. Here are some fun ideas on how to present them!

Garnishes

  • Cocoa Powder Dusting: A light dusting of cocoa powder adds visual appeal and a rich chocolatey flavor that pairs wonderfully with pumpkin.
  • Shredded Coconut: Sprinkle some unsweetened shredded coconut on top for a tropical touch and added texture.

Side Dishes

  • Fresh Fruit Salad: A refreshing mix of seasonal fruits like apples and pears complements the sweet pumpkin flavor while adding natural sweetness.
  • Yogurt Parfait: Layer these protein balls with yogurt and granola for a nutritious breakfast or snack option that’s both filling and satisfying.
  • Nut Butter Dip: Serve with a side of almond or sunflower seed butter for an extra protein boost; it also makes an excellent dipping sauce!
  • Vegetable Sticks: Crunchy veggie sticks like carrots, celery, or bell peppers provide a nice contrast in texture and make for a wholesome pairing.

Make Ahead and Storage

These Pumpkin Protein Balls (No-Bake) are perfect for meal prep, making them a convenient snack option to have on hand. You can easily prepare a batch ahead of time and store them for later enjoyment.

Storing Leftovers

  • Store the protein balls in an airtight container.
  • Keep them in the refrigerator for up to 2 weeks.

Freezing

  • Place the protein balls in a single layer on a baking sheet and freeze until solid.
  • Transfer to a freezer-safe container or bag and freeze for up to 3 months.

Reheating

  • These protein balls are best enjoyed cold or at room temperature.
  • If desired, you can let them sit at room temperature for about 10 minutes before serving.

FAQs

Here are some common questions about making Pumpkin Protein Balls (No-Bake).

Can I use a different protein powder for these Pumpkin Protein Balls (No-Bake)?

Yes! Feel free to substitute your favorite plant-based or whey protein powder. Adjust the sweetness as needed based on the protein powder you choose.

How can I make these Pumpkin Protein Balls (No-Bake) nut-free?

To make these delicious energy balls nut-free, simply replace almond butter with sunflower seed butter. This keeps the recipe safe for those with nut allergies.

Can I add other ingredients to my Pumpkin Protein Balls (No-Bake)?

Absolutely! You can mix in extras like dried fruits, seeds, or different types of chocolate chips to customize your energy balls.

Final Thoughts

I hope you enjoy making these delightful Pumpkin Protein Balls (No-Bake)! They’re not only a fantastic source of protein but also capture the comforting essence of fall in every bite. Whether you’re looking for a quick snack or a nutritious boost, these little bites will surely brighten your day. Enjoy sharing them with family and friends!

Print

Pumpkin Protein Balls (No-Bake)

Print Recipe

5 Stars 4 Stars 3 Stars 2 Stars 1 Star

No reviews

If you’re looking for a nutritious and delicious snack that embodies the cozy flavors of fall, these Pumpkin Protein Balls (No-Bake) are your perfect solution. These easy-to-make energy bites are brimming with wholesome ingredients like oats, almond butter, and pumpkin puree, making them an ideal treat for busy days, family gatherings, or cozy evenings at home. In just about 30 minutes, you can whip up a batch that delivers a satisfying protein boost while curbing cravings. Plus, they’re versatile enough to please kids and adults alike. Customize them with your favorite add-ins for a personalized touch!

  • Author: Mennana
  • Prep Time: 20 minutes
  • Cook Time: 0 minutes
  • Total Time: 20 minutes
  • Yield: Approximately 20 servings 1x
  • Category: Snack
  • Method: No-Bake
  • Cuisine: American

Ingredients


Scale

  • 2 ½ cups old-fashioned rolled oats
  • ½ cup Puori PW1 Vanilla Protein Powder
  • ½ cup creamy almond butter (or sunflower seed butter)
  • â…“ cup canned pumpkin puree
  • 3 tablespoons pure maple syrup
  • ¼ cup shredded coconut
  • 2 teaspoons pumpkin pie spice
  • ½ teaspoon ground cinnamon
  • Pinch of fine salt
  • 1 tablespoon coconut oil, melted
  • â…“ cup mini chocolate chips (semi-sweet, milk, dark, or dairy-free)
  • 3 tablespoons roasted pumpkin seeds, roughly chopped

Instructions

  1. In a bowl, mix the oats, protein powder, shredded coconut, flaxseed, spices, and salt.
  2. Add almond butter, pumpkin puree, maple syrup, melted coconut oil, chocolate chips, and pumpkin seeds. Stir until combined.
  3. Chill the mixture in the fridge for 10-20 minutes.
  4. Roll into 20-25 bite-sized balls.
  5. Store in an airtight container in the fridge for up to two weeks or freeze for three months.

Nutrition

  • Serving Size: 1 ball
  • Calories: 120
  • Sugar: 4g
  • Sodium: 30mg
  • Fat: 5g
  • Saturated Fat: 1g
  • Unsaturated Fat: 4g
  • Trans Fat: 0g
  • Carbohydrates: 17g
  • Fiber: 3g
  • Protein: 5g
  • Cholesterol: 0mg

Did you make this recipe?

Share a photo and tag us — we can’t wait to see what you’ve made!

window.trCommon={“minRating”:6,”ajaxurl”:”https:\/\/www.sweetfamilytable.com\/wp-admin\/admin-ajax.php”,”ratingNonce”:”d6ce51a79d”,”postId”:4242};
window.TastyRecipes = window.TastyRecipes || {};

window.TastyRecipes.smoothScroll = {
init() {
document.addEventListener( ‘click’, ( e ) => {
let anchor = e.target;
if ( anchor.tagName !== ‘A’ ) {
anchor = anchor.closest( ‘a.tasty-recipes-scrollto’ );
}

if ( ! anchor || ! anchor.classList.contains( ‘tasty-recipes-scrollto’ ) ) {
return;
}

const elementHref = anchor.getAttribute( ‘href’ );
if ( ! elementHref ) {
return;
}

e.preventDefault();
this.goToSelector( elementHref );
});
},
goToSelector( selector ) {
const element = document.querySelector( selector );
if ( ! element ) {
return;
}
element.scrollIntoView( { behavior: ‘smooth’ } );
}
};

document.addEventListener(
‘DOMContentLoaded’,
() => window.TastyRecipes.smoothScroll.init()
);

(function(){

var bothEquals = function( d1, d2, D ) {
var ret = 0;
if (d1<=D) {
ret++;
}
if (d2<=D) {
ret++;
}
return ret === 2;
};

var frac =function frac(x,D,mixed){var n1=Math.floor(x),d1=1;var n2=n1+1,d2=1;if(x!==n1){while(bothEquals(d1,d2,D)){var m=(n1+n2)/(d1+d2);if(x===m){if(d1+d2d2){d2=D+1;}else {d1=D+1;}break}else if(xD){d1=d2;n1=n2}if(!mixed){return[0,n1,d1];}var q=Math.floor(n1/d1);return[q,n1-q*d1,d1]};frac.cont=function cont(x,D,mixed){var sgn=x<0?-1:1;var B=x*sgn;var P_2=0,P_1=1,P=0;var Q_2=1,Q_1=0,Q=0;var A=Math.floor(B);while(Q_1<D){A=Math.floor(B);P=A*P_1+P_2;Q=A*Q_1+Q_2;if(B-AD){if(Q_1>D){Q=Q_2;P=P_2}else{Q=Q_1;P=P_1}}if(!mixed){return[0,sgn*P,Q];}var q=Math.floor(sgn*P/Q);return[q,sgn*P-q*Q,Q]};

window.tastyRecipesVulgarFractions = JSON.parse(decodeURIComponent(“%7B%22%C2%BC%22%3A%221%2F4%22%2C%22%C2%BD%22%3A%221%2F2%22%2C%22%C2%BE%22%3A%223%2F4%22%2C%22%E2%85%93%22%3A%221%2F3%22%2C%22%E2%85%94%22%3A%222%2F3%22%2C%22%E2%85%95%22%3A%221%2F5%22%2C%22%E2%85%96%22%3A%222%2F5%22%2C%22%E2%85%97%22%3A%223%2F5%22%2C%22%E2%85%98%22%3A%224%2F5%22%2C%22%E2%85%99%22%3A%221%2F6%22%2C%22%E2%85%9A%22%3A%225%2F6%22%2C%22%E2%85%9B%22%3A%221%2F8%22%2C%22%E2%85%9C%22%3A%223%2F8%22%2C%22%E2%85%9D%22%3A%225%2F8%22%2C%22%E2%85%9E%22%3A%227%2F8%22%7D”));

window.tastyRecipesFormatAmount = function(amount, el) {
if ( parseFloat( amount ) === parseInt( amount ) ) {
return amount;
}
var roundType = ‘frac’;
if (typeof el.dataset.amountShouldRound !== ‘undefined’) {
if (‘false’ !== el.dataset.amountShouldRound) {
if ( ‘number’ === el.dataset.amountShouldRound ) {
roundType = ‘number’;
} else if (‘frac’ === el.dataset.amountShouldRound) {
roundType = ‘frac’;
} else if (‘vulgar’ === el.dataset.amountShouldRound) {
roundType = ‘vulgar’;
} else {
roundType = ‘integer’;
}
}
}
if (‘number’ === roundType) {
amount = Number.parseFloat(amount).toPrecision(2);
} else if (‘integer’ === roundType) {
amount = Math.round(amount);
} else if (‘frac’ === roundType || ‘vulgar’ === roundType) {
var denom = 8;
if (typeof el.dataset.unit !== ‘undefined’) {
var unit = el.dataset.unit;
if ([‘cups’,’cup’,’c’].includes(unit)) {
denom = 4;
if (0.125 === amount) {
denom = 8;
}
if (“0.1667″ === Number.parseFloat( amount ).toPrecision(4)) {
denom = 6;
}
}
if ([‘tablespoons’,’tablespoon’,’tbsp’].includes(unit)) {
denom = 2;
}
if ([‘teaspoons’,’teaspoon’,’tsp’].includes(unit)) {
denom = 8;
}
}
var amountArray = frac.cont( amount, denom, true );
var newAmount = ”;
if ( amountArray[1] !== 0 ) {
newAmount = amountArray[1] + ‘/’ + amountArray[2];
if (‘vulgar’ === roundType) {
Object.keys(window.tastyRecipesVulgarFractions).forEach(function(vulgar) {
if (newAmount === window.tastyRecipesVulgarFractions[vulgar]) {
newAmount = vulgar;
}
});
}
}
if ( newAmount ) {
newAmount = ‘ ‘ + newAmount;
}
if ( amountArray[0] ) {
newAmount = amountArray[0] + newAmount;
}
amount = newAmount;
}
return amount;
};

window.tastyRecipesUpdatePrintLink = () => {

const printButton = document.querySelector( ‘.tasty-recipes-print-button’ );

if ( ! printButton ) {
return;
}

const printURL = new URL( printButton.href );
const searchParams = new URLSearchParams( printURL.search );

const unitButton = document.querySelector( ‘.tasty-recipes-convert-button-active’ );
const scaleButton = document.querySelector( ‘.tasty-recipes-scale-button-active’ );

let unit = ”;
let scale = ”;

if ( unitButton ) {
unit = unitButton.dataset.unitType;
searchParams.delete(‘unit’);
searchParams.set( ‘unit’, unit );
}

if ( scaleButton ) {
scale = scaleButton.dataset.amount;
searchParams.set( ‘scale’, scale );
}

const paramString = searchParams.toString();
const newURL = ” === paramString ? printURL.href : printURL.origin + printURL.pathname + ‘?’ + paramString;
const printLinks = document.querySelectorAll( ‘.tasty-recipes-print-link’ );

printLinks.forEach( ( el ) => {
el.href = newURL;
});

const printButtons = document.querySelectorAll( ‘.tasty-recipes-print-button’ );
printButtons.forEach( ( el ) => {
el.href = newURL;
});
};

document.addEventListener( ‘DOMContentLoaded’, () => {

if ( ! window.location.href.includes( ‘/print/’ ) ) {
return;
}

const searchParams = new URLSearchParams( window.location.search );

const unit = searchParams.get( ‘unit’ );
const scale = searchParams.get( ‘scale’ );

if ( unit && ( ‘metric’ === unit || ‘usc’ === unit ) ) {
document.querySelector( ‘.tasty-recipes-convert-button[data-unit-type=”‘ + unit + ‘”]’ ).click();
}

if ( scale && Number(scale) > 0 ) {
document.querySelector( ‘.tasty-recipes-scale-button[data-amount=”‘ + Number(scale) + ‘”]’ ).click();
}
});
}());

(function(){
var buttonClass = ‘tasty-recipes-scale-button’,
buttonActiveClass = ‘tasty-recipes-scale-button-active’,
buttons = document.querySelectorAll(‘.tasty-recipes-scale-button’);
if ( ! buttons ) {
return;
}

buttons.forEach(function(button){
button.addEventListener(‘click’, function(event){
event.preventDefault();
var recipe = event.target.closest(‘.tasty-recipes’);
if ( ! recipe ) {
return;
}
var otherButtons = recipe.querySelectorAll(‘.’ + buttonClass);
otherButtons.forEach(function(bt){
bt.classList.remove(buttonActiveClass);
});
button.classList.add(buttonActiveClass);

var scalables = recipe.querySelectorAll(‘span[data-amount]’);
var buttonAmount = parseFloat( button.dataset.amount );
scalables.forEach(function(scalable){
if (typeof scalable.dataset.amountOriginalType === ‘undefined’
&& typeof scalable.dataset.nfOriginal === ‘undefined’) {
if (-1 !== scalable.innerText.indexOf(‘/’)) {
scalable.dataset.amountOriginalType = ‘frac’;
}
if (-1 !== scalable.innerText.indexOf(‘.’)) {
scalable.dataset.amountOriginalType = ‘number’;
}
Object.keys(window.tastyRecipesVulgarFractions).forEach(function(vulgar) {
if (-1 !== scalable.innerText.indexOf(vulgar)) {
scalable.dataset.amountOriginalType = ‘vulgar’;
}
});
if (typeof scalable.dataset.amountOriginalType !== ‘undefined’) {
scalable.dataset.amountShouldRound = scalable.dataset.amountOriginalType;
}
}
var amount = parseFloat( scalable.dataset.amount ) * buttonAmount;
amount = window.tastyRecipesFormatAmount(amount, scalable);
if ( typeof scalable.dataset.unit !== ‘undefined’ ) {
if ( ! scalable.classList.contains(‘nutrifox-quantity’) ) {
if ( ! scalable.classList.contains(‘nutrifox-second-quantity’) ) {
amount += ‘ ‘ + scalable.dataset.unit;
}
}
}
scalable.innerText = amount;
});

var nonNumerics = recipe.querySelectorAll(‘[data-has-non-numeric-amount]’);
nonNumerics.forEach(function(nonNumeric){
var indicator = nonNumeric.querySelector(‘span[data-non-numeric-label]’);
if ( indicator ) {
nonNumeric.removeChild(indicator);
}
if ( 1 !== buttonAmount ) {
indicator = document.createElement(‘span’);
indicator.setAttribute(‘data-non-numeric-label’, true);
var text = document.createTextNode(‘ (x’ + buttonAmount + ‘)’);
indicator.appendChild(text);
nonNumeric.appendChild(indicator);
}
});

window.tastyRecipesUpdatePrintLink();
});
});
}());

window.TastyRecipes = window.TastyRecipes || {};
window.TastyRecipes.cookMode = {
wakeLockApi: false,
wakeLock: false,
cookModeSelector: ‘.tasty-recipes-cook-mode’,
init() {
if (“wakeLock” in navigator && “request” in navigator.wakeLock) {
this.wakeLockApi = navigator.wakeLock;
}

const cookModes = document.querySelectorAll(this.cookModeSelector);

if (cookModes.length > 0) {
for (const cookMode of cookModes) {
if (this.wakeLockApi) {
cookMode.querySelector(‘input[type=”checkbox”]’).addEventListener(“change”, event => {
this.checkboxChange(event.target);
}, false);
} else {
cookMode.style.display = “none”;
}
}
}
},
checkboxChange(checkbox) {
if (checkbox.checked) {
this.lock();
} else {
this.unlock();
}
},
setCheckboxesState(state) {
const checkboxes = document.querySelectorAll(this.cookModeSelector + ‘ input[type=”checkbox”]’);
for (const checkbox of checkboxes) {
checkbox.checked = state;
}
},
async lock() {
try {
this.wakeLock = await this.wakeLockApi.request(“screen”);
this.wakeLock.addEventListener(“release”, () => {
this.wakeLock = false;
this.setCheckboxesState(false);
});
this.setCheckboxesState(true);
} catch (error) {
this.setCheckboxesState(false);
}
},
unlock() {
if (this.wakeLock) {
this.wakeLock.release();
this.wakeLock = false;
}
this.setCheckboxesState(false);
}
};

(function(callback) {
if (document.readyState !== “loading”) {
callback();
} else {
document.addEventListener(“DOMContentLoaded”, callback);
}
})(() => {
window.TastyRecipes.cookMode.init();
});

window.TastyRecipes = window.TastyRecipes || {};

window.TastyRecipes.staticTooltip = {
element: null,
tooltipElement: null,
deleting: false,
init( element ) {
if ( this.deleting ) {
return;
}
this.element = element;
this.buildElements();
},
destroy() {
if ( ! this.tooltipElement || this.deleting ) {
return;
}

this.deleting = true;
this.tooltipElement.classList.remove( ‘opened’ );

setTimeout( () => {
this.tooltipElement.remove();
this.deleting = false;
}, 500 );
},
buildElements() {
const tooltipElement = document.createElement( ‘div’ );
tooltipElement.classList.add( ‘tasty-recipes-static-tooltip’);
tooltipElement.setAttribute( ‘id’, ‘tasty-recipes-tooltip’ );

const currentTooltipElement = document.getElementById( ‘tasty-recipes-tooltip’ );
if ( currentTooltipElement ) {
document.body.replaceChild( tooltipElement, currentTooltipElement );
} else {
document.body.appendChild( tooltipElement );
}

this.tooltipElement = document.getElementById( ‘tasty-recipes-tooltip’ );
},
show() {
if ( ! this.tooltipElement ) {
return;
}

const tooltipTop = this.element.getBoundingClientRect().top
+ window.scrollY
– 10 // 10px offset.
– this.tooltipElement.getBoundingClientRect().height;
const tooltipLeft = this.element.getBoundingClientRect().left
– ( this.tooltipElement.getBoundingClientRect().width / 2 )
+ ( this.element.getBoundingClientRect().width / 2 ) – 1;
const posLeft = Math.max( 10, tooltipLeft );
this.maybeRemoveTail( posLeft !== tooltipLeft );

this.tooltipElement.setAttribute( ‘style’, ‘top:’ + tooltipTop + ‘px;left:’ + posLeft + ‘px;’ );
this.tooltipElement.classList.add( ‘opened’ );

},
maybeRemoveTail( removeTail ) {
if ( removeTail ) {
this.tooltipElement.classList.add( ‘tr-hide-tail’ );
} else {
this.tooltipElement.classList.remove( ‘tr-hide-tail’ );
}
},
changeMessage( message ) {
if ( ! this.tooltipElement ) {
return;
}
this.tooltipElement.innerHTML = message;
}
};

window.TastyRecipes.ajax = {
sendPostRequest( url, data, success, failure ) {
const xhr = new XMLHttpRequest();
xhr.open( ‘POST’, url, true );
xhr.send( this.preparePostData( data ) );

xhr.onreadystatechange = () => {
if ( 4 !== xhr.readyState ) {
return;
}
if ( xhr.status === 200 ) {
success( JSON.parse( xhr.responseText ) );
return;
}

failure( xhr );
};

xhr.onerror = () => {
failure( xhr );
};
},
preparePostData( data ) {
const formData = new FormData();

for ( const key in data ) {
formData.append( key, data[key] );
}
return formData;
},
};

window.TastyRecipes.ratings = {
defaultRating: 0,
currentRatingPercentage: 100,
savingRating: false,
init( minRating ) {
this.minRating = minRating;

this.formWatchRating();
this.closeTooltipWhenClickOutside();
this.addBodyClassBasedOnSelectedRating();
this.backwardCompFormRatingPosition();
},
formWatchRating() {
const ratings = document.querySelectorAll(‘.tasty-recipes-no-ratings-buttons [data-rating]’);
if ( ratings.length {
event.preventDefault();
this.defaultRating = event.target.closest( ‘.checked’ ).dataset.rating;
this.setCheckedStar( event.target );
this.maybeSendRating( this.defaultRating, event.target );
this.setRatingInForm( this.defaultRating );
} );
}
},
closeTooltipWhenClickOutside() {
window.addEventListener( ‘click’, e => {
// Bailout (don’t remove the tooltip) when the clicked element is a rating star, or it’s the tooltip itself.
if ( e.target.closest( ‘.tasty-recipes-rating’ ) || e.target.classList.contains( ‘tasty-recipes-static-tooltip’ ) ) {
return;
}

window.TastyRecipes.staticTooltip.destroy();
} );
},
setRatingInForm( rating ) {
const ratingInput = document.querySelector( ‘#respond .tasty-recipes-rating[value=”‘ + rating + ‘”]’ );
if ( ! ratingInput ) {
return;
}
ratingInput.click();
},
addBodyClassBasedOnSelectedRating() {
const ratingInputs = document.querySelectorAll( ‘input.tasty-recipes-rating’ );
if ( ! ratingInputs ) {
return;
}
for ( const ratingInput of ratingInputs ) {
ratingInput.addEventListener( ‘click’, currentEvent => {
const selectedRating = currentEvent.target.getAttribute( ‘value’ );
this.handleBodyClassByRating( selectedRating );
this.toggleCommentTextareaRequired( selectedRating );
} );
}
},
handleBodyClassByRating( rating ) {
if ( rating < this.minRating ) {
document.body.classList.remove( 'tasty-recipes-selected-minimum-rating' );
return;
}
document.body.classList.add( 'tasty-recipes-selected-minimum-rating' );
},
toggleCommentTextareaRequired( rating ) {
const commentTextarea = document.getElementById( 'comment' );
if ( ! commentTextarea ) {
return;
}

if ( rating {
window.TastyRecipes.staticTooltip.changeMessage( response.data.message );
window.TastyRecipes.staticTooltip.show();
this.updateAverageText( response.data, recipeCardElement );
this.maybeFillCommentForm( response.data );

// Hide the tooltip after 5 seconds.
setTimeout( () => {
this.maybeResetTooltip( recipeCardElement, response.data, rating );
}, 5000 );
},
() => {
this.resetTooltip( recipeCardElement );
}
);
},
updateAverageText( data, recipeCardElement ) {
if ( ! data.average ) {
return;
}
this.setRatingPercent( data );

if ( ! data.count ) {
return;
}

const quickLink = document.querySelector( ‘.tasty-recipes-rating-link’ );
if ( quickLink ) {
this.setTextInContainer( quickLink, data );
this.setPartialStar( quickLink );
}

const cardStars = recipeCardElement.querySelector( ‘.tasty-recipes-ratings-buttons’ );
cardStars.dataset.trDefaultRating = data.average;
this.setTextInContainer( recipeCardElement.querySelector( ‘.tasty-recipes-rating’ ), data );
},
setTextInContainer( container, data ) {
if ( ! container ) {
return;
}

if ( data.label ) {
const ratingLabelElement = container.querySelector( ‘.rating-label’ );
if ( ratingLabelElement ) {
ratingLabelElement.innerHTML = data.label;
}
return;
}

const averageElement = container.querySelector( ‘.average’ );
if ( averageElement ) {
averageElement.textContent = data.average;
}

const countElement = container.querySelector( ‘.count’ );
if ( countElement ) {
countElement.textContent = data.count;
}
},
setPartialStar( container ) {
const highestStar = container.querySelector( ‘[data-rating=”‘ + Math.ceil( this.defaultRating ) + ‘”]’ );
if ( highestStar ) {
highestStar.dataset.trClip = this.currentRatingPercentage;
}
},
setRatingPercent( data ) {
this.defaultRating = data.average.toFixed( 1 );
const parts = data.average.toFixed( 2 ).toString().split( ‘.’ );
this.currentRatingPercentage = parts[1] ? parts[1] : 100;
if ( this.currentRatingPercentage === ’00’ ) {
this.currentRatingPercentage = 100;
}
},
setCheckedStar( target ) {
const cardRatingContainer = target.closest( ‘.tasty-recipes-ratings-buttons’ );
const selectedRatingElement = cardRatingContainer.querySelector( ‘[data-tr-checked]’ );
if ( selectedRatingElement ) {
delete selectedRatingElement.dataset.trChecked;
}

const thisStar = target.closest( ‘.tasty-recipes-rating’ );
thisStar.dataset.trChecked = 1;
thisStar.querySelector( ‘[data-tr-clip]’ ).dataset.trClip = 100;
},
maybeFillCommentForm( data ) {
if ( ! data.comment || ! data.comment.content ) {
return;
}

const commentForm = document.querySelector( ‘#commentform’ );
if ( ! commentForm ) {
return;
}

const commentBox = commentForm.querySelector( ‘[name=comment]’ );
if ( ! commentBox || commentBox.value ) {
return;
}

// Add comment details for editing.
commentBox.innerHTML = data.comment.content;
if ( data.comment.name ) {
commentForm.querySelector( ‘[name=author]’ ).value = data.comment.name;
commentForm.querySelector( ‘[name=email]’ ).value = data.comment.email;
}
},
maybeResetTooltip( recipeCardElement, data, rating ) {
if ( this.savingRating === rating ) {
this.resetTooltip( recipeCardElement, data );
}
},
resetTooltip( recipeCardElement, data ) {
window.TastyRecipes.staticTooltip.destroy();
this.savingRating = false;

// Reset the default rating.
const cardRatingContainer = recipeCardElement.querySelector( ‘.tasty-recipes-ratings-buttons’ );
if ( cardRatingContainer ) {
this.defaultRating = ( data && data.average ) ? data.average.toFixed(1) : cardRatingContainer.dataset.trDefaultRating;
cardRatingContainer.dataset.trDefaultRating = this.defaultRating;

this.resetSelectedStar( cardRatingContainer, data );
}
},
resetSelectedStar( cardRatingContainer ) {
const selectedRatingElement = cardRatingContainer.querySelector( ‘[data-rating=”‘ + Math.ceil( this.defaultRating ) + ‘”]’ );
if ( selectedRatingElement ) {
selectedRatingElement.querySelector( ‘[data-tr-clip]’ ).dataset.trClip = this.currentRatingPercentage;
selectedRatingElement.parentNode.dataset.trChecked = 1;
}

const previousSelectedElement= cardRatingContainer.querySelector( ‘[data-tr-checked]’ );
if ( previousSelectedElement ) {
const currentSelectedRating = previousSelectedElement.querySelector(‘[data-rating]’);
if ( currentSelectedRating !== selectedRatingElement ) {
delete previousSelectedElement.dataset.trChecked;
}
}
},
backwardCompFormRatingPosition() {
const ratingsButtons = document.querySelector( ‘#respond .tasty-recipes-ratings-buttons, #tasty-recipes-comment-rating .tasty-recipes-ratings-buttons’ );
if ( ! ratingsButtons ) {
return;
}
const ratingsButtonsStyles = window.getComputedStyle(ratingsButtons);
if ( ! ratingsButtonsStyles.display.includes( ‘flex’ ) ) {
ratingsButtons.style.direction = ‘rtl’;
}

if ( typeof tastyRecipesRating !== ‘undefined’ ) {
// Select the rating that was previously selected in admin.
ratingsButtons.querySelector( ‘.tasty-recipes-rating[value=”‘ + tastyRecipesRating + ‘”]’ ).checked = true;
}

const ratingSpans = ratingsButtons.querySelectorAll( ‘.tasty-recipes-rating’ );
for (const ratingSpan of ratingSpans) {
ratingSpan.addEventListener( ‘click’, event => {
if ( ratingSpan === event.target ) {
return;
}
ratingSpan.previousElementSibling.click();
} );
}
}
};

(function(callback) {
if (document.readyState !== “loading”) {
callback();
} else {
window.addEventListener( ‘load’, callback );
}
})(() => {
window.TastyRecipes.ratings.init( window.trCommon ? window.trCommon.minRating : 4 );
});

« Previous Post
Spicy Korean Ramen with Grilled Beef & Creamy Sauce
Next Post »
Grilled Veggie & Mozzarella Sandwiches

If you enjoyed this…

Watermelon Salad With Strawberries & Honey Lime Dressing

Watermelon Salad With Strawberries & Honey Lime Dressing

Coconut Water Lemonade

Coconut Water Lemonade

Chili-Lime Quinoa Black Bean Salad with Corn

Chili-Lime Quinoa Black Bean Salad with Corn

Primary Sidebar

Browse by Diet

HealthyBudgetKetoQuickVeganCheat Meal
Street Corn Chicken Rice Bowl

Street Corn Chicken Rice Bowl

Grilled Veggie & Mozzarella Sandwiches

Grilled Veggie & Mozzarella Sandwiches

Pumpkin Protein Balls (No-Bake)

Pumpkin Protein Balls (No-Bake)

  • About
  • Contact
  • Disclaimer
  • Homepage
  • PRIVACY POLICY
  • Recipe Index
  • TERMS AND CONDITIONS

© 2026 Sweet Family Table · All Rights Reserved · Created with love by Lalla Mennana · About · Privacy Policy · Terms & Conditions · Disclaimer · Affiliate Disclosure · Contact