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 }