Module: MetadataHelper
- Includes:
- WhiteListHelper
- Defined in:
- vendor/plugins/hydra_repository/app/helpers/metadata_helper.rb
Instance Method Summary (collapse)
-
- (Object) editable_metadata_field(resource, datastream_name, field_key, opts = {})
Convenience method for creating editable metadata fields.
- - (Object) metadata_field(resource, datastream_name, field_key, opts = {})
- - (Object) single_value_inline_edit(resource, datastream_name, field_key, opts = {})
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>" |