Error executing template "Designs/Swift/Paragraph/Swift_ProductGroupList.cshtml"
System.ArgumentException: An item with the same key has already been added.
   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at Dynamicweb.Ecommerce.Products.GroupRelation.GetGroupRelationsByChildId(String childId)
   at Dynamicweb.Ecommerce.Products.Group.get_IsTopGroup()
   at Dynamicweb.Ecommerce.Shops.Shop.GetTopLevelGroups(String languageId)
   at Dynamicweb.Ecommerce.Frontend.Navigation.GroupNavigationTreeNodeProvider.GetGroupsBySettings(PageNavigationSettings ecomSettings)
   at Dynamicweb.Ecommerce.Frontend.Navigation.GroupNavigationTreeNodeProvider.GetGroups(NavigationTreeNode parent, Page page)
   at Dynamicweb.Ecommerce.Frontend.Navigation.GroupNavigationTreeNodeProvider.GetNodes(NavigationContext context, NavigationSettings settings, NavigationTreeNode parent)
   at System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext()
   at System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.Count[TSource](IEnumerable`1 source)
   at CompiledRazorTemplates.Dynamic.RazorEngine_bf78176c3f184feb9d9e3f8c615371b4.Execute() in F:\Domains\Sites\uat-hager.mydwsite.com\Files\Templates\Designs\Swift\Paragraph\Swift_ProductGroupList.cshtml:line 16
   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 Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel> 2 @using Dynamicweb.Rendering 3 @using Dynamicweb.Frontend.Navigation 4 @using Dynamicweb.Ecommerce.Products 5 @using Dynamicweb.Ecommerce.ProductCatalog 6 @using System.IO 7 8 @{ 9 var navigationSettings = new NavigationSettings(); 10 navigationSettings.StartLevel = 3; 11 navigationSettings.Parameters.Add("menu-id", "product-group-list"); 12 13 var navigationViewModel = Navigation.GetNavigationViewModel(navigationSettings); 14 } 15 16 @if (navigationViewModel.Nodes.Count() > 0) 17 { 18 if (Pageview.IsVisualEditorMode) 19 { 20 <div class="alert alert-dark m-0" role="alert"> 21 <span><i class="fas fa-info-circle mr-3"></i></span> <span>@Translate("Group list: The selected groups will be shown here, if any")</span> 22 </div> 23 }else{ 24 @GetNodes(navigationViewModel.Nodes) 25 } 26 } 27 else if (Pageview.IsVisualEditorMode) 28 { 29 <div class="alert alert-dark m-0" role="alert"> 30 <span><i class="fas fa-info-circle mr-3"></i></span> <span>@Translate("Group list: The selected groups will be shown here, if any")</span> 31 </div> 32 } 33 34 @helper GetNodes(IEnumerable<Dynamicweb.Frontend.Navigation.NavigationTreeNodeViewModel> nodes) 35 { 36 foreach (var node in nodes) 37 { 38 if (node.IsActive) 39 { 40 if (node.Nodes.Count() > 0) 41 { 42 @RenderNodes(node.Nodes) 43 } 44 } 45 else 46 { 47 if (node.Nodes.Count() > 0) 48 { 49 @GetNodes(node.Nodes) 50 } 51 } 52 } 53 } 54 55 @helper RenderNodes(IEnumerable<Dynamicweb.Frontend.Navigation.NavigationTreeNodeViewModel> nodes) 56 { 57 string layout = Model.Item.GetRawValueString("Layout", "text-bottom"); 58 59 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : ""; 60 string groupTheme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("GroupTheme")) ? " theme " + Model.Item.GetRawValueString("GroupTheme").Replace(" ", "").Trim().ToLower() : ""; 61 62 string horizontalAlignment = Model.Item.GetRawValueString("HorizontalAlignment", "start"); 63 64 switch (horizontalAlignment) 65 { 66 case "start": 67 horizontalAlignment = " justify-content-start"; 68 break; 69 case "center": 70 horizontalAlignment = " justify-content-center"; 71 break; 72 case "end": 73 horizontalAlignment = " justify-content-end"; 74 break; 75 } 76 77 string ratio = Model.Item.GetRawValueString("ImageAspectRatio", "0"); 78 string ratioCssClass = ratio != "0" ? " ratio" : string.Empty; 79 string ratioVariable = ratio != "0" ? "style=\"--bs-aspect-ratio: " + ratio + "\"" : string.Empty; 80 81 int groupsCount = 0; 82 83 foreach (var node in nodes) 84 { 85 IList<FieldValueViewModel> groupFields = node.GetProductGroup().GroupFields; 86 87 if (groupFields != null) 88 { 89 foreach (FieldValueViewModel field in groupFields) 90 { 91 if (field.SystemName == "SelectedGroup" && !string.IsNullOrEmpty(field.Value.ToString())) 92 { 93 if (Convert.ToBoolean(field.Value.ToString())) 94 { 95 groupsCount++; 96 } 97 } 98 } 99 } 100 } 101 102 if (groupsCount != 0) 103 { 104 string paddingClass = !string.IsNullOrEmpty(theme) ? " p-3" : " pb-2 pb-lg-0"; 105 106 if (layout != "pill-button") 107 { 108 109 <nav class="swiffy-slider slider-item-reveal slider-item-nosnap slider-item-show6 slider-nav-round@(paddingClass)@(theme)" style="--swiffy-slider-item-count: 10;" aria-label="@Translate("Product groups")"> 110 <ul class="slider-container @horizontalAlignment"> 111 @foreach (var node in nodes) 112 { 113 string groupImage = ""; 114 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(node.GroupId); 115 IList<FieldValueViewModel> groupFields = node.GetProductGroup().GroupFields; 116 117 if (!string.IsNullOrEmpty(node.GroupId)) 118 { 119 groupImage = !string.IsNullOrEmpty(group.LargeImage) ? "/Files" + group.LargeImage : groupImage; 120 } 121 122 bool showGroup = false; 123 124 if (groupFields != null) 125 { 126 foreach (FieldValueViewModel field in groupFields) 127 { 128 if (field.SystemName == "SelectedGroup" && !string.IsNullOrEmpty(field.Value.ToString())) 129 { 130 if (Convert.ToBoolean(field.Value.ToString())) 131 { 132 showGroup = true; 133 } 134 } 135 } 136 } 137 138 if (showGroup) 139 { 140 string imageRoundedPill = layout == "ball" ? " rounded-pill" : string.Empty; 141 142 <li class="@groupTheme@(string.IsNullOrWhiteSpace(groupImage) && (layout == "ball") ? imageRoundedPill + " overflow-hidden": string.Empty)"> 143 <a href="@node.Link" tabindex="-1" class="text-decoration-none"> 144 145 @if (layout == "text-bottom" || layout == "ball") 146 { 147 148 <div class="d-flex flex-column justify-content-center align-items-center h-100"> 149 @if (!string.IsNullOrWhiteSpace(groupImage)) 150 { 151 152 <div class="@ratioCssClass" @ratioVariable> 153 <img loading="lazy" src="/Admin/Public/GetImage.ashx?width=640&crop=0&image=@groupImage" class="overflow-hidden@(imageRoundedPill) img-fluid image-zoom-lg-2-hover" style="object-fit: cover" alt="@node.Name"> 154 </div> 155 } 156 157 <div class="@(ratioCssClass)" @ratioVariable> 158 <div class="d-flex flex-column align-items-center justify-content-center fs-7 text-center p-2"> 159 @node.Name 160 </div> 161 </div> 162 </div> 163 } 164 165 @if (layout == "poster") 166 { 167 <div class="d-flex flex-column justify-content-center align-items-center h-100 position-relative"> 168 @if (!string.IsNullOrWhiteSpace(groupImage)) 169 { 170 <div class="@(ratioCssClass)" @ratioVariable> 171 <img loading="lazy" src="/Admin/Public/GetImage.ashx?width=640&crop=0&image=@groupImage" class="img-fluid image-zoom-lg-2-hover" style="object-fit: cover" alt="@node.Name"> 172 </div> 173 <div class="position-absolute text-center fs-5"> 174 @node.Name 175 </div> 176 } 177 else 178 { 179 <div class="@(ratioCssClass)" @ratioVariable> 180 <div class="d-flex flex-column align-items-center justify-content-center text-center fs-5 p-2"> 181 @node.Name 182 </div> 183 </div> 184 } 185 </div> 186 } 187 </a> 188 </li> 189 } 190 } 191 </ul> 192 193 194 @if (groupsCount > 10) 195 { 196 <button type="button" title="Slide to previous" class="slider-nav"></button> 197 <button type="button" title="Slide to next" class="slider-nav slider-nav-next"></button> 198 } 199 200 <script type="module" src="/Files/Templates/Designs/Swift/Assets/js/swiffy-slider.js"></script> 201 <script type="module"> 202 swift.AssetLoader.Load('/Files/Templates/Designs/Swift/Assets/css/swiffy-slider.min.css', 'css'); 203 document.addEventListener('load.swift.assetloader', function () { 204 swiffyslider.init() 205 }); 206 </script> 207 </nav> 208 } 209 else 210 { 211 <nav class="d-flex flex-wrap gap-3 align-items-center @horizontalAlignment overflow-x-auto@(paddingClass)@(theme)" aria-label="@Translate("Product groups")"> 212 @foreach (var node in nodes) 213 { 214 string groupImage = ""; 215 IList<FieldValueViewModel> groupFields = node.GetProductGroup().GroupFields; 216 217 if (layout == "pill-button" && groupFields != null) 218 { 219 foreach (FieldValueViewModel field in groupFields) 220 { 221 if (field.SystemName == "ProductGroupNavigationImage" && !string.IsNullOrEmpty(field.Value.ToString())) 222 { 223 groupImage = "/Files/Images/" + field.Value.ToString(); 224 } 225 } 226 } 227 228 bool showGroup = false; 229 if (groupFields != null) 230 { 231 foreach (FieldValueViewModel field in groupFields) 232 { 233 if (field.SystemName == "SelectedGroup" && !string.IsNullOrEmpty(field.Value.ToString())) 234 { 235 if (Convert.ToBoolean(field.Value.ToString())) 236 { 237 showGroup = true; 238 } 239 } 240 } 241 } 242 243 if (showGroup) 244 { 245 <a href="@node.Link" tabindex="-1" class="btn btn-secondary rounded-pill @(@groupTheme)"> 246 <div class="d-flex flex-row align-items-center"> 247 @if (!string.IsNullOrWhiteSpace(groupImage)) 248 { 249 if (Path.GetExtension(groupImage).ToLower() == ".svg") 250 { 251 <div class="icon-3 me-2" style="width: 35px"> 252 @ReadFile(groupImage) 253 </div> 254 } 255 else 256 { 257 <div class="me-3" style="width: 35px"> 258 <div class="@ratioCssClass" @(ratioVariable)> 259 <img loading="lazy" src="/Admin/Public/GetImage.ashx?width=35&crop=0&image=@groupImage" style="object-fit: cover" alt=""> 260 </div> 261 </div> 262 } 263 } 264 <div class="fs-7 text-center text-nowrap"> 265 @node.Name 266 </div> 267 </div> 268 </a> 269 } 270 } 271 </nav> 272 } 273 } 274 } 275 276 277

5100 Series Closer Replacement Parts and Accessories

Navigation

31 out of 31 products
By clicking 'Accept All' you consent that we may collect information about you for various purposes, including: Functionality, Statistics and Marketing