Skip to content

Commit 7face5a

Browse files
committed
allow all content nodes to be referenced
1 parent 07c0a87 commit 7face5a

File tree

3 files changed

+54
-13
lines changed

3 files changed

+54
-13
lines changed

webApp/src/main/scala/wust/webApp/Main.scala

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import wust.facades.jquery.JQuery
1717
import wust.facades.marked.{Marked, MarkedOptions, Renderer}
1818
import wust.facades.wdtEmojiBundle._
1919
import wust.graph.Node
20+
import wust.ids.NodeData
2021
import wust.webApp.dragdrop.SortableEvents
2122
import wust.webApp.state.{GlobalState, GlobalStateFactory}
2223
import wust.webApp.views.{GenericSidebar, MainView, Modal}
@@ -66,7 +67,14 @@ object Main {
6667
cls := "result", //we need this class for semantic ui to work,
6768
div(cls := "title", display.none, result.title), // needed for semantic ui to map the html element back to the SearchSourceEntry
6869
padding := "4px",
69-
views.Components.nodeCardAsOneLineText( node, projectWithIcon = true)(Ctx.Owner.Unsafe).prepend(
70+
if(result.placeholder.getOrElse(false)) {
71+
views.Components.renderNodeCard(node,
72+
contentInject = node =>
73+
views.Components.displayPlaceholder(node.data.asInstanceOf[NodeData.Placeholder])
74+
.apply(s" of ${result.text}", cls := "oneline")
75+
)(Ctx.Owner.Unsafe)
76+
}
77+
else views.Components.nodeCardAsOneLineText( node, projectWithIcon = true)(Ctx.Owner.Unsafe).prepend(
7078
cursor.pointer,
7179
Styles.flex,
7280
alignItems.center

webApp/src/main/scala/wust/webApp/views/Components.scala

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ object Components {
107107
// 4. crop via overflow ellipsis
108108
cls := "oneline"
109109
)
110+
110111
}
111112

112113
def nodeCardAsOneLineText(node: Node, projectWithIcon: Boolean = true)(implicit ctx: Ctx.Owner): VNode = {
@@ -650,7 +651,7 @@ object Components {
650651
def searchAndSelectNodeApplied[F[_] : Sink : Source](current: F[Option[NodeId]], filter: Node => Boolean)(implicit ctx: Ctx.Owner): VNode = searchAndSelectNode(current, filter) --> current
651652
def searchAndSelectNode[F[_] : Source](observable: F[Option[NodeId]], filter: Node => Boolean)(implicit ctx: Ctx.Owner): EmitterBuilder[Option[NodeId], VNode] =
652653
Components.searchInGraph(GlobalState.rawGraph, "Search", filter = {
653-
case n: Node.Content => InlineList.contains[NodeRole](NodeRole.Message, NodeRole.Task, NodeRole.Project)(n.role) && filter(n)
654+
case n: Node.Content => filter(n)
654655
case _ => false
655656
}, innerElementModifier = width := "100%", inputModifiers = width := "100%").mapResult[VNode] { search =>
656657
div(
@@ -687,18 +688,47 @@ object Components {
687688
minCharacters = 0
688689
showNoResults = showNotFound
689690

690-
source = graph.now.nodes.collect { case node: Node if filter(node) =>
691-
val str = node match {
692-
case user: Node.User => Components.displayUserName(user.data)
693-
case _ => node.str
694-
}
691+
source = {
692+
val g: Graph = graph.now
693+
val res1 = (g.nodes.collect { case node: Node if filter(node) && node.role == NodeRole.Neutral =>
695694

696-
new SearchSourceEntry {
697-
title = node.id.toCuidString
698-
description = trimToMaxLength(str, 36)
699-
data = node.asInstanceOf[js.Any]
700-
}
701-
}(breakOut): js.Array[SearchSourceEntry]
695+
val probEdgesRev = g.propertiesEdgeReverseIdx(g.idToIdxOrThrow(node.id))
696+
697+
val probData = probEdgesRev.map{ idx =>
698+
val keyString = g.edges(idx).as[Edge.LabeledProperty].data.key
699+
val propertyValue = g.nodes(g.edgesIdx.b(idx))
700+
val propertySource = g.nodes(g.edgesIdx.a(idx))
701+
(keyString, propertyValue, propertySource)
702+
}
703+
704+
probData.collect {
705+
case p: (String, Node, Node) if p._2.data.isInstanceOf[NodeData.Placeholder] =>
706+
new SearchSourceEntry {
707+
title = p._2.id.toCuidString
708+
placeholder = true
709+
text = s"${p._1} of ${p._3.str}"
710+
description = trimToMaxLength(s"missing ${p._1} of ${p._3.str}", 36)
711+
data = node.asInstanceOf[js.Any]
712+
}
713+
}(breakOut): js.Array[SearchSourceEntry]
714+
}(breakOut): js.Array[js.Array[SearchSourceEntry]]).flatten
715+
716+
val res2 = g.nodes.collect { case node: Node if filter(node) && node.role != NodeRole.Neutral =>
717+
val str = node match {
718+
case user: Node.User => Components.displayUserName(user.data)
719+
case n: Node.Content => node.str
720+
}
721+
722+
new SearchSourceEntry {
723+
title = node.id.toCuidString
724+
placeholder = false
725+
description = trimToMaxLength(str, 36)
726+
data = node.asInstanceOf[js.Any]
727+
}
728+
}(breakOut): js.Array[SearchSourceEntry]
729+
730+
res2 ++ res1
731+
}
702732

703733
searchFields = js.Array("description")
704734

webUtil/src/main/scala/wust/facades/fomanticui/FomanticUI.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ trait SearchSourceEntry extends js.Object {
169169
var description: js.UndefOr[String] = js.undefined
170170
var category: js.UndefOr[String] = js.undefined
171171

172+
var placeholder: js.UndefOr[Boolean] = js.undefined
173+
var text: js.UndefOr[String] = js.undefined
174+
172175
var data: js.UndefOr[js.Any] = js.undefined
173176
}
174177

0 commit comments

Comments
 (0)