1 @inherits Co3.Espresso.Website.TemplateBases.Paragraphs.Module 2 @using System.Activities.Expressions 3 @using System.Dynamic 4 @using System.Security.Cryptography.X509Certificates 5 @using System.Web 6 @using System.Web.Services.Description 7 @using Co3.Espresso.Website.Services 8 @using Co3.Espresso.Website.Models.FrontEnd 9 @using Co3.Espresso.Website.Models.FrontEnd.Settings 10 @using Co3.Espresso.Website.Models.FrontEnd.Ecommerce 11 @using Co3.Espresso.Website.Models.FrontEnd.Handlebars 12 @using Dynamicweb.Rendering 13 @using Dynamicweb.Security.UserManagement 14 @using Co3.Tvilum.Website.Models.Frontend.Ecommerce 15 @using Dynamicweb.Content 16 @using Dynamicweb.DataIntegration.Providers.DynamicwebViewProvider 17 @using Dynamicweb.Ecommerce 18 @using Dynamicweb.Ecommerce.Common 19 @using Dynamicweb.Ecommerce.Products 20 @using Dynamicweb.Ecommerce.Products.Categories 21 @using Dynamicweb.Ecommerce.Products.FieldDisplayGroups 22 @using Dynamicweb.Frontend 23 @using Dynamicweb.Rendering.Translation 24 @using ParagraphService = Dynamicweb.Content.ParagraphService 25 @using ProductService = Co3.Espresso.Website.Services.ProductService 26 @using Co3.Tvilum.Utilities.Extensions 27 @using Dynamicweb.Core 28 29 @{ 30 int phase = 1; 31 bool isUserAuthenticated = User.IsExtranetUserLoggedIn(); 32 isUserAuthenticated = true; 33 TvilumProduct espressoProduct = ( TvilumProduct ) ProductService.Instance.GetEspressoProduct( 34 new ProductSettings() 35 { 36 Id = GetString( "Ecom:Product.ID" ), 37 VariantId = GetString( "Ecom:Product.VariantID" ), 38 PrimaryVariantId = GetString( "Ecom:Product.DefaultVariantComboID" ) 39 } 40 ); 41 42 // ADD CUSTOM CANONICAL 43 string eComProductCanonical = string.Empty; 44 string globalValueUrl = GetGlobalValue( "Global:Pageview.Url" ); 45 if ( GetGlobalValue( "Global:Pageview.Url" ).IndexOf( "?" ) > -1 ) 46 { 47 globalValueUrl = GetGlobalValue( "Global:Pageview.Url" ).Substring( 0, GetGlobalValue( "Global:Pageview.Url" ).IndexOf( "?" ) ); 48 eComProductCanonical = String.Format( "{0}", globalValueUrl ); 49 Pageview.Meta.AddTag( "customCan", string.Format( "<link rel=\"canonical\" href=\"{0}\" />", eComProductCanonical ) ); 50 } 51 52 int EcommerceProductBannerPageID = 0; 53 int.TryParse( PageView.Current().Area.Item[ "EcommerceProductBannerPage" ]?.ToString(), out EcommerceProductBannerPageID ); 54 55 string cssClassBannerColumns = string.Empty; 56 List< Paragraph > bannerParagraphs = new List< Paragraph >(); 57 ParagraphService paragraphService = new ParagraphService(); 58 Paragraph seriePrimaryRoomParagraph = null; 59 Paragraph serieParagraph = null; 60 Paragraph furnitureTypeParagraph = null; 61 62 if ( EcommerceProductBannerPageID > 0 ) 63 { 64 string primaryRoom = espressoProduct.PrimaryRoom; 65 string serie = espressoProduct.Serie; 66 string furnitureType = espressoProduct.FurnitureType; 67 68 IEnumerable< Paragraph > paragraphs = paragraphService.GetParagraphsByPageId( EcommerceProductBannerPageID ).Where(p => p.ShowParagraph); 69 foreach ( Paragraph paragraph in paragraphs ) 70 { 71 if ( paragraph.Item[ "Serie" ]?.ToString() == serie && paragraph.Item[ "PrimaryRoom" ]?.ToString() == primaryRoom ) 72 { 73 seriePrimaryRoomParagraph = paragraph; 74 } 75 76 if ( paragraph.Item[ "Serie" ]?.ToString() == serie ) 77 { 78 serieParagraph = paragraph; 79 } 80 81 if ( furnitureTypeParagraph == null && paragraph.Item[ "FurnitureType" ]?.ToString() == furnitureType ) 82 { 83 furnitureTypeParagraph = paragraph; 84 } 85 86 if ( seriePrimaryRoomParagraph != null && furnitureTypeParagraph != null && serieParagraph != null ) 87 { 88 break; 89 } 90 } 91 92 if ( seriePrimaryRoomParagraph == null ) 93 { 94 seriePrimaryRoomParagraph = serieParagraph; 95 } 96 97 if ( seriePrimaryRoomParagraph != null ) 98 { 99 bannerParagraphs.Add( seriePrimaryRoomParagraph );100 }101102 if ( furnitureTypeParagraph != null )103 {104 bannerParagraphs.Add( furnitureTypeParagraph );105 }106107 if ( bannerParagraphs.Count() == 2 )108 {109 cssClassBannerColumns = "col-lg-6 col-xl-6";110 }111112 }113114 string jsDataPropertyPath = espressoProduct.Id;115116 // TODO: En eller anden skriv en kommentar om at følgende skal udkommenteres hvis man ikke skal bruge dem.117 espressoProduct.RelatedGroups.Add( espressoProduct.CustomersWhoBoughtThisItemAlsoBought.Id, espressoProduct.CustomersWhoBoughtThisItemAlsoBought );118119 // Related group IDs in order of template output120 string[] relatedGroupIds =121 {122 "RELGRP5",123 "CustomersWhoBoughtThisItemAlsoBought",124 "RELGRP4"125 };126 }127128 @RenderingService.Instance.SectionEnd()129130 <script> var jsonfeed = @JsonService.Instance.ToJson(espressoProduct);</script>131132 <div class="e-product js-e-product" data-product-id="@espressoProduct.Id" data-has-variants="@espressoProduct.HasVariants.ToString().ToLower()" data-variant-id="@espressoProduct.VariantId">133134 @RenderingService.Instance.SectionStart( new SectionSettings135 {136 Classes = new ClassList( "e-section pb-2" )137 } )138139 <div class="col-12">140 <div class="row">141 <div class="align-self-center col-12 col-lg-6 col-md-8">142 <div class="e-product-text-container">143 <div class="mb-1 row">144 <div class="col-6">145 <p class="mb-0 small js-e-product-number">146 @espressoProduct.Number147 </p>148 </div>149150 @if ( isUserAuthenticated )151 {152153 <div class="col-6 text-right">154 @RenderingService.Instance.PartialView( "ecom/product/partials/tvilum-add-to-favorites.cshtml", espressoProduct )155 </div>156 }157 </div>158159 <h1 class="e-product-name mt-0 js-e-product-name">160 @espressoProduct.Name@* - @espressoProduct.TvilumColourNames.Replace(",", " / ")*@161 </h1>162163 <div class="e-product-text mb-2 small">164 <ul>165 @foreach ( FieldDisplayGroupItem ksp in espressoProduct.Ksps )166 {167 <li>@ksp.Value</li>168 }169 </ul>170 @if ( !string.IsNullOrEmpty( espressoProduct.DescriptionShort ) )171 {172 <p>@espressoProduct.DescriptionShort</p>173 }174 @if ( !string.IsNullOrEmpty( espressoProduct.DescriptionLong ) )175 {176 <p>@espressoProduct.DescriptionLong</p>177 }178 </div>179180 @if ( isUserAuthenticated && phase > 1 )181 {182 <div class="bg-light col-12 my-3 pb-1 pt-2 px-2 small">183 <div class="row">184 <div class="col-12 col-lg-6 pr-lg-4">185 <span class="text-black font-heading">@Translate("eCom Product - Unit price - Label", "Stykpris")</span>186 <div class="d-flex mt-1 w-100">187 <span class="mb-1 w-50">9.995 dkk / stk</span>188 <span class="mb-1 text-right w-50">v. 1 stk</span>189 </div>190 <div class="d-flex w-100">191 <span class="mb-1 w-50">9.495 dkk / stk</span>192 <span class="mb-1 text-right w-50">v. 5 stk</span>193 </div>194 </div>195 <div class="col-12 col-lg-6 mt-2 mt-lg-0">196 <span class="text-black font-heading">Pallepris</span>197 <div class="d-flex mt-1 w-100">198 <span class="mb-1 w-50">8.995 dkk / stk</span>199 <span class="mb-1 text-right w-50">pr. 10 stk (1 palle)</span>200 </div>201 <p class="small">@Translate("eCom Product - Unit price info - Text", "Gælder for antal svarende til en hel palle. Antal udover hele paller sælges til stykpriser.")</p>202 </div>203204 </div>205 </div>206 }207208 <div class="row">209 @if ( isUserAuthenticated && phase > 1 )210 {211 <div class="col-12 col-xl-5">212 <p class="e-product-price h2 mb-0 mt-0">213 @espressoProduct.Price.Format()214 </p>215 @RenderingService.Instance.PartialView( "ecom/product/partials/tvilum-delivery-info.cshtml", espressoProduct )216 </div>217 }218 <div class="col-12 col-xl-7">219 @RenderingService.Instance.PartialView( "ecom/product/partials/tvilum-add-to-cart.cshtml", espressoProduct )220 </div>221 </div>222223224 </div>225 </div>226 <div class="col-12 col-lg-6 col-md-4 order-first">227 @RenderingService.Instance.PartialView( "ecom/product/partials/tvilum-images.cshtml", espressoProduct )228 </div>229 </div>230 </div>231 @RenderingService.Instance.SectionEnd()232233 @{234 string jsonRelatedItemsSrc = espressoProduct.Id;235 string relatedItemsHandlebarsTemplateName = "product-related-items";236 HandlebarsProductListItemTemplate handlebarsProductListRelatedItemTemplate = HandlebarsService.Instance.GetProductListItemTemplate( new HandlebarsProductListItemTemplateSettings() );237238 <div class="js-e-jsonpublisher js-e-product-related-items-container" data-json-src="@jsonRelatedItemsSrc" data-template=".js-e-handlebars-tmpl-@relatedItemsHandlebarsTemplateName" data-template-helpers="counter">239 <script class="js-e-handlebars-tmpl-@relatedItemsHandlebarsTemplateName" type="text/x-handlebars-template">240 {{#if relatedItems}}241 @RenderingService.Instance.SectionStart( new SectionSettings242 {243 Classes = new ClassList( "e-section py-2 mb-6 bg-light" )244 } )245246 <div class="col-12">247 <div class="e-productlist-header">248 <p class="h2 text-left">@Translate( "eCom Product - RelatedItems - Heading", "Består af" )</p>249 </div>250 <div class="e-productlist-main">251 <div class="row">252 <div class="col-12">253 <div class="e-productlist custom-tvilum-productlist-details-margin">254 <div class="row justify-content-center">255 {{#each relatedItems}}256 @RenderingService.Instance.PartialView( "ecom/productlist/partials/item.cshtml", handlebarsProductListRelatedItemTemplate )257 {{/each}}258 </div>259 </div>260 </div>261 </div>262 </div>263 </div>264 @RenderingService.Instance.SectionEnd()265 {{/if}}266 </script>267 </div>268 }269270 @if ( !string.IsNullOrEmpty( espressoProduct.DescriptionLong ) )271 {272 @RenderingService.Instance.SectionStart( new SectionSettings273 {274 Classes = new ClassList( "e-section" ),275 ContentClasses = new ClassList( "col-12 col-md-10 col-lg-6 mx-auto is-lg" ),276 Collapsible = false277 } )278 <div class="col-12">279 <h2>@Translate("eCom Product - Description - Label", "Beskrivelse")</h2>280 @espressoProduct.DescriptionLong281 </div>282 @RenderingService.Instance.SectionEnd()283 }284285286 @RenderingService.Instance.SectionStart( new SectionSettings287 {288 Classes = new ClassList( "e-section mb-6" ),289 ContentClasses = new ClassList( "col-12 col-md-10 col-lg-6 mx-auto is-lg" ),290 Collapsible = false291 } )292293294 <div class="col-12 mt-4">295 <h2>@Translate("eCom Product - Specifications - Label", "Specifikationer")</h2>296 <div class="js-e-jsonpublisher js-tvilum-product-specifications-container" data-json-src="@espressoProduct.Id" data-template=".js-e-handlebars-tmpl-tvilum-product-specifications" data-template-helpers="counter">297 <script class="js-e-handlebars-tmpl-tvilum-product-specifications" type="text/x-handlebars-template">298 <table class="my-2 table tvilum-product-specifications">299 <tbody>300 {{#each PrimarySpecifications}}301 <tr>302 <th scope="row">{{{Label}}}</th>303 <td>{{{Value}}}</td>304 </tr>305 {{/each}}306 </tbody>307 </table>308 </script>309 </div>310 <button class="btn btn-primary mt-1 js-tvilum-product-specifications-btn" data-target="#tvilumSpecifications" data-toggle="modal" type="button">311 @Translate("eCom Product - See All Specifications - Label", "Se alle specifikationer")<span class="icon-large material-icons pl-3">launch</span>312 </button>313314 <!-- Modal -->315 <div aria-hidden="true" aria-labelledby="specifications" class="fade modal js-tvilum-product-specifications-modal tvilum-product-specifications-modal" data-productid="@espressoProduct.Id" data-variantid="@espressoProduct.VariantId" id="tvilumSpecifications" role="dialog" tabindex="-1">316 <div class="modal-dialog" role="document">317 <div class="modal-content">318 <div class="modal-header">319 <span class="tvilum-modal-heading-wrapper">320 <p class="h3 mb-0 text-muted">@Translate("eCom Product - All Specifications - Label", "Alle specifikationer")</p>321 <h2 class="modal-title mt-0" id="tvilumSpecificationsTitle">@espressoProduct.Name</h2>322 </span>323 <div class="e-search-input-group is-empty h-100 mx-lg-5">324 <input class="e-search-input form-control-plaintext" id="tvilum-product-details-search-input" name="q" placeholder="@Translate("eCom Product - Search for specification - Text", "Søg efter specifikation")" type="text">325 <span class="e-search-clear js-tvilum-product-details-search-clear"><i class="material-icons">close</i></span>326 <button id="tvilum-product-details-search-btn" class="btn e-search-submit m-0 py-0" type="submit">327 <i class="material-icons">search</i>328 </button>329 </div>330 <button aria-label="Close" class="close" data-dismiss="modal" type="button">331 <span aria-hidden="true">×</span>332 </button>333 </div>334 <div class="modal-body">335 <div class="e-loading-overlay js-e-loading-overlay">336 @RenderingService.Instance.PartialView( "_partials/loading-spinner.cshtml" )337 </div>338 <div class="container-fluid">339 <div class="row js-e-jsonpublisher js-tvilum-product-specifications-modal-container" data-json-src="@espressoProduct.Id" data-template=".js-e-handlebars-tmpl-tvilum-product-specifications-modal" data-template-helpers="counter compare">340 <script class="js-e-handlebars-tmpl-tvilum-product-specifications-modal" type="text/x-handlebars-template">341 {{#if groups.length}}342 <div class="col-4 col-lg-3 d-md-block d-none pl-0">343 <h3 class="text-muted">@Translate( "eCom Product - Select - Label", "Vælg" ):</h3>344 <ul class="tvilum-custom-product-details-modal-localmenu">345 {{#each groups}}346 <li {{#compare @@index '===' 0 }}class="active"{{/compare}}>347 <a href="#attributes-group-{{@@index}}" class="js-scroll-to-specifications">{{{name}}}</a>348 </li>349 {{/each}}350 </ul>351 </div>352353 <div class="col-12 col-lg-9 col-md-8 js-scroll-container scroll-container">354 <div class="row">355 <div class="col-12">356 {{#each groups}}357 {{log this}}358359 <h2 id="attributes-group-{{@@index}}">{{{name}}}</h2>360 <table class="mb-4 table tvilum-product-specifications">361 <tbody>362 {{#each fields}}363 <tr>364 <th scope="row">{{{label}}}</th>365 <td>{{{value}}}</td>366 </tr>367 {{/each}}368369 {{#compare subGroups.length '>' 0}}370 {{#each subGroups}}371 <tr>372 <th scope="row" class="h3 pt-2 border-0">{{{name}}}</th>373 <td class="border-0"></td>374 </tr>375 {{#each fields}}376 <tr>377 <th scope="row">{{{label}}}</th>378 <td>{{{value}}}</td>379 </tr>380 {{/each}}381 {{/each}}382 {{/compare}}383384 </tbody>385 </table>386 {{/each}}387 </div>388 </div>389 </div>390 {{else}}391 <p class="d-block my-3 text-center w-100">@Translate("eCom Product - Specifications no result - text", "Din søgning gav desværre ingen resultater...")</p>392 {{/if}}393 </script>394 </div>395 </div>396 </div>397 </div>398 </div>399 </div>400 </div>401 </div>402403 @RenderingService.Instance.SectionEnd()404405 @if ( espressoProduct.Downloads.Any() )406 {407 @RenderingService.Instance.SectionStart( new SectionSettings408 {409 Classes = new ClassList( "e-section mb-6" ),410 ContentClasses = new ClassList( "col-12 col-md-10 col-lg-6 mx-auto is-lg" ),411 Collapsible = false412 } )413 <div class="col-12">414 <h2>Downloads</h2>415 <ul class="small tvilum-product-specifications-download">416 @foreach ( FieldDisplayGroupItem download in espressoProduct.Downloads )417 {418 <li>419 <a target="_blank" href="@string.Format("//tvilum.com/files/files/tvilum/{0}.pdf", download.Value)"><span class="material-icons">get_app</span> @download.Label</a>420 </li>421 }422 </ul>423 </div>424 @RenderingService.Instance.SectionEnd()425 }426427 @{428 string jsonPrimaryComplementaryItemsSrc = espressoProduct.Id;429 string primaryComplementaryItemsHandlebarsTemplateName = "product-primary-complementary-items";430 HandlebarsProductListItemTemplate handlebarsProductListPrimaryComplementaryItemsTemplate = HandlebarsService.Instance.GetProductListItemTemplate( new HandlebarsProductListItemTemplateSettings() );431432 <div class="js-e-jsonpublisher js-e-product-primary-complementary-items-container" data-json-src="@jsonPrimaryComplementaryItemsSrc" data-template=".js-e-handlebars-tmpl-@primaryComplementaryItemsHandlebarsTemplateName" data-template-helpers="counter">433 <script class="js-e-handlebars-tmpl-@primaryComplementaryItemsHandlebarsTemplateName" type="text/x-handlebars-template">434 {{#if primaryComplementaryItems}}435 @RenderingService.Instance.SectionStart( new SectionSettings436 {437 Classes = new ClassList( "e-section py-3 bg-light" )438 } )439440 <div class="col-12">441 <div class="e-productlist-header">442 <p class="h2 text-left">@Translate( "eCom Product - PrimaryComplementaryItems - Heading", "Tilbehør" )</p>443 </div>444 <div class="e-productlist-main">445 <div class="row">446 <div class="col-12">447 <div class="e-productlist custom-tvilum-productlist-details-margin">448 <div class="row justify-content-center">449 {{#each primaryComplementaryItems}}450 @RenderingService.Instance.PartialView( "ecom/productlist/partials/item.cshtml", handlebarsProductListPrimaryComplementaryItemsTemplate )451 {{/each}}452 </div>453 </div>454 </div>455 </div>456 </div>457 </div>458 @RenderingService.Instance.SectionEnd()459 {{/if}}460461 </script>462 </div>463 }464465466 @{467 string jsonSecondaryComplementaryItemsSrc = espressoProduct.Id;468 string secondaryComplementaryItemsHandlebarsTemplateName = "product-secondary-complementary-items";469 HandlebarsProductListItemTemplate handlebarsProductListSecondaryComplementaryItemsTemplate = HandlebarsService.Instance.GetProductListItemTemplate( new HandlebarsProductListItemTemplateSettings() );470 <div class="js-e-jsonpublisher js-e-product-secondary-complementary-items-container" data-json-src="@jsonSecondaryComplementaryItemsSrc" data-template=".js-e-handlebars-tmpl-@secondaryComplementaryItemsHandlebarsTemplateName" data-template-helpers="counter">471 <script class="js-e-handlebars-tmpl-@secondaryComplementaryItemsHandlebarsTemplateName" type="text/x-handlebars-template">472 {{#if secondaryComplementaryItems}}473 @RenderingService.Instance.SectionStart( new SectionSettings474 {475 Classes = new ClassList( "e-section py-3" )476 } )477478 <div class="col-12">479 <div class="e-productlist-header">480 <p class="h2 text-left">@Translate( "eCom Product - SecondaryComplementaryItems - Heading", "Passer til" )</p>481 </div>482 <div class="e-productlist-main">483 <div class="row">484 <div class="col-12">485 <div class="e-productlist custom-tvilum-productlist-details-margin">486 <div class="row justify-content-center">487 {{#each secondaryComplementaryItems}}488 @RenderingService.Instance.PartialView( "ecom/productlist/partials/item.cshtml", handlebarsProductListSecondaryComplementaryItemsTemplate )489 {{/each}}490 </div>491 </div>492 </div>493 </div>494 </div>495 </div>496 @RenderingService.Instance.SectionEnd()497 {{/if}}498499 </script>500 </div>501 }502503 @if ( espressoProduct.RelatedGroups[ key: relatedGroupIds[ 1 ] ].Products.Any() )504 {505 HandlebarsProductListItemTemplate handlebarsProductListItemTemplate = HandlebarsService.Instance.GetProductListItemTemplate( new HandlebarsProductListItemTemplateSettings() );506 string handlebarsTemplateName = string.Format( "{0}-{1}-{2}", espressoProduct.Id, "related-group", espressoProduct.RelatedGroups[ key: relatedGroupIds[ 1 ] ].Id ).ToLower();507 string jsonSrc = string.Format( "{0}.{1}.{2}", jsDataPropertyPath, "relatedGroups", espressoProduct.RelatedGroups[ key: relatedGroupIds[ 1 ] ].Id );508509 @RenderingService.Instance.SectionStart( new SectionSettings510 {511 Classes = new ClassList( "e-section py-2 bg-light" )512 } )513 <div class="col-12">514 <div class="e-productlist js-e-jsonpublisher" data-json-src="@jsonSrc" data-json-src-prop="" data-json-template-prop="" data-json-item-count="4" data-json-item-count-prop="products" data-template=".js-e-handlebars-tmpl-@handlebarsTemplateName">515516 <script class="js-e-handlebars-tmpl-@handlebarsTemplateName" type="text/x-handlebars-template">517 <div class="e-productlist-header">518 <p class="h2 text-left">{{name}}</p>519 </div>520 <div class="e-productlist-main">521 <div class="row">522 <div class="col-12">523 <div class="e-productlist custom-tvilum-productlist-details-margin">524 {{#if products}}525 <div class="row justify-content-center">526 {{#each products}}527 @RenderingService.Instance.PartialView( "ecom/productlist/partials/item.cshtml", handlebarsProductListItemTemplate )528 {{/each}}529 </div>530 {{/if}}531 </div>532 </div>533 </div>534 </div>535 </script>536537 </div>538 </div>539 @RenderingService.Instance.SectionEnd()540 }541542543 @if ( espressoProduct.RelatedGroups.ContainsKey(relatedGroupIds[ 2 ]) )544 {545 if ( espressoProduct.RelatedGroups[ key: relatedGroupIds[ 2 ] ].Products.Any() )546 {547 HandlebarsProductListItemTemplate handlebarsProductListItemTemplate = HandlebarsService.Instance.GetProductListItemTemplate( new HandlebarsProductListItemTemplateSettings() );548 string handlebarsTemplateName = string.Format( "{0}-{1}-{2}", espressoProduct.Id, "related-group", espressoProduct.RelatedGroups[ key: relatedGroupIds[ 2 ] ].Id ).ToLower();549 string jsonSrc = string.Format( "{0}.{1}.{2}", jsDataPropertyPath, "relatedGroups", espressoProduct.RelatedGroups[ key: relatedGroupIds[ 2 ] ].Id );550551 @RenderingService.Instance.SectionStart( new SectionSettings552 {553 Classes = new ClassList( "e-section py-2" )554 } )555 <div class="col-12">556 <div class="e-productlist tvilum-custom-productlist js-e-jsonpublisher" data-json-src="@jsonSrc" data-json-src-prop="" data-json-template-prop="" data-json-item-count="4" data-json-item-count-prop="products" data-template=".js-e-handlebars-tmpl-@handlebarsTemplateName">557558 <script class="js-e-handlebars-tmpl-@handlebarsTemplateName" type="text/x-handlebars-template">559 <div class="e-productlist-header">560 <p class="h2 mb-2 text-left">{{name}}</p>561 </div>562 <div class="e-productlist-main">563 <div class="row">564 <div class="col-12">565 <div class="e-productlist custom-tvilum-productlist-details-margin">566 {{#if products}}567 <div class="row justify-content-center">568 {{#each products}}569 @RenderingService.Instance.PartialView( "ecom/productlist/partials/item.cshtml", handlebarsProductListItemTemplate )570 {{/each}}571 </div>572 {{/if}}573 </div>574 </div>575 </div>576 </div>577 </script>578579 </div>580 </div>581 @RenderingService.Instance.SectionEnd()582 }583 }584585586 <section class="e-section p p-0 p-section">587 <div class="container-fluid overflow-hidden px-0">588 <div class="no-gutters row">589590 @{591 foreach ( Paragraph bannerParagraph in bannerParagraphs )592 {593 string title = bannerParagraph.Item[ "Title" ]?.ToString();594 if ( string.IsNullOrEmpty( title ) )595 {596 title = bannerParagraph.Item[ "FurnitureType" ]?.ToString();597 }598 string linkText = bannerParagraph.Item[ "LinkText" ]?.ToString();599 string link = bannerParagraph.Item[ "Link" ]?.ToString();600 string image = string.Format( "/admin/public/getimage.ashx?Image={0}&Width=3840&Height=0&Format=jpg&Quality=75&Crop=0", bannerParagraph.Item[ "Image" ] );601602 <div class="p p-tile-height-sm p-tile p-tile-padding-bottom-30 e-block-link js-e-block-link e-theme-light p-tile-img p-tile-txt-medium p-tile-left-middle e-text-light col-12 col-sm-12 col-md-12 @cssClassBannerColumns">603 <div class="p-tile-container">604 <div class="p-img-container">605 <div class="bg-center-middle p-img" style="background-image: url('@image');" title=""></div>606 </div>607 <div class="p-txt-container">608 <div class="container-fluid">609 <div class="p-txt-wrapper row">610 <div class="col-xl-9">611 <h2 class="h1">@title</h2>612 @if ( !string.IsNullOrEmpty( link ) && !string.IsNullOrEmpty( linkText ) )613 {614 <p>615 <a class="btn btn-primary" href="@link">@linkText</a>616 </p>617 }618 </div>619 </div>620 </div>621 </div>622 </div>623 </div>624 }625 }626627 @RenderingService.Instance.SectionEnd()628629 @RenderingService.Instance.PartialView( "ecom/product/partials/metadata.cshtml", espressoProduct )630 @RenderingService.Instance.PartialView( "ecom/product/partials/gtm-tracking.cshtml", espressoProduct )631632 <code class="js-e-breadcrumb-item-append" data-text="@HttpUtility.HtmlAttributeEncode( espressoProduct.Name )" data-link="@HttpUtility.HtmlAttributeEncode( espressoProduct.Link )"></code>633634 <script>635 e4.data.set('@jsDataPropertyPath',636 JSON.parse('@HttpUtility.JavaScriptStringEncode( JsonService.Instance.ToJson( espressoProduct ) )'))637 </script>638639 </div>640 @RenderingService.Instance.SectionStart( new SectionSettings() )641