Class: DrgcmsFormFields::Select

Inherits:
DrgcmsField show all
Defined in:
app/models/drgcms_form_fields.rb

Overview

Implementation of select DRG CMS form field.

Form options:

  • name: field name (required)

  • type: select (required)

  • choices: Values for choices separated by comma. Values can also be specified like description:value.

In the example description will be shown to user, but value will be saved to document.

choices: 'OK:0,Ready:1,Error:2'
choices: Ruby,Pyton,PHP
  • eval: Choices will be provided by evaluating expression

    • eval: dc_choices4(‘model_name’,‘description_field_name’,‘_id’); dc_choices4 helper will provide data for select field.

    • eval: ModelName.choices4_field; ModelName class will define method choices4_field which

    will provide data for select field.

    • collection_name.search_field_name.method_name; When searching is more complex custom search

    method may be defined in CollectionName model which will provide result set for search.

  • If choices or eval is not defined choices will be provided from translation helpers. For example: Collection has field status choices for field may be provided by en.helpers.model_name.choices4_status entry of english translation. English is of course default translation. If you provide translations in your local language then select choices will be localized.

    en.helpers.model_name.choices4_status: 'OK:0,Ready:1,Error:2'
    sl.helpers.model_name.choices4_status: 'V redu:0,Pripravljen:1,Napaka:2'
    
  • html: html options which apply to select field (optional)

Form example:

30:
  name: type
  type: select
40:
  name: parent
  type: select
  eval: DcCategory.values_for_parent
  html:
    include_blank: true

Direct Known Subclasses

TextWithSelect

Instance Attribute Summary

Attributes inherited from DrgcmsField

#html, #js

Instance Method Summary collapse

Methods inherited from DrgcmsField

get_data, #hash_to_options, #initialize, #record_text_for, #set_initial_value, #t

Constructor Details

This class inherits a constructor from DrgcmsFormFields::DrgcmsField

Instance Method Details

#do_eval(e) ⇒ Object

Return values, when choices options will be returned by evaluating expression



571
572
573
574
575
576
577
578
# File 'app/models/drgcms_form_fields.rb', line 571

def do_eval(e)
  e.strip!
  method = e.split(/\ |\(/).first
  return eval(e) if respond_to?(method) # id method defined here
  return eval('@parent.'+e) if @parent.respond_to?(method) # is method defined in helpers
# eval whatever it is
  eval e
end

#get_choicesObject

Create choices array for select field.



583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
# File 'app/models/drgcms_form_fields.rb', line 583

def get_choices
  begin
    choices = case 
    when @yaml['choices'] then @yaml['choices']
    when @yaml['eval']    then
      do_eval(@yaml['eval'])
    else 
      c = t('helpers.label.' + @form['table'] + '.choices4_' + @yaml['name'] )
      c = 'Error' if c.match( 'translation missing' )
      c
    end
  # Convert string to Array
    choices.class == String ?
      choices.chomp.split(',').inject([]) {|r,v| r << (v.match(':') ? v.split(':') : v )} :
      choices
  rescue Exception => e 
    p "Error in select eval. #{e.message}"
    ['error'] # return empty array when error occures
  end
end

#renderObject

Render select field html code



624
625
626
627
628
629
630
631
632
# File 'app/models/drgcms_form_fields.rb', line 624

def render
  return ro_standard if @readonly
  set_initial_value('html','selected')
 #
  @yaml['html'].symbolize_keys!
  record = record_text_for(@yaml['name'])  
  @html << @parent.select(record, @yaml['name'], get_choices, @yaml['html'])
  self
end

#ro_standardObject

Return value when readonly is required



607
608
609
610
611
612
613
614
615
616
617
618
619
# File 'app/models/drgcms_form_fields.rb', line 607

def ro_standard
  value = @record.respond_to?(@yaml['name']) ? @record[@yaml['name']] : nil
  return self if value.nil?
#  
  get_choices.each do |choice|
    if choice.class == Array
      return super(choice.first) if choice.last.to_s == value.to_s
    else
      return super(choice) if choice.to_s == value.to_s
    end  
  end
  super('')
end