--- title: "Context Menu Items" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Context Menu Items} %\VignetteEngine{quarto::html} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", eval = FALSE ) ``` ```{r setup} library(blockr.dag) ``` The __context menu__ provides __actions__ based on what element is __right-clicked__ in the graph. ## Available Actions | Target Element | Available Actions | |----------------|------------------| | Canvas | • Add block
• Create stack | | Node (block) | • Create link
• Remove block
• Append block | | Edge (link) | • Remove link | | Combo (stack) | • Remove stack
• Edit stack: add/remove blocks and change color | ## Creating Context Menu Entries Context menu items are created with `new_context_menu_entry()`: ```{r} # Context menu entry entry <- new_context_menu_entry( name = "Custom Action", js = function(ns) "alert('Custom action')", action = function(board, update, ...) { # Server-side logic }, condition = function(board, target) { target$type == "node" } ) ``` `js` can be a string representing a JavaScript function or an R function that takes the namespace `ns` as input and returns a string: ```r function(ns) { sprintf( "(value, target, current) => { Shiny.setInputValue('%s', true, {priority: 'event'}); }", ns("add_block") ) } ``` `condition` is an either a boolean or an R function that takes the `board` and `target` (the clicked element) as input and returns `TRUE` or `FALSE` to determine if the entry should be shown. Any new entry has to go inside `context_menu_items.dag_extension` for registration: ```{r} # Add custom context menu items to an extension context_menu_items.dag_extension <- function(x) { list( new_context_menu_entry( name = "My Action", js = function(ns) { sprintf("Shiny.setInputValue('%s', true)", ns("my_action")) }, action = my_custom_action("my_action"), condition = function(board, target) TRUE ) ) } ```