Error executing template "Designs/Rapido/_parsed/ContentPage.parsed.cshtml"
System.TypeInitializationException: The type initializer for 'Microsoft.CodeAnalysis.CSharp.CSDiagnosticInfo' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Microsoft.CodeAnalysis.CSharp.ErrorFacts' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Microsoft.CodeAnalysis.CommonMessageProvider' threw an exception. ---> System.TypeInitializationException: The type initializer for 'System.Collections.Generic.EqualityComparer`1' threw an exception. ---> System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Collections.Generic.EqualityComparer`1.CreateComparer()
at System.Collections.Generic.EqualityComparer`1..cctor()
--- End of inner exception stack trace ---
at System.Collections.Generic.EqualityComparer`1.get_Default()
at System.Collections.Concurrent.ConcurrentDictionary`2..ctor()
at Microsoft.CodeAnalysis.CommonMessageProvider..cctor()
--- End of inner exception stack trace ---
at Microsoft.CodeAnalysis.CommonMessageProvider.GetIdForErrorCode(Int32 errorCode)
at Microsoft.CodeAnalysis.CSharp.ErrorFacts.<.cctor>g__getId|5_0(ErrorCode errorCode)
at Microsoft.CodeAnalysis.CSharp.ErrorFacts..cctor()
--- End of inner exception stack trace ---
at Microsoft.CodeAnalysis.CSharp.ErrorFacts.GetSeverity(ErrorCode code)
at Microsoft.CodeAnalysis.CSharp.MessageProvider.GetSeverity(Int32 code)
at Microsoft.CodeAnalysis.CSharp.MessageProvider.CreateDiagnostic(Int32 code, Location location, Object[] args)
at Microsoft.CodeAnalysis.PortableExecutableReference.ExceptionToDiagnostic(Exception e, CommonMessageProvider messageProvider, Location location, String display, MetadataImageKind kind)
at Microsoft.CodeAnalysis.CommonReferenceManager`2.GetMetadata(PortableExecutableReference peReference, CommonMessageProvider messageProvider, Location location, DiagnosticBag diagnostics)
at Microsoft.CodeAnalysis.CommonReferenceManager`2.ResolveMetadataReferences(TCompilation compilation, Dictionary`2 assemblyReferencesBySimpleName, ImmutableArray`1& references, IDictionary`2& boundReferenceDirectiveMap, ImmutableArray`1& boundReferenceDirectives, ImmutableArray`1& assemblies, ImmutableArray`1& modules, DiagnosticBag diagnostics)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.ReferenceManager.CreateAndSetSourceAssemblyFullBind(CSharpCompilation compilation)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.ReferenceManager.CreateSourceAssemblyForCompilation(CSharpCompilation compilation)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.GetRuntimeMetadataVersion(EmitOptions emitOptions)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.GetRuntimeMetadataVersion(EmitOptions emitOptions, DiagnosticBag diagnostics)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CreateModuleBuilder(EmitOptions emitOptions, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, IEnumerable`1 manifestResources, CompilationTestData testData, DiagnosticBag diagnostics, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.CheckOptionsAndCreateModuleBuilder(DiagnosticBag diagnostics, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, CompilationTestData testData, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream metadataPEStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, CompilationTestData testData, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, Stream metadataPEStream, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, CancellationToken cancellationToken)
at RazorEngine.Roslyn.CSharp.RoslynCompilerServiceBase.CompileType(TypeContext context)
at RazorEngine.Templating.RazorEngineCore.CreateTemplateType(ITemplateSource razorTemplate, Type modelType)
at RazorEngine.Templating.RazorEngineCore.Compile(ITemplateKey key, Type modelType)
at RazorEngine.Templating.RazorEngineService.CompileAndCacheInternal(ITemplateKey key, Type modelType)
at RazorEngine.Templating.RazorEngineService.GetCompiledTemplate(ITemplateKey key, Type modelType, Boolean compileOnCacheMiss)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.DynamicWrapperService.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 RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()
--- End of inner exception stack trace ---
at Microsoft.CodeAnalysis.CSharp.Symbols.Metadata.PE.PENamedTypeSymbol..ctor(PEModuleSymbol moduleSymbol, NamespaceOrTypeSymbol container, TypeDefinitionHandle handle, String emittedNamespaceName, UInt16 arity, Boolean& mangleName)
at Microsoft.CodeAnalysis.CSharp.Symbols.Metadata.PE.PENamedTypeSymbol.Create(PEModuleSymbol moduleSymbol, PENamespaceSymbol containingNamespace, TypeDefinitionHandle handle, String emittedNamespaceName)
at Microsoft.CodeAnalysis.CSharp.Symbols.Metadata.PE.PENamespaceSymbol.LazyInitializeTypes(IEnumerable`1 typeGroups)
at Microsoft.CodeAnalysis.CSharp.Symbols.Metadata.PE.PENamespaceSymbol.LoadAllMembers(IEnumerable`1 typesByNS)
at Microsoft.CodeAnalysis.CSharp.Symbols.Metadata.PE.PEGlobalNamespaceSymbol.EnsureAllMembersLoaded()
at Microsoft.CodeAnalysis.CSharp.Symbols.Metadata.PE.PENamespaceSymbol.GetMembers(String name)
at Microsoft.CodeAnalysis.CSharp.Symbols.MergedNamespaceSymbol.SlowGetChildrenOfName(String name)
at Microsoft.CodeAnalysis.Collections.CachingDictionary`2.AddToConcurrentMap(ConcurrentDictionary`2 map, TKey key)
at Microsoft.CodeAnalysis.Collections.CachingDictionary`2.GetOrCreateValue(TKey key)
at Microsoft.CodeAnalysis.CSharp.Symbols.MergedNamespaceSymbol.GetMembers(String name)
at Microsoft.CodeAnalysis.CSharp.Binder.GetCandidateMembers(NamespaceOrTypeSymbol nsOrType, String name, LookupOptions options, Binder originalBinder)
at Microsoft.CodeAnalysis.CSharp.Binder.LookupMembersInNamespace(LookupResult result, NamespaceSymbol ns, String name, Int32 arity, LookupOptions options, Binder originalBinder, Boolean diagnose, HashSet`1& useSiteDiagnostics)
at Microsoft.CodeAnalysis.CSharp.Binder.LookupMembersInternal(LookupResult result, NamespaceOrTypeSymbol nsOrType, String name, Int32 arity, ConsList`1 basesBeingResolved, LookupOptions options, Binder originalBinder, Boolean diagnose, HashSet`1& useSiteDiagnostics)
at Microsoft.CodeAnalysis.CSharp.InContainerBinder.LookupSymbolsInSingleBinder(LookupResult result, String name, Int32 arity, ConsList`1 basesBeingResolved, LookupOptions options, Binder originalBinder, Boolean diagnose, HashSet`1& useSiteDiagnostics)
at Microsoft.CodeAnalysis.CSharp.Binder.LookupSymbolsInternal(LookupResult result, String name, Int32 arity, ConsList`1 basesBeingResolved, LookupOptions options, Boolean diagnose, HashSet`1& useSiteDiagnostics)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNonGenericSimpleNamespaceOrTypeOrAliasSymbol(IdentifierNameSyntax node, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved, Boolean suppressUseSiteDiagnostics, NamespaceOrTypeSymbol qualifierOpt)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNamespaceOrTypeOrAliasSymbol(ExpressionSyntax syntax, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved, Boolean suppressUseSiteDiagnostics)
at Microsoft.CodeAnalysis.CSharp.Binder.BindNamespaceOrTypeSymbol(ExpressionSyntax syntax, DiagnosticBag diagnostics, ConsList`1 basesBeingResolved, Boolean suppressUseSiteDiagnostics)
at Microsoft.CodeAnalysis.CSharp.Imports.FromGlobalUsings(CSharpCompilation compilation)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.BindGlobalImports()
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at System.Lazy`1.get_Value()
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.GetSourceDeclarationDiagnostics(SyntaxTree syntaxTree, Nullable`1 filterSpanWithinTree, Func`4 locationFilterOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.GetDiagnostics(CompilationStage stage, Boolean includeEarlierStages, DiagnosticBag diagnostics, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CompileMethods(CommonPEModuleBuilder moduleBuilder, Boolean emittingPdb, Boolean emitMetadataOnly, Boolean emitTestCoverageData, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream metadataPEStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, CompilationTestData testData, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, Stream metadataPEStream, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, CancellationToken cancellationToken)
at RazorEngine.Roslyn.CSharp.RoslynCompilerServiceBase.CompileType(TypeContext context)
at RazorEngine.Templating.RazorEngineCore.CreateTemplateType(ITemplateSource razorTemplate, Type modelType)
at RazorEngine.Templating.RazorEngineCore.Compile(ITemplateKey key, Type modelType)
at RazorEngine.Templating.RazorEngineService.CompileAndCacheInternal(ITemplateKey key, Type modelType)
at RazorEngine.Templating.RazorEngineService.GetCompiledTemplate(ITemplateKey key, Type modelType, Boolean compileOnCacheMiss)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.DynamicWrapperService.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 RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
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.PageViewModel>
2
3 @using System.Web;
4 @using Dynamicweb
5 @using Dynamicweb.Frontend
6 @using Dynamicweb.Frontend.Devices
7 @using Dynamicweb.Extensibility
8 @using Dynamicweb.Content
9 @using Dynamicweb.Security
10 @using Dynamicweb.Core
11 @using System
12 @using System.Web
13 @using System.IO
14 @using Dynamicweb.Rapido.Blocks
15 @using System.Net
16
17
18 @functions {
19 BlocksPage masterPage = BlocksPage.GetBlockPage("Master");
20
21 string getFontFamily(params string[] items)
22 {
23 var itemParent = Pageview.AreaSettings;
24 foreach (var item in items)
25 {
26 itemParent = itemParent.GetItem(item);
27 if (itemParent == null)
28 {
29 return null;
30 }
31 }
32
33 var googleFont = itemParent.GetGoogleFont("FontFamily");
34 if (googleFont == null)
35 {
36 return null;
37 }
38 return googleFont.Family.Replace(" ", "+");
39 }
40 }
41
42 @{
43 Block root = new Block
44 {
45 Id = "Root",
46 SortId = 10,
47 BlocksList = new List<Block>
48 {
49 new Block {
50 Id = "Head",
51 SortId = 10,
52 SkipRenderBlocksList = true,
53 Template = RenderMasterHead(),
54 BlocksList = new List<Block>
55 {
56 new Block {
57 Id = "HeadMetadata",
58 SortId = 10,
59 Template = RenderMasterMetadata(),
60 },
61 new Block {
62 Id = "HeadCss",
63 SortId = 20,
64 Template = RenderMasterCss(),
65 },
66 new Block {
67 Id = "HeadManifest",
68 SortId = 30,
69 Template = RenderMasterManifest(),
70 }
71 }
72 },
73 new Block {
74 Id = "Body",
75 SortId = 20,
76 SkipRenderBlocksList = true,
77 Template = RenderMasterBody(),
78 BlocksList = new List<Block>
79 {
80 new Block()
81 {
82 Id = "Master",
83 SortId = 10,
84 BlocksList = new List<Block> {
85 new Block {
86 Id = "MasterTopSnippets",
87 SortId = 10
88 },
89 new Block {
90 Id = "MasterMain",
91 SortId = 20,
92 Template = RenderMain(),
93 SkipRenderBlocksList = true,
94 BlocksList = new List<Block> {
95 new Block {
96 Id = "MasterHeader",
97 SortId = 10,
98 Template = RenderMasterHeader(),
99 SkipRenderBlocksList = true
100 },
101 new Block {
102 Id = "MasterPageContent",
103 SortId = 20,
104 Template = RenderPageContent()
105 }
106 }
107 },
108 new Block {
109 Id = "MasterFooter",
110 SortId = 30
111 },
112 new Block {
113 Id = "MasterReferences",
114 SortId = 40
115 },
116 new Block {
117 Id = "MasterBottomSnippets",
118 SortId = 50,
119 BlocksList = new List<Block> {
120 new Block {
121 Id = "iOsTabletFix",
122 SortId = 10,
123 Template = RenderIosTabletFix()
124 }
125 }
126 }
127 }
128 }
129 }
130 }
131 }
132 };
133
134 masterPage.Add(root);
135 }
136
137 @* Include the required Grid builder (Contains the methods @RenderBlockList and @RenderBlock) *@
138 @using System.Text.RegularExpressions
139 @using System.Collections.Generic
140 @using System.Reflection
141 @using System.Web
142 @using System.Web.UI.HtmlControls
143 @using Dynamicweb.Rapido.Blocks.Components
144 @using Dynamicweb.Rapido.Blocks.Components.Articles
145 @using Dynamicweb.Rapido.Blocks.Components.Documentation
146 @using Dynamicweb.Rapido.Blocks
147
148
149 @*--- START: Base block renderers ---*@
150
151 @helper RenderBlockList(List<Block> blocks)
152 {
153 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false;
154 blocks = blocks.OrderBy(item => item.SortId).ToList();
155
156 foreach (Block item in blocks)
157 {
158 if (debug) {
159 <!-- Block START: @item.Id -->
160 }
161
162 if (item.Design == null)
163 {
164 @RenderBlock(item)
165 }
166 else if (item.Design.RenderType == RenderType.None) {
167 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : "";
168
169 <div class="@cssClass dw-mod">
170 @RenderBlock(item)
171 </div>
172 }
173 else if (item.Design.RenderType != RenderType.Hide)
174 {
175 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : "";
176
177 if (!item.SkipRenderBlocksList) {
178 if (item.Design.RenderType == RenderType.Row)
179 {
180 <div class="grid grid--align-content-start @cssClass dw-mod" id="Block__@item.Id">
181 @RenderBlock(item)
182 </div>
183 }
184
185 if (item.Design.RenderType == RenderType.Column)
186 {
187 string hidePadding = item.Design.HidePadding ? "u-no-padding" : "";
188 string size = item.Design.Size ?? "12";
189 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size;
190
191 <div class="grid__col-lg-@item.Design.Size grid__col-md-@item.Design.Size grid__col-sm-12 grid__col-xs-12 @hidePadding @cssClass dw-mod" id="Block__@item.Id">
192 @RenderBlock(item)
193 </div>
194 }
195
196 if (item.Design.RenderType == RenderType.Table)
197 {
198 <table class="table @cssClass dw-mod" id="Block__@item.Id">
199 @RenderBlock(item)
200 </table>
201 }
202
203 if (item.Design.RenderType == RenderType.TableRow)
204 {
205 <tr class="@cssClass dw-mod" id="Block__@item.Id">
206 @RenderBlock(item)
207 </tr>
208 }
209
210 if (item.Design.RenderType == RenderType.TableColumn)
211 {
212 <td class="@cssClass dw-mod" id="Block__@item.Id">
213 @RenderBlock(item)
214 </td>
215 }
216
217 if (item.Design.RenderType == RenderType.CardHeader)
218 {
219 <div class="card-header @cssClass dw-mod">
220 @RenderBlock(item)
221 </div>
222 }
223
224 if (item.Design.RenderType == RenderType.CardBody)
225 {
226 <div class="card @cssClass dw-mod">
227 @RenderBlock(item)
228 </div>
229 }
230
231 if (item.Design.RenderType == RenderType.CardFooter)
232 {
233 <div class="card-footer @cssClass dw-mod">
234 @RenderBlock(item)
235 </div>
236 }
237 }
238 else
239 {
240 @RenderBlock(item)
241 }
242 }
243
244 if (debug) {
245 <!-- Block END: @item.Id -->
246 }
247 }
248 }
249
250 @helper RenderBlock(Block item)
251 {
252 bool debug = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("debug")) ? Convert.ToBoolean(HttpContext.Current.Request.QueryString.Get("debug")) : false;
253
254 if (item.Template != null)
255 {
256 @BlocksPage.RenderTemplate(item.Template)
257 }
258
259 if (item.Component != null)
260 {
261 string customSufix = "Custom";
262 string methodName = item.Component.HelperName;
263
264 ComponentBase[] methodParameters = new ComponentBase[1];
265 methodParameters[0] = item.Component;
266 Type methodType = this.GetType();
267
268 MethodInfo customMethod = methodType.GetMethod(methodName + customSufix);
269
270 try {
271 if (debug) {
272 <!-- Component: @methodName.Replace("Render", "") -->
273 }
274 if(customMethod != null) {
275 @customMethod.Invoke(this, methodParameters).ToString();
276 } else {
277 MethodInfo generalMethod = methodType.GetMethod(methodName);
278 @generalMethod.Invoke(this, methodParameters).ToString();
279 }
280 } catch {
281 try {
282 MethodInfo generalMethod = methodType.GetMethod(methodName);
283 @generalMethod.Invoke(this, methodParameters).ToString();
284 } catch(Exception ex) {
285 throw new Exception(item.Component.GetType().Name + " method '" + methodName +"' could not be invoked", ex);
286 }
287 }
288 }
289
290 if (item.BlocksList.Count > 0 && !item.SkipRenderBlocksList)
291 {
292 @RenderBlockList(item.BlocksList)
293 }
294 }
295
296 @*--- END: Base block renderers ---*@
297
298
299 @* Include the components *@
300 @using Dynamicweb.Rapido.Blocks.Components
301 @using Dynamicweb.Rapido.Blocks.Components.General
302 @using Dynamicweb.Rapido.Blocks
303 @using System.IO
304
305 @* Required *@
306 @using Dynamicweb.Rapido.Blocks.Components
307 @using Dynamicweb.Rapido.Blocks.Components.General
308 @using Dynamicweb.Rapido.Blocks
309
310
311 @helper Render(ComponentBase component)
312 {
313 if (component != null)
314 {
315 @component.Render(this)
316 }
317 }
318
319 @* Components *@
320 @using System.Reflection
321 @using Dynamicweb.Rapido.Blocks.Components.General
322
323
324 @* Component *@
325
326 @helper RenderIcon(Icon settings)
327 {
328 if (settings != null)
329 {
330 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : "";
331
332 if (settings.Name != null)
333 {
334 if (string.IsNullOrEmpty(settings.Label))
335 {
336 <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i>
337 }
338 else
339 {
340 if (settings.LabelPosition == IconLabelPosition.Before)
341 {
342 <div class="u-flex u-flex--align-items-center @settings.CssClass">@settings.Label <i class="@settings.Prefix @settings.Name u-margin-left" @color></i></div>
343 }
344 else
345 {
346 <div class="u-flex u-flex--align-items-center @settings.CssClass"><i class="@settings.Prefix @settings.Name u-margin-right--lg u-w20px" @color></i>@settings.Label</div>
347 }
348 }
349 }
350 else if (!string.IsNullOrEmpty(settings.Label))
351 {
352 @settings.Label
353 }
354 }
355 }
356 @using System.Reflection
357 @using Dynamicweb.Rapido.Blocks.Components.General
358 @using Dynamicweb.Rapido.Blocks.Components
359 @using Dynamicweb.Core
360
361 @* Component *@
362
363 @helper RenderButton(Button settings)
364 {
365 if (settings != null && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null))
366 {
367 Dictionary<string, string> attributes = new Dictionary<string, string>();
368 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>();
369 if (settings.Disabled) {
370 attributes.Add("disabled", "true");
371 classList.Add("disabled");
372 }
373
374 if (!string.IsNullOrEmpty(settings.ConfirmText) || !string.IsNullOrEmpty(settings.ConfirmTitle))
375 {
376 settings.Id = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N");
377 @RenderConfirmDialog(settings);
378 settings.OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = true";
379 }
380
381 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
382 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
383 if (!string.IsNullOrEmpty(settings.AltText))
384 {
385 attributes.Add("title", settings.AltText);
386 }
387 else if (!string.IsNullOrEmpty(settings.Title))
388 {
389 string cleanTitle = Regex.Replace(settings.Title, "<.*?>", String.Empty);
390 cleanTitle = cleanTitle.Replace(" ", " ");
391 attributes.Add("title", cleanTitle);
392 }
393
394 var onClickEvents = new List<string>();
395 if (!string.IsNullOrEmpty(settings.OnClick))
396 {
397 onClickEvents.Add(settings.OnClick);
398 }
399 if (!string.IsNullOrEmpty(settings.Href))
400 {
401 onClickEvents.Add("location.href='" + settings.Href + "'");
402 }
403 if (onClickEvents.Count > 0)
404 {
405 attributes.Add("onClick", string.Join(";", onClickEvents));
406 }
407
408 if (settings.ButtonLayout != ButtonLayout.None)
409 {
410 classList.Add("btn");
411 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower();
412 if (btnLayout == "linkclean")
413 {
414 btnLayout = "link-clean"; //fix
415 }
416 classList.Add("btn--" + btnLayout);
417 }
418
419 if (settings.Icon == null)
420 {
421 settings.Icon = new Icon();
422 }
423
424 settings.Icon.CssClass += Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower() != "linkclean" ? " u-flex--align-center" : "";
425 settings.Icon.Label = settings.Title;
426
427 attributes.Add("type", Enum.GetName(typeof(ButtonType), settings.ButtonType).ToLower());
428
429 <button class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</button>
430 }
431 }
432
433 @helper RenderConfirmDialog(Button settings)
434 {
435 Modal confirmDialog = new Modal {
436 Id = settings.Id,
437 Width = ModalWidth.Sm,
438 Heading = new Heading
439 {
440 Level = 2,
441 Title = settings.ConfirmTitle
442 },
443 BodyText = settings.ConfirmText
444 };
445
446 confirmDialog.AddAction(new Button { Title = Translate("Cancel"), ButtonLayout = ButtonLayout.Secondary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false"});
447 confirmDialog.AddAction(new Button { Title = Translate("OK"), ButtonLayout = ButtonLayout.Primary, OnClick = "document.getElementById('" + settings.Id + "ModalTrigger').checked = false;" + settings.OnClick });
448
449 @Render(confirmDialog)
450 }
451 @using Dynamicweb.Rapido.Blocks.Components.General
452 @using Dynamicweb.Rapido.Blocks.Components
453 @using Dynamicweb.Core
454
455 @helper RenderDashboard(Dashboard settings)
456 {
457 var widgets = settings.GetWidgets();
458
459 if (!string.IsNullOrEmpty(settings.WidgetsBaseBackgroundColor))
460 {
461 //set bg color for them
462
463 System.Drawing.Color color = System.Drawing.ColorTranslator.FromHtml(settings.WidgetsBaseBackgroundColor);
464 int r = Convert.ToInt16(color.R);
465 int g = Convert.ToInt16(color.G);
466 int b = Convert.ToInt16(color.B);
467
468 var count = widgets.Length;
469 var max = Math.Max(r, Math.Max(g, b));
470 double step = 255.0 / (max * count);
471 var i = 0;
472 foreach (var widget in widgets)
473 {
474 i++;
475
476 var shade = "rgb(" + Converter.ToString(r * step * i).Replace(",", ".") + ", " + Converter.ToString(g * step * i).Replace(",", ".") + ", " + Converter.ToString(b * step * i).Replace(",", ".") + ")";
477 widget.BackgroundColor = shade;
478 }
479 }
480
481 <div class="dashboard @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
482 @foreach (var widget in widgets)
483 {
484 <div class="dashboard__widget">
485 @Render(widget)
486 </div>
487 }
488 </div>
489 }
490 @using Dynamicweb.Rapido.Blocks.Components.General
491 @using Dynamicweb.Rapido.Blocks.Components
492
493 @helper RenderDashboardWidgetLink(DashboardWidgetLink settings)
494 {
495 if (!string.IsNullOrEmpty(settings.Link))
496 {
497 var backgroundStyles = "";
498 if (!string.IsNullOrEmpty(settings.BackgroundColor))
499 {
500 backgroundStyles = "style=\"background-color:" + settings.BackgroundColor + "\"";
501 }
502
503 <a href="@settings.Link" class="widget widget--link @settings.CssClass dw-mod" @backgroundStyles title="@settings.Title" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
504 <div class="u-center-middle u-color-light">
505 @if (settings.Icon != null)
506 {
507 settings.Icon.CssClass += "widget__icon";
508 @Render(settings.Icon)
509 }
510 <div class="widget__title">@settings.Title</div>
511 </div>
512 </a>
513 }
514 }
515 @using Dynamicweb.Rapido.Blocks.Components.General
516 @using Dynamicweb.Rapido.Blocks.Components
517
518 @helper RenderDashboardWidgetCounter(DashboardWidgetCounter settings)
519 {
520 var backgroundStyles = "";
521 if (!string.IsNullOrEmpty(settings.BackgroundColor))
522 {
523 backgroundStyles = "style='background-color:" + settings.BackgroundColor + "'";
524 }
525
526 <div class="widget @settings.CssClass dw-mod" @backgroundStyles @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
527 <div class="u-center-middle u-color-light">
528 @if (settings.Icon != null)
529 {
530 settings.Icon.CssClass += "widget__icon";
531 @Render(settings.Icon)
532 }
533 <div class="widget__counter">@settings.Count</div>
534 <div class="widget__title">@settings.Title</div>
535 </div>
536 </div>
537 }
538 @using System.Reflection
539 @using Dynamicweb.Rapido.Blocks.Components.General
540 @using Dynamicweb.Rapido.Blocks.Components
541 @using Dynamicweb.Core
542
543 @* Component *@
544
545 @helper RenderLink(Link settings)
546 {
547 if (settings != null && !string.IsNullOrEmpty(settings.Href) && (!string.IsNullOrEmpty(settings.Title) || settings.Icon != null))
548 {
549 Dictionary<string, string> attributes = new Dictionary<string, string>();
550 List<string> classList = settings.CssClass != null ? settings.CssClass.Split(' ').ToList() : new List<string>();
551 if (settings.Disabled)
552 {
553 attributes.Add("disabled", "true");
554 classList.Add("disabled");
555 }
556
557 if (!string.IsNullOrEmpty(settings.AltText))
558 {
559 attributes.Add("title", settings.AltText);
560 }
561 else if (!string.IsNullOrEmpty(settings.Title))
562 {
563 attributes.Add("title", settings.Title);
564 }
565
566 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
567 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
568 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onClick", settings.OnClick); }
569 attributes.Add("href", settings.Href);
570
571 if (settings.ButtonLayout != ButtonLayout.None)
572 {
573 classList.Add("btn");
574 string btnLayout = Enum.GetName(typeof(ButtonLayout), settings.ButtonLayout).ToLower();
575 if (btnLayout == "linkclean")
576 {
577 btnLayout = "link-clean"; //fix
578 }
579 classList.Add("btn--" + btnLayout);
580 }
581
582 if (settings.Icon == null)
583 {
584 settings.Icon = new Icon();
585 }
586 settings.Icon.Label = settings.Title;
587
588 if (settings.Target == LinkTargetType.Blank && settings.Rel == LinkRelType.None)
589 {
590 settings.Rel = LinkRelType.Noopener;
591 }
592 if (settings.Target != LinkTargetType.None)
593 {
594 attributes.Add("target", "_" + Enum.GetName(typeof(LinkTargetType), settings.Target).ToLower());
595 }
596 if (settings.Download)
597 {
598 attributes.Add("download", "true");
599 }
600 if (settings.Rel != LinkRelType.None)
601 {
602 attributes.Add("rel", Enum.GetName(typeof(LinkRelType), settings.Rel).ToLower());
603 }
604
605 <a class="@string.Join(" ", classList) dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@Render(settings.Icon)</a>
606 }
607 }
608 @using System.Reflection
609 @using Dynamicweb.Rapido.Blocks.Components
610 @using Dynamicweb.Rapido.Blocks.Components.General
611 @using Dynamicweb.Rapido.Blocks
612
613
614 @* Component *@
615
616 @helper RenderRating(Rating settings)
617 {
618 if (settings.Score > 0)
619 {
620 int rating = settings.Score;
621 string iconType = "fa-star";
622
623 switch (settings.Type.ToString()) {
624 case "Stars":
625 iconType = "fa-star";
626 break;
627 case "Hearts":
628 iconType = "fa-heart";
629 break;
630 case "Lemons":
631 iconType = "fa-lemon";
632 break;
633 case "Bombs":
634 iconType = "fa-bomb";
635 break;
636 }
637
638 <div class="u-ta-right">
639 @for (int i = 0; i < settings.OutOf; i++)
640 {
641 <i class="@(rating > i ? "fas" : "far") @iconType"></i>
642 }
643 </div>
644 }
645 }
646 @using System.Reflection
647 @using Dynamicweb.Rapido.Blocks.Components.General
648 @using Dynamicweb.Rapido.Blocks.Components
649
650
651 @* Component *@
652
653 @helper RenderSelectFieldOption(SelectFieldOption settings)
654 {
655 Dictionary<string, string> attributes = new Dictionary<string, string>();
656 if (settings.Checked) { attributes.Add("selected", "true"); }
657 if (settings.Disabled) { attributes.Add("disabled", "true"); }
658 if (settings.Value != null) { attributes.Add("value", settings.Value); }
659 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
660
661 <option @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Label</option>
662 }
663 @using System.Reflection
664 @using Dynamicweb.Rapido.Blocks.Components.General
665 @using Dynamicweb.Rapido.Blocks.Components
666
667
668 @* Component *@
669
670 @helper RenderNavigation(Navigation settings) {
671 @RenderNavigation(new
672 {
673 id = settings.Id,
674 cssclass = settings.CssClass,
675 startLevel = settings.StartLevel,
676 endlevel = settings.EndLevel,
677 expandmode = settings.Expandmode,
678 sitemapmode = settings.SitemapMode,
679 template = settings.Template
680 })
681 }
682 @using Dynamicweb.Rapido.Blocks.Components.General
683 @using Dynamicweb.Rapido.Blocks.Components
684
685
686 @* Component *@
687
688 @helper RenderBreadcrumbNavigation(BreadcrumbNavigation settings) {
689 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id;
690 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template;
691 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel;
692 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel;
693 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode;
694 settings.SitemapMode = false;
695
696 @RenderNavigation(settings)
697 }
698 @using Dynamicweb.Rapido.Blocks.Components.General
699 @using Dynamicweb.Rapido.Blocks.Components
700
701
702 @* Component *@
703
704 @helper RenderLeftNavigation(LeftNavigation settings) {
705 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id;
706 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template;
707 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel;
708 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel;
709 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode;
710
711 <div class="grid__cell">
712 @RenderNavigation(settings)
713 </div>
714 }
715 @using System.Reflection
716 @using Dynamicweb.Rapido.Blocks.Components.General
717 @using Dynamicweb.Core
718
719 @* Component *@
720
721 @helper RenderHeading(Heading settings)
722 {
723 if (settings != null && !string.IsNullOrEmpty(settings.Title))
724 {
725 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : "";
726 string tagName = settings.Level != 0 ? "h" + settings.Level.ToString() : "div";
727
728 @("<" + tagName + " class=\"" + settings.CssClass + " dw-mod\" " + color + ">")
729 if (!string.IsNullOrEmpty(settings.Link))
730 {
731 @Render(new Link { Href = settings.Link, Icon = settings.Icon, Title = settings.Title, ButtonLayout = ButtonLayout.None })
732 }
733 else
734 {
735 if (settings.Icon == null)
736 {
737 settings.Icon = new Icon();
738 }
739 settings.Icon.Label = settings.Title;
740 @Render(settings.Icon)
741 }
742 @("</" + tagName + ">");
743 }
744 }
745 @using Dynamicweb.Rapido.Blocks.Components
746 @using Dynamicweb.Rapido.Blocks.Components.General
747 @using Dynamicweb.Rapido.Blocks
748
749
750 @* Component *@
751
752 @helper RenderImage(Image settings)
753 {
754 if (settings.FilterPrimary != ImageFilter.None || settings.FilterSecondary != ImageFilter.None)
755 {
756 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>();
757 if (!string.IsNullOrEmpty(settings.FilterColor)) { optionalAttributes.Add("style", "background-color: " + settings.FilterColor); }
758
759 if (settings.Caption != null)
760 {
761 @:<div>
762 }
763
764 var primaryFilterClass = settings.FilterPrimary.ToString().ToLower();
765 var secondaryFilterClass = settings.FilterSecondary.ToString().ToLower();
766
767 <div class="image-filter image-filter--@primaryFilterClass u-position-relative dw-mod" @ComponentMethods.AddAttributes(optionalAttributes)>
768 <div class="image-filter image-filter--@secondaryFilterClass dw-mod">
769 @if (settings.Link != null)
770 {
771 <a href="@settings.Link">
772 @RenderTheImage(settings)
773 </a>
774 }
775 else
776 {
777 @RenderTheImage(settings)
778 }
779 </div>
780 </div>
781
782 if (settings.Caption != null)
783 {
784 <span class="image-caption dw-mod">@settings.Caption</span>
785 @:</div>
786 }
787 }
788 else
789 {
790 if (settings.Caption != null)
791 {
792 @:<div>
793 }
794 if (!string.IsNullOrEmpty(settings.Link))
795 {
796 <a href="@settings.Link">
797 @RenderTheImage(settings)
798 </a>
799 }
800 else
801 {
802 @RenderTheImage(settings)
803 }
804
805 if (settings.Caption != null)
806 {
807 <span class="image-caption dw-mod">@settings.Caption</span>
808 @:</div>
809 }
810 }
811 }
812
813 @helper RenderTheImage(Image settings)
814 {
815 if (settings != null)
816 {
817 string alternativeImage = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("AlternativeImage")) ? Pageview.AreaSettings.GetItem("Settings").GetFile("AlternativeImage").PathUrlEncoded : "/Images/missing_image.jpg";
818 string placeholderImage = "/Files/Images/placeholder.gif";
819 string imageEngine = "/Admin/Public/GetImage.ashx?";
820
821 string imageStyle = "";
822
823 switch (settings.Style)
824 {
825 case ImageStyle.Ball:
826 imageStyle = "grid__cell-img--ball";
827 break;
828
829 case ImageStyle.Triangle:
830 imageStyle = "grid__cell-img--triangle";
831 break;
832 }
833
834 if (settings.Style == ImageStyle.Ball || settings.Style == ImageStyle.Circle || settings.Style == ImageStyle.Triangle)
835 {
836 settings.ImageDefault.Crop = settings.ImageDefault.Crop == 5 ? settings.ImageDefault.Crop = 0 : settings.ImageDefault.Crop;
837
838 if (settings.ImageDefault != null)
839 {
840 settings.ImageDefault.Height = settings.ImageDefault.Width;
841 }
842 if (settings.ImageMedium != null)
843 {
844 settings.ImageMedium.Height = settings.ImageMedium.Width;
845 }
846 if (settings.ImageSmall != null)
847 {
848 settings.ImageSmall.Height = settings.ImageSmall.Width;
849 }
850 }
851
852 string defaultImage = imageEngine;
853 string imageSmall = "";
854 string imageMedium = "";
855
856 if (settings.DisableImageEngine)
857 {
858 defaultImage = settings.Path;
859 }
860 else
861 {
862 if (settings.ImageDefault != null)
863 {
864 defaultImage += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageDefault);
865
866 if (settings.Path.GetType() != typeof(string))
867 {
868 defaultImage += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : "";
869 defaultImage += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : "";
870 }
871 else
872 {
873 defaultImage += settings.Path != null ? "Image=" + settings.Path : "";
874 }
875
876 defaultImage += "&AlternativeImage=" + alternativeImage;
877 }
878
879 if (settings.ImageSmall != null)
880 {
881 imageSmall = "data-src-small=\"" + imageEngine;
882 imageSmall += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageSmall);
883
884 if (settings.Path.GetType() != typeof(string))
885 {
886 imageSmall += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : "";
887 imageSmall += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : "";
888 }
889 else
890 {
891 imageSmall += settings.Path != null ? "Image=" + settings.Path : "";
892 }
893
894 imageSmall += "&alternativeImage=" + alternativeImage;
895
896 imageSmall += "\"";
897 }
898
899 if (settings.ImageMedium != null)
900 {
901 imageMedium = "data-src-medium=\"" + imageEngine;
902 imageMedium += Dynamicweb.Rapido.Services.Images.GetImagePathFromSettings(settings.ImageMedium);
903
904 if (settings.Path.GetType() != typeof(string))
905 {
906 imageMedium += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : "";
907 imageMedium += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : "";
908 }
909 else
910 {
911 imageMedium += settings.Path != null ? "Image=" + settings.Path : "";
912 }
913
914 imageMedium += "&alternativeImage=" + alternativeImage;
915
916 imageMedium += "\"";
917 }
918 }
919
920 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>();
921 if (!string.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick); }
922 if (!string.IsNullOrEmpty(settings.Title))
923 {
924 optionalAttributes.Add("alt", settings.Title);
925 optionalAttributes.Add("title", settings.Title);
926 }
927
928 if (settings.DisableLazyLoad)
929 {
930 <img id="@settings.Id" class="@imageStyle @settings.CssClass dw-mod" src="@defaultImage" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) />
931 }
932 else
933 {
934 <img id="@settings.Id" class="b-lazy @imageStyle @settings.CssClass dw-mod" src="@placeholderImage" data-src="@defaultImage" @imageSmall @imageMedium @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) />
935 }
936 }
937 }
938 @using System.Reflection
939 @using Dynamicweb.Rapido.Blocks.Components.General
940 @using Dynamicweb.Rapido.Blocks.Components
941
942 @* Component *@
943
944 @helper RenderFileField(FileField settings)
945 {
946 var attributes = new Dictionary<string, string>();
947 if (string.IsNullOrEmpty(settings.Id))
948 {
949 settings.Id = Guid.NewGuid().ToString("N");
950 }
951
952 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
953 if (settings.Disabled) { attributes.Add("disabled", "true"); }
954 if (settings.Required) { attributes.Add("required", "true"); }
955 if (settings.Multiple) { attributes.Add("multiple", "true"); }
956 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
957 if (string.IsNullOrEmpty(settings.ChooseFileText))
958 {
959 settings.ChooseFileText = Translate("Choose file");
960 }
961 if (string.IsNullOrEmpty(settings.NoFilesChosenText))
962 {
963 settings.NoFilesChosenText = Translate("No files chosen...");
964 }
965 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
966
967 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; }
968
969 string setValueToFakeInput = "FileUpload.setValueToFakeInput(this)";
970 attributes.Add("onchange", setValueToFakeInput + (!string.IsNullOrEmpty(settings.OnChange) ? settings.OnChange : ""));
971
972 attributes.Add("type", "file");
973 if (settings.Value != null) { attributes.Add("value", settings.Value); }
974 settings.CssClass = "u-full-width " + settings.CssClass;
975
976 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
977
978 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod">
979 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null )
980 {
981 <div class="u-full-width">
982 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> }
983 @if (settings.Link != null) {
984 <div class="u-pull--right">
985 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; }
986 @Render(settings.Link)
987 </div>
988 }
989 </div>
990
991 }
992
993 @if (!string.IsNullOrEmpty(settings.HelpText))
994 {
995 <small class="form__help-text">@settings.HelpText</small>
996 }
997
998 <div class="form__field-combi file-input u-no-margin dw-mod">
999 <input @ComponentMethods.AddAttributes(resultAttributes) class="file-input__real-input" data-no-files-text="@settings.NoFilesChosenText" data-many-files-text="@Translate("files")" />
1000 <label for="@settings.Id" class="file-input__btn btn--secondary btn dw-mod">@settings.ChooseFileText</label>
1001 <label for="@settings.Id" class="@settings.CssClass file-input__fake-input js-fake-input dw-mod">@settings.NoFilesChosenText</label>
1002 @if (settings.UploadButton != null)
1003 {
1004 settings.UploadButton.CssClass += " btn--condensed u-no-margin";
1005 @Render(settings.UploadButton)
1006 }
1007 </div>
1008 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1009 </div>
1010 }
1011 @using System.Reflection
1012 @using Dynamicweb.Rapido.Blocks.Components.General
1013 @using Dynamicweb.Rapido.Blocks.Components
1014 @using Dynamicweb.Core
1015 @using System.Linq
1016
1017 @* Component *@
1018
1019 @helper RenderDateTimeField(DateTimeField settings)
1020 {
1021 if (string.IsNullOrEmpty(settings.Id))
1022 {
1023 settings.Id = Guid.NewGuid().ToString("N");
1024 }
1025
1026 var textField = new TextField {
1027 Name = settings.Name,
1028 Id = settings.Id,
1029 Label = settings.Label,
1030 HelpText = settings.HelpText,
1031 Value = settings.Value,
1032 Disabled = settings.Disabled,
1033 Required = settings.Required,
1034 ErrorMessage = settings.ErrorMessage,
1035 CssClass = settings.CssClass,
1036 WrapperCssClass = settings.WrapperCssClass,
1037 OnChange = settings.OnChange,
1038 OnClick = settings.OnClick,
1039 Link = settings.Link,
1040 ExtraAttributes = settings.ExtraAttributes,
1041 //
1042 Placeholder = settings.Placeholder
1043 };
1044
1045 @Render(textField)
1046
1047 List<string> jsAttributes = new List<string>();
1048
1049 jsAttributes.Add("mode: '" + Enum.GetName(typeof(DateTimeFieldMode), settings.Mode).ToLower() + "'");
1050
1051 if (!string.IsNullOrEmpty(settings.DateFormat))
1052 {
1053 jsAttributes.Add("dateFormat: '" + settings.DateFormat + "'");
1054 }
1055 if (!string.IsNullOrEmpty(settings.MinDate))
1056 {
1057 jsAttributes.Add("minDate: '" + settings.MinDate + "'");
1058 }
1059 if (!string.IsNullOrEmpty(settings.MaxDate))
1060 {
1061 jsAttributes.Add("maxDate: '" + settings.MaxDate + "'");
1062 }
1063 if (settings.IsInline)
1064 {
1065 jsAttributes.Add("inline: " + Converter.ToString(settings.IsInline).ToLower());
1066 }
1067 if (settings.EnableTime)
1068 {
1069 jsAttributes.Add("enableTime: " + Converter.ToString(settings.EnableTime).ToLower());
1070 }
1071 if (settings.EnableWeekNumbers)
1072 {
1073 jsAttributes.Add("weekNumbers: " + Converter.ToString(settings.EnableWeekNumbers).ToLower());
1074 }
1075
1076 jsAttributes.AddRange(settings.GetFlatPickrOptions().Select(x => x.Key + ": " + x.Value));
1077
1078 <script>
1079 document.addEventListener("DOMContentLoaded", function () {
1080 flatpickr("#@textField.Id", {
1081 @string.Join(",", jsAttributes)
1082 });
1083 });
1084 </script>
1085 }
1086 @using System.Reflection
1087 @using Dynamicweb.Rapido.Blocks.Components.General
1088 @using Dynamicweb.Rapido.Blocks.Components
1089
1090 @* Component *@
1091
1092 @helper RenderTextField(TextField settings)
1093 {
1094 var attributes = new Dictionary<string, string>();
1095 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id))
1096 {
1097 settings.Id = Guid.NewGuid().ToString("N");
1098 }
1099
1100 /*base settings*/
1101 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1102 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
1103 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
1104 if (settings.Disabled) { attributes.Add("disabled", "true"); }
1105 if (settings.Required) { attributes.Add("required", "true"); }
1106 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
1107 /*end*/
1108
1109 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); }
1110 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); }
1111 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); }
1112 if (settings.ReadOnly) { attributes.Add("readonly", "true"); }
1113 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); }
1114 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); }
1115 attributes.Add("type", Enum.GetName(typeof(TextFieldType), settings.Type).ToLower());
1116 if (settings.Type == TextFieldType.Password) { attributes.Add("autocomplete", "off"); };
1117 if (settings.Value != null) { attributes.Add("value", settings.Value); }
1118
1119 settings.CssClass = "u-full-width " + settings.CssClass;
1120
1121 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; }
1122
1123 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
1124
1125 string noMargin = "u-no-margin";
1126 if (!settings.ReadOnly) {
1127 noMargin = "";
1128 }
1129
1130 <div class="form__field-group u-full-width @noMargin @settings.WrapperCssClass dw-mod">
1131 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null )
1132 {
1133 <div class="u-full-width">
1134 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> }
1135 @if (settings.Link != null) {
1136 settings.Link.ButtonLayout = ButtonLayout.LinkClean;
1137
1138 <div class="u-pull--right">
1139 @Render(settings.Link)
1140 </div>
1141 }
1142 </div>
1143
1144 }
1145
1146 @if (!string.IsNullOrEmpty(settings.HelpText))
1147 {
1148 <small class="form__help-text">@settings.HelpText</small>
1149 }
1150
1151 @if (settings.ActionButton != null)
1152 {
1153 settings.ActionButton.CssClass += " btn--condensed u-no-margin";
1154 <div class="form__field-combi u-no-margin dw-mod">
1155 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
1156 @Render(settings.ActionButton)
1157 </div>
1158 }
1159 else
1160 {
1161 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
1162 }
1163
1164 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1165 </div>
1166 }
1167 @using System.Reflection
1168 @using Dynamicweb.Rapido.Blocks.Components.General
1169 @using Dynamicweb.Rapido.Blocks.Components
1170
1171 @* Component *@
1172
1173 @helper RenderNumberField(NumberField settings)
1174 {
1175 var attributes = new Dictionary<string, string>();
1176 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id))
1177 {
1178 settings.Id = Guid.NewGuid().ToString("N");
1179 }
1180
1181 /*base settings*/
1182 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1183 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
1184 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
1185 if (settings.Disabled) { attributes.Add("disabled", "true"); }
1186 if (settings.Required) { attributes.Add("required", "true"); }
1187 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
1188 /*end*/
1189
1190 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); }
1191 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); }
1192 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); }
1193 if (settings.ReadOnly) { attributes.Add("readonly", "true"); }
1194 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); }
1195 if (settings.Min != null) { attributes.Add("min", settings.Min.ToString()); }
1196 if (settings.Step != 0) { attributes.Add("step", settings.Step.ToString()); }
1197 if (settings.Value != null && !string.IsNullOrEmpty(settings.Value.ToString())) { attributes.Add("value", settings.Value.ToString()); }
1198 attributes.Add("type", "number");
1199
1200 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
1201
1202 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod">
1203 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null )
1204 {
1205 <div class="u-full-width">
1206 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> }
1207 @if (settings.Link != null) {
1208 <div class="u-pull--right">
1209 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; }
1210 @Render(settings.Link)
1211 </div>
1212 }
1213 </div>
1214
1215 }
1216
1217 @if (!string.IsNullOrEmpty(settings.HelpText))
1218 {
1219 <small class="form__help-text">@settings.HelpText</small>
1220 }
1221
1222 @if (settings.ActionButton != null)
1223 {
1224 settings.ActionButton.CssClass += " btn--condensed u-no-margin";
1225 <div class="form__field-combi u-no-margin dw-mod">
1226 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
1227 @Render(settings.ActionButton)
1228 </div>
1229 }
1230 else
1231 {
1232 <div class="form__field-combi u-no-margin dw-mod">
1233 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
1234 </div>
1235 }
1236
1237 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1238 </div>
1239 }
1240 @using System.Reflection
1241 @using Dynamicweb.Rapido.Blocks.Components.General
1242 @using Dynamicweb.Rapido.Blocks.Components
1243
1244
1245 @* Component *@
1246
1247 @helper RenderTextareaField(TextareaField settings)
1248 {
1249 Dictionary<string, string> attributes = new Dictionary<string, string>();
1250 string id = settings.Id;
1251 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(id))
1252 {
1253 id = Guid.NewGuid().ToString("N");
1254 }
1255
1256 if (!string.IsNullOrEmpty(id)) { attributes.Add("id", id); }
1257 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
1258 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); }
1259 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); }
1260 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); }
1261 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
1262 if (!string.IsNullOrEmpty(settings.Placeholder)) { attributes.Add("placeholder", settings.Placeholder); }
1263 if (settings.Disabled) { attributes.Add("disabled", "true"); }
1264 if (settings.Required) { attributes.Add("required", "true"); }
1265 if (settings.ReadOnly) { attributes.Add("readonly", "true"); }
1266 if (settings.MaxLength != 0) { attributes.Add("maxlength", settings.MaxLength.ToString()); }
1267 if (settings.Rows != 0) { attributes.Add("rows", settings.Rows.ToString()); }
1268 attributes.Add("name", settings.Name);
1269
1270 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; }
1271
1272 <div class="form__field-group @settings.WrapperCssClass dw-mod">
1273 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null )
1274 {
1275 <div class="u-full-width">
1276 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> }
1277 @if (settings.Link != null) {
1278 <div class="u-pull--right">
1279 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; }
1280 @Render(settings.Link)
1281 </div>
1282 }
1283 </div>
1284 }
1285
1286 @if (!string.IsNullOrEmpty(settings.HelpText))
1287 {
1288 <small class="form__help-text">@settings.HelpText</small>
1289 }
1290
1291 <textarea class="u-full-width @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Value</textarea>
1292
1293 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1294 </div>
1295 }
1296 @using System.Reflection
1297 @using Dynamicweb.Rapido.Blocks.Components.General
1298 @using Dynamicweb.Rapido.Blocks.Components
1299
1300
1301 @* Component *@
1302
1303 @helper RenderHiddenField(HiddenField settings) {
1304 var attributes = new Dictionary<string, string>();
1305 attributes.Add("type", "hidden");
1306 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1307 if (settings.Value != null) { attributes.Add("value", settings.Value); }
1308 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
1309
1310 <input @ComponentMethods.AddAttributes(attributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)/>
1311 }
1312 @using System.Reflection
1313 @using Dynamicweb.Rapido.Blocks.Components.General
1314 @using Dynamicweb.Rapido.Blocks.Components
1315
1316 @* Component *@
1317
1318 @helper RenderCheckboxField(CheckboxField settings)
1319 {
1320 var attributes = new Dictionary<string, string>();
1321 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id))
1322 {
1323 settings.Id = Guid.NewGuid().ToString("N");
1324 }
1325
1326 /*base settings*/
1327 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1328 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
1329 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
1330 if (settings.Disabled) { attributes.Add("disabled", "true"); }
1331 if (settings.Required) { attributes.Add("required", "true"); }
1332 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
1333 /*end*/
1334
1335 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; }
1336
1337 attributes.Add("type", "checkbox");
1338 if (settings.Checked) { attributes.Add("checked", "true"); }
1339 settings.CssClass = "form__control " + settings.CssClass;
1340 if (settings.Value != null) { attributes.Add("value", settings.Value); }
1341
1342 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
1343
1344 <div class="form__field-group @settings.WrapperCssClass dw-mod">
1345 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
1346 @if (!string.IsNullOrEmpty(settings.Label))
1347 {
1348 <label for="@settings.Id" class="dw-mod">@settings.Label</label>
1349 }
1350
1351 @if (settings.Link != null) {
1352 <span>
1353 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; }
1354 @Render(settings.Link)
1355 </span>
1356 }
1357
1358 @if (!string.IsNullOrEmpty(settings.HelpText))
1359 {
1360 <small class="form__help-text checkbox-help dw-mod">@settings.HelpText</small>
1361 }
1362 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1363 </div>
1364 }
1365 @using System.Reflection
1366 @using Dynamicweb.Rapido.Blocks.Components.General
1367 @using Dynamicweb.Rapido.Blocks.Components
1368
1369
1370 @* Component *@
1371
1372 @helper RenderCheckboxListField(CheckboxListField settings)
1373 {
1374 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
1375 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null )
1376 {
1377 <div class="u-full-width">
1378 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> }
1379 @if (settings.Link != null) {
1380 <div class="u-pull--right">
1381 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; }
1382 @Render(settings.Link)
1383 </div>
1384 }
1385 </div>
1386
1387 }
1388
1389 <div class="u-pull--left">
1390 @if (!string.IsNullOrEmpty(settings.HelpText))
1391 {
1392 <small class="form__help-text">@settings.HelpText</small>
1393 }
1394
1395 @foreach (var item in settings.Options)
1396 {
1397 if (settings.Required)
1398 {
1399 item.Required = true;
1400 }
1401 if (settings.Disabled)
1402 {
1403 item.Disabled = true;
1404 }
1405 if (!string.IsNullOrEmpty(settings.Name))
1406 {
1407 item.Name = settings.Name;
1408 }
1409 if (!string.IsNullOrEmpty(settings.CssClass))
1410 {
1411 item.CssClass += settings.CssClass;
1412 }
1413
1414 /* value is not supported */
1415
1416 if (!string.IsNullOrEmpty(settings.OnClick))
1417 {
1418 item.OnClick += settings.OnClick;
1419 }
1420 if (!string.IsNullOrEmpty(settings.OnChange))
1421 {
1422 item.OnChange += settings.OnChange;
1423 }
1424 @Render(item)
1425 }
1426
1427 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1428 </div>
1429
1430 </div>
1431 }
1432 @using Dynamicweb.Rapido.Blocks.Components.General
1433
1434 @* Component *@
1435
1436 @helper RenderSearch(Search settings)
1437 {
1438 var searchValue = HttpContext.Current.Request.QueryString.Get(settings.SearchParameter) ?? "";
1439 var groupValue = HttpContext.Current.Request.QueryString.Get(settings.GroupsParameter) ?? "";
1440
1441 if (string.IsNullOrEmpty(settings.Id))
1442 {
1443 settings.Id = Guid.NewGuid().ToString("N");
1444 }
1445
1446 var resultAttributes = new Dictionary<string, string>();
1447
1448 if (settings.PageSize != 0)
1449 {
1450 resultAttributes.Add("data-page-size", settings.PageSize.ToString());
1451 }
1452 if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl))
1453 {
1454 resultAttributes.Add("data-groups-feed-url", settings.GroupItemsFeedUrl);
1455 if (!string.IsNullOrEmpty(groupValue))
1456 {
1457 resultAttributes.Add("data-selected-group", groupValue);
1458 }
1459 if (!string.IsNullOrEmpty(settings.GroupsParameter))
1460 {
1461 resultAttributes.Add("data-groups-parameter", settings.GroupsParameter);
1462 }
1463 }
1464 resultAttributes.Add("data-force-init", "true");
1465 if (settings.GoToFirstSearchResultOnEnter)
1466 {
1467 resultAttributes.Add("data-go-to-first-search-result-on-enter", settings.GoToFirstSearchResultOnEnter.ToString().ToLower());
1468 }
1469 if (!string.IsNullOrEmpty(settings.SearchParameter))
1470 {
1471 resultAttributes.Add("data-search-parameter", settings.SearchParameter);
1472 }
1473 resultAttributes.Add("data-search-feed-url", settings.SearchData.SearchFeedUrl);
1474 resultAttributes.Add("data-results-template-id", settings.SearchData.ResultsTemplateId);
1475
1476 if (settings.SecondSearchData != null)
1477 {
1478 resultAttributes.Add("data-second-search-feed-url", settings.SecondSearchData.SearchFeedUrl);
1479 resultAttributes.Add("data-second-results-template-id", settings.SecondSearchData.ResultsTemplateId);
1480 }
1481 if (!string.IsNullOrEmpty(settings.ResultsPageUrl))
1482 {
1483 resultAttributes.Add("data-results-page-url", settings.ResultsPageUrl);
1484 }
1485
1486 resultAttributes = resultAttributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
1487
1488 string searchFieldCss = (settings.SearchButton == null) ? "search--with-icon" : "";
1489
1490 <div class="search @settings.CssClass @searchFieldCss js-search-data-source dw-mod" id="@settings.Id" @ComponentMethods.AddAttributes(resultAttributes)>
1491 @if (!string.IsNullOrEmpty(settings.GroupItemsFeedUrl))
1492 {
1493 <button type="button" class="search__groups-btn dw-mod js-search-groups-btn">@Translate("All")</button>
1494 <ul class="dropdown dropdown--absolute-position dw-mod search__groups-results js-search-groups-list"></ul>
1495 }
1496
1497 <input type="text" class="search__field dw-mod js-search-field" placeholder="@settings.Placeholder" value="@searchValue">
1498
1499 <div class="dropdown dropdown--absolute-position search__results dw-mod js-search-results @(settings.SecondSearchData != null ? "search__results--combined" : "")">
1500 @if (settings.SecondSearchData != null)
1501 {
1502 <div class="search__column search__column--products dw-mod">
1503 <div class="search__column-header dw-mod">@Translate("Products")</div>
1504 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul>
1505 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl))
1506 {
1507 @Render(new Link {
1508 Title = Translate("View all"),
1509 CssClass = "js-view-all-button u-margin",
1510 Href = settings.SearchData.ResultsPageUrl
1511 });
1512 }
1513 </div>
1514 <div class="search__column search__column--pages dw-mod">
1515 <div class="search__column-header">@Translate("Pages")</div>
1516 <ul class="search__results-list dw-mod js-search-results-second-list" id="@(settings.Id)_SecondResultsList"></ul>
1517 @if (!string.IsNullOrEmpty(settings.SecondSearchData.ResultsPageUrl))
1518 {
1519 @Render(new Link
1520 {
1521 Title = Translate("View all"),
1522 CssClass = "js-view-all-button u-margin",
1523 Href = settings.SecondSearchData.ResultsPageUrl
1524 });
1525 }
1526 </div>
1527 }
1528 else
1529 {
1530 <div class="search__column search__column--only dw-mod">
1531 <ul class="search__results-list dw-mod js-search-results-list" id="@(settings.Id)_ResultsList"></ul>
1532 @if (!string.IsNullOrEmpty(settings.SearchData.ResultsPageUrl))
1533 {
1534 @Render(new Link {
1535 Title = Translate("View all"),
1536 CssClass = "js-view-all-button u-margin",
1537 Href = settings.SearchData.ResultsPageUrl
1538 });
1539 }
1540 </div>
1541 }
1542 </div>
1543
1544 @if (settings.SearchButton != null)
1545 {
1546 settings.SearchButton.CssClass += " search__btn js-search-btn";
1547 if (settings.RenderDefaultSearchIcon)
1548 {
1549 settings.SearchButton.Icon = new Icon { Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue };
1550 }
1551 @Render(settings.SearchButton);
1552 }
1553 </div>
1554 }
1555 @using System.Reflection
1556 @using Dynamicweb.Rapido.Blocks.Components.General
1557 @using Dynamicweb.Rapido.Blocks.Components
1558
1559
1560 @* Component *@
1561
1562 @helper RenderSelectField(SelectField settings)
1563 {
1564 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id))
1565 {
1566 settings.Id = Guid.NewGuid().ToString("N");
1567 }
1568
1569 <div class="form__field-group u-full-width @settings.WrapperCssClass dw-mod">
1570 @if (!string.IsNullOrEmpty(settings.Label) || settings.Link != null )
1571 {
1572 <div class="u-full-width">
1573 @if (!string.IsNullOrEmpty(settings.Label)) { <label for="@settings.Id" class="u-pull--left">@settings.Label</label> }
1574 @if (settings.Link != null) {
1575 <div class="u-pull--right">
1576 @{ settings.Link.ButtonLayout = ButtonLayout.LinkClean; }
1577 @Render(settings.Link)
1578 </div>
1579 }
1580 </div>
1581 }
1582
1583 @if (!string.IsNullOrEmpty(settings.HelpText))
1584 {
1585 <small class="form__help-text">@settings.HelpText</small>
1586 }
1587
1588 @if (settings.ActionButton != null)
1589 {
1590 settings.ActionButton.CssClass += " btn--condensed u-no-margin";
1591 <div class="form__field-combi u-no-margin dw-mod">
1592 @RenderSelectBase(settings)
1593 @Render(settings.ActionButton)
1594 </div>
1595 }
1596 else
1597 {
1598 @RenderSelectBase(settings)
1599 }
1600
1601 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1602 </div>
1603 }
1604
1605 @helper RenderSelectBase(SelectField settings)
1606 {
1607 var attributes = new Dictionary<string, string>();
1608
1609 /*base settings*/
1610 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1611 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
1612 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
1613 if (settings.Disabled) { attributes.Add("disabled", "true"); }
1614 if (settings.Required) { attributes.Add("required", "true"); }
1615 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
1616 /*end*/
1617
1618 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
1619
1620 <select @ComponentMethods.AddAttributes(resultAttributes) class="u-full-width @settings.CssClass dw-mod">
1621 @if (settings.Default != null)
1622 {
1623 @Render(settings.Default)
1624 }
1625
1626 @foreach (var item in settings.Options)
1627 {
1628 if (settings.Value != null) {
1629 item.Checked = item.Value == settings.Value;
1630 }
1631 @Render(item)
1632 }
1633 </select>
1634 }
1635 @using System.Reflection
1636 @using Dynamicweb.Rapido.Blocks.Components.General
1637 @using Dynamicweb.Rapido.Blocks.Components
1638
1639 @* Component *@
1640
1641 @helper RenderRadioButtonField(RadioButtonField settings)
1642 {
1643 var attributes = new Dictionary<string, string>();
1644 if (!string.IsNullOrEmpty(settings.Label) && string.IsNullOrEmpty(settings.Id))
1645 {
1646 settings.Id = Guid.NewGuid().ToString("N");
1647 }
1648
1649 /*base settings*/
1650 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1651 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
1652 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
1653 if (settings.Disabled) { attributes.Add("disabled", "true"); }
1654 if (settings.Required) { attributes.Add("required", "true"); }
1655 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
1656 /*end*/
1657
1658 attributes.Add("type", "radio");
1659 if (settings.Checked) { attributes.Add("checked", "true"); }
1660 settings.CssClass = "form__control " + settings.CssClass;
1661 if (settings.Value != null) { attributes.Add("value", settings.Value); }
1662
1663 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
1664
1665 <div class="form__field-group @settings.WrapperCssClass dw-mod">
1666 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
1667 @if (!string.IsNullOrEmpty(settings.Label))
1668 {
1669 <label for="@settings.Id" class="dw-mod">@settings.Label</label>
1670 }
1671 @if (!string.IsNullOrEmpty(settings.HelpText))
1672 {
1673 <small class="form__help-text">@settings.HelpText</small>
1674 }
1675 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1676 </div>
1677 }
1678 @using System.Reflection
1679 @using Dynamicweb.Rapido.Blocks.Components.General
1680 @using Dynamicweb.Rapido.Blocks.Components
1681
1682
1683 @* Component *@
1684
1685 @helper RenderRadioButtonListField(RadioButtonListField settings)
1686 {
1687 if (settings.Required && !String.IsNullOrEmpty(settings.Label)) { settings.Label += " <span class=\"required dw-mod\">*</span>"; }
1688
1689 <div class="form__field-group @settings.WrapperCssClass u-margin-bottom dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
1690 @if (!string.IsNullOrEmpty(settings.Label))
1691 {
1692 <label>@settings.Label</label>
1693 }
1694 @if (!string.IsNullOrEmpty(settings.HelpText))
1695 {
1696 <small class="form__help-text">@settings.HelpText</small>
1697 }
1698
1699 @foreach (var item in settings.Options)
1700 {
1701 if (settings.Required)
1702 {
1703 item.Required = true;
1704 }
1705 if (settings.Disabled)
1706 {
1707 item.Disabled = true;
1708 }
1709 if (!string.IsNullOrEmpty(settings.Name))
1710 {
1711 item.Name = settings.Name;
1712 }
1713 if (settings.Value != null && settings.Value == item.Value)
1714 {
1715 item.Checked = true;
1716 }
1717 if (!string.IsNullOrEmpty(settings.OnClick))
1718 {
1719 item.OnClick += settings.OnClick;
1720 }
1721 if (!string.IsNullOrEmpty(settings.OnChange))
1722 {
1723 item.OnChange += settings.OnChange;
1724 }
1725 if (!string.IsNullOrEmpty(settings.CssClass))
1726 {
1727 item.CssClass += settings.CssClass;
1728 }
1729 @Render(item)
1730 }
1731
1732 @Render(new NotificationMessage { Message = settings.ErrorMessage })
1733 </div>
1734 }
1735 @using System.Reflection
1736 @using Dynamicweb.Rapido.Blocks.Components.General
1737 @using Dynamicweb.Rapido.Blocks.Components
1738
1739
1740 @* Component *@
1741
1742 @helper RenderNotificationMessage(NotificationMessage settings)
1743 {
1744 if (!string.IsNullOrEmpty(settings.Message))
1745 {
1746 var attributes = new Dictionary<string, string>();
1747 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
1748
1749 string messageTypeClass = Enum.GetName(typeof(NotificationMessageType), settings.MessageType).ToLower();
1750 string messageLayoutClass = Enum.GetName(typeof(NotificationMessageLayout), settings.MessageLayout).ToLower();
1751 string minHeightClass = settings.Icon != null ? "u-min-h70px" : "";
1752
1753 <div class="notification-message-@messageTypeClass notification-message-@messageLayoutClass @messageLayoutClass @minHeightClass @settings.CssClass u-full-width dw-mod" @ComponentMethods.AddAttributes(attributes)>
1754 @if (settings.Icon != null) {
1755 settings.Icon.Label = !string.IsNullOrEmpty(settings.Icon.Label) ? settings.Message + settings.Icon.Label : settings.Message;
1756 @Render(settings.Icon)
1757 } else {
1758 @settings.Message
1759 }
1760 </div>
1761 }
1762 }
1763 @using Dynamicweb.Rapido.Blocks.Components.General
1764
1765
1766 @* Component *@
1767
1768 @helper RenderHandlebarsRoot(HandlebarsRoot settings) {
1769 string preRender = !String.IsNullOrEmpty(settings.PreRenderScriptTemplate) ? "data-pre-render-template=\"" + settings.PreRenderScriptTemplate + "\"" : "";
1770
1771 <div class="@settings.CssClass dw-mod js-handlebars-root" id="@settings.Id" data-template="@settings.ScriptTemplate" data-json-feed="@settings.FeedUrl" data-init-onload="@settings.InitOnLoad.ToString()" data-preloader="@settings.Preloader" @preRender>
1772 @if (settings.SubBlocks != null) {
1773 @RenderBlockList(settings.SubBlocks)
1774 }
1775 </div>
1776 }
1777 @using System.Reflection
1778 @using Dynamicweb.Rapido.Blocks.Components.General
1779 @using Dynamicweb.Rapido.Blocks.Components
1780 @using System.Text.RegularExpressions
1781
1782
1783 @* Component *@
1784
1785 @helper RenderSticker(Sticker settings) {
1786 if (!String.IsNullOrEmpty(settings.Title)) {
1787 string size = settings.Size.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Size.ToString().ToLower() : "";
1788 string style = settings.Style.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Style.ToString().ToLower() : "";
1789
1790 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>();
1791 if (!String.IsNullOrEmpty(settings.Color) || !String.IsNullOrEmpty(settings.BackgroundColor)) {
1792 string styleTag = !String.IsNullOrEmpty(settings.Color) ? "color: " + settings.Color + "; " : "";
1793 styleTag += !String.IsNullOrEmpty(settings.BackgroundColor) ? "background-color: " + settings.BackgroundColor + "; " : "";
1794 optionalAttributes.Add("style", styleTag);
1795 }
1796
1797 <div class="stickers-container__tag @size @style @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Title</div>
1798 }
1799 }
1800
1801 @using System.Reflection
1802 @using Dynamicweb.Rapido.Blocks.Components.General
1803 @using Dynamicweb.Rapido.Blocks.Components
1804
1805
1806 @* Component *@
1807
1808 @helper RenderStickersCollection(StickersCollection settings)
1809 {
1810 if (settings.Stickers.Count > 0)
1811 {
1812 string position = "stickers-container--" + Regex.Replace(settings.Position.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower();
1813
1814 <div class="stickers-container @position @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
1815 @foreach (Sticker sticker in settings.Stickers)
1816 {
1817 @Render(sticker)
1818 }
1819 </div>
1820 }
1821 }
1822
1823 @using Dynamicweb.Rapido.Blocks.Components.General
1824
1825
1826 @* Component *@
1827
1828 @helper RenderForm(Form settings) {
1829 if (settings != null)
1830 {
1831 Dictionary<string, string> optionalAttributes = new Dictionary<string, string>();
1832 if (!string.IsNullOrEmpty(settings.Action)) { optionalAttributes.Add("action", settings.Action); };
1833 if (!string.IsNullOrEmpty(settings.Name)) { optionalAttributes.Add("name", settings.Name); };
1834 if (!string.IsNullOrEmpty(settings.OnSubmit)) { optionalAttributes.Add("onsubmit", settings.OnSubmit); };
1835 var enctypes = new Dictionary<string, string>
1836 {
1837 { "multipart", "multipart/form-data" },
1838 { "text", "text/plain" },
1839 { "application", "application/x-www-form-urlencoded" }
1840 };
1841 if (settings.Enctype != FormEnctype.none) { optionalAttributes.Add("enctype", enctypes[Enum.GetName(typeof(FormEnctype), settings.Enctype).ToLower()]); };
1842 optionalAttributes.Add("method", settings.Method.ToString());
1843
1844 if (!string.IsNullOrEmpty(settings.FormStartMarkup))
1845 {
1846 @settings.FormStartMarkup
1847 }
1848 else
1849 {
1850 @:<form class="@settings.CssClass u-no-margin dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
1851 }
1852
1853 foreach (var field in settings.GetFields())
1854 {
1855 @Render(field)
1856 }
1857
1858 @:</form>
1859 }
1860 }
1861 @using System.Reflection
1862 @using Dynamicweb.Rapido.Blocks.Components.General
1863 @using Dynamicweb.Rapido.Blocks.Components
1864
1865
1866 @* Component *@
1867
1868 @helper RenderText(Text settings)
1869 {
1870 @settings.Content
1871 }
1872 @using System.Reflection
1873 @using Dynamicweb.Rapido.Blocks.Components.General
1874 @using Dynamicweb.Rapido.Blocks.Components
1875
1876
1877 @* Component *@
1878
1879 @helper RenderContentModule(ContentModule settings) {
1880 if (!string.IsNullOrEmpty(settings.Content))
1881 {
1882 @settings.Content
1883 }
1884 }
1885 @using System.Reflection
1886 @using Dynamicweb.Rapido.Blocks.Components.General
1887 @using Dynamicweb.Rapido.Blocks.Components
1888
1889
1890 @* Component *@
1891
1892 @helper RenderModal(Modal settings) {
1893 if (settings != null)
1894 {
1895 string modalId = !string.IsNullOrEmpty(settings.Id) ? settings.Id : Guid.NewGuid().ToString("N");
1896
1897 string onchange = !string.IsNullOrEmpty(settings.OnClose) ? "onchange=\"if(!this.checked){" + settings.OnClose + "}\"" : "";
1898
1899 <input type="checkbox" id="@(modalId)ModalTrigger" class="modal-trigger" @onchange />
1900
1901 <div class="modal-container">
1902 @if (!settings.DisableDarkOverlay)
1903 {
1904 <label for="@(modalId)ModalTrigger" id="@(modalId)ModalOverlay" class="modal-overlay"></label>
1905 }
1906 <div class="modal modal--@settings.Width.ToString().ToLower() modal-height--@settings.Height.ToString().ToLower()" id="@(modalId)Modal">
1907 @if (settings.Heading != null)
1908 {
1909 if (!string.IsNullOrEmpty(settings.Heading.Title))
1910 {
1911 <div class="modal__header">
1912 @Render(settings.Heading)
1913 </div>
1914 }
1915 }
1916 <div class="modal__body @(settings.Width.ToString().ToLower() == "full" ? "modal__body--full" : "")">
1917 @if (!string.IsNullOrEmpty(settings.BodyText))
1918 {
1919 @settings.BodyText
1920 }
1921 @if (settings.BodyTemplate != null)
1922 {
1923 @settings.BodyTemplate
1924 }
1925 @{
1926 var actions = settings.GetActions();
1927 }
1928 </div>
1929 @if (actions.Length > 0)
1930 {
1931 <div class="modal__footer">
1932 @foreach (var action in actions)
1933 {
1934 if (Pageview.Device.ToString() != "Mobile") {
1935 action.CssClass += " u-no-margin";
1936 } else {
1937 action.CssClass += " u-full-width u-margin-bottom";
1938 }
1939
1940 @Render(action)
1941 }
1942 </div>
1943 }
1944 <label class="modal__close-btn" for="@(modalId)ModalTrigger"></label>
1945 </div>
1946 </div>
1947 }
1948 }
1949 @using Dynamicweb.Rapido.Blocks.Components.General
1950
1951 @* Component *@
1952
1953 @helper RenderMediaListItem(MediaListItem settings)
1954 {
1955 <div class="media-list-item @settings.CssClass dw-mod" @(!string.IsNullOrEmpty(settings.Id) ? "id=\"" + settings.Id + "\"" : "")>
1956 @if (!string.IsNullOrEmpty(settings.Label))
1957 {
1958 if (!string.IsNullOrEmpty(settings.Link))
1959 {
1960 @Render(new Link
1961 {
1962 Href = settings.Link,
1963 CssClass = "media-list-item__sticker dw-mod",
1964 ButtonLayout = ButtonLayout.None,
1965 Title = settings.Label,
1966 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : ""
1967 })
1968 }
1969 else if (!string.IsNullOrEmpty(settings.OnClick))
1970 {
1971 <span class="media-list-item__sticker dw-mod" onclick="@(settings.OnClick)">
1972 <span class="u-uppercase">@settings.Label</span>
1973 </span>
1974 }
1975 else
1976 {
1977 <span class="media-list-item__sticker media-list-item__sticker--no-link dw-mod">
1978 <span class="u-uppercase">@settings.Label</span>
1979 </span>
1980 }
1981 }
1982 <div class="media-list-item__wrap">
1983 <div class="media-list-item__info dw-mod">
1984 <div class="media-list-item__header dw-mod">
1985 @if (!string.IsNullOrEmpty(settings.Title))
1986 {
1987 if (!string.IsNullOrEmpty(settings.Link))
1988 {
1989 @Render(new Link
1990 {
1991 Href = settings.Link,
1992 CssClass = "media-list-item__name dw-mod",
1993 ButtonLayout = ButtonLayout.None,
1994 Title = settings.Title,
1995 OnClick = !string.IsNullOrEmpty(settings.OnClick) ? settings.OnClick : ""
1996 })
1997 }
1998 else if (!string.IsNullOrEmpty(settings.OnClick))
1999 {
2000 <span class="media-list-item__name dw-mod" onclick="@(settings.OnClick)">@settings.Title</span>
2001 }
2002 else
2003 {
2004 <span class="media-list-item__name media-list-item__name--no-link dw-mod">@settings.Title</span>
2005 }
2006 }
2007
2008 @if (!string.IsNullOrEmpty(settings.Status))
2009 {
2010 <div class="media-list-item__state dw-mod">@settings.Status</div>
2011 }
2012 </div>
2013 @{
2014 settings.InfoTable.CssClass += " media-list-item__parameters-table";
2015 }
2016
2017 @Render(settings.InfoTable)
2018 </div>
2019 <div class="media-list-item__actions dw-mod">
2020 <div class="media-list-item__actions-list dw-mod">
2021 @{
2022 var actions = settings.GetActions();
2023
2024 foreach (ButtonBase action in actions)
2025 {
2026 action.ButtonLayout = ButtonLayout.None;
2027 action.CssClass += " media-list-item__action link";
2028
2029 @Render(action)
2030 }
2031 }
2032 </div>
2033
2034 @if (settings.SelectButton != null && !string.IsNullOrEmpty(settings.SelectButton.Title))
2035 {
2036 settings.SelectButton.CssClass += " u-no-margin";
2037
2038 <div class="media-list-item__action-button">
2039 @Render(settings.SelectButton)
2040 </div>
2041 }
2042 </div>
2043 </div>
2044 </div>
2045 }
2046 @using Dynamicweb.Rapido.Blocks.Components.General
2047 @using Dynamicweb.Rapido.Blocks.Components
2048
2049 @helper RenderTable(Table settings)
2050 {
2051 Dictionary<string, string> attributes = new Dictionary<string, string>();
2052 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
2053
2054 var enumToClasses = new Dictionary<TableDesign, string>
2055 {
2056 { TableDesign.Clean, "table--clean" },
2057 { TableDesign.Bordered, "table--bordered" },
2058 { TableDesign.Striped, "table--striped" },
2059 { TableDesign.Hover, "table--hover" },
2060 { TableDesign.Compact, "table--compact" },
2061 { TableDesign.Condensed, "table--condensed" },
2062 { TableDesign.NoTopBorder, "table--no-top-border" }
2063 };
2064 string tableDesignClass = "";
2065 if (settings.Design != TableDesign.None)
2066 {
2067 tableDesignClass = enumToClasses[settings.Design];
2068 }
2069
2070 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableDesign.None) { attributes.Add("class", "table " + tableDesignClass + " " + settings.CssClass + " dw-mod"); }
2071
2072 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value);
2073
2074 <table @ComponentMethods.AddAttributes(resultAttributes)>
2075 @if (settings.Header != null)
2076 {
2077 <thead>
2078 @Render(settings.Header)
2079 </thead>
2080 }
2081 <tbody>
2082 @foreach (var row in settings.Rows)
2083 {
2084 @Render(row)
2085 }
2086 </tbody>
2087 @if (settings.Footer != null)
2088 {
2089 <tfoot>
2090 @Render(settings.Footer)
2091 </tfoot>
2092 }
2093 </table>
2094 }
2095 @using Dynamicweb.Rapido.Blocks.Components.General
2096 @using Dynamicweb.Rapido.Blocks.Components
2097
2098 @helper RenderTableRow(TableRow settings)
2099 {
2100 Dictionary<string, string> attributes = new Dictionary<string, string>();
2101 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
2102
2103 var enumToClasses = new Dictionary<TableRowDesign, string>
2104 {
2105 { TableRowDesign.NoBorder, "table__row--no-border" },
2106 { TableRowDesign.Border, "table__row--border" },
2107 { TableRowDesign.TopBorder, "table__row--top-line" },
2108 { TableRowDesign.BottomBorder, "table__row--bottom-line" },
2109 { TableRowDesign.Solid, "table__row--solid" }
2110 };
2111
2112 string tableRowDesignClass = "";
2113 if (settings.Design != TableRowDesign.None)
2114 {
2115 tableRowDesignClass = enumToClasses[settings.Design];
2116 }
2117
2118 if (!string.IsNullOrEmpty(settings.CssClass) || settings.Design != TableRowDesign.None) { attributes.Add("class", "table__row " + tableRowDesignClass + " " + settings.CssClass + " dw-mod"); }
2119
2120 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value);
2121
2122 <tr @ComponentMethods.AddAttributes(resultAttributes)>
2123 @foreach (var cell in settings.Cells)
2124 {
2125 if (settings.IsHeaderRow)
2126 {
2127 cell.IsHeader = true;
2128 }
2129 @Render(cell)
2130 }
2131 </tr>
2132 }
2133 @using Dynamicweb.Rapido.Blocks.Components.General
2134 @using Dynamicweb.Rapido.Blocks.Components
2135 @using Dynamicweb.Core
2136
2137 @helper RenderTableCell(TableCell settings)
2138 {
2139 Dictionary<string, string> attributes = new Dictionary<string, string>();
2140 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
2141 if (settings.Colspan != 0) { attributes.Add("colspan", Converter.ToString(settings.Colspan)); }
2142 if (settings.Rowspan != 0) { attributes.Add("rowspan", Converter.ToString(settings.Rowspan)); }
2143 if (!string.IsNullOrEmpty(settings.CssClass)) { attributes.Add("class", settings.CssClass + " dw-mod"); }
2144
2145 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.Last().Value);
2146
2147 string tagName = settings.IsHeader ? "th" : "td";
2148
2149 @("<" + tagName + " " + ComponentMethods.AddAttributes(resultAttributes) + ">")
2150 @settings.Content
2151 @("</" + tagName + ">");
2152 }
2153 @using System.Linq
2154 @using Dynamicweb.Rapido.Blocks.Components.General
2155
2156 @* Component *@
2157
2158 @helper RenderPagination(Dynamicweb.Rapido.Blocks.Components.General.Pagination settings)
2159 {
2160 var pageNumberQueryStringName = Dynamicweb.Rapido.Services.Pagination.GetPageNumberQueryStringName(settings); // Get the proper 'page number' query string parameter
2161 var queryParameters = Dynamicweb.Rapido.Services.Url.GetQueryParameters(pageNumberQueryStringName); // Get the NameValueCollection from the querystring
2162
2163 if (settings.NumberOfPages > 1)
2164 {
2165 string url = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + "/Default.aspx";
2166 string ariaLabel = !string.IsNullOrWhiteSpace(settings.AriaLabel) ? settings.AriaLabel : Translate("Page navigation");
2167 Dictionary<string, int> startAndEndPageNumber = Dynamicweb.Rapido.Services.Pagination.GetStartAndEndPageNumber(settings);
2168
2169 <div class="pager u-margin-top dw-mod @settings.CssClass" aria-label="@ariaLabel">
2170 @if (settings.ShowPagingInfo)
2171 {
2172 <div class="pager__info dw-mod">
2173 @Translate("Page") @settings.CurrentPageNumber @Translate("of") @settings.NumberOfPages
2174 </div>
2175 }
2176 <ul class="pager__list dw-mod">
2177 @if (!string.IsNullOrWhiteSpace(settings.FirstPageUrl) && settings.ShowFirstAndLastControls)
2178 {
2179 @Render(new PaginationItem { Link = settings.FirstPageUrl, Icon = settings.FirstIcon })
2180 }
2181 @if (!string.IsNullOrWhiteSpace(settings.PreviousPageUrl) && settings.ShowNextAndPrevControls)
2182 {
2183 @Render(new PaginationItem { Link = settings.PreviousPageUrl, Icon = settings.PrevIcon })
2184 }
2185 @if (settings.GetPages().Any())
2186 {
2187 foreach (var page in settings.GetPages())
2188 {
2189 @Render(page)
2190 }
2191 }
2192 else
2193 {
2194 for (var page = startAndEndPageNumber["StartPage"]; page <= startAndEndPageNumber["EndPage"]; page++)
2195 {
2196 queryParameters = Dynamicweb.Rapido.Services.Url.UpdateQueryStringParameter(queryParameters, pageNumberQueryStringName, page.ToString());
2197 @Render(new PaginationItem { Label = page.ToString(), Link = Dynamicweb.Rapido.Services.Url.BuildUri(url, queryParameters).PathAndQuery, IsActive = (settings.CurrentPageNumber == page) });
2198 }
2199 }
2200 @if (!string.IsNullOrWhiteSpace(settings.NextPageUrl) && settings.ShowNextAndPrevControls)
2201 {
2202 @Render(new PaginationItem { Link = settings.NextPageUrl, Icon = settings.NextIcon })
2203 }
2204 @if (!string.IsNullOrWhiteSpace(settings.LastPageUrl) && settings.ShowFirstAndLastControls)
2205 {
2206 @Render(new PaginationItem { Link = settings.LastPageUrl, Icon = settings.LastIcon })
2207 }
2208 </ul>
2209 </div>
2210 }
2211 }
2212
2213 @helper RenderPaginationItem(PaginationItem settings)
2214 {
2215 if (settings.Icon == null)
2216 {
2217 settings.Icon = new Icon();
2218 }
2219
2220 settings.Icon.Label = settings.Label;
2221 <li class="pager__btn dw-mod">
2222 @if (settings.IsActive)
2223 {
2224 <span class="pager__num pager__num--current dw-mod">
2225 @Render(settings.Icon)
2226 </span>
2227 }
2228 else
2229 {
2230 <a href="@settings.Link" class="pager__num dw-mod">
2231 @Render(settings.Icon)
2232 </a>
2233 }
2234 </li>
2235 }
2236
2237
2238 @using Dynamicweb.Rapido.Blocks.Components.General
2239 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
2240
2241
2242 @using Dynamicweb.Frontend
2243 @using System.Reflection
2244 @using Dynamicweb.Content.Items
2245 @using System.Web.UI.HtmlControls
2246 @using Dynamicweb.Rapido.Blocks.Components
2247 @using Dynamicweb.Rapido.Blocks
2248 @using Dynamicweb.Rapido.Blocks.Components.Articles
2249
2250 @* Components for the articles *@
2251 @using System.Reflection
2252 @using Dynamicweb.Rapido.Blocks.Components.Articles
2253
2254
2255 @* Component for the articles *@
2256
2257 @helper RenderArticleBanner(dynamic settings) {
2258 string filterClasses = "image-filter image-filter--darken";
2259 settings.Layout = ArticleHeaderLayout.Banner;
2260
2261 if (settings.Image != null)
2262 {
2263 if (settings.Image.Path != null)
2264 {
2265 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width">
2266 <div class="background-image @filterClasses dw-mod">
2267 <div class="background-image__wrapper @filterClasses dw-mod">
2268 @{
2269 settings.Image.CssClass += "background-image__cover dw-mod";
2270 }
2271 @Render(settings.Image)
2272 </div>
2273 </div>
2274 <div class="center-container dw-mod">
2275 <div class="grid">
2276 <div class="grid__col-md-8 grid__col-xs-12 paragraph-container paragraph-container--height-lg">
2277 <div class="u-left-middle">
2278 <div>
2279 @if (!String.IsNullOrEmpty(settings.Heading))
2280 {
2281 <h1 class="article__header article__header--giant dw-mod" style="color: @settings.TextColor">@settings.Heading</h1>
2282 }
2283 @if (!String.IsNullOrEmpty(settings.Subheading))
2284 {
2285 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div>
2286 }
2287 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
2288 {
2289 <small class="article__post-info u-margin-bottom--lg dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small>
2290 }
2291 @if (!String.IsNullOrEmpty(settings.Link)) {
2292 <div class="grid__cell">
2293 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout })
2294 </div>
2295 }
2296 </div>
2297 </div>
2298 </div>
2299 @if (settings.ExternalParagraphId != 0)
2300 {
2301 <div class="grid__col-md-4 grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod">
2302 <div class="u-color-light-gray--bg u-color-dark dw-mod">
2303 @RenderParagraphContent(settings.ExternalParagraphId)
2304 </div>
2305 </div>
2306 }
2307
2308 </div>
2309 </div>
2310 </section>
2311 if (!String.IsNullOrEmpty(settings.Image.Caption)) {
2312 <div class="image-caption dw-mod">@settings.Image.Caption</div>
2313 }
2314 }
2315 else
2316 {
2317 settings.Layout = ArticleHeaderLayout.Clean;
2318 @RenderArticleCleanHeader(settings);
2319 }
2320 }
2321 else
2322 {
2323 settings.Layout = ArticleHeaderLayout.Clean;
2324 @RenderArticleCleanHeader(settings);
2325 }
2326 }
2327 @using System.Reflection
2328 @using Dynamicweb.Rapido.Blocks.Components
2329 @using Dynamicweb.Rapido.Blocks.Components.General
2330 @using Dynamicweb.Rapido.Blocks.Components.Articles
2331 @using Dynamicweb.Rapido.Blocks
2332
2333
2334 @* Component for the articles *@
2335
2336 @helper RenderArticleHeader(ArticleHeader settings) {
2337 dynamic[] methodParameters = new dynamic[1];
2338 methodParameters[0] = settings;
2339 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleHeaderCustom");
2340
2341 if (customMethod != null)
2342 {
2343 @customMethod.Invoke(this, methodParameters).ToString();
2344 } else {
2345 switch (settings.Layout)
2346 {
2347 case ArticleHeaderLayout.Clean:
2348 @RenderArticleCleanHeader(settings);
2349 break;
2350 case ArticleHeaderLayout.Split:
2351 @RenderArticleSplitHeader(settings);
2352 break;
2353 case ArticleHeaderLayout.Banner:
2354 @RenderArticleBannerHeader(settings);
2355 break;
2356 case ArticleHeaderLayout.Overlay:
2357 @RenderArticleOverlayHeader(settings);
2358 break;
2359 default:
2360 @RenderArticleCleanHeader(settings);
2361 break;
2362 }
2363 }
2364 }
2365
2366 @helper RenderArticleCleanHeader(ArticleHeader settings) {
2367 dynamic[] methodParameters = new dynamic[1];
2368 methodParameters[0] = settings;
2369 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleCleanHeaderCustom");
2370
2371 if (customMethod != null)
2372 {
2373 @customMethod.Invoke(this, methodParameters).ToString();
2374 }
2375 else
2376 {
2377 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12";
2378
2379 <div class="grid grid--align-content-start grid--justify-start">
2380 <div class="grid__col-md-@contentColumns grid__col-sm-12 u-padding--lg dw-mod">
2381 @if (!String.IsNullOrEmpty(settings.Category) || !String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date) || settings.RatingOutOf != 0)
2382 {
2383 <div class="u-border-bottom u-padding-bottom">
2384 @if (!String.IsNullOrEmpty(settings.Category))
2385 {
2386 <div class="u-pull--left">
2387 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div>
2388 </div>
2389 }
2390 <div class="u-pull--right">
2391 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
2392 {
2393 <small class="article__post-info dw-mod">@settings.Author @settings.Date</small>
2394 }
2395 @if (settings.RatingOutOf != 0)
2396 {
2397 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf })
2398 }
2399 </div>
2400 </div>
2401 }
2402
2403 <div class="grid__cell">
2404 @if (!String.IsNullOrEmpty(settings.Heading))
2405 {
2406 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1>
2407 }
2408 @if (settings.Image != null)
2409 {
2410 if (settings.Image.Path != null)
2411 {
2412 <div class="u-padding-bottom--lg">
2413 @Render(settings.Image)
2414 </div>
2415 }
2416 }
2417 @if (!String.IsNullOrEmpty(settings.Subheading))
2418 {
2419 <div class="article__leadtext dw-mod">@settings.Subheading</div>
2420 }
2421 @if (!String.IsNullOrEmpty(settings.Link))
2422 {
2423 <div class="grid__cell">
2424 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout })
2425 </div>
2426 }
2427 </div>
2428 </div>
2429 @if (settings.ExternalParagraphId != 0)
2430 {
2431 <div class="grid__col-md-4 grid__col-sm-12 u-padding--lg u-color-light-gray--bg dw-mod">
2432 @RenderParagraphContent(settings.ExternalParagraphId)
2433 </div>
2434 }
2435 </div>
2436 }
2437 }
2438
2439 @helper RenderArticleSplitHeader(ArticleHeader settings) {
2440 dynamic[] methodParameters = new dynamic[1];
2441 methodParameters[0] = settings;
2442 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleSplitHeaderCustom");
2443
2444 if (customMethod != null)
2445 {
2446 @customMethod.Invoke(this, methodParameters).ToString();
2447 }
2448 else
2449 {
2450 string headerColumnWidth = settings.ExternalParagraphId != 0 ? "4" : "6";
2451
2452 if (settings.Image != null)
2453 {
2454 if (settings.Image.Path != null)
2455 {
2456 <section class="multiple-paragraphs-container paragraph-container--full-width">
2457 <div class="grid">
2458 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-xl dw-mod">
2459 <div class="u-left-middle u-padding--lg">
2460 <div>
2461 @if (!String.IsNullOrEmpty(settings.Category))
2462 {
2463 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div>
2464 }
2465 @if (!String.IsNullOrEmpty(settings.Heading))
2466 {
2467 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1>
2468 }
2469 @if (!String.IsNullOrEmpty(settings.Subheading))
2470 {
2471 <div class="article__leadtext dw-mod">@settings.Subheading</div>
2472 }
2473 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
2474 {
2475 <small class="article__post-info u-pull--left dw-mod">@settings.Author @settings.Date</small>
2476 }
2477 @if (settings.RatingOutOf != 0)
2478 {
2479 <div class="u-pull--right">
2480 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf })
2481 </div>
2482 }
2483 @if (!String.IsNullOrEmpty(settings.Link)) {
2484 <div class="u-full-width u-pull--left u-margin-top">
2485 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout })
2486 </div>
2487 }
2488 </div>
2489 </div>
2490 </div>
2491 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod" style="background-image:url(/Admin/Public/GetImage.ashx?width=1800&height=1100&crop=0&Compression=85&DoNotUpscale=true&image=@settings.Image.Path); background-position: center center; background-size: cover;"></div>
2492 @if (settings.ExternalParagraphId != 0)
2493 {
2494 <div class="grid__col-md-4 grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto u-color-light-gray--bg dw-mod">
2495 @RenderParagraphContent(settings.ExternalParagraphId)
2496 </div>
2497 }
2498 </div>
2499 </section>
2500 }
2501 }
2502 else
2503 {
2504 @RenderArticleCleanHeader(settings);
2505 }
2506 }
2507 }
2508
2509 @helper RenderArticleOverlayHeader(ArticleHeader settings) {
2510 dynamic[] methodParameters = new dynamic[1];
2511 methodParameters[0] = settings;
2512 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleOverlayHeaderCustom");
2513
2514 if (customMethod != null)
2515 {
2516 @customMethod.Invoke(this, methodParameters).ToString();
2517 }
2518 else
2519 {
2520 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12";
2521 string contentAlignment = settings.TextLayout == ArticleHeaderTextLayout.Center ? "grid--justify-center" : "";
2522
2523 if (settings.Image != null)
2524 {
2525 if (settings.Image.Path != null)
2526 {
2527 if (settings.ExternalParagraphId == 0)
2528 {
2529 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width">
2530 <div class="background-image image-filter image-filter--darken dw-mod">
2531 <div class="background-image__wrapper image-filter image-filter--darken dw-mod">
2532 @{
2533 settings.Image.CssClass += "background-image__cover dw-mod";
2534 }
2535 @Render(settings.Image)
2536 </div>
2537 </div>
2538 <div class="center-container dw-mod">
2539 <div class="grid @contentAlignment">
2540 <div class="grid__col-md-@contentColumns grid__col-xs-12 paragraph-container paragraph-container--height-xl dw-mod">
2541 @if (!string.IsNullOrEmpty(settings.Heading))
2542 {
2543 <h1 class="article__header article__header--giant u-padding-top--lg dw-mod" style="color: @settings.TextColor">@settings.Heading</h1>
2544 }
2545 @if (!String.IsNullOrEmpty(settings.Subheading))
2546 {
2547 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div>
2548 }
2549 <div class="u-margin-top">
2550 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
2551 {
2552 <small class="article__post-info u-pull--left dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small>
2553 }
2554 @if (settings.RatingOutOf != 0)
2555 {
2556 <div class="u-pull--right">
2557 @Render(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf })
2558 </div>
2559 }
2560 </div>
2561 @if (!String.IsNullOrEmpty(settings.Link))
2562 {
2563 <div class="grid__cell">
2564 @Render(new Link { Href = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout })
2565 </div>
2566 }
2567 </div>
2568 </div>
2569 </div>
2570 </section>
2571 }
2572 else
2573 {
2574 @RenderArticleBanner(settings);
2575 }
2576 }
2577 }
2578 else
2579 {
2580 @RenderArticleCleanHeader(settings);
2581 }
2582 }
2583 }
2584
2585 @helper RenderArticleBannerHeader(dynamic settings) {
2586 dynamic[] methodParameters = new dynamic[1];
2587 methodParameters[0] = settings;
2588 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleBannerHeaderCustom");
2589
2590 if (customMethod != null)
2591 {
2592 @customMethod.Invoke(this, methodParameters).ToString();
2593 }
2594 else
2595 {
2596 @RenderArticleBanner(settings);
2597 }
2598 }
2599 @using System.Reflection
2600 @using System.Text.RegularExpressions;
2601 @using Dynamicweb.Frontend
2602 @using Dynamicweb.Content.Items
2603 @using Dynamicweb.Rapido.Blocks.Components
2604 @using Dynamicweb.Rapido.Blocks.Components.Articles
2605 @using Dynamicweb.Rapido.Blocks
2606
2607 @* Component for the articles *@
2608
2609 @helper RenderArticleBodyRow(ArticleBodyRow settings)
2610 {
2611 string position = settings.TopLayout == "overlay" ? "article__overlay-offset" : "";
2612 string contentAlignment = settings.TextLayout == "center" ? "grid--justify-center" : "";
2613
2614 <div class="grid grid--align-content-start @contentAlignment @position dw-mod">
2615 @RenderBlockList(settings.SubBlocks)
2616 </div>
2617 }
2618 @using System.Reflection
2619 @using Dynamicweb.Rapido.Blocks.Components
2620 @using Dynamicweb.Rapido.Blocks.Components.General
2621 @using Dynamicweb.Rapido.Blocks.Components.Articles
2622 @using Dynamicweb.Rapido.Blocks
2623
2624 @* Component for the articles *@
2625
2626 @helper RenderArticleImage(ArticleImage settings)
2627 {
2628 if (settings.Image != null)
2629 {
2630 if (settings.Image.Path != null)
2631 {
2632 <div class="u-margin-bottom--lg">
2633 @Render(settings.Image)
2634 </div>
2635 }
2636 }
2637 }
2638 @using System.Reflection
2639 @using Dynamicweb.Rapido.Blocks.Components
2640 @using Dynamicweb.Rapido.Blocks.Components.Articles
2641
2642
2643 @* Component for the articles *@
2644
2645 @helper RenderArticleSubHeader(ArticleSubHeader settings)
2646 {
2647 if (!String.IsNullOrEmpty(settings.Title))
2648 {
2649 <h2 class="article__header">@settings.Title</h2>
2650 }
2651 }
2652 @using System.Reflection
2653 @using Dynamicweb.Rapido.Blocks.Components
2654 @using Dynamicweb.Rapido.Blocks.Components.Articles
2655 @using Dynamicweb.Rapido.Blocks
2656
2657
2658 @* Component for the articles *@
2659
2660 @helper RenderArticleText(ArticleText settings)
2661 {
2662 if (!String.IsNullOrEmpty(settings.Text))
2663 {
2664 string greatTextClass = settings.EnableLargeText == true ? "article__paragraph--great-text" : "";
2665
2666 <div class="article__paragraph @greatTextClass dw-mod">
2667 @settings.Text
2668 </div>
2669 }
2670 }
2671 @using System.Reflection
2672 @using Dynamicweb.Rapido.Blocks.Components
2673 @using Dynamicweb.Rapido.Blocks.Components.Articles
2674 @using Dynamicweb.Rapido.Blocks
2675
2676
2677 @* Component for the articles *@
2678
2679 @helper RenderArticleQuote(ArticleQuote settings)
2680 {
2681 string text = Regex.Replace(settings.Text, "<.*?>", String.Empty);
2682
2683 <div class="grid u-padding-bottom--lg">
2684 @if (settings.Image != null)
2685 {
2686 if (settings.Image.Path != null) {
2687 <div class="grid__col-3">
2688 <div class="grid__cell-img">
2689 @{
2690 settings.Image.Title = !String.IsNullOrEmpty(settings.Image.Title) ? settings.Image.Title : settings.Author;
2691 settings.Image.CssClass += " article__image article__image--ball";
2692 settings.Image.ImageDefault.Width = 200;
2693 settings.Image.ImageDefault.Height = 200;
2694 }
2695 @Render(settings.Image)
2696 </div>
2697 </div>
2698 }
2699 }
2700 <div class="grid__col-auto">
2701 @if (!String.IsNullOrEmpty(settings.Text))
2702 {
2703 <div class="article__quote dw-mod">
2704 <i class="fas fa-quote-right u-margin-bottom--lg"></i>
2705 @settings.Text
2706 <i class="fas fa-quote-right"></i>
2707 </div>
2708 }
2709 @if (!String.IsNullOrEmpty(settings.Author))
2710 {
2711 <div class="article__quote-author dw-mod">
2712 - @settings.Author
2713 </div>
2714 }
2715 </div>
2716 </div>
2717 }
2718 @using System.Reflection
2719 @using Dynamicweb.Rapido.Blocks.Components
2720 @using Dynamicweb.Rapido.Blocks.Components.Articles
2721 @using Dynamicweb.Rapido.Blocks
2722
2723 @* Component for the articles *@
2724
2725 @helper RenderArticleInfoTable(ArticleInfoTable settings)
2726 {
2727 <table class="table table--clean">
2728 @foreach (var row in settings.Rows)
2729 {
2730 string iconColor = row.IconColor != null ? row.IconColor : "u-brand-color-two";
2731
2732 <tr>
2733 @if (!String.IsNullOrEmpty(row.Icon))
2734 {
2735 <td class="u-w32px"><i class="@row.Icon fa-2x @row.IconColor"></i></td>
2736 }
2737 <td class="u-no-margin-on-p-elements">
2738 <div class="u-bold">@row.Title</div>
2739 @if (!String.IsNullOrEmpty(row.SubTitle))
2740 {
2741 if (row.Link == null)
2742 {
2743 <div>@row.SubTitle</div>
2744 }
2745 else
2746 {
2747 <a href="@row.Link" class="u-color-inherit">@row.SubTitle</a>
2748 }
2749 }
2750 </td>
2751 </tr>
2752 }
2753 </table>
2754 }
2755 @using System.Reflection
2756 @using Dynamicweb.Rapido.Blocks.Components
2757 @using Dynamicweb.Rapido.Blocks.Components.General
2758 @using Dynamicweb.Rapido.Blocks.Components.Articles
2759 @using Dynamicweb.Rapido.Blocks
2760
2761 @* Component for the articles *@
2762
2763 @helper RenderArticleGalleryModal(ArticleGalleryModal settings)
2764 {
2765 Modal galleryModal = new Modal
2766 {
2767 Id = "ParagraphGallery",
2768 Width = ModalWidth.Full,
2769 BodyTemplate = RenderArticleGalleryModalContent()
2770 };
2771
2772 @Render(galleryModal)
2773 }
2774
2775 @helper RenderArticleGalleryModalContent() {
2776 <div class="modal__image-min-size-wrapper">
2777 @Render(new Image {
2778 Id = "ParagraphGallery",
2779 Path = "#",
2780 CssClass = "modal--full__img",
2781 DisableLazyLoad = true,
2782 DisableImageEngine = true
2783 })
2784 </div>
2785
2786 <div class="modal__images-counter" id="ParagraphGallery_counter"></div>
2787
2788 @Render(new Button {
2789 Id = "ParagraphGallery_prev",
2790 ButtonType = ButtonType.Button,
2791 ButtonLayout = ButtonLayout.None,
2792 CssClass = "modal__prev-btn",
2793 Icon = new Icon { Prefix = "far", Name = "fa-angle-left", LabelPosition = IconLabelPosition.After },
2794 OnClick = "Gallery.prevImage('ParagraphGallery')"
2795 })
2796
2797 @Render(new Button {
2798 Id = "ParagraphGallery_next",
2799 ButtonType = ButtonType.Button,
2800 ButtonLayout = ButtonLayout.None,
2801 CssClass = "modal__next-btn",
2802 Icon = new Icon { Prefix = "far", Name = "fa-angle-right", LabelPosition = IconLabelPosition.After },
2803 OnClick = "Gallery.nextImage('ParagraphGallery')"
2804 })
2805 }
2806 @using System.Reflection
2807 @using Dynamicweb.Rapido.Blocks.Components
2808 @using Dynamicweb.Rapido.Blocks.Components.Articles
2809 @using Dynamicweb.Rapido.Blocks
2810
2811
2812 @* Component for the articles *@
2813
2814 @helper RenderArticleRelated(ArticleRelated settings)
2815 {
2816 string cardClass = Pageview.Device.ToString() != "Tablet" ? "card u-color-light--bg u-full-height" : "";
2817 string cardFooterClass = Pageview.Device.ToString() != "Tablet" ? "card-footer u-color-light--bg" : "";
2818
2819 <section class="multiple-paragraphs-container u-color-light-gray--bg paragraph-container--full-width">
2820 <div class="center-container dw-mod">
2821 <div class="grid u-padding">
2822 <div class="grid__col-md-12 grid__col-xs-12">
2823 <h2 class="article__header u-no-margin u-margin-top">@settings.Title</h2>
2824 </div>
2825 </div>
2826
2827 <div class="js-handlebars-root u-padding" id="@settings.Title.Replace(" ", String.Empty)" data-template="RelatedSimpleTemplate" data-json-feed="/Default.aspx?ID=@settings.FeedPageId&@settings.Query&ExcludeItemID=@settings.CurrentPageId&PageSize=@settings.PageSize"></div>
2828
2829 <script id="RelatedSimpleTemplate" type="text/x-template">
2830 {{#.}}
2831 <div class="grid u-padding-bottom--lg">
2832 {{#Cases}}
2833 <div class="grid__col-lg-3 grid__col-sm-6 image-hover--zoom dw-mod">
2834 <a href="{{link}}" class="u-full-height u-color-light--bg u-flex u-flex--column">
2835 {{#if image}}
2836 <div class="u-color-light--bg u-no-padding dw-mod">
2837 <div class="flex-img image-hover__wrapper">
2838 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=680&height=314&crop=1&DoNotUpscale=True&Compression=75&image={{image}}" alt="{{title}}" />
2839 </div>
2840 </div>
2841 {{/if}}
2842
2843 <div class="card u-color-light--bg u-full-height dw-mod">
2844 <h3 class="article-list__item-header u-truncate-text dw-mod">{{title}}</h3>
2845 <p class="article__short-summary dw-mod">{{summary}}</p>
2846 </div>
2847 </a>
2848 </div>
2849 {{/Cases}}
2850 </div>
2851 {{/.}}
2852 </script>
2853 </div>
2854 </section>
2855 }
2856 @using System.Reflection
2857 @using Dynamicweb.Rapido.Blocks.Components
2858 @using Dynamicweb.Rapido.Blocks.Components.Articles
2859 @using Dynamicweb.Rapido.Blocks
2860
2861
2862 @* Component for the articles *@
2863
2864 @helper RenderArticleMenu(ArticleMenu settings)
2865 {
2866 if (!String.IsNullOrEmpty(settings.Title)) {
2867 <div class="u-margin u-border-bottom">
2868 <h3 class="u-no-margin">@settings.Title</h3>
2869 </div>
2870 }
2871
2872 <ul class="menu-left u-margin-bottom dw-mod">
2873 @foreach (var item in settings.Items)
2874 {
2875 @Render(item)
2876 }
2877 </ul>
2878 }
2879
2880 @helper RenderArticleMenuItem(ArticleMenuItem settings)
2881 {
2882 string link = !String.IsNullOrEmpty(settings.Link) ? settings.Link : "#";
2883
2884 if (!String.IsNullOrEmpty(settings.Title)) {
2885 <li class="menu-left__item dw-mod">
2886 <a href="@link" onclick="@settings.OnClick" class="menu-left__link dw-mod">@settings.Title</a>
2887 </li>
2888 }
2889 }
2890 @using System.Reflection
2891 @using Dynamicweb.Rapido.Blocks.Components
2892 @using Dynamicweb.Rapido.Blocks.Components.Articles
2893 @using Dynamicweb.Rapido.Blocks
2894
2895 @* Component for the articles *@
2896
2897 @helper RenderArticleList(ArticleList settings)
2898 {
2899 if (Pageview != null)
2900 {
2901 bool isParagraph = Pageview.CurrentParagraph != null ? true : false;
2902 string[] sortArticlesListBy = new string[2];
2903
2904 if (isParagraph) {
2905 sortArticlesListBy = Pageview.CurrentParagraph.Item["SortArticlesListBy"] != null && !string.IsNullOrEmpty(Pageview.CurrentParagraph.Item["SortArticlesListBy"].ToString()) ? Pageview.CurrentParagraph.Item["SortArticlesListBy"].ToString().Split('+') : new string[] { "Date", "ASC" };
2906 }
2907 else {
2908 sortArticlesListBy = Pageview.Item["SortArticlesListBy"] != null && !string.IsNullOrEmpty(Pageview.Item["SortArticlesListBy"].ToString()) ? Pageview.Item["SortArticlesListBy"].ToString().Split('+') : new string[] { "Date", "ASC" };
2909 }
2910
2911 string sourcePage = settings.SourcePage != null ? settings.SourcePage : Pageview.ID.ToString();
2912
2913 if (!settings.DisablePagination) {
2914 @RenderItemList(new
2915 {
2916 ItemType = !String.IsNullOrEmpty(settings.ItemType) ? settings.ItemType : "DynamicArticle",
2917 ListSourceType = settings.SourceType,
2918 ListSourcePage = sourcePage,
2919 ItemFieldsList = "*",
2920 Filter = settings.Filter,
2921 ListOrderBy = sortArticlesListBy[0],
2922 ListOrderByDirection = sortArticlesListBy[1],
2923 ListSecondOrderBy = sortArticlesListBy[0] == "Date" ? "InFocusSortId" : "Date",
2924 ListSecondOrderByDirection = "ASC",
2925 IncludeAllChildItems = true,
2926 ListTemplate = settings.Template,
2927 ListPageSize = settings.PageSize.ToString()
2928 });
2929 } else {
2930 @RenderItemList(new
2931 {
2932 ItemType = !String.IsNullOrEmpty(settings.ItemType) ? settings.ItemType : "DynamicArticle",
2933 ListSourceType = settings.SourceType,
2934 ListSourcePage = sourcePage,
2935 ItemFieldsList = "*",
2936 Filter = settings.Filter,
2937 ListOrderBy = sortArticlesListBy[0],
2938 ListOrderByDirection = sortArticlesListBy[1],
2939 ListSecondOrderBy = sortArticlesListBy[0] == "Date" ? "InFocusSortId" : "Date",
2940 ListSecondOrderByDirection = "ASC",
2941 IncludeAllChildItems = true,
2942 ListTemplate = settings.Template,
2943 ListPageSize = settings.PageSize.ToString(),
2944 ListViewMode = "Partial",
2945 ListShowTo = settings.PageSize + 1
2946 });
2947 }
2948 }
2949 }
2950 @using System.Reflection
2951 @using Dynamicweb.Rapido.Blocks.Components.Articles
2952
2953
2954 @* Component for the articles *@
2955
2956 @helper RenderArticleSummary(ArticleSummary settings)
2957 {
2958 if (!String.IsNullOrEmpty(settings.Text))
2959 {
2960 <div class="article__summary dw-mod">@settings.Text</div>
2961 }
2962 }
2963 @using System.Reflection
2964 @using Dynamicweb.Rapido.Blocks.Components
2965 @using Dynamicweb.Rapido.Blocks.Components.Articles
2966 @using Dynamicweb.Rapido.Blocks
2967
2968 @* Component for the articles *@
2969
2970 @helper RenderArticleListCategoryFilter(ArticleListCategoryFilter settings)
2971 {
2972 string pageId = Pageview.ID.ToString();
2973 string selectedFilter = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("sourcePage")) ? HttpContext.Current.Request.QueryString.Get("sourcePage") : Translate("All");
2974 var query = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString());
2975
2976 foreach (var option in settings.Categories)
2977 {
2978 selectedFilter = selectedFilter == option.Value ? option.Key : selectedFilter;
2979 }
2980
2981 if (selectedFilter == pageId)
2982 {
2983 selectedFilter = Translate("All");
2984 }
2985
2986 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
2987 {
2988 <div class="u-pull--right u-margin-left">
2989 <div class="collection u-no-margin">
2990 <h5>@Translate("Category")</h5>
2991 <input type="checkbox" id="CategorySelector" class="dropdown-trigger" />
2992 <div class="dropdown u-w180px dw-mod">
2993 <label class="dropdown__header dropdown__btn dw-mod" for="CategorySelector">@Translate(selectedFilter)</label>
2994 <div class="dropdown__content dw-mod">
2995 @foreach (var option in settings.Categories)
2996 {
2997 <div class="dropdown__item" onclick="QueryArray.setParametersInCurrentURL({ sourceType: 'Page', sourcePage: '@(option.Key.ToLower() == "all" ? pageId : option.Value)' })">@Translate(option.Key)</div>
2998 }
2999 </div>
3000 <label class="dropdown-trigger-off" for="CategorySelector"></label>
3001 </div>
3002 </div>
3003 </div>
3004 }
3005 else
3006 {
3007 <div class="u-full-width u-margin-bottom">
3008 <h5 class="u-no-margin">@Translate("Category")</h5>
3009 <input type="checkbox" id="CategorySelector" class="dropdown-trigger" />
3010 <div class="dropdown u-full-width dw-mod">
3011 <label class="dropdown__header dropdown__btn dw-mod" for="CategorySelector">@Translate(selectedFilter)</label>
3012 <div class="dropdown__content dw-mod">
3013 @foreach (var option in settings.Categories)
3014 {
3015 <div class="dropdown__item" onclick="QueryArray.setParametersInCurrentURL({ sourceType: 'Page', sourcePage: '@(option.Key.ToLower() == "all" ? pageId : option.Value)' })">@Translate(option.Key)</div>
3016 }
3017 </div>
3018 <label class="dropdown-trigger-off" for="CategorySelector"></label>
3019 </div>
3020 </div>
3021 }
3022 }
3023 @using System.Reflection
3024 @using Dynamicweb.Rapido.Blocks.Components
3025 @using Dynamicweb.Rapido.Blocks.Components.Articles
3026 @using Dynamicweb.Rapido.Blocks
3027 @using System.Collections.Generic
3028
3029 @* Component for the articles *@
3030
3031 @helper RenderArticleListFilter(ArticleListFilter settings)
3032 {
3033 string selectedFilter = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get(settings.SystemName)) ? HttpContext.Current.Request.QueryString.Get(settings.SystemName) : Translate("All");
3034 var query = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString());
3035
3036 if (settings.Options != null)
3037 {
3038 if (settings.Options is IEnumerable<dynamic>)
3039 {
3040 var options = (IEnumerable<dynamic>) settings.Options;
3041 settings.Options = options.OrderBy(item => item.Name);
3042 }
3043
3044 foreach (var option in settings.Options)
3045 {
3046 selectedFilter = selectedFilter == option.Value ? option.Name : selectedFilter;
3047 }
3048
3049 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
3050 {
3051 <div class="u-pull--right u-margin-left">
3052 <div class="collection u-no-margin">
3053 <h5>@settings.Label</h5>
3054 <input type="checkbox" id="@(settings.SystemName)Selector" class="dropdown-trigger" />
3055 <div class="dropdown u-w180px dw-mod">
3056 <label class="dropdown__header dropdown__btn dw-mod" for="@(settings.SystemName)Selector">@Translate(selectedFilter)</label>
3057 <div class="dropdown__content dw-mod">
3058 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '')">@Translate("All")</div>
3059 @foreach (var option in settings.Options)
3060 {
3061 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '@option.Value')">@Translate(option.Name)</div>
3062 }
3063 </div>
3064 <label class="dropdown-trigger-off" for="@(settings.SystemName)Selector"></label>
3065 </div>
3066 </div>
3067 </div>
3068 }
3069 else
3070 {
3071 <div class="u-full-width u-margin-bottom">
3072 <h5 class="u-no-margin">@settings.Label</h5>
3073 <input type="checkbox" id="@(settings.SystemName)Selector" class="dropdown-trigger" />
3074 <div class="dropdown u-full-width w-mod">
3075 <label class="dropdown__header dropdown__btn dw-mod" for="@(settings.SystemName)Selector">@Translate(selectedFilter)</label>
3076 <div class="dropdown__content dw-mod">
3077 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '')">@Translate("All")</div>
3078 @foreach (var option in settings.Options)
3079 {
3080 <div class="dropdown__item" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '@option.Value')">@Translate(option.Name)</div>
3081 }
3082 </div>
3083 <label class="dropdown-trigger-off" for="@(settings.SystemName)Selector"></label>
3084 </div>
3085 </div>
3086 }
3087 }
3088 }
3089 @using System.Reflection
3090 @using Dynamicweb.Rapido.Blocks.Components
3091 @using Dynamicweb.Rapido.Blocks.Components.Articles
3092 @using Dynamicweb.Rapido.Blocks
3093
3094 @* Component for the articles *@
3095
3096 @helper RenderArticleListSearch(ArticleListSearch settings)
3097 {
3098 string searchParameter = !string.IsNullOrEmpty(settings.SearchParameter) ? settings.SearchParameter : "Title";
3099 string searchWord = HttpContext.Current.Request.QueryString.Get(searchParameter);
3100 string searchString = !string.IsNullOrEmpty(searchWord) ? searchWord.Trim('*') : "";
3101 string className = "u-w340px u-pull--right u-margin-left";
3102
3103 if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
3104 {
3105 className = "u-full-width";
3106 }
3107
3108 <div class="typeahead u-color-inherit u-margin-bottom dw-mod @className">
3109 <input type="text" class="typeahead-search-field u-no-margin dw-mod" placeholder="@Translate("Search in list")" value="@searchString" id="ArticleListSearchInput" onchange="QueryArray.setParameterInCurrentURL('@searchParameter', '*' + document.getElementById('ArticleListSearchInput').value + '*')">
3110 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod"><i class="fas fa-search"></i></button>
3111 </div>
3112 }
3113 @using System.Reflection
3114 @using Dynamicweb.Rapido.Blocks.Components
3115 @using Dynamicweb.Rapido.Blocks.Components.Articles
3116 @using Dynamicweb.Rapido.Blocks
3117
3118 @* Component for the articles *@
3119
3120 @helper RenderArticleListNoResultsInfo(ArticleListNoResultsInfo settings)
3121 {
3122 <div class="u-margin-top--lg u-bold u-ta-center u-bold">@Translate(settings.Message)</div>
3123 }
3124 @using System.Reflection
3125 @using Dynamicweb.Rapido.Blocks.Components
3126 @using Dynamicweb.Rapido.Blocks.Components.General
3127 @using Dynamicweb.Rapido.Blocks.Components.Articles
3128 @using Dynamicweb.Rapido.Blocks
3129 @using System.Text.RegularExpressions
3130
3131 @* Component for the articles *@
3132
3133 @helper RenderArticleListItem(ArticleListItem settings)
3134 {
3135 switch (settings.Type) {
3136 case ArticleListItemType.Card:
3137 @RenderArticleListItemCard(settings);
3138 break;
3139 case ArticleListItemType.List:
3140 @RenderArticleListItemList(settings);
3141 break;
3142 case ArticleListItemType.Simple:
3143 @RenderArticleListItemSimple(settings);
3144 break;
3145 default:
3146 @RenderArticleListItemCard(settings);
3147 break;
3148 }
3149 }
3150
3151 @helper RenderArticleListItemCard(ArticleListItem settings) {
3152 <a href="@settings.Link" class="u-full-height u-color-light--bg u-flex u-flex--column">
3153 <div class="u-color-light--bg u-no-padding dw-mod">
3154 @if (settings.Logo != null)
3155 {
3156 string backgroundImage = settings.Image != null ? "background-image:url(/Admin/Public/GetImage.ashx?width=992&height=760&crop=0&Compression=75&DoNotUpscale=True&image=" + settings.Image.Path + "); background-size: cover;" : "";
3157 settings.Logo.ImageDefault.Crop = 5;
3158 settings.Logo.ImageDefault.Width = settings.Logo.ImageDefault.Width == 1920 ? 240 : settings.Logo.ImageDefault.Width;
3159 settings.Logo.ImageDefault.Height = settings.Logo.ImageDefault.Height == 1080 ? 200 : settings.Logo.ImageDefault.Height;
3160 <div class="image-hover__wrapper layered-image layered-image--tinted dw-mod" style="@backgroundImage">
3161 @if (settings.Stickers != null)
3162 {
3163 if (settings.Stickers.Position != StickersListPosition.Custom && settings.Stickers.Position != StickersListPosition.None)
3164 {
3165 @Render(settings.Stickers);
3166 }
3167 }
3168 @RenderImage(settings.Logo)
3169 </div>
3170 } else if (settings.Image != null)
3171 {
3172 <div class="flex-img image-hover__wrapper u-position-relative dw-mod">
3173 @if (settings.Stickers != null)
3174 {
3175 if (settings.Stickers.Position != StickersListPosition.Custom && settings.Stickers.Position != StickersListPosition.None)
3176 {
3177 @Render(settings.Stickers);
3178 }
3179 }
3180 @Render(settings.Image)
3181 </div>
3182 }
3183 </div>
3184
3185 @if (!String.IsNullOrEmpty(settings.Title) || !String.IsNullOrEmpty(settings.Summary))
3186 {
3187 <div class="card u-color-light--bg u-full-height dw-mod">
3188 @if (settings.Stickers != null)
3189 {
3190 if (settings.Stickers.Position == StickersListPosition.Custom)
3191 {
3192 @Render(settings.Stickers);
3193 }
3194 }
3195 @if (!String.IsNullOrEmpty(settings.Title))
3196 {
3197 <h3 class="article-list__item-header u-truncate-text dw-mod">@settings.Title</h3>
3198 }
3199 @if (!String.IsNullOrEmpty(settings.SubTitle))
3200 {
3201 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div>
3202 }
3203 @if (!String.IsNullOrEmpty(settings.Summary))
3204 {
3205 <p class="article__short-summary dw-mod">@settings.Summary</p>
3206 }
3207 </div>
3208 }
3209 </a>
3210 }
3211
3212 @helper RenderArticleListItemList(ArticleListItem settings) {
3213 <a href="@settings.Link">
3214 <div class="grid u-color-light--bg u-no-padding dw-mod">
3215 <div class="grid__col-md-3">
3216 <div class="u-color-light--bg u-no-padding dw-mod">
3217 @if (settings.Logo != null)
3218 {
3219 string backgroundImage = settings.Image != null ? "background-image:url(/Admin/Public/GetImage.ashx?width=992&height=760&crop=0&Compression=75&DoNotUpscale=True&image=" + settings.Image.Path + "); background-size: cover;" : "";
3220 settings.Logo.ImageDefault.Crop = 5;
3221 settings.Logo.ImageDefault.Width = settings.Logo.ImageDefault.Width == 1920 ? 240 : settings.Logo.ImageDefault.Width;
3222 settings.Logo.ImageDefault.Height = settings.Logo.ImageDefault.Height == 1080 ? 200 : settings.Logo.ImageDefault.Height;
3223 <div class="image-hover__wrapper layered-image layered-image--tinted dw-mod" style="@backgroundImage">
3224 @if (settings.Stickers != null)
3225 {
3226 if (settings.Stickers.Position != StickersListPosition.Custom)
3227 {
3228 @Render(settings.Stickers);
3229 }
3230 }
3231 @RenderImage(settings.Logo)
3232 </div>
3233 } else if (settings.Image != null)
3234 {
3235 <div class="flex-img image-hover__wrapper dw-mod">
3236 @if (settings.Stickers != null)
3237 {
3238 if (settings.Stickers.Position != StickersListPosition.Custom)
3239 {
3240 @Render(settings.Stickers);
3241 }
3242 }
3243 @Render(settings.Image)
3244 </div>
3245 }
3246 </div>
3247 </div>
3248
3249 @if (!String.IsNullOrEmpty(settings.Title) || !String.IsNullOrEmpty(settings.Summary))
3250 {
3251 <div class="grid__col-md-9">
3252 @if (!String.IsNullOrEmpty(settings.Title))
3253 {
3254 <h3 class="article-list__item-header u-truncate-text dw-mod">@settings.Title</h3>
3255 }
3256 @if (settings.Stickers != null)
3257 {
3258 if (settings.Stickers.Position == StickersListPosition.Custom)
3259 {
3260 @Render(settings.Stickers);
3261 }
3262 }
3263 @if (!String.IsNullOrEmpty(settings.SubTitle))
3264 {
3265 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div>
3266 }
3267 @if (!String.IsNullOrEmpty(settings.Summary))
3268 {
3269 <p class="article__short-summary dw-mod">@settings.Summary</p>
3270 }
3271 </div>
3272 }
3273 </div>
3274 </a>
3275 }
3276
3277 @helper RenderArticleListItemSimple(ArticleListItem settings) {
3278 <a href="@settings.Link" class="u-color-inherit">
3279 <div class="grid u-color-light--bg u-no-padding dw-mod">
3280 <div class="grid__col-md-12">
3281 @if (!String.IsNullOrEmpty(settings.Title))
3282 {
3283 <div class="article-list-item__header u-truncate-text u-no-margin dw-mod">@settings.Title</div>
3284 }
3285 @if (!String.IsNullOrEmpty(settings.SubTitle))
3286 {
3287 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div>
3288 }
3289 </div>
3290 </div>
3291 </a>
3292 }
3293 @using System.Reflection
3294 @using Dynamicweb.Rapido.Blocks.Components.Articles
3295
3296
3297 @* Component for the articles *@
3298
3299 @helper RenderArticleAuthorAndDate(ArticleAuthorAndDate settings)
3300 {
3301 <small class="article__subscription">
3302 @if (!(string.IsNullOrWhiteSpace(settings.Author) && string.IsNullOrWhiteSpace(settings.Date)))
3303 {
3304 <text>@Translate("Written")</text>
3305 }
3306 @if (!string.IsNullOrWhiteSpace(settings.Author))
3307 {
3308 <text>@Translate("by") @settings.Author</text>
3309 }
3310 @if (!string.IsNullOrWhiteSpace(settings.Date))
3311 {
3312 <text>@Translate("on") @settings.Date</text>
3313 }
3314 </small>
3315 }
3316 @using System.Reflection
3317 @using Dynamicweb.Rapido.Blocks.Components.Articles
3318 @using Dynamicweb.Rapido.Blocks.Components.General
3319
3320
3321 @* Component for the articles *@
3322
3323 @helper RenderArticleLink(ArticleLink settings)
3324 {
3325 if (!string.IsNullOrEmpty(settings.Title))
3326 {
3327 Button link = new Button {
3328 ConfirmText = settings.ConfirmText,
3329 ConfirmTitle = settings.ConfirmTitle,
3330 ButtonType = settings.ButtonType,
3331 Id = settings.Id,
3332 Title = settings.Title,
3333 AltText = settings.AltText,
3334 OnClick = settings.OnClick,
3335 CssClass = settings.CssClass,
3336 Disabled = settings.Disabled,
3337 Icon = settings.Icon,
3338 Name = settings.Name,
3339 Href = settings.Href,
3340 ButtonLayout = settings.ButtonLayout,
3341 ExtraAttributes = settings.ExtraAttributes
3342 };
3343 <div class="grid__cell">
3344 @Render(link)
3345 </div>
3346 }
3347 }
3348 @using System.Reflection
3349 @using Dynamicweb.Rapido.Blocks
3350 @using Dynamicweb.Rapido.Blocks.Components.Articles
3351 @using Dynamicweb.Rapido.Blocks.Components.General
3352
3353
3354 @* Component for the articles *@
3355
3356 @helper RenderArticleCarousel(ArticleCarousel settings)
3357 {
3358 <div class="grid">
3359 <div class="grid__col-12 u-no-padding u-margin-bottom">
3360 <div class="carousel" id="carousel_@settings.Id">
3361 <div class="carousel__container js-carousel-slides dw-mod">
3362 @RenderBlockList(settings.SubBlocks)
3363 </div>
3364 </div>
3365 </div>
3366 </div>
3367
3368 <script>
3369 document.addEventListener("DOMContentLoaded", function () {
3370 new CarouselModule("#carousel_@settings.Id", {
3371 slideTime: 0,
3372 dots: true
3373 });
3374 });
3375 </script>
3376 }
3377
3378 @helper RenderArticleCarouselSlide(ArticleCarouselSlide settings)
3379 {
3380 string imageEngine = "/Admin/Public/GetImage.ashx?";
3381
3382 string defaultImage = settings.ImageSettings != null ? imageEngine : settings.Image;
3383 if (settings.ImageSettings != null)
3384 {
3385 defaultImage += settings.ImageSettings.Width != 0 ? "Width=" + settings.ImageSettings.Width + "&" : "";
3386 defaultImage += settings.ImageSettings.Height != 0 ? "Height=" + settings.ImageSettings.Height + "&" : "";
3387 defaultImage += "Crop=" + settings.ImageSettings.Crop + "&";
3388 defaultImage += "Compression=" + settings.ImageSettings.Compression + "&";
3389 defaultImage += "DoNotUpscale=" + settings.ImageSettings.DoNotUpscale.ToString() + "&";
3390 defaultImage += "FillCanvas=" + settings.ImageSettings.FillCanvas.ToString() + "&";
3391 }
3392 defaultImage += "&Image=" + settings.Image;
3393
3394 <div class="carousel__slide u-min-h300px u-flex dw-mod" style="background-size:cover; background-image:url('@defaultImage')">
3395 <a class="article-carousel-item__wrap" href="@settings.Link" title="@settings.Title">
3396 <h2 class="article-list__item-header u-truncate-text u-color-light dw-mod">@settings.Title</h2>
3397 <div class="article-list__item-info">
3398 @if (settings.Stickers != null)
3399 {
3400 settings.Stickers.Position = StickersListPosition.Custom;
3401 @Render(settings.Stickers);
3402 }
3403
3404 <small class="u-margin-top--lg u-color-light">
3405 @if (!(string.IsNullOrWhiteSpace(settings.Author) && string.IsNullOrWhiteSpace(settings.Date)))
3406 {
3407 <text>@Translate("Written")</text>
3408 }
3409 @if (!string.IsNullOrWhiteSpace(settings.Author))
3410 {
3411 <text>@Translate("by") @settings.Author</text>
3412 }
3413 @if (!string.IsNullOrWhiteSpace(settings.Date))
3414 {
3415 <text>@Translate("on") @settings.Date</text>
3416 }
3417 </small>
3418 </div>
3419
3420 <h3 class="article__short-summary u-color-light">@settings.Summary</h3>
3421 </a>
3422 @if (settings.UseFilters == true)
3423 {
3424 <div class="background-image image-filter image-filter--darken dw-mod"></div>
3425 }
3426 </div>
3427 }
3428 @using System.Text.RegularExpressions
3429 @using Dynamicweb.Rapido.Blocks.Components
3430 @using Dynamicweb.Rapido.Blocks.Components.General
3431 @using Dynamicweb.Rapido.Blocks.Components.Articles
3432 @using Dynamicweb.Rapido.Blocks
3433
3434 @* Component for the articles *@
3435
3436 @helper RenderArticleVideo(ArticleVideo settings)
3437 {
3438 if (settings.Url != null)
3439 {
3440 //getting video ID from youtube URL
3441 string videoCode = settings.Url;
3442 Regex regex = new Regex(@".be\/(.[^?]*)");
3443 Match match = regex.Match(videoCode);
3444 string videoId = "";
3445 if (match.Success)
3446 {
3447 videoId = match.Groups[1].Value;
3448 }
3449 else
3450 {
3451 regex = new Regex(@"v=([^&]+)");
3452 match = regex.Match(videoCode);
3453 if (match.Success)
3454 {
3455 videoId = match.Groups[1].Value;
3456 }
3457 }
3458
3459 int autoPlay = settings.AutoPlay == "true" ? 1 : 0;
3460
3461 <div class="video-wrapper">
3462 <div class="js-youtube-video" data-video="@videoId" id="ytPlayer@(Guid.NewGuid().ToString("N"))" data-auto-play="@autoPlay" data-enable-controls="1"></div>
3463 </div>
3464 }
3465 }
3466
3467
3468
3469 @* Simple helpers *@
3470
3471 @*Requires the Gallery ItemType that comes with Rapido*@
3472 @helper RenderArticleItemGallery(IList<ItemViewModel> gallery) {
3473 if (gallery != null && gallery.Count > 0)
3474 {
3475 int count = 1;
3476
3477 foreach (var item in gallery)
3478 {
3479 if (item.GetFile("ImagePath") != null)
3480 {
3481 string image = item.GetFile("ImagePath").PathUrlEncoded;
3482 string imagePrefix = "/Admin/Public/GetImage.ashx?width=1200&height=820&crop=5&Compression=75&DoNotUpscale=1&image=";
3483 int imagesCount = gallery.Count;
3484
3485 if (count == 1)
3486 {
3487 <label class="gallery" for="ParagraphGalleryModalTrigger" onclick="Gallery.openImage(this.querySelector('.js-gallery'))">
3488 <span class="gallery__main-image">
3489 <img src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=992&height=760&crop=0&Compression=75&DoNotUpscale=1&image=@image" class="b-lazy flex-img js-gallery" alt="" data-for="ParagraphGallery" data-image="@imagePrefix@image" />
3490 </span>
3491 <span class="gallery__image-counter">
3492 <i class="fas fa-camera fa-2x"></i> <span class="gallery__image-counter__number">@imagesCount</span>
3493 <span class="gallery__image-counter__text">@Translate("See all") <i class="fas fa-angle-right"></i></span>
3494 </span>
3495 </label>
3496 }
3497 else
3498 {
3499 <div class="u-hidden js-gallery" data-for="ParagraphGallery" data-image="@imagePrefix@image"></div>
3500 }
3501
3502 count++;
3503 }
3504 }
3505
3506 @Render(new ArticleGalleryModal())
3507 }
3508 }
3509
3510 @helper RenderMobileFilters(List<Block> subBlocks)
3511 {
3512 if (subBlocks.Count > 0)
3513 {
3514 <div class="grid__col-12">
3515 <input type="checkbox" id="CheckFilters" class="js-remember-state u-hidden" data-expand="CheckFilters" />
3516 <div class="grid u-margin-bottom dw-mod" data-trigger="CheckFilters">
3517 @RenderBlockList(subBlocks)
3518 </div>
3519 <label for="CheckFilters" class="btn btn--secondary btn--full dw-mod js-expand-hide" data-trigger="CheckFilters">@Translate("Select filters")</label>
3520 <label for="CheckFilters" class="btn btn--secondary btn--full dw-mod expandable--collapsed" data-trigger="CheckFilters">@Translate("Close filters")</label>
3521 </div>
3522 }
3523 }
3524
3525
3526 @* Include the Blocks for the page *@
3527 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
3528
3529 @using System
3530 @using System.Web
3531 @using System.Collections.Generic
3532 @using Dynamicweb.Rapido.Blocks.Extensibility
3533 @using Dynamicweb.Rapido.Blocks
3534
3535 @functions {
3536 string GoogleTagManagerID = "";
3537 string GoogleAnalyticsID = "";
3538 }
3539
3540 @{
3541 GoogleTagManagerID = Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID");
3542 GoogleAnalyticsID = Model.Area.Item.GetItem("Settings").GetString("GoogleAnalyticsTrackingID");
3543
3544 BlocksPage topSnippetsBlocksPage = BlocksPage.GetBlockPage("Master");
3545
3546 if (!string.IsNullOrWhiteSpace(GoogleAnalyticsID))
3547 {
3548 Block tagManager = new Block()
3549 {
3550 Id = "GoogleAnalytics",
3551 SortId = 0,
3552 Template = RenderGoogleAnalyticsSnippet()
3553 };
3554 topSnippetsBlocksPage.Add("Head", tagManager);
3555 }
3556
3557 if (!string.IsNullOrWhiteSpace(GoogleTagManagerID))
3558 {
3559 Block tagManager = new Block()
3560 {
3561 Id = "TagManager",
3562 SortId = 1,
3563 Template = RenderGoogleTagManager()
3564 };
3565 topSnippetsBlocksPage.Add("Head", tagManager);
3566
3567 Block tagManagerBodySnippet = new Block()
3568 {
3569 Id = "TagManagerBodySnippet",
3570 SortId = 1,
3571 Template = RenderGoogleTagManagerBodySnippet()
3572 };
3573 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, tagManagerBodySnippet);
3574 }
3575
3576 Block facebookPixel = new Block()
3577 {
3578 Id = "FacebookPixel",
3579 SortId = 2,
3580 Template = RenderFacebookPixel()
3581 };
3582
3583 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, facebookPixel);
3584 }
3585
3586 @helper RenderGoogleAnalyticsSnippet()
3587 {
3588 <!-- Global site tag (gtag.js) - Google Analytics -->
3589 <script async src="https://www.googletagmanager.com/gtag/js?id=@GoogleAnalyticsID"></script>
3590 <script>
3591 window.dataLayer = window.dataLayer || [];
3592 function gtag(){dataLayer.push(arguments);}
3593 gtag('js', new Date());
3594
3595 gtag('config', '@GoogleAnalyticsID');
3596 </script>
3597
3598 }
3599
3600 @helper RenderGoogleTagManager()
3601 {
3602 <script>
3603 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
3604 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
3605 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
3606 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
3607 })(window,document,'script','dataLayer','@GoogleTagManagerID');
3608 </script>
3609 }
3610
3611 @helper RenderGoogleTagManagerBodySnippet()
3612 {
3613 <!-- Google Tag Manager (noscript) -->
3614 <noscript>
3615 <iframe src="https://www.googletagmanager.com/ns.html?id=@GoogleTagManagerID"
3616 height="0" width="0" style="display:none;visibility:hidden"></iframe>
3617 </noscript>
3618 <!-- End Google Tag Manager (noscript) -->
3619 }
3620
3621 @helper RenderFacebookPixel()
3622 {
3623 string FacebookPixelID = Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID");
3624
3625 if (!string.IsNullOrWhiteSpace(FacebookPixelID))
3626 {
3627 <!-- Facebook Pixel Code -->
3628 <script>
3629 !function(f,b,e,v,n,t,s)
3630 {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
3631 n.callMethod.apply(n,arguments):n.queue.push(arguments)};
3632 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
3633 n.queue=[];t=b.createElement(e);t.async=!0;
3634 t.src=v;s=b.getElementsByTagName(e)[0];
3635 s.parentNode.insertBefore(t,s)}(window, document,'script',
3636 'https://connect.facebook.net/en_US/fbevents.js');
3637 fbq('init', '@FacebookPixelID');
3638 fbq('track', 'PageView');
3639 </script>
3640 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=@FacebookPixelID&ev=PageView&noscript=1" alt="" /></noscript>
3641 }
3642 }
3643 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
3644
3645 @using System
3646 @using System.Web
3647 @using System.Collections.Generic
3648 @using Dynamicweb.Rapido.Blocks
3649 @using Dynamicweb.Rapido.Blocks.Extensibility
3650 @using Dynamicweb.Security.UserManagement
3651 @using Dynamicweb.Security.UserManagement.ExternalAuthentication
3652 @using Dynamicweb.Rapido.Blocks.Components.General
3653
3654 @{
3655 BlocksPage loginBlocksPage = BlocksPage.GetBlockPage("Master");
3656
3657 Block loginModal = new Block()
3658 {
3659 Id = "LoginModal",
3660 SortId = 10,
3661 Component = new Modal
3662 {
3663 Id = "SignIn",
3664 Heading = new Heading
3665 {
3666 Level = 0,
3667 Title = Translate("Sign in")
3668 },
3669 Width = ModalWidth.Sm,
3670 BodyTemplate = RenderLoginForm()
3671 }
3672 };
3673
3674 loginBlocksPage.Add(MasterBlockId.MasterTopSnippets, loginModal);
3675 }
3676
3677 @helper RenderLoginForm()
3678 {
3679 int pageId = Model.TopPage.ID;
3680 string userSignedInErrorText = "";
3681 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
3682 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery";
3683 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
3684 bool showModalOnStart = pageId != GetPageIdByNavigationTag("CustomerCenter") && Pageview.Page.ID != GetPageIdByNavigationTag("SignInPage") && Model.LogOnFailed;
3685 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
3686 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink");
3687
3688 ProviderCollection providers = Provider.GetActiveProviders();
3689
3690 if (Model.LogOnFailed)
3691 {
3692 switch (Model.LogOnFailedReason)
3693 {
3694 case LogOnFailedReason.PasswordLengthInvalid:
3695 userSignedInErrorText = Translate("Password length is invalid");
3696 break;
3697 case LogOnFailedReason.IncorrectLogin:
3698 userSignedInErrorText = Translate("Invalid email or password");
3699 break;
3700 case LogOnFailedReason.ExceededFailedLogOnLimit:
3701 userSignedInErrorText = Translate("You have exceeded the limit of allowed login attempts. The user account is temporarily locked");
3702 break;
3703 case LogOnFailedReason.LoginLocked:
3704 userSignedInErrorText = Translate("The user account is temporarily locked");
3705 break;
3706 case LogOnFailedReason.PasswordExpired:
3707 userSignedInErrorText = Translate("The password has expired and needs to be renewed");
3708 break;
3709 default:
3710 userSignedInErrorText = Translate("An unknown error occured");
3711 break;
3712 }
3713 }
3714
3715 Form form = new Form { Method = FormMethod.Post, Name = "LoginModalForm" };
3716
3717 TextField passwordField = new TextField { Id = "login-password", Type = TextFieldType.Password, Name = "password", Label = Translate("Password"), Required = true };
3718
3719 if (!hideForgotPasswordLink) {
3720 passwordField.Link = new Link { Title = Translate("Forgot password?"), Href = "/Default.aspx?id=" + signInProfilePageId + "&LoginAction=Recovery" };
3721 }
3722
3723 form.Add(new HiddenField { Name = "ID", Value = Converter.ToString(pageId) });
3724 form.Add(new HiddenField { Name = "DWExtranetUsernameRemember", Value = "True" });
3725 form.Add(new HiddenField { Name = "DWExtranetPasswordRemember", Value = "True" });
3726 form.Add(new HiddenField { Name = "LoginAction", Value = "Login" });
3727 form.Add(new TextField { Id = "LoginUsername", Name = "username", Label = Translate("Email"), CssClass = "u-full-width", Required = true });
3728 form.Add(passwordField);
3729 form.Add(new NotificationMessage { Message = userSignedInErrorText, MessageType = NotificationMessageType.Error });
3730 form.Add(new CheckboxField { Id = "LoginRememberMe", Value = "True", Name = "Autologin", Label = Translate("Remember me") });
3731 form.Add(new Button { ButtonType = ButtonType.Submit, Title = Translate("Sign in"), CssClass = "btn--full", OnClick = "Buttons.LockButton(event)" });
3732
3733 foreach (Provider LoginProvider in providers)
3734 {
3735 var ProviderName = LoginProvider.Name.ToLower();
3736 form.Add(new Link {
3737 Href = "/Admin/Public/Social/ExternalLogin.aspx?action=login&providerID=" + LoginProvider.ID,
3738 Icon = new Icon { Prefix = "fab", Name = "fa-" + ProviderName, CssClass = "fa-1_5x", LabelPosition = IconLabelPosition.After },
3739 ButtonLayout = ButtonLayout.LinkClean,
3740 CssClass = "btn--condensed u-margin-bottom u-margin-right u-inline-block u-color-" + ProviderName,
3741 AltText = ProviderName
3742 });
3743 }
3744
3745 if (!hideCreateAccountLink) {
3746 form.Add(new Text { Content = "<div class=\"u-border-top u-full-width u-margin-bottom--lg\"></div>" });
3747 form.Add(new Link
3748 {
3749 Href = "/Default.aspx?id=" + createAccountPageId,
3750 ButtonLayout = ButtonLayout.LinkClean,
3751 Title = Translate("Create account"),
3752 CssClass = "u-full-width u-ta-center"
3753 });
3754 }
3755
3756 @Render(form)
3757
3758 if (showModalOnStart)
3759 {
3760 <script>
3761 document.getElementById("SignInModalTrigger").checked = true;
3762 </script>
3763 }
3764 }
3765
3766
3767
3768
3769
3770 @if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
3771 {
3772 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
3773
3774 @using System
3775 @using System.Web
3776 @using System.Collections.Generic
3777 @using Dynamicweb.Rapido.Blocks.Extensibility
3778 @using Dynamicweb.Rapido.Blocks
3779 @using Dynamicweb.Rapido.Services
3780
3781
3782 @functions {
3783 BlocksPage mobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master");
3784 }
3785
3786 @{
3787 var mobileTopLayout = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetString("Design")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left";
3788 bool mobileHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
3789 bool mobileHideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart") || !Dynamicweb.Rapido.Services.User.IsBuyingAllowed();
3790
3791 Block mobileHeader = new Block()
3792 {
3793 Id = "MobileTop",
3794 SortId = 10,
3795 Template = RenderMobileTop(),
3796 SkipRenderBlocksList = true
3797 };
3798 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeader);
3799
3800 Block mobileHeaderNavigation = new Block()
3801 {
3802 Id = "MobileHeaderNavigation",
3803 SortId = 10,
3804 Template = RenderMobileHeaderNavigation(),
3805 SkipRenderBlocksList = true,
3806 BlocksList = new List<Block> {
3807 new Block {
3808 Id = "MobileHeaderNavigationTrigger",
3809 SortId = 10,
3810 Template = RenderMobileHeaderNavigationTrigger()
3811 }
3812 }
3813 };
3814 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderNavigation);
3815
3816 Block mobileHeaderLogo = new Block()
3817 {
3818 Id = "MobileHeaderLogo",
3819 SortId = 20,
3820 Template = RenderMobileHeaderLogo(),
3821 SkipRenderBlocksList = true
3822 };
3823 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderLogo);
3824
3825 Block mobileHeaderActions = new Block()
3826 {
3827 Id = "MobileHeaderActions",
3828 SortId = 30,
3829 Template = RenderMobileTopActions(),
3830 SkipRenderBlocksList = true
3831 };
3832 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderActions);
3833
3834 if (!mobileHideSearch)
3835 {
3836 Block mobileHeaderSearch = new Block
3837 {
3838 Id = "MobileHeaderSearch",
3839 SortId = 10,
3840 Template = RenderMobileTopSearch()
3841 };
3842 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderSearch);
3843 }
3844
3845 Block mobileHeaderMiniCart;
3846
3847 if (!mobileHideCart)
3848 {
3849 mobileHeaderMiniCart = new Block
3850 {
3851 Id = "MobileHeaderMiniCart",
3852 SortId = 20,
3853 Template = RenderMobileTopMiniCart()
3854 };
3855
3856 Block miniCartCounterScriptTemplate = new Block
3857 {
3858 Id = "MiniCartCounterScriptTemplate",
3859 Template = RenderMobileMiniCartCounterContent()
3860 };
3861 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate);
3862 }
3863 else
3864 {
3865 mobileHeaderMiniCart = new Block
3866 {
3867 Id = "MobileHeaderMiniCart",
3868 SortId = 20
3869 };
3870 }
3871
3872 if (!mobileHideSearch)
3873 {
3874 Block mobileHeaderSearchBar = new Block()
3875 {
3876 Id = "MobileHeaderSearchBar",
3877 SortId = 30,
3878 Template = RenderMobileTopSearchBar()
3879 };
3880 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeaderSearchBar);
3881 }
3882
3883 switch (mobileTopLayout)
3884 {
3885 case "nav-left":
3886 mobileHeaderNavigation.SortId = 10;
3887 mobileHeaderLogo.SortId = 20;
3888 mobileHeaderActions.SortId = 30;
3889 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart);
3890 break;
3891 case "nav-right":
3892 mobileHeaderLogo.SortId = 10;
3893 mobileHeaderActions.SortId = 20;
3894 mobileHeaderNavigation.SortId = 30;
3895 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart);
3896 break;
3897 case "nav-search-left":
3898 mobileHeaderNavigation.SortId = 10;
3899 mobileHeaderLogo.SortId = 20;
3900 mobileHeaderActions.SortId = 30;
3901 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart);
3902 break;
3903 case "search-left":
3904 mobileHeaderActions.SortId = 10;
3905 mobileHeaderLogo.SortId = 20;
3906 mobileHeaderNavigation.SortId = 30;
3907 mobileHeaderMiniCart.SortId = 0;
3908 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart);
3909 break;
3910 }
3911 }
3912
3913
3914 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
3915
3916 @using System
3917 @using System.Web
3918 @using Dynamicweb.Rapido.Blocks.Extensibility
3919 @using Dynamicweb.Rapido.Blocks
3920
3921 @{
3922 BlocksPage customMobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master");
3923 }
3924
3925
3926
3927
3928 @helper RenderMobileTop() {
3929 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileTop").OrderBy(item => item.SortId).ToList();
3930
3931 <nav class="main-navigation-mobile dw-mod">
3932 <div class="center-container top-container__center-container dw-mod">
3933 <div class="grid grid--align-center">
3934 @RenderBlockList(subBlocks)
3935 </div>
3936 </div>
3937 </nav>
3938 }
3939
3940 @helper RenderMobileHeaderNavigation() {
3941 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderNavigation").OrderBy(item => item.SortId).ToList();
3942
3943 <div class="grid__col-auto-width">
3944 <ul class="menu dw-mod">
3945 @RenderBlockList(subBlocks)
3946 </ul>
3947 </div>
3948 }
3949
3950 @helper RenderMobileHeaderNavigationTrigger() {
3951 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
3952 <label for="MobileNavTrigger" class="mobile-nav-trigger-button menu__link menu__link--icon menu__link--mobile dw-mod"></label>
3953 </li>
3954 }
3955
3956 @helper RenderMobileHeaderLogo() {
3957 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderLogo").OrderBy(item => item.SortId).ToList();
3958
3959 var mobileTopLayout = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetString("Design")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left";
3960 string centeredLogo = mobileTopLayout != "nav-right" ? "u-ta-center" : "";
3961 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
3962 string businessName = Model.Area.Item.GetItem("Settings").GetString("BusinessName");
3963
3964 string mobileLogo = "/Files/Images/logo-dynamicweb.png";
3965 if (Model.Area.Item.GetItem("Layout").GetItem("MobileTop") != null && Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo") != null)
3966 {
3967 mobileLogo = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo").PathUrlEncoded;
3968 }
3969
3970 if (Path.GetExtension(mobileLogo).ToLower() != ".svg")
3971 {
3972 mobileLogo = "/Admin/Public/GetImage.ashx?height=40&width=100&crop=5&Compression=75&image=" + mobileLogo;
3973 }
3974 else
3975 {
3976 mobileLogo = HttpUtility.UrlDecode(mobileLogo);
3977 }
3978
3979 <div class="grid__col-auto grid__col--bleed">
3980 <div class="grid__cell @centeredLogo">
3981 <a href="/Default.aspx?ID=@firstPageId" class="logo logo--mobile u-inline-block dw-mod">
3982 <img class="grid__cell-img logo__img logo__img--mobile dw-mod" src="@mobileLogo" alt="@businessName" />
3983 </a>
3984 </div>
3985
3986 @RenderBlockList(subBlocks)
3987 </div>
3988 }
3989
3990 @helper RenderMobileTopActions() {
3991 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderActions").OrderBy(item => item.SortId).ToList();
3992
3993 <div class="grid__col-auto-width">
3994 <ul class="menu dw-mod">
3995 @RenderBlockList(subBlocks)
3996 </ul>
3997 </div>
3998 }
3999
4000 @helper RenderMobileTopSearch() {
4001 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
4002 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod">
4003 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i>
4004 </label>
4005 </li>
4006 }
4007
4008 @helper RenderMobileTopMiniCart() {
4009 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
4010 int cartPageId = GetPageIdByNavigationTag("CartPage");
4011 double cartProductsCount = Model.Cart.TotalProductsCount;
4012
4013 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod" id="miniCartWrapper">
4014 <div class="mini-cart dw-mod">
4015 <a href="/Default.aspx?ID=@cartPageId&Purge=True" id="miniCartCounterWrap" class="menu__link menu__link--icon menu__link--mobile dw-mod js-mini-cart-button">
4016 <div class="u-inline u-position-relative">
4017 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue fa-1_5x"></i>
4018 <div class="mini-cart__counter dw-mod">
4019 <div class="js-handlebars-root js-mini-cart-counter" id="cartCounter" data-template="MiniCartCounterContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=Counter" data-init-onload="false" data-preloader="false">
4020 <div class="js-mini-cart-counter-content" data-count="@cartProductsCount">
4021 @cartProductsCount
4022 </div>
4023 </div>
4024 </div>
4025 </div>
4026 </a>
4027 </div>
4028 </li>
4029 }
4030
4031 @helper RenderMobileTopSearchBar()
4032 {
4033 string searchFeedId = "";
4034 string searchSecondFeedId = "";
4035 int groupsFeedId;
4036 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
4037 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
4038 string resultPageLink;
4039 string searchPlaceholder;
4040 string searchType = "product-search";
4041 string searchTemplate;
4042 string searchContentTemplate = "";
4043 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? "";
4044 bool showGroups = true;
4045
4046 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch")
4047 {
4048 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
4049 resultPageLink = contentSearchPageLink;
4050 searchPlaceholder = Translate("Search page");
4051 groupsFeedId = 0;
4052 searchType = "content-search";
4053 searchTemplate = "SearchPagesTemplate";
4054 showGroups = false;
4055 }
4056 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch")
4057 {
4058 searchFeedId = productsPageId + "&feed=true";
4059 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
4060 resultPageLink = Converter.ToString(productsPageId);
4061 searchPlaceholder = Translate("Search products or pages");
4062 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
4063 searchType = "combined-search";
4064 searchTemplate = "SearchProductsTemplateWrap";
4065 searchContentTemplate = "SearchPagesTemplateWrap";
4066 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
4067 }
4068 else
4069 {
4070 resultPageLink = Converter.ToString(productsPageId);
4071 searchFeedId = productsPageId + "&feed=true";
4072 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
4073 searchPlaceholder = Translate("Search products");
4074 searchTemplate = "SearchProductsTemplate";
4075 searchType = "product-search";
4076 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
4077 }
4078
4079 <input type="checkbox" id="MobileSearchTrigger" class="mobile-search-trigger" />
4080
4081 <div class="main-navigation-mobile typeahead-mobile dw-mod">
4082 <div class="center-container top-container__center-container dw-mod">
4083 <div class="grid">
4084 <div class="grid__col-auto">
4085 <div class="typeahead-mobile__search-field dw-mod js-typeahead" data-page-size="@(searchType == "combined-search" ? 4 : 8)" id="MobileProductSearch" data-search-feed-id="@searchFeedId" data-search-second-feed-id="@searchSecondFeedId" data-result-page-id="@resultPageLink" data-search-type="@searchType">
4086 <input type="text" class="js-typeahead-search-field u-w160px u-no-margin" placeholder="@searchPlaceholder" value="@searchValue">
4087 @if (string.IsNullOrEmpty(searchSecondFeedId))
4088 {
4089 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></ul>
4090 }
4091 else
4092 {
4093 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--combined-mobile grid">
4094 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="MobileProductSearchBarContent" data-template="@searchTemplate" data-json-feed="/Default.aspx?ID=@searchFeedId&feedType=productsOnly" data-init-onload="false"></div>
4095 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="MobileContentSearchBarContent" data-template="@searchContentTemplate" data-json-feed="/Default.aspx?ID=@searchSecondFeedId" data-init-onload="false"></div>
4096 </div>
4097 }
4098 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i></button>
4099 </div>
4100 </div>
4101 <div class="grid__col-auto-width">
4102 <ul class="menu dw-mod">
4103 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
4104 <label for="MobileSearchTrigger" class="menu__link menu__link--icon menu__link--mobile dw-mod">
4105 <i class="fas fa-times fa-1_5x"></i>
4106 </label>
4107 </li>
4108 </ul>
4109 </div>
4110 </div>
4111 </div>
4112 </div>
4113 }
4114
4115 @helper RenderMobileMiniCartCounterContent()
4116 {
4117 <script id="MiniCartCounterContent" type="text/x-template">
4118 {{#.}}
4119 <div class="js-mini-cart-counter-content dw-mod" data-count="{{numberofproducts}}">
4120 {{numberofproducts}}
4121 </div>
4122 {{/.}}
4123 </script>
4124 }
4125 </text>
4126 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4127
4128 @using System
4129 @using System.Web
4130 @using System.Collections.Generic
4131 @using Dynamicweb.Rapido.Blocks.Extensibility
4132 @using Dynamicweb.Rapido.Blocks
4133
4134 @functions {
4135 BlocksPage mobileNavigationBlocksPage = BlocksPage.GetBlockPage("Master");
4136 }
4137
4138 @{
4139 bool mobileNavigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
4140 bool mobileHideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
4141 bool mobileHideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile");
4142 bool mobileHideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders");
4143 bool mobileHideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards");
4144 bool mobileHideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites");
4145
4146 Block mobileNavigation = new Block()
4147 {
4148 Id = "MobileNavigation",
4149 SortId = 10,
4150 Template = MobileNavigation(),
4151 SkipRenderBlocksList = true
4152 };
4153 mobileNavigationBlocksPage.Add(MasterBlockId.MasterTopSnippets, mobileNavigation);
4154
4155 if (Model.CurrentUser.ID > 0 && !mobileHideMyProfileLink)
4156 {
4157 Block mobileNavigationSignIn = new Block
4158 {
4159 Id = "MobileNavigationSignIn",
4160 SortId = 10,
4161 Template = RenderMobileNavigationSignIn()
4162 };
4163 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationSignIn);
4164 }
4165
4166 Block mobileNavigationMenu = new Block
4167 {
4168 Id = "MobileNavigationMenu",
4169 SortId = 20,
4170 Template = RenderMobileNavigationMenu()
4171 };
4172 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationMenu);
4173
4174 Block mobileNavigationActions = new Block
4175 {
4176 Id = "MobileNavigationActions",
4177 SortId = 30,
4178 Template = RenderMobileNavigationActions(),
4179 SkipRenderBlocksList = true
4180 };
4181 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationActions);
4182
4183 if (!mobileNavigationItemsHideSignIn)
4184 {
4185 if (Model.CurrentUser.ID <= 0)
4186 {
4187 Block mobileNavigationSignInAction = new Block
4188 {
4189 Id = "MobileNavigationSignInAction",
4190 SortId = 10,
4191 Template = RenderMobileNavigationSignInAction()
4192 };
4193 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignInAction);
4194
4195 if (!mobileHideCreateAccountLink)
4196 {
4197 Block mobileNavigationCreateAccountAction = new Block
4198 {
4199 Id = "MobileNavigationCreateAccountAction",
4200 SortId = 20,
4201 Template = RenderMobileNavigationCreateAccountAction()
4202 };
4203 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationCreateAccountAction);
4204 }
4205 }
4206 else
4207 {
4208 if (!mobileHideMyOrdersLink)
4209 {
4210 Block mobileNavigationOrdersAction = new Block
4211 {
4212 Id = "MobileNavigationOrdersAction",
4213 SortId = 20,
4214 Template = RenderMobileNavigationOrdersAction()
4215 };
4216 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationOrdersAction);
4217 }
4218 if (!mobileHideMyFavoritesLink)
4219 {
4220 Block mobileNavigationFavoritesAction = new Block
4221 {
4222 Id = "MobileNavigationFavoritesAction",
4223 SortId = 30,
4224 Template = RenderMobileNavigationFavoritesAction()
4225 };
4226 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationFavoritesAction);
4227 }
4228 if (!mobileHideMySavedCardsLink)
4229 {
4230 Block mobileNavigationSavedCardsAction = new Block
4231 {
4232 Id = "MobileNavigationFavoritesAction",
4233 SortId = 30,
4234 Template = RenderMobileNavigationSavedCardsAction()
4235 };
4236 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSavedCardsAction);
4237 }
4238
4239 Block mobileNavigationSignOutAction = new Block
4240 {
4241 Id = "MobileNavigationSignOutAction",
4242 SortId = 40,
4243 Template = RenderMobileNavigationSignOutAction()
4244 };
4245 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignOutAction);
4246 }
4247 }
4248
4249 if (Model.Languages.Count > 1)
4250 {
4251 Block mobileNavigationLanguagesAction = new Block
4252 {
4253 Id = "MobileNavigationLanguagesAction",
4254 SortId = 50,
4255 Template = RenderMobileNavigationLanguagesAction()
4256 };
4257 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationLanguagesAction);
4258 }
4259 }
4260
4261
4262 @helper MobileNavigation()
4263 {
4264 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigation").OrderBy(item => item.SortId).ToList();
4265 string mobileTopDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design") != null ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left";
4266 string position = mobileTopDesign == "nav-left" || mobileTopDesign == "nav-search-left" ? "left" : "right";
4267
4268 <!-- Trigger for mobile navigation -->
4269 <input type="checkbox" id="MobileNavTrigger" class="mobile-nav-trigger mobile-nav-trigger--@position" autocomplete="off" />
4270
4271 <!-- Mobile navigation -->
4272 <nav class="mobile-navigation mobile-navigation--@position dw-mod">
4273 <div class="mobile-navigation__wrapper" id="mobileNavigationWrapper">
4274 @RenderBlockList(subBlocks)
4275 </div>
4276 </nav>
4277
4278 <label class="mobile-nav-trigger-off" for="MobileNavTrigger"></label>
4279 }
4280
4281 @helper RenderMobileNavigationSignIn()
4282 {
4283 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4284 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
4285 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4286 string myProfilePageLink = linkStart + myProfilePageId;
4287 string userName = Model.CurrentUser.FirstName;
4288 if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(Model.CurrentUser.LastName))
4289 {
4290 userName += " " + Model.CurrentUser.LastName;
4291 }
4292 if (string.IsNullOrEmpty(userName))
4293 {
4294 userName = Model.CurrentUser.Name;
4295 }
4296 if (string.IsNullOrEmpty(userName))
4297 {
4298 userName = Model.CurrentUser.UserName;
4299 }
4300 if (string.IsNullOrEmpty(userName))
4301 {
4302 userName = Model.CurrentUser.Email;
4303 }
4304
4305 <ul class="menu menu-mobile">
4306 <li class="menu-mobile__item">
4307 <a href="@myProfilePageLink" class="menu-mobile__link dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @userName</a>
4308 </li>
4309 </ul>
4310 }
4311
4312 @helper RenderMobileNavigationMenu()
4313 {
4314 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides";
4315 string menuTemplate = isSlidesDesign ? "BaseMenuForMobileSlides.xslt" : "BaseMenuForMobileExpandable.xslt";
4316 string levels = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels") : "3";
4317 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
4318 int startLevel = 0;
4319
4320 @RenderNavigation(new
4321 {
4322 id = "mobilenavigation",
4323 cssclass = "menu menu-mobile dwnavigation",
4324 startLevel = @startLevel,
4325 ecomStartLevel = @startLevel + 1,
4326 endlevel = @levels,
4327 expandmode = "all",
4328 template = @menuTemplate
4329 })
4330
4331 if (isSlidesDesign)
4332 {
4333 <script>
4334 function goToLevel(level) {
4335 document.getElementById('mobileNavigationWrapper').style.left = -(level * 100) + "%";
4336 }
4337
4338 document.addEventListener('DOMContentLoaded', function () {
4339 goToLevel(document.getElementById('mobileNavigationWrapper').querySelectorAll('input[type=radio]:checked').length);
4340 });
4341 </script>
4342 }
4343
4344 if (renderPagesInToolBar)
4345 {
4346 @RenderNavigation(new
4347 {
4348 id = "topToolsMobileNavigation",
4349 cssclass = "menu menu-mobile dwnavigation",
4350 template = "ToolsMenuForMobile.xslt"
4351 })
4352 }
4353 }
4354
4355 @helper RenderMobileNavigationActions()
4356 {
4357 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigationActions").OrderBy(item => item.SortId).ToList(); ;
4358
4359 <ul class="menu menu-mobile">
4360 @RenderBlockList(subBlocks)
4361 </ul>
4362 }
4363
4364 @helper RenderMobileNavigationSignInAction()
4365 {
4366 <li class="menu-mobile__item">
4367 <label for="SignInModalTrigger" onclick="document.getElementById('MobileNavTrigger').checked = false;" class="menu-mobile__link dw-mod menu-mobile__link--highlighted"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("Sign in")</label>
4368 </li>
4369 }
4370
4371 @helper RenderMobileNavigationCreateAccountAction()
4372 {
4373 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
4374
4375 <li class="menu-mobile__item">
4376 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Default.aspx?ID=@createAccountPageId"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("Create account")</a>
4377 </li>
4378 }
4379
4380 @helper RenderMobileNavigationProfileAction()
4381 {
4382 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4383 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4384 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
4385 string myProfilePageLink = linkStart + myProfilePageId;
4386
4387 <li class="menu-mobile__item">
4388 <a href="@myProfilePageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue menu-mobile__link-icon"></i> @Translate("My Profile")</a>
4389 </li>
4390 }
4391
4392 @helper RenderMobileNavigationOrdersAction()
4393 {
4394 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4395 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4396 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders");
4397 string myOrdersPageLink = linkStart + myOrdersPageId;
4398 string ordersIcon = "fas fa-list";
4399
4400 <li class="menu-mobile__item">
4401 <a href="@myOrdersPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@ordersIcon menu-mobile__link-icon"></i> @Translate("My Orders")</a>
4402 </li>
4403 }
4404
4405 @helper RenderMobileNavigationFavoritesAction()
4406 {
4407 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4408 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4409 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
4410 string myFavoritesPageLink = linkStart + myFavoritesPageId;
4411 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star";
4412
4413
4414 <li class="menu-mobile__item">
4415 <a href="@myFavoritesPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@favoritesIcon menu-mobile__link-icon"></i> @Translate("My Favorites")</a>
4416 </li>
4417 }
4418
4419 @helper RenderMobileNavigationSavedCardsAction()
4420 {
4421 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4422 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4423 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards");
4424 string mySavedCardsPageLink = linkStart + mySavedCardsPageId;
4425 string savedCardsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards").SelectedValue : "fas fa-credit-card";
4426
4427 <li class="menu-mobile__item">
4428 <a href="@mySavedCardsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@savedCardsIcon menu-mobile__link-icon"></i> @Translate("My Saved Cards")</a>
4429 </li>
4430 }
4431
4432 @helper RenderMobileNavigationSignOutAction()
4433 {
4434 int pageId = Model.TopPage.ID;
4435 string signOutIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon").SelectedValue : "far fa-sign-out-alt";
4436
4437 <li class="menu-mobile__item">
4438 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId" onclick="RememberState.SetCookie('useAnotherAddress', false)"><i class="@signOutIcon menu-mobile__link-icon"></i> @Translate("Sign out")</a>
4439 </li>
4440 }
4441
4442 @helper RenderMobileNavigationLanguagesAction()
4443 {
4444 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides";
4445
4446 string selectedLanguage = "";
4447 foreach (var lang in Model.Languages)
4448 {
4449 if (lang.IsCurrent)
4450 {
4451 selectedLanguage = lang.Name;
4452 }
4453 }
4454
4455 <li class="menu-mobile__item dw-mod">
4456 @if (isSlidesDesign)
4457 {
4458 <input id="MobileMenuCheck_Language" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(1);">
4459 }
4460 else
4461 {
4462 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger">
4463 }
4464 <div class="menu-mobile__link__wrap">
4465 <label for="MobileMenuCheck_Language" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("LanguageIcon").SelectedValue menu-mobile__link-icon"></i> @selectedLanguage</label>
4466 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger"></label>
4467 </div>
4468 <ul class="menu-mobile menu-mobile__submenu expand-menu">
4469 @if (isSlidesDesign)
4470 {
4471 <li class="menu-mobile__item dw-mod">
4472 <div class="menu-mobile__link__wrap">
4473 <input id="MobileMenuCheck_Language_back" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(0);" />
4474 <label for="MobileMenuCheck_Language_back" class="menu-mobile__trigger menu-mobile__trigger--back"></label>
4475 <label for="MobileMenuCheck_Language_back" class="menu-mobile__link dw-mod ">@Translate("Back")</label>
4476 </div>
4477 </li>
4478 }
4479 @foreach (var lang in Model.Languages)
4480 {
4481 <li class="menu-mobile__item dw-mod">
4482 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1" href="/Default.aspx?ID=@lang.Page.ID">@lang.Name</a>
4483 </li>
4484 }
4485 </ul>
4486 </li>
4487 }</text>
4488 }
4489 else
4490 {
4491 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4492
4493 @using System
4494 @using System.Web
4495 @using System.Collections.Generic
4496 @using Dynamicweb.Rapido.Blocks.Extensibility
4497 @using Dynamicweb.Rapido.Blocks
4498
4499 @functions {
4500 BlocksPage headerBlocksPage = BlocksPage.GetBlockPage("Master");
4501 }
4502
4503 @{
4504 Block masterTools = new Block()
4505 {
4506 Id = "MasterDesktopTools",
4507 SortId = 10,
4508 Template = RenderDesktopTools(),
4509 SkipRenderBlocksList = true,
4510 BlocksList = new List<Block>
4511 {
4512 new Block {
4513 Id = "MasterDesktopToolsText",
4514 SortId = 10,
4515 Template = RenderDesktopToolsText(),
4516 Design = new Design
4517 {
4518 Size = "auto",
4519 HidePadding = true,
4520 RenderType = RenderType.Column
4521 }
4522 },
4523 new Block {
4524 Id = "MasterDesktopToolsNavigation",
4525 SortId = 20,
4526 Template = RenderDesktopToolsNavigation(),
4527 Design = new Design
4528 {
4529 Size = "auto-width",
4530 HidePadding = true,
4531 RenderType = RenderType.Column
4532 }
4533 }
4534 }
4535 };
4536 headerBlocksPage.Add("MasterHeader", masterTools);
4537
4538 Block masterDesktopExtra = new Block()
4539 {
4540 Id = "MasterDesktopExtra",
4541 SortId = 10,
4542 Template = RenderDesktopExtra(),
4543 SkipRenderBlocksList = true
4544 };
4545 headerBlocksPage.Add("MasterHeader", masterDesktopExtra);
4546
4547 Block masterDesktopNavigation = new Block()
4548 {
4549 Id = "MasterDesktopNavigation",
4550 SortId = 20,
4551 Template = RenderDesktopNavigation(),
4552 SkipRenderBlocksList = true
4553 };
4554 headerBlocksPage.Add("MasterHeader", masterDesktopNavigation);
4555 }
4556
4557 @* Include the Blocks for the page *@
4558 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4559
4560 @using System
4561 @using System.Web
4562 @using Dynamicweb.Rapido.Blocks.Extensibility
4563 @using Dynamicweb.Rapido.Blocks
4564
4565 @{
4566 Block masterDesktopLogo = new Block
4567 {
4568 Id = "MasterDesktopLogo",
4569 SortId = 10,
4570 Template = RenderDesktopLogo(),
4571 Design = new Design
4572 {
4573 Size = "auto-width",
4574 HidePadding = true,
4575 RenderType = RenderType.Column,
4576 CssClass = "grid--align-self-center"
4577 }
4578 };
4579
4580 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopLogo);
4581 }
4582
4583
4584 @helper RenderDesktopLogo()
4585 {
4586 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
4587 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4588 string alignClass = topLayout == "two-lines-centered" || topLayout == "two-lines" ? "grid--align-self-center" : "";
4589 alignClass = topLayout == "splitted-center" ? "u-middle" : alignClass;
4590 string logo = Model.Area.Item.GetItem("Layout").GetFile("LogoImage") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoImage").PathUrlEncoded : "/Files/Images/logo-dynamicweb.png";
4591 if (Path.GetExtension(logo).ToLower() != ".svg")
4592 {
4593 int logoHeight = Model.Area.Item.GetItem("Layout").GetInt32("LogoHeight");
4594 logoHeight = logoHeight > 0 && Pageview.Device.ToString() != "Mobile" ? logoHeight : 40;
4595 logo = "/Admin/Public/GetImage.ashx?height=" + Converter.ToString(logoHeight) + "&crop=5&Compression=75&image=" + logo;
4596 }
4597 else
4598 {
4599 logo = HttpUtility.UrlDecode(logo);
4600 }
4601
4602 <div class="logo @alignClass dw-mod">
4603 <a href="/Default.aspx?ID=@firstPageId" class="logo__img dw-mod u-block">
4604 <img class="grid__cell-img logo__img dw-mod" src="@logo" alt="@Translate("Logo")" />
4605 </a>
4606 </div>
4607 }
4608 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4609
4610 @using System
4611 @using System.Web
4612 @using Dynamicweb.Rapido.Blocks.Extensibility
4613 @using Dynamicweb.Rapido.Blocks
4614
4615 @functions {
4616 bool isMegaMenu;
4617 }
4618
4619 @{
4620 isMegaMenu = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu") != null ? Converter.ToBoolean(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("NavigationMegaMenu").SelectedValue) : false;
4621 Block masterDesktopMenu = new Block
4622 {
4623 Id = "MasterDesktopMenu",
4624 SortId = 10,
4625 Template = RenderDesktopMenu(),
4626 Design = new Design
4627 {
4628 Size = "auto",
4629 HidePadding = true,
4630 RenderType = RenderType.Column
4631 }
4632 };
4633
4634 if (isMegaMenu)
4635 {
4636 masterDesktopMenu.Design.CssClass = "u-reset-position";
4637 }
4638
4639 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopMenu);
4640 }
4641
4642 @helper RenderDesktopMenu()
4643 {
4644 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4645 string menuAlignment = topLayout == "minimal-right" ? "grid--align-self-end" : "";
4646 menuAlignment = topLayout == "minimal-center" ? "grid--align-self-center" : topLayout;
4647 string megamenuPromotionImage = Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage").PathUrlEncoded : "";
4648 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
4649 bool showOnlyHeaders = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOnlyHeaders");
4650 int startLevel = renderPagesInToolBar ? 1 : 0;
4651
4652 string promotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink");
4653
4654 <div class="grid__cell u-flex @(isMegaMenu ? "u-reset-position" : "") @menuAlignment">
4655 @if (!isMegaMenu)
4656 {
4657 @RenderNavigation(new
4658 {
4659 id = "topnavigation",
4660 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap",
4661 startLevel = startLevel,
4662 ecomStartLevel = startLevel + 1,
4663 endlevel = 5,
4664 expandmode = "all",
4665 template = "BaseMenuWithDropdown.xslt"
4666 });
4667 }
4668 else
4669 {
4670 @RenderNavigation(new
4671 {
4672 id = "topnavigation",
4673 cssclass = "menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap",
4674 startLevel = startLevel,
4675 ecomStartLevel = startLevel + 1,
4676 endlevel = 5,
4677 promotionImage = megamenuPromotionImage,
4678 promotionLink = promotionLink,
4679 expandmode = "all",
4680 showOnlyHeaders = showOnlyHeaders.ToString().ToLower(),
4681 template = "BaseMegaMenu.xslt"
4682 });
4683 }
4684 </div>
4685 }
4686 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4687
4688 @using System
4689 @using System.Web
4690 @using Dynamicweb.Rapido.Blocks.Extensibility
4691 @using Dynamicweb.Rapido.Blocks
4692
4693 @{
4694 Block masterDesktopActionsMenu = new Block
4695 {
4696 Id = "MasterDesktopActionsMenu",
4697 SortId = 10,
4698 Template = RenderDesktopActionsMenu(),
4699 Design = new Design
4700 {
4701 CssClass = "u-flex"
4702 },
4703 SkipRenderBlocksList = true
4704
4705 };
4706 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterDesktopActionsMenu);
4707
4708 if (!string.IsNullOrWhiteSpace(Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink")))
4709 {
4710 Block masterDesktopActionsHeaderButton = new Block
4711 {
4712 Id = "MasterDesktopActionsHeaderButton",
4713 SortId = 60,
4714 Template = RenderHeaderButton()
4715 };
4716 masterDesktopActionsMenu.Add(masterDesktopActionsHeaderButton);
4717 }
4718 }
4719
4720 @helper RenderDesktopActionsMenu()
4721 {
4722 List<Block> subBlocks = this.headerBlocksPage.GetBlockListById("MasterDesktopActionsMenu").OrderBy(item => item.SortId).ToList();
4723
4724 <ul class="menu u-flex dw-mod">
4725 @RenderBlockList(subBlocks)
4726 </ul>
4727 }
4728
4729 @helper RenderHeaderButton()
4730 {
4731 string headerButtonText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonText");
4732 string headerButtonLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("HeaderButtonLink");
4733 string headerButtonType = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType") != null ? "btn--" + Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("HeaderButtonType").SelectedName.ToLower() : "";
4734
4735 <li class="menu__item menu__item--horizontal menu--clean dw-mod">
4736 <a class="btn @headerButtonType dw-mod u-no-margin u-margin-left" href="@headerButtonLink">@headerButtonText</a>
4737 </li>
4738 }
4739 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4740
4741 @using System
4742 @using System.Web
4743 @using Dynamicweb.Core;
4744 @using System.Text.RegularExpressions
4745 @using Dynamicweb.Rapido.Blocks.Extensibility
4746 @using Dynamicweb.Rapido.Blocks
4747
4748 @{
4749 Block masterDesktopActionsMenuLanguageSelector = new Block
4750 {
4751 Id = "MasterDesktopActionsMenuLanguageSelector",
4752 SortId = 40,
4753 Template = RenderLanguageSelector()
4754 };
4755
4756 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuLanguageSelector);
4757 }
4758
4759 @helper RenderLanguageSelector()
4760 {
4761 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4762 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
4763 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
4764 string languageViewType = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue) ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue.ToLower() : "";
4765
4766 if (Model.Languages.Count > 1)
4767 {
4768 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon is-dropdown is-dropdown--no-icon dw-mod">
4769 <div class="@menuLinkClass dw-mod" title="@Translate("Language")">
4770 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("LanguageIcon").SelectedValue fa-1_5x"></i>
4771 </div>
4772 <div class="menu menu--dropdown menu--dropdown-right languages-dropdown dw-mod grid__cell">
4773 @foreach (var lang in Model.Languages)
4774 {
4775 string widthClass = "menu__item--fixed-width";
4776 string langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " u-margin-right\"></span>" + lang.Name;
4777 string cultureName = Regex.Replace(Dynamicweb.Services.Areas.GetArea(lang.ID).CultureInfo.NativeName, @" ?\(.*?\)", string.Empty);
4778 cultureName = char.ToUpper(cultureName[0]) + cultureName.Substring(1);
4779
4780 if (languageViewType == "flag-culture")
4781 {
4782 langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " \"></span> " + cultureName;
4783 }
4784
4785 if (languageViewType == "flag")
4786 {
4787 langInfo = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " \"></span>";
4788 widthClass = "";
4789 }
4790
4791 if (languageViewType == "name")
4792 {
4793 langInfo = lang.Name;
4794 }
4795
4796 if (languageViewType == "culture")
4797 {
4798 langInfo = cultureName;
4799 widthClass = "";
4800 }
4801
4802 <div class="menu__item dw-mod @widthClass">
4803 <a href="/Default.aspx?AreaID=@Dynamicweb.Services.Pages.GetPage(lang.Page.ID).Area.ID" class="menu-dropdown__link dw-mod">@langInfo</a>
4804 </div>
4805 }
4806 </div>
4807 </li>
4808 }
4809 }
4810 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4811
4812 @using System
4813 @using System.Web
4814 @using Dynamicweb.Rapido.Blocks.Extensibility
4815 @using Dynamicweb.Rapido.Blocks
4816
4817 @{
4818 Block masterDesktopActionsMenuSignIn = new Block
4819 {
4820 Id = "MasterDesktopActionsMenuSignIn",
4821 SortId = 20,
4822 Template = RenderSignIn()
4823 };
4824
4825 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuSignIn);
4826 }
4827
4828 @helper RenderSignIn()
4829 {
4830 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
4831 string userInitials = "";
4832 int pageId = Model.TopPage.ID;
4833 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
4834 int myDashboardPageId = GetPageIdByNavigationTag("CustomerDashboard");
4835 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
4836 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders");
4837 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
4838 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards");
4839 int myOrderDraftsPageId = GetPageIdByNavigationTag("OrderDraft");
4840 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4841 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
4842 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile");
4843 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders");
4844 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards");
4845 bool hideMyOrderDraftsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrderDrafts");
4846 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites");
4847 bool hideForgotPasswordLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideForgotPasswordLink");
4848
4849 string linkStart = "/Default.aspx?ID=";
4850 if (Model.CurrentUser.ID <= 0)
4851 {
4852 linkStart += signInProfilePageId + "&RedirectPageId=";
4853 }
4854
4855 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery";
4856 string myProfilePageLink = linkStart + myProfilePageId;
4857 string myOrdersPageLink = linkStart + myOrdersPageId;
4858 string myFavoritesPageLink = linkStart + myFavoritesPageId;
4859 string mySavedCardsPageLink = linkStart + mySavedCardsPageId;
4860 string myOrderDraftsLink = linkStart + myOrderDraftsPageId;
4861
4862 string profileIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue : "fa fa-user";
4863 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star";
4864 string orderDraftsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard";
4865
4866 if (Model.CurrentUser.ID != 0)
4867 {
4868 userInitials = Dynamicweb.Rapido.Services.User.GetInitials(Model.CurrentUser.Name, Model.CurrentUser.FirstName, Model.CurrentUser.LastName, Model.CurrentUser.Email, Model.CurrentUser.UserName);
4869 }
4870
4871 if (!navigationItemsHideSignIn)
4872 {
4873 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4874 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu__item--clean";
4875 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
4876
4877 <li class="menu__item menu__item--horizontal menu__item menu__item--icon @liClasses is-dropdown is-dropdown--no-icon dw-mod">
4878 <div class="@menuLinkClass dw-mod">
4879 @if (Model.CurrentUser.ID <= 0)
4880 {
4881 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignInProfileIcon").SelectedValue fa-1_5x" title="@Translate("Sign in")"></i>
4882 }
4883 else
4884 {
4885 <a href="/default.aspx?ID=@myDashboardPageId" class="u-color-inherit" title="@Translate("Customer center")"><div class="circle-icon-btn">@userInitials.ToUpper()</div></a>
4886 }
4887 </div>
4888 <div class="menu menu--dropdown menu--dropdown-right menu--sign-in grid__cell dw-mod">
4889 <ul class="list list--clean dw-mod">
4890 @if (Model.CurrentUser.ID <= 0)
4891 {
4892 <li>
4893 <label for="SignInModalTrigger" class="btn btn--primary btn--full u-no-margin sign-in-modal-trigger-button dw-mod" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)">@Translate("Sign in")</label>
4894 </li>
4895
4896 if (!hideCreateAccountLink)
4897 {
4898 @RenderListItem("/default.aspx?ID=" + createAccountPageId, Translate("Create account"));
4899 }
4900 if (!hideForgotPasswordLink)
4901 {
4902 @RenderListItem(forgotPasswordPageLink, Translate("Forgot your password?"))
4903 }
4904 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
4905 {
4906 @RenderSeparator()
4907 }
4908 }
4909 @if (!hideMyProfileLink)
4910 {
4911 @RenderListItem(myProfilePageLink, Translate("My Profile"), profileIcon)
4912 }
4913 @if (!hideMyOrdersLink)
4914 {
4915 @RenderListItem(myOrdersPageLink, Translate("My Orders"), "fas fa-list")
4916 }
4917 @if (!hideMyFavoritesLink)
4918 {
4919 @RenderListItem(myFavoritesPageLink, Translate("My Favorites"), favoritesIcon)
4920 }
4921 @if (!hideMySavedCardsLink)
4922 {
4923 @RenderListItem(mySavedCardsPageLink, Translate("My Saved cards"), "fas fa-credit-card")
4924 }
4925 @if (!hideMyOrderDraftsLink)
4926 {
4927 @RenderListItem(myOrderDraftsLink, Translate("My Order drafts"), orderDraftsIcon)
4928 }
4929 @if (Model.CurrentUser.ID > 0)
4930 {
4931 if (!hideMyProfileLink || !hideMyOrdersLink || !hideMyFavoritesLink || !hideMySavedCardsLink)
4932 {
4933 @RenderSeparator()
4934 }
4935
4936 //Check if impersonation is on
4937 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
4938 {
4939 <li>
4940 <div class="list__link dw-mod" onclick="document.getElementById('StopImpersonationModalTrigger').checked = true;">
4941 @Translate("Sign out")
4942 </div>
4943 </li>
4944 } else {
4945 @RenderListItem("/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId, Translate("Sign out"))
4946 }
4947 }
4948 </ul>
4949 </div>
4950 </li>
4951 }
4952 }
4953
4954 @helper RenderListItem(string link, string text, string icon = null) {
4955 <li>
4956 <a href="@link" class="list__link dw-mod" onclick="RememberState.SetCookie('useAnotherAddress', false)">
4957 @if (!string.IsNullOrEmpty(icon)){<i class="@icon u-margin-right"></i>}@text
4958 </a>
4959 </li>
4960 }
4961
4962 @helper RenderSeparator()
4963 {
4964 <li class="list__seperator dw-mod"></li>
4965 }
4966 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4967
4968 @using System
4969 @using System.Web
4970 @using Dynamicweb.Rapido.Blocks.Extensibility
4971 @using Dynamicweb.Rapido.Blocks
4972
4973 @{
4974 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideFavorites");
4975
4976 Block masterDesktopActionsMenuFavorites = new Block
4977 {
4978 Id = "MasterDesktopActionsMenuFavorites",
4979 SortId = 30,
4980 Template = RenderFavorites()
4981 };
4982
4983 if (!hideMyFavoritesLink && Model.CurrentUser.ID > 0)
4984 {
4985 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuFavorites);
4986 }
4987 }
4988
4989 @helper RenderFavorites()
4990 {
4991 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
4992 string myFavoritesPageLink = "/Default.aspx?ID=" + myFavoritesPageId;
4993
4994 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4995 string liClasses = topLayout != "normal" && topLayout != "splitted-center" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
4996 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
4997
4998 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod">
4999 <a href="@myFavoritesPageLink" class="@menuLinkClass dw-mod" title="@Translate("Favorites")">
5000 <i class="fas fa-@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue fa-1_5x"></i>
5001 </a>
5002 </li>
5003 }
5004 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5005
5006 @using System
5007 @using System.Web
5008 @using Dynamicweb.Rapido.Blocks.Extensibility
5009 @using Dynamicweb.Rapido.Blocks
5010 @using Dynamicweb.Rapido.Services
5011
5012 @{
5013 bool hideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart");
5014 string miniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown";
5015
5016 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !hideCart)
5017 {
5018 Block masterDesktopActionsMenuMiniCart = new Block
5019 {
5020 Id = "MasterDesktopActionsMenuMiniCart",
5021 SortId = 60,
5022 Template = RenderMiniCart(miniCartLayout == "dropdown"),
5023 SkipRenderBlocksList = true,
5024 BlocksList = new List<Block>()
5025 };
5026
5027 Block miniCartCounterScriptTemplate = new Block
5028 {
5029 Id = "MiniCartCounterScriptTemplate",
5030 Template = RenderMiniCartCounterContent()
5031 };
5032
5033 //dropdown layout is default
5034 RazorEngine.Templating.TemplateWriter layoutTemplate;
5035 RazorEngine.Templating.TemplateWriter miniCartTriggerTemplate;
5036
5037 switch (miniCartLayout)
5038 {
5039 case "dropdown":
5040 layoutTemplate = RenderMiniCartDropdownLayout();
5041 miniCartTriggerTemplate = RenderMiniCartTriggerLink();
5042 break;
5043 case "panel":
5044 layoutTemplate = RenderMiniCartPanelLayout();
5045 miniCartTriggerTemplate = RenderMiniCartTriggerLabel();
5046 break;
5047 case "modal":
5048 layoutTemplate = RenderMiniCartModalLayout();
5049 miniCartTriggerTemplate = RenderMiniCartTriggerLabel();
5050 break;
5051 case "none":
5052 default:
5053 layoutTemplate = RenderMiniCartDropdownLayout();
5054 miniCartTriggerTemplate = RenderMiniCartTriggerLink();
5055 break;
5056 }
5057
5058 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block
5059 {
5060 Id = "MiniCartTrigger",
5061 Template = miniCartTriggerTemplate
5062 });
5063
5064 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
5065 {
5066 masterDesktopActionsMenuMiniCart.BlocksList.Add(new Block
5067 {
5068 Id = "MiniCartLayout",
5069 Template = layoutTemplate
5070 });
5071 }
5072
5073 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuMiniCart);
5074 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate);
5075 }
5076
5077 if (hideCart && Dynamicweb.Rapido.Services.User.IsBuyingAllowed())
5078 {
5079 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", new Block {
5080 Id = "CartInitialization"
5081 });
5082 }
5083 }
5084
5085 @helper RenderMiniCart(bool hasMouseEnterEvent)
5086 {
5087 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterDesktopActionsMenuMiniCart").OrderBy(item => item.SortId).ToList();
5088 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5089 string liClasses = topLayout != "normal" ? "menu__item--top-level" : "menu--clean";
5090 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5091 string mouseEvent = "";
5092 string id = "MiniCart";
5093 if (hasMouseEnterEvent)
5094 {
5095 mouseEvent = "onmouseenter=\"Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=" + miniCartFeedPageId + "&feedType=MiniCart')\"";
5096 id = "miniCartTrigger";
5097 }
5098 <li class="menu__item menu__item--horizontal menu__item--icon @liClasses dw-mod" id="@id" @mouseEvent>
5099 @RenderBlockList(subBlocks)
5100 </li>
5101 }
5102
5103 @helper RenderMiniCartTriggerLabel()
5104 {
5105 int cartPageId = GetPageIdByNavigationTag("CartPage");
5106 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart";
5107 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5108 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5109 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5110
5111 <div class="@menuLinkClass dw-mod js-mini-cart-button" onclick="Cart.UpdateMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart')" title="@Translate("Cart")">
5112 <div class="u-inline u-position-relative">
5113 <i class="@cartIcon fa-1_5x"></i>
5114 @RenderMiniCartCounter()
5115 </div>
5116 </div>
5117 }
5118
5119 @helper RenderMiniCartTriggerLink()
5120 {
5121 int cartPageId = GetPageIdByNavigationTag("CartPage");
5122 string cartIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue : "fa fa-cart";
5123 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5124 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5125
5126 <a href="/Default.aspx?ID=@cartPageId&Purge=True" class="@menuLinkClass menu__item--icon dw-mod js-mini-cart-button" title="@Translate("Cart")">
5127 <span class="u-inline u-position-relative">
5128 <i class="@cartIcon fa-1_5x"></i>
5129 @RenderMiniCartCounter()
5130 </span>
5131 </a>
5132 }
5133
5134 @helper RenderMiniCartCounter()
5135 {
5136 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5137 string cartProductsCount = Model.Cart.TotalProductsCount.ToString();
5138 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right";
5139 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice");
5140 string cartProductsTotalPrice = showPrice && Model.Cart.TotalPrice != null ? Model.Cart.TotalPrice.Price.Formatted : "";
5141 cartProductsTotalPrice = counterPosition == "right" ? cartProductsTotalPrice : "";
5142
5143 if (showPrice && counterPosition == "right")
5144 {
5145 cartProductsCount = Translate("Cart") + " (" + cartProductsCount + ")";
5146 }
5147
5148 <span class="mini-cart__counter @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod">
5149 <span class="js-handlebars-root js-mini-cart-counter" id="cartCounter" data-template="MiniCartCounterContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=Counter" data-init-onload="false" data-preloader="false">
5150 <span class="js-mini-cart-counter-content" data-count="@Model.Cart.TotalProductsCount.ToString()">
5151 @cartProductsCount @cartProductsTotalPrice
5152 </span>
5153 </span>
5154 </span>
5155 }
5156
5157 @helper RenderMiniCartCounterContent()
5158 {
5159 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice");
5160 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right";
5161 bool showPriceInMiniCartCounter = Pageview.Device.ToString() != "Mobile" && counterPosition == "right" && showPrice;
5162
5163 <script id="MiniCartCounterContent" type="text/x-template">
5164 {{#.}}
5165 <span class="js-mini-cart-counter-content dw-mod" data-count="{{numberofproducts}}">
5166 @if (showPriceInMiniCartCounter)
5167 {
5168 @Translate("Cart")<text>({{numberofproducts}}) {{totalprice}}</text>
5169 }
5170 else
5171 {
5172 <text>{{numberofproducts}}</text>
5173 }
5174 </span>
5175 {{/.}}
5176 </script>
5177 }
5178
5179 @helper RenderMiniCartDropdownLayout()
5180 {
5181 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5182 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage");
5183
5184 <div class="mini-cart mini-cart-dropdown js-mini-cart grid__cell dw-mod" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="dropdown" data-cart-page-link="@cartPageLink">
5185 <div class="mini-cart-dropdown__inner dw-mod">
5186 <h3 class="u-ta-center dw-mod">@Translate("Shopping cart")</h3>
5187 <div class="mini-cart-dropdown__body u-flex dw-mod">
5188 <div class="js-handlebars-root u-flex grid--direction-column u-full-width dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div>
5189 </div>
5190 </div>
5191 </div>
5192 }
5193
5194 @helper RenderMiniCartPanelLayout()
5195 {
5196 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5197 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage");
5198
5199 <div class="mini-cart grid__cell dw-mod">
5200 <input type="checkbox" id="miniCartTrigger" class="panel-trigger" />
5201 <div class="panel panel--right panel--with-close-btn dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block" data-cart-page-link="@cartPageLink">
5202 <label for="miniCartTrigger" class="panel__close-btn" title="@Translate("Close panel")"><i class="fas fa-times"></i></label>
5203 <div class="panel__content u-full-width dw-mod">
5204 <h3 class="panel__header dw-mod u-margin-bottom u-ta-center">@Translate("Shopping cart")</h3>
5205 <div class="panel__content-body panel__content-body--cart dw-mod">
5206 <div class="js-handlebars-root u-flex grid--direction-column u-full-height dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div>
5207 </div>
5208 </div>
5209 </div>
5210 </div>
5211 }
5212
5213 @helper RenderMiniCartModalLayout()
5214 {
5215 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5216 string cartPageLink = "Default.aspx?ID=" + GetPageIdByNavigationTag("CartPage");
5217
5218 <div class="mini-cart grid__cell dw-mod">
5219 <input type="checkbox" id="miniCartTrigger" class="modal-trigger" autocomplete="off" />
5220 <div class="modal-container dw-mod js-mini-cart" id="miniCart" data-cart-id="@miniCartFeedPageId" data-show-type="block" data-cart-page-link="@cartPageLink">
5221 <label for="miniCartTrigger" class="modal-overlay"></label>
5222 <div class="modal modal--md modal--top-right dw-mod">
5223 <div class="modal__body u-flex grid--direction-column dw-mod">
5224 <h3 class="dw-mod u-ta-center">@Translate("Shopping cart")</h3>
5225 <div class="js-handlebars-root u-flex grid--direction-column dw-mod" id="miniCartContent" data-template="MiniCartContent" data-json-feed="/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart" data-init-onload="false"></div>
5226 </div>
5227 <label class="modal__close-btn modal__close-btn--clean dw-mod" for="miniCartTrigger" title="@Translate("Close modal")"></label>
5228 </div>
5229 </div>
5230 </div>
5231 }
5232 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5233
5234 @using System
5235 @using System.Web
5236 @using Dynamicweb.Rapido.Blocks.Extensibility
5237 @using Dynamicweb.Rapido.Blocks
5238
5239 @{
5240 bool showOrderDraftLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOrderDraftIcon");
5241
5242 Block masterDesktopActionsMenuOrderDraft = new Block
5243 {
5244 Id = "MasterDesktopActionsMenuOrderDraft",
5245 SortId = 40,
5246 Template = RenderOrderDraft()
5247 };
5248
5249 if (showOrderDraftLink && Model.CurrentUser.ID > 0)
5250 {
5251 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuOrderDraft);
5252 }
5253 }
5254
5255 @helper RenderOrderDraft()
5256 {
5257 int OrderDraftPageId = GetPageIdByNavigationTag("OrderDraft");
5258 string OrderDraftPageLink = "/Default.aspx?ID=" + OrderDraftPageId;
5259 string draftIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon") != null ? Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("DraftIcon").SelectedValue : "fa fa-clipboard";
5260
5261
5262 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5263 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
5264 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5265
5266 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod">
5267 <a href="@OrderDraftPageLink" class="@menuLinkClass dw-mod" title="@Translate("My order drafts")">
5268 <span class="u-inline u-position-relative">
5269 <i class="@draftIcon fa-1_5x"></i>
5270 </span>
5271 </a>
5272 </li>
5273 }
5274 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5275
5276 @using System
5277 @using System.Web
5278 @using Dynamicweb.Rapido.Blocks.Extensibility
5279 @using Dynamicweb.Rapido.Blocks
5280
5281 @{
5282 bool showDownloadCartLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart");
5283
5284 Block masterDesktopActionsMenuDownloadCart = new Block
5285 {
5286 Id = "MasterDesktopActionsMenuDownloadCart",
5287 SortId = 50,
5288 Template = RenderDownloadCart()
5289 };
5290
5291 if (showDownloadCartLink && Model.CurrentUser.ID > 0)
5292 {
5293 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterDesktopActionsMenuDownloadCart);
5294 }
5295 }
5296
5297 @helper RenderDownloadCart()
5298 {
5299 int downloadCartPageId = GetPageIdByNavigationTag("DownloadCart");
5300 string downloadCartPageLink = "/Default.aspx?ID=" + downloadCartPageId;
5301
5302 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5303 string liClasses = topLayout != "normal" ? "menu__item--top-level u-hidden-xxs" : "menu--clean";
5304 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5305 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right";
5306
5307 <li class="menu__item menu__item--horizontal @liClasses menu__item--icon dw-mod">
5308 <a href="@downloadCartPageLink" class="@menuLinkClass dw-mod" title="@Translate("Download cart")">
5309 <span class="u-inline u-position-relative">
5310 <i class="fas fa-cart-arrow-down fa-1_5x"></i>
5311 <span class="mini-cart__counter u-hidden @(counterPosition == "right" ? "mini-cart__counter--inline" : "") dw-mod js-download-cart-counter"></span>
5312 </span>
5313 </a>
5314 </li>
5315 }
5316 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5317
5318 @using System
5319 @using System.Web
5320 @using Dynamicweb.Rapido.Blocks.Extensibility
5321 @using Dynamicweb.Rapido.Blocks
5322
5323 @functions {
5324 public class SearchConfiguration
5325 {
5326 public string searchFeedId { get; set; }
5327 public string searchSecondFeedId { get; set; }
5328 public int groupsFeedId { get; set; }
5329 public string resultPageLink { get; set; }
5330 public string searchPlaceholder { get; set; }
5331 public string searchType { get; set; }
5332 public string searchTemplate { get; set; }
5333 public string searchContentTemplate { get; set; }
5334 public string searchValue { get; set; }
5335 public bool showGroups { get; set; }
5336
5337 public SearchConfiguration()
5338 {
5339 searchFeedId = "";
5340 searchSecondFeedId = "";
5341 searchType = "product-search";
5342 searchContentTemplate = "";
5343 showGroups = true;
5344 }
5345 }
5346 }
5347 @{
5348 Block masterSearchBar = new Block
5349 {
5350 Id = "MasterSearchBar",
5351 SortId = 40,
5352 Template = RenderSearch("bar"),
5353 Design = new Design
5354 {
5355 Size = "auto",
5356 HidePadding = true,
5357 RenderType = RenderType.Column
5358 }
5359 };
5360
5361 Block masterSearchAction = new Block
5362 {
5363 Id = "MasterDesktopActionsMenuSearch",
5364 SortId = 10,
5365 Template = RenderSearch()
5366 };
5367
5368 BlocksPage.GetBlockPage("Master").Add("MasterHeader", masterSearchBar);
5369 BlocksPage.GetBlockPage("Master").Add("MasterDesktopActionsMenu", masterSearchAction);
5370 }
5371
5372 @helper RenderSearch(string type = "mini-search")
5373 {
5374 string productsPageId = Converter.ToString(GetPageIdByNavigationTag("ProductsPage"));
5375 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
5376 string searchType = Model.Area.Item.GetItem("Layout").GetList("TopSearch") != null ? Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue : "productSearch";
5377
5378 SearchConfiguration searchConfiguration = null;
5379
5380 switch (searchType) {
5381 case "contentSearch":
5382 searchConfiguration = new SearchConfiguration() {
5383 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true",
5384 resultPageLink = contentSearchPageLink,
5385 searchPlaceholder = Translate("Search page"),
5386 groupsFeedId = 0,
5387 searchType = "content-search",
5388 searchTemplate = "SearchPagesTemplate",
5389 showGroups = false
5390 };
5391 break;
5392 case "combinedSearch":
5393 searchConfiguration = new SearchConfiguration() {
5394 searchFeedId = productsPageId + "&feed=true",
5395 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true",
5396 resultPageLink = Converter.ToString(productsPageId),
5397 searchPlaceholder = Translate("Search products or pages"),
5398 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"),
5399 searchType = "combined-search",
5400 searchTemplate = "SearchProductsTemplateWrap",
5401 searchContentTemplate = "SearchPagesTemplateWrap",
5402 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector")
5403 };
5404 break;
5405 default: //productSearch
5406 searchConfiguration = new SearchConfiguration() {
5407 resultPageLink = Converter.ToString(productsPageId),
5408 searchFeedId = productsPageId + "&feed=true",
5409 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"),
5410 searchPlaceholder = Translate("Search products"),
5411 searchTemplate = "SearchProductsTemplate",
5412 searchType = "product-search",
5413 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector")
5414 };
5415 break;
5416 }
5417 searchConfiguration.searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? "";
5418
5419 if (type == "mini-search") {
5420 @RenderMiniSearch(searchConfiguration)
5421 } else {
5422 @RenderSearchBar(searchConfiguration)
5423 }
5424 }
5425
5426 @helper RenderSearchBar(SearchConfiguration options)
5427 {
5428 <div class="typeahead typeahead--centered u-color-inherit js-typeahead dw-mod" id="ProductSearchBar"
5429 data-page-size="7"
5430 data-search-feed-id="@options.searchFeedId"
5431 data-search-second-feed-id="@options.searchSecondFeedId"
5432 data-result-page-id="@options.resultPageLink"
5433 data-groups-page-id="@options.groupsFeedId"
5434 data-search-type="@options.searchType">
5435 @if (options.showGroups)
5436 {
5437 <button type="button" class="btn btn--condensed u-color-light-gray--bg typeahead-group-btn dw-mod js-typeahead-groups-btn" data-group-id="all">@Translate("All")</button>
5438 <ul class="dropdown dropdown--absolute-position u-min-w220px js-handlebars-root js-typeahead-groups-content dw-mod" id="ProductSearchBarGroupsContent" data-template="SearchGroupsTemplate" data-json-feed="/Default.aspx?ID=@options.groupsFeedId&feedType=productGroups" data-init-onload="false" data-preloader="minimal"></ul>
5439 }
5440 <div class="typeahead-search-field">
5441 <input type="text" class="u-no-margin u-full-width u-full-height js-typeahead-search-field" placeholder="@options.searchPlaceholder" value="@options.searchValue">
5442 @if (string.IsNullOrEmpty(options.searchSecondFeedId))
5443 {
5444 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId&feedType=productsOnly" data-init-onload="false"></ul>
5445 }
5446 else
5447 {
5448 <div class="dropdown dropdown--absolute-position dropdown--combined grid">
5449 <div class="js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-init-onload="false"></div>
5450 <div class="js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@options.searchContentTemplate" data-init-onload="false"></div>
5451 </div>
5452 }
5453 </div>
5454 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod js-typeahead-enter-btn" title="@Translate("Search")"><i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue"></i></button>
5455 </div>
5456 }
5457
5458 @helper RenderMiniSearch(SearchConfiguration options)
5459 {
5460 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5461 string menuLinkClass = topLayout != "normal" && topLayout != "splitted-center" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
5462
5463 <li class="menu__item menu__item--horizontal menu__item--top-level menu__item--icon u-hidden-xxs is-dropdown is-dropdown--no-icon dw-mod" id="miniSearchIcon">
5464 <div class="@menuLinkClass dw-mod" title="@Translate("Search")">
5465 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SearchIcon").SelectedValue fa-1_5x"></i>
5466 </div>
5467 <div class="menu menu--dropdown menu--dropdown-right u-no-padding u-w380px grid__cell dw-mod">
5468 <div class="typeahead js-typeahead" id="ProductSearchBar"
5469 data-page-size="7"
5470 data-search-feed-id="@options.searchFeedId"
5471 data-search-second-feed-id="@options.searchSecondFeedId"
5472 data-result-page-id="@options.resultPageLink"
5473 data-search-type="@options.searchType">
5474 <div class="typeahead-search-field">
5475 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" id="headerSearch" placeholder="@options.searchPlaceholder" value="@options.searchValue">
5476 @if (string.IsNullOrEmpty(options.searchSecondFeedId))
5477 {
5478 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId&feedType=productsOnly" data-init-onload="false"></ul>
5479 }
5480 else
5481 {
5482 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--right-aligned">
5483 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@options.searchTemplate" data-json-feed="/Default.aspx?ID=@options.searchFeedId&feedType=productsOnly" data-init-onload="false"></div>
5484 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@options.searchContentTemplate" data-json-feed="/Default.aspx?ID=@options.searchSecondFeedId" data-init-onload="false"></div>
5485 </div>
5486 }
5487 </div>
5488 </div>
5489 </div>
5490 </li>
5491 }
5492 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5493
5494 @using System
5495 @using System.Web
5496 @using Dynamicweb.Rapido.Blocks.Extensibility
5497 @using Dynamicweb.Rapido.Blocks
5498
5499 @{
5500 string headerConfigurationTopLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5501 bool headerConfigurationHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
5502
5503 BlocksPage headerConfigurationPage = BlocksPage.GetBlockPage("Master");
5504
5505 Block configDesktopLogo = headerConfigurationPage.GetBlockById("MasterDesktopLogo");
5506 headerConfigurationPage.RemoveBlock(configDesktopLogo);
5507
5508 Block configDesktopMenu = headerConfigurationPage.GetBlockById("MasterDesktopMenu");
5509 headerConfigurationPage.RemoveBlock(configDesktopMenu);
5510
5511 Block configSearchBar = headerConfigurationPage.GetBlockById("MasterSearchBar");
5512 headerConfigurationPage.RemoveBlock(configSearchBar);
5513
5514 Block configSearchAction = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenuSearch");
5515 headerConfigurationPage.RemoveBlock(configSearchAction);
5516
5517 Block configDesktopActionsMenu = headerConfigurationPage.GetBlockById("MasterDesktopActionsMenu");
5518 headerConfigurationPage.RemoveBlock(configDesktopActionsMenu);
5519
5520 Block configDesktopExtra = headerConfigurationPage.GetBlockById("MasterDesktopExtra");
5521
5522 switch (headerConfigurationTopLayout)
5523 {
5524 case "condensed": //2
5525 configDesktopLogo.Design.Size = "auto-width";
5526 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
5527
5528 configDesktopMenu.SortId = 20;
5529 configDesktopMenu.Design.Size = "auto";
5530 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
5531
5532 configDesktopActionsMenu.SortId = 30;
5533 configDesktopActionsMenu.Design.Size = "auto-width";
5534 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
5535
5536 if (!headerConfigurationHideSearch)
5537 {
5538 configSearchBar.SortId = 40;
5539 configSearchBar.Design.Size = "12";
5540 configDesktopExtra.SortId = 50;
5541 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar);
5542 }
5543 break;
5544 case "splitted": //3
5545 configDesktopLogo.Design.Size = "auto";
5546 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
5547
5548 if (!headerConfigurationHideSearch)
5549 {
5550 configSearchBar.SortId = 20;
5551 configSearchBar.Design.Size = "auto";
5552 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar);
5553 }
5554
5555 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
5556
5557 configDesktopActionsMenu.SortId = 20;
5558 configDesktopActionsMenu.Design.Size = "auto-width";
5559 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
5560 break;
5561 case "splitted-center": //4
5562 configDesktopLogo.Design.Size = "auto";
5563 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
5564 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
5565
5566 configDesktopActionsMenu.SortId = 30;
5567 configDesktopActionsMenu.Design.Size = "auto-width";
5568 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu);
5569
5570 if (!headerConfigurationHideSearch)
5571 {
5572 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
5573 }
5574 break;
5575 case "minimal": //5
5576 configDesktopLogo.Design.Size = "auto-width";
5577 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
5578
5579 configDesktopMenu.Design.Size = "auto";
5580 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
5581
5582 configDesktopActionsMenu.SortId = 20;
5583 configDesktopActionsMenu.Design.Size = "auto-width";
5584 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
5585
5586 if (!headerConfigurationHideSearch)
5587 {
5588 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
5589 }
5590 break;
5591 case "minimal-center": //6
5592 configDesktopLogo.Design.Size = "auto-width";
5593 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
5594
5595 configDesktopMenu.Design.Size = "auto";
5596 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
5597
5598 configDesktopActionsMenu.SortId = 20;
5599 configDesktopActionsMenu.Design.Size = "auto-width";
5600 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
5601
5602 if (!headerConfigurationHideSearch)
5603 {
5604 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
5605 }
5606 break;
5607 case "minimal-right": //7
5608 configDesktopLogo.Design.Size = "auto-width";
5609 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopLogo);
5610
5611 configDesktopMenu.Design.Size = "auto";
5612 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
5613
5614 configDesktopActionsMenu.SortId = 20;
5615 configDesktopActionsMenu.Design.Size = "auto-width";
5616 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
5617
5618 if (!headerConfigurationHideSearch)
5619 {
5620 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
5621 }
5622 break;
5623 case "two-lines": //8
5624 configDesktopLogo.Design.Size = "auto";
5625 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
5626
5627 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
5628
5629 configDesktopActionsMenu.SortId = 20;
5630 configDesktopActionsMenu.Design.Size = "auto-width";
5631 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
5632
5633 if (!headerConfigurationHideSearch)
5634 {
5635 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
5636 }
5637 break;
5638 case "two-lines-centered": //9
5639 configDesktopLogo.Design.Size = "auto";
5640 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
5641
5642 configDesktopMenu.Design.Size = "auto-width";
5643 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
5644
5645 configDesktopActionsMenu.SortId = 20;
5646 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopActionsMenu);
5647
5648 if (!headerConfigurationHideSearch)
5649 {
5650 headerConfigurationPage.Add("MasterDesktopActionsMenu", configSearchAction);
5651 }
5652 break;
5653 case "normal": //1
5654 default:
5655 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopLogo);
5656
5657 if (!headerConfigurationHideSearch)
5658 {
5659 configSearchBar.SortId = 20;
5660 headerConfigurationPage.Add("MasterDesktopExtra", configSearchBar);
5661 }
5662
5663 configDesktopActionsMenu.SortId = 30;
5664 headerConfigurationPage.Add("MasterDesktopExtra", configDesktopActionsMenu);
5665
5666 configDesktopActionsMenu.Design.Size = "auto-width";
5667 headerConfigurationPage.Add("MasterDesktopNavigation", configDesktopMenu);
5668 break;
5669 }
5670 }
5671 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5672 @using System
5673 @using System.Web
5674 @using Dynamicweb.Rapido.Blocks.Extensibility
5675 @using Dynamicweb.Rapido.Blocks
5676
5677
5678 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5679 @using Dynamicweb.Core
5680 @using System
5681 @using System.Web
5682 @using System.Collections.Generic
5683 @using Dynamicweb.Rapido.Blocks
5684 @using Dynamicweb.Frontend.Navigation
5685 @using Dynamicweb.Rapido.Blocks.Components.General
5686 @using System.Linq
5687 @using Dynamicweb.Extensibility
5688 @using Dynamicweb.Ecommerce.Products
5689 @using Dynamicweb
5690 @using Dynamicweb.Frontend
5691 @using Dynamicweb.Content.Items
5692
5693 @functions{
5694
5695 bool showOnlyHeaders;
5696 string megamenuPromotionImage;
5697 string megamenuPromotionLink;
5698
5699 private static bool ShowSubPages(NavigationTreeNodeViewModel node)
5700 {
5701 var pages = Dynamicweb.Services.Pages.GetPagesByParentID(node.PageId).ToList();
5702 return node.Nodes.Any() && (pages.Any(p => p.ItemType != "Composer") || !pages.Any());
5703 }
5704
5705 private Dynamicweb.Ecommerce.Products.Group GetGroupByName(string groupName)
5706 {
5707 var groups = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroups().ToList();
5708
5709 return groups.FirstOrDefault(g => g.Name.Equals(groupName));
5710 }
5711
5712 private bool IsShowInMenu(string groupName)
5713 {
5714 var group = GetGroupByName(groupName);
5715 return group != null && group.NavigationShowInMenu;
5716 }
5717
5718 private string GetProductType(NavigationTreeNodeViewModel node, string systemName)
5719 {
5720 if (IsShowInMenu(node.Name))
5721 {
5722 if (GetGroupByName(node.Name).ProductGroupFieldValues.GetProductGroupFieldValue(systemName) != null)
5723 {
5724 var filterType = GetGroupByName(node.Name).ProductGroupFieldValues.GetProductGroupFieldValue(systemName).Value.ToString();
5725 return filterType;
5726 }
5727 }
5728 return string.Empty;
5729 }
5730
5731 private string GetBrandType(NavigationTreeNodeViewModel node, string itemType, string brandType)
5732 {
5733 var pages = Dynamicweb.Services.Paragraphs.GetParagraphsByPageId(node.PageId);
5734
5735 foreach (var page in pages)
5736 {
5737 if (page.ItemType.Contains(itemType) && page.Item[brandType] != null)
5738 {
5739 var type = page.Item[brandType].ToString();
5740 return type;
5741 }
5742 }
5743 return string.Empty;
5744 }
5745
5746 private LinkTargetType GetLinkTarget(string link)
5747 {
5748 return link.StartsWith("http") || link.StartsWith("www") ? LinkTargetType.Blank : LinkTargetType.None;
5749 }
5750
5751 private string GetMenuItemCssClass(NavigationTreeNodeViewModel node, bool isStartLevel)
5752 {
5753 string menuItemCssClass = "menu__item dw-mod";
5754
5755 if (isStartLevel)
5756 {
5757 menuItemCssClass += " menu__item--horizontal menu__item--top-level dw-navbar-button";
5758
5759 if (node.Nodes.Any())
5760 {
5761 menuItemCssClass += isMegaMenu ? " is-mega" : " is-dropdown";
5762 }
5763 }
5764 else if (!isMegaMenu)
5765 {
5766 menuItemCssClass += ShowSubPages(node) ? " is-dropleft" : "";
5767 menuItemCssClass += " menu__item--fixed-width u-margin-left";
5768 }
5769
5770 menuItemCssClass += isMegaMenu ? " menu__item--mega" : "";
5771 menuItemCssClass += !node.IsClickable ? " menu__item--disabled" : "";
5772 menuItemCssClass += node.IsActive || node.InPath ? " menu__item--active" : "";
5773
5774 return menuItemCssClass;
5775 }
5776
5777 private string GetMenuLinkCssClass(NavigationTreeNodeViewModel node, bool isStartLevel)
5778 {
5779 string menuLinkCssClass = "";
5780 if (isStartLevel)
5781 {
5782 menuLinkCssClass += "menu__link";
5783 menuLinkCssClass += node.IsActive || node.InPath ? " menu__link--active" : "";
5784 }
5785 else
5786 {
5787 if (isMegaMenu)
5788 {
5789 menuLinkCssClass += "mega-menu__link";
5790 menuLinkCssClass += node.IsActive || node.InPath ? " mega-menu__link--active" : "";
5791 }
5792 else
5793 {
5794 menuLinkCssClass += "menu-dropdown__link";
5795 menuLinkCssClass += node.IsActive || node.InPath ? " menu-dropdown__link--active" : "";
5796 }
5797 }
5798
5799 menuLinkCssClass += !node.IsClickable ? " menu__link--disabled" : "";
5800
5801 return menuLinkCssClass + " dw-mod";
5802 }
5803
5804 private string GetMegaMenuGridCssClass(NavigationTreeNodeViewModel node)
5805 {
5806 string megaMenuGridCssClasses = "grid__col-sm-4 grid__col-xs-12 mega-menu__col dw-mod";
5807 megaMenuGridCssClasses = string.IsNullOrEmpty(megamenuPromotionImage) ? "grid__col-lg-3 grid__col-md-3 " + megaMenuGridCssClasses : "grid__col-lg-4 grid__col-md-4 " + megaMenuGridCssClasses;
5808 megaMenuGridCssClasses = showOnlyHeaders ? megaMenuGridCssClasses + " grid__col--bleed" : megaMenuGridCssClasses + " grid__col--bleed-x";
5809
5810 if (IsShowInMenu(node.Name))
5811 {
5812 megaMenuGridCssClasses = string.IsNullOrEmpty(GetProductType(node, "type")) ? megaMenuGridCssClasses + " group" : megaMenuGridCssClasses + " group " + GetProductType(node, "type").Replace(",", " ");
5813 }
5814
5815 megaMenuGridCssClasses = !string.IsNullOrEmpty(GetBrandType(node, "BrandParagraph", "BrandType")) ? megaMenuGridCssClasses + " brand " + GetBrandType(node, "BrandParagraph", "BrandType").Replace(",", " ") : megaMenuGridCssClasses;
5816
5817 return megaMenuGridCssClasses;
5818 }
5819
5820 private string GetMegaMenuHeaderCssClass(NavigationTreeNodeViewModel node)
5821 {
5822 string megaMenuHeaderCssClass = "menu__item mega-menu__header-container__text dw-mod";
5823 megaMenuHeaderCssClass += node.IsClickable ? " mega-menu__header-container__text--link" : "";
5824 megaMenuHeaderCssClass += node.IsActive || node.InPath ? " mega-menu__header-container__text--active" : "";
5825
5826 return megaMenuHeaderCssClass;
5827 }
5828 }
5829
5830 @{
5831 showOnlyHeaders = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowOnlyHeaders");
5832 megamenuPromotionImage = Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetFile("MegamenuPromotionImage").PathUrlEncoded : "";
5833 megamenuPromotionLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("MegamenuPromotionLink");
5834
5835
5836 var navigationSettings = new NavigationSettings()
5837 {
5838 StartLevel = 1,
5839 StopLevel = 5,
5840 ExpandMode = ExpandMode.All,
5841 Parameters = { { "id", "topnavigation" } }
5842 };
5843
5844 var masterDesktopMenuCustom = BlocksPage.GetBlockPage("Master").GetBlockById("MasterDesktopMenu");
5845 if (masterDesktopMenuCustom != null && isMegaMenu)
5846 {
5847 masterDesktopMenuCustom.Template = RenderNavigationMenu(navigationSettings);
5848 }
5849 }
5850
5851 @helper RenderNavigationMenu(NavigationSettings navigationSettings)
5852 {
5853 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
5854 string menuAlignment = topLayout == "minimal-right" ? "grid--align-self-end" : "";
5855
5856 <div class="grid__cell u-flex u-reset-position @menuAlignment">
5857 @RenderNavigationNodes(navigationSettings)
5858 </div>
5859
5860 }
5861
5862 @helper RenderNavigationNodes(NavigationSettings navigationSettings = null)
5863 {
5864 var nodes = GetNavigation(navigationSettings).Nodes;
5865 string id = "";
5866 int startLevel = 1;
5867
5868 if (navigationSettings != null)
5869 {
5870 id = navigationSettings.Parameters["id"].ToString();
5871 startLevel = navigationSettings.StartLevel;
5872 }
5873
5874 <ul class="menu dw-mod dwnavigation u-full-max-width u-flex grid--wrap" @(!string.IsNullOrEmpty(id) ? "id=" + id : string.Empty)>
5875
5876 @foreach (NavigationTreeNodeViewModel node in nodes)
5877 {
5878 var isStartLevel = node.Level == startLevel;
5879
5880 <li class="@GetMenuItemCssClass(node, isStartLevel)">
5881
5882 @RenderMenuLink(node, GetMenuLinkCssClass(node, isStartLevel))
5883
5884 @if (node.Nodes.Any())
5885 {
5886 if (isMegaMenu)
5887 {
5888 <div class="menu mega-menu dw-mod">
5889 <div class="grid grid--align-content-start mega-menu__grid dw-mod">
5890 @RenderMegaMenu(node.Nodes)
5891 </div>
5892 </div>
5893 }
5894 else
5895 {
5896 <ul class="menu dw-mod menu--dropdown">
5897 @RenderSubGroups(node.Nodes)
5898 </ul>
5899 }
5900 }
5901 </li>
5902 }
5903 </ul>
5904 }
5905
5906
5907
5908 @helper RenderMegaMenu(IEnumerable<NavigationTreeNodeViewModel> nodes)
5909 {
5910 bool hasGroupsFields = false;
5911 bool hasBrandType = false;
5912
5913 foreach (NavigationTreeNodeViewModel node in nodes)
5914 {
5915 if (IsShowInMenu(node.Name) && !string.IsNullOrEmpty(GetProductType(node, "type")))
5916 {
5917 hasGroupsFields = true;
5918 }
5919
5920 if (!string.IsNullOrEmpty(GetBrandType(node, "BrandParagraph", "BrandType")))
5921 {
5922 hasBrandType = true;
5923 }
5924 }
5925
5926 if (hasGroupsFields)
5927 {
5928 ProductGroupFieldCollection fields = ProductGroupField.FindProductGroupFieldsBySystemName("type");
5929 if (fields.Count > 0)
5930 {
5931 var fieldId = "";
5932 foreach (ProductGroupField field in fields)
5933 {
5934 fieldId = field.Id;
5935
5936 }
5937 FieldOptionCollection options = FieldOption.GetOptionsByFieldId(fieldId);
5938
5939 if (options.Count > 0)
5940 {
5941 <div class="u-full-width u-align-center">
5942 @foreach (FieldOption option in options)
5943 {
5944 <button class="filter-option btn btn--secondary u-margin u-padding u-w200px dw-mod" data-filtergroup="@option.Value" onclick=FilterItems(event)>@Translate("SHOP ") @option.Name</button>
5945 }
5946 </div>
5947 }
5948 }
5949 }
5950
5951 if (hasBrandType)
5952 {
5953 var brands = ItemManager.Metadata.GetItemType("BrandParagraph")?.Fields;
5954 var brandTypes = brands?.Find("BrandType") != null ? brands.Find("BrandType").Options.Values : null;
5955
5956 <div class="u-full-width u-align-center">
5957 @foreach (var type in brandTypes)
5958 {
5959 <button class="filter-option btn btn--secondary u-margin u-padding u-w200px dw-mod" data-filterbrand="@type.Value" onclick=FilterItems(event)>@Translate("SHOP ") @type.Name</button>
5960 }
5961 </div>
5962 }
5963
5964 if (!string.IsNullOrEmpty(megamenuPromotionImage))
5965 {
5966 <div class="grid__col-9 grid__col--bleed">
5967 <div class="grid grid--align-content-start">
5968 @foreach (NavigationTreeNodeViewModel node in nodes)
5969 {
5970 @RenderMegaMenuGrid(node)
5971 }
5972 </div>
5973 </div>
5974 <div class="grid__col-3 mega-menu__promotion-image">
5975 @Render(new Image
5976 {
5977 Link = megamenuPromotionLink,
5978 Path = megamenuPromotionImage,
5979 DisableLazyLoad = true,
5980 DisableImageEngine = true
5981 })
5982 </div>
5983 }
5984 else
5985 {
5986 foreach (NavigationTreeNodeViewModel node in nodes)
5987 {
5988 @RenderMegaMenuGrid(node)
5989 }
5990
5991 }
5992
5993 <script>
5994 var buttonTertiary = document.querySelectorAll(".filter-option");
5995 for (var i = 0, len = buttonTertiary.length; i < len; i++) {
5996
5997 if (i % 2 == 0) {
5998 buttonTertiary[i].className = "filter-option btn btn--tertiary u-margin u-padding u-w200px dw-mod";
5999 }
6000 }
6001 </script>
6002 }
6003
6004 @helper RenderMegaMenuGrid(NavigationTreeNodeViewModel node)
6005 {
6006 <div class="@GetMegaMenuGridCssClass(node)">
6007 <div class="mega-menu__list-wrap dw-mod">
6008 <div class="mega-menu__header-container dw-mod">
6009 @if (IsShowInMenu(node.Name))
6010 {
6011 var smallImage = GetGroupByName(node.Name).SmallImage;
6012 if (!string.IsNullOrEmpty(smallImage))
6013 {
6014 @Render(new Image()
6015 {
6016 DisableLazyLoad = true,
6017 Path = smallImage,
6018 Link = node.Link
6019 })
6020 }
6021 }
6022
6023 @RenderMenuLink(node, GetMegaMenuHeaderCssClass(node))
6024 </div>
6025 @if (!showOnlyHeaders)
6026 {
6027 <ul class="menu dw-mod">
6028 @RenderSubGroups(node.Nodes)
6029 </ul>
6030 }
6031 </div>
6032 </div>
6033 }
6034
6035
6036 @helper RenderSubGroups(IEnumerable<NavigationTreeNodeViewModel> nodes)
6037 {
6038 foreach (NavigationTreeNodeViewModel node in nodes)
6039 {
6040 var smallImage = GetGroupByName(node.Name)?.SmallImage;
6041
6042 <li class="@GetMenuItemCssClass(node, false)">
6043 @if (isMegaMenu && !string.IsNullOrEmpty(smallImage))
6044 {
6045 @Render(new Image()
6046 {
6047 DisableLazyLoad = true,
6048 Path = smallImage,
6049 Link = node.Link
6050 })
6051 }
6052 else
6053 {
6054 @RenderMenuLink(node, GetMenuLinkCssClass(node, false))
6055 }
6056
6057 @if (ShowSubPages(node))
6058 {
6059 <ul class="menu menu--dropleft dw-mod">
6060 @RenderSubGroups(node.Nodes)
6061 </ul>
6062 }
6063 </li>
6064 }
6065 }
6066
6067 @helper RenderMenuLink(NavigationTreeNodeViewModel node, string cssClass)
6068 {
6069 if (node.IsClickable)
6070 {
6071 @Render(new Link()
6072 {
6073 Href = node.Link,
6074 CssClass = cssClass,
6075 Target = GetLinkTarget(node.Link),
6076 Title = node.Name,
6077 ButtonLayout = ButtonLayout.None
6078 })
6079 }
6080 else
6081 {
6082 <span class="@cssClass">@node.Name</span>
6083 }
6084 }
6085
6086
6087
6088
6089
6090
6091 @helper RenderDesktopTools()
6092 {
6093 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopTools").OrderBy(item => item.SortId).ToList();
6094
6095 <div class="tools-navigation dw-mod">
6096 <div class="center-container grid top-container__center-container dw-mod">
6097 @RenderBlockList(subBlocks)
6098 </div>
6099 </div>
6100 }
6101
6102 @helper RenderDesktopToolsText()
6103 {
6104 string toolsText = Model.Area.Item.GetItem("Layout").GetItem("Header").GetString("ToolsText");
6105 if (!string.IsNullOrEmpty(toolsText))
6106 {
6107 <div class="u-margin-top u-margin-bottom">@toolsText</div>
6108 }
6109 }
6110
6111 @helper RenderDesktopToolsNavigation()
6112 {
6113 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
6114
6115 if (renderPagesInToolBar)
6116 {
6117 @RenderNavigation(new
6118 {
6119 id = "topToolsNavigation",
6120 cssclass = "menu menu-tools dw-mod dwnavigation",
6121 template = "TopMenu.xslt"
6122 })
6123 }
6124 }
6125
6126 @helper RenderDesktopNavigation()
6127 {
6128 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopNavigation").OrderBy(item => item.SortId).ToList();
6129 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
6130 string alignClass = topLayout == "two-lines-centered" ? "grid--justify-center" : "";
6131 <nav class="main-navigation dw-mod">
6132 <div class="center-container top-container__center-container grid @alignClass dw-mod">
6133 @RenderBlockList(subBlocks)
6134 </div>
6135 </nav>
6136 }
6137
6138 @helper RenderDesktopExtra()
6139 {
6140 List<Block> subBlocks = headerBlocksPage.GetBlockListById("MasterDesktopExtra").OrderBy(item => item.SortId).ToList();
6141
6142 if (subBlocks.Count > 0)
6143 {
6144 <div class="header header-top dw-mod">
6145 <div class="center-container top-container__center-container grid--justify-space-between grid grid--align-center dw-mod">
6146 @RenderBlockList(subBlocks)
6147 </div>
6148 </div>
6149 }
6150 }</text>
6151 }
6152
6153 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
6154
6155 @using System
6156 @using System.Web
6157 @using Dynamicweb.Rapido.Blocks.Extensibility
6158 @using Dynamicweb.Rapido.Blocks
6159 @using Dynamicweb.Rapido.Blocks.Components.General
6160 @using Dynamicweb.Frontend
6161
6162 @functions {
6163 int impersonationPageId;
6164 string impersonationLayout;
6165 int impersonationFeed;
6166 Block impersonationBar;
6167
6168 string getUserNameFromParams(string firstName, string middleName, string lastName, string name, string email, string userName)
6169 {
6170 string username = "";
6171
6172 if (!string.IsNullOrEmpty(firstName) && !string.IsNullOrEmpty(lastName))
6173 {
6174 username = firstName + " " + (!string.IsNullOrEmpty(middleName) ? middleName + " " : "") + lastName;
6175 }
6176 else if (!string.IsNullOrEmpty(name))
6177 {
6178 username = name;
6179 }
6180 else if (!string.IsNullOrEmpty(email))
6181 {
6182 username = email;
6183 }
6184 else
6185 {
6186 username = userName;
6187 }
6188 return username;
6189 }
6190
6191 string getUserName(UserViewModel user)
6192 {
6193 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName);
6194 }
6195
6196 string getUserName(Dynamicweb.Security.UserManagement.User user)
6197 {
6198 return getUserNameFromParams(user.FirstName, user.MiddleName, user.LastName, user.Name, user.Email, user.UserName);
6199 }
6200 }
6201
6202 @{
6203 impersonationPageId = GetPageIdByNavigationTag("Impersonation");
6204 impersonationLayout = Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout") != null ? Model.Area.Item.GetItem("Ecommerce").GetList("ImpersonationLayout").SelectedValue : "bar";
6205 impersonationFeed = GetPageIdByNavigationTag("UsersFeed");
6206
6207 if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0)
6208 {
6209 impersonationBar = new Block
6210 {
6211 Id = "ImpersonationBar",
6212 SortId = 50,
6213 Template = RenderImpersonation(),
6214 SkipRenderBlocksList = true,
6215 Design = new Design
6216 {
6217 Size = "auto-width",
6218 HidePadding = true,
6219 RenderType = RenderType.Column
6220 }
6221 };
6222
6223 if (impersonationLayout == "top-bar") {
6224 impersonationBar.SortId = 9;
6225 }
6226
6227 Block impersonationContent = new Block
6228 {
6229 Id = "ImpersonationContent",
6230 SortId = 20
6231 };
6232
6233 if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
6234 {
6235 //Render stop impersonation view
6236 impersonationContent.Template = RenderStopImpersonationView();
6237
6238
6239 Modal stopImpersonation = new Modal
6240 {
6241 Id = "StopImpersonation",
6242 Heading = new Heading {
6243 Level = 2,
6244 Title = Translate("Sign out"),
6245 Icon = new Icon {
6246 Name = "fa-sign-out",
6247 Prefix = "fas",
6248 LabelPosition = IconLabelPosition.After
6249 }
6250 },
6251 Width = ModalWidth.Sm,
6252 BodyTemplate = RenderStopImpersonationForm()
6253 };
6254
6255 Block stopImpersonationBlock = new Block
6256 {
6257 Id = "StopImpersonationBlock",
6258 SortId = 10,
6259 Component = stopImpersonation
6260 };
6261 impersonationBar.BlocksList.Add(stopImpersonationBlock);
6262 }
6263 else
6264 {
6265 //Render main view
6266 switch (impersonationLayout)
6267 {
6268 case "right-lower-box":
6269 impersonationContent.BlocksList.Add(
6270 new Block {
6271 Id = "RightLowerBoxHeader",
6272 SortId = 10,
6273 Component = new Heading {
6274 Level = 5,
6275 Title = Translate("View the list of users you can sign in as"),
6276 CssClass = "impersonation-text"
6277 }
6278 }
6279 );
6280 impersonationContent.BlocksList.Add(
6281 new Block {
6282 Id = "RightLowerBoxContent",
6283 SortId = 20,
6284 Template = RenderImpersonationControls()
6285 }
6286 );
6287 break;
6288 case "right-lower-bar":
6289 impersonationContent.BlocksList.Add(
6290 new Block {
6291 Id = "RightLowerBarContent",
6292 SortId = 10,
6293 Template = RenderImpersonationControls()
6294 }
6295 );
6296 break;
6297 case "bar":
6298 default:
6299 impersonationContent.BlocksList.Add(
6300 new Block {
6301 Id = "ViewListLink",
6302 SortId = 20,
6303 Template = RenderViewListLink()
6304 }
6305 );
6306 impersonationContent.BlocksList.Add(
6307 new Block {
6308 Id = "BarTypeaheadSearch",
6309 SortId = 30,
6310 Template = RenderTypeaheadSearch()
6311 }
6312 );
6313 break;
6314 }
6315 }
6316 impersonationBar.BlocksList.Add(impersonationContent);
6317
6318 impersonationBar.BlocksList.Add(
6319 new Block
6320 {
6321 Id = "ImpersonationSearchTemplates",
6322 SortId = 30,
6323 Template = RenderSearchResultTemplate()
6324 }
6325 );
6326 if (impersonationLayout != "bar" && impersonationLayout != "top-bar")
6327 {
6328 impersonationBar.BlocksList.Add(
6329 new Block
6330 {
6331 Id = "ImpersonationSearchScripts",
6332 SortId = 40,
6333 Template = RenderSearchScripts()
6334 }
6335 );
6336 }
6337 BlocksPage.GetBlockPage("Master").Add("MasterHeader", impersonationBar);
6338 }
6339 }
6340
6341 @helper RenderImpersonation()
6342 {
6343 List<Block> subBlocks = impersonationBar.BlocksList.OrderBy(item => item.SortId).ToList();
6344 <input type="checkbox" class="impersonation-trigger js-remember-state" id="ImpersonationMinimizeTrigger" />
6345 <div class="impersonation impersonation--@(impersonationLayout)-layout dw-mod" id="Impersonation">
6346 @if (impersonationLayout == "right-lower-box")
6347 {
6348 @RenderRightLowerBoxHeader()
6349 }
6350 <div class="center-container top-container__center-container impersonation__container @(impersonationLayout != "bar" && impersonationLayout != "top-bar" ? "impersonation__container--box" : "") dw-mod">
6351 @*Impersonation*@
6352 @RenderBlockList(subBlocks)
6353 </div>
6354 </div>
6355 }
6356
6357 @helper RenderRightLowerBoxHeader()
6358 {
6359 <div class="impersonation__header dw-mod">
6360 <div class="impersonation__title">@Translate("Impersonation")</div>
6361 <label for="ImpersonationMinimizeTrigger" class="btn btn--impersonation impersonation__minimize-btn dw-mod" onclick="this.blur();">
6362 @Render(new Icon
6363 {
6364 Prefix = "fas",
6365 Name = "fa-window-minimize"
6366 })
6367 </label>
6368 </div>
6369 }
6370
6371 @helper RenderStopImpersonationView()
6372 {
6373 string secondaryUserName = getUserName(Model.CurrentSecondaryUser);
6374 string userName = getUserName(Pageview.User);
6375 string impersonationText = "<span class=\"impersonation-light-text dw-mod\">" + Translate("Logged in as") + "</span> <b>" + secondaryUserName + "</b> <span class=\"impersonation-light-text dw-mod\">" + Translate("by") + "</span> <b>" + userName + "</b> ";
6376 impersonationText = Dynamicweb.Security.UserManagement.User.ImpersonationMode == Dynamicweb.Security.UserManagement.UserImpersonation.Full ? "<span class=\"impersonation-light-text dw-mod\">" + Translate("Logged in as") + "</span> <b>" + userName + "</b> <span class=\"impersonation-light-text dw-mod\">" + Translate("by") + "</span> <b>" + secondaryUserName + "</b> " : impersonationText;
6377
6378 if (impersonationLayout == "right-lower-box")
6379 {
6380 <div class="u-margin-bottom--lg u-ta-center">
6381 @impersonationText
6382 </div>
6383 <div class="u-margin-bottom--lg u-ta-center">
6384 @RenderSwitchAccountButton()
6385 </div>
6386 @RenderStopImpersonationButton()
6387 }
6388 else
6389 {
6390 <div class="grid grid--align-center impersonation__stop-wrap">
6391 <div class="impersonation-bar-item dw-mod">
6392 @impersonationText
6393 </div>
6394 <div class="impersonation-bar-item dw-mod">
6395 @RenderSwitchAccountButton()
6396 </div>
6397 <div class="impersonation-bar-item dw-mod">
6398 @RenderStopImpersonationButton()
6399 </div>
6400 </div>
6401 }
6402 }
6403
6404 @helper RenderSwitchAccountButton() {
6405 @Render(new Button
6406 {
6407 Href = "/Default.aspx?ID=" + impersonationPageId,
6408 ButtonType = ButtonType.Button,
6409 ButtonLayout = ButtonLayout.Clean,
6410 Title = Translate("Switch account"),
6411 Icon = new Icon {
6412 Name = "fa-users",
6413 Prefix = "fal",
6414 LabelPosition = IconLabelPosition.After
6415 },
6416 CssClass = "u-no-margin u-color-inherit"
6417 })
6418 }
6419
6420 @helper RenderStopImpersonationForm()
6421 {
6422 string secondaryUserName = getUserName(Model.CurrentSecondaryUser);
6423 string userName = getUserName(Pageview.User);
6424 int pageId = Model.TopPage.ID;
6425
6426 <form method="post" class="u-no-margin">
6427 @Render(new Button
6428 {
6429 ButtonType = ButtonType.Submit,
6430 ButtonLayout = ButtonLayout.Secondary,
6431 Title = Translate("Sign out as") + " " + userName,
6432 Href = "/Default.aspx?ID=" + impersonationPageId,
6433 CssClass = "btn--full",
6434 Name = "DwExtranetRemoveSecondaryUser"
6435 })
6436
6437 @Render(new Button
6438 {
6439 ButtonType = ButtonType.Submit,
6440 ButtonLayout = ButtonLayout.Secondary,
6441 Title = Translate("Sign out as") + " " + secondaryUserName,
6442 Href = "/Admin/Public/ExtranetLogoff.aspx?ID=" + pageId,
6443 CssClass = "btn--full",
6444 Name = "DwExtranetRemoveSecondaryUser"
6445 })
6446 </form>
6447 }
6448
6449 @helper RenderStopImpersonationButton() {
6450 @Render(new Button
6451 {
6452 ButtonType = ButtonType.Button,
6453 ButtonLayout = ButtonLayout.Clean,
6454 Title = Translate("Sign out"),
6455 Icon = new Icon {
6456 Name = "fa-sign-out",
6457 Prefix = "fal",
6458 LabelPosition = IconLabelPosition.After
6459 },
6460 OnClick = "document.getElementById('StopImpersonationModalTrigger').checked = true",
6461 CssClass = "u-no-margin"
6462 })
6463 }
6464
6465 @helper RenderImpersonationControls()
6466 {
6467 <div class="impersonation__controls">
6468 @RenderViewListLink()
6469 @RenderSearchBox()
6470 </div>
6471 @RenderResultsList()
6472 }
6473
6474 @helper RenderViewListLink()
6475 {
6476 string title = impersonationLayout == "right-lower-box" ? Translate("View the list") : Translate("View the list of users you can sign in as");
6477 string buttonClasses = impersonationLayout == "right-lower-box" ? "impersonation__button btn btn--impersonation" : "impersonation__link impersonation__link";
6478
6479 @Render(new Link {
6480 ButtonLayout = ButtonLayout.None,
6481 Title = title,
6482 Href = "/Default.aspx?ID=" + impersonationPageId,
6483 CssClass = buttonClasses
6484 })
6485 }
6486
6487 @helper RenderSearchBox()
6488 {
6489 <div class="impersonation__search-wrap">
6490 <input placeholder="@Translate("Search users")" type="text" class="impersonation__search-field dw-mod" onkeyup="searchKeyUpHandler(event)" id="ImpersonationBoxSearchField">
6491 <div id="ImpersonationBoxSearchFind" class="impersonation__search-icon dw-mod" onclick="updateResults(document.getElementById('ImpersonationBoxSearchField').value)">
6492 <i class="fal fa-search"></i>
6493 </div>
6494 <div id="ImpersonationBoxSearchClear" class="impersonation__search-icon u-hidden dw-mod" onclick="clearResults();">
6495 <i class="fal fa-times"></i>
6496 </div>
6497 </div>
6498 }
6499
6500 @helper RenderTypeaheadSearch()
6501 {
6502 <div class="typeahead u-ta-right impersonation__typeahead js-typeahead dw-mod" id="ImpersonationSearchBar"
6503 data-page-size="5"
6504 data-search-feed-id="@impersonationFeed"
6505 data-result-page-id="@impersonationPageId"
6506 data-search-type="user-search"
6507 data-search-parameter-name="q">
6508
6509 <div class="typeahead-search-field">
6510 <input type="text" class="u-no-margin u-full-width js-typeahead-search-field" placeholder="@Translate("Search users")">
6511 <ul class="dropdown dropdown--absolute-position u-min-w220px u-full-width js-handlebars-root js-typeahead-search-content dw-mod" id="ImpersonationSearchBarContent" data-template="ImpersonationSearchResult" data-json-feed="/Default.aspx?ID=@impersonationFeed" data-init-onload="false"></ul>
6512 </div>
6513 </div>
6514 }
6515
6516 @helper RenderResultsList()
6517 {
6518 <ul id="ImpersonationBoxSearchResults" class="impersonation__search-results js-handlebars-root dw-mod" data-template="ImpersonationSearchResult" data-json-feed="/Default.aspx?ID=@impersonationFeed" data-init-onload="false" data-preloader="minimal"></ul>
6519 }
6520
6521 @helper RenderSearchResultTemplate()
6522 {
6523 <script id="ImpersonationSearchResult" type="text/x-template">
6524 {{#.}}
6525 {{#Users}}
6526 <li class="impersonation__search-results-item impersonation-user">
6527 <form method="post" class="impersonation-user__form" name="account{{id}}">
6528 <input type="hidden" id="DWExtranetSecondaryUserSelector" name="DWExtranetSecondaryUserSelector" value="{{id}}">
6529 <div class="impersonation-user__info">
6530 <div class="impersonation-user__name">{{userName}}</div>
6531 <div class="impersonation-user__number">{{customerNumber}}</div>
6532 </div>
6533 @Render(new Button
6534 {
6535 ButtonType = ButtonType.Submit,
6536 ButtonLayout = ButtonLayout.Secondary,
6537 Title = Translate("Sign in as"),
6538 CssClass = "impersonation-user__sign-in-btn" + (impersonationLayout != "bar" ? " btn--impersonation" : "")
6539 })
6540 </form>
6541 </li>
6542 {{/Users}}
6543 {{#unless Users}}
6544 <li class="impersonation__search-results-item impersonation__search-results-item--not-found">
6545 @Translate("Your search gave 0 results")
6546 </li>
6547 {{/unless}}
6548 {{/.}}
6549 </script>
6550 }
6551
6552 @helper RenderSearchScripts()
6553 {
6554 <script>
6555 let inputDelayTimer;
6556 function searchKeyUpHandler(e) {
6557 clearTimeout(inputDelayTimer);
6558 let value = e.target.value;
6559 if (value != "") {
6560 inputDelayTimer = setTimeout(function () {
6561 updateResults(value);
6562 }, 500);
6563 } else {
6564 clearResults();
6565 }
6566 };
6567
6568 function updateResults(value) {
6569 if (value == "") {
6570 return null;
6571 }
6572 HandlebarsBolt.UpdateContent("ImpersonationBoxSearchResults", "/Default.aspx?ID=@impersonationFeed&q=" + value);
6573 document.getElementById("ImpersonationBoxSearchFind").classList.add("u-hidden");
6574 document.getElementById("ImpersonationBoxSearchClear").classList.remove("u-hidden");
6575 }
6576
6577 function clearResults() {
6578 document.getElementById("ImpersonationBoxSearchField").value = "";
6579 HandlebarsBolt.CleanContainer("ImpersonationBoxSearchResults");
6580 document.getElementById("ImpersonationBoxSearchFind").classList.remove("u-hidden");
6581 document.getElementById("ImpersonationBoxSearchClear").classList.add("u-hidden");
6582 }
6583 </script>
6584 }
6585 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
6586
6587 @using System
6588 @using System.Web
6589 @using System.Collections.Generic
6590 @using Dynamicweb.Rapido.Blocks.Extensibility
6591 @using Dynamicweb.Rapido.Blocks
6592
6593 @{
6594 BlocksPage miniCartBlocksPage = BlocksPage.GetBlockPage("Master");
6595 string orderlinesView = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView").SelectedValue : "table";
6596
6597 Block orderLines = new Block
6598 {
6599 Id = "MiniCartOrderLines",
6600 SkipRenderBlocksList = true,
6601 BlocksList = new List<Block>
6602 {
6603 new Block {
6604 Id = "MiniCartOrderLinesList",
6605 SortId = 20,
6606 Template = RenderMiniCartOrderLinesList()
6607 }
6608 }
6609 };
6610
6611 Block orderlinesScriptTemplates = new Block
6612 {
6613 Id = "OrderlinesScriptTemplates"
6614 };
6615
6616 if (orderlinesView == "table")
6617 {
6618 orderLines.Template = RenderMiniCartOrderLinesTable();
6619 orderLines.BlocksList.Add(
6620 new Block
6621 {
6622 Id = "MiniCartOrderlinesTableHeader",
6623 SortId = 10,
6624 Template = RenderMiniCartOrderLinesHeader()
6625 }
6626 );
6627
6628 orderlinesScriptTemplates.Template = RenderMiniCartScriptsTableTemplates();
6629 }
6630 else
6631 {
6632 orderLines.Template = RenderMiniCartOrderLinesBlocks();
6633 orderlinesScriptTemplates.Template = RenderMiniCartScriptsListTemplates();
6634 }
6635
6636 miniCartBlocksPage.Add("MasterBottomSnippets", orderlinesScriptTemplates);
6637
6638 Block miniCartScriptTemplates = new Block()
6639 {
6640 Id = "MasterMiniCartTemplates",
6641 SortId = 1,
6642 Template = RenderMiniCartScriptTemplates(),
6643 SkipRenderBlocksList = true,
6644 BlocksList = new List<Block>
6645 {
6646 orderLines,
6647 new Block {
6648 Id = "MiniCartFooter",
6649 Template = RenderMiniCartFooter(),
6650 SortId = 50,
6651 SkipRenderBlocksList = true,
6652 BlocksList = new List<Block>
6653 {
6654 new Block {
6655 Id = "MiniCartSubTotal",
6656 Template = RenderMiniCartSubTotal(),
6657 SortId = 30
6658 },
6659 new Block {
6660 Id = "MiniCartFees",
6661 Template = RenderMiniCartFees(),
6662 SortId = 40
6663 },
6664 new Block {
6665 Id = "MiniCartPoints",
6666 Template = RenderMiniCartPoints(),
6667 SortId = 50
6668 },
6669 new Block {
6670 Id = "MiniCartTotal",
6671 Template = RenderMiniCartTotal(),
6672 SortId = 60
6673 },
6674 new Block {
6675 Id = "MiniCartDisclaimer",
6676 Template = RenderMiniCartDisclaimer(),
6677 SortId = 70
6678 },
6679 new Block {
6680 Id = "MiniCartActions",
6681 Template = RenderMiniCartActions(),
6682 SortId = 80
6683 }
6684 }
6685 }
6686 }
6687 };
6688
6689 miniCartBlocksPage.Add("MasterBottomSnippets", miniCartScriptTemplates);
6690 }
6691
6692 @helper RenderMiniCartScriptsTableTemplates()
6693 {
6694 <script id="MiniCartOrderline" type="text/x-template">
6695 {{#unless isEmpty}}
6696 <tr>
6697 <td class="u-w60px"><a href="{{link}}" class="{{hideimage}}"><img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=50&height=50&crop=5&Compression=75&image={{image}}" alt="{{name}}" title="{{name}}"></a></td>
6698 <td class="u-va-middle">
6699 <a href="{{link}}" class="mini-cart-orderline__name" title="{{name}}">{{name}}</a>
6700 {{#if variantname}}
6701 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{variantname}}</a>
6702 {{/if}}
6703 {{#if unitname}}
6704 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{unitname}}</div>
6705 {{/if}}
6706 </td>
6707 <td class="u-ta-right u-va-middle">{{quantity}}</td>
6708 <td class="u-ta-right u-va-middle">
6709 {{#if pointsTotal}}
6710 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points")
6711 {{else}}
6712 {{totalprice}}
6713 {{/if}}
6714 </td>
6715 </tr>
6716 {{/unless}}
6717 </script>
6718
6719 <script id="MiniCartOrderlineDiscount" type="text/x-template">
6720 {{#unless isEmpty}}
6721 <tr class="table__row--no-border">
6722 <td class="u-w60px"> </td>
6723 <td><div class="mini-cart-orderline__name dw-mod">{{name}}</div></td>
6724 <td class="u-ta-right"> </td>
6725 <td class="u-ta-right">{{totalprice}}</td>
6726 </tr>
6727 {{/unless}}
6728 </script>
6729 }
6730
6731 @helper RenderMiniCartScriptsListTemplates()
6732 {
6733 int cartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
6734
6735 <script id="MiniCartOrderline" type="text/x-template">
6736 {{#unless isEmpty}}
6737 <div class="mini-cart-orderline grid dw-mod">
6738 <div class="grid__col-4">
6739 <a href="{{link}}" class="{{hideimage}}">
6740 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=100&height=100&crop=5&Compression=75&image={{image}}" alt="{{name}}" title="{{name}}">
6741 </a>
6742 </div>
6743 <div class="grid__col-8">
6744 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--truncate mini-cart-orderline__name--md u-padding-right--lg" title="{{name}}">{{name}}</a>
6745 {{#if variantname}}
6746 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Variant"): {{variantname}}</div>
6747 {{/if}}
6748 {{#if unitname}}
6749 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Unit"): {{unitname}}</div>
6750 {{/if}}
6751 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Qty"): {{quantity}}</div>
6752
6753 <div class="grid__cell-footer">
6754 <div class="grid__cell">
6755 <div class="u-pull--left mini-cart-orderline__price dw-mod">
6756 {{#if pointsTotal}}
6757 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points")
6758 {{else}}
6759 {{totalprice}}
6760 {{/if}}
6761 </div>
6762 <button type="button"
6763 title="@Translate("Remove orderline")"
6764 class="btn btn--clean btn--condensed u-pull--right mini-cart-orderline__remove-btn dw-mod"
6765 onclick="{{#if googleImpression}}googleImpressionRemoveFromCart({{googleImpression}});{{/if}}Cart.UpdateCart('miniCartContent', '/Default.aspx?ID=@cartFeedPageId', 'CartCmd=DelOrderLine&key={{orderLineId}}&redirect=false', true);">@Translate("Remove")</button>
6766 </div>
6767 </div>
6768 </div>
6769 </div>
6770 {{/unless}}
6771 </script>
6772
6773 <script id="MiniCartOrderlineDiscount" type="text/x-template">
6774 {{#unless isEmpty}}
6775 <div class="mini-cart-orderline mini-cart-orderline--discount grid dw-mod">
6776 <div class="grid__col-4">
6777 <div class="mini-cart-orderline__name mini-cart-orderline__name dw-mod">{{name}}</div>
6778 </div>
6779 <div class="grid__col-8">{{totalprice}}</div>
6780 </div>
6781 {{/unless}}
6782 </script>
6783 }
6784
6785 @helper RenderMiniCartScriptTemplates()
6786 {
6787 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMiniCartTemplates").OrderBy(item => item.SortId).ToList();
6788 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
6789 string cartPageLink = string.Concat("/Default.aspx?ID=", GetPageIdByNavigationTag("CartPage"));
6790 bool miniCartUseGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
6791
6792 <script id="MiniCartContent" type="text/x-template">
6793 {{#.}}
6794 {{#unless isEmpty}}
6795 @if (miniCartUseGoogleTagManager)
6796 {
6797 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text>
6798 }
6799 @RenderBlockList(subBlocks)
6800 {{/unless}}
6801 {{/.}}
6802 </script>
6803 }
6804
6805 @helper RenderMiniCartOrderLinesTable()
6806 {
6807 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList();
6808
6809 <div class="u-overflow-auto">
6810 <table class="table mini-cart-table dw-mod">
6811 @RenderBlockList(subBlocks)
6812 </table>
6813 </div>
6814 }
6815
6816 @helper RenderMiniCartOrderLinesBlocks()
6817 {
6818 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList();
6819
6820 <div class="u-overflow-auto">
6821 @RenderBlockList(subBlocks)
6822 </div>
6823 }
6824
6825 @helper RenderMiniCartOrderLinesHeader()
6826 {
6827 <thead>
6828 <tr>
6829 <td> </td>
6830 <td>@Translate("Product")</td>
6831 <td class="u-ta-right">@Translate("Qty")</td>
6832 <td class="u-ta-right" width="120">@Translate("Price")</td>
6833 </tr>
6834 </thead>
6835 }
6836
6837 @helper RenderMiniCartOrderLinesList()
6838 {
6839 <text>
6840 {{#OrderLines}}
6841 {{#ifCond template "===" "CartOrderline"}}
6842 {{>MiniCartOrderline}}
6843 {{/ifCond}}
6844 {{#ifCond template "===" "CartOrderlineMobile"}}
6845 {{>MiniCartOrderline}}
6846 {{/ifCond}}
6847 {{#ifCond template "===" "CartOrderlineDiscount"}}
6848 {{>MiniCartOrderlineDiscount}}
6849 {{/ifCond}}
6850 {{/OrderLines}}
6851 </text>
6852 }
6853
6854 @helper RenderMiniCartFees()
6855 {
6856 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
6857 if (!pointShop)
6858 {
6859 <text>
6860 {{#unless hidePaymentfee}}
6861 <div class="grid">
6862 <div class="grid__col-6 grid__col--bleed-y">
6863 {{paymentmethod}}
6864 </div>
6865 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{paymentfee}}</div>
6866 </div>
6867 {{/unless}}
6868 </text>
6869 }
6870 <text>
6871 {{#unless hideShippingfee}}
6872 <div class="grid">
6873 <div class="grid__col-6 grid__col--bleed-y">
6874 {{shippingmethod}}
6875 </div>
6876 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{shippingfee}}</div>
6877 </div>
6878 {{/unless}}
6879 </text>
6880 <text>
6881 {{#if hasTaxSettings}}
6882 <div class="grid">
6883 <div class="grid__col-6 grid__col--bleed-y">@Translate("Sales Tax")</div>
6884 <div class="grid__col-6 grid__col--bleed-y grid--align-end">{{totaltaxes}}</div>
6885 </div>
6886 {{/if}}
6887 </text>
6888 }
6889
6890 @helper RenderMiniCartFooter()
6891 {
6892 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartFooter").OrderBy(item => item.SortId).ToList();
6893
6894 <div class="mini-cart__footer u-border-top u-padding-top dw-mod">
6895 @RenderBlockList(subBlocks)
6896 </div>
6897 }
6898
6899 @helper RenderMiniCartActions()
6900 {
6901 int cartPageId = GetPageIdByNavigationTag("CartPage");
6902
6903 <button type="button" title="@Translate("Empty cart")" class="btn btn--secondary u-full-width dw-mod u-no-margin u-margin-bottom" onclick="googleEnchantImpressionEmptyCart(); Cart.EmptyCart(event);">@Translate("Empty cart")</button>
6904 <a href="/Default.aspx?ID=@cartPageId" title="@Translate("Go to cart")" class="btn btn--primary u-full-width u-no-margin dw-mod">@Translate("Go to cart")</a>
6905 }
6906
6907 @helper RenderMiniCartPoints()
6908 {
6909 <text>
6910 {{#if earnings}}
6911 <div class="grid">
6912 <div class="grid__col-6 grid__col--bleed-y">@Translate("Earnings")</div>
6913 <div class="grid__col-6 grid__col--bleed-y grid--align-end">
6914 <div>
6915 <span class="u-color--loyalty-points">{{earnings}}</span> @Translate("points")
6916 </div>
6917 </div>
6918 </div>
6919 {{/if}}
6920 </text>
6921 }
6922
6923 @helper RenderMiniCartSubTotal()
6924 {
6925 bool hasTaxSettings = Dynamicweb.Rapido.Services.Countries.HasTaxSettings(Model.Cart.ID);
6926 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
6927 if (!pointShop)
6928 {
6929 <text>
6930 {{#unless hideSubTotal}}
6931 <div class="grid dw-mod u-bold">
6932 <div class="grid__col-6 grid__col--bleed-y">@Translate("Subtotal")</div>
6933 <div class="grid__col-6 grid__col--bleed-y grid--align-end">
6934 @if (hasTaxSettings)
6935 {
6936 <text>{{subtotalpricewithouttaxes}}</text>
6937 }
6938 else
6939 {
6940 <text>{{subtotalprice}}</text>
6941 }
6942 </div>
6943 </div>
6944 {{/unless}}
6945 </text>
6946 }
6947 }
6948
6949 @helper RenderMiniCartTotal()
6950 {
6951 bool pointShop = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
6952
6953 <div class="mini-cart-totals grid u-border-top u-margin-top dw-mod">
6954 <div class="grid__col-6">@Translate("Total")</div>
6955 <div class="grid__col-6 grid--align-end">
6956 <div>
6957 @if (pointShop)
6958 {
6959 <span class="u-color--loyalty-points">{{pointsUsedInCart}}</span> @Translate("points")
6960 }
6961 else
6962 {
6963 <text>{{totalprice}}</text>
6964 }
6965 </div>
6966 </div>
6967 </div>
6968 }
6969
6970 @helper RenderMiniCartDisclaimer()
6971 {
6972 <text>
6973 {{#if showCheckoutDisclaimer}}
6974 <div class="grid u-margin-bottom u-ta-right">
6975 <small class="grid__col-12">{{checkoutDisclaimer}}</small>
6976 </div>
6977 {{/if}}
6978 </text>
6979 }
6980 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
6981
6982 @using Dynamicweb.Rapido.Blocks.Extensibility
6983 @using Dynamicweb.Rapido.Blocks
6984 @using Dynamicweb.Rapido.Blocks.Components.General
6985 @using Dynamicweb.Rapido.Blocks.Components
6986 @using Dynamicweb.Rapido.Services
6987
6988 @{
6989 string addToCartNotificationType = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType").SelectedValue : "";
6990 string addToCartNotificationMiniCartLayout = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("Layout").SelectedValue : "dropdown";
6991 bool addToCartHideCartIcon = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart");
6992
6993 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed() && !string.IsNullOrEmpty(addToCartNotificationType))
6994 {
6995 if (addToCartNotificationType == "modal")
6996 {
6997 Block addToCartNotificationModal = new Block
6998 {
6999 Id = "AddToCartNotificationModal",
7000 Template = RenderAddToCartNotificationModal()
7001 };
7002
7003 Block addToCartNotificationScript = new Block
7004 {
7005 Id = "AddToCartNotificationScript",
7006 Template = RenderAddToCartNotificationModalScript()
7007 };
7008 BlocksPage.GetBlockPage("Master").Add("MasterTopSnippets", addToCartNotificationModal);
7009 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript);
7010 }
7011 else if (addToCartNotificationType == "toggle" && addToCartNotificationMiniCartLayout != "none" && !addToCartHideCartIcon && Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
7012 {
7013 Block addToCartNotificationScript = new Block
7014 {
7015 Id = "AddToCartNotificationScript",
7016 Template = RenderAddToCartNotificationToggleScript()
7017 };
7018 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript);
7019 }
7020 }
7021 }
7022
7023 @helper RenderAddToCartNotificationModal()
7024 {
7025 <div id="LastAddedProductModal" data-template="LastAddedProductTemplate"></div>
7026 }
7027
7028 @helper RenderAddToCartNotificationModalScript()
7029 {
7030 int cartPageId = GetPageIdByNavigationTag("CartPage");
7031
7032 <script id="LastAddedProductTemplate" type="text/x-template">
7033 @{
7034
7035 Modal lastAddedProduct = new Modal
7036 {
7037 Id = "LastAddedProduct",
7038 Heading = new Heading
7039 {
7040 Level = 2,
7041 Title = Translate("Product is added to the cart")
7042 },
7043 Width = ModalWidth.Md,
7044 BodyTemplate = RenderModalContent()
7045 };
7046
7047 lastAddedProduct.AddActions(
7048 new Button
7049 {
7050 ButtonType = ButtonType.Button,
7051 ButtonLayout = ButtonLayout.Secondary,
7052 Title = Translate("Continue shopping"),
7053 CssClass = "u-pull--left u-no-margin btn--sm",
7054 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false"
7055 },
7056 new Link
7057 {
7058 Href = "/Default.aspx?ID=" + cartPageId,
7059 ButtonLayout = ButtonLayout.Secondary,
7060 CssClass = "u-pull--right u-no-margin btn--sm",
7061 Title = Translate("Proceed to checkout"),
7062 OnClick = "document.getElementById('LastAddedProductModalTrigger').checked = false"
7063 }
7064 );
7065
7066 @Render(lastAddedProduct)
7067 }
7068 </script>
7069 <script>
7070 document.addEventListener('addToCart', function (event) {
7071 Cart.ShowLastAddedProductModal(event.detail);
7072 });
7073 </script>
7074 }
7075
7076 @helper RenderModalContent()
7077 {
7078 <div class="grid">
7079 <div class="grid__col-2">
7080 @Render(new Image { Path = "{{ productInfo.image }}", Link = "{{ productInfo.link }}", Title = "{{ productInfo.name }}", DisableImageEngine = true })
7081 </div>
7082 <div class="u-padding grid--align-self-center">
7083 <span>{{quantity}}</span> x
7084 </div>
7085 <div class="grid__col-auto grid--align-self-center">
7086 <div>{{productInfo.name}}</div>
7087 {{#if productInfo.variantName}}
7088 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small>
7089 {{/if}}
7090 {{#if productInfo.unitName}}
7091 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small>
7092 {{/if}}
7093 </div>
7094 </div>
7095 }
7096
7097 @helper RenderAddToCartNotificationToggleScript()
7098 {
7099 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
7100
7101 <script>
7102 document.addEventListener('addToCart', function () {
7103 Cart.ToggleMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '@miniCartFeedPageId');
7104 });
7105 </script>
7106 }
7107 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
7108
7109 @using System
7110 @using System.Web
7111 @using System.Collections.Generic
7112 @using Dynamicweb.Rapido.Blocks.Extensibility
7113 @using Dynamicweb.Rapido.Blocks
7114 @using Dynamicweb.Rapido.Blocks.Components.General
7115
7116 @functions {
7117 BlocksPage footerBlocksPage = BlocksPage.GetBlockPage("Master");
7118 }
7119
7120 @{
7121 string footerColumnOneContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Content");
7122 string footerColumnTwoContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Content");
7123 string footerColumnThreeContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Content");
7124 string footerColumnOneHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Header");
7125 string footerColumnTwoHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Header");
7126 string footerColumnThreeHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Header");
7127
7128 Block masterFooterContent = new Block()
7129 {
7130 Id = "MasterFooterContent",
7131 SortId = 10,
7132 Template = RenderFooter(),
7133 SkipRenderBlocksList = true
7134 };
7135 footerBlocksPage.Add(MasterBlockId.MasterFooter, masterFooterContent);
7136
7137 if (!string.IsNullOrEmpty(footerColumnOneContent) || !string.IsNullOrEmpty(footerColumnOneHeader))
7138 {
7139 Block masterFooterColumnOne = new Block
7140 {
7141 Id = "MasterFooterColumnOne",
7142 SortId = 10,
7143 Template = RenderFooterColumn(footerColumnOneHeader, footerColumnOneContent),
7144 Design = new Design
7145 {
7146 Size = "auto",
7147 RenderType = RenderType.Column
7148 }
7149 };
7150 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnOne);
7151 }
7152
7153 if (!string.IsNullOrEmpty(footerColumnTwoContent) || !string.IsNullOrEmpty(footerColumnTwoHeader))
7154 {
7155 Block masterFooterColumnTwo = new Block
7156 {
7157 Id = "MasterFooterColumnTwo",
7158 SortId = 20,
7159 Template = RenderFooterColumn(footerColumnTwoHeader, footerColumnTwoContent),
7160 Design = new Design
7161 {
7162 Size = "auto",
7163 RenderType = RenderType.Column
7164 }
7165 };
7166 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnTwo);
7167 }
7168
7169 if (!string.IsNullOrEmpty(footerColumnThreeContent) || !string.IsNullOrEmpty(footerColumnThreeHeader))
7170 {
7171 Block masterFooterColumnThree = new Block
7172 {
7173 Id = "MasterFooterColumnThree",
7174 SortId = 30,
7175 Template = RenderFooterColumn(footerColumnThreeHeader, footerColumnThreeContent),
7176 Design = new Design
7177 {
7178 Size = "auto",
7179 RenderType = RenderType.Column
7180 }
7181 };
7182 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnThree);
7183 }
7184
7185 if (Model.Area.Item.GetItem("Layout").GetBoolean("FooterNewsletterSignUp"))
7186 {
7187 Block masterFooterNewsletterSignUp = new Block
7188 {
7189 Id = "MasterFooterNewsletterSignUp",
7190 SortId = 40,
7191 Template = RenderFooterNewsletterSignUp(),
7192 Design = new Design
7193 {
7194 Size = "auto",
7195 RenderType = RenderType.Column
7196 }
7197 };
7198 footerBlocksPage.Add("MasterFooterContent", masterFooterNewsletterSignUp);
7199 }
7200
7201 if (Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks").Count > 0)
7202 {
7203 Block masterFooterSocialLinks = new Block
7204 {
7205 Id = "MasterFooterSocialLinks",
7206 SortId = 50,
7207 Template = RenderFooterSocialLinks(),
7208 Design = new Design
7209 {
7210 Size = "auto",
7211 RenderType = RenderType.Column
7212 }
7213 };
7214 footerBlocksPage.Add("MasterFooterContent", masterFooterSocialLinks);
7215 }
7216
7217 if (Model.Area.Item.GetItem("Layout").GetItems("FooterPayments") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterPayments").Count > 0)
7218 {
7219 Block masterFooterPayments = new Block
7220 {
7221 Id = "MasterFooterPayments",
7222 SortId = 60,
7223 Template = RenderFooterPayments(),
7224 Design = new Design
7225 {
7226 Size = "12",
7227 RenderType = RenderType.Column
7228 }
7229 };
7230 footerBlocksPage.Add("MasterFooterContent", masterFooterPayments);
7231 }
7232
7233 Block masterFooterCopyright = new Block
7234 {
7235 Id = "MasterFooterCopyright",
7236 SortId = 70,
7237 Template = RenderFooterCopyright(),
7238 Design = new Design
7239 {
7240 Size = "12",
7241 RenderType = RenderType.Column
7242 }
7243 };
7244 footerBlocksPage.Add("MasterFooterContent", masterFooterCopyright);
7245 }
7246
7247 @helper RenderFooter()
7248 {
7249 List<Block> subBlocks = this.footerBlocksPage.GetBlockListById("MasterFooterContent").OrderBy(item => item.SortId).ToList();
7250
7251 <footer class="footer no-print dw-mod">
7252 <div class="center-container top-container__center-container dw-mod">
7253 <div class="grid grid--external-bleed-x">
7254 @RenderBlockList(subBlocks)
7255 </div>
7256 </div>
7257 </footer>
7258 }
7259
7260 @helper RenderFooterColumn(string header, string content)
7261 {
7262 <h3 class="footer__heading dw-mod">@header</h3>
7263 <div class="footer__content dw-mod">
7264 @content
7265 </div>
7266 }
7267
7268 @helper RenderFooterNewsletterSignUp()
7269 {
7270 string newsletterSignUpPageId = GetPageIdByNavigationTag("NewsletterSignUp").ToString();
7271 Form form = new Form { Action = "/Default.aspx", Method = FormMethod.Get, Enctype = FormEnctype.multipart };
7272
7273 form.Add(new HiddenField { Name = "ID", Value = newsletterSignUpPageId });
7274 form.Add(new Text { Content = "<p>" + Translate("Sign up if you would like to receive occasional treats from us") + "</p>" });
7275 form.Add(new TextField {
7276 Id = "NewsletterEmail", Name = "NewsletterEmail", Placeholder = Translate("Your email address"),
7277 Type = TextFieldType.Email,
7278 ActionButton = new Button {
7279 ButtonType = ButtonType.Submit, Id="Submitter", Title = Translate("Go"), OnClick = "Buttons.LockButton(event)", CssClass = "btn--condensed"
7280 }
7281 });
7282
7283 <h3 class="footer__heading dw-mod">@Translate("Mailing list")</h3>
7284 <div class="footer__content dw-mod">
7285 @Render(form)
7286 </div>
7287 }
7288
7289 @helper RenderFooterSocialLinks()
7290 {
7291 <h3 class="footer__heading dw-mod">@Translate("Social links")</h3>
7292 <div class="footer__content dw-mod">
7293 <div class="collection dw-mod">
7294 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks"))
7295 {
7296 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel;
7297 string socialIconClass = socialIcon.SelectedValue;
7298 string socialIconTitle = socialIcon.SelectedName;
7299 string socialLink = socialitem.GetString("Link");
7300
7301 <a href="@socialLink" target="_blank" title="@socialIconTitle" class="u-margin-bottom-5px" rel="noopener"><i class="@socialIconClass fa-2x"></i></a>
7302 }
7303 </div>
7304 </div>
7305 }
7306
7307 @helper RenderFooterPayments()
7308 {
7309 <div class="footer__content dw-mod">
7310 <div class="collection dw-mod">
7311 @foreach (var payment in Model.Area.Item.GetItem("Layout").GetItems("FooterPayments"))
7312 {
7313 var paymentItem = payment.GetValue("CardTypeOrVerifiedPayment") as Dynamicweb.Frontend.ListViewModel;
7314 string paymentImage = null;
7315 string paymentTitle = paymentItem.SelectedName;
7316 ListOptionViewModel selected = paymentItem.SelectedOptions.FirstOrDefault();
7317 if (selected != null)
7318 {
7319 paymentImage = selected.Icon;
7320 }
7321
7322 <div class="footer__card-type">
7323 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=60&Compression=75&image=@paymentImage" alt="@paymentTitle" title="@paymentTitle" />
7324 </div>
7325 }
7326 </div>
7327 </div>
7328 }
7329
7330 @helper RenderFooterCopyright()
7331 {
7332 <div class="grid__col-12 footer__copyright dw-mod">
7333 <p>@Model.Area.Item.GetItem("Layout").GetString("FooterCopyrightText")</p>
7334 </div>
7335 }
7336 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
7337
7338 @using System
7339 @using System.Web
7340 @using System.Collections.Generic
7341 @using Dynamicweb.Rapido.Blocks.Extensibility
7342 @using Dynamicweb.Rapido.Blocks
7343 @using Dynamicweb.Ecommerce.Common
7344
7345 @{
7346 BlocksPage referencesBlocksPage = BlocksPage.GetBlockPage("Master");
7347
7348 Block masterScriptReferences = new Block()
7349 {
7350 Id = "MasterScriptReferences",
7351 SortId = 1,
7352 Template = RenderMasterScriptReferences()
7353 };
7354 referencesBlocksPage.Add(MasterBlockId.MasterReferences, masterScriptReferences);
7355 }
7356
7357 @helper RenderMasterScriptReferences() {
7358 <script src="/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js"></script>
7359 <script src="/Files/Templates/Designs/Rapido/js/master.min.js"></script>
7360
7361 if (Model.Area.Item.GetItem("Custom").GetBoolean("UseCustomJavascript"))
7362 {
7363 <script src="/Files/Templates/Designs/Rapido/js/custom.min.js"></script>
7364 PushPromise("/Files/Templates/Designs/Rapido/js/custom.min.js");
7365 }
7366
7367 PushPromise("/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js");
7368 PushPromise("/Files/Templates/Designs/Rapido/js/master.min.js");
7369 }
7370 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
7371
7372 @using System
7373 @using System.Web
7374 @using System.Collections.Generic
7375 @using Dynamicweb.Rapido.Blocks.Extensibility
7376 @using Dynamicweb.Rapido.Blocks
7377 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
7378 @using Dynamicweb.Rapido.Services
7379
7380 @{
7381 BlocksPage searchBlocksPage = BlocksPage.GetBlockPage("Master");
7382 bool navigationItemsHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
7383 bool isFavoriteList = !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("ListID"));
7384
7385 if (!navigationItemsHideSearch || isFavoriteList)
7386 {
7387 Block masterSearchScriptTemplates = new Block()
7388 {
7389 Id = "MasterSearchScriptTemplates",
7390 SortId = 1,
7391 Template = RenderSearchScriptTemplates()
7392 };
7393
7394 searchBlocksPage.Add(MasterBlockId.MasterBottomSnippets, masterSearchScriptTemplates);
7395 }
7396 }
7397
7398 @helper RenderSearchScriptTemplates()
7399 {
7400 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
7401 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
7402 bool useFacebookPixel = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID"));
7403 bool useGoogleTagManager = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID"));
7404 bool showPrice = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HidePriceInSearchResults");
7405 bool showAddToCartButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideAddToCartButton");
7406 bool showViewButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideViewButton");
7407 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("Layout").GetBoolean("ShowAddToDownloadButton");
7408 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
7409 bool showVATPrice = Pageview.AreaSettings.GetItem("ProductList").GetBoolean("ShowBothPricesWithWithoutVAT");
7410 bool isPricesWithVATEnabled = Dynamicweb.Ecommerce.Common.Context.DisplayPricesWithVat;
7411 <script id="SearchGroupsTemplate" type="text/x-template">
7412 {{#.}}
7413 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li>
7414 {{/.}}
7415 </script>
7416
7417 <script id="SearchProductsTemplate" type="text/x-template">
7418 {{#each .}}
7419 {{#Product}}
7420 {{#ifCond template "!==" "SearchMore"}}
7421 <li class="dropdown__item dropdown__item--seperator dw-mod">
7422 @if (useFacebookPixel)
7423 {
7424 <text>{{{facebookPixelSearch name number priceDouble currency searchParameter}}}</text>
7425 }
7426 @if (useGoogleTagManager)
7427 {
7428 <text>{{{googleEnchantImpression googleImpression}}}</text>
7429 }
7430 <div>
7431 <a href="{{link}}"
7432 class="js-typeahead-link u-color-inherit u-pull--left"
7433 onclick="{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}"
7434 title="{{name}}{{#if variantName}}, {{variantName}}{{/if}}">
7435 <div class="u-margin-right u-pull--left {{noimage}} u-hidden-xs u-hidden-xxs"><img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=45&height=36&crop=5&FillCanvas=True&Compression=75&image={{image}}" alt="{{name}}{{#if variantName}}, {{variantName}}{{/if}}"></div>
7436 <div class="u-pull--left">
7437 <div class="u-bold u-max-w220px u-truncate-text js-typeahead-name">{{name}}{{#if variantName}}, {{variantName}}{{/if}}</div>
7438 @if (showPrice && Dynamicweb.Rapido.Services.User.IsPricesAllowed())
7439 {
7440 if (pointShopOnly)
7441 {
7442 <text>
7443 {{#if havePointPrice}}
7444 <div>
7445 <span class="u-color--loyalty-points">{{points}}</span> @Translate("points")
7446 </div>
7447 {{else}}
7448 <small class="help-text u-no-margin">@Translate("Not available")</small>
7449 {{/if}}
7450 {{#unless canBePurchasedWithPoints}}
7451 {{#if havePointPrice}}
7452 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small>
7453 {{/if}}
7454 {{/unless}}
7455 </text>
7456 }
7457 else
7458 {
7459 <div>
7460 <text>
7461 {{#if retailPrice}}
7462 {{#unless IsAsiaSite}}
7463 <div class="u-bold u-font-size--md">{{retailPrice}}</div>
7464 {{/unless}}
7465 {{/if}}
7466 </text>
7467 <text>{{#if isAllowedToBuy}}</text>
7468 @if (isPricesWithVATEnabled)
7469 {
7470 <text>{{price}}</text>
7471 }
7472 else
7473 {
7474 <text><span>@Translate("excl. VAT")</span> {{price}}</text>
7475 }
7476 <text>{{discount}}</text>
7477 @if (showVATPrice)
7478 {
7479 <text>
7480 @if (isPricesWithVATEnabled)
7481 {
7482 <text>@Translate("excl. VAT")</text><text>({{priceWithoutVAT}})</text>
7483 }
7484 else
7485 {
7486 <text>@Translate("incl. VAT")</text><text>({{priceWithVAT}})</text>
7487 }
7488 }
7489 </text>
7490 }
7491 <text>{{/if}}</text>
7492 <text>
7493 {{#if priceRRP}}
7494 <text><small>@Translate("RRP") {{priceRRP}}</small></text>
7495 {{/if}}
7496 </text>
7497 </div>
7498 }
7499 }
7500 </div>
7501 </a>
7502 <div class="u-margin-left u-pull--right">
7503 @{
7504 var viewBtn = new Link
7505 {
7506 Href = "{{link}}",
7507 OnClick = "{{#if googleImpression}}googleEnchantImpressionClick({{googleImpression}}, event){{/if}}",
7508 ButtonLayout = ButtonLayout.Secondary,
7509 CssClass = "btn--condensed u-no-margin u-w80px js-ignore-click-outside",
7510 Title = Translate("View")
7511 };
7512 }
7513 @if (showAddToCartButton && Dynamicweb.Rapido.Services.User.IsBuyingAllowed())
7514 {
7515 <text>{{#if hideAddToCartButton}}</text>
7516 @Render(viewBtn)
7517 <text>{{else}}</text>
7518 @Render(new AddToCartButton
7519 {
7520 HideTitle = true,
7521 ProductId = "{{productId}}",
7522 ProductInfo = "{{productInfo}}",
7523 BuyForPoints = pointShopOnly,
7524 OnClick = "{{facebookPixelAction}}",
7525 CssClass = "u-w80px u-no-margin js-ignore-click-outside",
7526 Icon = new Icon {
7527 CssClass = "js-ignore-click-outside"
7528 },
7529 ExtraAttributes = new Dictionary<string, string>
7530 {
7531 { "{{disabledBuyButton}}", "" }
7532 }
7533 })
7534 <text>{{/if}}</text>
7535 }
7536 else if (showViewButton)
7537 {
7538 @Render(viewBtn)
7539 }
7540 @if (showAddToDownloadButton)
7541 {
7542 <button type="button" class="btn btn--primary u-no-margin btn--condensed dw-mod js-add-to-downloads" title="@Translate("Add")" data-product-id="{{productId}}">
7543 <i class="fas fa-plus js-button-icon"></i>
7544 </button>
7545 }
7546 </div>
7547 </div>
7548 </li>
7549 {{/ifCond}}
7550 {{#ifCond template "===" "SearchMore"}}
7551 {{>SearchMoreProducts}}
7552 {{/ifCond}}
7553 {{/Product}}
7554 {{else}}
7555 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod">
7556 @Translate("Your search gave 0 results")
7557 </li>
7558 {{/each}}
7559 </script>
7560
7561 <script id="SearchMoreProducts" type="text/x-template">
7562 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
7563 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link">
7564 @Translate("View all")
7565 </a>
7566 </li>
7567 </script>
7568
7569 <script id="SearchMorePages" type="text/x-template">
7570 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
7571 <a href="/Default.aspx?ID=@contentSearchPageLink&Search={{searchParameter}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link">
7572 @Translate("View all")
7573 </a>
7574 </li>
7575 </script>
7576
7577 <script id="SearchPagesTemplate" type="text/x-template">
7578 {{#each .}}
7579 {{#ifCond template "!==" "SearchMore"}}
7580 <li class="dropdown__item dropdown__item--seperator dropdown__item--no-padding dw-mod">
7581 <a href="/Default.aspx?ID={{id}}" class="js-typeahead-link dropdown__link u-color-inherit">
7582 <div class="u-margin-right u-inline"><i class="fa {{icon}} u-w20px u-ta-center"></i></div>
7583 <div class="u-inline u-va-middle"><div class="u-bold u-truncate-text u-max-w210px u-inline-block js-typeahead-name">{{name}}</div></div>
7584 </a>
7585 </li>
7586 {{/ifCond}}
7587 {{#ifCond template "===" "SearchMore"}}
7588 {{>SearchMorePages}}
7589 {{/ifCond}}
7590 {{else}}
7591 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable js-no-result dw-mod">
7592 @Translate("Your search gave 0 results")
7593 </li>
7594 {{/each}}
7595 </script>
7596
7597 <script id="SearchPagesTemplateWrap" type="text/x-template">
7598 <div class="dropdown__column-header">@Translate("Pages")</div>
7599 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod">
7600 {{>SearchPagesTemplate}}
7601 </ul>
7602 </script>
7603
7604 <script id="SearchProductsTemplateWrap" type="text/x-template">
7605 <div class="dropdown__column-header">@Translate("Products")</div>
7606 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom u-height--auto u-flex-grow--1 dw-mod">
7607 {{>SearchProductsTemplate}}
7608 </ul>
7609 </script>
7610 }
7611
7612 @using Dynamicweb.Rapido.Blocks.Components
7613 @using Dynamicweb.Rapido.Blocks.Components.General
7614 @using Dynamicweb.Rapido.Blocks
7615 @using System.IO
7616
7617
7618 @using Dynamicweb.Rapido.Blocks.Components.General
7619 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
7620
7621
7622 @* Component *@
7623
7624 @helper RenderVariantMatrix(VariantMatrix settings) {
7625 if (settings != null)
7626 {
7627 int productLoopCounter = 0;
7628 int groupCount = 0;
7629 List<VariantOption> firstDimension = new List<VariantOption>();
7630 List<VariantOption> secondDimension = new List<VariantOption>();
7631 List<VariantOption> thirdDimension = new List<VariantOption>();
7632
7633 foreach (VariantGroup variantGroup in settings.GetVariantGroups())
7634 {
7635 foreach (VariantOption variantOptions in variantGroup.GetVariantOptions())
7636 {
7637 if (groupCount == 0) {
7638 firstDimension.Add(variantOptions);
7639 }
7640 if (groupCount == 1)
7641 {
7642 secondDimension.Add(variantOptions);
7643 }
7644 if (groupCount == 2)
7645 {
7646 thirdDimension.Add(variantOptions);
7647 }
7648 }
7649 groupCount++;
7650 }
7651
7652 int rowCount = 0;
7653 int columnCount = 0;
7654
7655 <script>
7656 var variantsCollection = [];
7657 </script>
7658
7659 <table class="table table--compact js-variants-matrix dw-mod" id="VariantMatrixTable_@settings.ProductId">
7660 @if (groupCount == 1)
7661 {
7662 <tbody>
7663 @foreach (VariantOption firstVariantOption in firstDimension)
7664 {
7665 var variantId = firstVariantOption.Id;
7666 <tr>
7667 <td class="u-bold">
7668 @firstVariantOption.Name
7669 </td>
7670 <td>
7671 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount)
7672 </td>
7673 </tr>
7674 productLoopCounter++;
7675 }
7676
7677 <tr>
7678 <td> </td>
7679 <td>
7680 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div>
7681 </td>
7682 </tr>
7683 </tbody>
7684 }
7685 @if (groupCount == 2)
7686 {
7687 <thead>
7688 <tr>
7689 <td> </td>
7690 @foreach (VariantOption variant in secondDimension)
7691 {
7692 <td>@variant.Name</td>
7693 }
7694 </tr>
7695 </thead>
7696 <tbody>
7697 @foreach (VariantOption firstVariantOption in firstDimension)
7698 {
7699 string variantId = "";
7700 columnCount = 0;
7701
7702 <tr>
7703 <td class="u-min-w120px">@firstVariantOption.Name</td>
7704
7705 @foreach (VariantOption secondVariantOption in secondDimension)
7706 {
7707 variantId = firstVariantOption.Id + "." + secondVariantOption.Id;
7708 <td>
7709 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount)
7710 </td>
7711
7712 columnCount++;
7713
7714 productLoopCounter++;
7715 }
7716
7717 <td>
7718 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div>
7719 </td>
7720 </tr>
7721
7722 rowCount++;
7723 }
7724
7725 @{
7726 columnCount = 0;
7727 }
7728
7729 <tr>
7730 <td> </td>
7731 @foreach (VariantOption secondVariantOption in secondDimension)
7732 {
7733 <td>
7734 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div>
7735 </td>
7736
7737 columnCount++;
7738 }
7739 <td> </td>
7740 </tr>
7741 </tbody>
7742 }
7743 @if (groupCount == 3)
7744 {
7745 <thead>
7746 <tr>
7747 <td> </td>
7748 @foreach (VariantOption thirdVariantOption in thirdDimension)
7749 {
7750 <td>@thirdVariantOption.Name</td>
7751 }
7752 </tr>
7753 </thead>
7754 <tbody>
7755 @foreach (VariantOption firstVariantOption in firstDimension)
7756 {
7757 int colspan = (thirdDimension.Count + 1);
7758
7759 <tr>
7760 <td colspan="@colspan" class="u-color-light-gray--bg u-bold">@firstVariantOption.Name</td>
7761 </tr>
7762
7763 foreach (VariantOption secondVariantOption in secondDimension)
7764 {
7765 string variantId = "";
7766 columnCount = 0;
7767
7768 <tr>
7769 <td class="u-min-w120px">@secondVariantOption.Name</td>
7770
7771 @foreach (VariantOption thirdVariantOption in thirdDimension)
7772 {
7773 variantId = firstVariantOption.Id + "." + secondVariantOption.Id + "." + thirdVariantOption.Id;
7774
7775 <td>
7776 @RenderVariantMatrixQuantityField(variantId, settings, productLoopCounter, rowCount, columnCount)
7777 </td>
7778
7779 columnCount++;
7780 productLoopCounter++;
7781 }
7782
7783 <td>
7784 <div class="qty-field js-total-qty-row-@rowCount dw-mod">0</div>
7785 </td>
7786 </tr>
7787 rowCount++;
7788 }
7789 }
7790
7791 @{
7792 columnCount = 0;
7793 }
7794
7795 <tr>
7796 <td> </td>
7797 @foreach (VariantOption thirdVariantOption in thirdDimension)
7798 {
7799 <td>
7800 <div class="qty-field js-total-qty-column-@columnCount dw-mod">0</div>
7801 </td>
7802
7803 columnCount++;
7804 }
7805 <td> </td>
7806 </tr>
7807 </tbody>
7808 }
7809 </table>
7810
7811 <script>
7812 document.addEventListener("DOMContentLoaded", function (event) {
7813 MatrixUpdateQuantity("@settings.ProductId");
7814 });
7815
7816 MatrixUpdateQuantity = function (productId) {
7817 var currentMatrix = document.getElementById("VariantMatrixTable_" + productId);
7818 var allQtyFields = currentMatrix.getElementsByClassName("js-qty");
7819
7820 var qtyRowArr = [];
7821 var qtyColumnArr = [];
7822
7823 var totalQty = 0;
7824
7825 for (var i = 0; i < allQtyFields.length; i++) {
7826 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] = 0;
7827 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] = 0;
7828 }
7829
7830 for (var i = 0; i < allQtyFields.length; i++) {
7831 qtyRowArr[allQtyFields[i].getAttribute("data-qty-row-group")] += parseFloat(allQtyFields[i].value);
7832 qtyColumnArr[allQtyFields[i].getAttribute("data-qty-column-group")] += parseFloat(allQtyFields[i].value);
7833 totalQty += parseFloat(allQtyFields[i].value);
7834 }
7835
7836 //Update row counters
7837 for (var i = 0; i < qtyRowArr.length; i++) {
7838 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0];
7839
7840 if (qtyRowArr[i] != undefined && qtyCounter != null) {
7841 var currentCount = qtyCounter.innerHTML;
7842 qtyCounter.innerHTML = qtyRowArr[i];
7843
7844 if (currentCount != qtyCounter.innerHTML) {
7845 qtyCounter.classList.add("qty-field--active");
7846 }
7847 }
7848
7849 }
7850
7851 //Update column counters
7852 for (var i = 0; i < qtyColumnArr.length; i++) {
7853 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0];
7854
7855 if (qtyColumnArr[i] != undefined && qtyCounter != null) {
7856 var currentCount = qtyCounter.innerHTML;
7857 qtyCounter.innerHTML = qtyColumnArr[i];
7858
7859 if (currentCount != qtyCounter.innerHTML) {
7860 qtyCounter.classList.add("qty-field--active");
7861 }
7862 }
7863 }
7864
7865 if (document.getElementById("TotalQtyCount_" + productId)) {
7866 document.getElementById("TotalQtyCount_" + productId).innerHTML = totalQty;
7867 }
7868
7869 //Clean up animations
7870 setTimeout(function () {
7871 for (var i = 0; i < qtyRowArr.length; i++) {
7872 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-row-" + i)[0];
7873 if (qtyCounter != null) {
7874 qtyCounter.classList.remove("qty-field--active");
7875 }
7876 }
7877 for (var i = 0; i < qtyColumnArr.length; i++) {
7878 var qtyCounter = currentMatrix.getElementsByClassName("js-total-qty-column-" + i)[0];
7879 if (qtyCounter != null) {
7880 qtyCounter.classList.remove("qty-field--active");
7881 }
7882 }
7883 }, 1000);
7884 }
7885 </script>
7886 }
7887 }
7888
7889 @helper RenderVariantMatrixQuantityField(string variantId, VariantMatrix settings, int productLoopCounter, int rowCount, int columnCount)
7890 {
7891 string loopCount = productLoopCounter.ToString();
7892
7893 bool combinationFound = false;
7894 double stock = 0;
7895 double quantityValue = 0;
7896 string note = "";
7897
7898 VariantProduct variantProduct = null;
7899
7900 if (settings.GetVariantProducts().TryGetValue(variantId, out variantProduct))
7901 {
7902 stock = variantProduct.Stock;
7903 quantityValue = variantProduct.Quantity;
7904 combinationFound = true;
7905 }
7906
7907 if (combinationFound)
7908 {
7909 <input type="hidden" name="ProductLoopCounter@(loopCount)" value="@loopCount" />
7910 <input type="hidden" name="ProductID@(loopCount)" value="@settings.ProductId" />
7911 <input type="hidden" name="VariantID@(loopCount)" value="@variantId" />
7912 <input type="hidden" name="CurrentNote@(loopCount)" id="CurrentNote_@(settings.ProductId)_@variantId" value="@note" />
7913 <input type="number" name="Quantity@(loopCount)" id="Quantity_@(settings.ProductId)_@variantId" value="@quantityValue" min="0" class="js-qty u-no-margin u-full-max-width" style="width: 100%; max-width: 100%" onkeyup="MatrixUpdateQuantity('@settings.ProductId')" onmouseup="MatrixUpdateQuantity('@settings.ProductId')" data-qty-row-group="@rowCount" data-qty-column-group="@columnCount">
7914
7915 if (stock != 0)
7916 {
7917 <small>@Translate("Stock") @stock</small>
7918 }
7919
7920 <script>
7921 var variants = '{ "ProductId" :' + '"@settings.ProductId"' + ', "VariantId": ' + '"@variantId"' +'}';
7922 variantsCollection.push(variants);
7923 document.getElementById("Quantity_@(settings.ProductId)_@variantId").closest(".js-variants-matrix").setAttribute("data-variants-collection", "[" + variantsCollection + "]" );
7924 </script>
7925 }
7926 else
7927 {
7928 <div class="use-btn-height" style="background-color: #a8a8a8"></div>
7929 }
7930 }
7931 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
7932
7933 @* Component *@
7934
7935 @helper RenderAddToCart(AddToCart settings)
7936 {
7937 //set Id for quantity selector to get it's value from button
7938 if (settings.QuantitySelector != null)
7939 {
7940 if (string.IsNullOrEmpty(settings.QuantitySelector.Id))
7941 {
7942 settings.QuantitySelector.Id = Guid.NewGuid().ToString("N");
7943 }
7944
7945 settings.AddButton.QuantitySelectorId = settings.QuantitySelector.Id;
7946
7947 if (settings.Disabled)
7948 {
7949 settings.QuantitySelector.Disabled = true;
7950 }
7951
7952 if (string.IsNullOrEmpty(settings.QuantitySelector.Name))
7953 {
7954 settings.QuantitySelector.Name = settings.QuantitySelector.Id;
7955 }
7956 }
7957
7958 if (settings.Disabled)
7959 {
7960 settings.AddButton.Disabled = true;
7961 }
7962
7963 settings.AddButton.CssClass += " btn--condensed";
7964
7965 //unitsSelector
7966 if (settings.UnitSelector != null)
7967 {
7968 if (settings.Disabled)
7969 {
7970 settings.QuantitySelector.Disabled = true;
7971 }
7972 }
7973
7974 if (Pageview.Device.ToString() == "Mobile") {
7975 if (settings.UnitSelector != null)
7976 {
7977 <div class="margin-sm margin-position-bottom">
7978 @Render(settings.UnitSelector)
7979 </div>
7980 }
7981 }
7982
7983 <div class="buttons-collection @settings.WrapperCssClass" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
7984 @if (Pageview.Device.ToString() != "Mobile") {
7985 if (settings.UnitSelector != null)
7986 {
7987 @Render(settings.UnitSelector)
7988 }
7989 }
7990 @if (settings.QuantitySelector != null)
7991 {
7992 @Render(settings.QuantitySelector)
7993 }
7994 @Render(settings.AddButton)
7995 </div>
7996 }
7997 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
7998
7999 @* Component *@
8000
8001 @helper RenderAddToCartButton(AddToCartButton settings)
8002 {
8003 if (!settings.HideTitle)
8004 {
8005 if (string.IsNullOrEmpty(settings.Title))
8006 {
8007 if (settings.BuyForPoints)
8008 {
8009 settings.Title = Translate("Buy with points");
8010 }
8011 else
8012 {
8013 settings.Title = Translate("Add to cart");
8014 }
8015 }
8016 }
8017 else
8018 {
8019 settings.Title = "";
8020 }
8021
8022 if (settings.Icon == null)
8023 {
8024 settings.Icon = new Icon();
8025 settings.Icon.LabelPosition = Dynamicweb.Rapido.Blocks.Components.General.IconLabelPosition.After;
8026 }
8027
8028 if (string.IsNullOrEmpty(settings.Icon.Name))
8029 {
8030 settings.Icon.Name = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue;
8031 }
8032
8033 settings.OnClick = "Cart.AddToCart(event, { " +
8034 "id: '" + settings.ProductId + "'," +
8035 (!string.IsNullOrEmpty(settings.VariantId) ? "variantId: '" + settings.VariantId + "'," : "") +
8036 (!string.IsNullOrEmpty(settings.UnitId) ? "unitId: '" + settings.UnitId + "'," : "") +
8037 (settings.BuyForPoints ? "buyForPoints: true," : "") +
8038 (!string.IsNullOrEmpty(settings.ProductInfo) ? "productInfo: " + settings.ProductInfo + "," : "") +
8039 "quantity: " + (string.IsNullOrEmpty(settings.QuantitySelectorId) ? "1" : "parseFloat(document.getElementById('" + settings.QuantitySelectorId + "').value)") +
8040 "});" + settings.OnClick;
8041
8042 @RenderButton(settings)
8043 }
8044 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8045
8046 @* Component *@
8047
8048 @helper RenderUnitSelector(UnitSelector settings)
8049 {
8050 if (string.IsNullOrEmpty(settings.Id))
8051 {
8052 settings.Id = Guid.NewGuid().ToString("N");
8053 }
8054 var disabledClass = settings.Disabled ? "disabled" : "";
8055
8056 <input type="checkbox" id="@settings.Id" class="dropdown-trigger" />
8057 <div class="dropdown unit-selector @settings.CssClass @disabledClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
8058 <label class="dropdown__header dropdown__btn dropdown__btn--unit-selector dw-mod" for="@settings.Id">@settings.SelectedOption</label>
8059 <div class="dropdown__content dw-mod">
8060 @settings.OptionsContent
8061 </div>
8062 <label class="dropdown-trigger-off" for="@settings.Id"></label>
8063 </div>
8064 }
8065 @using System.Reflection
8066 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8067
8068 @* Component *@
8069
8070 @helper RenderQuantitySelector(QuantitySelector settings)
8071 {
8072 var attributes = new Dictionary<string, string>();
8073
8074 /*base settings*/
8075 if (!string.IsNullOrEmpty(settings.Id)) { attributes.Add("id", settings.Id); }
8076 if (!string.IsNullOrEmpty(settings.OnClick)) { attributes.Add("onclick", settings.OnClick); }
8077 if (!string.IsNullOrEmpty(settings.OnChange)) { attributes.Add("onchange", settings.OnChange); }
8078 if (settings.Disabled) { attributes.Add("disabled", "true"); }
8079 if (settings.Required) { attributes.Add("required", "true"); }
8080 if (!string.IsNullOrEmpty(settings.Name)) { attributes.Add("name", settings.Name); }
8081 /*end*/
8082
8083 if (!string.IsNullOrEmpty(settings.OnKeyUp)) { attributes.Add("onkeyup", settings.OnKeyUp); }
8084 if (!string.IsNullOrEmpty(settings.OnInput)) { attributes.Add("oninput", settings.OnInput); }
8085 if (!string.IsNullOrEmpty(settings.OnFocus)) { attributes.Add("onfocus", settings.OnFocus); }
8086 if (settings.ReadOnly) { attributes.Add("readonly", "true"); }
8087 if (settings.Max != null) { attributes.Add("max", settings.Max.ToString()); }
8088 if (settings.Min == null) { settings.Min = 1; }
8089 attributes.Add("min", settings.Min.ToString());
8090 if (settings.Step != null && !string.IsNullOrEmpty(settings.Step.ToString())) { attributes.Add("step", settings.Step.ToString()); }
8091 if (settings.Value == null) { settings.Value = 1; }
8092 attributes.Add("value", settings.Value.ToString());
8093 attributes.Add("type", "number");
8094
8095 var resultAttributes = attributes.Concat(settings.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
8096
8097 <input @ComponentMethods.AddAttributes(resultAttributes) class="@settings.CssClass dw-mod" />
8098 }
8099 @using Dynamicweb.Rapido.Blocks.Components
8100
8101 @using Dynamicweb.Frontend
8102 @using Dynamicweb.Frontend.Devices
8103 @using Dynamicweb.Rapido.Blocks.Components.Ecommerce
8104 @using Dynamicweb.Rapido.Blocks.Components.General
8105 @using System.Collections.Generic;
8106
8107 @* Component *@
8108
8109 @helper RenderCustomerCenterList(CustomerCenterList settings)
8110 {
8111 bool isTouchDevice = Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet" ? true : false;
8112 string hideActions = isTouchDevice ? "u-block" : "";
8113
8114 <table class="table data-list dw-mod">
8115 @if (settings.GetHeaders().Length > 0) {
8116 <thead>
8117 <tr class="u-bold">
8118 @foreach (CustomerCenterListHeaderItem header in settings.GetHeaders())
8119 {
8120 var attributes = new Dictionary<string, string>();
8121 if (!string.IsNullOrEmpty(header.Id)) { attributes.Add("id", header.Id); }
8122 if (!string.IsNullOrEmpty(header.CssClass)) { attributes.Add("class", header.CssClass); }
8123 attributes.Add("align", header.Align.ToString());
8124 attributes = attributes.Concat(header.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
8125
8126 <td @ComponentMethods.AddAttributes(attributes)>@header.Title</td>
8127 }
8128 </tr>
8129 </thead>
8130 }
8131 @foreach (CustomerCenterListItem listItem in settings.GetItems())
8132 {
8133 int columnCount = 0;
8134 int totalColumns = listItem.GetInfoItems().Length;
8135 string rowHasActions = listItem.GetActions().Length > 0 ? "data-list__item--has-actions" : "";
8136 listItem.Id = !string.IsNullOrEmpty(listItem.Id) ? listItem.Id : Guid.NewGuid().ToString("N");
8137
8138 var attributes = new Dictionary<string, string>();
8139 if (!string.IsNullOrEmpty(listItem.Title)) { attributes.Add("title", listItem.Title); };
8140
8141 attributes = attributes.Concat(listItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
8142 <tbody class="data-list__item @rowHasActions @listItem.CssClass dw-mod" @ComponentMethods.AddAttributes(attributes)>
8143 <tr>
8144 @if (!string.IsNullOrEmpty(listItem.Title) || !string.IsNullOrEmpty(listItem.Description)) {
8145 string onClick = !string.IsNullOrEmpty(listItem.OnClick) ? "onclick=\"" + listItem.OnClick + "\"" : "";
8146
8147 <td rowspan="2" @onClick class="data-list__main-item dw-mod">
8148 @if (!string.IsNullOrEmpty(listItem.Title)) {
8149 <div class="u-bold">@listItem.Title</div>
8150 }
8151 @if (!string.IsNullOrEmpty(listItem.Description)) {
8152 <div>@listItem.Description</div>
8153 }
8154 </td>
8155 }
8156
8157 @foreach (CustomerCenterListInfoItem infoItem in listItem.GetInfoItems())
8158 {
8159 var infoAttributes = new Dictionary<string, string>();
8160 if (!string.IsNullOrEmpty(infoItem.Id)) { infoAttributes.Add("id", infoItem.Id); };
8161 if (!string.IsNullOrEmpty(infoItem.OnClick)) { infoAttributes.Add("onclick", infoItem.OnClick); };
8162 infoAttributes.Add("align", infoItem.Align.ToString());
8163
8164 infoAttributes = infoAttributes.Concat(infoItem.ExtraAttributes).GroupBy(d => d.Key).ToDictionary (d => d.Key, d => d.Last().Value);
8165 string columnClick = columnCount < (totalColumns-1) && !string.IsNullOrEmpty(listItem.OnClick) ? "onclick=\"" + listItem.OnClick + "\"" : "";
8166
8167 <td @ComponentMethods.AddAttributes(infoAttributes) @columnClick class="data-list__info-item dw-mod">
8168 @if (!string.IsNullOrEmpty(infoItem.Title)) {
8169 <div>@infoItem.Title</div>
8170 }
8171 @if (!string.IsNullOrEmpty(infoItem.Subtitle)) {
8172 <div><small>@infoItem.Subtitle</small></div>
8173 }
8174 </td>
8175
8176 columnCount++;
8177 }
8178 </tr>
8179 <tr>
8180 <td colspan="7" align="right" class="u-va-bottom u-no-border">
8181 <div class="data-list__actions @hideActions dw-mod" id="ActionsMenu_@listItem.Id">
8182 @foreach (ButtonBase action in listItem.GetActions())
8183 {
8184 action.ButtonLayout = ButtonLayout.LinkClean;
8185 action.Icon.CssClass += " u-full-height";
8186 action.CssClass += " data-list__action-button link";
8187
8188 @Render(action)
8189 }
8190 </div>
8191 </td>
8192 </tr>
8193 </tbody>
8194 }
8195 </table>
8196 }
8197 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
8198
8199 @using System
8200 @using System.Web
8201 @using System.Collections.Generic
8202 @using Dynamicweb.Rapido.Blocks.Extensibility
8203 @using Dynamicweb.Rapido.Blocks
8204
8205 @{
8206 BlocksPage bottomSnippetsBlocksPage = BlocksPage.GetBlockPage("Master");
8207
8208 Block primaryBottomSnippets = new Block()
8209 {
8210 Id = "MasterJavascriptInitializers",
8211 SortId = 100,
8212 Template = RenderPrimaryBottomSnippets()
8213 };
8214 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, primaryBottomSnippets);
8215
8216 if (Dynamicweb.Rapido.Services.User.IsBuyingAllowed())
8217 {
8218 Block miniCartPageId = new Block
8219 {
8220 Id = "MiniCartPageId",
8221 Template = RenderMiniCartPageId()
8222 };
8223 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, miniCartPageId);
8224 }
8225 }
8226
8227 @helper RenderPrimaryBottomSnippets()
8228 {
8229 bool isWireframeMode = Model.Area.Item.GetItem("Settings").GetBoolean("WireframeMode");
8230 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
8231
8232 if (isWireframeMode)
8233 {
8234 <script>
8235 Wireframe.Init(true);
8236 </script>
8237 }
8238
8239
8240 if (useGoogleTagManager)
8241 {
8242 <script>
8243 document.addEventListener('addToCart', function(event) {
8244 var googleImpression = JSON.parse(event.detail.productInfo.googleImpression);
8245 if (typeof googleImpression == "string") {
8246 googleImpression = JSON.parse(event.detail.productInfo.googleImpression);
8247 }
8248 dataLayer.push({
8249 'event': 'addToCart',
8250 'ecommerce': {
8251 'currencyCode': googleImpression.currency,
8252 'add': {
8253 'products': [{
8254 'name': googleImpression.name,
8255 'id': googleImpression.id,
8256 'price': googleImpression.price,
8257 'brand': googleImpression.brand,
8258 'category': googleImpression.category,
8259 'variant': googleImpression.variant,
8260 'quantity': event.detail.quantity
8261 }]
8262 }
8263 }
8264 });
8265 });
8266 </script>
8267 }
8268
8269 //if digitalwarehouse
8270 if (Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart"))
8271 {
8272 string cartContextId = Converter.ToString(HttpContext.Current.Application["DownloadCartContext"]);
8273
8274 if (string.IsNullOrEmpty(cartContextId))
8275 {
8276 var moduleProps = Dynamicweb.Modules.Properties.GetParagraphModuleSettings(GetPageIdByNavigationTag("DownloadCart"), "eCom_CartV2");
8277 var cartSettings = new Dynamicweb.Ecommerce.Cart.ModuleSettings(moduleProps);
8278 cartContextId = cartSettings.OrderContextID;
8279 HttpContext.Current.Application["DownloadCartContext"] = cartContextId;
8280 }
8281
8282 <script>
8283 let downloadCart = new DownloadCart({
8284 cartPageId: @GetPageIdByNavigationTag("MiniCartFeed"),
8285 contextId: "@cartContextId",
8286 addButtonText: "@Translate("Add")",
8287 removeButtonText: "@Translate("Remove")"
8288 });
8289 </script>
8290 }
8291
8292 <!--$$Javascripts-->
8293 }
8294
8295 @helper RenderMiniCartPageId()
8296 {
8297 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
8298 <script>
8299 window.cartId = "@miniCartFeedPageId";
8300 </script>
8301 }
8302 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
8303
8304 @using System
8305 @using System.Web
8306 @using System.Collections.Generic
8307 @using Dynamicweb.Rapido.Blocks
8308
8309 @{
8310 BlocksPage masterCustomBlocksPage = BlocksPage.GetBlockPage("Master");
8311
8312 }
8313
8314
8315 @functions {
8316 public class ManifestIcon
8317 {
8318 public string src { get; set; }
8319 public string type { get; set; }
8320 public string sizes { get; set; }
8321 }
8322
8323 public class Manifest
8324 {
8325 public string name { get; set; }
8326 public string short_name { get; set; }
8327 public string start_url { get; set; }
8328 public string display { get; set; }
8329 public string background_color { get; set; }
8330 public string theme_color { get; set; }
8331 public List<ManifestIcon> icons { get; set; }
8332 }
8333 }
8334
8335 <!DOCTYPE html>
8336
8337 <html lang="@Pageview.Area.CultureInfo.TwoLetterISOLanguageName">
8338
8339
8340
8341 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@
8342 @RenderBlockList(masterPage.BlocksRoot.BlocksList)
8343
8344
8345
8346 @helper RenderMasterHead() {
8347 List<Block> subBlocks = this.masterPage.GetBlockListById("Head").OrderBy(item => item.SortId).ToList();
8348
8349 <head>
8350 <!-- Rapido version 3.4.3 -->
8351
8352 @RenderBlockList(subBlocks)
8353 </head>
8354 }
8355
8356 @helper RenderMasterMetadata() {
8357 var swatches = new Dynamicweb.Content.Items.ColorSwatchService();
8358 var brandColors = swatches.GetColorSwatch(1);
8359 string brandColorOne = brandColors.Palette["BrandColor1"];
8360
8361 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")) && Model.Area.Item.GetItem("Settings").GetFile("AppIcon") != null) {
8362 Manifest manifest = new Manifest
8363 {
8364 name = Model.Area.Item.GetItem("Settings").GetString("AppName"),
8365 short_name = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppShortName")) ? Model.Area.Item.GetItem("Settings").GetString("AppShortName") : Model.Area.Item.GetItem("Settings").GetString("AppName"),
8366 start_url = "/",
8367 display = "standalone",
8368 background_color = Model.Area.Item.GetItem("Settings").GetString("AppBackgroundColor"),
8369 theme_color = Model.Area.Item.GetItem("Settings").GetString("AppThemeColor")
8370 };
8371
8372 manifest.icons = new List<ManifestIcon> {
8373 new ManifestIcon {
8374 src = "/Admin/Public/GetImage.ashx?width=192&height=192&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
8375 sizes = "192x192",
8376 type = "image/png"
8377 },
8378 new ManifestIcon {
8379 src = "/Admin/Public/GetImage.ashx?width=512&height=512&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
8380 sizes = "512x512",
8381 type = "image/png"
8382 },
8383 new ManifestIcon {
8384 src = "/Admin/Public/GetImage.ashx?width=1024&height=1024&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
8385 sizes = "1024x1024",
8386 type = "image/png"
8387 }
8388 };
8389
8390 string manifestFilePath = HttpContext.Current.Request.MapPath("/Files/Templates/Designs/Rapido/manifest.json");
8391 string manifestJSON = Newtonsoft.Json.JsonConvert.SerializeObject(manifest);
8392 string currentManifest = File.ReadAllText(manifestFilePath);
8393
8394 if (manifestJSON != currentManifest)
8395 {
8396 File.WriteAllText(manifestFilePath, manifestJSON);
8397 }
8398 }
8399
8400 <meta charset="utf-8" />
8401 <title>@Model.Title</title>
8402 <meta name="viewport" content="width=device-width, initial-scale=1.0">
8403 <meta name="robots" content="index, follow">
8404 <meta name="theme-color" content="@brandColorOne" />
8405
8406 if (Model.MetaTags != null && !Model.MetaTags.Contains("og:image") && Model.PropertyItem != null && Model.PropertyItem.GetFile("OpenGraphImage") != null)
8407 {
8408 Pageview.Meta.AddTag("og:image", string.Format("{0}://{1}{2}", Dynamicweb.Context.Current.Request.Url.Scheme, HttpContext.Current.Request.Url.Host, Model.PropertyItem.GetFile("OpenGraphImage")));
8409 }
8410
8411 if (!Model.MetaTags.Contains("og:description") && !string.IsNullOrEmpty(Model.Description))
8412 {
8413 Pageview.Meta.AddTag("og:description", Model.Description);
8414 }
8415
8416 Pageview.Meta.AddTag("og:title", Model.Title);
8417 Pageview.Meta.AddTag("og:site_name", Model.Name);
8418 Pageview.Meta.AddTag("og:url", HttpContext.Current.Request.Url.ToString());
8419 Pageview.Meta.AddTag("og:type", "Website");
8420
8421 if (!string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("FacebookAppID"))) {
8422 Pageview.Meta.AddTag("fb:app_id", Model.Area.Item.GetItem("Settings").GetString("FacebookAppID"));
8423 }
8424
8425 @Model.MetaTags
8426 }
8427
8428 @helper RenderMasterCss() {
8429 var fonts = new string[] {
8430 getFontFamily("Layout", "HeaderFont"),
8431 getFontFamily("Layout", "SubheaderFont"),
8432 getFontFamily("Layout", "TertiaryHeaderFont"),
8433 getFontFamily("Layout", "BodyText"),
8434 getFontFamily("Layout", "Header", "ToolsFont"),
8435 getFontFamily("Layout", "Header", "NavigationFont"),
8436 getFontFamily("Layout", "MobileNavigation", "Font"),
8437 getFontFamily("ProductList", "Facets", "HeaderFont"),
8438 getFontFamily("ProductPage", "PriceFontDesign"),
8439 getFontFamily("Ecommerce", "SaleSticker", "Font"),
8440 getFontFamily("Ecommerce", "NewSticker", "Font"),
8441 getFontFamily("Ecommerce", "CustomSticker", "Font")
8442 };
8443
8444 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks;
8445 string favicon = Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon").Path : "/Files/Images/favicon.png";
8446 bool useFontAwesomePro = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetBoolean("UseFontAwesomePro");
8447 string fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomeFree/css/fontawesome-all.min.css";
8448 if (useFontAwesomePro)
8449 {
8450 fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomePro/css/fontawesome-all.min.css";
8451 }
8452
8453 //Favicon
8454 <link href="@favicon" rel="icon" type="image/png">
8455
8456 //Base (Default, wireframe) styles
8457 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css">
8458
8459 //Rapido Css from Website Settings
8460 <link rel="stylesheet" id="rapidoCss" href="@autoCssLink" type="text/css">
8461
8462 //Ignite Css (Custom site specific styles)
8463 <link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css">
8464
8465 //Font awesome
8466 <link rel="stylesheet" href="@fontAwesomeCssLink" type="text/css">
8467
8468 //Flag icon
8469 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css" type="text/css">
8470
8471 //Google fonts
8472 var family = string.Join("%7C", fonts.Where(x => !string.IsNullOrEmpty(x)).Distinct().Select(x => string.Format("{0}:100,200,300,400,500,600,700,800,900", x)));
8473
8474 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet">
8475
8476 PushPromise(favicon);
8477 PushPromise(fontAwesomeCssLink);
8478 PushPromise("/Files/Templates/Designs/Rapido/css/base/base.min.css");
8479 PushPromise(autoCssLink);
8480 PushPromise("/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css");
8481 PushPromise("/Files/Images/placeholder.gif");
8482 PushPromise("/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css");
8483 }
8484
8485 @helper RenderMasterManifest() {
8486 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")))
8487 {
8488 <link rel="manifest" href="/Files/Templates/Designs/Rapido/manifest.json">
8489 PushPromise("/Files/Templates/Designs/Rapido/manifest.json");
8490 }
8491 }
8492
8493 @helper RenderMasterBody() {
8494 List<Block> subBlocks = this.masterPage.GetBlockListById("Body").OrderBy(item => item.SortId).ToList();
8495 string designLayout = Model.PropertyItem.GetItem("CustomSettings") != null ? Model.PropertyItem.GetItem("CustomSettings").GetString("DesignLayout") != null ? Model.PropertyItem.GetItem("CustomSettings").GetList("DesignLayout").SelectedValue : "" : "";
8496 if (!String.IsNullOrEmpty(designLayout)) {
8497 designLayout = "class=\"" + designLayout + "\"";
8498 }
8499
8500 <body @designLayout>
8501 @RenderBlockList(subBlocks)
8502 </body>
8503 }
8504
8505 @helper RenderMasterHeader()
8506 {
8507 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterHeader").OrderBy(item => item.SortId).ToList();
8508 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
8509 string stickyTop = isNavigationStickyMenu ? "top-container--sticky" : "";
8510
8511 <header class="top-container @stickyTop no-print dw-mod" id="Top">
8512 @RenderBlockList(subBlocks)
8513 </header>
8514 }
8515
8516 @helper RenderMain()
8517 {
8518 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMain").OrderBy(item => item.SortId).ToList();
8519
8520 <main class="site dw-mod">
8521 @RenderBlockList(subBlocks)
8522 </main>
8523 }
8524
8525 @helper RenderPageContent()
8526 {
8527 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
8528 string pagePos = isNavigationStickyMenu ? "js-page-pos" : "";
8529
8530 <div id="Page" class="page @pagePos">
8531 <div id="content">
8532 @RenderSnippet("Content")
8533 </div>
8534 </div>
8535 }
8536
8537 @* Hack to support nested helpers *@
8538 @SnippetStart("Content")
8539 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
8540
8541
8542
8543 @* Render the grid *@
8544 @Model.Grid("Grid", "Grid", "default:true;sort:1", "Pages")
8545
8546 @SnippetEnd("Content")
8547
8548 @helper RenderIosTabletFix() {
8549 if (Pageview.Device != Dynamicweb.Frontend.Devices.DeviceType.Tablet && Pageview.Platform != Dynamicweb.Frontend.Devices.PlatformType.Ios)
8550 {
8551 <script>
8552 let isIpadIOS = (/iPad/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) && !window.MSStream;
8553 if (isIpadIOS) {
8554 var separator = (window.location.href.indexOf("?") === -1) ? "?" : "&";
8555 window.location.href = window.location.href + separator + "DeviceType=Tablet&PlatformType=Ios";
8556 }
8557 </script>
8558 }
8559 }
8560
8561 </html>
8562
8563