If you’re looking for a delightful treat that combines all the cozy flavors of a classic carrot cake, you’re going to fall in love with this Moist Carrot Bundt Cake! It’s soft and moist, bursting with warm spices like cinnamon and ginger, and baked in an elegant Bundt pan that makes it perfect for any occasion. Whether it’s a busy weeknight or a family gathering, this cake is sure to impress everyone around the table.

What truly makes this cake special is the luscious cream cheese glaze that drapes over its beautiful curves, adding just the right amount of sweetness. Trust me; once you try it, you’ll want to keep this recipe close at hand!


Why You’ll Love This Recipe
- Easy to make: With just a handful of simple steps, you’ll have a stunning dessert ready to impress your friends and family.
- Perfect for sharing: This recipe yields 12 generous slices, making it ideal for gatherings or as a sweet afternoon treat.
- Make-ahead friendly: You can bake this cake in advance and store it for up to several days—just add the glaze before serving!
- Packed with flavor: The combination of carrots, pineapple, and spices creates a moist cake that’s bursting with deliciousness.
- Versatile for occasions: Whether it’s Easter brunch or a cozy tea party, this cake fits right in!
Ingredients You’ll Need
Gathering your ingredients is half the fun! For this Moist Carrot Bundt Cake, you’ll need some simple and wholesome ingredients that come together beautifully. Here’s what you’ll need:
For the Cake
- 2 cups finely grated carrots (about 3 medium-sized carrots)
- 1 cup canned pineapple
- 2¼ cups all-purpose flour (plain flour in the UK)
- ¼ cup cornstarch
- 2 tsps baking powder
- ½ tsp baking soda
- ½ tsp salt
- 2½ tsps cinnamon (ground)
- 1¾ tsps ginger (ground/powdered)
- ¼ tsp cloves (ground)
- ½ tsp nutmeg (ground)
- 1½ cups soft brown sugar (firmly packed)
- 3 large eggs (room temperature)
- 1 cup unflavoured vegetable oil (I use canola)
- 3 tsps vanilla essence/extract
- ½ cup yoghurt (unsweetened, regular not Greek; low fat Greek yoghurt is okay)
- 1 cup pecans or walnuts (coarsely chopped; I like to use both so I use ½ a cup of each)
For the Cream Cheese Glaze
- 2 cups powdered sugar (also known as icing/confectioners’ sugar)
- 2 tsps unsalted butter (melted)
- ½ tsp vanilla extract/essence
- ¾ cup cream cheese (room temperature)
Variations
One of the best things about this Moist Carrot Bundt Cake is its flexibility! You can easily adapt it to suit your tastes or dietary needs. Here are some fun variation ideas:
- Add more texture: Toss in some raisins or shredded coconut for an extra layer of flavor and chewiness.
- Go gluten-free: Substitute all-purpose flour with a gluten-free blend to make this cake suitable for gluten-sensitive guests.
- Spice it up: Add crushed walnuts or pecans into the glaze for some added crunch on top!
- Change up the frosting: Try using a tangy lemon icing instead of cream cheese glaze for a refreshing twist.
How to Make Moist Carrot Bundt Cake
Step 1: Prepare Your Pan
Start by preheating your oven to 350°F (175°C). Grease your Bundt pan generously with oil or butter and lightly dust it with flour. This step ensures that when your cake is done baking, it will slide out effortlessly without any sticky surprises!
Step 2: Mix Dry Ingredients
In a large bowl, whisk together the flour, cornstarch, baking powder, baking soda, salt, cinnamon, ginger, cloves, and nutmeg. Mixing these dry ingredients thoroughly helps distribute the leavening agents evenly throughout your batter—ensuring the perfect rise!
Step 3: Combine Wet Ingredients
In another bowl, mix together the grated carrots, canned pineapple (with juice), brown sugar, eggs, oil, vanilla extract, and yogurt until well blended. This combination adds moisture and flavor—making your cake irresistibly delicious!
Step 4: Combine Wet and Dry Mixtures
Pour your wet mixture into the bowl with the dry ingredients. Gently fold them together until just combined—be careful not to overmix! A few lumps are perfectly fine; they create that delightful texture we love.
Step 5: Add Nuts
Fold in your coarsely chopped pecans or walnuts. These add an amazing crunch that beautifully complements the moistness of your cake.
Step 6: Bake Your Cake
Pour the batter into your prepared Bundt pan and smooth out the top. Bake in your preheated oven for about 45 minutes or until a toothpick inserted into the center comes out clean. The aroma wafting through your kitchen will be simply heavenly!
Step 7: Cool and Glaze
Once baked, let your cake cool in the pan for about 10 minutes before transferring it onto a wire rack. While it’s cooling down completely, prepare your cream cheese glaze by mixing powdered sugar with melted butter, vanilla extract, and cream cheese until smooth. Drizzle generously over your cooled cake—because who doesn’t love extra glaze?
Enjoy every bite of this lovely Moist Carrot Bundt Cake! It’s bound to become one of your new favorites!
Pro Tips for Making Moist Carrot Bundt Cake
Creating the perfect Moist Carrot Bundt Cake is all about attention to detail, and these tips will help you achieve cake perfection!
Use fresh ingredients: Using fresh carrots and high-quality spices enhances the flavor and moisture of your cake, making it irresistibly delicious.
Don’t overmix the batter: Mixing just until combined prevents the gluten in the flour from developing too much, resulting in a tender cake that remains soft and moist.
Allow the cake to cool completely: Letting the cake cool in the pan for about 10-15 minutes before transferring it to a wire rack ensures that it holds its shape without breaking.
Adjust baking time as needed: Every oven is different, so check your cake a few minutes before the recommended baking time. A toothpick inserted should come out clean or with a few moist crumbs.
Store properly: To keep your Bundt cake fresh, wrap it tightly in plastic wrap and store it at room temperature. This helps retain moisture and keeps it delicious for days!
How to Serve Moist Carrot Bundt Cake
Serving your Moist Carrot Bundt Cake beautifully can truly enhance the experience. Here are some delightful ideas on how to present this lovely dessert.
Garnishes
- Chopped nuts: Sprinkle some extra chopped pecans or walnuts on top for added texture and crunch.
- Coconut flakes: Toasted coconut flakes add a tropical twist and a beautiful contrast against the creamy glaze.
- Fresh herbs: A few sprigs of mint can add a pop of color and freshness to your presentation.
Side Dishes
- Whipped coconut cream: Light and fluffy, this vegan-friendly side pairs wonderfully with the sweetness of the carrot cake.
- Fruit salad: A refreshing mix of seasonal fruits balances out the richness of the cake and adds brightness to your dessert table.
- Tea or coffee: A warm cup of herbal tea or freshly brewed coffee complements the flavors of carrot bundt cake beautifully, making it perfect for afternoon gatherings.
- Vanilla ice cream: For those who love a warm dessert, serving slices with a scoop of vanilla ice cream creates an indulgent treat that everyone will adore!
Make Ahead and Storage
This Moist Carrot Bundt Cake is perfect for meal prep, allowing you to enjoy a delicious dessert throughout the week without any hassle.
Storing Leftovers
- Allow the cake to cool completely before storing.
- Wrap the cooled cake in plastic wrap or aluminum foil.
- Store at room temperature for up to 3 days, or refrigerate for up to a week.
Freezing
- Wrap individual slices in plastic wrap, then place them in a freezer-safe bag.
- Label the bag with the date and name of the cake.
- Freeze for up to 3 months.
Reheating
- Thaw slices overnight in the refrigerator before reheating.
- To reheat, place a slice in the microwave for 10-15 seconds on medium power until warmed through.
FAQs
Here are some common questions about making this delightful cake.
Can I make Moist Carrot Bundt Cake ahead of time?
Yes! You can prepare this cake a day or two in advance. Just keep it stored properly, and it will taste just as fresh when you serve it.
How do I ensure my Moist Carrot Bundt Cake stays moist?
Using finely grated carrots and ensuring not to overbake your cake are key. The addition of pineapple also contributes to its moisture!
Can I substitute ingredients in the Moist Carrot Bundt Cake recipe?
Absolutely! You can substitute vegetable oil with applesauce for a lighter version or use gluten-free flour if needed.
Final Thoughts
This Moist Carrot Bundt Cake is truly a delightful treat that brings comfort and joy to any table. I hope you enjoy making it as much as I do! Don’t hesitate to share your baking experience or variations; I’d love to hear from you. Happy baking!
Moist Carrot Bundt Cake
Indulge in the cozy flavors of our Moist Carrot Bundt Cake, a delightful dessert that combines the warmth of cinnamon and ginger with the sweetness of grated carrots and pineapple. This cake is not only soft and moist but also beautifully presented thanks to its elegant Bundt shape. Topped with a creamy glaze, it’s perfect for gatherings or a simple afternoon treat. With easy-to-follow steps and wholesome ingredients, you’ll impress family and friends alike. Bake this scrumptious cake ahead of time and enjoy the rich flavors at your leisure!
- Prep Time: 20 minutes
- Cook Time: 45 minutes
- Total Time: 1 hour 5 minutes
- Yield: Serves approximately 12 slices 1x
- Category: Dessert
- Method: Baking
- Cuisine: American
Ingredients
Scale
- 2 cups finely grated carrots
- 1 cup canned pineapple (with juice)
- 2¼ cups all-purpose flour
- ¼ cup cornstarch
- 2 tsps baking powder
- ½ tsp baking soda
- ½ tsp salt
- 2½ tsps cinnamon (ground)
- 1¾ tsps ginger (ground)
- ¼ tsp cloves (ground)
- ½ tsp nutmeg (ground)
- 1½ cups soft brown sugar
- 3 large eggs
- 1 cup unflavoured vegetable oil
- 3 tsps vanilla essence
- ½ cup yoghurt
- 1 cup chopped nuts (pecans or walnuts)
- 2 cups powdered sugar
- 2 tsps unsalted butter (melted)
- ½ tsp vanilla extract
- ¾ cup cream cheese
Instructions
- Preheat oven to 350°F (175°C). Grease a Bundt pan with oil or butter and dust with flour.
- In a large bowl, whisk together flour, cornstarch, baking powder, baking soda, salt, cinnamon, ginger, cloves, and nutmeg.
- In another bowl, mix grated carrots, pineapple (with juice), brown sugar, eggs, oil, vanilla extract, and yoghurt until well blended.
- Pour the wet mixture into the bowl with dry ingredients and gently fold until just combined; fold in coarsely chopped nuts.
- Pour the batter into the prepared Bundt pan and smooth out the top.
- Bake for about 45 minutes, or until a toothpick comes out clean.
- Cool for 10 minutes in the pan before transferring to a wire rack; prepare the glaze by mixing powdered sugar with melted butter, vanilla extract, and cream cheese until smooth.
Nutrition
- Serving Size: 1 slice
- Calories: 321
- Sugar: 26g
- Sodium: 170mg
- Fat: 15g
- Saturated Fat: 2g
- Unsaturated Fat: 12g
- Trans Fat: 0g
- Carbohydrates: 43g
- Fiber: 2g
- Protein: 4g
- Cholesterol: 37mg
window.trCommon={“minRating”:6,”ajaxurl”:”https:\/\/simplyhomecooking.com\/wp-admin\/admin-ajax.php”,”ratingNonce”:”3a34f7ace5″,”postId”:6152};
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