If you’re looking for a delightful dish that not only pleases the palate but is also visually stunning, these Asparagus and Lemon Basil Ricotta Stuffed Salmon Rolls with Lemon Sauce are just the ticket. This recipe has quickly become a favorite in my household, perfect for everything from busy weeknights to special family gatherings. The combination of fresh asparagus wrapped in tender salmon, all tied together with a zesty lemon-basil ricotta filling, creates a culinary experience that’s hard to resist.

What makes this dish even more special is how simple it is to prepare while still feeling gourmet. It’s the kind of meal that impresses guests yet feels approachable enough for a casual dinner at home. Trust me; once you try it, you’ll want to add it to your regular rotation!


Why You’ll Love This Recipe
- Quick Preparation: This dish comes together in under an hour, making it ideal for those hectic evenings when you still want something delicious.
- Family-Friendly: Kids and adults alike will love the flavors and fun presentation of these salmon rolls.
- Make-Ahead Convenience: You can prepare the stuffing in advance, saving you time on busy days.
- Nutrient-Rich Ingredients: Packed with protein and vitamins from the salmon and asparagus, this meal is as healthy as it is tasty.
- Elevated Flavor: The bright lemon sauce adds a burst of freshness that takes this dish to another level.
Ingredients You’ll Need
For this recipe, you’ll need some simple and wholesome ingredients that blend beautifully together. Each element contributes to the overall flavor profile, ensuring every bite is memorable.
For the Salmon Rolls
- 4 salmon fillets, skinless
- 1 bunch of fresh asparagus, trimmed (about 16-20 spears)
- 1 cup ricotta cheese
- 1/2 cup fresh basil, chopped
- 1 tablespoon lemon zest
- 1 tablespoon lemon juice
- 1/2 teaspoon garlic powder
- 1/2 teaspoon onion powder
- Salt and pepper, to taste
For the Sauce
- 1/4 cup grated Parmesan cheese
- 1/4 cup heavy cream
- 1/2 cup chicken broth
- 2 tablespoons butter
- 2 teaspoons Dijon mustard
- 1 tablespoon fresh parsley, chopped (for garnish)
Variations
This recipe offers plenty of room for creativity! Whether you want to swap out ingredients or add new flavors, here are some fun variations to try:
- Swap the protein: If salmon isn’t your favorite, try using chicken breast or even firm tofu for a plant-based option.
- Add more veggies: Incorporate other vegetables like spinach or roasted red peppers into the ricotta mixture for added nutrition and flavor.
- Spice it up: Add some crushed red pepper flakes or hot honey to the sauce for a spicy-sweet kick!
- Gluten-free option: Simply ensure your Dijon mustard is gluten-free and enjoy this dish worry-free!
How to Make Asparagus and Lemon Basil Ricotta Stuffed Salmon Rolls with Lemon Sauce
Step 1: Prepare the Stuffing
Begin by mixing together your ricotta cheese, chopped basil, lemon zest, lemon juice, garlic powder, onion powder, salt, and pepper in a bowl. Stir until smooth. This mixture is where all that wonderful flavor starts—it’s important not to rush this step!
Step 2: Blanch the Asparagus
In a small pot of boiling water, blanch your asparagus for 1-2 minutes until they’re bright green yet crisp. Immediately transfer them into an ice bath. This technique locks in their vibrant color and keeps them tender-crisp—a crucial element for our salmon rolls.
Step 3: Assemble the Salmon Rolls
Lay each salmon fillet flat on your workspace. Season both sides with salt and pepper before spreading an even layer of your ricotta mixture on top. Place 4-5 asparagus spears at one end and gently roll up the fillet around them. Secure with toothpicks; this helps maintain their shape during cooking.
Step 4: Sear the Salmon
Heat olive oil in an oven-safe skillet over medium-high heat. Once hot, carefully place your salmon rolls into the skillet. Searing them for 2-3 minutes per side adds a lovely golden crust while locking in moisture—such an essential step!
Step 5: Bake Until Perfectly Flaky
Transfer your skillet to a preheated oven at 375°F (190°C) and bake for about 10-12 minutes or until cooked through. The result should be perfectly flaky salmon that melts in your mouth.
Step 6: Make the Lemon Sauce
While your salmon bakes away, whisk together heavy cream, chicken broth, butter, Dijon mustard, lemon juice, and salt in a saucepan over medium heat. Stir constantly until thickened—this sauce adds zestiness that complements our stuffed rolls wonderfully.
Step 7: Serve and Enjoy!
Once baked, remove those toothpicks from your salmon rolls and plate them up beautifully. Drizzle generously with lemon sauce and sprinkle fresh parsley over top as a final touch! Now it’s time to dig in—enjoy every flavorful bite!
Pro Tips for Making Asparagus and Lemon Basil Ricotta Stuffed Salmon Rolls with Lemon Sauce
Making these delicious salmon rolls is a breeze with a few handy tips!
- Choose Fresh Ingredients: Using the freshest asparagus and ricotta will enhance the flavor of your dish, making every bite burst with freshness.
- Don’t Overcook the Salmon: Keep an eye on the salmon while it bakes. Overcooking can lead to dry fish; aim for a perfectly flaky texture by checking at the 10-minute mark.
- Adjust Seasoning in the Sauce: Taste your lemon sauce as it cooks. A little extra lemon juice or mustard can brighten it up, while salt can amplify all the flavors.
- Use a Meat Thermometer: For perfect results, use a meat thermometer to check that your salmon has reached an internal temperature of 145°F (63°C). This ensures it’s safe to eat while still moist.
- Let It Rest: After baking, let your salmon rolls sit for a minute before serving. This resting time helps redistribute the juices, keeping the fish tender.
How to Serve Asparagus and Lemon Basil Ricotta Stuffed Salmon Rolls with Lemon Sauce
Presenting your salmon rolls beautifully can make your meal even more special. Here are some ideas to elevate your dish!
Garnishes
- Fresh Lemon Wedges: Adding lemon wedges not only makes for a beautiful presentation but also allows guests to add an extra splash of citrus if desired.
- Microgreens: These delicate greens add a pop of color and freshness, enhancing both the aesthetic and flavor of the dish.
Side Dishes
- Quinoa Salad: A light quinoa salad with cherry tomatoes and cucumbers complements the richness of the salmon and adds a refreshing crunch.
- Roasted Vegetables: Seasonal roasted vegetables such as carrots, zucchini, or bell peppers bring vibrant colors and additional nutrients to your plate.
- Garlic Mashed Potatoes: Creamy garlic mashed potatoes provide a comforting side that pairs beautifully with the lemony flavors of the salmon rolls.
- Steamed Broccoli: Simple steamed broccoli offers a nutritious and vibrant addition that balances out the richness of the meal without overpowering it.
Make Ahead and Storage
This recipe for Asparagus and Lemon Basil Ricotta Stuffed Salmon Rolls with Lemon Sauce is not only delicious but also perfect for meal prep! You can make it ahead of time, store it properly, and enjoy the wonderful flavors throughout the week.
Storing Leftovers
- Allow the salmon rolls to cool completely at room temperature.
- Place the rolls in an airtight container.
- Store in the refrigerator for up to 3 days.
Freezing
- Wrap each salmon roll tightly in plastic wrap or aluminum foil.
- Place wrapped rolls in a freezer-safe bag or container.
- Freeze for up to 2 months.
Reheating
- Thaw frozen salmon rolls in the refrigerator overnight before reheating.
- Reheat in a preheated oven at 350°F (175°C) for about 10-15 minutes or until warmed through.
- Alternatively, reheat in the microwave on medium power for 1-2 minutes.
FAQs
Here are some common questions regarding this delightful recipe!
Can I use other vegetables instead of asparagus?
Absolutely! Feel free to substitute asparagus with vegetables like spinach, zucchini, or bell peppers for a different twist on this dish.
How should I store Asparagus and Lemon Basil Ricotta Stuffed Salmon Rolls with Lemon Sauce?
Store leftovers in an airtight container in the refrigerator for up to three days. For longer storage, consider freezing them!
What can I serve with Asparagus and Lemon Basil Ricotta Stuffed Salmon Rolls with Lemon Sauce?
These salmon rolls pair beautifully with a fresh salad, steamed vegetables, or a side of quinoa for a complete meal.
Can I prepare the filling ahead of time?
Yes! You can prepare the ricotta filling a day in advance and refrigerate it until you’re ready to assemble your salmon rolls.
Final Thoughts
I hope you find joy in making these Asparagus and Lemon Basil Ricotta Stuffed Salmon Rolls with Lemon Sauce! This dish is not only visually stunning but also bursting with flavor that will impress anyone at your dinner table. Enjoy every bite, and don’t hesitate to share your experience with me—happy cooking!
Asparagus and Lemon Basil Ricotta Stuffed Salmon Rolls with Lemon Sauce
Indulge in the vibrant flavors and elegant presentation of Asparagus and Lemon Basil Ricotta Stuffed Salmon Rolls with Lemon Sauce. This delightful dish combines fresh asparagus wrapped in tender salmon fillets, filled with a creamy lemon-basil ricotta mixture that bursts with flavor. Perfect for busy weeknights or special occasions, this recipe is simple yet impressive. The zesty lemon sauce elevates each bite, making it a nutritious and satisfying meal your whole family will love. With quick preparation and make-ahead convenience, you’ll want to add this gourmet dish to your regular rotation!
Total Time:
35 minutesYield:
Serves 4
Ingredients
Scale
- 4 skinless salmon fillets
- 1 bunch fresh asparagus (16–20 spears)
- 1 cup ricotta cheese
- 1/2 cup fresh basil, chopped
- 1 tablespoon lemon zest
- 1 tablespoon lemon juice
- Salt and pepper to taste
- 1/2 cup chicken broth
- 1/4 cup grated Parmesan cheese
- 1/4 cup heavy cream
- 2 tablespoons butter
- 2 teaspoons Dijon mustard
Instructions
- Mix ricotta cheese, chopped basil, lemon zest, lemon juice, garlic powder, onion powder, salt, and pepper in a bowl until smooth.
- Blanch asparagus in boiling water for 1-2 minutes; transfer to an ice bath.
- Lay salmon fillets flat; spread ricotta mixture over each fillet. Place asparagus at one end and roll up; secure with toothpicks.
- Heat olive oil in an oven-safe skillet over medium-high heat; sear salmon rolls for 2-3 minutes on each side.
- Bake in a preheated oven at 375°F (190°C) for about 10-12 minutes or until flaky.
- For the sauce: whisk together cream, chicken broth, butter, Dijon mustard, lemon juice, and salt over medium heat until thickened.
- Serve salmon rolls drizzled with lemon sauce and garnished with fresh parsley.
- Prep Time: 20 minutes
- Cook Time: 15 minutes
- Category: Main
- Method: Baking
- Cuisine: American
Nutrition
- Serving Size: 1 roll (175g)
- Calories: 410
- Sugar: 2g
- Sodium: 620mg
- Fat: 24g
- Saturated Fat: 10g
- Unsaturated Fat: 12g
- Trans Fat: 0g
- Carbohydrates: 8g
- Fiber: 1g
- Protein: 39g
- Cholesterol: 90mg
window.trCommon={“minRating”:6,”ajaxurl”:”https:\/\/www.quickdailydish.com\/wp-admin\/admin-ajax.php”,”ratingNonce”:”cf04a8cf88″,”postId”:1199};
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 );
});


