pyc-website
main website for pyc inc.
git clone https://9o.is/git/pyc-website.git
commit 4530d5c34222fd5018b82b2e59bff587866ecedd parent 77f1009a3b6f2d95589126ab9f29128b0c840abb Author: Jul <jul@9o.is> Date: Sun, 6 Apr 2014 02:32:20 -0400 changed front page and fixed form roundtrips after implementing ui-router Diffstat:
19 files changed, 427 insertions(+), 141 deletions(-)
diff --git a/src/main/scala/com/pyd/config/Site.scala b/src/main/scala/com/pyd/config/Site.scala @@ -30,8 +30,9 @@ object Site extends Locs { // locations (for top group) val home = MenuLoc(Menu.i("Home") / "index") - val applyATM = MenuLoc(Menu.i("Apply for Bitcoin ATM") / "apply-atm" >> TopBarGroup >> UiRouterGroup) - val locations = MenuLoc(Menu.i("Locations") / "locations" >> TopBarGroup >> SiteMapGroup >> UiRouterGroup) + val applyATM = MenuLoc(Menu.i("Apply for Bitcoin ATM") / "apply-atm" >> TopBarGroup >> UiRouterGroup >> UiRouterController("AtmApplicationCtrl")) + val locations = MenuLoc(Menu.i("Locations") / "locations" >> TopBarGroup >> SiteMapGroup >> UiRouterGroup >> UiRouterController("NearAtmNotifyCtrl")) + val whatsBitcoin = MenuLoc(Menu.i("What Is Bitcoin") / "whatisbitcoin" >> SiteMapGroup >> UiRouterGroup) val about = MenuLoc(Menu.i("About Us") / "about" >> TopBarGroup >> SiteMapGroup >> UiRouterGroup) val blog = MenuLoc(Menu.i("Blog") / "blog" >> TopBarGroup >> RedirectBlog >> SiteMapGroup) val faqs = MenuLoc(Menu.i("FAQs") / "faqs" >> TopBarGroup >> SiteMapGroup >> UiRouterGroup) @@ -53,6 +54,7 @@ object Site extends Locs { home.menu, applyATM.menu, locations.menu, + whatsBitcoin.menu, about.menu, blog.menu, faqs.menu, diff --git a/src/main/scala/com/pyd/lib/NgUIRouter.scala b/src/main/scala/com/pyd/lib/NgUIRouter.scala @@ -6,7 +6,7 @@ import net.liftweb._ import sitemap._ import common._ import http._ -import sitemap.Loc.LocGroup +import sitemap.Loc.{LocGroup, AnyLocParam} import util._ import Helpers._ import net.liftmodules.extras.SnippetHelper @@ -32,6 +32,8 @@ object NgUIRouterFactory extends Factory { */ val UiRouterGroup = LocGroup("uirouter") + case class UiRouterController(controller: String) extends AnyLocParam + /* Finds menu items that are in UiRouterGroup group. */ private def findRoutes = LiftRules.siteMap map { _.locForGroup(UiRouterGroup.group.head).map(_.menu) @@ -60,11 +62,19 @@ trait NgUIRouterSnip extends SnippetHelper { app+".config(function($stateProvider, $urlRouterProvider) {"+ otherwise+"$stateProvider"+ routes.vend.map { menu => - val url: String = S.contextPath+menu.loc.calcDefaultHref - val state: String = url.replace('/', '.').tail + + def controller: Option[String] = menu.loc.allParams. + filter(_.isInstanceOf[UiRouterController]). + map(_.asInstanceOf[UiRouterController].controller).headOption + + def url: String = S.contextPath+menu.loc.calcDefaultHref + def state: String = url.replace('/', '.').tail + ".state('"+state+"',{url:'"+url+"',views:"+ - "{'viewA':{templateUrl:'"+url+".html?ajax'}}})" + "{'viewA':{templateUrl:'"+url+".html?ajax'}}"+ + controller.map(",controller:'"+_+"'").getOrElse("")+ + "})" }.mkString+ ";});" } @@ -116,7 +126,7 @@ trait NgUIRouterMenu extends SnippetHelper { link <- loc.createDefaultLink } yield { - def uiSref(el: Elem) = { + def uiSref(el: Elem): Elem = { import NgUIRouterFactory._ if(loc.inGroup_?(UiRouterGroup.group.head)) el % ("ui-sref" -> link.toString.replace('/', '.').tail) @@ -131,6 +141,19 @@ trait NgUIRouterMenu extends SnippetHelper { options.headOption getOrElse NodeSeq.Empty } + def item: CssSel = { + val options = (for { + name: String <- S.attr("name") ?~ "Item name not specified" + } yield for { + loc <- SiteMap.findAndTestLoc(name) + link <- loc.createDefaultLink + } yield { + "* [ui-sref]" #> link.toString.replace('/', '.').tail & + "* [href]" #> link + }) openOr Empty + options + } + /** * Produces a menu UL from a group, for use with Bootstrap. */ diff --git a/src/main/scala/com/pyd/model/SearchedPostal.scala b/src/main/scala/com/pyd/model/SearchedPostal.scala @@ -0,0 +1,45 @@ +package com.pyd +package model + +import lib.RogueMetaRecord +import field.USStatesField + +import net.liftweb._ +import mongodb.record._ +import mongodb.record.field.ObjectIdPk +import record.field._ + +class SearchedPostal private () extends MongoRecord[SearchedPostal] with ObjectIdPk[SearchedPostal] { + def meta = SearchedPostal + + /* The total amount of times postal code was searched. */ + object total extends IntField(this) + + /* The postal code that was searched. */ + object postal extends PostalCodeField(this, meta.usa) + + override def save = { + val qry = SearchedPostal.find(this) + + if(qry.get().isDefined) { + qry.modify(_.total inc 1).updateOne() + this + } else + total(total.get + 1) + super.save + } +} + +object SearchedPostal extends SearchedPostal with RogueMetaRecord[SearchedPostal] { + import mongodb.BsonDSL._ + + override def collectionName = "atm.find" + + ensureIndex((postal.name -> 1), true) + + def find(postal: SearchedPostal) = this.where(_.postal eqs postal.postal.get) + + object usa extends CountryField(SearchedPostal.createRecord) { + override def defaultValue = Countries.USA + } +} +\ No newline at end of file diff --git a/src/main/scala/com/pyd/snippet/AngularSnips.scala b/src/main/scala/com/pyd/snippet/AngularSnips.scala @@ -0,0 +1,82 @@ +package com.pyd +package snippet + +import xml._ +import net.liftweb._ +import util._ +import Helpers._ +import common._ +import json.JsonAST._ +import http._ +import js._ +import JsCmds._ +import JE.JsVar + +/** + * Snippet classes with AngularJs server-side code need to extend trait. + * Its js function will be called at the end of Body element if it is added + * to AngularServerSide's 'snips' FactoryMaker. + */ +trait AngularSnippet { + def roundTrips: RoundTripInfo +} + +/** + * Place this snippet at the end of your end of Body + * + * <script data-lift="AngularServerSide.js"></script> + */ +class AngularServerSide extends Factory { + + /* All AngularJs server-side snippets. */ + private val snips = new FactoryMaker[List[AngularSnippet]](List( + new SearchedPostalSnip, + new AtmApplicationSnip, + new NearAtmNotifySnip + )) {} + + def js: CssSel = + "* *" #> (for { + sess <- S.session + } yield { + def roundTrips: List[RoundTripInfo] = snips.vend.map(_.roundTrips) + + val script = SetExp(JsVar("window", "backend"), + sess.buildRoundtrip(List[RoundTripInfo](roundTrips: _*))) + script + }) +} + +/** + * Builds Alert JSON messages for server-side responses. + */ +object NgAlert extends Logger { + + private def msgBox(msgType: String, msg: NodeSeq): JValue = + JObject(List( + JField("msg_type", JString(msgType)), + JField("msg", JString(msg.toString)))) + + def success(msg: NodeSeq): JValue = msgBox("success", msg) + def success(msg: String): JValue = success(Text(msg)) + def success: JValue = success(Text("")) + + def danger(msg: NodeSeq, errors: List[FieldError]): JValue = { + debug(errors) + + msgBox("danger", msg ++ + errors.foldLeft(<ul></ul>)((el,err) => el.copy(child = el.child :+ <li>{err.msg}</li>))) + } + + def danger(msg: String, errors: List[FieldError] = Nil): JValue = danger(Text(msg), errors) + def danger: JValue = danger(Text(""), Nil) + + def info(msg: NodeSeq): JValue = msgBox("info", msg) + def info(msg: String): JValue = info(Text(msg)) + def info: JValue = info(Text("")) + + def warning(msg: NodeSeq): JValue = msgBox("warning", msg) + def warning(msg: String): JValue = warning(Text(msg)) + def warning: JValue = warning(Text("")) + +} +\ No newline at end of file diff --git a/src/main/scala/com/pyd/snippet/AtmApplicationSnip.scala b/src/main/scala/com/pyd/snippet/AtmApplicationSnip.scala @@ -14,7 +14,7 @@ import JsCmds._ import SHtml._ import JE.JsVar -class AtmApplicationSnip { +class AtmApplicationSnip extends AngularSnippet { def save(model: JValue): JValue = { val rec = AtmApplication.createRecord @@ -37,12 +37,8 @@ class AtmApplicationSnip { } } - def render: CssSel = { - for (sess <- S.session) { - val script = SetExp(JsVar("window", "backend"), sess.buildRoundtrip(List[RoundTripInfo]("save" -> save _))) - S.appendGlobalJs(script) - } - + def render: CssSel = "@state" #> select(USStates.options, Empty, USStates.stateSelect, "name" -> "state") - } + + override def roundTrips = ("saveAtmApplication" -> save _) } \ No newline at end of file diff --git a/src/main/scala/com/pyd/snippet/NearAtmNotifySnip.scala b/src/main/scala/com/pyd/snippet/NearAtmNotifySnip.scala @@ -14,7 +14,7 @@ import JsCmds._ import SHtml._ import JE.JsVar -class NearAtmNotifySnip { +class NearAtmNotifySnip extends AngularSnippet { def save(model: JValue): JValue = { val rec = NearAtmNotify.createRecord @@ -41,12 +41,8 @@ class NearAtmNotifySnip { } } - def render: CssSel = { - for (sess <- S.session) { - val script = SetExp(JsVar("window", "backend"), sess.buildRoundtrip(List[RoundTripInfo]("save" -> save _))) - S.appendGlobalJs(script) - } - + def render: CssSel = "@state" #> select(USStates.options, Empty, USStates.stateSelect, "name" -> "state") - } + + override def roundTrips = ("saveNearAtmNotify" -> save _) } \ No newline at end of file diff --git a/src/main/scala/com/pyd/snippet/NgAlert.scala b/src/main/scala/com/pyd/snippet/NgAlert.scala @@ -1,35 +0,0 @@ -package com.pyd -package snippet - -import xml._ -import net.liftweb._ -import util._ -import common._ -import json.JsonAST._ - -object NgAlert extends Logger { - - private def msgBox(msgType: String, msg: NodeSeq): JValue = - JObject(List( - JField("msg_type", JString(msgType)), - JField("msg", JString(msg.toString)))) - - def success(msg: NodeSeq): JValue = msgBox("success", msg) - def success(msg: String): JValue = success(Text(msg)) - - def danger(msg: NodeSeq, errors: List[FieldError]): JValue = { - debug(errors) - - msgBox("danger", msg ++ - errors.foldLeft(<ul></ul>)((el,err) => el.copy(child = el.child :+ <li>{err.msg}</li>))) - } - - def danger(msg: String, errors: List[FieldError] = Nil): JValue = danger(Text(msg), errors) - - def info(msg: NodeSeq): JValue = msgBox("info", msg) - def info(msg: String): JValue = info(Text(msg)) - - def warning(msg: NodeSeq): JValue = msgBox("warning", msg) - def warning(msg: String): JValue = warning(Text(msg)) - -} -\ No newline at end of file diff --git a/src/main/scala/com/pyd/snippet/SearchedPostalSnip.scala b/src/main/scala/com/pyd/snippet/SearchedPostalSnip.scala @@ -0,0 +1,40 @@ +package com.pyd +package snippet + +import model._ +import field._ +import xml._ +import net.liftweb._ +import common._ +import json.JsonAST._ +import util._ +import Helpers._ +import http._ +import js._ +import JsCmds._ +import SHtml._ +import JE.JsVar + +class SearchedPostalSnip extends AngularSnippet { + + def search(model: JValue): JValue = { + val rec = SearchedPostal.createRecord + rec.setFieldsFromJValue(model) + + rec.validate match { + case Nil => + rec.save + NgAlert.success + case errors => + NgAlert.danger( + <div> + <i class="fa-fw fa fa-thumbs-o-down"></i> + <strong>{"Something went wrong. We apologize for the inconvenience."}</strong> + </div>, + errors + ) + } + } + + override def roundTrips = ("searchAtmPostalCode" -> search _) +} +\ No newline at end of file diff --git a/src/main/webapp/app/App.js b/src/main/webapp/app/App.js @@ -45,7 +45,7 @@ app.controller('FormCtrl', ['$scope', '$rootScope', function($scope, $rootScope) $scope.stateSuccessError = function(el) { return "{'state-error':form."+el+".$invalid && !form."+el+".$pristine,'state-success':form."+el+".$valid && !form."+el+".$pristine}"; }; - + $scope.save = function() { $scope.loading = true; window.backend.save($scope.model).then(function(alert) { @@ -70,11 +70,66 @@ app.controller('FormCtrl', ['$scope', '$rootScope', function($scope, $rootScope) app.controller('NearAtmNotifyCtrl', ['$scope', '$controller', '$rootScope', function($scope, $controller, $rootScope) { $controller('FormCtrl', {$scope: $scope, $rootScope: $rootScope}); $scope.zip_code_regex = ZIP_CODE_REGEXP; + + $scope.save = function() { + $scope.loading = true; + window.backend.saveNearAtmNotify($scope.model).then(function(alert) { + $scope.$apply(function() { + $scope.loading = false; + if(alert.msg_type === "success") { + $rootScope.$broadcast('alertDialog', alert); + $scope.reset(); + } else { + $rootScope.$broadcast('alertDialog', alert); + } + }); + }); + }; }]); app.controller('AtmApplicationCtrl', ['$scope', '$controller', '$rootScope', function($scope, $controller, $rootScope) { $controller('FormCtrl', {$scope: $scope, $rootScope: $rootScope}); $scope.url_regex = UNSAFE_URL_REGEXP; + + $scope.save = function() { + $scope.loading = true; + window.backend.saveAtmApplication($scope.model).then(function(alert) { + $scope.$apply(function() { + $scope.loading = false; + if(alert.msg_type === "success") { + $rootScope.$broadcast('alertDialog', alert); + $scope.reset(); + } else { + $rootScope.$broadcast('alertDialog', alert); + } + }); + }); + }; +}]); + +app.controller('FindAtmCtrl', ['$scope', '$state', '$rootScope', function($scope, $state, $rootScope) { + $scope.zip_code_regex = ZIP_CODE_REGEXP; + $scope.model = {}; + + $scope.search = function() { + $scope.loading = true; + window.backend.searchAtmPostalCode($scope.model).then(function(alert) { + $scope.$apply(function() { + $scope.loading = false; + if(alert.msg_type === "success") { + $state.go('locations'); + $scope.reset(); + } else { + $rootScope.$broadcast('alertDialog', alert); + } + }); + }); + }; + + $scope.reset = function() { + $scope.zip_code = {}; + $scope.form.$setPristine(); + }; }]); app.controller('GMapCtrl', ['$scope', function($scope) { @@ -89,11 +144,4 @@ app.controller('GMapCtrl', ['$scope', function($scope) { }, zoom: $scope.zoom }; - - $scope.formWindow = { - coord: { - latitude: $scope.lat - 0.038228, - longitude: $scope.long + 0.106745 - } - }; }]); \ No newline at end of file diff --git a/src/main/webapp/apply-atm.html b/src/main/webapp/apply-atm.html @@ -2,9 +2,9 @@ <div id="content-index" class="row no-gutter"> - <div class="col-xs-12 col-sm-6 col-md-4 col-lg-4"> + <div id="applyatm-index" class="col-xs-12 col-sm-6 col-md-4"> <div class="row"> - <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12"> + <div class="col-xs-12"> <h1 class="semibig-text text-primary"> Are you a merchant? Apply for a Bitcoin ATM! <br/> @@ -14,7 +14,7 @@ </div> <div class="row"> - <div id="atm-benefits" class="col-xs-12 col-sm-12 col-md-12 col-lg-12 text-primary padding-20"> + <div id="atm-benefits" class="col-xs-12 text-primary padding-20"> <table> <tr> <td><i class="fa fa-wrench fa-4x"></i></td> @@ -37,7 +37,7 @@ </div> <div class="row"> - <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12"> + <div class="col-xs-12"> <div class="page-content text-primary"> <h1>Bitcoin ATM Application</h1> </div> @@ -45,82 +45,97 @@ </div> <div class="row"> - <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12"> + <div class="col-xs-12"> <span data-lift="embed?what=/templates-hidden/parts/apply-atm-form"></span> </div> </div> </div> - <div class="col-xs-12 col-sm-6 col-md-4 col-lg-4 bg-secondary-gradient"> - <div class="row"> - <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12"> - <h1 class="semibig-text text-white"> - Find ATM Locations - </h1> - </div> - </div> - - <div class="padding-20"> - <div class="row"> - <div class="col-xs-5"> - <input type="text" class="form-control input-lg" placeholder="zip code"> - </div> - <div class="col-xs-3"> - <button type="button" class="btn btn-primary btn-lg btn-block">Find ATM</button> - </div> - </div> - <div class="row"> - <div class="col-xs-12"> - <span class="help-block text-white">Find nearby ATMs by searching with your zip code.</span> + <div class="col-xs-12 col-sm-6 col-md-8 no-padding"> + <div class="row semi-content-index"> + <div id="buysell-index" class="col-xs-12"> + <div class="jumbotron"> + <h1>Buy Bitcoin Instantly!</h1> + <p> + We provide Bitcoin services that are safe and secure, easy to use and user-friendly. + Sign up to buy and sell Bitcoin today. + </p> + <p> + <a class="btn btn-primary btn-lg" role="button">Free Sign Up Today</a> + </p> </div> </div> </div> - <div class="row"> - <div class="col-xs-12"> - <img src="http://maps.googleapis.com/maps/api/staticmap?center=40.736755,-74.033353&zoom=13&size=360x240&sensor=false" style="width:100%"> - </div> - </div> - - <div class="row"> - <div class="col-xs-12"> - <img src="/img/skyhook.png" style="width:100%"> - </div> - </div> - </div> - - <div class="col-xs-12 col-sm-12 col-md-4 col-lg-4 bg-primary-gradient text-white"> - <div class="row"> - <div class="col-xs-12"> - <h1 class="semibig-text text-white"> - Who We Are - </h1> - </div> - </div> - - <div class="row"> - <div class="col-xs-12"> - <h4> - PYD is an ATM service operator for the bitcoin currency. - <small> - We enable customers to retrieve bitcoin instantly, just as they retrieve cash from a bank ATM. - </small> - </h4> - </div> - </div> - - <div id="atm-bitcoin-video" class="row" ng-cloak> - <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12"> - <div class="page-content"> - <h1>What is Bitcoin?</h1> + <div class="row semi-content-index"> + <div id="findatm-index" class="col-sm-12 col-md-6 bg-secondary-gradient"> + <div class="row"> + <div class="col-xs-12"> + <h1 class="semibig-text text-white">Find ATM Locations</h1> + </div> + </div> + + <div class="padding-20"> + <span data-lift="embed?what=/templates-hidden/parts/find-atm-form"></span> + </div> + + <div class="row"> + <div class="col-xs-12"> + <img + src="http://maps.googleapis.com/maps/api/staticmap?center=40.736755,-74.033353&zoom=13&size=360x240&sensor=false" + style="width: 100%"> + </div> + </div> + + <div class="row"> + <div class="col-xs-12 text-white padding-20"> + <h4>We're in the process of finding a bussiness in the + Hoboken, NJ area to host a Bitcoin ATM.</h4> + </div> </div> </div> - <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12"> - <iframe src="//www.youtube.com/embed/LP4GSvQUtBw" frameborder="0" allowfullscreen></iframe> + + <div id="whoweare-index" class="col-sm-12 col-md-6 bg-primary-gradient text-white"> + <div class="row"> + <div class="col-xs-12"> + <h1 class="semibig-text text-white">Who We Are</h1> + </div> + </div> + + <div class="row"> + <div class="col-xs-12"> + <h4> + PYD is an ATM service operator for the bitcoin currency. <small + class="text-white"> We enable customers to retrieve + bitcoin instantly, just as they retrieve cash from a bank ATM. + </small> + </h4> + <br> + <a data-lift="Menus.item?name=About Us" class="btn btn-primary" type="button">Learn More About Us</a> + </div> + </div> + + <div id="atm-bitcoin-video" class="row" ng-cloak> + <div class="col-xs-12 padding-top-20"> + <div class="page-content"> + <h1>What is Bitcoin?</h1> + </div> + </div> + <div class="col-xs-12 padding-bottom-20"> + <a data-lift="Menus.item?name=What Is Bitcoin" type="button" class="btn btn-default btn-lg btn-block"> + <small>Click Here to </small><strong>Understand</strong><br> + <img src="/img/bitcoin_logo.png" style="width: 100%"></img> + </a> + </div> + <div class="col-xs-12"> + <iframe src="//www.youtube.com/embed/LP4GSvQUtBw" frameborder="0" + allowfullscreen></iframe> + </div> + </div> + </div> </div> - </div> </div> diff --git a/src/main/webapp/img/bitcoin_logo.png b/src/main/webapp/img/bitcoin_logo.png Binary files differ. diff --git a/src/main/webapp/less/custom.less b/src/main/webapp/less/custom.less @@ -107,10 +107,26 @@ color: @white !important; } +.text-bitcoin { + color: @bitcoin-color; +} + .bg-tertiary { background-color: @brand-tertiary; } .pagination-centered { text-align: center; +} + +.padding-top-20 { + padding-top: 20px; +} + +.padding-bottom-20 { + padding-bottom: 20px; +} +.padding-20 { + padding-top: 20px; + padding-bottom: 20px; } \ No newline at end of file diff --git a/src/main/webapp/less/pages/index.less b/src/main/webapp/less/pages/index.less @@ -1,14 +1,42 @@ #content-index { - & > div[class^="col-"] { + & > div[class^="col-"], .semi-content-index > div[class^="col-"] { padding-left: 30px; padding-right: 30px; } - .padding-20 { - padding-top: 20px; - padding-bottom: 20px; + @index-page-height: 1025px; + @buysell-height: 275px; + + @media(max-width: @screen-sm-max) { + #applyatm-index { + min-height: 0; + } + + #buysell-index { + min-height: 0; + } + + #whoweare-index, #findatm-index { + min-height: 0; + } } + @media(min-width: @screen-md) { + #applyatm-index { + min-height: @index-page-height; + } + + #buysell-index { + min-height: @buysell-height; + } + + #whoweare-index, #findatm-index { + min-height: @index-page-height - @buysell-height; + } + } + + + #atm-benefits { td { height: 70px; } } diff --git a/src/main/webapp/less/styles.less b/src/main/webapp/less/styles.less @@ -37,7 +37,7 @@ //@import "@{BootstrapPath}/pager.less"; @import "@{BootstrapPath}/labels.less"; //@import "@{BootstrapPath}/badges.less"; - //@import "@{BootstrapPath}/jumbotron.less"; +@import "@{BootstrapPath}/jumbotron.less"; @import "@{BootstrapPath}/thumbnails.less"; @import "@{BootstrapPath}/alerts.less"; //@import "@{BootstrapPath}/progress-bars.less"; diff --git a/src/main/webapp/less/variables.less b/src/main/webapp/less/variables.less @@ -61,6 +61,7 @@ @brand-warning: @orange; @brand-danger: @red; @brand-info: @blue; +@bitcoin-color: @orange; // Scaffolding // ------------------------- diff --git a/src/main/webapp/templates-hidden/base-wrap.html b/src/main/webapp/templates-hidden/base-wrap.html @@ -57,7 +57,8 @@ <script type="text/javascript" src="http://code.jquery.com/jquery-2.1.0.min.js"></script> <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAehyKUHOOWL_plRJCW8R1EdCIKCfR9jkg&sensor=true"></script> -<script data-lift="Assets.js"></script> -<script data-lift="NgUIRouter.js?ngApp=app"></script> +<script data-lift="Assets.js" type="text/javascript"></script> +<script data-lift="NgUIRouter.js?ngApp=app" type="text/javascript"></script> +<script data-lift="AngularServerSide.js" type="text/javascript"></script> </body> </html> diff --git a/src/main/webapp/templates-hidden/parts/find-atm-form.html b/src/main/webapp/templates-hidden/parts/find-atm-form.html @@ -0,0 +1,22 @@ +<div ng-controller="FindAtmCtrl" ng-cloak> + <form name="form" class="smart-form client-form" ng-submit="search()" novalidate> + <div class="row"> + <div class="col-xs-5"> + <section> + <label class="input"> + <input name="postal" ng-model="model.postal" type="text" placeholder="zip code" ng-pattern="zip_code_regex" required> + </label> + </section> + </div> + <div class="col-xs-3 col-md-4"> + <button type="submit" class="btn btn-primary btn-sm btn-block" ng-disabled="form.$invalid" disabler ng-model="loading">Find ATM</button> + </div> + </div> + <div class="row"> + <div class="col-xs-12" style="margin-top:-10px;"> + <span class="ng-hide help-block text-white" ng-show="form.postal.$error.pattern">Zip code is not valid</span> + <span class="help-block text-white">Find nearby ATMs by searching with your zip code.</span> + </div> + </div> + </form> +</div> +\ No newline at end of file diff --git a/src/main/webapp/templates-hidden/parts/notify-atm-form.html b/src/main/webapp/templates-hidden/parts/notify-atm-form.html @@ -51,5 +51,4 @@ <button type="submit" class="btn btn-primary" ng-disabled="form.$invalid" disabler ng-model="loading">Notify Me</button> </footer> </form> - </div> \ No newline at end of file diff --git a/src/main/webapp/whatisbitcoin.html b/src/main/webapp/whatisbitcoin.html @@ -0,0 +1,3 @@ +<div data-lift="NgUIRouter.surround?withAjax=no-base-default&with=base-default&at=content"> + content for what is bitcoin goes here +</div> +\ No newline at end of file