%3 ::xowiki::formfield::select ::xowiki::formfield::select initialize render_input ::xowiki::formfield::enumeration ::xowiki::formfield::enumeration ::xowiki::formfield::select->::xowiki::formfield::enumeration ::xowiki::formfield::candidate_box_select ::xowiki::formfield::candidate_box_select add_bulk_handler add_drag_handler render_input ::xowiki::formfield::candidate_box_select->::xowiki::formfield::select ::xowiki::formfield::role_member ::xowiki::formfield::role_member check=options get_entry_label initialize pretty_value render_input ::xowiki::formfield::role_member->::xowiki::formfield::candidate_box_select ::xowiki::formfield::abstract_page ::xowiki::formfield::abstract_page check=options fetch_entry_label get_entry_label initialize pretty_value render_input ::xowiki::formfield::abstract_page->::xowiki::formfield::candidate_box_select ::xowiki::formfield::page ::xowiki::formfield::page compute_options pretty_value ::xowiki::formfield::page->::xowiki::formfield::abstract_page ::xowiki::formfield::form_page ::xowiki::formfield::form_page compute_options convert_to_internal initialize pretty_value ::xowiki::formfield::form_page->::xowiki::formfield::abstract_page

Class ::xowiki::formfield::candidate_box_select

::xowiki::formfield::candidate_box_select[i] create ... \
           [ -as_box:boolean (default "false") ] \
           [ -bulk_operation:boolean (default "false") ] \
           [ -dnd:boolean (default "true") ] \
           [ -keep_order:boolean (default "false") ]

XOTcl class for selecting a subset from a list of candidates.
Documented Parameters:
as_box
makes something like in info box in wikipedia (right floated)
keep_order
when set, the user provided order is preserved, otherwise the order form the candidates is used.
dnd
allow drag and drop
Defined in packages/xowiki/tcl/form-field-procs.tcl

Class Relations

  • class: ::xotcl::Class[i]
  • superclass: ::xowiki::formfield::select[i]
  • subclass: ::xowiki::formfield::role_member[i], ::xowiki::formfield::abstract_page[i]
::xotcl::Class create ::xowiki::formfield::candidate_box_select \
     -superclass ::xowiki::formfield::select

Methods (to be applied on instances)

  • add_bulk_handler (scripted)

    template::add_event_listener  -id $id  -event $event  -preventdefault=false  -script "selection_area_bulk_operation_handler(event,'$operation');"
  • add_drag_handler (scripted)

    template::add_event_listener  -id $id  -event $event  -preventdefault=false  -script "selection_area_${event}_handler(event);"
  • as_box (setter)

  • bulk_operation (setter)

  • dnd (setter)

  • keep_order (setter)

  • render_input (scripted)

    #:msg "mul ${:multiple} dnd ${:dnd}"
    # makes only sense currently for multiple selects
    
    if {${:multiple} && ${:dnd}} {
    
      if {[:is_disabled]} {
        html::t -disableOutputEscaping [:pretty_value [:value]]
      } else {
    
        ::xo::Page requireJS  "/resources/xowiki/selection-area.js"
        set count 0
        set selected {}
        set candidates {}
    
        foreach o ${:options} {
          lassign $o label rep
          if {$rep in ${:value}} {
            lappend selected $rep
          } else {
            lappend candidates $rep
          }
          dict set labels $rep label $label
          #dict set labels $rep label $rep
          dict set labels $rep serial [incr count]
        }
        if {${:keep_order}} {
          set selected [lmap v ${:value} {
            if {$v ni $selected} {
              continue
            }
            set _ $v
          }]
        }
    
        html::div -class candidate-selection -id ${:id} {
          #
          # Internal representation
          #
          ::html::textarea -id ${:id}.text -name ${:name} {
            ::html::t [join ${:value} \n]
          }
    
          #
          # Selections
          #
          ::html::div -class "workarea selected" {
            ::html::h3 { ::html::t "#xowiki.Selection# ([llength $selected])"}
            # TODO what todo with DISABLED?
            if {${:bulk_operation}} {
              ::html::div -id ${:id}.bulk_remove -role "button" -class "text-center bulk-remove" {
                ::html::t ">>"
                :add_bulk_handler -id ${:id}.bulk_remove -event click -operation bulk_remove
              }
            }
            ::html::ul -class "region selected"  -id ${:id}.selected {
                  foreach v $selected {
                    set id ${:id}.selected.[dict get $labels $v serial]
                    ::html::li -class "selection list-group-item"  -draggable true -id $id -data-value $v {
                          ::html::t [dict get $labels $v label]
                        }
                    :add_drag_handler -id $id -event dragstart
                  }
                }
            :add_drag_handler -id ${:id}.selected -event drop
            :add_drag_handler -id ${:id}.selected -event dragover
          }
          #
          # Candidates
          #
          ::html::div -class "workarea candidates" {
            ::html::h3 { ::html::t "#xowiki.Candidates# ([llength $candidates])"}
            if {${:bulk_operation}} {
              ::html::div -id ${:id}.bulk_add -role "button" -class "text-center bulk-add" {
                ::html::t "<<"
                :add_bulk_handler -id ${:id}.bulk_add -event click -operation bulk_add
              }
            }
            ::html::ul -id ${:id}.candidates -class region {
              foreach v $candidates {
                set id ${:id}.[dict get $labels $v serial]
                ::html::li  -class "candidates list-group-item"  -draggable true -id $id -data-value $v {
                      ::html::t [dict get $labels $v label]
                    }
                :add_drag_handler -id $id -event dragstart
              }
            }
            :add_drag_handler -id ${:id}.candidates -event drop
            :add_drag_handler -id ${:id}.candidates -event dragover
          }
        }
        ::html::div -class visual-clear {
          ;# this space is left intentionally blank
        }
      }
    } else {
      next
    }