If you’re looking for a comforting dish that brings smiles around the dinner table, look no further than this Healthy Baked Mac and Cheese. It’s a delightful twist on the classic recipe that so many of us adore. What makes this version special is its creamy goodness without the guilt! With wholesome ingredients, it’s the perfect meal for busy weeknights or family gatherings. Plus, you can easily customize it to suit everyone’s tastes!

This Healthy Baked Mac and Cheese not only satisfies those cheesy cravings but is also packed with nutrition. It’s truly a dish that will warm your heart and nourish your body.

Why You’ll Love This Recipe
- Easy to Prepare: This recipe comes together quickly, making it a breeze for anyone to whip up after a long day.
- Family-Friendly Appeal: Everyone loves mac and cheese! This healthier version keeps all the flavor while being lighter on calories.
- Customizable: Feel free to add your favorite veggies or proteins to tailor it to your family’s preferences.
- Make-Ahead Convenience: You can prep this dish ahead of time and simply bake it before serving—perfect for meal prepping!
- Delicious Flavor: The blend of cheeses and spices creates a rich, satisfying flavor that you won’t be able to resist.
Ingredients You’ll Need
For this Healthy Baked Mac and Cheese, you’ll need simple and wholesome ingredients that are easy to find at any grocery store. Here’s what you’ll need:

For the Pasta
- 8 oz whole wheat elbow macaroni (or high-protein pasta)
For the Sauce
- 1 ½ cups low-fat milk (or unsweetened almond milk)
- 1 tbsp all-purpose flour (or whole wheat flour)
- ¾ cup plain Greek yogurt (nonfat or low-fat)
- 1 ½ cups shredded sharp cheddar cheese
- ½ cup shredded part-skim mozzarella cheese
- 1 tsp Dijon mustard
- ½ tsp garlic powder
- ½ tsp onion powder
- ¼ tsp salt (adjust to taste)
- ¼ tsp black pepper
- 1 cup steamed cauliflower puree (to blend into the sauce)
For the Topping
- ⅓ cup whole wheat breadcrumbs (or crushed almonds)
- 1 tbsp olive oil or melted butter (for mixing into the topping)
Optional Add-Ins
- Steamed broccoli, spinach, peas, or cooked chicken
Variations
One of the best things about this recipe is how flexible it is! You can easily swap out ingredients or add extras based on what you have at home or what your family enjoys.
- Add More Veggies: Toss in some steamed broccoli or spinach for an extra nutrient boost.
- Try Different Cheeses: Experiment with different types of cheese like gouda or pepper jack for a unique flavor twist.
- Swap the Protein: Add cooked chicken or turkey for a heartier meal!
- Make it Spicy: If you’re feeling adventurous, sprinkle in some crushed red pepper flakes for a bit of heat.
How to Make Healthy Baked Mac and Cheese
Step 1: Preheat Your Oven
Preheat your oven to 375°F (190°C). This step is crucial because it ensures your mac and cheese bakes evenly and gets that lovely golden top we all love!
Step 2: Cook the Pasta
Cook the pasta according to package instructions until al dente. Drain and set aside. Cooking it just right is important since it’ll continue cooking in the oven later!
Step 3: Make the Roux
In a medium saucepan over medium heat, whisk together flour and milk until smooth and slightly thickened—about 3–4 minutes. This mixture forms the base of our creamy sauce.
Step 4: Add Cheese & Seasonings
Reduce heat to low and stir in Greek yogurt, cheddar, mozzarella, Dijon mustard, garlic powder, onion powder, salt, and pepper. Mix until everything is melted together. If using cauliflower puree, now’s the time to stir it in! This adds creaminess while sneaking in some veggies.
Step 5: Combine with Pasta
Pour that delicious sauce over your cooked pasta and mix well to coat every piece evenly. Each bite should be bursting with cheesy goodness!
Step 6: Transfer to Baking Dish
Spoon this mixture into your prepared baking dish and spread it out evenly. This helps ensure even baking throughout.
Step 7: Make the Topping
Mix breadcrumbs with olive oil or melted butter in a small bowl. Sprinkle this crunchy topping evenly over your pasta mixture—it adds such a wonderful texture!
Step 8: Bake Until Golden
Bake uncovered for 20–25 minutes until bubbly and golden on top. The smell wafting through your kitchen will have everyone anticipating dinner!
Step 9: Cool Slightly Before Serving
Let it cool slightly before diving in—this helps achieve that perfect texture while enhancing flavors as well!
And there you have it—a delightful dish of Healthy Baked Mac and Cheese! Enjoy sharing this comforting meal with friends and family; I’m sure they’ll love it just as much as I do!
Pro Tips for Making Healthy Baked Mac and Cheese
Creating the perfect Healthy Baked Mac and Cheese is easier than you think! Here are some tips to ensure your dish turns out creamy, cheesy, and delightful every time.
Choose high-fiber pasta: Opting for whole wheat or high-protein pasta not only enhances the nutritional value but also keeps you feeling full longer.
Mix in veggies: Incorporating steamed broccoli, spinach, or peas adds not just color but also essential nutrients and fiber. Plus, it makes the dish more visually appealing!
Experiment with cheeses: Feel free to mix and match your favorite cheeses. Using a combination of sharp cheddar, mozzarella, or even a bit of pepper jack can elevate the flavor profile while keeping things interesting.
Make it ahead of time: Prepare the casserole in advance and store it in the fridge until you’re ready to bake. This is perfect for busy weeknights when you want a homemade meal without all the last-minute fuss.
Don’t skip the topping: A crispy breadcrumb topping adds texture and contrast to the creamy pasta underneath. You can even add herbs or spices to the breadcrumbs for an extra kick!
How to Serve Healthy Baked Mac and Cheese
Serving your Healthy Baked Mac and Cheese can be as fun as making it! Here are some ideas to make your meal look as good as it tastes.
Garnishes
- Fresh herbs: Chopped parsley or chives sprinkled on top add vibrant color and a fresh flavor that brightens up each bite.
- Cracked black pepper: A light dusting of freshly cracked pepper provides a hint of spice that complements the creaminess of the dish.
Side Dishes
- Garden salad: A simple mixed green salad with a light vinaigrette balances out the richness of mac and cheese, adding crunch and freshness.
- Roasted vegetables: Seasonal roasted vegetables like zucchini, bell peppers, or carrots are colorful, nutritious options that complement the flavors of your dish.
- Steamed asparagus: Tender asparagus drizzled with lemon juice offers a zesty contrast that pairs perfectly with this creamy pasta.
- Garlic bread: For those who want an extra indulgent side, warm garlic bread is always a hit and great for scooping up any leftover cheese sauce!
With these tips and serving suggestions, your Healthy Baked Mac and Cheese will not only taste fantastic but also look inviting on your dinner table. Enjoy this comforting yet nutritious twist on a classic!
Make Ahead and Storage
This Healthy Baked Mac and Cheese is perfect for meal prep, allowing you to enjoy a delicious and nutritious dish throughout the week. With just a few simple storage tips, you can keep this comfort food classic on hand for busy nights.
Storing Leftovers
- Allow the mac and cheese to cool completely before storing.
- Transfer leftovers to an airtight container.
- Store in the refrigerator for up to 3-4 days.
Freezing
- To freeze, let the dish cool completely, then portion it into freezer-safe containers.
- Label each container with the date and contents.
- Freeze for up to 2-3 months.
Reheating
- Thaw frozen mac and cheese in the refrigerator overnight before reheating.
- For best results, reheat in the oven at 350°F (175°C) until heated through, about 20-25 minutes.
- You can also microwave individual portions, stirring occasionally to heat evenly.
FAQs
If you’re curious about this recipe, here are some common questions that might help!
Can I make Healthy Baked Mac and Cheese vegan?
Yes! You can substitute Greek yogurt with a plant-based yogurt and use non-dairy cheeses to create a vegan version of this Healthy Baked Mac and Cheese.
How do I add more vegetables to my Healthy Baked Mac and Cheese?
Feel free to mix in steamed broccoli, spinach, or peas into your pasta before adding the sauce. This adds nutrition while keeping it delicious!
Is Healthy Baked Mac and Cheese suitable for meal prep?
Absolutely! This dish is great for meal prep as it stores well in the fridge or freezer. Just follow the storage tips provided above!
Final Thoughts
I hope you find joy in making this Healthy Baked Mac and Cheese as much as I do! It’s a comforting dish that brings together beloved flavors with a healthier twist. Whether shared with family or enjoyed solo, this recipe is bound to become a favorite. Happy cooking!
Healthy Baked Mac and Cheese
Indulge in the comfort of this Healthy Baked Mac and Cheese, a delightful twist on a classic favorite. This guilt-free recipe combines creamy textures with wholesome ingredients, ensuring you can enjoy a hearty meal without compromising your health goals. With a rich blend of sharp cheddar and mozzarella cheeses, combined with nutritious additions like Greek yogurt and cauliflower puree, this dish is both satisfying and nourishing. Perfect for busy weeknights or family gatherings, it allows for easy customization to cater to everyone’s tastes. Add your choice of veggies or proteins for an even more wholesome experience. Prepare to bring smiles around the dinner table with this delightful dish!
- Prep Time: 15 minutes
- Cook Time: 25 minutes
- Total Time: 40 minutes
- Yield: Serves 6
- Category: Main
- Method: Baking
- Cuisine: American
Ingredients
Scale
- 8 oz whole wheat elbow macaroni
- 1 ½ cups low-fat milk
- ¾ cup plain Greek yogurt
- 1 ½ cups shredded sharp cheddar cheese
- ½ cup shredded part-skim mozzarella cheese
- 1 cup steamed cauliflower puree
- ⅓ cup whole wheat breadcrumbs
- 1 tbsp all-purpose flour
- 1 tsp Dijon mustard
- ½ tsp garlic powder
- ½ tsp onion powder
- ¼ tsp salt
- ¼ tsp black pepper
- 1 tbsp olive oil
Instructions
- Preheat your oven to 375°F (190°C).
- Cook the pasta according to package instructions until al dente; drain.
- In a saucepan over medium heat, whisk flour and milk until smooth and thickened (3–4 minutes).
- Stir in Greek yogurt, cheddar, mozzarella, mustard, garlic powder, onion powder, salt, and pepper until melted. Incorporate cauliflower puree for added creaminess.
- Combine sauce with cooked pasta thoroughly.
- Transfer mixture to a baking dish and spread evenly.
- Mix breadcrumbs with olive oil; sprinkle atop pasta mixture.
- Bake uncovered for 20–25 minutes until golden and bubbly.
- Allow cooling slightly before serving.
Nutrition
- Serving Size: 1 serving
- Calories: 300
- Sugar: 5g
- Sodium: 400mg
- Fat: 10g
- Saturated Fat: 4g
- Unsaturated Fat: 6g
- Trans Fat: 0g
- Carbohydrates: 42g
- Fiber: 6g
- Protein: 15g
- Cholesterol: 20mg
window.trCommon={“minRating”:6,”ajaxurl”:”https:\/\/www.weekmealideas.com\/wp-admin\/admin-ajax.php”,”ratingNonce”:”39752d73f3″,”postId”:913};
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 );
});



Leave a Comment