Module: MetadataHelper

Includes:
WhiteListHelper
Defined in:
vendor/plugins/hydra_repository/app/helpers/metadata_helper.rb

Instance Method Summary (collapse)

Instance Method Details

- (Object) editable_metadata_field(resource, datastream_name, field_key, opts = {})

Convenience method for creating editable metadata fields. Defaults to creating single-value field, but creates multi-value field if :multiple => true Field name can be provided as a string or a symbol (ie. “title” or :title)



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'vendor/plugins/hydra_repository/app/helpers/metadata_helper.rb', line 16

def (resource, datastream_name, field_key, opts={})    
  case opts[:type]
  when :text_area
    result = editable_textile(resource, datastream_name, field_key, opts)
  when :editable_textile
    result = editable_textile(resource, datastream_name, field_key, opts)
  when :date_picker
    result = date_select(resource, datastream_name, field_key, opts)

  when :select
    result = (resource, datastream_name, field_key, opts)
  else
    if opts[:multiple] == true
      result = multi_value_inline_edit(resource, datastream_name, field_key, opts)
    else
      result = single_value_inline_edit(resource, datastream_name, field_key, opts)
    end
  end
  return result
end

- (Object) metadata_field(resource, datastream_name, field_key, opts = {})



5
6
7
8
9
10
11
12
# File 'vendor/plugins/hydra_repository/app/helpers/metadata_helper.rb', line 5

def (resource, datastream_name, field_key, opts={})
  if datastream_name.nil?
    raise ArgumentError.new("This method expects arguments of the form (resource, datastream_name, field_key, opts={})") 
  end
  # If user does not have edit permission, display non-editable metadata
  # If user has edit permission, display editable metadata
  (resource, datastream_name, field_key, opts)
end

- (Object) single_value_inline_edit(resource, datastream_name, field_key, opts = {})



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'vendor/plugins/hydra_repository/app/helpers/metadata_helper.rb', line 38

def single_value_inline_edit(resource, datastream_name, field_key, opts={})    
    field_params = field_update_params(resource, datastream_name, field_key, opts)
    field_name = field_params.delete(:field_name)
    
    if opts.has_key?(:label) 
      label = opts[:label]
    else
      label = field_name
    end
    
    field_value = get_values_from_datastream(resource, datastream_name, field_key, opts).first
    result = "<ol>"
      z = "0"
      name = add_param(field_params.to_query,"asset[#{datastream_name}][#{field_name}][#{z}]")
      result << "<li class=\"editable\" name=\"#{name}\">"
result "      result << \"</li>\"\n    result << \"</ol>\"\n    \n    return :label=>label, :field=> result\n  end\n  \n  def multi_value_inline_edit(resource, datastream_name, field_key, opts={})    \n    field_params = field_update_params(resource, datastream_name, field_key, opts)\n    field_name = field_params.delete(:field_name)\n    \n    if opts.has_key?(:label) \n      label = opts[:label]\n    else\n      label = field_name.dup\n    end\n    label << \"<a class='addval input' href='#'>+</a>\"\n    opts[:default] = \"\" unless opts[:default]\n    result = \"\"\n    result << \"<ol>\"\n      #Output all of the current field values.\n      datastream = resource.datastreams[datastream_name]\n      vlist = get_values_from_datastream(resource, datastream_name, field_key, opts)\n      vlist.each_with_index do |field_value,z|\n        name = add_param(field_params.to_query,\"asset[\#{datastream_name}][\#{field_name}][\#{z}]\")\n        result << \"<li class=\\\"editable\\\" name=\\\"\#{name}\\\">\"\n          result << \"<a href='' title='Delete \\'\#{h(field_value)}\\' class='destructive'><img src='/plugin_assets/hydra_repository/images/delete.png' alt='Delete'></a>\" unless z == 0\n        result << \"<span class=\\\"editableText\\\">\#{h(field_value)}</span>\"\n      result << \"</li>\"\n    end\n    result << \"</ol>\"\n    \n    return :label=>label, :field => result\n  end\n  \n  def editable_textile(resource, datastream_name, field_key, opts={})    \n    field_params = field_update_params(resource, datastream_name, field_key, opts)\n    field_name = field_params.delete(:field_name)\n    \n    if opts.has_key?(:label) \n      label = opts[:label]\n    else\n      label = field_name.dup\n    end\n    if opts[:multiple]\n      label << \"<a class='addval textArea' href='#'>Add \#{field_name}</a>\"\n    end\n    escaped_field_name=field_name.gsub(/_/, '+')\n    \n    opts[:default] = \"\"\n    result = \"\"\n    result << \"<ol>\"\n      vlist = get_values_from_datastream(resource, datastream_name, field_key, opts)\n      vlist.each_with_index do |field_value,z|\n        name = add_param(field_params.to_query,\"asset[\#{datastream_name}][\#{field_name}][\#{z}]\")\n        processed_field_value = white_list( RedCloth.new(field_value, [:sanitize_html]).to_html)\n          field_id = \"\#{field_name}_\#{z}\"\n          result << \"<li name=\\\"\#{name}\\\"  class=\\\"field_value textile_value\\\">\"\n            # Not sure why there is we're not allowing the for the first textile to be deleted, but this was in the original helper.\n            result << \"<a href='' title='Delete \\'\#{processed_field_value}\\'' class='destructive'><img src='/plugin_assets/hydra_repository/images/delete.png' alt='Delete'></a>\" unless z == 0\n            result << \"<div class=\\\"textile\\\" id=\\\"\#{field_id}\\\">\#{processed_field_value}</div>\"\n          result << \"</li>\"\n    end\n    result << \"</ol>\"\n    \n    return :label=>label, :field=>result\n  end\n  \n  # Returns an HTML select with options populated from opts[:choices].\n  # If opts[:choices] is not provided, or if it's not a Hash, a single_value_inline_edit will be returned instead.\n  # Will capitalize the key for each choice when displaying it in the options list.  The value is left alone.\n  def metadata_drop_down(resource, datastream_name, field_key, opts={})    \n    field_params = field_update_params(resource, datastream_name, field_key, opts)\n    field_name = field_params.delete(:field_name)\n\n    if opts[:choices].nil? || !opts[:choices].kind_of?(Hash)\n      single_value_inline_edit(resource, datastream_name, field_key, opts)\n    else\n      if opts.has_key?(:label) \n        label = opts[:label]\n      else\n        label = field_name\n      end      \n      \n      result = \"\"      \n      choices = opts[:choices]\n      field_value = get_values_from_datastream(resource, datastream_name, field_key, opts).first\n      z = \"0\"\n      name = add_param(field_params.to_query,\"asset[\#{datastream_name}][\#{field_name}][\#{z}]\")\n      \n      if field_value.nil?\n        result << \"<select name=\\\"\#{name}\\\" class=\\\"metadata-dd\\\">\"\n      else\n        choices.delete_if {|k, v| v == field_value || v == field_value.capitalize }\n        result << \"<select name=\\\"\#{name}\\\" class=\\\"metadata-dd\\\"><option value=\\\"\#{field_value}\\\" selected=\\\"selected\\\">\#{h(field_value.capitalize)}</option>\"\n      end\n        choices.each_pair do |k,v|\n          result << \"<option value=\\\"\#{v}\\\">\#{h(k)}</option>\"\n        end\n      result << \"</select>\"\n      return :label=>label, :field=>result\n    end\n  end\n  \n  def date_select(resource, datastream_name, field_key, opts={})\n    field_params = field_update_params(resource, datastream_name, field_key, opts)\n    field_name = field_params.delete(:field_name)\n    \n    if opts.has_key?(:label) \n      label = opts[:label]\n    else\n      label = field_name\n    end\n    \n    z = \"0\" # single-values only \n    \n    result = \"\"\n    \n    value = get_values_from_datastream(resource, datastream_name, field_key, opts).first\n    field_value = value.nil? ? \"\" : value\n        \n    field_value[/(\\d+)-(\\d+)-(\\d+)/]\n    year = ($1.nil? or $1.empty?) ? \"\" : $1.to_i\n    month = ($2.nil? or $2.empty?) ? \"-1\" : $2\n    day = ($3.nil? or $3.empty?) ? \"-1\" : $3\n    \n    # Make sure that month and day values are double-digit\n    [month, day].each {|v| v.length == 1 ? v.insert(0, \"0\") : nil }\n    \n    \n    year_options = Array.new(101) {|i| 1910+i}\n    # year_options = Array.new(4) {|i| 1990+i}\n    \n    year_options.insert(0, [\"Year\", \"-1\"])\n    name = add_param(field_params.to_query,\"asset[\#{datastream_name}][\#{field_name}][\#{z}]\")\n    result << \"<div class=\\\"date-select\\\" name=\\\"\#{name}\\\">\"\n      result << \"<input class=\\\"controlled-date-part w4em\\\" style=\\\"width:4em;\\\" type=\\\"text\\\" id=\\\"\#{field_name}_\#{z}-sel-y\\\" name=\\\"\#{field_name}_\#{z}-sel-y\\\" maxlength=\\\"4\\\" value=\\\"\#{year}\\\" />\"    \n      result << \"<select class=\\\"controlled-date-part\\\" id=\\\"\#{field_name}_\#{z}-sel-mm\\\" name=\\\"\#{field_name}_\#{z}-sel-mm\\\">\"\n        result << options_for_select([[\"Month\",\"-1\"],[\"January\", \"01\"],[\"February\", \"02\"],[\"March\", \"03\"],\n                                      [\"April\", \"04\"],[\"May\", \"05\"],[\"June\", \"06\"],[\"July\", \"07\"],[\"August\", \"08\"],\n                                      [\"September\", \"09\"],[\"October\", \"10\"],[\"November\", \"11\"],[\"December\", \"12\"]\n                                      ], month)\n      result << \"</select> / \"\n      result << \"<select class=\\\"controlled-date-part\\\" id=\\\"\#{field_name}_\#{z}-sel-dd\\\" name=\\\"\#{field_name}_\#{z}-sel-dd\\\">\"\n        result << options_for_select([[\"Day\",\"-1\"],\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\", \"20\", \"21\", \"22\", \"23\", \"24\", \"25\", \"26\", \"27\", \"28\", \"29\", \"30\", \"31\"], day)\n      result << \"</select>\"\n    result << \"</div>\"\n    result << <<-EOF\n    <script type=\"text/javascript\">\n    // <![CDATA[  \n      // since the form element ids need to be generated on the server side for the options, the options are attached to the wrapping div via the jQuery data() method.\n      $('div.date-select[name=\"asset[\#{field_name}][\#{z}]\"]').data(\"opts\", {                            \n        formElements:{\"\#{field_name}_\#{z}-sel-dd\":\"d\",\"\#{field_name}_\#{z}-sel-y\":\"Y\",\"\#{field_name}_\#{z}-sel-mm\":\"m\"}         \n      });          \n    // ]]>\n    </script>\n    EOF\n    return :label=>label, :field=>result\n  end\n  \n  def field_update_params(resource, datastream_name, field_key, opts={})\n    \n    url_params = {}\n    # url_params = {\"datastream\"=>datastream_name}\n    if resource.kind_of?(String)\n      ds = ActiveFedora::NokogiriDatastream.new\n    else\n      ds = resource.datastreams_in_memory[datastream_name]\n    end\n    \n    if ds.kind_of?(ActiveFedora::NokogiriDatastream)\n      field_name = OM::XML::Terminology.term_hierarchical_name(*field_key)\n      url_params[:field_name] = field_name\n      url_params[\"field_selectors\"] = {datastream_name=>{field_name => field_key} }\n    else\n      field_name = field_key.to_s\n      url_params[:field_name] = field_name\n    end\n    # url_params[\"asset\"][datastream_name] = {field_name => }\n    return url_params\n  end\n  \n  def get_values_from_datastream(resource, datastream_name, field_key, opts={})\n    if opts.has_key?(:values)\n      values = opts[:values]\n      if values.nil? then values = [opts.fetch(:default, \"\")] end\n      return values\n    else\n      return resource.get_values_from_datastream(datastream_name, field_key, opts.fetch(:default, \"\"))\n    end\n  end\n  \n  def add_param(query_string, new_param)\n    if query_string.empty?\n      return new_param\n    else\n      return query_string + \"&\" + new_param\n    end\n  end\n  \n  def custom_dom_id(resource)\n    classname = resource.class.to_s.gsub(/[A-Z]+/,'\\1_\\0').downcase[1..-1]\n    url = \"\#{classname}_\#{resource.pid}\"   \n  end\n  \n  def prefab_editable_metadata_field(resource, datastream_name, field_key, opts={})\n    field_name = field_key.to_s\n    result = \"\"\n    generated_stuff = editable_metadata_field(@document_fedora, \"rightsMetadata\", :discover_access_group, :label => \"Discover Access:\", :type=>:select, :choices=>{\"Public\" => \"public\",\"Researchers\" => \"researcher\", \"Archivists\" => \"archivist\", \"Archivists\" => \"archivist\"})      \n    result << \"<dt>\"\n    result << \"<label for=\\'\#{field_name}\\\">\"\n    result << generated_stuff[:label]\n    result << \"</dt>\"\n    \n    result << \"<dd id=\\\"\#{field_name}\\\">\"\n    result << generated_stuff[:field]\n    result << \"</dd>\"\n  end\n  \nend\n"editableText\">#{h(field_value)}</span>"