src/main/scala/fis/crm/ui/CompanySnippet.scala
author Tomas Zeman <tzeman@volny.cz>
Thu, 24 May 2012 11:19:26 +0200
changeset 99 49eb72a46208
parent 91 494b3b9db463
permissions -rw-r--r--
e45557248ba12a15 Services
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
/*
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     2
 * Copyright 2012 Tomas Zeman <tzeman@volny.cz>
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
 *
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
 * Licensed under the Apache License, Version 2.0 (the "License");
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     5
 * you may not use this file except in compliance with the License.
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     6
 * You may obtain a copy of the License at
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     7
 *
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
 *     http://www.apache.org/licenses/LICENSE-2.0
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
 *
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    10
 * Unless required by applicable law or agreed to in writing, software
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
 * distributed under the License is distributed on an "AS IS" BASIS,
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    13
 * See the License for the specific language governing permissions and
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    14
 * limitations under the License.
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
 */
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
package fis.crm.ui
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    17
89
fd364bae9c49 Basic authorization: only logged in user can change entities
Tomas Zeman <tzeman@volny.cz>
parents: 85
diff changeset
    18
import fis.aaa.model.User
fd364bae9c49 Basic authorization: only logged in user can change entities
Tomas Zeman <tzeman@volny.cz>
parents: 85
diff changeset
    19
import fis.aaa.ui.IfLoggedIn
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    20
import fis.base.model._
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    21
import fis.base.ui._
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    22
import fis.crm.model._
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    23
import fis.geo.model._
85
3ef84ec492fa Project - company relation
Tomas Zeman <tzeman@volny.cz>
parents: 84
diff changeset
    24
import fis.pm.model.CompanyProjects
3ef84ec492fa Project - company relation
Tomas Zeman <tzeman@volny.cz>
parents: 84
diff changeset
    25
import fis.pm.ui.ProjectTable
99
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    26
import fis.sr.model.{CompanyServices, Service}
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    27
import fis.sr.ui.{ServiceForm, ServiceSnippet, ServiceTable}
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    28
import net.liftweb.common._
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    29
import net.liftweb.http._
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    30
import net.liftweb.http.js.JsCmds.RedirectTo
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    31
import net.liftweb.sitemap._
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    32
import net.liftweb.sitemap.Loc._
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    33
import net.liftweb.util._
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    34
import net.liftweb.util.Helpers._
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    35
import net.tz.lift.model._
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    36
import net.tz.lift.snippet._
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    37
import scala.xml.{Elem, NodeSeq, Text}
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    38
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    39
object CompanySnippet extends CompanyCrud with EntitySnippet[Company] {
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    40
  val prefix = "company"
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    41
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    42
  private val listPre = Menu("company.list", l10n("Companies")) / prefix >>
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    43
    Title(_ => i18n("Companies")) >>
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    44
    locTpl("entity/list") >> Snippet("list", list)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    45
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    46
  private val createPre = Menu("company.create", l10n("Create")) / prefix / ADD >>
89
fd364bae9c49 Basic authorization: only logged in user can change entities
Tomas Zeman <tzeman@volny.cz>
parents: 85
diff changeset
    47
    Title(_ => i18n("Create company")) >> IfLoggedIn.test >>
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    48
    locTpl("company/form") >> Snippet("form", form) >> Hidden
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    49
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    50
  private val viewPre = Menu.param[Company]("company.view", l10n("Company"), parse,
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    51
    encode) / prefix / * >> Title(c => i18n("Company %s", c.linkName)) >>
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    52
    locTpl("company/view") >> Snippet("panel", panel) >>
99
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    53
    Snippet("services", services) >> Snippet("contacts", contacts.contacts) >>
85
3ef84ec492fa Project - company relation
Tomas Zeman <tzeman@volny.cz>
parents: 84
diff changeset
    54
    Snippet("projects", projects) >> Hidden
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    55
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    56
  private val editPre = Menu.param[Company]("company.edit", l10n("Edit"), parse,
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    57
    encode) / prefix / * / EDIT >>
89
fd364bae9c49 Basic authorization: only logged in user can change entities
Tomas Zeman <tzeman@volny.cz>
parents: 85
diff changeset
    58
    Title(c => i18n("Edit company %s", c.linkName)) >> IfLoggedIn.testVal >>
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    59
    locTpl("company/form") >> Snippet("form", form) >> Hidden
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    60
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    61
  private val deletePre = Menu.param[Company]("company.delete", l10n("Delete"),
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    62
    parse, encode) / prefix / * / DELETE >>
89
fd364bae9c49 Basic authorization: only logged in user can change entities
Tomas Zeman <tzeman@volny.cz>
parents: 85
diff changeset
    63
    Title(c => i18n("Delete company %s", c.linkName)) >> IfLoggedIn.testVal >>
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    64
    locTpl("entity/delete") >> Snippet("form", deleteF) >> Hidden
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    65
99
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    66
  private val createServicePre = Menu.param[Company]("company.create-service",
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    67
    l10n("Create service"), parse, encode) / prefix / * / "create-service" >>
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    68
    Title(c => i18n("Create service for company %s", c.linkName)) >>
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    69
    IfLoggedIn.testVal >>
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    70
    locTpl("entity/form") >> Snippet("form", createServiceForm) >> Hidden
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    71
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    72
  private val listM = listPre >> SecNav(createPre).build
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    73
  private val createM = createPre >> SecNav(listPre).build
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    74
  private val viewM = viewPre >>
99
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    75
    (SecNav(editPre) + deletePre + createServicePre + contacts.chooseM).build
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    76
  private val editM = editPre >> SecNav(viewPre).build
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    77
  private val deleteM = deletePre >> SecNav(viewPre).build
99
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    78
  private val createServiceM = createServicePre >> SecNav(viewPre).build
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    79
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    80
  private lazy val viewLoc = viewM.toLoc
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    81
  private lazy val editLoc = editM.toLoc
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    82
  private lazy val deleteLoc = deleteM.toLoc
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    83
99
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    84
  val menu = listM submenus(viewM, editM, createM, deleteM, createServiceM,
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    85
    contacts.chooseM, contacts.confirmM)
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    86
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    87
  private def cur = viewLoc.currentValue or editLoc.currentValue or
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    88
    deleteLoc.currentValue
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    89
84
43674362ff5e Company select field
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    90
  private def list: CssTr = { _ => CompanyTable(Company.companies()) }
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    91
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    92
  private def panel: CssTr = "*" #> cur.map(CompanyPanel(_))
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    93
85
3ef84ec492fa Project - company relation
Tomas Zeman <tzeman@volny.cz>
parents: 84
diff changeset
    94
  private def projects: CssTr = "*" #> cur.map { c =>
3ef84ec492fa Project - company relation
Tomas Zeman <tzeman@volny.cz>
parents: 84
diff changeset
    95
    ProjectTable(CompanyProjects(c)) }
3ef84ec492fa Project - company relation
Tomas Zeman <tzeman@volny.cz>
parents: 84
diff changeset
    96
99
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    97
  private def services: CssTr = "*" #> cur.map { c =>
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    98
    ServiceTable(CompanyServices(c)) }
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
    99
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   100
  object url {
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   101
    def view: Company => Box[String] = (viewLoc.calcHref _) andThen (Box !! _)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   102
  }
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   103
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   104
  private case class CompanyLink(c: Company) extends EntityLink[Company](c,
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   105
    url.view)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   106
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   107
  EntityLink.register[Company](CompanyLink(_))
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   108
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   109
  private object form extends HorizontalScreen with CancelButton with SaveButton {
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   110
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   111
    private object company extends ScreenVar[Company](Company.createRecord)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   112
    private object address extends ScreenVar[Address](Address.createRecord)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   113
    private object postAddress extends ScreenVar[Address](Address.createRecord)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   114
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   115
    private val hasPostAddr = builder(Company.postAddress.displayName, false,
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   116
      FormFieldId("has_post_address")).
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   117
      help(i18n("Post address differs from company address")).make
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   118
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   119
    override def screenFields: List[BaseField] =
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   120
      fields(company) flatMap(_.allFields)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   121
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   122
    private def fields(c: Company): List[FieldContainer] = {
91
494b3b9db463 Company status
Tomas Zeman <tzeman@volny.cz>
parents: 89
diff changeset
   123
      List[FieldContainer](c.name, c.ico, c.dic, c.status,
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   124
        ReadOnlyField.labelOnly(c.address)) ++
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   125
      address.formFields ++
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   126
      List[FieldContainer](hasPostAddr) ++
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   127
      postAddress.formFields.map { f => field(f,
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   128
        FormFieldId(f.uniqueFieldId.map { "post_" + _} openOr nextFuncName)) } ++
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   129
      List(c.note)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   130
    }
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   131
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   132
    protected override def decorateLine(f: ScreenFieldInfo): CssTr =
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   133
      f.field.uniqueFieldId.filter { _.startsWith("post_") } map { _ =>
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   134
      ".control-group [class+]" #> "post-address" } openOr PassThru
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   135
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   136
    override def localSetup() { cur.foreach { c =>
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   137
      company(c)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   138
      c.address.vend.foreach(address(_))
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   139
      c.postAddress.vend.foreach { a =>
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   140
        hasPostAddr.set(true)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   141
        postAddress(a)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   142
      }
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   143
    }}
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   144
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   145
    def finish() {
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   146
      hasPostAddr.get match {
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   147
        case true =>
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   148
          company.postAddress(AddressCrud.save(postAddress).$(logF).map(_.id))
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   149
        case false =>
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   150
          val p = company.postAddress.vend
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   151
          company.postAddress(Empty)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   152
          p.foreach { AddressCrud.delete _ }
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   153
      }
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   154
      AddressCrud.save(address).$(logF).foreach { a =>
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   155
        save(company.address(a.id)).$(logF).foreach { c =>
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   156
          S notice l10n("Company %s saved.", c.linkName)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   157
          S.redirectTo(viewLoc.calcHref(c))
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   158
        }
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   159
      }
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   160
    }
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   161
  }
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   162
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   163
  private def logF[T]: Box[T] => Unit = _ match {
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   164
    case Failure(m, _, _) => S error m
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   165
    case _ =>
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   166
  }
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   167
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   168
  private object deleteF extends HorizontalScreen with CancelButton with
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   169
    DeleteButton {
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   170
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   171
    val confirm = field(l10n("Really delete this company?"), false)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   172
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   173
    def finish() {
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   174
      for {
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   175
        c <- deleteLoc.currentValue if confirm
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   176
        r <- delete(c)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   177
        n <- r.box(c.linkName)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   178
      } {
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   179
        c.address.vend.flatMap(AddressCrud.delete _) $ logF
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   180
        c.postAddress.vend.flatMap(AddressCrud.delete _) $ logF
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   181
        S notice l10n("Company %s deleted.", n)
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   182
        S redirectTo listM.loc.calcDefaultHref
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   183
      }
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   184
    }
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   185
  }
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   186
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   187
  /* Contacts view + add contact op. */
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   188
  private object contacts {
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   189
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   190
    private val choosePreM = Menu.param[Company]("company.addContact",
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   191
      l10n("Add contact"), parse, encode) / prefix / * / "add-contact" >>
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   192
      Title(c => i18n("Add contact to %s", c.linkName)) >>
89
fd364bae9c49 Basic authorization: only logged in user can change entities
Tomas Zeman <tzeman@volny.cz>
parents: 85
diff changeset
   193
      IfLoggedIn.testVal >>
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   194
      locTpl("company/add-contact") >> Snippet("panel", chooseContact) >> Hidden
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   195
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   196
    val confirmM = Menu.params[(Company, Contact)](
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   197
      "company.addContactId", l10n("Add contact"), { _ match {
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   198
        case AsLong(cmpId) :: AsLong(cntId) :: Nil => for {
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   199
            comp <- get(cmpId)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   200
            cnt <- ContactCrud.get(cntId)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   201
          } yield (comp, cnt)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   202
        case _ => Empty
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   203
      }},
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   204
      { p => List(p._1, p._2) map(_.id.toString) }) / prefix /
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   205
        * / "add-contact" / * >>
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   206
      Title(p => i18n("Add contact %s to %s", p._2.linkName, p._1.linkName)) >>
89
fd364bae9c49 Basic authorization: only logged in user can change entities
Tomas Zeman <tzeman@volny.cz>
parents: 85
diff changeset
   207
      IfLoggedIn.testVal >>
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   208
      locTpl("entity/form") >> Snippet("form", addContact) >> Hidden
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   209
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   210
    val chooseM = choosePreM >> SecNav(viewPre).build
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   211
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   212
    private case class RemoveContactLink(comp: Company, cnt: Contact) extends
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   213
      ReadOnlyField("actions", "", ConfirmationLink(i18n("Remove"),
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   214
        l10n("Really remove contact?"), {
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   215
          CrmSchema.companyContacts.left(comp).dissociate(cnt)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   216
          RedirectTo(viewLoc.calcHref(comp))
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   217
        }), Empty)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   218
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   219
    def contacts: CssTr = "*" #> cur.map { c =>
89
fd364bae9c49 Basic authorization: only logged in user can change entities
Tomas Zeman <tzeman@volny.cz>
parents: 85
diff changeset
   220
      FieldTable[Contact]({ cnt => ContactTable.fields(cnt).toSeq ++
fd364bae9c49 Basic authorization: only logged in user can change entities
Tomas Zeman <tzeman@volny.cz>
parents: 85
diff changeset
   221
        (User.get.map { _ => RemoveContactLink(c, cnt) }) }, Contact)(
fd364bae9c49 Basic authorization: only logged in user can change entities
Tomas Zeman <tzeman@volny.cz>
parents: 85
diff changeset
   222
        CompanyContacts(c)) }
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   223
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   224
    private case class AddContactLink(comp: Company, cnt: Contact) extends
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   225
      EntityLink[Contact](cnt,
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   226
        { c => Full(confirmM.toLoc.calcHref((comp, cnt))) })
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   227
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   228
    private def chooseContact: CssTr = "*" #> chooseM.toLoc.currentValue.map {
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   229
      comp =>
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   230
        FieldTable[Contact]({ c =>
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   231
          List(AddContactLink(comp, c)) }, Contact)(CrmSchema.allContacts)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   232
    }
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   233
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   234
    private object addContact extends HorizontalScreen with CancelButton
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   235
      with SaveButton {
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   236
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   237
      override def screenFields: List[BaseField] = (for {
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   238
        (comp, cnt) <- confirmM.toLoc.currentValue
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   239
        cl <- EntityLink(comp)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   240
        cntl <- EntityLink(cnt)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   241
      } yield {
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   242
        List(ReadOnlyField(l10n("Company"), cl),
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   243
          ReadOnlyField(l10n("Contact"), cntl)) flatMap(_.allFields)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   244
      }) openOr Nil
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   245
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   246
      def finish() { for {
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   247
        (comp, cnt) <- confirmM.toLoc.currentValue
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   248
      } {
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   249
        val fk = CrmSchema.companyContacts.left(comp)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   250
        fk.exists(_.id == cnt.id) match {
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   251
          case true =>
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   252
            S notice l10n("Contact %s is already associated with %s",
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   253
              cnt.linkName, comp.linkName)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   254
          case false =>
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   255
            fk.associate(cnt)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   256
            S notice l10n("Added contact %s", cnt.linkName)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   257
        }
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   258
        S redirectTo viewLoc.calcHref(comp)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   259
      }}
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   260
    }
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   261
  }
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   262
99
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
   263
  private object createServiceForm extends ServiceForm {
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
   264
    override def localSetup() {
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
   265
      createServiceM.currentValue.foreach { c => service.company(c.id) }
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
   266
    }
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
   267
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
   268
    protected def onSuccess(s: Service) {
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
   269
      ServiceSnippet.url.view(s).foreach { u => S redirectTo u }
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
   270
    }
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
   271
  }
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 91
diff changeset
   272
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   273
}
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   274
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   275
// vim: set ts=2 sw=2 et: