diff options
-rw-r--r-- | app/controllers/Sale.scala | 59 | ||||
-rw-r--r-- | app/views/fragments/ebeMainActions.scala.html | 2 | ||||
-rw-r--r-- | app/views/fragments/forms/labeledTextarea.scala.html | 4 | ||||
-rw-r--r-- | app/views/pages/sales/currentSales.scala.html | 4 | ||||
-rw-r--r-- | app/views/pages/sales/sellForm.scala.html | 34 | ||||
-rw-r--r-- | conf/routes | 8 |
6 files changed, 102 insertions, 9 deletions
diff --git a/app/controllers/Sale.scala b/app/controllers/Sale.scala index b5e4622..e6244c3 100644 --- a/app/controllers/Sale.scala +++ b/app/controllers/Sale.scala | |||
@@ -14,18 +14,73 @@ import scala.concurrent.Future | |||
14 | import models._ | 14 | import models._ |
15 | 15 | ||
16 | 16 | ||
17 | case class SaleData(endDate: java.sql.Date, | ||
18 | name: String, | ||
19 | shortDescription: String, | ||
20 | longDescription: String, | ||
21 | initialPrice: BigDecimal) | ||
22 | |||
17 | object Sale extends Controller { | 23 | object Sale extends Controller { |
18 | 24 | ||
19 | def sales = Auth { implicit request => | 25 | def sales = Auth { implicit request => |
20 | DB.withSession { implicit session => | 26 | DB.withSession { implicit session => |
21 | val currentDateTime = new java.sql.Timestamp((new java.util.Date).getTime) | 27 | val currentDateTime = new java.sql.Timestamp((new java.util.Date).getTime) |
22 | val sales = Views.Sales.filter(_.endDate > currentDateTime).sortBy(_.endDate.asc).run | 28 | val sales = Views.Sales.filter(_.endDate > currentDateTime).sortBy(_.endDate.asc).run |
23 | 29 | ||
24 | Ok(views.html.pages.sales.currentSales(sales)) | 30 | Ok(views.html.pages.sales.currentSales(sales)) |
25 | } | 31 | } |
26 | } | 32 | } |
27 | 33 | ||
28 | def sell(itemUuid: String) = TODO | 34 | val saleForm = Form( |
35 | mapping( | ||
36 | "endDate" -> sqlDate, | ||
37 | "name" -> nonEmptyText(minLength = 5, maxLength = 20), | ||
38 | "shortDescription" -> nonEmptyText(minLength = 10, maxLength = 30), | ||
39 | "longDescription" -> nonEmptyText, | ||
40 | "initialPrice" -> bigDecimal(precision = 8, scale = 2) | ||
41 | )(SaleData.apply)(SaleData.unapply) | ||
42 | ) | ||
43 | |||
44 | def sell = Auth { implicit request => | ||
45 | if (request.account.isEmpty) { | ||
46 | Redirect(routes.Authentication.login()) | ||
47 | .flashing("error" -> "Authentication required") | ||
48 | } else { | ||
49 | Ok(views.html.pages.sales.sellForm(saleForm)) | ||
50 | } | ||
51 | } | ||
52 | |||
53 | def sellSubmit = Auth { implicit request => | ||
54 | if (request.account.isEmpty) { | ||
55 | Redirect(routes.Authentication.login()) | ||
56 | .flashing("error" -> "Authentication required") | ||
57 | } else { | ||
58 | DB.withSession { implicit session => | ||
59 | saleForm.bindFromRequest.fold( | ||
60 | formWithErrors => { | ||
61 | BadRequest(views.html.pages.sales.sellForm(formWithErrors)) | ||
62 | }, | ||
63 | validForm => { | ||
64 | |||
65 | val items = Tables.Items returning Tables.Items.map(_.uuid) | ||
66 | val uuid = items += Tables.Item( | ||
67 | userUuid = request.account.get.userUuid.get, | ||
68 | startDate = new java.sql.Timestamp(new java.util.Date().getTime), | ||
69 | endDate = new java.sql.Timestamp(validForm.endDate.getTime), | ||
70 | itemName = validForm.name, | ||
71 | shortDesc = validForm.shortDescription, | ||
72 | longDesc = validForm.longDescription, | ||
73 | initialPrice = validForm.initialPrice | ||
74 | ) | ||
75 | |||
76 | Redirect(routes.Application.index()) | ||
77 | .flashing("success" -> "Your item is now on sale.") | ||
78 | |||
79 | } | ||
80 | ) | ||
81 | } | ||
82 | } | ||
83 | } | ||
29 | 84 | ||
30 | 85 | ||
31 | def item(itemUuid: String) = TODO | 86 | def item(itemUuid: String) = TODO |
diff --git a/app/views/fragments/ebeMainActions.scala.html b/app/views/fragments/ebeMainActions.scala.html index 9976d17..36c3192 100644 --- a/app/views/fragments/ebeMainActions.scala.html +++ b/app/views/fragments/ebeMainActions.scala.html | |||
@@ -1,5 +1,5 @@ | |||
1 | <div class="pure-u-1 pure-u-lg-1-2"> | 1 | <div class="pure-u-1 pure-u-lg-1-2"> |
2 | <a class="pure-button blue-bg" href="@routes.Sale.sell(null)"> | 2 | <a class="pure-button blue-bg" href="@routes.Sale.sell()"> |
3 | <i class="fa fa-gavel fa-5x"></i> | 3 | <i class="fa fa-gavel fa-5x"></i> |
4 | <span>Sell</span> | 4 | <span>Sell</span> |
5 | </a> | 5 | </a> |
diff --git a/app/views/fragments/forms/labeledTextarea.scala.html b/app/views/fragments/forms/labeledTextarea.scala.html new file mode 100644 index 0000000..a086278 --- /dev/null +++ b/app/views/fragments/forms/labeledTextarea.scala.html | |||
@@ -0,0 +1,4 @@ | |||
1 | @(field: Field, inputType: String, label: String) | ||
2 | |||
3 | @views.html.fragments.forms.inputLabel(field, label) | ||
4 | @views.html.fragments.forms.textarea(field, label) | ||
diff --git a/app/views/pages/sales/currentSales.scala.html b/app/views/pages/sales/currentSales.scala.html index 30cea78..bb1851c 100644 --- a/app/views/pages/sales/currentSales.scala.html +++ b/app/views/pages/sales/currentSales.scala.html | |||
@@ -26,9 +26,9 @@ | |||
26 | <tbody> | 26 | <tbody> |
27 | @for(sale <- sales) { | 27 | @for(sale <- sales) { |
28 | <tr> | 28 | <tr> |
29 | <td>@sale.endDate</td> | 29 | <td>@sale.endDate.get</td> |
30 | <td><a href="@routes.Sale.item(sale.itemUuid.get)">@sale.itemName</a></td> | 30 | <td><a href="@routes.Sale.item(sale.itemUuid.get)">@sale.itemName</a></td> |
31 | <td>@if(sale.bestOffer.isDefined) {@sale.bestOffer} else {sale.initialPrice} €</td> | 31 | <td>@if(sale.bestOffer.isDefined) {@sale.bestOffer} else {@sale.initialPrice} €</td> |
32 | </tr> | 32 | </tr> |
33 | } | 33 | } |
34 | </tbody> | 34 | </tbody> |
diff --git a/app/views/pages/sales/sellForm.scala.html b/app/views/pages/sales/sellForm.scala.html new file mode 100644 index 0000000..d3988ba --- /dev/null +++ b/app/views/pages/sales/sellForm.scala.html | |||
@@ -0,0 +1,34 @@ | |||
1 | @(saleForm: Form[SaleData])(implicit request: AuthRequest[AnyContent], flash: Flash, token: play.filters.csrf.CSRF.Token) | ||
2 | |||
3 | @templates.ebe("Sell")(request.account) { | ||
4 | |||
5 | <div class="pure-g"> | ||
6 | <div class="pure-u-1 pure-u-lg-1-2 centered"> | ||
7 | |||
8 | <h2>Sell a new item</h2> | ||
9 | |||
10 | @views.html.fragments.forms.globalErrors(saleForm) | ||
11 | |||
12 | @helper.form(action = routes.Sale.sellSubmit(), 'class -> "pure-form pure-form-stacked") { | ||
13 | |||
14 | @helper.CSRF.formField | ||
15 | |||
16 | <fieldset> | ||
17 | @views.html.fragments.forms.labeledField(saleForm("name"), "text", "Item name") | ||
18 | @views.html.fragments.forms.labeledField(saleForm("shortDescription"), "text", "Short description") | ||
19 | @views.html.fragments.forms.labeledTextarea(saleForm("longDescription"), "text", "Long description") | ||
20 | </fieldset> | ||
21 | |||
22 | <fieldset> | ||
23 | @views.html.fragments.forms.labeledField(saleForm("endDate"), "date", "End date") | ||
24 | @views.html.fragments.forms.labeledField(saleForm("initialPrice"), "number", "Initial price") | ||
25 | </fieldset> | ||
26 | |||
27 | <button type="submit" class="pure-button pure-input-1 pure-button-primary">Save</button> | ||
28 | |||
29 | } | ||
30 | |||
31 | </div> | ||
32 | </div> | ||
33 | |||
34 | } | ||
diff --git a/conf/routes b/conf/routes index c245163..903480d 100644 --- a/conf/routes +++ b/conf/routes | |||
@@ -42,10 +42,10 @@ GET /item/:uuid controllers.Sale.item(uuid) | |||
42 | GET /item/:uuid/bids controllers.Sale.bids(uuid) | 42 | GET /item/:uuid/bids controllers.Sale.bids(uuid) |
43 | POST /item/:uuid/bids controllers.Sale.bids(uuid) | 43 | POST /item/:uuid/bids controllers.Sale.bids(uuid) |
44 | 44 | ||
45 | GET /sell controllers.Sale.sell(itemUuid = null) | 45 | GET /sell controllers.Sale.sell |
46 | GET /sell/:uuid controllers.Sale.sell(uuid) | 46 | #GET /sell/:uuid controllers.Sale.sell(uuid) |
47 | POST /sell controllers.Sale.sell(itemUuid = null) | 47 | POST /sell controllers.Sale.sellSubmit |
48 | POST /sell/:uuid controllers.Sale.sell(uuid) | 48 | #POST /sell/:uuid controllers.Sale.sell |
49 | 49 | ||
50 | # Cheat console | 50 | # Cheat console |
51 | POST /console controllers.Console.console | 51 | POST /console controllers.Console.console |