scala-news-reader

rss/atom news reader in scala

git clone https://9o.is/git/scala-news-reader.git

UserReaderSnipEdit.scala

(3086B)


      1 package com.joereader.snippet
      2 
      3 import com.joereader._
      4 import model._
      5 import lib._, Helper._
      6 import ImageUpload.ImageType._
      7 import config._
      8 import SnipHelpers._
      9 
     10 import scala.xml._
     11 
     12 import net.liftweb._
     13 import util.Helpers._
     14 import http._
     15 import js._
     16 import JsCmds._
     17 import SHtml._
     18 
     19 /**
     20  * Snippets for currently logged in user (could be writer or reader)
     21  * to edit their information.
     22  * We subclass the View trait to fallback if access control test fails.
     23  */
     24 trait UserReaderSnipEdit extends UserReaderSnipView with UserPassword {
     25 
     26   private def test = user.exists(u =>
     27     User.currentUser.exists(_.id.is == u.id.is))
     28 
     29   override def email(html: NodeSeq) = serve(html) {
     30     user =>
     31       def checkEmail(email: String): JsCmd = {
     32         val u = User.findByEmail(email)
     33         def isYou = u.exists(_.id.is == user.id.is)
     34 
     35         if (!email.isEmail)
     36           S.error("Not a valid email")
     37         else if (isYou)
     38           Noop
     39         else if (u.isDefined)
     40           S.error("That email is registered already")
     41         else {
     42           user.email(email).verified(false).update
     43           S.notice("New email is saved")
     44         }
     45       }
     46       "*" #> ajaxText(user.email.is, checkEmail)
     47   }(test, super.email(html))
     48 
     49   def password(html: NodeSeq) = serve(html) {
     50     user =>
     51       "*" #> ajaxText("", {
     52         s =>
     53           val (pass, msg) = savePassword(s)
     54           if (pass) S.notice("Your new password has been saved")
     55           else S.error("id_password_err", msg)
     56       }, "type" -> "password", "placeholder" -> "password")
     57   }(test, super.name)
     58 
     59   def setPassword(html: NodeSeq) = serve(html) {
     60     user =>
     61       var oldpwd, pwd, pwd2 = ""
     62 
     63       def process(): JsCmd = {
     64         val (pass, msg) = savePassword(oldpwd, pwd, pwd2)
     65         if (pass)
     66           SetValById("old-pwd", "") &
     67             SetValById("new-pwd", "") &
     68             SetValById("new-pwd2", "")
     69         else S.error(msg)
     70       }
     71 
     72       "#old-pwd" #> SHtml.password(oldpwd, oldpwd = _) &
     73         "#new-pwd" #> SHtml.password(pwd, pwd = _) &
     74         "#new-pwd2" #> SHtml.password(pwd2, pwd2 = _) &
     75         "#submit-pwd" #> ajaxSubmit("Set Password", process)
     76   }(test, NodeSeq.Empty)
     77 
     78   def name(html: NodeSeq) = serve(html) {
     79     user =>
     80       "*" #> ajaxText(user.name.is, {
     81         s => user.name(s).update; Noop
     82       }, "placeholder" -> "Your Name")
     83   }(test, super.name)
     84 
     85   def uploadImg(html: NodeSeq) = serve(html) {
     86     user =>
     87       "*" #> insertFileUpload(pic, ImageUpload.userUrl(pic))
     88   }(test, NodeSeq.Empty)
     89 
     90   /*
     91    * This wraps the profile with editable-page class so user can
     92    * edit information from their profile page.
     93    */
     94   def surround =
     95     "#profile-wrap [class+]" #> (if (test) "editable-page" else "")
     96 
     97   def previewPage(html: NodeSeq) = serve(html) {
     98     user =>
     99       val blog = Blog.find(user.blogs.get.head)
    100       val bw = blog.flatMap(_.writers.find(user))
    101       val bwu = for(blog <- blog; bw <- bw) 
    102         yield new BlogWriterUser(user, blog, bw)
    103       "* [href]" #> bwu.map(Site.blogWriterPreviewLoc.calcHref).openOr("")
    104   }(!test && user.exists(_.isWriter), html)
    105 }