diff --git a/15-multi-step-form/src/main/resources/templates/step2.html b/15-multi-step-form/src/main/resources/templates/step2.html index 75f0d7e..0601aa7 100644 --- a/15-multi-step-form/src/main/resources/templates/step2.html +++ b/15-multi-step-form/src/main/resources/templates/step2.html @@ -166,6 +166,7 @@ diff --git a/15-multi-step-form/src/main/resources/templates/step3.html b/15-multi-step-form/src/main/resources/templates/step3.html index 954c770..6cd8a04 100644 --- a/15-multi-step-form/src/main/resources/templates/step3.html +++ b/15-multi-step-form/src/main/resources/templates/step3.html @@ -114,6 +114,7 @@ @@ -137,6 +138,7 @@ id="larger-storage" type="checkbox" name="addon-services" + value="LargerStorage" class="my-7 w-6 h-6 peer" />
this.copy( - step1 = this.step1.fromFormData(rawData), - currentStep = stepNum + 1 - ) - case 2 => this.copy( - step2 = this.step2.fromFormData(rawData), - currentStep = stepNum + 1 - ) - case 3 => this.copy( - step3 = this.step3.fromFormData(rawData), - currentStep = stepNum + 1 - ) - case 4 => this.copy( - currentStep = stepNum + 1 - ) + case 1 => + this.copy( + step1 = this.step1.fromFormData(rawData), + currentStep = stepNum + 1 + ) + case 2 => + this.copy( + step2 = this.step2.fromFormData(rawData), + currentStep = stepNum + 1 + ) + case 3 => + this.copy( + step3 = this.step3.fromFormData(rawData), + currentStep = stepNum + 1 + ) + case 4 => + this.copy( + currentStep = stepNum + 1 + ) case _ => this } } @@ -50,10 +54,14 @@ object Models { phone: String = "" ) extends StepAnswers { override def fromFormData(rawData: String): Step1 = { - val fieldValues = rawData.split("&").map { field => - val Array(name, value) = field.split("=") - name -> value - }.toMap + println(s"parsing step 1 data $rawData") + val fieldValues = rawData + .split("&") + .map { field => + val Array(name, value) = field.split("=") + name -> value + } + .toMap val name = fieldValues.getOrElse("name", "") val email = fieldValues.getOrElse("email", "") @@ -67,15 +75,41 @@ object Models { isYearly: Boolean = false ) extends StepAnswers { override def fromFormData(rawData: String): Step2 = { - val a = 1 - Step2() + println(s"parsing step 2 data $rawData") + val fieldValues = rawData + .split("&") + .map { field => + val Array(name, value) = field.split("=") + name -> value + } + .toMap + + val planType = + PlanType.valueOf(fieldValues.getOrElse("plan-type", "Arcade")) + val isYearly = fieldValues.get("isPackageYearly").contains("on") + + Step2(planType, isYearly) } } final case class Step3(addons: Set[Addons] = Set.empty) extends StepAnswers { override def fromFormData(rawData: String): Step3 = { - val a = 1 - Step3() + println(s"parsing step 3 data $rawData") + // for multiple checkboxes data comes in form of + // addon-services=OnlineService&addon-services=CustomProfile + val fieldValues = rawData + .split("&") + .map { field => + val Array(name, value) = field.split("=") + name -> value + } + + val addonsStrings = fieldValues.groupMap(_._1)(_._2) + .getOrElse("addon-services", Array.empty[String]) + println(s"in step 3 got strings $addonsStrings") + val addons = addonsStrings.map(Addons.valueOf(_)).toSet + + Step3(addons) } } } diff --git a/15-multi-step-form/src/main/scala/multistepform/Routes.scala b/15-multi-step-form/src/main/scala/multistepform/Routes.scala index 61d7f33..0201045 100644 --- a/15-multi-step-form/src/main/scala/multistepform/Routes.scala +++ b/15-multi-step-form/src/main/scala/multistepform/Routes.scala @@ -69,7 +69,9 @@ case class Routes()(implicit cc: castor.Context, log: cask.Logger) */ @cask.get("/get-form") def getForm(sessionId: cask.Cookie) = { - val state = Models.Answers(currentStep = 1) + val id = sessionId.value + val state = Sessions.sessionReplies.getOrElse(id, Answers(id)) + println(s"starting form for $state") val context = new Context() context.setVariable(formDataContextVarName, state) val formFragment = templateEngine.process( @@ -96,6 +98,9 @@ case class Routes()(implicit cc: castor.Context, log: cask.Logger) val userAnswers = Sessions.sessionReplies.getOrElse(id, Answers(id)) val updatedAnswers = userAnswers.updateStep(stepNum, request.text()) + + Sessions.sessionReplies.update(id, updatedAnswers) + val context = new Context() context.setVariable(formDataContextVarName, updatedAnswers) val nextFormFragment = templateEngine.process(