hydra-editor 1.0.0.beta1 → 1.0.0.beta2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +12 -2
- data/app/assets/javascripts/hydra-editor/editMetadata.js +2 -3
- data/app/assets/javascripts/hydra-editor/hydra-editor.js +3 -1
- data/app/assets/javascripts/hydra-editor/keyboard_support.rb +14 -0
- data/app/assets/javascripts/hydra-editor/manage_repeating_fields.js +123 -0
- data/app/assets/stylesheets/hydra-editor/multi_value_fields.scss +52 -0
- data/app/forms/hydra_editor/form.rb +1 -3
- data/app/helpers/concerns/records_helper_behavior.rb +0 -27
- data/app/inputs/multi_value_input.rb +68 -0
- data/app/views/records/_form.html.erb +3 -3
- data/app/views/records/choose_type.html.erb +2 -2
- data/app/views/records/edit_fields/_default.html.erb +5 -10
- data/config/initializers/simple_form.rb +31 -0
- data/lib/hydra-editor.rb +0 -1
- data/lib/hydra_editor/version.rb +1 -1
- metadata +20 -18
- data/app/assets/javascripts/hydra-editor/multiForm.js +0 -58
- data/app/views/records/_edit_field.html.erb +0 -14
- data/app/views/records/edit_fields/_suffix.html.erb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bbbf4cde2792c9d9300d1fa47fade355fba8524f
|
4
|
+
data.tar.gz: 3a789723a0779f07cc15ea3679a47d14c93d6d91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 04413d824a3e627515d9cdb394c7df5078511e0f2c9696adfc15bd5d206448f11c63b87c4eaa30fcc24a30ac8ff36a3789095b2edf134168732d319a7d835a83
|
7
|
+
data.tar.gz: a13b247060e85a4e22f8fc2d2cfaa2323bed61f0d453b7178921efc4e9b6431f17149dcb60a2d04c7d4fc11a0c776cbffbe546d17ed1e4ff1697b45f3725eb2f
|
data/README.md
CHANGED
@@ -39,9 +39,17 @@ en:
|
|
39
39
|
|
40
40
|
```
|
41
41
|
|
42
|
-
|
42
|
+
Create a form object for each of your models.
|
43
43
|
|
44
|
-
```
|
44
|
+
```ruby
|
45
|
+
# app/forms/recorded_audio_form.rb
|
46
|
+
class RecordedAudioForm
|
47
|
+
include HydraEditor::Form
|
48
|
+
self.model_class = RecordedAudio
|
49
|
+
self.terms = [] # Terms to be edited
|
50
|
+
self.required_fields = [] # Required fields
|
51
|
+
end
|
52
|
+
```
|
45
53
|
|
46
54
|
Add the javascript by adding this line to your app/assets/javascript/application.js:
|
47
55
|
|
@@ -55,6 +63,8 @@ Add the stylesheets by adding this line to your app/assets/stylesheets/applicati
|
|
55
63
|
*= require hydra-editor/hydra-editor
|
56
64
|
```
|
57
65
|
|
66
|
+
(Note: The Javascript includes require Blacklight and must be put after that.)
|
67
|
+
|
58
68
|
## Other customizations
|
59
69
|
|
60
70
|
By default hydra-editor provides a RecordsController with :new, :create, :edit, and :update actions implemented in the included RecordsControllerBehavior module, and a RecordsHelper module with methods implemented in RecordsHelperBehavior. If you are mounting the engine and using its routes, you can override the controller behaviors by creating your own RecordsController:
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Blacklight.onLoad(function() {
|
2
|
+
$('body').on('keypress', '.multi-text-field', function(event) {
|
3
|
+
var $activeField = $(event.target).parents('.field-wrapper'),
|
4
|
+
$activeFieldControls = $activeField.children('.field-controls'),
|
5
|
+
$addControl = $activeFieldControls.children('.add'),
|
6
|
+
$removeControl = $activeFieldControls.children('.remove');
|
7
|
+
if (event.keyCode == 13) {
|
8
|
+
event.preventDefault();
|
9
|
+
$addControl.click()
|
10
|
+
$removeControl.click()
|
11
|
+
}
|
12
|
+
});
|
13
|
+
});
|
14
|
+
|
@@ -0,0 +1,123 @@
|
|
1
|
+
// This widget manages the adding and removing of repeating fields.
|
2
|
+
// There are a lot of assumptions about the structure of the classes and elements.
|
3
|
+
// These assumptions are reflected in the MultiValueInput class.
|
4
|
+
|
5
|
+
(function($){
|
6
|
+
|
7
|
+
var FieldManager = function (element, options) {
|
8
|
+
this.element = $(element);
|
9
|
+
this.options = options;
|
10
|
+
|
11
|
+
this.controls = $("<span class=\"input-group-btn field-controls\">");
|
12
|
+
this.remover = $("<button class=\"btn btn-danger remove\"><i class=\"icon-white glyphicon-minus\"></i><span>Remove</span></button>");
|
13
|
+
this.adder = $("<button class=\"btn btn-success add\"><i class=\"icon-white glyphicon-plus\"></i><span>Add</span></button>");
|
14
|
+
|
15
|
+
this.fieldWrapperClass = '.field-wrapper';
|
16
|
+
this.warningClass = '.has-warning';
|
17
|
+
this.listClass = '.listing';
|
18
|
+
|
19
|
+
this.init();
|
20
|
+
}
|
21
|
+
|
22
|
+
FieldManager.prototype = {
|
23
|
+
init: function () {
|
24
|
+
this._addInitialClasses();
|
25
|
+
this._appendControls();
|
26
|
+
this._attachEvents();
|
27
|
+
this._addCallbacks();
|
28
|
+
},
|
29
|
+
|
30
|
+
_addInitialClasses: function () {
|
31
|
+
this.element.addClass("managed");
|
32
|
+
$(this.fieldWrapperClass, this.element).addClass("input-group input-append");
|
33
|
+
},
|
34
|
+
|
35
|
+
_appendControls: function() {
|
36
|
+
$(this.fieldWrapperClass, this.element).append(this.controls);
|
37
|
+
$(this.fieldWrapperClass+':not(:last-child) .field-controls', this.element).append(this.remover);
|
38
|
+
$('.field-controls:last', this.element).append(this.adder);
|
39
|
+
},
|
40
|
+
|
41
|
+
_attachEvents: function() {
|
42
|
+
var _this = this;
|
43
|
+
this.element.on('click', '.remove', function (e) {
|
44
|
+
_this.remove_from_list(e);
|
45
|
+
});
|
46
|
+
this.element.on('click', '.add', function (e) {
|
47
|
+
_this.add_to_list(e);
|
48
|
+
});
|
49
|
+
},
|
50
|
+
|
51
|
+
_addCallbacks: function() {
|
52
|
+
this.element.bind('managed_field:add', this.options.add);
|
53
|
+
this.element.bind('managed_field:remove', this.options.remove);
|
54
|
+
},
|
55
|
+
|
56
|
+
add_to_list: function( event ) {
|
57
|
+
event.preventDefault();
|
58
|
+
var $activeField = $(event.target).parents(this.fieldWrapperClass)
|
59
|
+
|
60
|
+
if ($activeField.children('input').val() === '') {
|
61
|
+
this.displayEmptyWarning();
|
62
|
+
} else {
|
63
|
+
var $listing = $(this.listClass, this.element);
|
64
|
+
this.clearEmptyWarning();
|
65
|
+
$listing.append(this._newField($activeField));
|
66
|
+
}
|
67
|
+
},
|
68
|
+
|
69
|
+
_newField: function($activeField) {
|
70
|
+
var $removeControl = this.remover.clone(),
|
71
|
+
$activeFieldControls = $activeField.children('.field-controls'),
|
72
|
+
$newField = $activeField.clone();
|
73
|
+
$('.add', $activeFieldControls).remove();
|
74
|
+
$activeFieldControls.prepend($removeControl);
|
75
|
+
$newChildren = $newField.children('input');
|
76
|
+
$newChildren.val('').removeProp('required');
|
77
|
+
$newChildren.first().focus();
|
78
|
+
this.element.trigger("managed_field:add", $newChildren.first());
|
79
|
+
return $newField;
|
80
|
+
},
|
81
|
+
|
82
|
+
clearEmptyWarning: function() {
|
83
|
+
$listing = $(this.listClass, this.element),
|
84
|
+
$listing.children(this.warningClass).remove();
|
85
|
+
},
|
86
|
+
|
87
|
+
displayEmptyWarning: function () {
|
88
|
+
$listing = $(this.listClass, this.element)
|
89
|
+
var $warningMessage = $("<div class=\'message has-warning\'>cannot add new empty field</div>");
|
90
|
+
$listing.children(this.warningClass).remove();
|
91
|
+
$listing.append($warningMessage);
|
92
|
+
},
|
93
|
+
|
94
|
+
remove_from_list: function( event ) {
|
95
|
+
event.preventDefault();
|
96
|
+
|
97
|
+
var field = $(event.target).parents(this.fieldWrapperClass)
|
98
|
+
field.remove();
|
99
|
+
|
100
|
+
this.element.trigger("managed_field:remove", field);
|
101
|
+
},
|
102
|
+
|
103
|
+
destroy: function() {
|
104
|
+
$(this.fieldWrapperClass, this.element).removeClass("input-append");
|
105
|
+
this.element.removeClass( "managed" );
|
106
|
+
}
|
107
|
+
}
|
108
|
+
|
109
|
+
FieldManager.DEFAULTS = {
|
110
|
+
add: null,
|
111
|
+
remove: null
|
112
|
+
}
|
113
|
+
|
114
|
+
$.fn.manage_fields = function(option) {
|
115
|
+
return this.each(function() {
|
116
|
+
var $this = $(this);
|
117
|
+
var data = $this.data('manage_fields');
|
118
|
+
var options = $.extend({}, FieldManager.DEFAULTS, $this.data(), typeof option == 'object' && option);
|
119
|
+
|
120
|
+
if (!data) $this.data('manage_fields', (data = new FieldManager(this, options)));
|
121
|
+
})
|
122
|
+
}
|
123
|
+
})(jQuery);
|
@@ -0,0 +1,52 @@
|
|
1
|
+
.multi_value {
|
2
|
+
.field-wrapper {
|
3
|
+
list-style-type:none;
|
4
|
+
}
|
5
|
+
|
6
|
+
.listing {
|
7
|
+
margin-left: 0;
|
8
|
+
max-width: 40em;
|
9
|
+
padding-left: 0px;
|
10
|
+
.input-group {
|
11
|
+
margin-bottom: 1px;
|
12
|
+
}
|
13
|
+
}
|
14
|
+
|
15
|
+
.field-controls span {
|
16
|
+
margin-left:.2em;
|
17
|
+
}
|
18
|
+
|
19
|
+
.field-controls {
|
20
|
+
margin-left: 2em;
|
21
|
+
}
|
22
|
+
|
23
|
+
.message{
|
24
|
+
background-size: 40px 40px;
|
25
|
+
background-image: linear-gradient(135deg, rgba(255, 255, 255, .05) 25%, transparent 25%,
|
26
|
+
transparent 50%, rgba(255, 255, 255, .05) 50%, rgba(255, 255, 255, .05) 75%,
|
27
|
+
transparent 75%, transparent);
|
28
|
+
box-shadow: inset 0 -1px 0 rgba(255,255,255,.4);
|
29
|
+
width: 100%;
|
30
|
+
border: 1px solid;
|
31
|
+
color: #fff;
|
32
|
+
padding: 10px;
|
33
|
+
text-shadow: 0 1px 0 rgba(0,0,0,.5);
|
34
|
+
animation: animate-bg 5s linear infinite;
|
35
|
+
border-radius: $border-radius-base;
|
36
|
+
}
|
37
|
+
|
38
|
+
.has-error{
|
39
|
+
background-color: #de4343;
|
40
|
+
border-color: #c43d3d;
|
41
|
+
}
|
42
|
+
|
43
|
+
.has-warning{
|
44
|
+
background-color: #eaaf51;
|
45
|
+
border-color: #d99a36;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
// The contributor listing needs some normalization
|
50
|
+
#contributors .listing {
|
51
|
+
max-width:20em;
|
52
|
+
}
|
@@ -27,9 +27,7 @@ module HydraEditor
|
|
27
27
|
def model_attributes(form_params)
|
28
28
|
clean_params = sanitize_params(form_params)
|
29
29
|
terms.each do |key|
|
30
|
-
|
31
|
-
clean_params[key] = []
|
32
|
-
end
|
30
|
+
clean_params[key].delete('') if clean_params[key]
|
33
31
|
end
|
34
32
|
clean_params
|
35
33
|
end
|
@@ -1,13 +1,4 @@
|
|
1
1
|
module RecordsHelperBehavior
|
2
|
-
|
3
|
-
def metadata_help(key)
|
4
|
-
I18n.t("hydra_editor.form.metadata_help.#{key}", default: key.to_s.humanize)
|
5
|
-
end
|
6
|
-
|
7
|
-
def field_label(key)
|
8
|
-
I18n.t("hydra_editor.form.field_label.#{key}", default: key.to_s.humanize)
|
9
|
-
end
|
10
|
-
|
11
2
|
def model_label(key)
|
12
3
|
I18n.t("hydra_editor.form.model_label.#{key}", default: key.to_s.humanize)
|
13
4
|
end
|
@@ -25,14 +16,6 @@ module RecordsHelperBehavior
|
|
25
16
|
render_edit_field_partial_with_action(collection, field_name, locals)
|
26
17
|
end
|
27
18
|
|
28
|
-
def add_field (key)
|
29
|
-
more_or_less_button(key, 'adder', '+')
|
30
|
-
end
|
31
|
-
|
32
|
-
def subtract_field (key)
|
33
|
-
more_or_less_button(key, 'remover', '-')
|
34
|
-
end
|
35
|
-
|
36
19
|
def record_form_action_url(record)
|
37
20
|
router = respond_to?(:hydra_editor) ? hydra_editor : self
|
38
21
|
record.persisted? ? router.record_path(record) : router.records_path
|
@@ -70,14 +53,4 @@ module RecordsHelperBehavior
|
|
70
53
|
def partial_exists?(partial)
|
71
54
|
lookup_context.find_all(partial).any?
|
72
55
|
end
|
73
|
-
|
74
|
-
def more_or_less_button(key, html_class, symbol)
|
75
|
-
# TODO, there could be more than one element with this id on the page, but the fuctionality doesn't work without it.
|
76
|
-
content_tag('button', class: "#{html_class} btn btn-default", id: "additional_#{key}_submit", name: "additional_#{key}") do
|
77
|
-
(symbol +
|
78
|
-
content_tag('span', class: 'sr-only') do
|
79
|
-
"add another #{key.to_s}"
|
80
|
-
end).html_safe
|
81
|
-
end
|
82
|
-
end
|
83
56
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
class MultiValueInput < SimpleForm::Inputs::CollectionInput
|
2
|
+
def input(wrapper_options)
|
3
|
+
@rendered_first_element = false
|
4
|
+
input_html_classes.unshift("string")
|
5
|
+
input_html_options[:name] ||= "#{object_name}[#{attribute_name}][]"
|
6
|
+
markup = <<-HTML
|
7
|
+
|
8
|
+
|
9
|
+
<ul class="listing">
|
10
|
+
HTML
|
11
|
+
|
12
|
+
collection.each do |value|
|
13
|
+
unless value.to_s.strip.blank?
|
14
|
+
markup << <<-HTML
|
15
|
+
<li class="field-wrapper">
|
16
|
+
#{build_text_field(value)}
|
17
|
+
</li>
|
18
|
+
HTML
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# One blank line at the end
|
23
|
+
markup << <<-HTML
|
24
|
+
<li class="field-wrapper">
|
25
|
+
#{build_text_field('')}
|
26
|
+
</li>
|
27
|
+
</ul>
|
28
|
+
|
29
|
+
HTML
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def build_text_field(value)
|
35
|
+
options = input_html_options.dup
|
36
|
+
|
37
|
+
options[:value] = value
|
38
|
+
if @rendered_first_element
|
39
|
+
options[:id] = nil
|
40
|
+
options[:required] = nil
|
41
|
+
else
|
42
|
+
options[:id] ||= input_dom_id
|
43
|
+
end
|
44
|
+
options[:class] ||= []
|
45
|
+
options[:class] += ["#{input_dom_id} form-control multi-text-field"]
|
46
|
+
options[:'aria-labelledby'] = label_id
|
47
|
+
@rendered_first_element = true
|
48
|
+
if options.delete(:type) == 'textarea'.freeze
|
49
|
+
@builder.text_area(attribute_name, options)
|
50
|
+
else
|
51
|
+
@builder.text_field(attribute_name, options)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def label_id
|
56
|
+
input_dom_id + '_label'
|
57
|
+
end
|
58
|
+
|
59
|
+
def input_dom_id
|
60
|
+
input_html_options[:id] || "#{object_name}_#{attribute_name}"
|
61
|
+
end
|
62
|
+
|
63
|
+
def collection
|
64
|
+
@collection ||= Array.wrap(object[attribute_name])
|
65
|
+
end
|
66
|
+
|
67
|
+
def multiple?; true; end
|
68
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
<%=
|
1
|
+
<%= simple_form_for form, url: record_form_action_url(form), html: {class: 'form-inline editor'} do |f| %>
|
2
2
|
<div id="descriptions_display">
|
3
3
|
<%= render 'records/form_header' %>
|
4
4
|
<div class="well">
|
5
5
|
<% f.object.terms.each do |term| %>
|
6
|
-
<%=
|
6
|
+
<%= render_edit_field_partial(term, f: f) %>
|
7
7
|
<% end %>
|
8
8
|
</div> <!-- /well -->
|
9
9
|
</div>
|
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
<div class="form-actions">
|
13
13
|
<div class="primary-actions">
|
14
|
-
<%= f.
|
14
|
+
<%= f.submit 'Save', class: 'btn btn-primary' %>
|
15
15
|
<%= link_to t(:'helpers.action.cancel'), main_app.root_path, class: 'btn btn-link' %>
|
16
16
|
</div>
|
17
17
|
</div>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<h1><%= t('hydra_editor.choose_type.title') %></h1>
|
2
|
-
<%=
|
2
|
+
<%= form_tag hydra_editor.new_record_path, method: :get do %>
|
3
3
|
<label class="control-label" for="type">Select an object type</label>
|
4
4
|
<%= select_tag :type, options_for_select(object_type_options) %>
|
5
|
-
<%=
|
5
|
+
<%= submit_tag t('hydra_editor.choose_type.next'), class: 'btn btn-primary' %>
|
6
6
|
<% end %>
|
@@ -1,10 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
<% end %>
|
7
|
-
</div>
|
8
|
-
<div id="additional_<%= key %>_elements"></div>
|
9
|
-
|
10
|
-
|
1
|
+
<% if f.object.class.multiple? key %>
|
2
|
+
<%= f.input key, as: :multi_value, input_html: { class: 'form-control' }, required: f.object.required?(key) %>
|
3
|
+
<% else %>
|
4
|
+
<%= f.input key, required: f.object.required?(key) %>
|
5
|
+
<% end %>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'simple_form'
|
2
|
+
# Use this setup block to configure all options available in SimpleForm.
|
3
|
+
SimpleForm.setup do |config|
|
4
|
+
config.wrappers :inline, tag: 'span', class: 'form-group inline', error_class: 'has-error' do |b|
|
5
|
+
b.use :html5
|
6
|
+
b.use :placeholder
|
7
|
+
b.use :label, class: 'control-label'
|
8
|
+
b.use :input, class: 'form-control'
|
9
|
+
b.use :error, wrap_with: { tag: 'span', class: 'help-block' }
|
10
|
+
end
|
11
|
+
|
12
|
+
config.wrappers :vertical_form, tag: 'div', class: 'form-group', error_class: 'has-error' do |b|
|
13
|
+
b.use :html5
|
14
|
+
b.use :placeholder
|
15
|
+
b.use :label, class: 'control-label'
|
16
|
+
b.wrapper tag: 'div' do |ba|
|
17
|
+
ba.use :input, class: 'form-control'
|
18
|
+
ba.use :error, wrap_with: { tag: 'span', class: 'help-block' }
|
19
|
+
ba.use :hint, wrap_with: { tag: 'p', class: 'help-block' }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Wrappers for forms and inputs using the Twitter Bootstrap toolkit.
|
24
|
+
# Check the Bootstrap docs (http://getbootstrap.com/css/)
|
25
|
+
# to learn about the different styles for forms and inputs,
|
26
|
+
# buttons and other elements.
|
27
|
+
config.default_wrapper = :vertical_form
|
28
|
+
|
29
|
+
config.error_notification_class = 'alert alert-danger'
|
30
|
+
config.button_class = 'btn btn-default'
|
31
|
+
end
|
data/lib/hydra-editor.rb
CHANGED
data/lib/hydra_editor/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hydra-editor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Coyne
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-01-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -26,47 +26,47 @@ dependencies:
|
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '4.1'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
29
|
+
name: active-fedora
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - "
|
32
|
+
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: 9.0.0.beta8
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - "
|
39
|
+
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
41
|
+
version: 9.0.0.beta8
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
43
|
+
name: cancancan
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
48
|
+
version: '0'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
55
|
+
version: '0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
57
|
+
name: simple_form
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- - "
|
60
|
+
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
62
|
+
version: 3.1.0
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- - "
|
67
|
+
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
69
|
+
version: 3.1.0
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: sqlite3
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -191,23 +191,25 @@ files:
|
|
191
191
|
- Rakefile
|
192
192
|
- app/assets/javascripts/hydra-editor/editMetadata.js
|
193
193
|
- app/assets/javascripts/hydra-editor/hydra-editor.js
|
194
|
-
- app/assets/javascripts/hydra-editor/
|
194
|
+
- app/assets/javascripts/hydra-editor/keyboard_support.rb
|
195
|
+
- app/assets/javascripts/hydra-editor/manage_repeating_fields.js
|
195
196
|
- app/assets/stylesheets/hydra-editor/application.css
|
196
197
|
- app/assets/stylesheets/hydra-editor/hydra-editor.css
|
198
|
+
- app/assets/stylesheets/hydra-editor/multi_value_fields.scss
|
197
199
|
- app/controllers/concerns/records_controller_behavior.rb
|
198
200
|
- app/controllers/records_controller.rb
|
199
201
|
- app/forms/hydra_editor/form.rb
|
200
202
|
- app/helpers/concerns/records_helper_behavior.rb
|
201
203
|
- app/helpers/records_helper.rb
|
204
|
+
- app/inputs/multi_value_input.rb
|
202
205
|
- app/presenters/hydra/presenter.rb
|
203
|
-
- app/views/records/_edit_field.html.erb
|
204
206
|
- app/views/records/_form.html.erb
|
205
207
|
- app/views/records/_form_header.html.erb
|
206
208
|
- app/views/records/choose_type.html.erb
|
207
209
|
- app/views/records/edit.html.erb
|
208
210
|
- app/views/records/edit_fields/_default.html.erb
|
209
|
-
- app/views/records/edit_fields/_suffix.html.erb
|
210
211
|
- app/views/records/new.html.erb
|
212
|
+
- config/initializers/simple_form.rb
|
211
213
|
- config/jetty.yml
|
212
214
|
- config/locales/hydra_editor.yml
|
213
215
|
- config/routes.rb
|
@@ -1,58 +0,0 @@
|
|
1
|
-
(function( $ ){
|
2
|
-
|
3
|
-
$.fn.multiForm = function( options ) {
|
4
|
-
|
5
|
-
// Create some defaults, extending them with any options that were provided
|
6
|
-
var settings = $.extend( { }, options);
|
7
|
-
|
8
|
-
function addField() {
|
9
|
-
var cloneId = this.id.replace("submit", "clone");
|
10
|
-
var newId = this.id.replace("submit", "elements");
|
11
|
-
var cloneElem = $('#'+cloneId).clone();
|
12
|
-
// change the add button to a remove button
|
13
|
-
var plusbttn = cloneElem.find('#'+this.id);
|
14
|
-
plusbttn.html('-<span class="sr-only">remove this '+ this.name.replace("_", " ") +'</span>');
|
15
|
-
plusbttn.on('click',removeField);
|
16
|
-
|
17
|
-
// remove the help tag on subsequent added fields
|
18
|
-
cloneElem.find('.formHelp').remove();
|
19
|
-
cloneElem.find('i').remove();
|
20
|
-
cloneElem.find('.modal-div').remove();
|
21
|
-
|
22
|
-
//clear out the value for the element being appended
|
23
|
-
//so the new element has a blank value
|
24
|
-
cloneElem.find('input[type=text]').val("");
|
25
|
-
cloneElem.find('input[type=text]').attr("required", false);
|
26
|
-
|
27
|
-
if (settings.afterAdd) {
|
28
|
-
settings.afterAdd(this, cloneElem);
|
29
|
-
}
|
30
|
-
|
31
|
-
|
32
|
-
$('#'+newId).append(cloneElem);
|
33
|
-
cloneElem.find('input[type=text]').focus();
|
34
|
-
return false;
|
35
|
-
}
|
36
|
-
|
37
|
-
function removeField () {
|
38
|
-
// get parent and remove it
|
39
|
-
$(this).parent().parent().remove();
|
40
|
-
return false;
|
41
|
-
}
|
42
|
-
|
43
|
-
return this.each(function() {
|
44
|
-
|
45
|
-
// Tooltip plugin code here
|
46
|
-
/*
|
47
|
-
* adds additional metadata elements
|
48
|
-
*/
|
49
|
-
$('.adder', this).click(addField);
|
50
|
-
|
51
|
-
$('.remover', this).click(removeField);
|
52
|
-
|
53
|
-
|
54
|
-
});
|
55
|
-
|
56
|
-
};
|
57
|
-
})( jQuery );
|
58
|
-
|
@@ -1,14 +0,0 @@
|
|
1
|
-
<% render_req ||= true # render_req is true for single file edit, false for batch edit%>
|
2
|
-
<%= f.form_group key do %>
|
3
|
-
<% vals = f.object[key] %>
|
4
|
-
<% if render_req && f.object.required?(key) %>
|
5
|
-
<% tmp = '<span class="error">*</span>' + field_label(key) %>
|
6
|
-
<%= f.label key, tmp.html_safe, class: "control-label" %>
|
7
|
-
<% else %>
|
8
|
-
<%= f.label key, field_label(key), class: "control-label"%>
|
9
|
-
<% end %>
|
10
|
-
|
11
|
-
<% vals.to_ary.each_with_index do |v, index| %>
|
12
|
-
<%= render_edit_field_partial(key, f: f, v: v, index: index, render_req: render_req) %>
|
13
|
-
<% end %>
|
14
|
-
<% end %>
|