If you’re looking for a cozy dish that wraps you in warmth and comfort, then this Bacon Cheddar Gnocchi Soup is just the thing. Each spoonful is like a warm hug, blending crispy bacon with creamy cheddar and soft gnocchi. It’s perfect for those busy weeknights when you need something quick yet satisfying or for family gatherings where everyone gathers around the table to share good food and laughter. This soup is truly special because it combines delicious flavors that everyone loves, making it a favorite across households.


Why You’ll Love This Recipe
- Easy to Prepare: With just a handful of simple steps, you’ll have this delectable soup simmering on the stove in no time.
- Family-Friendly: The rich, creamy goodness appeals to both kids and adults, making dinner a breeze.
- Comfort in a Bowl: There’s nothing quite like a warm bowl of soup on chilly nights; it’s sure to lift your spirits.
- Make-Ahead Friendly: You can prepare this soup in advance and reheat it for an even more flavorful meal later on.
- Savory Flavors: The combination of bacon, cheese, and gnocchi creates a mouthwatering experience that will keep you coming back for more.

Ingredients You’ll Need
This recipe calls for simple, wholesome ingredients that you probably already have on hand. Gather up these delightful items to create your comforting bowl of Bacon Cheddar Gnocchi Soup!
For the Soup Base
- 6 slices of bacon, chopped
- 1 medium onion, finely diced
- 2 cloves garlic, minced
- 4 cups chicken broth
- 1 cup heavy cream
For the Gnocchi and Cheese
- 1 pound of gnocchi
- 2 cups sharp cheddar cheese, shredded
For Flavoring
- Salt and pepper to taste
- 1 tablespoon olive oil
- 2 cups chopped fresh spinach
- 1 teaspoon dried thyme
- 1 teaspoon smoked paprika
For Thickening
- 2 tablespoons all-purpose flour
- 2 tablespoons butter
Variations
This recipe is wonderfully flexible! You can easily adapt it to suit your tastes or dietary needs. Here are some fun variations to try:
- Swap the Protein: Use turkey bacon or chicken sausage if you’re looking for a lighter option without sacrificing flavor.
- Go Vegan: Replace the bacon with sautéed mushrooms, use plant-based cream, and swap out the cheese for a dairy-free version.
- Add Extra Veggies: Toss in some diced carrots or bell peppers for added nutrition and color.
- Spice it Up: Add a pinch of red pepper flakes or drizzle hot honey on top before serving for a spicy-sweet kick.
How to Make Bacon Cheddar Gnocchi Soup
Step 1: Cook the Bacon
In a large pot, cook the chopped bacon over medium heat until crispy. This step is crucial as it not only adds flavor but also leaves behind delicious grease that will serve as the base for our soup. Once crispy, remove with a slotted spoon and set aside—don’t forget to keep that grease!
Step 2: Sauté Onions and Garlic
Next, add the diced onion to the pot with the bacon grease. Sauté until translucent, about 5 minutes. This process brings out their natural sweetness, which will enhance the overall flavor of your soup. Stir in the minced garlic and cook for another minute until fragrant—your kitchen will smell heavenly!
Step 3: Create the Roux
Stir in the flour and mix well for 1-2 minutes until it forms a roux with the onions and garlic. This step thickens your soup while adding depth to its flavor profile.
Step 4: Add Chicken Broth
Gradually whisk in the chicken broth ensuring there are no lumps remaining. Increasing the heat to medium-high will bring this mixture to a simmer—this is where all those wonderful flavors begin to meld together.
Step 5: Incorporate Creamy Goodness
Now it’s time to stir in the heavy cream, thyme, and smoked paprika. These ingredients add richness and aromatic notes that make this soup truly irresistible.
Step 6: Cook Gnocchi
Add gnocchi into your bubbling pot and cook for about 3-5 minutes or until they float to the top. Floating gnocchi means they’re perfectly cooked—just like magic!
Step 7: Melt That Cheese
Reduce heat to low and stir in shredded cheddar cheese until melted and smooth. This is where we achieve that creamy texture we love so much!
Step 8: Season & Add Spinach
Season your delicious creation with salt and pepper according to your taste. In another pan, heat olive oil over medium heat and sauté spinach until wilted before adding it into your soup.
Step 9: Combine Everything
Stir back in those crispy bacon bits (reserving some for garnish if desired), allowing all flavors to blend beautifully as you let it simmer for another few minutes.
Step 10: Serve Hot
Finally, serve this nourishing Bacon Cheddar Gnocchi Soup hot! Enjoy every comforting bite—it’s bound to be a hit with everyone at your table!
Pro Tips for Making Bacon Cheddar Gnocchi Soup
To ensure your Bacon Cheddar Gnocchi Soup turns out perfectly every time, follow these simple yet effective tips!
- Use fresh ingredients: Fresh vegetables and high-quality cheese will enhance the flavor of your soup, making it more vibrant and delicious.
- Don’t rush the roux: Allowing the flour to cook properly with the onion and garlic creates a smoother texture and prevents any raw flour taste in your soup.
- Adjust thickness: If you prefer a thicker soup, let it simmer for a few extra minutes after adding the gnocchi, or add a bit more flour to achieve the desired consistency.
- Experiment with cheese: While sharp cheddar is fantastic, trying different cheeses like gouda or pepper jack can bring unique flavors to your soup.
- Save bacon for garnish: Reserve some crispy bacon to sprinkle on top just before serving. It adds a delightful crunch and makes the dish visually appealing.
How to Serve Bacon Cheddar Gnocchi Soup
Serving your Bacon Cheddar Gnocchi Soup thoughtfully can elevate the dining experience. Consider these ideas for presentation!
Garnishes
- Chopped chives or green onions: These add a pop of color and a mild onion flavor that complements the richness of the soup.
- A drizzle of olive oil: A light drizzle on top just before serving enhances flavors and gives a beautiful sheen to your dish.
Side Dishes
- Crusty bread: A warm, crusty loaf is perfect for dipping into the creamy soup, soaking up all those delicious flavors.
- Side salad: A fresh mixed greens salad with a tangy vinaigrette provides a refreshing contrast to the richness of the soup.
- Roasted vegetables: Seasonal roasted veggies add depth and nutrition, making for a well-rounded meal.
- Cheesy garlic bread: This indulgent side pairs beautifully with the soup’s flavors while adding an extra layer of comfort.
Make Ahead and Storage
This Bacon Cheddar Gnocchi Soup is perfect for meal prep, allowing you to enjoy its comforting flavors throughout the week. Here’s how to store it properly:
Storing Leftovers
- Allow the soup to cool completely before transferring it to an airtight container.
- Store in the refrigerator for up to 3-4 days.
- Avoid storing the soup with toppings mixed in; keep bacon and spinach separate until serving.
Freezing
- Let the soup cool down fully before pouring it into freezer-safe containers or bags.
- Leave some space at the top of the container for expansion as it freezes.
- Freeze for up to 2-3 months. Note that cream-based soups may change texture when thawed.
Reheating
- Thaw frozen soup in the refrigerator overnight before reheating.
- Heat on the stove over medium heat, stirring occasionally until warmed through. Add a splash of broth or cream if it appears too thick.
- For microwave reheating, use a microwave-safe bowl and heat in intervals, stirring frequently.
FAQs
Can I make Bacon Cheddar Gnocchi Soup dairy-free?
Yes! Substitute heavy cream with coconut milk or a plant-based cream alternative and use dairy-free cheese.
How can I make my Bacon Cheddar Gnocchi Soup spicier?
Add red pepper flakes or a dash of hot sauce while cooking for added heat.
What are some good side dishes to serve with Bacon Cheddar Gnocchi Soup?
Consider pairing this soup with a fresh garden salad or crusty bread for dipping!
Can I use other types of cheese in my Bacon Cheddar Gnocchi Soup?
Absolutely! Feel free to experiment with cheeses like gouda or mozzarella for different flavors.
How long does Bacon Cheddar Gnocchi Soup last in the fridge?
Properly stored, this soup will last about 3-4 days in the refrigerator.
Final Thoughts
This Bacon Cheddar Gnocchi Soup is more than just a meal; it’s a warm hug in a bowl! I hope you enjoy making this comforting dish as much as I do. It’s perfect for chilly nights or when you simply need a little extra coziness in your day. Happy cooking and enjoy every delicious spoonful!
Cozy Chicken Cheddar Gnocchi Soup
Indulge in the warmth of this Chicken Cheddar Gnocchi Soup, a comforting dish perfect for chilly evenings or family gatherings. Each hearty spoonful features tender gnocchi enveloped in a creamy, rich broth, complemented by savory chicken and sharp cheddar cheese. This easy-to-make recipe is ideal for busy weeknights, offering a satisfying meal that delights both kids and adults alike.
- Prep Time: 15 minutes
- Cook Time: 30 minutes
- Total Time: 45 minutes
- Yield: Approximately 6 servings 1x
- Category: Soup
- Method: Cooking
- Cuisine: American
Ingredients
Scale
- 6 slices turkey bacon, chopped
- 1 medium onion, finely diced
- 2 cloves garlic, minced
- 4 cups chicken broth
- 1 cup heavy cream
- 1 pound gnocchi
- 2 cups sharp cheddar cheese, shredded
- Salt and pepper to taste
- 1 tablespoon olive oil
- 2 cups chopped fresh spinach
- 1 teaspoon dried thyme
- 1 teaspoon smoked paprika
- 2 tablespoons all-purpose flour
- 2 tablespoons butter
Instructions
- In a large pot over medium heat, cook the chopped turkey bacon until crispy. Remove with a slotted spoon and set aside.
- In the same pot with the remaining grease, sauté the diced onion until translucent (about 5 minutes). Add minced garlic and cook for another minute until fragrant.
- Stir in the flour to create a roux; cook for about 1-2 minutes.
- Gradually whisk in chicken broth; bring to a simmer while stirring constantly.
- Stir in heavy cream, thyme, and smoked paprika to enhance flavors.
- Add gnocchi to the pot and cook until they float (about 3-5 minutes).
- Reduce heat to low; stir in shredded cheddar cheese until melted and smooth.
- Season with salt and pepper to taste. Sauté spinach in olive oil until wilted; mix into the soup along with reserved bacon pieces.
- Serve hot and enjoy!
Nutrition
- Serving Size: 1 bowl (300g)
- Calories: 450
- Sugar: 4g
- Sodium: 950mg
- Fat: 28g
- Saturated Fat: 14g
- Unsaturated Fat: 12g
- Trans Fat: 0g
- Carbohydrates: 35g
- Fiber: 2g
- Protein: 16g
- Cholesterol: 80mg
window.trCommon={“minRating”:6,”ajaxurl”:”https:\/\/www.simpledailyeats.com\/wp-admin\/admin-ajax.php”,”ratingNonce”:”6aa49f7d57″,”postId”:3815};
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 );
});


