Easy Ratatouille Recipe

ratatouille stew in a dutch oven with an old fashioned spoon with a red wooden handle

When I sold take-home meals at the local farmers market this Ratatouille recipe was my best seller! I made this recipe in huge batches and sold out every week! Today I am sharing all the details how to make it in just 25 minutes. Below you’ll find step-by-step photos and a video so you can get delicious results every time!

a bowl of the ratatouille with someone's hands on either side

Table of contents

  • What Is Ratatouille?
  • Stovetop Ratatouille Ingredients
  • How to Make Ratatouille
  • Make Ahead, Leftovers, Storage, Freezing and Reheating
  • What goes with Ratatouille?
  • Traditional Ratatouille Vs The Movie Version
  • More Peppers, Zucchini, Summer Squash and Eggplant Recipes

What Is Ratatouille?

If you were to do a quick search on Google or Pinterest, one would easily be led to believe that Ratatouille is a beautifully composed baked dish with slices of zucchini, eggplant and tomatoes. Composed ratatouille however is not the same thing as traditional ratatouille from Provance. Traditional French Ratatouille is a rustic stew of late summer vegetables cooked slowly in a generous amount of olive oil. It comes from the Provence region of France. 

If you love this recipe, try our Soupe Au Pistou, another late summer Provencale dish using seasonal produce.

Stovetop Ratatouille Ingredients

ingredients with labels
  • Extra-virgin olive oil: We use a generous amount in this dish so we suggest a high extra-virgin olive oil for the best taste.
  • Garlic and Onion: I prefer to use sweet onion in this recipe to really amp up the sweet juicy flavors of the veggies. The natural sugars in the onion caramelized more readily which really intensifies the overal complexity of the final stew. You can use a regular yellow onion or red onion instead. 
  • Summer Veggies: zucchini or yellow squash, eggplant, red bell pepper
  • Whole canned tomatoes: You’ll need one 28-ounce can or you can sub in seeded and peeled garden tomatoes if you need to use some up.
  • Seasonings: kosher salt, ground pepper, smoked paprika and chopped fresh oregano. Herbs de Provence is a traditional herb blend from the Provence region of France, which is where Ratatouille originates.
  • Garnish: fresh goat cheese, toasted pine nuts and chopped parsley

Disclosure: This post contains affiliate links.

How to Make Ratatouille

Equipment Note: I have a large straight sided saute pan, but if you don’t a Dutch Oven works too. You want something with a wide cooking surface to get the maximum amount of browning which helps develop flavor. 

adding the spices to the onions and garlic and then adding in the veggies

Step 1: Sauté The Onion and Garlic

Start by heating the olive oil in your pot over medium-high heat until it starts shimmering. Add the garlic, onion and salt. Cook the onion until it starts to brown. Add the Herbs de Provence and smoked paprika to bring out their flavors.

Step 2: Add in the Veggies 

Add in the zucchini, squash and eggplant. Just cook and stir it until you notice a brown patina starts to form along the edges of the pan. That’s what’s called “fond” in French, and all you need to know is that’s the good stuff! It’s where the difference in flavor is made!

crush the tomatoes in and the finish with herbs and optional toppings

Step 3: Add The Tomatoes

Next add in the tomatoes. Simmer the stew for 10 minutes to thicken it, soften the veggies and meld the flavors.

Step 4: Add Herbs and Optional Toppings

Remove the sauté pan from the heat and stir in the oregano and pepper. Then spoon into serving bowls and top with parsley, goat cheese and pinenuts (if using.) You can also chill it and serve it cold.

ratatouille stew in a dutch oven with an old fashioned spoon with a red wooden handle

Make Ahead, Leftovers, Storage, Freezing and Reheating

  • Meal Prep and Make Ahead: The veggies for this recipe can be chopped one day ahead which is a great meal prep option.
  • Leftovers: The recipe can be cooked and chilled four days ahead. The green zucchini fades, so make sure to add on parsley to make it pretty! 
  • Reheating: Gently warm it on the stovetop until it is simmering. I prefer a non-stick skillet or saucepan to prevent it from sticking. If using a regular pan you can add a splash of water to thin it a little.
  • Freezing: This can be frozen for two to four weeks. Defrost it in the refrigerator, and then reheat.

What goes with Ratatouille?

  • Serve with crusty bread for a traditional meal.
  • It is good over rice or couscous as well.
  • I like to make Polenta Cakes or soft polenta to go with it. I make mine like this with broth and I add in Parmesan at the end. Just spoon the ratatouille over the polenta! So good! For a speedy option, buy polenta in a tube, and warm up rounds in a non-stick skillet with oil.
  • For a hearty meal, make garlic herb grilled chicken and serve it with ratatouille and baguette. 
  • I also love having leftover ratatouille for breakfast with a fried egg on top! 

Traditional Ratatouille Vs The Movie Version

For the Ratatouille movie, by Disney Pixar, Thomas Keller (famed French Laundry chef) was hired as the film’s food consultant. Keller was asked how he would make ratatouille fit to impress a food critic, he said that he would prepare it in the style of Confit Byaldi which is a French composed baked vegetable dish originating in the 1970s. 

True traditional Ratatouille is more of a rustic stew, the veggies are all chopped and stirred together. Traditional methods have you bake or saute the veggies separately, and use extra oil.

2F2

More Peppers, Zucchini, Summer Squash and Eggplant Recipes

  • Try our Roasted Zucchini and Eggplant or our popular Grilled Zucchini recipe.
  • Grilled Stuffed Yellow Squash: This is a great way to use up a bunch of summer squash or our Healthy Squash Casserole! 
  • Smoky Tomato Shallot Salad Dressing or Tomato Marinated Flank Steak are two unexpected way to make use of summer fresh tomatoes.
  • Healthy Zucchini Casserole: A great way to make the most of the bounty of summer zucchini. 
  • Roasted Eggplant with Pomegranate Molasses, Feta and Mint: This sounds like it’s complicated, but it couldn’t be any easier to make!
  • No Cook Zucchini Noodles with Pesto: We adore this recipe and it is pretty much the main reason I grow zucchini in my garden every year! 

At Healthy Seasonal Recipes, we specialize in cooking with fresh veggies and creating weeknight meals. Sign up HERE to get more produce-forward dinner ideas for FREE! If you make this recipe, please come back and leave a star rating and review. I would love to hear what you thought! Happy Cooking! ~Katie

Print

an overhead of a pot of ratatouille

Best Ratatouille Recipe


5 Stars 4 Stars 3 Stars 2 Stars 1 Star

5 from 14 reviews


  • Author:
    Katie Webster

  • Healthy Eating
    Total Time:
    25 minutes

  • JSON
    Yield:
    4 servings

window.location.search
Print Recipe

www.healthyseasonalrecipes.com/wp-admin/admin-ajax.php
Pin Recipe

const share_pin_buttons = document.getElementsByClassName( ‘share-pin button’ );
if ( share_pin_buttons ) {
for ( let share_key = 0; share_key {
e.stopPropagation();
window.open(e.target.dataset.href,’targetWindow’,’toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=500,height=500′);
return false;
} );
}
}

Description

Here’s how to make Ratatouille on the stove top! It is an easy 25 minute recipe based on the classic French stew. This version is topped with fresh goat cheese and pine nuts.


Ingredients


Units
  • 1/4 cup extra-virgin olive oil
  • 3 cloves garlic, finely chopped
  • 1 large sweet onion, diced
  • 2 teaspoons coarse kosher salt
  • 1 teaspoon Herbs de Provence
  • 2 teaspoons smoked paprika
  • 3 cups cubed zucchini and or yellow squash, about 3/4 pound
  • 3 cups cubed eggplant, about 1/2 pound
  • 1 large diced red bell pepper (6-ounces)
  • 1 28ounce can whole fire roasted tomatoes or low sodium tomatoes* see tip
  • 2 teaspoons tablespoon chopped fresh oregano
  • 1/2 teaspoon ground pepper
  • 1/2 cup crumbled fresh goat cheese, optional
  • 1/4 cup toasted pine nuts
  • 1/4 cup chopped parsley



Instructions

  1. Heat oil in a large straight-sided sauté pan, or Dutch oven over medium-high heat until shimmering. Add garlic, onion and salt and cook, stirring often until browned in some spots, and starting to soften, 4 to 6 minutes. Add Herbs de Provence and smoked paprika and cook, stirring until fragrant, 30 to 90 seconds.
  2. Add zucchini, eggplant and red bell and cook, stirring often until the vegetables are starting to soften and a brown patina starts to form along the edges of the pan (fond), 5 to 7 minutes.
  3. Crush tomatoes by hand into bite sized pieces. Add the tomatoes and their juices to the eggplant mixture and increase heat to high. Bring to a boil, stirring often. Reduce heat to medium-low and simmer, stirring occasionally, until the vegetables are softened to desired tenderness and starting to break down, and the tomato juices are thickened, 7 to 10 minutes.
  4. Remove from the heat and stir in oregano and ground pepper. Serve warm or cold topped with goat cheese (if using), pine nuts and parsley.

Notes

*tip: Sub 3 cups chopped fresh chopped tomatoes plus a generous pinch salt if desired. A combination of ripe Roma tomatoes and heirloom slicing tomatoes is best.

  1. The veggies for this recipe can be cut one day ahead.
  2. The recipe can be cooked and chilled four days ahead. Note: The zucchini loses its color, so make sure to add on parsley to make it pretty!
  3. This can be frozen for two to four weeks. Defrost it in the refrigerator, and then gently warm it on the stovetop until it is simmering.
  • Healthy EatingPrep Time: 25 minutes
  • Healthy EatingCook Time: 20 minutes
  • Healthy EatingCategory: Side Dish
  • JSONMethod: Stove Top
  • window.location.searchCuisine: French

Nutrition

  • Serving Size: 2 cups
  • Calories: 275
  • Sugar: 12 g
  • Sodium: 399 mg
  • Fat: 19 g
  • Saturated Fat: 2 g
  • Carbohydrates: 23 g
  • Fiber: 5 g
  • Protein: 5 g

window.trCommon={“minRating”:6,”ajaxurl”:”https://www.healthyseasonalrecipes.com/wp-admin/admin-ajax.php”,”ratingNonce”:””,”postId”:13847};
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 = .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%%22%2C%22%E2%85%9C%22%3A%223%%22%2C%22%E2%85%9D%22%3A%225%%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-convert-button’,
buttonActiveClass = ‘tasty-recipes-convert-button-active’,
buttons = document.querySelectorAll(‘.tasty-recipes-convert-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 unitType = button.dataset.unitType;
var dataset = ‘nf’ + unitType.charAt(0).toUpperCase() + unitType.slice(1);
var convertables = recipe.querySelectorAll(‘span[data-nf-original]’);
convertables.forEach(function(convertable){
if (typeof convertable.dataset.amountOriginalType === ‘undefined’
&& ‘usc’ === convertable.dataset.nfOriginal) {
if (-1 !== convertable.innerText.indexOf(‘/’)) {
convertable.dataset.amountOriginalType = ‘frac’;
}
if (-1 !== convertable.innerText.indexOf(‘.’)) {
convertable.dataset.amountOriginalType = ‘number’;
}
Object.keys(window.tastyRecipesVulgarFractions).forEach(function(vulgar) {
if (-1 !== convertable.innerText.indexOf(vulgar)) {
convertable.dataset.amountOriginalType = ‘vulgar’;
}
});
}
convertable.innerText = convertable.dataset[dataset];
if (typeof convertable.dataset.unit !== ‘undefined’) {
convertable.dataset.unit = convertable.dataset[dataset + ‘Unit’];
}
if (typeof convertable.dataset.amount !== ‘undefined’) {
convertable.dataset.amount = convertable.dataset[dataset];
if (‘metric’ === unitType) {
convertable.dataset.amountShouldRound = parseInt(convertable.dataset.amount) >= 10 ? ‘integer’ : ‘number’;
} else if (typeof convertable.dataset.amountOriginalType !== ‘undefined’) {
convertable.dataset.amountShouldRound = convertable.dataset.amountOriginalType;
} else {
convertable.dataset.amountShouldRound = false;
}
convertable.innerText = window.tastyRecipesFormatAmount(convertable.dataset[dataset], convertable);
}
if (convertable.classList.contains(‘nutrifox-unit’)) {
if (‘gram’ === convertable.dataset[dataset]) {
convertable.innerText = ‘grams’;
}
}
});

document.querySelectorAll(‘.tasty-recipes-scale-button-active’).forEach(function(scaleButton){
scaleButton.click();
});

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( .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 );
});

This post was originally shared on August 18th, 2017. I have updated the text today.

Original source: https://www.healthyseasonalrecipes.com/smoky-ratatouille-with-goat-cheese-and-pine-nuts/

You May Also Like