Module: HydraFedoraMetadataHelper
- Defined in:
- vendor/plugins/hydra_repository/app/helpers/hydra_fedora_metadata_helper.rb
Defined Under Namespace
Classes: HydraFormFor
Instance Method Summary (collapse)
- - (Object) fedora_checkbox(resource, datastream_name, field_key, opts = {})
- - (Object) fedora_date_select(resource, datastream_name, field_key, opts = {})
- - (Object) fedora_field_label(datastream_name, field_key, label = nil)
- - (Object) fedora_radio_button(resource, datastream_name, field_key, opts = {})
-
- (Object) fedora_select(resource, datastream_name, field_key, opts = {})
Expects :choices option.
- - (Object) fedora_text_area(resource, datastream_name, field_key, opts = {})
- - (Object) fedora_text_area_insert_link(datastream_name, field_key, opts = {})
- - (Object) fedora_text_field(resource, datastream_name, field_key, opts = {})
- - (Object) fedora_text_field_insert_link(datastream_name, field_key, opts = {})
-
- (Object) fedora_textile_text_area(resource, datastream_name, field_key, opts = {})
Textile textarea varies from the other methods in a few ways Since we’re using jeditable with this instead of fluid, we need to provide slightly different hooks for the javascript
we are storing the datastream name in data-datastream-name so that we can construct a load url on the fly when initializing the textarea.
- - (Object) field_name_for(field_key)
-
- (Object) field_selectors_for(datastream_name, field_key)
Generate hidden inputs to handle mapping field names to server-side metadata mappings this allows us to round-trip OM metadata mappings also (importantly) allows us to avoid executing xpath queries from http requests.
- - (Object) generate_base_id(field_name, current_value, values, opts)
-
- (Object) get_values_from_datastream(resource, datastream_name, field_key, opts = {})
retrieve field values from datastream.
Instance Method Details
- (Object) fedora_checkbox(resource, datastream_name, field_key, opts = {})
158 159 |
# File 'vendor/plugins/hydra_repository/app/helpers/hydra_fedora_metadata_helper.rb', line 158 def fedora_checkbox(resource, datastream_name, field_key, opts={}) end |
- (Object) fedora_date_select(resource, datastream_name, field_key, opts = {})
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'vendor/plugins/hydra_repository/app/helpers/hydra_fedora_metadata_helper.rb', line 105 def fedora_date_select(resource, datastream_name, field_key, opts={}) field_name = field_name_for(field_key) field_values = get_values_from_datastream(resource, datastream_name, field_key, opts) base_id = generate_base_id(field_name, field_values.first, field_values, opts.merge({:multiple=>false})) name = "asset[#{datastream_name}][#{base_id}]" value = field_values.first field_value = value.nil? ? "" : value field_value[/(\d+)-(\d+)-(\d+)/] year = ($1.nil? or $1.empty?) ? "" : $1.to_i month = ($2.nil? or $2.empty?) ? "-1" : $2 day = ($3.nil? or $3.empty?) ? "-1" : $3 # Make sure that month and day values are double-digit [month, day].each {|v| v.length == 1 ? v.insert(0, "0") : nil } = Array.new(101) {|i| 1910+i} # year_options = Array.new(4) {|i| 1990+i} .insert(0, ["Year", "-1"]) body = "" body << "<div class=\"date-select\" name=\"#{name}\" rel=\"#{field_name}\">" body << "<input class=\"controlled-date-part w4em\" style=\"width:4em;\" type=\"text\" id=\"#{base_id}-sel-y\" name=\"#{base_id}-sel-y\" maxlength=\"4\" value=\"#{year}\" />" body << "<select class=\"controlled-date-part\" id=\"#{base_id}-sel-mm\" name=\"#{base_id}-sel-mm\">" body << ([["Month","-1"],["January", "01"],["February", "02"],["March", "03"], ["April", "04"],["May", "05"],["June", "06"],["July", "07"],["August", "08"], ["September", "09"],["October", "10"],["November", "11"],["December", "12"] ], month) body << "</select> / " body << "<select class=\"controlled-date-part\" id=\"#{base_id}-sel-dd\" name=\"#{base_id}-sel-dd\">" body << ([["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) body << "</select>" body << "</div>" body << "<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=\"\#{name}\"]').data(\"opts\", {\nformElements:{\"\#{base_id}-sel-dd\":\"d\",\"\#{base_id}-sel-y\":\"Y\",\"\#{base_id}-sel-mm\":\"m\"}\n});\n// ]]>\n</script>\n" result = field_selectors_for(datastream_name, field_key) result << body return result end |
- (Object) fedora_field_label(datastream_name, field_key, label = nil)
189 190 191 192 193 194 195 |
# File 'vendor/plugins/hydra_repository/app/helpers/hydra_fedora_metadata_helper.rb', line 189 def fedora_field_label(datastream_name, field_key, label=nil) field_name = field_name_for(field_key) if label.nil? label = field_name end return content_tag "label", label, :for=>field_name end |
- (Object) fedora_radio_button(resource, datastream_name, field_key, opts = {})
161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
# File 'vendor/plugins/hydra_repository/app/helpers/hydra_fedora_metadata_helper.rb', line 161 def (resource, datastream_name, field_key, opts={}) field_name = field_name_for(field_key) field_values = get_values_from_datastream(resource, datastream_name, field_key, opts) base_id = generate_base_id(field_name, field_values.first, field_values, opts.merge({:multiple=>false})) result = "" h_name = OM::XML::Terminology.term_hierarchical_name(*field_key) field_values.each_with_index do |current_value, z| result << tag(:input, :type=>"radio", :class=>"fieldselector", :rel=>h_name, :name=>"field_selectors[#{datastream_name}][#{h_name}][#{opts[0]}]", :value=>opts.first[0]) result << " #{opts.first[1]}" end return result end |
- (Object) fedora_select(resource, datastream_name, field_key, opts = {})
Expects :choices option. Option tags for the select are generated from the :choices option using Rails “options_for_select”:apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_for_select helper If no :choices option is provided, returns a regular fedora_text_field
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'vendor/plugins/hydra_repository/app/helpers/hydra_fedora_metadata_helper.rb', line 82 def fedora_select(resource, datastream_name, field_key, opts={}) if opts[:choices].nil? result = fedora_text_field(resource, datastream_name, field_key, opts) else choices = opts[:choices] field_name = field_name_for(field_key) field_values = get_values_from_datastream(resource, datastream_name, field_key, opts) body = "" z = 0 base_id = generate_base_id(field_name, field_values.first, field_values, opts.merge({:multiple=>false})) name = "asset[#{datastream_name}][#{field_name}][#{z}]" body << "<select name=\"#{name}\" class=\"metadata-dd select-edit\" rel=\"#{field_name}\">" body << (choices, field_values) body << "</select>" result = field_selectors_for(datastream_name, field_key) result << body end return result end |
- (Object) fedora_text_area(resource, datastream_name, field_key, opts = {})
37 38 39 |
# File 'vendor/plugins/hydra_repository/app/helpers/hydra_fedora_metadata_helper.rb', line 37 def fedora_text_area(resource, datastream_name, field_key, opts={}) fedora_textile_text_area(resource, datastream_name, field_key, opts) end |
- (Object) fedora_text_area_insert_link(datastream_name, field_key, opts = {})
183 184 185 186 187 |
# File 'vendor/plugins/hydra_repository/app/helpers/hydra_fedora_metadata_helper.rb', line 183 def fedora_text_area_insert_link(datastream_name, field_key, opts={}) field_name = field_name_for(field_key) link_text = "Add #{(opts[:label] || field_key.last || field_key).to_s.camelize.titlecase}" "<a class='addval textarea' href='#' data-datastream-name=\"#{datastream_name}\" rel=\"#{field_name}\" title='#{link_text}'>#{link_text}</a>" end |
- (Object) fedora_text_field(resource, datastream_name, field_key, opts = {})
6 7 8 9 10 11 12 13 14 15 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/hydra_fedora_metadata_helper.rb', line 6 def fedora_text_field(resource, datastream_name, field_key, opts={}) field_name = field_name_for(field_key) field_values = get_values_from_datastream(resource, datastream_name, field_key, opts) if opts.fetch(:multiple, true) container_tag_type = :li else field_values = [field_values.first] container_tag_type = :span end body = "" field_values.each_with_index do |current_value, z| base_id = generate_base_id(field_name, current_value, field_values, opts) name = "asset[#{datastream_name}][#{field_name}][#{z}]" body << "<#{container_tag_type.to_s} class=\"editable-container field\" id=\"#{base_id}-container\">" body << "<a href=\"\" title=\"Delete '#{h(current_value)}'\" class=\"destructive field\">Delete</a>" unless z == 0 body << "<span class=\"editable-text text\" id=\"#{base_id}-text\">#{h(current_value)}</span>" body << "<input class=\"editable-edit edit\" id=\"#{base_id}\" data-datastream-name=\"#{datastream_name}\" rel=\"#{field_name}\" name=\"#{name}\" value=\"#{h(current_value)}\"/>" body << "</#{container_tag_type}>" end result = field_selectors_for(datastream_name, field_key) if opts.fetch(:multiple, true) result << content_tag(:ol, body, :rel=>field_name) else result << body end return result end |
- (Object) fedora_text_field_insert_link(datastream_name, field_key, opts = {})
176 177 178 179 180 181 |
# File 'vendor/plugins/hydra_repository/app/helpers/hydra_fedora_metadata_helper.rb', line 176 def fedora_text_field_insert_link(datastream_name, field_key, opts={}) field_name = field_name_for(field_key) || field_key field_type = field_name == "grant" ? "grant" : "textfield" link_text = "Add #{(opts[:label] || field_key.last || field_key).to_s.camelize.titlecase}" "<a class='addval #{field_type}' href='#' data-datastream-name=\"#{datastream_name}\" rel=\"#{field_name}\" title='#{link_text}'>#{link_text}</a>" end |
- (Object) fedora_textile_text_area(resource, datastream_name, field_key, opts = {})
Textile textarea varies from the other methods in a few ways Since we’re using jeditable with this instead of fluid, we need to provide slightly different hooks for the javascript
we are storing the datastream name in data-datastream-name so that we can construct a load url on the fly when initializing the textarea
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'vendor/plugins/hydra_repository/app/helpers/hydra_fedora_metadata_helper.rb', line 44 def fedora_textile_text_area(resource, datastream_name, field_key, opts={}) field_name = field_name_for(field_key) field_values = get_values_from_datastream(resource, datastream_name, field_key, opts) if opts.fetch(:multiple, true) container_tag_type = :li else field_values = [field_values.first] container_tag_type = :span end body = "" field_values.each_with_index do |current_value, z| base_id = generate_base_id(field_name, current_value, field_values, opts) name = "asset[#{datastream_name}][#{field_name}][#{z}]" processed_field_value = white_list( RedCloth.new(current_value, [:sanitize_html]).to_html) body << "<#{container_tag_type.to_s} class=\"field_value textile-container field\" id=\"#{base_id}-container\">" # Not sure why there is we're not allowing the for the first textile to be deleted, but this was in the original helper. body << "<a href=\"\" title=\"Delete '#{h(current_value)}'\" class=\"destructive field\">Delete</a>" unless z == 0 body << "<div class=\"textile-text text\" id=\"#{base_id}-text\">#{processed_field_value}</div>" body << "<input class=\"textile-edit edit\" id=\"#{base_id}\" data-datastream-name=\"#{datastream_name}\" rel=\"#{field_name}\" name=\"#{name}\" value=\"#{h(current_value)}\"/>" body << "</#{container_tag_type}>" end result = field_selectors_for(datastream_name, field_key) if opts.fetch(:multiple, true) result << content_tag(:ol, body, :rel=>field_name) else result << body end return result end |
- (Object) field_name_for(field_key)
284 285 286 287 288 289 290 |
# File 'vendor/plugins/hydra_repository/app/helpers/hydra_fedora_metadata_helper.rb', line 284 def field_name_for(field_key) if field_key.kind_of?(Array) return OM::XML::Terminology.term_hierarchical_name(*field_key) else field_key.to_s end end |
- (Object) field_selectors_for(datastream_name, field_key)
Generate hidden inputs to handle mapping field names to server-side metadata mappings this allows us to round-trip OM metadata mappings also (importantly) allows us to avoid executing xpath queries from http requests. Note: It’s important that you serialize these inputs in order from top to bottom (standard HTML form behavior)
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
# File 'vendor/plugins/hydra_repository/app/helpers/hydra_fedora_metadata_helper.rb', line 201 def field_selectors_for(datastream_name, field_key) result = "" if field_key.kind_of?(Array) h_name = OM::XML::Terminology.term_hierarchical_name(*field_key) field_key.each do |pointer| if pointer.kind_of?(Hash) k = pointer.keys.first v = pointer.values.first # result << "<input type=\"hidden\", rel=\"#{h_name}\" name=\"field_selectors[#{datastream_name}][#{h_name}][][#{k}]\" value=\"#{v}\"/>" result << tag(:input, :type=>"hidden", :class=>"fieldselector", :rel=>h_name, :name=>"field_selectors[#{datastream_name}][#{h_name}][][#{k}]", :value=>v) else result << tag(:input, :type=>"hidden", :class=>"fieldselector", :rel=>h_name, :name=>"field_selectors[#{datastream_name}][#{h_name}][]", :value=>pointer.to_s) end end end return result end |
- (Object) generate_base_id(field_name, current_value, values, opts)
292 293 294 295 296 297 298 |
# File 'vendor/plugins/hydra_repository/app/helpers/hydra_fedora_metadata_helper.rb', line 292 def generate_base_id(field_name, current_value, values, opts) if opts.fetch(:multiple, true) return field_name+"_"+values.index(current_value).to_s else return field_name end end |
- (Object) get_values_from_datastream(resource, datastream_name, field_key, opts = {})
retrieve field values from datastream. If :values is provided, skips accessing the datastream and returns the contents of :values instead.
273 274 275 276 277 278 279 280 281 282 |
# File 'vendor/plugins/hydra_repository/app/helpers/hydra_fedora_metadata_helper.rb', line 273 def get_values_from_datastream(resource, datastream_name, field_key, opts={}) if opts.has_key?(:values) values = opts[:values] if values.nil? then values = [opts.fetch(:default, "")] end else values = resource.get_values_from_datastream(datastream_name, field_key, opts.fetch(:default, "")) if values.empty? then values = [ opts.fetch(:default, "") ] end end return values end |