Error executing template "Designs/juuls/eCom/Product/espresso.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at Co3.Juuls.Website.Models.Frontend.Ecommerce.JuulsProduct.get_TastingNotes()
at CompiledRazorTemplates.Dynamic.RazorEngine_2c3883c1483a41d5938fac284beb63fa.Execute() in D:\dynamicweb.net\Solutions\twodayco3\juulsvin.cloud.dynamicweb-cms.com\Files\Templates\Designs\juuls\eCom\Product\espresso.cshtml:line 70
at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Co3.Espresso.Website.TemplateBases.Paragraphs.Module 2 @using System.Web 3 @using Co3.Espresso.Base.Extensions 4 @using Co3.Espresso.Website.Models 5 @using Co3.Espresso.Website.Services 6 @using Co3.Espresso.Website.Models.FrontEnd 7 @using Co3.Espresso.Website.Models.FrontEnd.Settings 8 @using Co3.Espresso.Website.Models.FrontEnd.Ecommerce 9 @using Co3.Espresso.Website.Models.FrontEnd.Elements 10 @using Co3.Espresso.Website.Models.FrontEnd.Handlebars 11 @using Co3.Juuls.Frontend.Models.Frontend.Ecommerce 12 @using Co3.Juuls.Website.Frontend.Helpers 13 @using Co3.Juuls.Website.Frontend.Models.Frontend.Ecommerce 14 @using Co3.Juuls.Website.Frontend.Services 15 @using Co3.Juuls.Website.Models.Frontend.Ecommerce 16 @using Dynamicweb.Ecommerce.Common 17 @using Dynamicweb.Ecommerce.Discounts 18 @using Dynamicweb.Ecommerce.Orders.Discounts 19 @using Dynamicweb.Ecommerce.Orders.SalesDiscounts 20 @using Dynamicweb.Ecommerce.Prices 21 @using Dynamicweb.Ecommerce.Products 22 @using Dynamicweb.Ecommerce.SalesDiscounts.TotalSalesPriceDiscount 23 @using Dynamicweb.Frontend 24 @using Dynamicweb.Security.UserManagement 25 @using Context = Dynamicweb.Context 26 @using Page = Dynamicweb.Content.Page 27 @using PageService = Dynamicweb.Content.PageService 28 @using ProductService = Co3.Espresso.Website.Services.ProductService 29 30 @{ 31 ShopType siteContext = SiteContext.CurrentSiteContext(); 32 string alternateCallToAction = PageView.Current().Area.Item["EcommerceAlternativeCallToAction"].ToString(); 33 34 JuulsProduct espressoProduct = (JuulsProduct) ProductService.Instance.GetEspressoProduct( 35 new ProductSettings() 36 { 37 Id = GetString("Ecom:Product.ID"), 38 VariantId = GetString("Ecom:Product.VariantID"), 39 PrimaryVariantId = GetString("Ecom:Product.DefaultVariantComboID"), 40 EmbeddedInModelList = false 41 } 42 ); 43 RelewiseService.Instance.TrackProductView(espressoProduct); 44 45 bool hasB2cAmoutnDiscount = espressoProduct.Discount != null && espressoProduct.Discount.ProductQuantity > 1; 46 47 48 } 49 50 @RenderingService.Instance.SectionEnd() 51 52 <div class="e-product js-e-product js-e-scroll-reveal" data-has-variants="@espressoProduct.HasVariants.ToString().ToLower()" data-product-id="@espressoProduct.Id" data-variant-id="@espressoProduct.VariantId"> 53 54 55 @RenderingService.Instance.SectionStart(new SectionSettings 56 { 57 Classes = new ClassList("e-section pb-1") 58 }) 59 <div class="col-12 order-first"> 60 <div class="row"> 61 <h1 class="e-product-name h2 font-weight-bold" style="padding-left: 1.25%; padding-right: 1.25%;"> 62 @espressoProduct.Name 63 </h1> 64 65 @espressoProduct.RenderDisplayGroup("Frontend_Topinfo") 66 67 </div> 68 </div> 69 <div class="col-12 col-lg-4 juuls-product-main order-last order-lg-first mb-2"> 70 @if (espressoProduct.TastingNotes.Any()) 71 { 72 <div class="@(!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating1Score.Value")) ? "" : "h-100") bg-secondary p-1 p-lg-3 mb-2 overflow-hidden"> 73 <div class="row position-relative"> 74 <h3 class="mb-2 w-100 px-1 d-flex justify-content-center">@Translate("eCom Product - Tasting notes - Heading", "Smagsnoter")</h3> 75 76 <div class="d-flex col-12 col-md-6 col-lg-12 juuls-smagsnoter-img-container order-2"> 77 <div class="d-flex juuls-smagsnoter-row"> 78 @{ 79 int loopCounter = 0; 80 } 81 82 @foreach (KeyValuePair<string, string> entry in espressoProduct.TastingNotes) 83 { 84 string smagsnoteImage = "/admin/public/getimage.ashx?Image=/Files/Images/smagsnoter/" + entry.Value + ".png&Width=480&Height=480&Format=jpg&Quality=75&Crop=0"; 85 if (!string.IsNullOrEmpty(entry.Value)) 86 { 87 <div class="d-flex flex-column col-4 px-1 mb-2" style="max-width: 110px;"> 88 <span class="smagsnote-img" style="background-image: url('@smagsnoteImage')"></span> 89 <span class="text-center small pt-1">@entry.Key.Replace("/", " / ")</span> 90 </div> 91 } 92 loopCounter++; 93 } 94 </div> 95 </div> 96 97 @if (loopCounter > 3) 98 { 99 <div style="height: 3em;" class="position-absolute col-12 order-1 d-none d-lg-block"> 100 <a style="width: 2em; height: 1.5em; background-size: contain;" class="control-arrow carousel-control-prev ml-auto" data-slide="prev"></a> 101 <a style="width: 2em; height: 1.5em; background-size: contain;" class="control-arrow carousel-control-next mr-auto" data-slide="next"></a> 102 </div> 103 } 104105 @espressoProduct.RenderDisplayGroup("Frontend_RatingSummary") 106 </div> 107 </div> 108 } 109110 @using Co3.Espresso.Base.Extensions 111 @inherits Co3.Espresso.Website.TemplateBases.Paragraphs.Module 112113 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating1Score.Value"))) 114 { 115 <div class="bg-white d-flex flex-fill p-3 flex-column"> 116 <div class=""> 117118 <div class="row col-12 pr-0"> 119 <h3 class="col-6">@Translate("eCom Product - Anmeldelser - Heading", "Anmeldelser")</h3> 120 <a class="col-6 text-lg-right arrow-down pr-0" href="@Dynamicweb.Context.Current.Request.Url.PathAndQuery#ratings" class="mb-2 w-100 px-1">@Translate("eCom Product - Read ratings - Heading", "Læs anmeldelserne")</a> 121 </div> 122123 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating1Score.Value"))) 124 { 125 <div class="col-12"> 126 <div class="row"> 127 <div class="col-8"> 128 @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating1By.Value") 129 </div> 130 <div class="col-4 text-right"> 131 @if (GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating1Scale.Value").Contains("star")) 132 { 133 string numberOfStars = GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating1Scale.Value"); 134 numberOfStars = numberOfStars.Replace("-star", ""); 135 int intNumberOfStars = Convert.ToInt16(numberOfStars); 136137 int score = 1 * Convert.ToInt32(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating1Score.Value")); 138 for (int i = 0; i < intNumberOfStars; i++) 139 { 140 string ratings = string.Empty; 141 if (i < score) 142 { 143 ratings = "text-primary"; 144 } 145 <span class="material-icons @ratings"> 146 star 147 </span> 148 } 149 } 150 else 151 { 152 <span class="font-weight-bold"> @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating1Score.Value") point</span> 153 } 154 </div> 155 </div> 156 </div> 157 } 158 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating2Score.Value"))) 159 { 160 <div class="col-12"> 161 <div class="row"> 162 <div class="col-8"> 163 @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating2By.Value") 164 </div> 165 <div class="col-4 text-right"> 166 @if (GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating2Scale.Value").Contains("star")) 167 { 168 string numberOfStars = GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating2Scale.Value"); 169 numberOfStars = numberOfStars.Replace("-star", ""); 170 int intNumberOfStars = Convert.ToInt16(numberOfStars); 171172 int score = 1 * Convert.ToInt32(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating2Score.Value")); 173 for (int i = 0; i < intNumberOfStars; i++) 174 { 175 string ratings = string.Empty; 176 if (i < score) 177 { 178 ratings = "text-primary"; 179 } 180 <span class="material-icons @ratings"> 181 star 182 </span> 183 } 184 } 185 else 186 { 187 <span class="font-weight-bold"> @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating2Score.Value") point</span> 188 } 189 </div> 190 </div> 191 </div> 192 } 193 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating3Score.Value"))) 194 { 195 <div class="col-12"> 196 <div class="row"> 197 <div class="col-8"> 198 @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating3By.Value") 199 </div> 200 <div class="col-4 text-right"> 201 @if (GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating3Scale.Value").Contains("star")) 202 { 203 string numberOfStars = GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating3Scale.Value"); 204 numberOfStars = numberOfStars.Replace("-star", ""); 205 int intNumberOfStars = Convert.ToInt16(numberOfStars); 206207 int score = 1 * Convert.ToInt32(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating3Score.Value")); 208 for (int i = 0; i < intNumberOfStars; i++) 209 { 210 string ratings = string.Empty; 211 if (i < score) 212 { 213 ratings = "text-primary"; 214 } 215 <span class="material-icons @ratings"> 216 star 217 </span> 218 } 219 } 220 else 221 { 222 <span class="font-weight-bold"> @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating3Score.Value") point</span> 223 } 224 </div> 225 </div> 226 </div> 227 } 228 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating4Score.Value"))) 229 { 230 <div class="col-12"> 231 <div class="row"> 232 <div class="col-8"> 233 @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating4By.Value") 234 </div> 235 <div class="col-4 text-right"> 236 @if (GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating4Scale.Value").Contains("star")) 237 { 238 string numberOfStars = GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating4Scale.Value"); 239 numberOfStars = numberOfStars.Replace("-star", ""); 240 int intNumberOfStars = Convert.ToInt16(numberOfStars); 241242 int score = 1 * Convert.ToInt32(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating4Score.Value")); 243 for (int i = 0; i < intNumberOfStars; i++) 244 { 245 string ratings = string.Empty; 246 if (i < score) 247 { 248 ratings = "text-primary"; 249 } 250 <span class="material-icons @ratings"> 251 star 252 </span> 253 } 254 } 255 else 256 { 257 <span class="font-weight-bold"> @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating4Score.Value") point</span> 258 } 259 </div> 260 </div> 261 </div> 262 } 263 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating5Score.Value"))) 264 { 265 <div class="col-12"> 266 <div class="row"> 267 <div class="col-8"> 268 @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating5By.Value") 269 </div> 270 <div class="col-4 text-right"> 271 @if (GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating5Scale.Value").Contains("star")) 272 { 273 string numberOfStars = GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating5Scale.Value"); 274 numberOfStars = numberOfStars.Replace("-star", ""); 275 int intNumberOfStars = Convert.ToInt16(numberOfStars); 276277 int score = 1 * Convert.ToInt32(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating5Score.Value")); 278 for (int i = 0; i < intNumberOfStars; i++) 279 { 280 string ratings = string.Empty; 281 if (i < score) 282 { 283 ratings = "text-primary"; 284 } 285 <span class="material-icons @ratings"> 286 star 287 </span> 288 } 289 } 290 else 291 { 292 <span class="font-weight-bold"> @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating5Score.Value") point</span> 293 } 294 </div> 295 </div> 296 </div> 297 } 298 </div> 299 </div> 300 } 301 </div> 302303 <div class="col-12 col-md-6 col-lg-4 juuls-product-image order-first mb-2"> 304 @RenderingService.Instance.PartialView("ecom/product/partials/part-discount-badge.cshtml", espressoProduct) 305 @RenderingService.Instance.PartialView("ecom/product/partials/images.cshtml", espressoProduct) 306 @RenderingService.Instance.PartialView("ecom/product/partials/awards.cshtml", espressoProduct) 307 </div> 308 <div class="col-12 col-md-6 col-lg-4 juuls-product-aside order-first d-flex justify-content-center flex-column"> 309 <div class="row h-100"> 310 <div class="bg-secondary d-flex flex-fill p-3 flex-column mb-2"> 311312 @if (espressoProduct.Discount != null && espressoProduct.Discount.EndDate.HasValue && espressoProduct.Discount.EndDate.Value > DateTime.MinValue) 313 { 314 <p class="text-right mt-1 mb-1 pb-1 border-bottom">Tilbudet udløber @espressoProduct.Discount.EndDate.Value.ToShortEspressoFormat()</p> 315 } 316317 @if (siteContext == ShopType.B2C) 318 { 319 @RenderingService.Instance.PartialView("ecom/product/partials/discounts-b2c.cshtml", espressoProduct) 320 } 321322 <div class="align-items-baseline d-flex justify-content-between"> 323 @if (!hasB2cAmoutnDiscount) 324 { 325 <div class="d-flex align-items-center"> 326 @if (espressoProduct.Stock.Quantity > 0) 327 { 328 if (espressoProduct.Stock.State != null) 329 { 330 <span class="@(espressoProduct.Stock.State.Contains("Få på lager") || espressoProduct.Stock.State.Contains("Ukendt tilgængelighed") ? "bg-warning" : "bg-success") product-stock-status">&nbsp;</span> 331 @espressoProduct.Stock.State 332 } 333 } 334 else 335 { 336 if (espressoProduct.Stock.State != null) 337 { 338 <span class="bg-danger product-stock-status">&nbsp;</span> 339 @espressoProduct.Stock.State 340 } 341 } 342 </div> 343 } 344345 <span> 346 @if (siteContext == ShopType.B2B) 347 { 348 EspressoPrice userDiscountedPrice = JuulsProductService.Instance.GetUserDiscountedPrice(espressoProduct); 349350 JuulsUserDiscount userDiscount = espressoProduct.UserDiscount; 351 JuulsSalesDiscount salesDiscount = espressoProduct.SalesDiscount; 352 EspressoPrice savedAmount = espressoProduct.SavedAmount; 353 if (userDiscountedPrice.Value > 0) 354 { 355356 EspressoPrice beforePrice = espressoProduct.Price; 357 EspressoPrice price = userDiscountedPrice; 358 savedAmount = JuulsProductService.Instance.GetUserSavedPrice(beforePrice.Value, price.Value); 359360 } 361 <small class="d-block text-muted">@Translate("eCom - Product details - Personal Price - Text", "Din pris")</small> 362363364 if ((salesDiscount != null && userDiscountedPrice != null && userDiscountedPrice.Value > 0) || (salesDiscount != null && userDiscount.HasPercentageDiscount && salesDiscount.Percentage > 0)) 365 { 366 <span class=" d-flex justify-content-between"> 367 <span class=" text-line-through"> 368 @Translate("eCom - Product - Discount - Before Price - Text", "Før pris") @espressoProduct.Price.Formatted 369 </span> 370 </span> 371 <span class="mb-1 text-success juuls-discount-text-x-when-y-save-price" style="font-size: 1.3em;"> 372 @Translate("eCom - Product - Discount - Saved - Text", "Spar") @savedAmount.Formatted 373 </span> 374 <p class="e-product-price h2 mb-0 mt-0"> 375 @userDiscountedPrice.Formatted 376 </p> 377 } 378 else 379 { 380 <p class="e-product-price h2 mb-0 mt-0"> 381 @espressoProduct.Price.Formatted 382 </p> 383 } 384 <small class="d-block text-muted">@Translate("eCom - Product - Ex VAT - Text", "ex. moms")</small> 385 } 386 else 387 { 388 if (!hasB2cAmoutnDiscount) 389 { 390 <p class="e-product-price h2 mb-0 mt-0"> 391 @espressoProduct.Price.Formatted 392 </p> 393 } 394395 } 396397 </span> 398399 </div> 400401 @if (espressoProduct.IsStoreOnly == false) 402 { 403 if (espressoProduct.Stock.Quantity > 0) 404 { 405 @RenderingService.Instance.PartialView("ecom/product/partials/add-to-cart.cshtml", espressoProduct) 406407 if (siteContext == ShopType.B2B) 408 { 409 @RenderingService.Instance.PartialView("ecom/product/partials/discounts-b2b.cshtml", espressoProduct) 410 } 411 } 412 else 413 { 414 <hr> 415 } 416 } 417 else 418 { 419 if (PageView.Current().Area.Item["EcommerceProductPageEmailForm"] != null) 420 { 421 <a class="btn btn-success btn-block text-white mt-2" data-toggle="modal" href="#productPageEmailModal" role="button"> 422 <i class="material-icons ">email</i>@Translate("eCom Product - Contact if you are interested - Button", "Kontakt ved interesse") 423 </a> 424 } 425 } 426427 <div class="e-product-delivery mt-2 text-heading flex-row"> 428 @RenderingService.Instance.PartialView("ecom/product/partials/delivery-info.cshtml", espressoProduct) 429 </div> 430 <div class="d-flex justify-content-between mt-2"> 431 <a class="btn btn-tertiary bg-tertiary btn-block mr-1" href="@espressoProduct.ImagePrimary.Original" download> 432 @Translate("eCom - Product details - Download Image - Text", "Download produktbillede") 433 </a> 434 <div class="btn-group btn-block m-0"> 435 <button type="button" class="btn btn-tertiary bg-tertiary js-juuls-download-product-pdf w-100 border-right @(SiteContext.CurrentSiteContext() == ShopType.B2B ? string.Empty: "border-0")"> 436 Download produktark 437 </button> 438 @if (SiteContext.CurrentSiteContext() == ShopType.B2B) 439 { 440 <button type="button" class="btn btn-tertiary bg-tertiary border-left text-center pl-2 dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" data-reference="parent"> 441 <i class="material-icons">arrow_drop_down</i> 442 </button> 443 <div class="dropdown-menu dropdown-menu-right border "> 444 <a class="dropdown-item js-juuls-download-product-pdf" href="#"> 445 Download <strong>med</strong> beskrivelse 446 </a> 447 <a class="dropdown-item js-juuls-download-product-clean-pdf" href="#">Download <strong>uden</strong> beskrivelse</a> 448 <div class="dropdown-divider"></div> 449 <a class="dropdown-item" href="#" data-target="#pdfPriceModal" data-toggle="modal"> 450 <i class="material-icons">edit_document</i> Konfigurer produktark 451 </a> 452453 </div> 454 } 455 </div> 456457 </div> 458459 </div> 460 @RenderingService.Instance.PartialView("ecom/product/partials/relewise-recommendations-recently-viewed.cshtml", espressoProduct) 461462463464 </div> 465 </div> 466467 @RenderingService.Instance.SectionEnd() 468469 @RenderingService.Instance.SectionStart(new SectionSettings 470 { 471 Classes = new ClassList("e-section pb-2") 472 }) 473474 <div class="col-12 col-lg-8"> 475 <div class="row h-100"> 476 @if (!string.IsNullOrEmpty(espressoProduct.JuulsProductDesc)) 477 { 478 @RenderingService.Instance.SectionStart(new SectionSettings 479 { 480 Classes = new ClassList("col-12 is-sm mb-2 d-flex"), 481 ContentClasses = new ClassList("col-12 is-sm"), 482 ContainerClasses = new ClassList("container-fluid bg-white p-3"), 483 Collapsible = true 484 }) 485 <div class="col-12"> 486 <h2>Beskrivelse</h2> 487 @espressoProduct.JuulsProductDesc 488 </div> 489 @RenderingService.Instance.SectionEnd() 490 } 491 @espressoProduct.RenderDisplayGroup("Frontend_Specifications") 492 </div> 493 </div> 494 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsProducerCategory.JuulsProdName.Value"))) 495 { 496 <div class="col-12 col-lg-4"> 497 <div class="row"> 498 <div class="bg-white col-12 p-2"> 499 <div class="row"> 500501 @espressoProduct.RenderDisplayGroup("Frontend_Producent") 502503504 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsProducerCategory.JuulsProdInternLink.Value"))) 505 { 506 <p class="col-12 d-flex"> 507 <a class="btn btn-secondary btn-block btn-tertiary border" href="@GetString("Ecom:Product.CategoryField.JuulsProducerCategory.JuulsProdInternLink.Value")">Se hele @espressoProduct.JuulsProdName's udvalg</a> 508 </p> 509 } 510 else 511 { 512 <p class="col-12 d-flex"> 513 <a class="btn btn-secondary btn-block btn-tertiary border" href="@espressoProduct.Link#/search=@espressoProduct.JuulsProdName/">Se hele @espressoProduct.JuulsProdName's udvalg</a> 514 </p> 515 } 516 </div> 517 </div> 518 </div> 519 </div> 520 } 521 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating1FullQuote.Value"))) 522 { 523 <div class="col-12"> 524 <div class="row"> 525 <div class="col-12 pt-3" id="ratings"> 526 @inherits Co3.Espresso.Website.TemplateBases.Paragraphs.Module 527528 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating1FullQuote.Value"))) 529 { 530531 <div class="p-3 bg-secondary"> 532 <h2 class="text-center">@Translate("eCom Product - Anmeldelser - Heading", "Anmeldelser")</h2> 533534 <div class="row"> 535 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating1FullQuote.Value"))) 536 { 537 <div class="col-12 col-lg-4 mb-2"> 538 <div class="row"> 539 <span class="font-weight-bold w-100">@GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating1By.Value")</span> 540 @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating1FullQuote.Value") 541 </div> 542 </div> 543 } 544 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating2FullQuote.Value"))) 545 { 546 <div class="col-12 col-lg-4 mb-2"> 547 <div class="row"> 548 <span class="font-weight-bold w-100">@GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating2By.Value")</span> 549 @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating2FullQuote.Value") 550 </div> 551 </div> 552 } 553 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating3FullQuote.Value"))) 554 { 555 <div class="col-12 col-lg-4 mb-2"> 556 <div class="row"> 557 <span class="font-weight-bold w-100">@GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating3By.Value")</span> 558 @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating3FullQuote.Value") 559 </div> 560 </div> 561 } 562 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating4FullQuote.Value"))) 563 { 564 <div class="col-12 col-lg-4 mb-2"> 565 <div class="row"> 566 <span class="font-weight-bold w-100">@GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating4By.Value")</span> 567 @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating4FullQuote.Value") 568 </div> 569 </div> 570 } 571 @if (!string.IsNullOrEmpty(GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating5FullQuote.Value"))) 572 { 573 <div class="col-12 col-lg-4 mb-2"> 574 <div class="row"> 575 <div class="col-12"> 576 <span class="font-weight-bold w-100">@GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating5By.Value")</span> 577 @GetString("Ecom:Product.CategoryField.JuulsBeveragesCategory.JuulsRating5FullQuote.Value") 578 </div> 579 </div> 580 </div> 581 } 582 </div> 583 </div> 584 } 585 </div> 586 </div> 587 </div> 588 } 589590 <div class="d-lg-none col-lg-12 mt-2"> 591 <div class="border border d-flex flex-fill p-3 flex-column mb-2"> 592593 <div class="align-items-baseline d-flex justify-content-between"> 594 <div class="d-flex align-items-center"> 595 @if (espressoProduct.Stock.Quantity > 0) 596 { 597 <span class="bg-success product-stock-status">&nbsp;</span> 598 @espressoProduct.Stock.State 599 } 600 else 601 { 602 <span class="bg-danger product-stock-status">&nbsp;</span> 603 @espressoProduct.Stock.State 604 } 605 </div> 606 <p class="e-product-price h2 mb-0 mt-0"> 607 @espressoProduct.Price.Formatted 608 </p> 609 </div> 610611 @if (espressoProduct.IsStoreOnly == false) 612 { 613 if (espressoProduct.Stock.Quantity > 0) 614 { 615 @RenderingService.Instance.PartialView("ecom/product/partials/add-to-cart.cshtml", espressoProduct) 616 } 617 else 618 { 619 <hr> 620 } 621 } 622 else 623 { 624 if (PageView.Current().Area.Item["EcommerceProductPageEmailForm"] != null) 625 { 626 <a class="btn btn-success btn-block text-white mt-2" data-toggle="modal" href="#productPageEmailModal" role="button"> 627 <i class="material-icons ">email</i>@Translate("eCom Product - Contact if you are interested - Button", "Kontakt ved interesse") 628 </a> 629 } 630 } 631632633 <div class="e-product-delivery mt-2 text-heading flex-row"> 634 @RenderingService.Instance.PartialView("ecom/product/partials/delivery-info.cshtml", espressoProduct) 635636637638 </div> 639640641 </div> 642 </div> 643644 @RenderingService.Instance.SectionEnd() 645646 @if (Co3.Juuls.Website.Frontend.Settings.RelewiseSettings.ShowRecommendations) 647 { 648 @RenderingService.Instance.PartialView("ecom/product/partials/relewise-recommendations-also-seen.cshtml", espressoProduct) 649 @RenderingService.Instance.PartialView("ecom/product/partials/relewise-recommendations-bought-with.cshtml", espressoProduct) 650651 } 652653 @RenderingService.Instance.SectionEnd() 654 @if (espressoProduct.RelatedGroups.ContainsKey("RELGRP5") && espressoProduct.RelatedGroups["RELGRP5"].Products.Any()) 655 { 656 @RenderingService.Instance.SectionStart(new SectionSettings 657 { 658 Classes = new ClassList("e-section"), 659 ContentClasses = new ClassList("col-12 py-4 bg-white"), 660 ContainerClasses = new ClassList("container-fluid px-3"), 661 }) 662 @RenderingService.Instance.PartialView("ecom/product/partials/related-products.cshtml", espressoProduct.RelatedGroups["RELGRP5"]) 663 @RenderingService.Instance.SectionEnd() 664 } 665666667 @RenderingService.Instance.PartialView("ecom/product/partials/metadata.cshtml", espressoProduct) 668 @RenderingService.Instance.PartialView("ecom/product/partials/gtm-tracking.cshtml", espressoProduct) 669670 <code class="js-e-breadcrumb-item-append" data-link="@HttpUtility.HtmlAttributeEncode(espressoProduct.Link)" data-text="@HttpUtility.HtmlAttributeEncode(espressoProduct.Name)"></code> 671672 <script> 673 e4.data.set( '@(espressoProduct.Id)_VariantCombinationTree', JSON.parse('@HttpUtility.JavaScriptStringEncode(JsonService.Instance.ToJson(espressoProduct.VariantCombinationTree))') ); 674 e4.data.set( '@(espressoProduct.Id)_VariantCombinationIds', JSON.parse('@HttpUtility.JavaScriptStringEncode(JsonService.Instance.ToJson(espressoProduct.VariantCombinations.Keys))') ); 675 </script> 676677 </div> 678 @RenderingService.Instance.SectionStart(new SectionSettings()) 679680681 <div class="modal fade juuls-form-container" id="productPageEmailModal" tabindex="-1" role="dialog" aria-labelledby="productPageEmailModalLabel" aria-hidden="true"> 682 <div class="modal-dialog" role="document"> 683 <div class="modal-content"> 684 <div class="modal-header"> 685 <h5 class="modal-title" id="productPageEmailModalLabel">@Translate("eCom Product - Kontakt ved interesse - Button", "Kontakt ved interesse")</h5> 686 <button type="button" class="close" data-dismiss="modal" aria-label="Close"> 687 <span aria-hidden="true">&times;</span> 688 </button> 689 </div> 690 <div class="modal-body justify-content-center d-flex py-6 flex-column align-self-center align-items-center"> 691 <h2>@Translate("eCom Product - Kontakt ved interesse - Text", "Er du interesseret i dette produkt?")</h2> 692 @RenderParagraphContent(int.Parse(PageView.Current().Area.Item["EcommerceProductPageEmailForm"].ToString())) 693 <p class="js-e-msg js-e-msg-success fade collapse text-success mx-auto m-0 mr-1"> 694 @Translate("eCom Product - Form Submit Success - Text", "Tak for din mail - Du hører fra os hurtigst muligt") 695 </p> 696 </div> 697 </div> 698 </div> 699 </div> 700701702 <div class="modal fade juuls-form-container" id="productPageStoreModal" tabindex="-1" role="dialog" aria-labelledby="productPageStoreModalLabel" aria-hidden="true"> 703 <div class="modal-dialog" role="document" style="max-width: 92vw;"> 704 <div class="modal-content"> 705 <button type="button" class="close" data-dismiss="modal" aria-label="Close"> 706 <span aria-hidden="true">&times;</span> 707 </button> 708 <div class="row p-3"> 709 @RenderPageContent(int.Parse("5754")) 710 </div> 711 </div> 712 </div> 713 </div> 714 @RenderingService.Instance.PartialView("ecom/product/partials/juuls-pdf-price-modal.cshtml", espressoProduct) 715716717718 <script type="text/javascript"> 719 @{ 720 string baseUrl = HttpContext.Current.Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Host; 721 } 722 var _learnq = _learnq || []; 723 var item = { 724 "ProductName": "@espressoProduct.Name", 725 "ProductID": "@espressoProduct.Id", 726 "SKU": "@espressoProduct.Number", 727 "Categories": "@espressoProduct.PrimaryGroup.Name", 728 "ImageURL": "@(string.Format("{0}{1}", baseUrl, espressoProduct.ImagePrimary.Medium))", 729 "URL": "@(string.Format("{0}{1}", baseUrl, espressoProduct.Link))", 730 "Brand": "@espressoProduct.JuulsProdName", 731 "Price": @espressoProduct.Price.Value.ToString("f", System.Globalization.CultureInfo.InvariantCulture), 732 }; 733 _learnq.push(["track", "Viewed Product", item]); 734 </script> 735736737 @SnippetStart("EcomCanonical") 738 <link rel="canonical" href="@($"{Dynamicweb.Context.Current.Request.Url.Scheme}://{Dynamicweb.Context.Current.Request.Url.Host}{PageView.Current().SearchFriendlyUrl}")"> 739 @SnippetEnd("EcomCanonical")