If you’re looking for a comforting dish that warms the heart and fills the belly, you’ve found it! This Ground Beef and Potato Casserole with Tomato Sauce has been a family favorite for years. It’s one of those recipes that brings everyone together around the dinner table, making it perfect for busy weeknights or special gatherings. The combination of tender potatoes, flavorful ground beef, and melty cheese creates a delightful harmony that will make you feel right at home.

What makes this casserole even more special is how easy it is to prepare. With simple ingredients and straightforward steps, you can whip up a delicious meal that your loved ones will rave about. Plus, it’s great for meal planning since it reheats well—perfect for lunch the next day!

Why You’ll Love This Recipe
- Quick to Prepare: With just 15 minutes of prep time, this dish fits perfectly into your busy schedule.
- Family-Friendly: Kids love it! The cheesy goodness combined with tender potatoes makes it a hit with all ages.
- Versatile Dish: You can easily customize it with your favorite veggies or spices to suit your tastes.
- Make-Ahead Convenience: This casserole keeps well in the fridge and freezes beautifully, making weeknight dinners a breeze.
- Hearty Flavor: Each bite is packed with savory flavors from the ground beef and rich tomato sauce that everyone will enjoy.
Ingredients You’ll Need
Let’s gather the simple, wholesome ingredients for this delicious casserole. You might already have some of these staples in your kitchen!

For the Casserole
- 1½ lbs ground beef (85/15 or 90/10)
- 1 small yellow onion (diced)
- 1 bell pepper (red, orange, or yellow, diced)
- 4 cloves garlic (minced)
- 1 15 oz can organic tomato sauce
- 3 medium Yukon Gold potatoes (thinly sliced)
- 2 cups shredded mozzarella cheese
- Pinch salt
Optional Seasonings
- ½ tsp dried oregano
- ½ tsp smoked paprika, black pepper, or chili flakes
Variations
One of the best things about this casserole is its flexibility! Feel free to get creative and tailor it to your taste.
- Swap the protein: Try ground turkey or chicken instead of beef for a lighter option.
- Add more veggies: Toss in some spinach or zucchini for extra nutrition and color.
- Change up the cheese: Use cheddar or a blend of cheeses if you’re feeling adventurous!
- Make it spicy: Add diced jalapeños or cayenne pepper for a kick!
How to Make Ground Beef and Potato Casserole with Tomato Sauce
Step 1: Prep Your Ingredients
Begin by preheating your oven to 375°F. While that’s warming up, thinly slice your potatoes and dice the onion and bell pepper. Shredding the cheese ahead of time makes assembly quicker and easier later on.
Step 2: Brown the Beef
Add the ground beef to a skillet over medium heat. Cook until browned while breaking it up as it cooks. This step not only adds flavor but also ensures that your beef is perfectly cooked before layering it in the casserole.
Step 3: Sauté the Vegetables
Now it’s time to add your diced onion, bell pepper, spices, and minced garlic directly into the pan with the rendered fat from the beef. Cook everything together for about 4–5 minutes until softened. Sautéing these veggies enhances their sweetness and brings out their natural flavors.
Step 4: Add Tomato Sauce
Stir in the can of tomato sauce along with a pinch of salt and any optional seasonings you like. Let this simmer on low for about 5 minutes—this allows all those delicious flavors to meld together beautifully.
Step 5: Assemble the Casserole
Spread the flavorful beef mixture evenly into a baking dish. Next, sprinkle half of the shredded mozzarella cheese over this layer. Layer those thinly sliced potatoes on top in a slightly overlapping pattern; they’ll become tender as they bake!
Step 6: Cheese It Up!
Top those lovely potato slices with the remaining mozzarella cheese. Who doesn’t love extra cheesy goodness?
Step 7: Bake It!
Cover your casserole with foil and pop it into the oven for 30–35 minutes until those potatoes are tender. This baking process helps everything cook through and melds all those amazing flavors together.
Step 8: Broil for Perfection
After baking, uncover your dish and broil it for an additional 3–5 minutes until that cheese is golden brown and bubbly—just keep an eye on it so it doesn’t burn!
Step 9: Rest Before Serving
Let your Ground Beef and Potato Casserole rest for about 10 minutes before slicing. This helps everything set up nicely so each serving holds its shape when you dish it out!
And there you have it—a cozy dish that’s sure to bring smiles all around! Enjoy every bite!
Pro Tips for Making Ground Beef and Potato Casserole with Tomato Sauce
Creating the perfect casserole is all about attention to detail and a few helpful tricks. Here are some tips to elevate your dish!
Use Fresh Ingredients: Fresh vegetables and herbs enhance the flavor of your casserole, making each bite more delightful. Fresh ingredients often provide more vibrant flavors compared to their canned or frozen counterparts.
Layer Strategically: Layering the cheese and potatoes correctly helps to create a beautiful presentation. When you sprinkle cheese between layers, it not only adds a creamy texture but also binds the layers together for easier serving.
Adjust Seasonings: Don’t hesitate to customize the spices to fit your taste! Adding a pinch of red pepper flakes can give your casserole a little kick, while fresh herbs like parsley can brighten up the dish.
Let It Rest: Allowing the casserole to rest before serving is crucial. This helps it set, making it easier to slice and serve without falling apart.
Experiment with Cheese: While mozzarella is delicious, trying different cheeses can change the flavor profile. Cheddar or Monterey Jack can add a sharpness that complements the beef beautifully.
How to Serve Ground Beef and Potato Casserole with Tomato Sauce
Serving this hearty casserole is all about presentation and pairing it with complementary flavors. Here are some fun ideas!
Garnishes
- Chopped Fresh Parsley: A sprinkle of fresh parsley adds a pop of color and a hint of freshness that brightens up each serving.
- Sour Cream or Greek Yogurt: A dollop on top provides creaminess and balances out the richness of the cheese and beef.
- Sliced Green Onions: Chopped green onions add a nice crunch and mild onion flavor that contrasts well with the dish’s warmth.
Side Dishes
Steamed Broccoli: This simple side dish is not only healthy but brings a vibrant green color to your plate, complementing the casserole wonderfully.
Mixed Green Salad: A light salad with mixed greens, cherry tomatoes, and a tangy vinaigrette refreshes your palate amid the hearty casserole.
Garlic Bread: Crunchy garlic bread makes for an excellent side; its crispy texture pairs beautifully with the creamy layers of your casserole.
Roasted Carrots: Sweet roasted carrots add color and nutrition, providing a pleasant contrast in both taste and texture.
With these tips and serving suggestions, you’re set to impress your family or guests with a delightful meal! Enjoy every comforting bite of your Ground Beef and Potato Casserole with Tomato Sauce.
Make Ahead and Storage
This Ground Beef and Potato Casserole with Tomato Sauce is not only delicious but also perfect for meal prepping. You can easily make it in advance, store it, and enjoy it throughout the week!
Storing Leftovers
- Allow the casserole to cool completely before storing.
- Transfer leftovers to an airtight container.
- Store in the refrigerator for up to 3–4 days.
Freezing
- Cool the casserole completely before freezing.
- Wrap the dish tightly with aluminum foil or transfer to a freezer-safe container.
- Freeze for up to 2–3 months for best quality.
Reheating
- To reheat from the fridge, preheat your oven to 350°F and cover the casserole with foil. Bake for about 20 minutes until heated through.
- If reheating from frozen, allow it to thaw overnight in the fridge before warming in the oven as described above.
FAQs
Here are some common questions you might have about making this recipe!
Can I use other types of meat in the Ground Beef and Potato Casserole with Tomato Sauce?
Absolutely! Ground turkey or chicken can be great substitutes if you’re looking for a lighter option.
How long does the Ground Beef and Potato Casserole with Tomato Sauce take to cook?
The total cooking time is about 55 minutes after prep, making this a relatively quick dinner option.
Can I add vegetables to my Ground Beef and Potato Casserole with Tomato Sauce?
Yes, feel free to add your favorite vegetables like spinach or zucchini for extra nutrients and flavor!
Is this Ground Beef and Potato Casserole suitable for meal prep?
Definitely! It stores well in the fridge or freezer, making it an excellent choice for meal planning.
What can I serve with my Ground Beef and Potato Casserole?
A simple side salad or some steamed vegetables would complement this hearty casserole perfectly!
Final Thoughts
I hope you find joy in making this cozy Ground Beef and Potato Casserole with Tomato Sauce! It’s a comforting dish that brings warmth to any dinner table. Enjoy every layer of flavor and feel free to make it your own. Happy cooking!
Ground Beef and Potato Casserole with Tomato Sauce
Indulge in the comfort of this Ground Beef and Potato Casserole with Tomato Sauce, a dish that’s perfect for busy weeknights or special family gatherings. Layered with seasoned ground beef, tender potatoes, and melted cheese, this hearty casserole delivers a satisfying meal that brings everyone to the table. The rich tomato sauce adds a delightful twist, making each bite a burst of flavor. Plus, it’s easy to prepare and even better as leftovers, ensuring that you can enjoy this delicious dish throughout the week!
- Prep Time: 15 minutes
- Cook Time: 55 minutes
- Total Time: 1 hour 10 minutes
- Yield: Serves approximately 8 people 1x
- Category: Main
- Method: Baking
- Cuisine: American
Ingredients
Scale
- 1½ lbs ground beef (85/15 or 90/10)
- 1 small yellow onion (diced)
- 1 bell pepper (diced)
- 4 cloves garlic (minced)
- 1 can (15 oz) organic tomato sauce
- 3 medium Yukon Gold potatoes (thinly sliced)
- 2 cups shredded mozzarella cheese
- Optional seasonings: dried oregano, smoked paprika, black pepper
Instructions
- Preheat your oven to 375°F.
- Slice the potatoes and dice the onion and bell pepper.
- In a skillet over medium heat, brown the ground beef until fully cooked.
- Add onion, bell pepper, garlic, and seasonings; sauté until softened.
- Stir in the tomato sauce and simmer for about 5 minutes.
- Layer half of the beef mixture in a baking dish, sprinkle with half of the cheese, then arrange the potato slices on top.
- Add remaining beef mixture and top with remaining cheese.
- Cover with foil and bake for 30–35 minutes until potatoes are tender.
- Uncover and broil for an additional 3–5 minutes until cheese is golden.
Nutrition
- Serving Size: 1 serving
- Calories: 370
- Sugar: 4g
- Sodium: 550mg
- Fat: 20g
- Saturated Fat: 9g
- Unsaturated Fat: 9g
- Trans Fat: 0g
- Carbohydrates: 30g
- Fiber: 4g
- Protein: 22g
- Cholesterol: 85mg
window.trCommon={“minRating”:6,”ajaxurl”:”https:\/\/www.weekmealideas.com\/wp-admin\/admin-ajax.php”,”ratingNonce”:”b2457ddab4″,”postId”:1185};
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