Advertisement
Guest User

Untitled

a guest
Nov 16th, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 5.88 KB | None | 0 0
  1. package reactapp.client.pages.portlets.edit
  2.  
  3. import japgolly.scalajs.react.vdom.prefix_<^._
  4. import japgolly.scalajs.react._
  5. import japgolly.scalajs.react.{BackendScope, Callback, ReactComponentB}
  6. import monocle.macros.Lenses
  7. import reactapp.client.common.CfContext
  8. import reactapp.client.facades.M
  9. import reactapp.shared.portlets.PortletDefinitionStructures._
  10. import sjsgrid.client.common.react.ExtVar
  11.  
  12. private[edit] final case class AddPortletMenu(portletAddNew: PortletType => Callback,
  13.                                               portletAddFromLibrary: Long => Callback,
  14.                                               cfContext: CfContext) {
  15.   def apply() = AddPortletMenu.cmp(this)
  16. }
  17.  
  18. private[edit] object AddPortletMenu {
  19.  
  20.   type Props = AddPortletMenu
  21.  
  22.   @Lenses
  23.   final case class State(selectedIndex: Option[Int])
  24.  
  25.   private val newPortlets = List(
  26.     (PortletType.TableObj.empty, "awesome-icon-table", M("js.label.portlet.addtemplate.table"), PortletTypeSql.tableType),
  27.     (PortletType.TimeSeriesChartObj.empty, "awesome-icon-line-chart", M("js.label.portlet.addtemplate.timeseries"), PortletTypeSql.timeSeriesType),
  28.     (PortletType.GaugeObj.empty, "awesome-icon-tachometer", M("js.label.portlet.addtemplate.gauge"), PortletTypeSql.gaugeType),
  29.     (PortletType.StaticTextObj.empty, "awesome-icon-file-text-o", M("js.label.portlet.addtemplate.text"), PortletTypeSql.textType)
  30.   )
  31.  
  32.   class Backend($: BackendScope[Props, State]) {
  33.  
  34.     def render(props: Props, state: State) = {
  35.       val stateEV = ExtVar.getStateSnapshot($)
  36.  
  37.       <.div(
  38.         ^.margin := 10.px,
  39.         ^.onMouseLeave --> stateEV.set(state.copy(selectedIndex = None)),
  40.         <.div(
  41.           newPortlets.zipWithIndex.map{
  42.             case ((newPortlet, iconCls, label, pType), index) =>
  43.               <.div(
  44.                 ^.float := "left",
  45.                 ^.marginLeft := "2rem",
  46.                 <.div(
  47.                   ^.cursor := "pointer",
  48.                   ^.onMouseEnter --> stateEV.set(state.copy(selectedIndex = Option(index))),
  49.                   <.i(
  50.                     ^.cls := iconCls,
  51.                     ^.fontSize := 50.px
  52.                   ),
  53.                   <.br(),
  54.                   <.small(label)
  55.                 ),
  56.                 state.selectedIndex.contains(index) ?=
  57.                 <.div(
  58.                   ^.position := "absolute",
  59.                   ^.zIndex := 1,
  60.                   ^.backgroundColor := "#444",
  61.                   ^.color := "#fff",
  62.                   ^.padding := 5.px,
  63.                   ^.border := "1px solid #444",
  64.                   ^.borderRadius := 5.px,
  65.                   ^.boxShadow := "5px 5px 1px grey",
  66.  
  67.                   <.button(
  68.                     ^.cls := "small button secondary",
  69.                     ^.marginBottom := 2.px,
  70.                     ^.width := 150.px,
  71.                     ^.onClick --> props.portletAddNew(newPortlet),
  72.                     M("js.label.portlet.addnew")
  73.                   ),
  74.  
  75.                   PortletFromLibrarySelector(props.portletAddFromLibrary, pType, props.cfContext)()
  76.                 )
  77.               )
  78.           }
  79.         )
  80.       )
  81.  
  82.     }
  83.   }
  84.  
  85.   val cmp = ReactComponentB[Props](this.getClass.getSimpleName)
  86.     .initialState[State] {
  87.       State(None)
  88.     }
  89.     .renderBackend[Backend]
  90.     .build
  91. }
  92. ////////////////////
  93. // other file
  94.  
  95. package reactapp.client.pages.portlets.edit
  96.  
  97. import autowire._
  98. import japgolly.scalajs.react.vdom.prefix_<^.{<, _}
  99. import japgolly.scalajs.react.{BackendScope, ReactComponentB}
  100. import monocle.macros.Lenses
  101. import reactapp.client.common.{AutowireClient, CfContext}
  102. import reactapp.client.common.component._
  103. import reactapp.client.facades.M
  104. import reactapp.shared.portlets.PortletDefinitionStructures._
  105. import reactapp.shared.portlets.PortletsDefinitionApi
  106. import japgolly.scalajs.react._
  107. import monix.eval.Task
  108. import org.scalajs.jquery.jQuery
  109. import reactapp.client.pages.portlets.view.PortletReportView
  110. import reactapp.client.pages.portlets.UniqueKeys
  111. import reactapp.shared.kpi.Kpi
  112. import reactapp.shared.portlets.PortletDefinitionStructures.StocktakingDaysResponse.StocktakingDaysSuccessResponse
  113. import reactapp.shared.users.UsersPageApi.FarmsAndHoldings
  114. import sjsgrid.client.grid.SjsGridOps._
  115. import sjsgrid.client.common.react.ExtVar
  116. import monix.execution.Scheduler.Implicits.global
  117. import org.scalajs.dom
  118.  
  119. private[edit] final case class PortletReportEdit(group: PortletGroup,
  120.                                                  portlets: Map[Long, PortletDefinitionTrimmed],
  121.                                                  kpis: Seq[Kpi],
  122.                                                  stocktakingDaysOpt: Option[StocktakingDaysSuccessResponse],
  123.                                                  farmsAndHoldings: FarmsAndHoldings,
  124.                                                  cfContext: CfContext) {
  125.  
  126.   def apply() = PortletReportEdit.cmp(this)
  127. }
  128.  
  129. private[edit] object PortletReportEdit {
  130.  
  131.   type Props = PortletReportEdit
  132.  
  133.   @Lenses
  134.   final case class State(group: PortletGroup,
  135.                          portlets: Map[Long, PortletDefinitionTrimmed],
  136.                          showEditPortlet: Option[PortletDefinition] = None,
  137.                          showFullDetail: Boolean = false){
  138.   }
  139.  
  140.   class Backend($: BackendScope[Props, State]) {
  141.  
  142.     def render(props: Props, state: State) = {
  143.  
  144. //..
  145.         <.div(
  146.           ^.cls := "row",
  147.           <.div(
  148.             ^.cls := "small-12 large-12 columns",
  149.             AddPortletMenu(
  150.               portletAddNew(props, stateEV),
  151.               portletAddExisting(props, stateEV),
  152.               props.cfContext
  153.             )()
  154.           )
  155. //...
  156.         )
  157.       )
  158.     }
  159.   }
  160.  
  161.  
  162.   val cmp = ReactComponentB[Props](this.getClass.getSimpleName)
  163.     .initialState_P[State] { props =>
  164.  
  165.       State(props.group,
  166.         props.portlets)
  167.     }
  168.     .renderBackend[Backend]
  169.     .build
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement