scala-news-reader
rss/atom news reader in scala
git clone https://9o.is/git/scala-news-reader.git
BlogWritersSnipView.scala
(7055B)
1 package com.joereader.snippet
2
3 import com.joereader._
4 import model._
5 import snippet.SnipHelpers._
6
7 import net.liftweb._
8 import http._
9 import js._, JE._
10 import SHtml._
11 import util.Helpers._
12
13 import scala.xml._
14
15 import net.liftmodules.extras.Gravatar
16
17 /**
18 * Sigh.
19 */
20 trait BlogWritersSnipView extends BlogSnip {
21
22 def showIfOwner(html: NodeSeq): NodeSeq =
23 blog.map(b => if (b.owner.is(User.currentUser)) html else NodeSeq.Empty)
24
25 def writers(html: NodeSeq) = serve(html) {
26 blog =>
27 val owner = blog.owner.is(User.currentUser)
28
29 ".writer *" #> blog.writers.get.map {
30 blogWriter =>
31
32 var msg = ""
33
34 val bwu = new BlogWriterUser(
35 blogWriter.user.obj,
36 Some(blog),
37 Some(blogWriter))
38
39 def inviteForm: NodeSeq =
40 if (blogWriter.user.isEmpty && owner) {
41 msg = "Who is " + bwu.name + "? Has he registered already? If" +
42 " so, input the email that the person used to sign up. If" +
43 " he's not registered, we'll send " + bwu.name + " an invite. "
44
45 <input type="text" id={ "email-" + bwu.dashName } placeholder="email" value={ blogWriter.email.get }/>
46 <button onclick={
47 ajaxCall(JsArray(ValById("email-" +
48 bwu.dashName), Str(bwu.name)), invite)._2.toJsCmd.toString +
49 "; return false;"
50 } class="btn btn-primary">Invite</button>
51 } else NodeSeq.Empty
52
53 def removeButton(): NodeSeq =
54 if (owner) {
55 msg = msg +
56 "If you would like to remove " + bwu.name + ", click remove button. "
57
58 <button onclick={
59 ajaxCall(JsArray(Str(blogWriter.name.get),
60 Str(bwu.name)), removeAlert)._2.toJsCmd.toString +
61 "; return false;"
62 } class="btn btn-primary">Remove</button>
63 } else NodeSeq.Empty
64
65 def detachButton(): NodeSeq =
66 if (owner && blogWriter.user.isDefined) {
67 msg = msg + "To remove the user account connected to " + bwu.name +
68 ", click Detach User button."
69 val user = bwu.user.getOrElse(User.createRecord)
70
71 <button id={ "detach-btn-" + bwu.dashName } onclick={
72 ajaxCall(
73 JsArray(Str(user.username.get), Str(blogWriter.name.get),
74 Str(bwu.name)), detachUserAlert)._2.toJsCmd.toString +
75 "; return false;"
76 } class="btn btn-primary">Detach User</button>
77 } else NodeSeq.Empty
78
79 ".blog-writer [id]" #> ("writer-" + bwu.dashName) &
80 ".blog-writer" #> {
81 ".writer-link [href]" #> bwu.link &
82 "img [id]" #> ("img-" + bwu.dashName) &
83 "img [src]" #> bwu.image &
84 ".name .text *" #> bwu.name &
85 ".name .edit-link a [onclick]" #>
86 Show("writer-edit-" + bwu.dashName).toJsCmd.toString &
87 ".input-area *" #> (inviteForm ++ removeButton ++ detachButton) &
88 ".categories *" #> bwu.categories
89 } &
90 ".writer-edit-area [id]" #> ("writer-edit-" + bwu.dashName) &
91 ".writer-edit-area" #> {
92 ".name *" #> bwu.name &
93 ".msg-area small *" #> msg &
94 ".input-area *" #> (inviteForm ++ removeButton ++ detachButton) &
95 ".exit-link [onclick]" #>
96 Hide("writer-edit-" + bwu.dashName).toJsCmd.toString
97 }
98 } &
99 "style *" #> ("#blog-writers .overview{width:" +
100 (blog.writers.get.size * 200) + "px}")
101
102 }(test = true, NodeSeq.Empty)
103
104 def removeAlert(in: String): JsCmd = {
105 val name = in.split(",").headOption.getOrElse("")
106 val displayName = in.split(",").tail.headOption.getOrElse("")
107
108 for {
109 blog <- blog
110 blogWriter <- blog.writers.findStr(name)
111 } {
112 val followSize = blogWriter.followers.get.size
113
114 val msg = s"Are you sure you want to remove $displayName? ${
115 if (followSize > 0) followSize + " followers will stop following!"
116 else ""
117 }"
118
119 S.warning(
120 <div>
121 { msg }
122 </div>
123 <div>
124 <button onclick={
125 ajaxCall(JsArray(Str(name), Str(displayName)), remove).
126 _2.toJsCmd.toString + "; return false;"
127 } class="btn btn-warning">Yes</button>
128 <button onclick="$(document).trigger('clear-alerts')" class="btn">No</button>
129 </div>)
130 }
131 }
132
133 def remove(in: String): JsCmd = {
134 val name = in.split(",").headOption.getOrElse("")
135 val displayName = in.split(",").tail.headOption.getOrElse("")
136
137 for {
138 blog <- blog
139 blogWriter <- blog.writers.findStr(name)
140 } yield {
141 blogWriter.followers.objs.map(_.following.remove(
142 new BlogWriterUser(blog, blogWriter)).update)
143 blog.writers.remove(blogWriter).update
144 val dashName = displayName.split(" ").mkString("-")
145 Remove("writer-" + dashName) &
146 Remove("writer-edit-" + dashName) &
147 Hide("writer-edit-" + dashName)
148 }
149 }
150
151 def detachUserAlert(in: String): JsCmd = {
152 val username = in.split(",").headOption.getOrElse("")
153 val name = in.split(",").tail.headOption.getOrElse("")
154 val displayName = in.split(",").lastOption.getOrElse("")
155
156 for (blog <- blog) {
157 S.warning(
158 <div>
159 Are you sure you want to detach from
160 { blog.name.get }
161 </div>
162 <div>
163 <button onclick={
164 ajaxCall(JsArray(Str(username), Str(name), Str(displayName)), detachUser).
165 _2.toJsCmd.toString + "; return false;"
166 } class="btn btn-warning">Yes</button>
167 <button onclick="$(document).trigger('clear-alerts')" class="btn">No</button>
168 </div>)
169 }
170 }
171
172 def detachUser(in: String): JsCmd = {
173 val username = in.split(",").headOption.getOrElse("")
174 val name = in.split(",").tail.headOption.getOrElse("")
175 val displayName = in.split(",").lastOption.getOrElse("")
176
177 for {
178 blog <- blog
179 blogWriter <- blog.writers.findStr(name)
180 user <- User.findByUsername(username)
181 } yield {
182 user.blogs.remove(blog).update
183 blogWriter.user.remove
184
185 if (blog.owner.is(user))
186 blog.owner(blog.owner.defaultValue)
187
188 blog.save
189 val dashName = displayName.split(" ").mkString("-")
190
191 UpdateImage("writer-" + dashName + " img", Gravatar.imageUrl("blah")) &
192 Remove("detach-btn-" + dashName) & Hide("writer-edit-" + dashName)
193 }
194 }
195
196 def invite(nameAndEmail: String): JsCmd = {
197 val email = nameAndEmail.split(",").headOption.getOrElse("")
198 val name = nameAndEmail.split(",").tail.headOption.getOrElse("")
199
200 for {
201 blog <- blog
202 user <- User.currentUser
203 } {
204 blog.writers.findStr(name).map(_.email(email))
205 blog.save
206 User.sendInviteToken(name, email, user, blog)
207 }
208 S.notice(name + " has been invited")
209 }
210 }