Skip to content

Commit 8952b64

Browse files
authored
Better control of sponsor package's price display after customization (#1690)
* Refactor js by introducing a object to hold access to HTML elemnts * Refactor references to cost label * Refactor clear form btn references * Refactor package input * Refactor application form references * Remove unused var * Refactor package info and benefits selector * Refactor benefits inputs/labels/conflicts selectors * Should use functions to "refresh" elements data * New function to display a package cost * Display the package cost if benefits after customization matches with package's ones
1 parent 1911074 commit 8952b64

File tree

1 file changed

+59
-29
lines changed

1 file changed

+59
-29
lines changed

static/js/sponsors/applicationForm.js

Lines changed: 59 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,94 @@
11
$(document).ready(function(){
2-
let checkboxesContainer = $('#benefits_container');
3-
let costLabel = $("#cost_label");
4-
let cost = 0;
2+
const SELECTORS = {
3+
checkboxesContainer: () => $('#benefits_container'),
4+
costLabel: () => $("#cost_label"),
5+
clearFormBtn: () => $("#clear_form_btn"),
6+
packageInput: () => $("input[name=package]"),
7+
applicationForm: () => $("#application_form"),
8+
getPackageInfo: (packageId) => $("#package_benefits_" + packageId),
9+
getPackageBenefits: (packageId) => SELECTORS.getPackageInfo(packageId).children(),
10+
benefitsInputs: () => $("input[id^=id_benefits_]"),
11+
getBenefitLabel: (benefitId) => $('label[benefit_id=' + benefitId + ']'),
12+
getBenefitInput: (benefitId) => SELECTORS.benefitsInputs().filter('[value=' + benefitId + ']'),
13+
getBenefitConflicts: (benefitId) => $('#conflicts_with_' + benefitId).children(),
14+
getSelectedBenefits: () => SELECTORS.benefitsInputs().filter(":checked"),
15+
}
516

6-
$("#clear_form_btn").click(function(){
7-
$("#application_form").trigger("reset");
8-
$("#application_form [class=active]").removeClass("active");
9-
$("input[name=package]").prop("checked", false);
10-
checkboxesContainer.find(':checkbox').each(function(){
17+
displayPackageCost = (packageId) => {
18+
let packageInfo = SELECTORS.getPackageInfo(packageId);
19+
let cost = packageInfo.attr("data-cost");
20+
SELECTORS.costLabel().html('Sponsorship cost is $' + cost.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' USD')
21+
}
22+
23+
24+
25+
SELECTORS.clearFormBtn().click(function(){
26+
SELECTORS.applicationForm().trigger("reset");
27+
SELECTORS.applicationForm().find("[class=active]").removeClass("active");
28+
SELECTORS.packageInput().prop("checked", false);
29+
SELECTORS.checkboxesContainer().find(':checkbox').each(function(){
1130
$(this).prop('checked', false);
1231
if ($(this).attr("package_only")) $(this).attr("disabled", true);
1332
});
14-
$("#cost_label").html("");
33+
SELECTORS.costLabel().html("");
1534
});
1635

17-
$("input[name=package]").change(function(){
36+
SELECTORS.packageInput().change(function(){
1837
let package = this.value;
1938
if (package.length == 0) return;
2039

21-
costLabel.html("Updating cost...")
40+
SELECTORS.costLabel().html("Updating cost...")
2241

23-
checkboxesContainer.find(':checkbox').each(function(){
42+
SELECTORS.checkboxesContainer().find(':checkbox').each(function(){
2443
$(this).prop('checked', false);
2544
let packageOnlyBenefit = $(this).attr("package_only");
2645
if (packageOnlyBenefit) $(this).attr("disabled", true);
2746
});
2847

29-
let packageInfo = $("#package_benefits_" + package);
30-
packageInfo.children().each(function(){
48+
SELECTORS.getPackageBenefits(package).each(function(){
3149
let benefit = $(this).html()
32-
let benefitInput = checkboxesContainer.find('[value=' + benefit + ']');
50+
let benefitInput = SELECTORS.getBenefitInput(benefit);
3351
let packageOnlyBenefit = benefitInput.attr("package_only");
3452
benefitInput.removeAttr("disabled");
3553
benefitInput.trigger("click");
3654
});
37-
38-
let url = $("#cost_container").attr("calculate_cost_url");
39-
let data = $("form").serialize();
40-
41-
let cost = packageInfo.attr("data-cost");
42-
costLabel.html('Sponsorship cost is $' + cost.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' USD')
55+
displayPackageCost(package);
4356
});
4457

45-
$("input[id^=id_benefits_]").change(function(){
58+
SELECTORS.benefitsInputs().change(function(){
4659
let benefit = this.value;
4760
if (benefit.length == 0) return;
48-
if (costLabel.html() != "Updating cost...") costLabel.html("Please submit your customized sponsorship package application and we'll contact you within 2 business days.");
4961

50-
let active = checkboxesContainer.find('[value=' + benefit + ']').prop("checked");
62+
// display package cost if custom benefit change result matches with package's benefits list
63+
let isChangeFromPackageChange = SELECTORS.costLabel().html() == "Updating cost..."
64+
if (!isChangeFromPackageChange) {
65+
let selectedBenefits = SELECTORS.getSelectedBenefits();
66+
selectedBenefits = $.map(selectedBenefits, (b) => $(b).val()).sort();
67+
let selectedPackageId = SELECTORS.packageInput().filter(":checked").val()
68+
let packageBenefits = SELECTORS.getPackageBenefits(selectedPackageId);
69+
packageBenefits = $.map(packageBenefits, (b) => $(b).text()).sort();
70+
71+
// check same num of benefits and join with string. if same string, both lists have the same benefits
72+
if (packageBenefits.length == selectedBenefits.length && packageBenefits.join(',') === selectedBenefits.join(',')){
73+
displayPackageCost(selectedPackageId);
74+
} else {
75+
let msg = "Please submit your customized sponsorship package application and we'll contact you within 2 business days.";
76+
SELECTORS.costLabel().html(msg);
77+
}
78+
}
79+
80+
// updates the input to be active if needed
81+
let active = SELECTORS.getBenefitInput(benefit).prop("checked");
5182
if (!active) {
5283
return;
5384
} else {
54-
$('label[benefit_id=' + benefit + ']').addClass("active");
85+
SELECTORS.getBenefitLabel(benefit).addClass("active");
5586
}
5687

57-
58-
$('#conflicts_with_' + benefit).children().each(function(){
88+
// check and ensure conflicts constraints between checked benefits
89+
SELECTORS.getBenefitConflicts(benefit).each(function(){
5990
let conflictId = $(this).html();
60-
let conflictCheckbox = checkboxesContainer.find('[value=' + conflictId + ']');
61-
let checked = conflictCheckbox.prop("checked");
91+
let checked = SELECTORS.getBenefitInput(conflictId).prop("checked");
6292
if (checked){
6393
conflictCheckbox.trigger("click");
6494
conflictCheckbox.parent().removeClass("active");

0 commit comments

Comments
 (0)