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 }