Skip to content

Commit e0b930a

Browse files
committed
visualize hovered property-link
1 parent 30920d9 commit e0b930a

File tree

5 files changed

+29
-5
lines changed

5 files changed

+29
-5
lines changed

webApp/src/main/scala/state/GlobalState.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ class GlobalState(
4343
val screenSize: Rx[ScreenSize],
4444
)(implicit ctx: Ctx.Owner) {
4545

46+
val hoverNodeId: Var[Option[NodeId]] = Var(None)
47+
4648
val askedForUnregisteredUserName: Var[Boolean] = Var(false)
4749

4850
val rightSidebarNode: Var[Option[FocusPreference]] = Var(None)

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ object Components {
337337
justifyContent.flexEnd,
338338
Elements.icon(ItemProperties.iconByNodeData(property.node.data))(marginRight := "5px"),
339339
editablePropertyNode(state, property.node, property.edge, editMode = editValue,
340-
nonPropertyModifier = VDomModifier(cursor.pointer, onClick.stopPropagation.foreach(state.urlConfig.update(_.focus(Page(property.node.id))))),
340+
nonPropertyModifier = VDomModifier(writeHoveredNode(state, property.node.id), cursor.pointer, onClick.stopPropagation(Some(FocusPreference(property.node.id))) --> state.rightSidebarNode),
341341
maxLength = Some(100), config = EditableContent.Config.default,
342342
),
343343
div(
@@ -387,6 +387,10 @@ object Components {
387387
boxShadow := "inset 0 0 1px 1px lightgray",
388388
color.gray,
389389
drag(DragItem.Property(key), target = DragItem.DisableDrag),
390+
property.role match {
391+
case NodeRole.Neutral => VDomModifier.empty
392+
case _ => writeHoveredNode(state, property.id)
393+
}
390394
)
391395
}
392396

@@ -729,11 +733,10 @@ object Components {
729733
EditableContent.ofNodeOrRender(state, node, editMode, node => renderNodeDataWithFile(state, node.id, node.data, maxLength), config).editValue.map(GraphChanges.addNode) --> state.eventProcessor.changes
730734
)
731735
case _ => VDomModifier(
732-
EditableContent.customOrRender[Node](node, editMode, node => nodeCardWithFile(state, node, maxLength = maxLength).apply(Styles.wordWrap), handler => searchAndSelectNode(state, handler.collectHandler[Option[NodeId]] { case id => EditInteraction.fromOption(id.map(state.rawGraph.now.nodesById(_))) } { case EditInteraction.Input(v) => Some(v.id) }.transformObservable(_.prepend(Some(node.id)))), config).editValue.map { newNode =>
736+
EditableContent.customOrRender[Node](node, editMode, node => nodeCardWithFile(state, node, maxLength = maxLength).apply(Styles.wordWrap, nonPropertyModifier), handler => searchAndSelectNode(state, handler.collectHandler[Option[NodeId]] { case id => EditInteraction.fromOption(id.map(state.rawGraph.now.nodesById(_))) } { case EditInteraction.Input(v) => Some(v.id) }.transformObservable(_.prepend(Some(node.id)))), config).editValue.map { newNode =>
733737

734738
GraphChanges(delEdges = Set(edge), addEdges = Set(edge.copy(propertyId = PropertyId(newNode.id))))
735739
} --> state.eventProcessor.changes,
736-
nonPropertyModifier
737740
)
738741
}
739742
)
@@ -1073,5 +1076,16 @@ object Components {
10731076
VDomModifier.ifTrue(isFocused)(boxShadow := s"4px 0px 2px -2px ${CommonStyles.selectedNodesBgColorCSS}")
10741077
}
10751078
)
1079+
1080+
def showHoveredNode(state: GlobalState, nodeId: NodeId)(implicit ctx: Ctx.Owner): VDomModifier = VDomModifier(
1081+
state.hoverNodeId.map {
1082+
case Some(`nodeId`) => boxShadow := s"inset 0 0 2px 2px gray"
1083+
case _ => VDomModifier.empty
1084+
}
1085+
)
1086+
def writeHoveredNode(state: GlobalState, nodeId: NodeId)(implicit ctx: Ctx.Owner): VDomModifier = VDomModifier(
1087+
onMouseOver(Some(nodeId)) --> state.hoverNodeId,
1088+
onMouseOut(None) --> state.hoverNodeId,
1089+
)
10761090
}
10771091

webApp/src/main/scala/views/KanbanView.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,7 @@ object KanbanView {
511511
nodeInject = VDomModifier.ifTrue(inOneLine)(marginRight := "10px")
512512
).prepend(
513513
Components.sidebarNodeFocusMod(state.rightSidebarNode, node.id),
514+
Components.showHoveredNode(state, node.id),
514515
VDomModifier.ifTrue(showCheckbox)(
515516
taskCheckbox(state, node, parentId :: Nil).apply(float.left, marginRight := "5px")
516517
)

webApp/src/main/scala/views/PageHeader.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import wust.sdk.BaseColors
1616
import wust.sdk.NodeColor.hue
1717
import wust.util._
1818
import wust.webApp._
19-
import wust.webApp.dragdrop.DragItem
19+
import wust.webApp.dragdrop.{DragItem, DragContainer}
2020
import wust.webApp.jsdom.{Navigator, ShareData}
2121
import wust.webApp.outwatchHelpers._
2222
import wust.webApp.search.Search
@@ -55,6 +55,7 @@ object PageHeader {
5555
registerDragContainer(state, DragContainer.Chat),
5656
DragItem.fromNodeRole(pageNode.id, pageNode.role).map(drag(_)),
5757
Components.sidebarNodeFocusMod(state.rightSidebarNode, pageNode.id),
58+
Components.showHoveredNode(state, pageNode.id),
5859
)
5960

6061
val channelMembersList = Rx {

webApp/src/main/scala/views/SharedViewElements.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,13 @@ object SharedViewElements {
383383
}
384384

385385
Rx {
386-
node().map(node => render(node, isDeletedNow()).apply(cursor.pointer, Components.sidebarNodeFocusMod(state.rightSidebarNode, node.id)))
386+
node().map { node =>
387+
render(node, isDeletedNow()).apply(
388+
cursor.pointer,
389+
Components.sidebarNodeFocusMod(state.rightSidebarNode, node.id),
390+
Components.showHoveredNode(state, node.id),
391+
)
392+
}
387393
}
388394
}
389395

0 commit comments

Comments
 (0)