Skip to content

Commit 92ad977

Browse files
committed
output table
1 parent f2de9e1 commit 92ad977

File tree

5 files changed

+29
-36
lines changed

5 files changed

+29
-36
lines changed

framework/src/main/scala/framework/Page.scala

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
package framework
22

3-
//import io.udash.wrappers.jquery._
4-
53
import scalajs.js.annotation.JSExport
64
import scalatags.Text.all._
7-
//import scalatags.Text.TypedTag
85
import scalacss.DevDefaults._
9-
//import scalacss.ScalatagsCss._
106

117
abstract class Page(name: String) {
128
implicit val ec = scala.concurrent.ExecutionContext.global
@@ -27,7 +23,6 @@ abstract class Page(name: String) {
2723

2824
def cssLibs: List[Tag] = List(
2925
JsLibs.bootstrap.css,
30-
// styles.map(_.render[TypedTag[String]]),
3126
)
3227

3328
def jsLibs: List[Tag] = List(
@@ -46,6 +41,7 @@ abstract class Page(name: String) {
4641
meta(charset := "utf-8"),
4742
meta(attr("name") := "viewport", content := kv("width" -> "device-width", "initial-scale" -> "1")), // required by Bootstrap
4843
cssLibs,
44+
//css(styles.map(_.render))
4945
)
5046

5147
def renderBody: Tag

framework/src/main/scala/framework/RPC.scala

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import upickle.default._
77
import scala.concurrent.{ExecutionContext, Future}
88
import scala.util.{Failure, Success, Try}
99

10-
class RPC[I: ReadWriter, O: ReadWriter](path: String) { self =>
10+
class RPC[I: ReadWriter, O: ReadWriter](path: String) {
1111
val fragments = path.stripPrefix("/").stripSuffix("/").split("/").toSeq
1212

1313
def inputValidator: Validation[I] = Validation.empty
@@ -45,11 +45,13 @@ class RPC[I: ReadWriter, O: ReadWriter](path: String) { self =>
4545
}
4646

4747
object RPC {
48-
type RequestHandler = PartialFunction[cask.Request, cask.Response[ujson.Value]]
48+
import cask.{Request, Response}
49+
50+
type RequestHandler = PartialFunction[Request, Response[ujson.Value]]
4951

5052
def error(statusCode: StatusCode, errors: List[String] = Nil) =
5153
cask.Response(data = ujson.Obj("errors" -> errors), statusCode = statusCode.code)
5254

53-
def wire(handlers: RequestHandler*): cask.Request => cask.Response[ujson.Value] =
55+
def wire(handlers: RequestHandler*): Request => Response[ujson.Value] =
5456
handlers.reduce(_ orElse _).orElse(_ => error(StatusCode.NotFound))
5557
}

server/src/main/scala/services/MortgageApiImpl.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ object MortgageApiImpl {
1616
}
1717

1818
def refinancePenalty(mortgage: Mortgage, newApr: Double): Double = {
19+
println(s"refinance($mortgage, newApr=$newApr)")
1920
def totalInterest(m: Mortgage) = payments(m).map(_.interest).sum
2021
totalInterest(mortgage) - totalInterest(mortgage.copy(apr = newApr))
2122
}

shared/src/main/scala/api/Mortgage.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import upickle.default._
66
case class Mortgage(amount: Double, apr: Double, years: Int)
77
object Mortgage {
88
implicit val rw: ReadWriter[Mortgage] = macroRW
9-
// TODO: Validator here
10-
119
object API {
1210
val payments = new RPC[Mortgage, Seq[Payment]]("/mortgage/payments")
1311
val refinancePenalty = new RPC[(Mortgage, Double), Double]("/mortgage/refinance")
Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package views
22

3-
import scalatags.Text.all._
4-
53
import scala.annotation.nowarn
64
import scalajs.js.annotation.JSExportTopLevel
75
import org.scalajs.dom.raw._
86
import scalatags.Text.{all => t}
7+
import scalatags.Text.all._
98
import io.udash.wrappers.jquery.{jQ => $, _}
109

1110
import java.text.DecimalFormat
12-
//TODO: import framework.JsRead._
1311

1412
@JSExportTopLevel("mortgage_calculator")
1513
object MortgageCalculator extends framework.Page("mortgage_calculator") {
@@ -21,11 +19,11 @@ object MortgageCalculator extends framework.Page("mortgage_calculator") {
2119
input(label = "APR (%)", id = "apr", default = 5),
2220
input(label = "Mortgage Period (years)", id = "years", default = 30),
2321
input(label = "New APR", id = "new_apr", default = 3),
24-
button("Calculate", id := "calc_payments", `type` := "button", `class` := "btn btn-primary m-2"),
25-
button("Refinance?", id := "refinance", `type` := "button", `class` := "btn btn-secondary m-2"),
22+
button("Calculate", id := "calc_payments", `type` := "button", `class` := "btn btn-primary m-2"),
23+
button("Refinance?", id := "refinance", `type` := "button", `class` := "btn btn-secondary m-2"),
2624
),
2725
),
28-
div(id := "output", `class` := "container"),
26+
div(id := "output", `class` := "container"),
2927
)
3028

3129
def input(label: String, id: String, default: Int): Tag =
@@ -42,35 +40,33 @@ object MortgageCalculator extends framework.Page("mortgage_calculator") {
4240
def calc(element: Element, event: JQueryEvent) = {
4341
val format = new DecimalFormat("$ #.00");
4442
import api.Mortgage
45-
$("#output").html(table(`class` := "table table-striped font-monospace")(tr(
46-
th("#"),
47-
th("Balance"),
48-
th("Payment"),
49-
th("Principal"),
50-
th("Interest"))
51-
).render)
43+
$("#output").html(
44+
table(`class` := "table table-striped font-monospace")(
45+
tr(th("#"), th("Balance"), th("Payment"), th("Principal"), th("Interest")),
46+
).render,
47+
)
5248
for {
5349
amount <- $("#loan").value().asInstanceOf[String].toIntOption
5450
apr <- $("#apr").value().asInstanceOf[String].toFloatOption
5551
years <- $("#years").value().asInstanceOf[String].toIntOption
5652
mortgage = Mortgage(amount = amount, apr = apr, years = years)
57-
payments <- Mortgage.API.payments(mortgage)
53+
payments <- Mortgage.API.payments(mortgage)
5854
(payment, row) <- payments.zipWithIndex
59-
} $("#output tr:last").after(tr(
60-
td(row+1),
61-
td(format.format(payment.balance)),
62-
td(format.format(payment.payment)),
63-
td(format.format(payment.principal)),
64-
td(format.format(payment.interest)),
65-
).render)
55+
} $("#output tr:last").after(
56+
tr(
57+
td(row + 1),
58+
td(format.format(payment.balance)),
59+
td(format.format(payment.payment)),
60+
td(format.format(payment.principal)),
61+
td(format.format(payment.interest)),
62+
).render,
63+
)
6664
}
6765
}
6866

67+
//TODO: import framework.JsRead._
6968

7069
/*
71-
* Mon, Aug 28: FE (ScalaJs Tour) + FE Dependency management
72-
* Tue, Aug 29: RPC
73-
* Wed, Aug 30: BE: Server
74-
* Thu, Sep 1: BE: Shared
75-
* Fri, Sep 2: ScalaCSS + Tooling
70+
* Thu, Sep 1: Misc: ScalaCSS, JsRead
71+
* Fri, Sep 2: Tooling (sbt dev)
7672
*/

0 commit comments

Comments
 (0)