Permalink
Browse files

Fotoalbum Feature begonnen: Formular und Menü designed und Feature/Sz…

…enario geschrieben und teilweise implementiert
  • Loading branch information...
KyleRogers committed Sep 19, 2013
1 parent 9e82dab commit 0d8c469a277237ecc2a4b953a0922829f08bbad4
@@ -32,14 +32,23 @@ body, label, h1, h2, h3, input {
}
}
+#navigation ul {
+ margin-top: 130px;
+}
+
+#navigation ul li {
+ list-style: none;
+ margin: 20px 0;
+}
+
#heading {
margin-bottom: 80px;
}
#content {
padding: @default-padding;
margin-left: @left-bar-width;
- width: @total-width - @left-bar-width - 350;
+ width: @total-width - @left-bar-width - 350px;
@media print {
margin-left: 0;
}
@@ -64,6 +73,10 @@ body, label, h1, h2, h3, input {
list-style: circle;
}
+input[type="file"][id="bildDatei"] {
+ width:auto;
+}
+
#footer {
clear: both;
@@ -82,3 +95,6 @@ form .error .help-block, form .error .help-inline {
color: #B94A48;
}
+hr.separator {
+ border-color: -moz-use-text-color -moz-use-text-color @default-color;
+}
@@ -0,0 +1,33 @@
+package controllers
+
+import play.api.mvc.Controller
+import jp.t2v.lab.play2.auth.AuthenticationElement
+
+/**
+ *
+ * @author Stefan Penndorf <stefan@cyphoria.net>
+ */
+object FotoVorfuehrer extends Controller with AuthenticationElement with WeddingAuthConfig {
+
+ def fotoalben = StackAction{ implicit request =>
+ Ok(views.html.fotoalben())
+ }
+
+ def hochladen = StackAction(parse.multipartFormData){ implicit request =>
+ request.body.file("bilddatei").map { picture =>
+// import java.io.File
+// val filename = picture.filename
+// val contentType = picture.contentType
+// picture.ref.moveTo(new File("/tmp/picture"))
+ Redirect(routes.FotoVorfuehrer.fotoalben).flashing(
+ "erfolgsMeldung" -> "Bild erfolgreich zu deinem Album hinzugefügt."
+ )
+ }.getOrElse {
+ Redirect(routes.FotoVorfuehrer.fotoalben).flashing(
+ "fehlerMeldung" -> "Keine Datei ausgewählt."
+ )
+ }
+ }
+
+
+}
View
@@ -0,0 +1,11 @@
+package model
+
+import anorm.{NotAssigned, Pk}
+
+/**
+ *
+ * @author Stefan Penndorf <stefan@cyphoria.net>
+ */
+case class Fotoalbum(id: Pk[Long] = NotAssigned) {
+
+}
@@ -0,0 +1,53 @@
+@()(implicit flash: Flash)
+
+@import helper._
+@import helper.twitterBootstrap._
+
+@main(heading="Fotoalben") {
+<div>
+ <h3>Hochladen</h3>
+
+ Hier kannst du deinem Fotoalbum ein (weiteres) Bild hinzufügen. Das Bild wird dann für alle registrierten Gäste
+ sichtbar.
+
+ @form(action = routes.FotoVorfuehrer.hochladen, 'id -> "fotohochladeformular", 'enctype -> "multipart/form-data") {
+ @if(flash.get("erfolgsMeldung").isDefined) {
+ <div id="erfolgsMeldungen">
+ <ul>
+ <li class="alert-message success">@flash.get("erfolgsMeldung").get</li>
+ </ul>
+ </div>
+ }
+ @if(flash.get("fehlerMeldung").isDefined) {
+ <div id="fehlerMeldungen">
+ <ul>
+ <li class="alert-message error">@flash.get("fehlerMeldung").get</li>
+ </ul>
+ </div>
+ }
+
+ <fieldset>
+ <div class="clearfix">
+ <label for="bilddatei">Bild ausw&auml;hlen:</label>
+ <div class="input">
+ <input type="file" size="50" name="bilddatei" id="bildDatei">
+ </div>
+ </div>
+ </fieldset>
+ <div class="input"><input type="submit" id="starteHochladen" value="Hochladen"/></div>
+ }
+ <hr class="separator" />
+ <h3>Fotoalben</h3>
+ <div>
+ Folgende Benutzer haben bereits ein Fotoalbum angelegt:
+
+ <ul id="fotoalben">
+ <!--<li><a href="mara">Mara (5 Bilder)</a></li>-->
+ </ul>
+
+
+ </div>
+
+</div>
+
+}
@@ -1,4 +1,4 @@
-@main(heading="Impressum") {
+@main(heading="Impressum", displayNavigation=false) {
<div id="impressum">
@@ -3,7 +3,7 @@
@import helper._
@import helper.twitterBootstrap._
-@main(heading="Steffi und Stefan heiraten!") {
+@main(heading="Steffi und Stefan heiraten!", displayNavigation=false) {
<div>
<h3>Login</h3>
@@ -1,4 +1,4 @@
-@(heading: String, title: String = "Steffi und Stefan heiraten!")(content: Html)
+@(heading: String, title: String = "Steffi und Stefan heiraten!", displayNavigation: Boolean = true)(content: Html)
@import _root_.modules._
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
@@ -17,7 +17,7 @@
<body>
<div id="page-content">
<div id="top-header"></div>
- <div id="left-bar"></div>
+ <div id="left-bar">@if(displayNavigation){@navigation()}</div>
<div id="content">
<h1 id="heading">@heading</h1>
@content
@@ -0,0 +1,8 @@
+<div id="navigation">
+ <ul>
+ <li><a id="nav-startseite" href="@routes.VipArea.viparea">Startseite</a></li>
+ <li><a id="nav-fotoalben" href="@routes.FotoVorfuehrer.fotoalben">Fotoalben</a></li>
+ </ul>
+
+
+</div>
@@ -3,7 +3,7 @@
@import helper._
@import helper.twitterBootstrap._
-@main(heading="Als Hochzeitsgast registrieren") {
+@main(heading="Als Hochzeitsgast registrieren", displayNavigation=false) {
@form(action = routes.Registrierung.registrieren, 'id -> "registrierungsformular") {
@if(!registrierungsFormular.globalErrors.isEmpty) {
@@ -4,7 +4,7 @@
Hallo @name, du hast dich erfolgreich registriert.
}
-@main(heading=begruessung.toString) {
+@main(heading=begruessung.toString, displayNavigation=false) {
<div>
Jetzt musst du nur noch deine Freischaltung abwarten. Das Hochzeitspaar wird deine Registrierung entgegen
nehmen und dich m&ouml;glichst bald freischalten. Mit deiner Freischaltung erh&auml;lst du auch ein
View
@@ -3,6 +3,7 @@ nachname=Nachname
email=E-Mail
passwort=Passwort
loginname=E-Mail
+bilddate=Foto
login.error=Die Zugangsdaten sind falsch oder der Zugang ist nicht freigeschaltet.
email.error.used=Die E-Mail-Adresse wird bereits verwendet.
View
@@ -20,7 +20,8 @@ GET /impressum controllers.Application.impressum
# VIP Area
GET /viparea controllers.VipArea.viparea
-
+GET /fotoalben controllers.FotoVorfuehrer.fotoalben
+POST /fotoalben controllers.FotoVorfuehrer.hochladen
# ADMIN Area
GET /gaesteliste @controllers.AdminArea.gaesteliste
@@ -0,0 +1,32 @@
+package net.cyphoria.weddingapp.specification
+
+import net.cyphoria.weddingapp.specification.infrastructure.{Browser, Schritte}
+import cucumber.api.scala.{DE, ScalaDsl}
+import net.cyphoria.weddingapp.specification.seiten.{VipAreaStartSeite, FotoalbenSeite}
+import org.springframework.core.io.ClassPathResource
+
+/**
+ *
+ * @author Stefan Penndorf <stefan@cyphoria.net>
+ */
+class FotoalbumSchritte extends Schritte with ScalaDsl with DE with Browser {
+
+ val bild = new ClassPathResource("images/mara_und_lukas.jpg")
+
+ def fotoalben = browser.createPage(classOf[FotoalbenSeite])
+ def startseite = browser.createPage(classOf[VipAreaStartSeite])
+
+ Angenommen("""^Kerstin ruft die Fotoalben auf$"""){ () =>
+ startseite isAt()
+ startseite geheZuFotoalbum()
+ }
+
+ Wenn("""^sie ein Bild hochlädt$"""){ () =>
+ fotoalben upload bild
+ }
+
+ Dann("""^wird ein Fotoalbum für sie erstellt$"""){ () =>
+ fotoalben oeffneAlbumVon "Kerstin"
+ }
+
+}
@@ -0,0 +1,45 @@
+package net.cyphoria.weddingapp.specification.seiten
+
+import org.fluentlenium.core.FluentPage
+import org.scalatest.matchers.ShouldMatchers
+import org.fluentlenium.core.domain.FluentWebElement
+import java.util.concurrent.TimeUnit
+import com.google.common.base.Predicate
+import org.openqa.selenium.WebDriver
+import org.springframework.core.io.Resource
+
+/**
+ *
+ * @author Stefan Penndorf <stefan@cyphoria.net>
+ */
+class FotoalbenSeite extends FluentPage with ShouldMatchers {
+ var bildDatei: FluentWebElement = null
+ var starteHochladen: FluentWebElement = null
+
+ def oeffneAlbumVon(s: String) {
+ $(s"""#fotoalben a[href*="$s"]""").first.click
+
+ $("img").first() should be ('displayed)
+ }
+
+ def upload(s: Resource) {
+ bildDatei.getElement.sendKeys(s.getURI.toString)
+ submit(starteHochladen)
+
+ await().atMost(3, TimeUnit.SECONDS).until(new Predicate[WebDriver] {
+ def apply(p1: WebDriver): Boolean = {
+ val messages: String = $(".alert-message.success").getText
+ messages != null && messages.contains("Bild erfolgreich zu deinem Album hinzugefügt.")
+ }
+ })
+
+ }
+
+ override def getUrl: String = "/fotoalben"
+
+ override def isAt() {
+ title() should be ("Steffi und Stefan heiraten!")
+ $("h1").getText should equal ("Fotoalben")
+ }
+
+}
@@ -2,16 +2,27 @@ package net.cyphoria.weddingapp.specification.seiten
import org.fluentlenium.core.FluentPage
import org.scalatest.matchers.ShouldMatchers
+import org.fluentlenium.core.annotation.Page
/**
*
* @author Stefan Penndorf <stefan@cyphoria.net>
*/
class VipAreaStartSeite extends FluentPage with ShouldMatchers {
+ @Page
+ var fotoalbum: FotoalbenSeite = null
+
+
+ def geheZuFotoalbum() {
+ $("""#navigation a[id="fotoalbum"]""").click
+ fotoalbum isAt()
+ fotoalbum
+ }
+
override def getUrl: String = "/vip"
- override def isAt {
+ override def isAt() {
title() should be("Steffi und Stefan heiraten!")
$("h1").getText should startWith("Willkommen")
$("body").getText should include("Trauzeugin")
Binary file not shown.
@@ -2,10 +2,13 @@
Funktionalität: Fotoalbum
Die Gäste können Fotoalben anschauen und selbst Bilder in ein Fotoalbum hochladen.
+ Grundlage:
+ Angenommen Kerstin wurde freigeschaltet
+ Und Kerstin hat sich angemeldet
+
@current
Szenario: Fotos können hochgeladen werden.
- Angenommen Kerstin hat sich angemeldet
- Und die Fotoalben aufgerufen
+ Angenommen Kerstin ruft die Fotoalben auf
Wenn sie ein Bild hochlädt
Dann wird ein Fotoalbum für sie erstellt
Und kann sie das Foto anschauen

0 comments on commit 0d8c469

Please sign in to comment.