Moveable multiple Items in R Shiny boxes - something similar to attached screenshot

后端 未结 2 1616
囚心锁ツ
囚心锁ツ 2021-01-28 13:56

I am trying to build a shiny application where I am trying to build a functionality similar to below screenshot:-

I have build something similar using Shinyjqui

相关标签:
2条回答
  • 2021-01-28 14:03

    Sorry for my poor English. I found jQuery Two side select box and I made shiny demo include this scripts. https://www.jqueryscript.net/form/Two-side-Multi-Select-Plugin-with-jQuery-multiselect-js.html

    shiny with two side select box jQuery

    It seems good but there is one problem that server can't get input values only options selected in right box.

    # function for make UI HTML
    MultiselectHTML <- function(mylist,myname){
      paste_sum <- ""
      for(i in 1:length(mylist)){
        paste_sum <- paste0(paste_sum,"<option value=",i,">",mylist[i],"</option>")
      }
    
      # make tag list
      tagList(
        div(
          class = "item_search"
          ,div(class = "row",
               div(class = "col-xs-5",
                   tags$select(name="from[]",id=myname,class = "form-control",multiple = "multiple",size = "8"
                               ,HTML(paste_sum)
                   )
               )
               ,div(class = "col-xs-2"
                    ,tags$button(type = "button",class = "btn btn-primary btn-block",id=paste0(myname,"_undo"),"undo")
                    ,tags$button(type = "button",class = "btn btn-block",id=paste0(myname,"_rightAll"),tags$i(class = "glyphicon glyphicon-forward"))
                    ,tags$button(type = "button",class = "btn btn-block",id=paste0(myname,"_rightSelected"),tags$i(class = "glyphicon glyphicon-chevron-right"))
                    ,tags$button(type = "button",class = "btn btn-block",id=paste0(myname,"_leftSelected"),tags$i(class = "glyphicon glyphicon-chevron-left"))
                    ,tags$button(type = "button",class = "btn btn-block",id=paste0(myname,"_leftAll"),tags$i(class = "glyphicon glyphicon-backward"))
                    ,tags$button(type = "button",class = "btn btn-warning btn-block",id=paste0(myname,"_redo"),"redo")
               )
               ,div(class = "col-xs-5"
                    ,tags$select(name="to[]",id=paste0(myname,"_to"), class="form-control" ,size="8", multiple="multiple")
               )
          )
        )
        ,br()
      )
    }
    
    ui <- fluidPage(
      tags$head(includeScript("www/multiselect.js"))
      ,tags$script(HTML(
        'jQuery(document).ready(function($) {
          $("#multiselect1").multiselect({
           search: {
           left: \'<input type="text" name="q" class="form-control" placeholder="Search..." />\',
           right: \'<input type="text" name="q" class="form-control" placeholder="Search..." />\',
           },
           fireSearch: function(value) {
           return value.length >= 1;
           }
           });
           });
         ')
      )
      ,MultiselectHTML(c("a","b","c","d","e"),"multiselect1")
      ,h5("Selected List :")
      ,textOutput("mselect")
    )
    
    server <- function(input, output, session) {
      output$mselect <- renderText({input$multiselect1_to})
    }
    
    shinyApp(ui = ui,server = server)
    
    0 讨论(0)
  • 2021-01-28 14:22

    This is just a proof of concept using DT package. Multiple items can be selected from either side and moved over to the other.

    I do not intend to spend time on making this pretty but it should be possible using DT options and css. Lastly, it can be easily reused by packaging in a module.

    ui -

    library(shiny)
    library(DT)
    
    ui <- fluidPage(
      br(),
      splitLayout(cellWidths = c("45%", "10%", "45%"),
        DTOutput("pool"),
        list(
          br(),br(),br(),br(),br(),br(),br(),
          actionButton("add", label = NULL, icon("arrow-right")),
          br(),br(),
          actionButton("remove", label = NULL, icon("arrow-left"))
        ),
        DTOutput("selected")
      )
    )
    

    server -

    server <- function(input, output, session) {
      mem <- reactiveValues(
        pool = data.frame(LETTERS[1:10]), selected = data.frame()
      )
    
      observeEvent(input$add, {
        req(input$pool_rows_selected)
        mem$selected <- rbind(isolate(mem$selected), mem$pool[input$pool_rows_selected, , drop = F])
        mem$pool <- isolate(mem$pool[-input$pool_rows_selected, , drop = F])
      })
    
      observeEvent(input$remove, {
        req(input$selected_rows_selected)
        mem$pool <- rbind(isolate(mem$pool), mem$selected[input$selected_rows_selected, , drop = F])
        mem$selected <- isolate(mem$selected[-input$selected_rows_selected, , drop = F])
      })
    
      output$pool <- renderDT({
        mem$pool
      })
    
      output$selected <- renderDT({
        mem$selected
      })
    }
    
    shinyApp(ui, server)
    

    App Snapshot -

    0 讨论(0)
提交回复
热议问题