Error parsing template "Designs/Huuskes/Forms/Form/WinActionForm.cshtml" Line 348: (347:9) - Unexpected "if" keyword after "@" character. Once inside code, you do not need to prefix constructs like "if" with "@".
1 @using Huuskes.Core.Services.Abstract 2 @using System.Web.Mvc 3 @using Huuskes.Repository.Helpers; 4 5 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 6 @{ 7 var pageView = Dynamicweb.Frontend.PageView.Current(); 8 var recaptchaSvc = DependencyResolver.Current.GetService<Huuskes.Core.Services.Abstract.IRecaptchaService>(); 9 var recaptchaSiteKey = recaptchaSvc?.GetSiteKey(); 10 var recaptchaEnabled = recaptchaSvc?.IsEnabled() ?? false; 11 var captchaQuery = System.Web.HttpContext.Current.Request.QueryString["captcha"]; 12 bool captchaFailed = string.Equals(captchaQuery, "false", StringComparison.OrdinalIgnoreCase); 13 string formCssClass = GetString("Form.CssClass"); 14 string formSystemFields = GetString("Form.SystemFields"); 15 bool formLabelBold = GetBoolean("Form.LabelBold"); 16 bool formLabelOverField = GetBoolean("Form.LabelOverField"); 17 string formId = GetString("Form.HtmlId"); 18 string formOnSubmit = MailHelper.FixTargetPageID(GetString("Form.OnSubmit"), pageView); 19 string formSpamScript = GetString("Form.SpamScript"); 20 string formAction = GetString("Form.Action"); 21 int formColumnShiftFormFieldID = GetInteger("Form.ColumnShiftFormFieldID"); 22 string formLabelRequired = GetString("Form.LabelRequired"); 23 if (string.IsNullOrWhiteSpace(formLabelRequired)) 24 { 25 formLabelRequired = "<span>*</span>"; 26 } 27 int formMaxSubmits = GetInteger("Form.MaxSubmits"); 28 int formSubmitCount = GetInteger("Form.SubmitCount"); 29 string[] showInlineFieldTypes = { "CheckBox", "CheckBoxList", "Radio" }; 30 31 if (captchaFailed) 32 { 33 <div class="dw-form-captcha-failed alert alert-warning area-red" role="alert" style="color: #721c24; background-color: #f8d7da; border-color: #f5c6cb; position: relative; padding: .75rem 1.25rem; margin-bottom: 1rem; border: 1px solid transparent; border-radius: .25rem;"> 34 @Translate("InvalidCaptcha", "De captcha is niet geldig, het formulier is niet verzonden.") 35 </div> 36 } 37 38 if (formMaxSubmits > 0 && formSubmitCount >= formMaxSubmits) 39 { 40 @GetString("Form.MaxSubmitsReachedText") 41 } 42 else 43 { 44 int.TryParse(GetGlobalValue("Global:Page.ID"), out int pageId); 45 var action = WinActionHelper.GetActionItemByPageId(pageId); 46 var onlyOne = false; 47 if (action != null && action.SystemName.Equals(Huuskes.Items.Constants.ItemConstants.Page_HuuskesWinActionPage)) 48 { 49 onlyOne = ItemHelper.GetItemValue<bool>(action, "OnlyOneParticipationPerEmailAddress"); 50 } 51 var sumbitButtonId = ""; 52 53 var participantDisplay = ItemHelper.GetItemValue<string>(action, "ParticipantDisplay"); 54 var customField1 = ItemHelper.GetItemValue<string>(action, "ParticipantDisplayCustom1"); 55 var customField2 = ItemHelper.GetItemValue<string>(action, "ParticipantDisplayCustom2"); 56 var hasCustomDisplayFields = !string.IsNullOrWhiteSpace(participantDisplay) && 57 participantDisplay.Equals(Huuskes.Items.Constants.ItemConstants.Option_WinActionParticipantDisplay_Custom) && 58 (!string.IsNullOrWhiteSpace(customField1) || !string.IsNullOrWhiteSpace(customField2)); 59 60 61 <form method="post" action="@formAction" enctype="multipart/form-data" class="@formCssClass" id="@formId" onsubmit="@formOnSubmit"> 62 @formSystemFields 63 @if (recaptchaEnabled) 64 { 65 <input type="hidden" name="g-recaptcha-response" id="g-recaptcha-response" value="" /> 66 } 67 @foreach (LoopItem field in GetLoop("Fields")) 68 { 69 int fieldId = field.GetInteger("Field.ID"); 70 string fieldHtmlId = field.GetString("Field.HtmlId"); 71 string fieldName = Translate(string.Format("Form_{0}", field.GetString("Field.Name").Replace(" ", "_")), field.GetString("Field.Name")); 72 string fieldControl = field.GetString("Field.Control"); 73 string fieldType = field.GetString("Field.Type"); 74 bool showInline = showInlineFieldTypes.Contains(fieldType); 75 bool fieldIsButton = field.GetBoolean("Field.IsButton"); 76 bool fieldIsOther = field.GetBoolean("Field.IsOther"); 77 bool fieldRequired = field.GetBoolean("Field.Required"); 78 string cssClass = field.GetString("Field.CssClass"); 79 bool isCustomField = field.GetString("Field.SystemName").Equals("CustomField1") || field.GetString("Field.SystemName").Equals("CustomField2"); 80 bool showCustomField = hasCustomDisplayFields && 81 ( 82 (field.GetString("Field.SystemName").Equals("CustomField1") && !string.IsNullOrWhiteSpace(customField1)) || 83 (field.GetString("Field.SystemName").Equals("CustomField2") && !string.IsNullOrWhiteSpace(customField2)) 84 ); 85 86 if (fieldType == "TextInput" || 87 fieldType == "Email" || 88 fieldType == "Tel" || 89 fieldType == "Date") 90 { 91 92 var inputType = fieldType.Equals("TextInput") ? "text" : fieldType.ToLower(); 93 94 var textInputPlaceholderText = field.GetString("Field.Placeholder"); 95 if (isCustomField) 96 { 97 if (field.GetString("Field.SystemName").Equals("CustomField1")) 98 { 99 textInputPlaceholderText = customField1; 100 } 101 if (field.GetString("Field.SystemName").Equals("CustomField2")) 102 { 103 textInputPlaceholderText = customField2; 104 } 105 106 } 107 if (string.IsNullOrWhiteSpace(textInputPlaceholderText) && !formLabelOverField && !showInline) 108 { 109 textInputPlaceholderText = field.GetString("Field.Name"); 110 } 111 if (!string.IsNullOrWhiteSpace(textInputPlaceholderText)) 112 { 113 textInputPlaceholderText = textInputPlaceholderText.HtmlRemove().Replace(" ", "_"); 114 } 115 textInputPlaceholderText = Translate(string.Format("Form_Label_{0}", textInputPlaceholderText), textInputPlaceholderText); 116 if ((fieldRequired || isCustomField) && !formLabelOverField && !showInline) 117 { 118 textInputPlaceholderText += "*"; 119 } 120 121 var textInputPlaceholder = !string.IsNullOrWhiteSpace(textInputPlaceholderText) ? string.Format(" placeholder=\"{0}\"", textInputPlaceholderText) : ""; 122 var textInputRequired = fieldRequired || isCustomField ? " required=\"required\"" : ""; 123 124 var maxLength = "50"; 125 if (fieldType == "Email") 126 { 127 maxLength = "225"; 128 } 129 130 string textInput = string.Format("<input type=\"{3}\" id=\"{0}\" name=\"{0}\"{1} {2} class=\"{4}\" maxlength=\"{5}\" />", 131 field.GetString("Field.SystemName"), 132 textInputPlaceholder, 133 textInputRequired, 134 inputType, 135 cssClass, 136 maxLength); 137 fieldControl = textInput; 138 } 139 else if (fieldType == "Select") // take option texts from translations 140 { 141 var selectRequired = field.GetBoolean("Field.Required") ? " required=\"required\"" : ""; 142 string select = string.Format("<div class=\"select-wrapper\"><span class=\"caret\"></span><select id=\"{0}\" name=\"{0}\"{1}>", 143 fieldHtmlId, 144 selectRequired); 145 select += string.Format("<option value=\"\">{0}</option>", fieldName); 146 foreach (LoopItem option in field.GetLoop("Options")) 147 { 148 select += string.Format("<option value=\"{0}\">{1}</option>", 149 option.GetString("Option.Value"), 150 Translate(string.Format("Form_WinActionOption_{0}", option.GetString("Option.Value")), option.GetString("Option.Text"))); 151 } 152 select += "</select></div>"; 153 fieldControl = select; 154 } 155 else if (fieldType == "Textarea") // take placeholder text from translations 156 { 157 var textAreaPlaceholderText = field.GetString("Field.Placeholder"); 158 if (string.IsNullOrWhiteSpace(textAreaPlaceholderText) && !formLabelOverField && !showInline) 159 { 160 textAreaPlaceholderText = field.GetString("Field.Name"); 161 } 162 if (!string.IsNullOrWhiteSpace(textAreaPlaceholderText)) 163 { 164 textAreaPlaceholderText = textAreaPlaceholderText.HtmlRemove().Replace(" ", "_"); 165 } 166 textAreaPlaceholderText = Translate(string.Format("Form_Label_{0}", textAreaPlaceholderText), field.GetString("Field.Placeholder")); 167 if (field.GetBoolean("Field.Required") && !formLabelOverField && !showInline) 168 { 169 textAreaPlaceholderText += "*"; 170 } 171 172 var textAreaPlaceholder = !string.IsNullOrWhiteSpace(textAreaPlaceholderText) ? string.Format(" placeholder=\"{0}\"", textAreaPlaceholderText) : ""; 173 var textAreaRequired = field.GetBoolean("Field.Required") ? " required=\"required\"" : ""; 174 string textArea = string.Format("<textarea rows=\"0\" id=\"{0}\" name=\"{0}\"{1}{2}></textarea>", 175 fieldHtmlId, 176 textAreaPlaceholder, 177 textAreaRequired); 178 fieldControl = textArea; 179 } 180 else if (fieldType == "File") 181 { 182 var fileSelectorRequired = field.GetBoolean("Field.Required") ? " required=\"required\"" : ""; 183 string fileSelectorButtonText = Translate(string.Format("Form_FileButton_{0}", field.GetString("Field.Name").HtmlRemove().Replace(" ", "")), field.GetString("Field.Name")); 184 string fileSelector = string.Format("<label class=\"custom-file-upload\"><input type=\"file\" id=\"{0}\" name=\"{0}\" multiple=\"\" accept=\".jpg,.jpeg,.png,.gif\" {2} />{1}</label>", fieldHtmlId, fileSelectorButtonText, fileSelectorRequired); 185 fieldControl = fileSelector; 186 } 187 string fieldDescription = field.GetString("Field.Description"); 188 if (!string.IsNullOrWhiteSpace(fieldDescription)) 189 { 190 fieldDescription = string.Format("<br /><span class=\"description\">{0}</span>", fieldDescription); 191 } 192 193 string requiredImage = string.Empty; 194 if (fieldRequired && !string.IsNullOrEmpty(formLabelRequired)) 195 { 196 requiredImage = formLabelRequired.Contains(".") ? string.Format("<img src=\"/Files/images/{0}\">", formLabelRequired) : formLabelRequired; 197 } 198 199 // DEFINE LABEL AND CONTROLCLASS 200 var labelClass = formLabelOverField ? "label label-clear" : "label"; 201 var controlClass = formLabelOverField ? "control control-clear" : "control"; 202 if (showInline) 203 { 204 labelClass += " show-inline"; 205 controlClass += " show-inline"; 206 } 207 208 if (formLabelBold) 209 { 210 labelClass += " text-bold"; 211 } 212 213 //HIDDEN INPUTS 214 if (fieldType.Equals("Hidden", StringComparison.InvariantCultureIgnoreCase)) 215 { 216 <text>@fieldControl</text> 217 } // EMPTY FIELD TO ALIGN FIELD PROPERLY 218 else if (field.GetString("Field.Name") == "Spacer") 219 { 220 <div class="spacer hidden-phone"></div> 221 } // CHECKBOX 222 else if (fieldType == "CheckBox") 223 { 224 string fieldActivityDescription = field.GetString("Field.Activity.Description"); 225 if (!string.IsNullOrEmpty(fieldActivityDescription)) 226 { 227 // CREATE CONSENT LABEL 228 229 // general conditions replace 230 fieldName = Huuskes.Repository.Helpers.HtmlHelper.ReplaceTagWithLink( 231 Dynamicweb.Frontend.PageView.Current(), 232 fieldActivityDescription, 233 "{general-conditions}", 234 Translate("general-conditions", "general conditions"), 235 Huuskes.Models.Constants.StringConstants.NavigationTags.GeneralConditions, 236 "_blank" 237 ); 238 239 // job applicants general conditions replace 240 fieldName = Huuskes.Repository.Helpers.HtmlHelper.ReplaceTagWithLink( 241 Dynamicweb.Frontend.PageView.Current(), 242 fieldActivityDescription, 243 "{privacy-statement}", 244 Translate("privacy-statement", "privacy-statement"), 245 Huuskes.Models.Constants.StringConstants.NavigationTags.PrivacyStatement, 246 "_blank" 247 ); 248 249 // job applicants general conditions replace 250 fieldName = Huuskes.Repository.Helpers.HtmlHelper.ReplaceTagWithLink( 251 Dynamicweb.Frontend.PageView.Current(), 252 fieldActivityDescription, 253 "{privacy-statement-for-applications}", 254 Translate("privacy-statement-for-applications", "privacy-statement for applications"), 255 Huuskes.Models.Constants.StringConstants.NavigationTags.PrivacyStatementForApplications, 256 "_blank" 257 ); 258 259 // remove surrounding paragraph tags 260 fieldName = fieldName.Replace("<p>", "").Replace("</p>", ""); 261 262 } else if (fieldName.Equals("AgreedWithConditions")) { 263 fieldName = "Ik ga akkoord met de actievoorwaarden zoals beschreven in de algemene voorwaarden van Huuskes.nl"; 264 var actionConditionsText = ItemHelper.GetItemValue<string>(action, "ActionConditionsText"); 265 if (!string.IsNullOrWhiteSpace(actionConditionsText)) { 266 fieldName = actionConditionsText; 267 } 268 if (fieldName.Contains("{action-conditions}")) { 269 var actionConditionsLink = ItemHelper.GetItemValue<string>(action, "ActionConditionsLink"); 270 if (!string.IsNullOrWhiteSpace(actionConditionsLink)) { 271 272 var conditionsLink = $"<a href=\"{actionConditionsLink}\" target=\"_blank\">{Translate("WinAction_ActionConditions", "action conditions")}</a>"; 273 fieldName = fieldName.Replace("{action-conditions}", conditionsLink); 274 } 275 } 276 277 } 278 <div class="form-group flex flex-align-center checkbox"> 279 @fieldControl 280 <label for="@fieldHtmlId"> 281 <span class="circle"></span> 282 <span class="flex flex-wrap flex-align-center"> 283 284 @fieldName @(fieldRequired ? "*" : "") 285 </span> 286 </label> 287 </div> 288 } // RADIO AND CHECKBOXLIST 289 else if (fieldType == "Radio" || fieldType == "CheckBoxList") 290 { 291 var listType = fieldType == "CheckBoxList" ? "checkbox" : "radio"; 292 <div class="form-group @fieldType.ToLower()"> 293 <label for="@fieldHtmlId"> 294 <p>@fieldName @(fieldRequired ? "*" : "")</p> 295 </label> 296 @foreach (LoopItem option in field.GetLoop("Options")) 297 { 298 var inputId = string.Concat(fieldHtmlId, option.GetInteger("Option.ID")); 299 <div class="checkbox flex"> 300 <input type="@listType" 301 id="@inputId" 302 name="@fieldHtmlId" 303 value="@option.GetString("Option.Value")" 304 @(fieldRequired && fieldType == "Radio" && option.Index == 1 ? "required " : "") 305 @(option.GetBoolean("Option.DefaultSelected") ? "checked " : "") /> 306 <label for="@inputId"> 307 <span class="circle"></span> 308 @Translate(string.Format("FormsForEditor_{0}", option.GetString("Option.Text")), option.GetString("Option.Text")) 309 </label> 310 </div> 311 } 312 </div> 313 } 314 else if (fieldType == "Submit") // SUBMIT 315 { 316 sumbitButtonId = $"VIS_{fieldHtmlId}"; 317 <div class="form-group @fieldType.ToLower()"> 318 <div class="@labelClass"></div> 319 <div class="@controlClass"> 320 <input type="submit" id="@fieldHtmlId" name="@fieldHtmlId" value="@fieldName" class="hidden"> 321 <input type="button" id="@sumbitButtonId" name="@sumbitButtonId" value="@fieldName" data-text="@fieldName" class="button"> 322 </div> 323 </div> 324 } // ALL OTHER INPUTS 325 else 326 { 327 if (!isCustomField || showCustomField) { 328 <div class="form-group @fieldType.ToLower()"> 329 <div class="@labelClass"> 330 @if (!fieldIsButton && !fieldIsOther) 331 { 332 <label for="@fieldHtmlId" class="theme-color">@fieldName @requiredImage</label> 333 } 334 else if (fieldIsOther) 335 { 336 @fieldName 337 } 338 </div> 339 <div class="@controlClass">@fieldControl @fieldDescription</div> 340 </div> 341 } 342 343 } 344 } 345 </form> 346 347 @SnippetStart("JavaScriptBottom") 348 @if (recaptchaEnabled) 349 { 350 <script src="https://www.google.com/recaptcha/api.js?render=@recaptchaSiteKey"></script> 351 } 352 <script> 353 $(document).ready(function () { 354 355 var submittingParticipation = false; 356 var formCssClass = ".@formCssClass.Replace(" ", ".")"; 357 358 // init 359 WinAction.FormInit(formCssClass); 360 361 // fill hidden fields 362 WinAction.FillHiddenFields('@GetGlobalValue("Global:Page.ID")','@Guid.NewGuid().ToString()', '@pageView.Area.Culture'); 363 364 // on change validate 365 $("input[type=text], input[type=email], input[type=tel], input[type=date], input[type=file], textarea", formCssClass).on("keyup", function () { 366 WinAction.FormValidate(formCssClass); 367 }); 368 $("input[type=radio], input[type=checkbox], select, input[type=text], input[type=email], input[type=tel], input[type=date], input[type=file], textarea", formCssClass).on("change", function () { 369 WinAction.FormValidate(formCssClass); 370 }); 371 372 // Init datepicker 373 $(".huuskesDatepicker").datepicker({ 374 dateFormat: "dd-mm-yy" 375 }); 376 377 // Fix Dates 378 if ($(".hasDatepicker", formCssClass)[0]) { 379 Form.ShowDatePlaceholder(formCssClass); 380 } 381 382 // Only numbers in telephone fields 383 $("input[type=tel]").numeric(); 384 385 @if (onlyOne) { 386 var pageService = new Dynamicweb.Content.PageService(); 387 var participationsFeedPage = pageService.GetPageByNavigationTag(Dynamicweb.Frontend.PageView.Current().AreaID, Huuskes.Models.Constants.StringConstants.NavigationTags.WinActionParticipationsFeed); 388 var participationsFeedPageId = participationsFeedPage?.ID ?? 0; 389 <text> 390 $("#@sumbitButtonId").off("click").on("click", function (e) { 391 if (!submittingParticipation) { 392 submittingParticipation = true; 393 var formId = '@formId'; 394 var participationsFeedPageId = '@participationsFeedPageId'; 395 var actionPageId = '@GetGlobalValue("Global:Page.ID")'; 396 var emailAddress = $("input[type=email]", "#" + formId).val(); 397 var feedPageUrl = "/Default.aspx?ID=" + participationsFeedPageId + "&action=" + actionPageId + "&emailaddress=" + emailAddress; 398 $.getJSON(feedPageUrl) 399 .done(function (result, status, metaData) { 400 if (result !== null && result.length > 0) { 401 alert('@Translate("WinAction_MultipleParticipationsError", "Email already exist")'); 402 } else { 403 $("#" + formId).submit(); 404 } 405 }).fail(function (jqxhr, textStatus, error) { 406 var err = textStatus + ", " + error; 407 console.error("Submit form failed: " + err); 408 }).always(function () { 409 submittingParticipation = false; 410 }); 411 } 412 }); 413 </text> 414 } 415 416 417 @if (recaptchaEnabled) 418 { 419 <text> 420 // reCAPTCHA v3 form submission interception 421 $(formCssClass).on('submit', function (e) { 422 var form = this; 423 var tokenField = form.querySelector('#g-recaptcha-response'); 424 if (tokenField && !tokenField.value) { 425 e.preventDefault(); 426 grecaptcha.ready(function () { 427 grecaptcha.execute('@recaptchaSiteKey', { action: 'contact_form' }).then(function (token) { 428 tokenField.value = token; 429 form.submit(); 430 }); 431 }); 432 } 433 }); 434 </text> 435 } 436 437 }); 438 </script> 439 @SnippetEnd("JavaScriptBottom") 440 } 441 }