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 }