scala-news-reader
rss/atom news reader in scala
git clone https://9o.is/git/scala-news-reader.git
BlogSnipEdit.scala
(2486B)
1 package com.joereader.snippet
2
3 import net.liftweb._
4 import common._
5 import util._, Helpers._
6 import http._, SHtml._, js._, JsCmds._
7
8 import com.joereader._
9 import model._
10 import config._
11 import lib._
12 import ImageUpload.ImageType._
13 import snippet.SnipHelpers._
14
15 import scala.xml._
16
17 /**
18 * Snippets for the owner of a blog to edit Blog model information.
19 * Must extend View trait so these snips can fallback to the view snips
20 * if the test fails.
21 */
22 trait BlogSnipEdit extends BlogSnipView with BackgroundSnip {
23
24 // only allow blog owner
25 // must be kept private so it won't be overridden by sub or super classes
26 private def test = blog.exists(_.owner.is(User.currentUser))
27
28 def name(html: NodeSeq) = serve(html) {
29 blog =>
30 "*" #> ajaxText(blog.name.is, {
31 s => blog.name(s).update; Noop
32 }, "placeholder" -> "Name of blog")
33 }(test, super.name)
34
35 def description(html: NodeSeq) = serve(html) {
36 blog =>
37 "*" #> ajaxTextarea(blog.description.is, {
38 s => blog.description(s).update; Noop
39 }, "placeholder" -> "Enter blog description here")
40 }(test, super.description)
41
42 def uploadImg(html: NodeSeq) = serve(html) {
43 blog =>
44 "*" #> insertFileUpload(pic, ImageUpload.blogUrl(blog, pic))
45 }(test, NodeSeq.Empty)
46
47 def uploadBgImg(html: NodeSeq): NodeSeq = serve(html) {
48 uploadBgImg
49 }(test, NodeSeq.Empty)
50
51 def blogname(html: NodeSeq) = serve(html) {
52 blog =>
53
54 def check(s: String): JsCmd = {
55 val b = Blog.findByBlogName(s)
56 def isYou = b.exists(_.id.is == blog.id.is)
57
58 if (!s.matches("^[a-z0-9-]{2,}$"))
59 S.error("Blog name can only contain " +
60 "alphanumeric or dash characters.")
61 else if (isYou)
62 Noop
63 else if (b.isEmpty) {
64 blog.blogname(s).update
65 Noop
66 }
67 else S.error("Blog name is taken")
68 }
69
70 "*" #> ajaxText(blog.blogname.is, {
71 s: String => check(s.toLowerCase)
72 })
73 }(test, super.blogname)
74
75 def categoriesEdit(html: NodeSeq): NodeSeq = serve(html) {
76 blog =>
77 "*" #>
78 Templates("templates-hidden" :: "parts" :: "categories" :: Nil).map {
79 ns =>
80 Site.categoriesLoc.requestValue(Full(blog))
81 ns
82 }
83 } (User.isLoggedIn, NodeSeq.Empty)
84
85 /*
86 * Surround profile page with editable-page class so owner can edit
87 * on the spot
88 */
89 def surround =
90 "#profile-wrap [class+]" #> (if (test) "editable-page" else "")
91 }