pyc-website
main website for pyc inc.
git clone https://9o.is/git/pyc-website.git
commit 14107ab4c1d08903fe22c3c54423412aaddd5ebb parent 2d1ef3105720fe6a57f7cd775708222a4586412b Author: Jul <jul@9o.is> Date: Sat, 30 Aug 2014 19:45:10 -0400 user registration only requires email. Registration for purchase limit is more seamless now. Diffstat:
16 files changed, 131 insertions(+), 185 deletions(-)
diff --git a/Gruntfile.js b/Gruntfile.js @@ -7,7 +7,7 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-less'); //grunt.loadNpmTasks('grunt-contrib-htmlmin'); - grunt.loadNpmTasks('grunt-contrib-jasmine'); + //grunt.loadNpmTasks('grunt-contrib-jasmine'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-clean'); grunt.loadNpmTasks('grunt-hash'); @@ -331,7 +331,7 @@ module.exports = function(grunt) { /** * The `test` task runs your tests. */ - grunt.registerTask('test', ['jasmine']); + grunt.registerTask('test', [/*'jasmine'*/]); /** * The `compress` task gets your app ready for deployment by concatenating and diff --git a/src/main/scala/inc/pyc/model/User.scala b/src/main/scala/inc/pyc/model/User.scala @@ -46,6 +46,14 @@ class User private () extends ProtoAuthUser[User] with ObjectIdPk[User] with USA object phoneverified extends BooleanField(this, false) + object driversLicense extends OptionalStringField(this, 50) + + object dob extends OptionalStringField(this, 6) { + override def validations = + valRegex(Pattern.compile("[0-9]{6}"), "Date of Birth should be 6 digits long (xx/xx/xx)") _ :: + super.validations + } + object verifypass extends StringField(this, 15) { override def defaultValue = StringUtils.randomString(15) } @@ -63,10 +71,8 @@ object User extends User with ProtoAuthUserMeta[User] with RogueMetaRecord[User] override def collectionName = "user.users" ensureIndex((email.name -> 1), true) - ensureIndex((username.name -> 1), true) def findByEmail(in: String): Box[User] = find(email.name, in) - def findByUsername(in: String): Box[User] = find(username.name, in) def findByStringId(id: String): Box[User] = if (ObjectId.isValid(id)) find(new ObjectId(id)) @@ -127,7 +133,7 @@ object User extends User with ProtoAuthUserMeta[User] with RogueMetaRecord[User] val token = LoginToken.createRecord.userId(user.id.get).save() val url = "%s%s?token=%s".format(Site.host, MongoAuth.loginTokenUrl.vend, token.id.toString) val title = "Account Login" - val msg = s"Hello ${user.fname.get}, someone requested a link to log in to your account." + val msg = s"Hello, someone requested a link to log in to your account." HtmlEmail.createToken(title, msg, url) map { sendMail( @@ -148,8 +154,7 @@ object User extends User with ProtoAuthUserMeta[User] with RogueMetaRecord[User] val token = LoginToken.createRecord.userId(user.id.get).save() val url = "%s%s?token=%s".format(Site.host, MongoAuth.loginTokenUrl.vend, token.id.toString) val title = "Account Registration" - val msg = s"Hello ${user.fname.get}, thank you for registering" + - " and using bitcoin. Please follow the link to complete your registration." + val msg = s"Thank you for using bitcoin. Please follow the link to complete your registration." HtmlEmail.createToken(title, msg, url) map { sendMail( diff --git a/src/main/scala/inc/pyc/rest/AtmRest.scala b/src/main/scala/inc/pyc/rest/AtmRest.scala @@ -23,10 +23,10 @@ object AtmRest extends RestHelper { */ serve("api" / "atm" prefix { - // /api/atm/{atm_id}/{atm_password}/user/{user_name}/{user_one-time_password}/purchase_limit - case id :: pw :: "user" :: username :: verifyPass :: "purchase_limit" :: Nil JsonGet _ => + // /api/atm/{atm_id}/{atm_password}/user/{user_email}/{user_one-time_password}/purchase_limit + case id :: pw :: "user" :: email :: verifyPass :: "purchase_limit" :: Nil JsonGet _ => authenticate(id, pw, { - authenticateUser(username, verifyPass, { + authenticateUser(email, verifyPass, { user => success("purchase_limit" -> user.userLimitAsInt) }) @@ -39,9 +39,9 @@ object AtmRest extends RestHelper { if atm.secret.isMatch(passwd) } yield f - def authenticateUser(username: String, verifyPass: String, f: User => JValue) = + def authenticateUser(email: String, verifyPass: String, f: User => JValue) = (for { - user <- User.findByUsername(username) + user <- User.findByEmail(email) if user.verifypass.get == verifyPass } yield f(user)) openOr failure("Invalid Verification Credentials") diff --git a/src/main/scala/inc/pyc/rest/IdVerification.scala b/src/main/scala/inc/pyc/rest/IdVerification.scala @@ -40,7 +40,7 @@ object IdVerificationUpload extends RestHelper with Logger { def imgTooLarge(file: FileParamHolder) = file.length > 5243000 /** - * Only allow images of types: jpeg, png, svg + * Only allow images of types: jpeg, png, svg, pdf */ def imgInvalid(file: FileParamHolder) = ! List( "image/jpeg", "image/png", "image/svg+xml", "application/pdf", @@ -102,8 +102,8 @@ object IdVerificationHelper { def createS3Folder(user: User) = { val prefix = if(Props.devMode) "dev/" else "" - prefix + s"%s_%s/%s/%s/".format(user.fname.get, - user.lname.get, user.id.get, new java.util.Date().toString) + prefix + s"%s/%s/%s/".format( + user.email.get, user.id.get, new java.util.Date().toString) } /** @@ -111,18 +111,15 @@ object IdVerificationHelper { * identification to be verified. * @param thirdParty if the user is requesting verification with 3rd party */ - def notifyIdentityRequest(user: User, thirdParty: Boolean = false): Unit = { + def notifyIdentityRequest(user: User): Unit = { import net.liftweb.util.Mailer._ val msgTxt = s""" - |${if(thirdParty) "3RD PARTY VERIFICATION" else ""} |Identity Check Request! - |Full Name: ${user.fname} ${user.lname} |Id: ${user.id.get} - |Limit: ${user.purchaseLimit.get} + |Status: ${user.purchaseLimit.get} |Email: ${user.email.get} - |Username: ${user.username.get} """ sendMail( diff --git a/src/main/scala/inc/pyc/snippet/AdminSnip.scala b/src/main/scala/inc/pyc/snippet/AdminSnip.scala @@ -27,61 +27,42 @@ class VerifyId extends AdminSnip with Logger { "init" -> init _) /** Pending Users */ - val pending = User.or( - _.where(_.purchaseLimit eqs D10k_?)). - fetch - + def pending = User.where(_.purchaseLimit eqs D10k_?).fetch def submit(model: JValue): JValue = for { JBool(accepted) <- model \ "accepted" JString(userId) <- model \ "userId" - user <- pending.filter(_.userIdAsString == userId) + user <- User.find(userId).toList } yield { import net.liftweb.util.Mailer._ - + val fname = user.fname.get - info("Fname: "+fname) val limit = user.purchaseLimit.get - info("Limit: "+limit) - val title = "Identity Verification" + val title = S ? "verification" val settingsUrl = Site.domain+"/settings" - info("title: "+title) - info("settings: "+settingsUrl) val JString(reason) = if(accepted) JString("") else model \ "reason" - - info("Reason: "+reason) - + if(accepted) user.purchaseLimit(D10k) else user.purchaseLimit(D3k) user.update - - info("Limit NOW: "+user.purchaseLimit.get) - + val subtitle = if(accepted) S ? "verify_subtitle_success" format fname else S ? "verify_subtitle_fail" format fname - info("subtitle: "+subtitle) val purchaseLimit = S ? "new_purchase_limit" format user.purchaseLimit.get val settingsUrlText = S ? "setting_url_text" val successPart1 = S ? "verify_body_success_part1" val successPart2 = S ? "verify_body_success_part2" format user.purchaseLimit.get - info("purchaseLimit: "+purchaseLimit) - info("settingsUrlText: "+settingsUrlText) - info("successPart1: "+successPart1) - info("successPart2: "+successPart2) - val body = if(accepted) <div> - {subtitle} - <br/> <h2>{purchaseLimit}</h2> <br/> {successPart1} <a href={settingsUrl}>{settingsUrlText}</a>. @@ -89,9 +70,7 @@ class VerifyId extends AdminSnip with Logger { </div> else Text(S ? "verify_body_fail" format (subtitle, reason, user.purchaseLimit.get)) - - info("body: "+body) - + Future { val html: Box[NodeSeq] = if(accepted) HtmlEmail.simpleMessage(title, subtitle, body) @@ -112,9 +91,6 @@ class VerifyId extends AdminSnip with Logger { ("users" -> JArray(pending.map(user => ("id" -> user.userIdAsString) ~ ("email" -> user.email.get) ~ - ("fname" -> user.fname.get) ~ - ("lname" -> user.lname.get) ~ - ("username" -> user.username.get) ~ ("status" -> user.purchaseLimit.get.toString) ))) } diff --git a/src/main/scala/inc/pyc/snippet/UserSnip.scala b/src/main/scala/inc/pyc/snippet/UserSnip.scala @@ -52,6 +52,12 @@ sealed trait UserSnippet extends SnippetHelper with Logger { def limit(in: NodeSeq): NodeSeq = serve { user => Text(user.purchaseLimit.get.toString) } + + def identifier(in: NodeSeq): NodeSeq = serve { + user => + if(user.fname.get.isEmpty) Text(user.email.get) + else name(in) + } } /** @@ -213,13 +219,11 @@ class UserRegistration extends AngularSnippet { def submit(model: JValue): JValue = { for { JString(e) <- model \ "email" - JString(fname) <- model \ "fname" - JString(lname) <- model \ "lname" - JString(username) <- model \ "username" } yield { val email = e.toLowerCase.trim val user = User.createRecord - user.email(email).fname(fname).lname(lname).username(username) + user.email(email) + user.username(Helpers.randomString(20)) user.password(Helpers.randomString(20)) user.password.hashIt @@ -229,7 +233,7 @@ class UserRegistration extends AngularSnippet { User.sendRegistrationToken(user) NgAlert.success( - <span>{S ? "thanks.title" format user.fname.get}.</span> ++ + <span>{S ? "thanks.title"}.</span> ++ <p>{S ? "thanks.message"}.</p> ) case errors => @@ -242,50 +246,33 @@ class UserRegistration extends AngularSnippet { } } -class UserSettings extends AngularCurrentUser { +class UserSettings extends AngularSnippet { def roundTrips: List[RoundTripInfo] = List( - "init" -> init _, - "fname" -> fname _, - "lname" -> lname _, - "username" -> username _) + "submit" -> submit _) + + def submit(model: JValue): JValue = + for { + JString(id) <- model \ "id" + JString(fname) <- model \ "fname" + JString(lname) <- model \ "lname" + JString(dob) <- model \ "dob" + JString(license) <- model \ "driversLicense" + } yield { - def init(ignore: JValue): JValue = serve { - user => - ("fname" -> user.fname.get) ~ - ("lname" -> user.lname.get) ~ - ("username" -> user.username.get) - } - - def fname(model: JValue): JValue = serve { - user => - for { - JString(fname) <- model - } yield - validateAndUpdate { () => - user.fname(fname) - } - } - - def lname(model: JValue): JValue = serve { - user => - for { - JString(lname) <- model - } yield - validateAndUpdate { () => - user.lname(lname) - } - } - - def username(model: JValue): JValue = serve { - user => - for { - JString(username) <- model - } yield - validateAndUpdate { () => - user.username(username) - } - } + User.findByStringId(id).map { + user => + user. + fname(fname). + lname(lname). + dob(dob). + driversLicense(license). + save() + + NgAlert.success("updated") + + } openOr JNull + } } class UserSettingsEmail extends AngularCurrentUser { @@ -322,11 +309,10 @@ class UserVerifyPassword extends AngularCurrentUser with UserSnippet { def init(ignore: JValue): JValue = serve { user: User => - user.verifypass(StringUtils.randomString(15)).update // set a new password + user.verifypass(StringUtils.randomString(7)).update // set a new password - ("userId" -> user.userIdAsString) ~ ("password" -> user.verifypass.get) ~ - ("limit" -> user.purchaseLimit.get.toString): JValue + ("limit" -> user.userLimitAsString): JValue } def show(in: NodeSeq): NodeSeq = serve { diff --git a/src/main/webapp/app/mycontrollers/VerifyId.js b/src/main/webapp/app/mycontrollers/VerifyId.js @@ -4,19 +4,20 @@ angular.module("VerifyId", ['Forms']) $controller('LoadedFormCtrl', {$scope: $scope, $controller: $controller}); $scope.init('VerifyId', 'init', function() { - $scope.currentUser = $scope.model.users[0]; + $scope.users = angular.copy($scope.model.users); + $scope.currentUser = $scope.users[0]; $scope.response = {}; }); $scope.accept = function() { $scope.response.accepted = true; - $scope.save(); + $scope.setUserData(); }; $scope.reject = function() { $scope.response.accepted = false; - $scope.save(); + $scope.setUserData(); }; $scope.setCurrentUser = function(user, index) { @@ -40,4 +41,17 @@ angular.module("VerifyId", ['Forms']) $scope.submit('VerifyId', 'submit', success, failure, $scope.response); }; + $scope.setUserData = function() { + var success = function(alert) { + $rootScope.$broadcast('alertDialog', alert); + $scope.save(); + }; + + var failure = function(alert) { + $rootScope.$broadcast('alertDialog', alert); + }; + + $scope.submit('UserSettings', 'submit', success, failure, $scope.currentUser); + }; + }]); \ No newline at end of file diff --git a/src/main/webapp/resources-hidden/_resources.html b/src/main/webapp/resources-hidden/_resources.html @@ -30,6 +30,11 @@ <res name="Email_Address">Email Address</res> <res name="username">Username</res> <res name="limit">Limit</res> + <res name="onetime_password">One-time Password</res> + <res name="accept">Accept</res> + <res name="reject">Reject</res> + <res name="dob">DOB</res> + <res name="drivers_license">Driver's License</res> <res name="Forgot_Password">Forgot Password</res> <res name="Stay_Signed_In">Stay signed in</res> <res name="Log_In">Log In</res> @@ -50,6 +55,7 @@ <res name="city">City</res> <res name="website_url">Website URL</res> <res name="phone_number">Phone Number</res> + <res name="verification">Verification</res> <res name="with_text_messaging">with text messaging</res> <res name="sms_code">SMS Code</res> <res name="send_sms_code">Send SMS Code</res> diff --git a/src/main/webapp/resources-hidden/_resources_register.html b/src/main/webapp/resources-hidden/_resources_register.html @@ -1,5 +1,5 @@ <resources> - <res name="thanks.title">Thank you for registering, %s</res> + <res name="thanks.title">Thank you for registering</res> <res name="thanks.message">An email has been sent with instructions for accessing your account</res> <res name="welcome"> <p> @@ -8,7 +8,4 @@ </p> <p>Thank you for being part of that future.</p> </res> - <res name="email_register_tip">You'll use this email when you log in and if you ever need to reset your password</res> - <res name="username_register_tip">You'll use this username to personally identify your account</res> - </resources> \ No newline at end of file diff --git a/src/main/webapp/resources-hidden/_resources_settings.html b/src/main/webapp/resources-hidden/_resources_settings.html @@ -1,7 +1,7 @@ <resources> <res name="Change_Email_Address">Change Email Address</res> <res name="verify_email_msg">An email has been sent for verification.</res> - <res name="purchase_verification_title">Bitcoin Purchase Limit Verification</res> + <res name="purchase_verification_title">BTM Verification</res> <res name="purchase_limit_note"> To take advantage of your {{ model.limit }} bitcoin purchase limit, use these credentials to authenticate with the BTM. diff --git a/src/main/webapp/settings.html b/src/main/webapp/settings.html @@ -1,10 +1,15 @@ <div data-lift="surround?with=settings-wrap&at=content"> - <div class="padding-20"> + <div> <div class="row"> - <div class="col-xs-12"> - <h4><span data-lift="Loc.Settings"></span></h4> - <div class="well"> - <span data-lift="embed?what=/templates-hidden/parts/user-settings-form"></span> + + <div data-lift="UserVerifyPassword.show" ng-controller="UserVerifyPasswordCtrl" ng-cloak + class="col-xs-12"> + <h4><span data-lift="Loc.onetime_password"></span></h4> + <div data-lift="UserVerifyPassword" class="well"> + <h5>{{ model.password }}</h5> + <div class="note padding-top-20"> + <span data-lift="Loc.purchase_limit_note"></span> + </div> </div> </div> @@ -15,27 +20,6 @@ </div> </div> - <div data-lift="UserVerifyPassword.show" ng-controller="UserVerifyPasswordCtrl" ng-cloak - class="col-xs-12"> - <h4><span data-lift="Loc.purchase_verification_title"></span></h4> - <div data-lift="UserVerifyPassword" class="well"> - <table> - <tbody> - <tr> - <td class="padding-20-right"><span data-lift="Loc.ID"></span>: </td> - <td class="break-word">{{ model.userId }}</td> - </tr> - <tr> - <td class="padding-20-right"><span data-lift="Loc.Password"></span>: </td> - <td class="break-word">{{ model.password }}</td> - </tr> - </tbody> - </table> - <div class="note padding-top-20"> - <span data-lift="Loc.purchase_limit_note"></span> - </div> - </div> - </div> </div> </div> </div> \ No newline at end of file diff --git a/src/main/webapp/settings/admin/resources-hidden/_resources_verify.html b/src/main/webapp/settings/admin/resources-hidden/_resources_verify.html @@ -4,6 +4,7 @@ <res name="verify_body_fail">%s %s -- Your bitcoin buy limit remains at %s</res> <res name="new_purchase_limit">Your new bitcoin purchase limit is %s</res> <res name="setting_url_text">settings page of your PYC account</res> + <res name="verify_rejection_reason">Give your reason for rejection.</res> <res name="verify_body_success_part1"> To purchase large amounts of bitcoin from a store BTM, you will need to authenticate with the diff --git a/src/main/webapp/settings/admin/verify.html b/src/main/webapp/settings/admin/verify.html @@ -1,9 +1,8 @@ <div data-lift="surround?with=settings-wrap&at=content"> <div data-lift="VerifyId" ng-controller="VerifyIdCtrl" class="row" ng-cloak> - <div class="col-xs-12"> - <h2>{{currentUser.fname}} {{currentUser.lname}}</h2> - <h5>{{currentUser.status}}</h5> + <div class="col-xs-12" ng-show="currentUser"> + <h2>{{currentUser.status}}</h2> <table class="table"> <tbody> @@ -15,28 +14,28 @@ <td>Email</td> <td>{{currentUser.email}}</td> </tr> - <tr> - <td>Username</td> - <td>{{currentUser.username}}</td> - </tr> </tbody> </table> - <div ng-show="currentUser != null" class="padding-top-20"> - <button ng-really-click="accept()" ng-really-message="ACCEPT: Are you sure?" type="button" class="btn btn-success">Accept</button> - <button ng-really-click="reject()" ng-really-message="REJECT: Are you sure?" type="button" class="btn btn-danger" ng-disabled="response.reason == null">Reject</button> + <div class="padding-top-20"> + <button ng-really-click="accept()" ng-really-message="ACCEPT: Are you sure?" type="button" class="btn btn-success"><span data-lift="Loc.accept"></span></button> + <button ng-really-click="reject()" ng-really-message="REJECT: Are you sure?" type="button" class="btn btn-danger" ng-disabled="response.reason == null"><span data-lift="Loc.reject"></span></button> <br><br> - <div class="note">Give your reason for rejection.</div> + <div class="note"><span data-lift="Loc.verify_rejection_reason"></span></div> <textarea ng-model="response.reason" class="form-control" rows="3"></textarea> </div> </div> - <div class="col-xs-12 margin-top-20"> + <div class="col-xs-12" ng-show="currentUser"> + <span data-lift="embed?what=/templates-hidden/parts/user-settings-form"></span> + </div> + + <div ng-show="model.users" class="col-xs-12 margin-top-20"> <div class="well"> <ul class="list-unstyled"> <li ng-repeat="user in model.users"> <a ng-click="setCurrentUser(user, $index)" href="#"> - {{user.fname}} {{user.lname}} + {{user.email}} </a> </li> </ul> diff --git a/src/main/webapp/templates-hidden/parts/user-registration-form.html b/src/main/webapp/templates-hidden/parts/user-registration-form.html @@ -1,39 +1,16 @@ <div data-lift="UserRegistration" ng-controller="UserRegistrationCtrl" ng-cloak> <form name="form" class="smart-form client-form" ng-submit="save()" novalidate> <fieldset> - <div class="row"> - <section class="col col-6"> - <label class="input" ng-class="{{ stateSuccessError('fname') }}"> - <input name="fname" ng-model="model.fname" data-lift="Placeholder?name=fname" type="text" autofocus required> - <b class="tooltip tooltip-top-left"><span data-lift="Loc.fname_tip"></span>.</b> - </label> - </section> - <section class="col col-6"> - <label class="input" ng-class="{{ stateSuccessError('lname') }}"> - <input name="lname" ng-model="model.lname" data-lift="Placeholder?name=lname" type="text" required> - <b class="tooltip tooltip-top-left"><span data-lift="Loc.lname_tip"></span>.</b> - </label> - </section> - </div> - <section> + <label><span data-lift="Loc.Email"></span></label> <label class="input" ng-class="{{ stateSuccessError('email') }}"> <i class="icon-append fa fa-envelope-o"></i> - <input name="email" ng-model="model.email" data-lift="Placeholder?name=Email" type="email" required> - <b class="tooltip tooltip-top-left"><span data-lift="Loc.email_register_tip"></span>.</b> + <input name="email" ng-model="model.email" type="email" required> <span ng-show="form.email.$invalid && form.email.$dirty" class="text-danger small"> <span data-lift="Loc.invalid_email"></span> </span> </label> </section> - - <section> - <label class="input" ng-class="{{ stateSuccessError('username') }}"> - <i class="icon-append fa fa-user"></i> - <input name="username" ng-model="model.username" data-lift="Placeholder?name=username" type="text" required> - <b class="tooltip tooltip-top-left"><span data-lift="Loc.username_register_tip"></span>.</b> - </label> - </section> </fieldset> <footer> diff --git a/src/main/webapp/templates-hidden/parts/user-settings-form.html b/src/main/webapp/templates-hidden/parts/user-settings-form.html @@ -1,30 +1,34 @@ -<div data-lift="UserSettings" ng-controller="UserSettingsCtrl" ng-cloak> +<div data-lift="UserSettings"> <form name="form" class="smart-form client-form" novalidate> <fieldset> <section> <label><span data-lift="Loc.fname"></span></label> - <label class="input" ng-class="{{ stateSuccessError('fname') }}"> - <i ng-show="fname_loading" class="icon-append fa fa-spinner fa-spin"></i> - <input name="fname" ng-model="model.fname" type="text" ng-blur="updateUserSettings('fname')" ng-maxlength="30"> + <label class="input" ng-class="{{ stateSuccess('fname') }}"> + <input name="fname" ng-model="currentUser.fname" type="text" ng-maxlength="30" required> </label> </section> <section> <label><span data-lift="Loc.lname"></span></label> - <label class="input" ng-class="{{ stateSuccessError('lname') }}"> - <i ng-show="lname_loading" class="icon-append fa fa-spinner fa-spin"></i> - <input name="lname" ng-model="model.lname" type="text" ng-blur="updateUserSettings('lname')" ng-maxlength="30"> + <label class="input" ng-class="{{ stateSuccess('lname') }}"> + <input name="lname" ng-model="currentUser.lname" type="text" ng-maxlength="30" required> </label> </section> <section> - <label><span data-lift="Loc.username"></span></label> - <label class="input" ng-class="{{ stateSuccessError('username') }}"> - <i ng-show="username_loading" class="icon-append fa fa-spinner fa-spin"></i> - <i ng-hide="username_loading" class="icon-append fa fa-user"></i> - <input name="username" ng-model="model.username" type="text" ng-blur="updateUserSettings('username')"> + <label><span data-lift="Loc.drivers_license"></span></label> + <label class="input" ng-class="{{ stateSuccess('driversLicense') }}"> + <input name="driversLicense" ng-model="currentUser.driversLicense" type="text" ng-maxlength="50" required> </label> </section> + + <section> + <label><span data-lift="Loc.dob"></span></label> + <label class="input" ng-class="{{ stateSuccess('dob') }}"> + <input name="dob" ng-model="currentUser.dob" ui-mask="99/99/99" placeholder="xx/xx/xx" type="text" required> + </label> + </section> + </fieldset> </form> </div> \ No newline at end of file diff --git a/src/main/webapp/templates-hidden/settings-wrap.html b/src/main/webapp/templates-hidden/settings-wrap.html @@ -6,7 +6,7 @@ <div class="page-header"> <div id="user-header"> <h3> - <span lift="CurrentUser.name"></span> + <span lift="CurrentUser.identifier"></span> </h3> </div> </div>