class TTY::Prompt::MultiList

A class responsible for rendering multi select list menu. Used by {Prompt} to display interactive choice menu.

@api private

Constants

HELP

Public Class Methods

new(prompt, options) click to toggle source

Create instance of TTY::Prompt::MultiList menu.

@param [Prompt] :prompt @param [Hash] options

@api public

Calls superclass method TTY::Prompt::List::new
# File lib/tty/prompt/multi_list.rb, line 20
def initialize(prompt, options)
  super
  @selected = []
  @help    = options[:help]
  @default = Array(options[:default])
  @echo = options.fetch(:echo, true)
end

Public Instance Methods

keyspace(*) click to toggle source

Callback fired when space key is pressed

@api private

# File lib/tty/prompt/multi_list.rb, line 31
def keyspace(*)
  active_choice = @choices[@active - 1]
  if @selected.include?(active_choice)
    @selected.delete(active_choice)
  else
    @selected << active_choice
  end
end

Private Instance Methods

answer() click to toggle source

All values for the choices selected

@return [Array]

@api private

# File lib/tty/prompt/multi_list.rb, line 79
def answer
  @selected.map(&:value)
end
render_header() click to toggle source

Render initial help text and then currently selected choices

@api private

# File lib/tty/prompt/multi_list.rb, line 63
def render_header
  instructions = @prompt.decorate(help, :bright_black)
  if @done && @echo
    @prompt.decorate(selected_names, @active_color)
  elsif @selected.size.nonzero? && @echo
    selected_names + (@first_render ? " #{instructions}" : '')
  elsif @first_render
    instructions
  end
end
render_menu() click to toggle source

Render menu with choices to select from

@return [String]

@api private

# File lib/tty/prompt/multi_list.rb, line 88
def render_menu
  output = ''
  @paginator.paginate(@choices, @active, @per_page) do |choice, index|
    num = enumerate? ? (index + 1).to_s + @enum + ' ' : ''
    indicator = (index + 1 == @active) ?  @marker : ' '
    indicator += ' '
    message = if @selected.include?(choice)
                selected = @prompt.decorate(symbols[:radio_on], @active_color)
                selected + ' ' + num + choice.name
              else
                symbols[:radio_off] + ' ' + num + choice.name
              end
    max_index = paginated? ? @paginator.max_index : @choices.size - 1
    newline = (index == max_index) ? '' : "\n"
    output << indicator + message + newline
  end
  output
end
selected_names() click to toggle source

Generate selected items names

@return [String]

@api private

# File lib/tty/prompt/multi_list.rb, line 56
def selected_names
  @selected.map(&:name).join(', ')
end
setup_defaults() click to toggle source

Setup default options and active selection

@api private

# File lib/tty/prompt/multi_list.rb, line 45
def setup_defaults
  validate_defaults
  @selected = @choices.values_at(*@default.map { |d| d - 1 })
  @active = @default.last unless @selected.empty?
end