hydra-editor 1.0.0.rc2 → 1.0.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cd61584bb2b1f5fdefdcdaa0b0e98e033a8380cd
4
- data.tar.gz: 95da0f05fc7eb22757cc5dba24898e4ab23c303f
3
+ metadata.gz: 00e027dc2628e668372a4fabc2e39c6c4671841f
4
+ data.tar.gz: bd836eccdefe6a6579048cd467062b9ce66c14b4
5
5
  SHA512:
6
- metadata.gz: fa3e4cbc77db162b222b1e490c37f829313df1b7a71c48570632b39f57db0d0d8c8c6b4f79fdc78c370a1135f8f34349990854398ad75d37d80865f1a9f4f468
7
- data.tar.gz: 95a78a2fab3ab34584f52cad43d8c6109408f5d9b12869563108e78eead4eb0257f40321e3a0c5bdafc698396d3c8c222ce98547285c50aaea2c67ed7f63aa4b
6
+ metadata.gz: c04346e9584534386b680b8040cd1d7e594a73d7169b1f489709d635399c15ae40471658ac0915732ff3bf2550efe33ed4c27692db315cb1a6d7abebf3ef500a
7
+ data.tar.gz: 940e53ec4b57c838b66255e80d87fe1092c1cae333a3d0cf322f91d9ba6c7a58f26aa648b7b4924cb4f33e15146c32ab077d2cd64d8205fb544f0a8cafed5225
@@ -2,122 +2,136 @@
2
2
  // There are a lot of assumptions about the structure of the classes and elements.
3
3
  // These assumptions are reflected in the MultiValueInput class.
4
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));
5
+ var HydraEditor = (function($) {
6
+ var FieldManager = function (element, options) {
7
+ this.element = $(element);
8
+ this.options = options;
9
+
10
+ this.controls = $("<span class=\"input-group-btn field-controls\">");
11
+ this.remover = $("<button class=\"btn btn-danger remove\"><i class=\"icon-white glyphicon-minus\"></i><span>Remove</span></button>");
12
+ this.adder = $("<button class=\"btn btn-success add\"><i class=\"icon-white glyphicon-plus\"></i><span>Add</span></button>");
13
+
14
+ this.fieldWrapperClass = '.field-wrapper';
15
+ this.warningClass = '.has-warning';
16
+ this.listClass = '.listing';
17
+
18
+ this.init();
19
+ }
20
+
21
+ FieldManager.prototype = {
22
+ init: function () {
23
+ this._addInitialClasses();
24
+ this._appendControls();
25
+ this._attachEvents();
26
+ this._addCallbacks();
27
+ },
28
+
29
+ _addInitialClasses: function () {
30
+ this.element.addClass("managed");
31
+ $(this.fieldWrapperClass, this.element).addClass("input-group input-append");
32
+ },
33
+
34
+ _appendControls: function() {
35
+ $(this.fieldWrapperClass, this.element).append(this.controls);
36
+ $(this.fieldWrapperClass+':not(:last-child) .field-controls', this.element).append(this.remover);
37
+ $('.field-controls:last', this.element).append(this.adder);
38
+ },
39
+
40
+ _attachEvents: function() {
41
+ var _this = this;
42
+ this.element.on('click', '.remove', function (e) {
43
+ _this.remove_from_list(e);
44
+ });
45
+ this.element.on('click', '.add', function (e) {
46
+ _this.add_to_list(e);
47
+ });
48
+ },
49
+
50
+ _addCallbacks: function() {
51
+ this.element.bind('managed_field:add', this.options.add);
52
+ this.element.bind('managed_field:remove', this.options.remove);
53
+ },
54
+
55
+ add_to_list: function( event ) {
56
+ event.preventDefault();
57
+ var $activeField = $(event.target).parents(this.fieldWrapperClass)
58
+
59
+ if ($activeField.children('input').val() === '') {
60
+ this.displayEmptyWarning();
61
+ } else {
62
+ var $listing = $(this.listClass, this.element);
63
+ this.clearEmptyWarning();
64
+ $listing.append(this._newField($activeField));
65
+ }
66
+ },
67
+
68
+ _newField: function ($activeField) {
69
+ var $newField = this.createNewField($activeField);
70
+ // _changeControlsToRemove must come after createNewField
71
+ // or the new field will not have an add button
72
+ this._changeControlsToRemove($activeField);
73
+ return $newField;
74
+ },
75
+
76
+ createNewField: function($activeField) {
77
+ $newField = $activeField.clone();
78
+ $newChildren = $newField.children('input');
79
+ $newChildren.val('').removeProp('required');
80
+ $newChildren.first().focus();
81
+ this.element.trigger("managed_field:add", $newChildren.first());
82
+ return $newField
83
+ },
84
+
85
+ _changeControlsToRemove: function($activeField) {
86
+ var $removeControl = this.remover.clone();
87
+ $activeFieldControls = $activeField.children('.field-controls');
88
+ $('.add', $activeFieldControls).remove();
89
+ $activeFieldControls.prepend($removeControl);
90
+ },
91
+
92
+ clearEmptyWarning: function() {
93
+ $listing = $(this.listClass, this.element),
94
+ $listing.children(this.warningClass).remove();
95
+ },
96
+
97
+ displayEmptyWarning: function () {
98
+ $listing = $(this.listClass, this.element)
99
+ var $warningMessage = $("<div class=\'message has-warning\'>cannot add new empty field</div>");
100
+ $listing.children(this.warningClass).remove();
101
+ $listing.append($warningMessage);
102
+ },
103
+
104
+ remove_from_list: function( event ) {
105
+ event.preventDefault();
106
+
107
+ var field = $(event.target).parents(this.fieldWrapperClass)
108
+ field.remove();
109
+
110
+ this.element.trigger("managed_field:remove", field);
111
+ },
112
+
113
+ destroy: function() {
114
+ $(this.fieldWrapperClass, this.element).removeClass("input-append");
115
+ this.element.removeClass( "managed" );
66
116
  }
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
- }
117
+ }
108
118
 
109
- FieldManager.DEFAULTS = {
110
- add: null,
111
- remove: null
112
- }
119
+ FieldManager.DEFAULTS = {
120
+ add: null,
121
+ remove: null
122
+ }
113
123
 
124
+ return { FieldManager: FieldManager };
125
+ })(jQuery);
126
+
127
+ (function($){
114
128
  $.fn.manage_fields = function(option) {
115
129
  return this.each(function() {
116
130
  var $this = $(this);
117
131
  var data = $this.data('manage_fields');
118
- var options = $.extend({}, FieldManager.DEFAULTS, $this.data(), typeof option == 'object' && option);
132
+ var options = $.extend({}, HydraEditor.FieldManager.DEFAULTS, $this.data(), typeof option == 'object' && option);
119
133
 
120
- if (!data) $this.data('manage_fields', (data = new FieldManager(this, options)));
134
+ if (!data) $this.data('manage_fields', (data = new HydraEditor.FieldManager(this, options)));
121
135
  })
122
136
  }
123
137
  })(jQuery);
@@ -0,0 +1 @@
1
+ @import 'multi_value_fields';
@@ -2,6 +2,7 @@ module RecordsControllerBehavior
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  included do
5
+ include Hydra::Controller::ControllerBehavior
5
6
  load_and_authorize_resource only: [:new, :edit, :update, :create], instance_name: resource_instance_name
6
7
 
7
8
  rescue_from HydraEditor::InvalidType do
@@ -56,16 +56,19 @@ module HydraEditor
56
56
  end
57
57
 
58
58
  protected
59
- # override this method if you need to initialize more complex RDF assertions (b-nodes)
60
59
  def initialize_fields
60
+ # we're making a local copy of the attributes that we can modify.
61
61
  @attributes = model.attributes
62
- terms.select { |key| self[key].blank? }.each do |key|
63
- # if value is empty, we create an one element array to loop over for output
64
- if self.class.multiple?(key)
65
- self[key] = ['']
66
- else
67
- self[key] = ''
68
- end
62
+ terms.select { |key| self[key].blank? }.each { |key| initialize_field(key) }
63
+ end
64
+
65
+ # override this method if you need to initialize more complex RDF assertions (b-nodes)
66
+ def initialize_field(key)
67
+ # if value is empty, we create an one element array to loop over for output
68
+ if self.class.multiple?(key)
69
+ self[key] = ['']
70
+ else
71
+ self[key] = ''
69
72
  end
70
73
  end
71
74
  end
@@ -9,21 +9,15 @@ class MultiValueInput < SimpleForm::Inputs::CollectionInput
9
9
  <ul class="listing">
10
10
  HTML
11
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
12
+ collection.each_with_index do |value, index|
13
+ markup << <<-HTML
14
+ <li class="field-wrapper">
15
+ #{build_field(value, index)}
16
+ </li>
17
+ HTML
20
18
  end
21
19
 
22
- # One blank line at the end
23
20
  markup << <<-HTML
24
- <li class="field-wrapper">
25
- #{build_text_field('')}
26
- </li>
27
21
  </ul>
28
22
 
29
23
  HTML
@@ -31,7 +25,10 @@ class MultiValueInput < SimpleForm::Inputs::CollectionInput
31
25
 
32
26
  private
33
27
 
34
- def build_text_field(value)
28
+ # Although the 'index' parameter is not used in this implementation it is useful in an
29
+ # an overridden version of this method, especially when the field is a complex object and
30
+ # the override defines nested fields.
31
+ def build_field(value, index)
35
32
  options = input_html_options.dup
36
33
 
37
34
  options[:value] = value
@@ -61,7 +58,7 @@ class MultiValueInput < SimpleForm::Inputs::CollectionInput
61
58
  end
62
59
 
63
60
  def collection
64
- @collection ||= Array.wrap(object[attribute_name])
61
+ @collection ||= Array.wrap(object[attribute_name]).reject { |value| value.to_s.strip.blank? } + ['']
65
62
  end
66
63
 
67
64
  def multiple?; true; end
@@ -1,4 +1,4 @@
1
- <%= simple_form_for form, url: record_form_action_url(form), html: {class: 'form-inline editor'} do |f| %>
1
+ <%= simple_form_for form, url: record_form_action_url(form), html: { class: 'editor' } do |f| %>
2
2
  <div id="descriptions_display">
3
3
  <%= render 'records/form_header' %>
4
4
  <div class="well">
@@ -1,3 +1,3 @@
1
1
  module HydraEditor
2
- VERSION = "1.0.0.rc2"
2
+ VERSION = "1.0.0.rc3"
3
3
  end
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.rc2
4
+ version: 1.0.0.rc3
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: 2015-01-07 00:00:00.000000000 Z
12
+ date: 2015-01-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -193,8 +193,7 @@ files:
193
193
  - app/assets/javascripts/hydra-editor/hydra-editor.js
194
194
  - app/assets/javascripts/hydra-editor/keyboard_support.js
195
195
  - app/assets/javascripts/hydra-editor/manage_repeating_fields.js
196
- - app/assets/stylesheets/hydra-editor/application.css
197
- - app/assets/stylesheets/hydra-editor/hydra-editor.css
196
+ - app/assets/stylesheets/hydra-editor/hydra-editor.scss
198
197
  - app/assets/stylesheets/hydra-editor/multi_value_fields.scss
199
198
  - app/controllers/concerns/records_controller_behavior.rb
200
199
  - app/controllers/records_controller.rb
@@ -237,7 +236,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
237
236
  version: 1.3.1
238
237
  requirements: []
239
238
  rubyforge_project:
240
- rubygems_version: 2.4.3
239
+ rubygems_version: 2.2.2
241
240
  signing_key:
242
241
  specification_version: 4
243
242
  summary: A basic metadata editor for hydra-head
@@ -1,13 +0,0 @@
1
- /*
2
- * This is a manifest file that'll be compiled into application.css, which will include all the files
3
- * listed below.
4
- *
5
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
- * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
- *
8
- * You're free to add application-wide styles to this file and they'll appear at the top of the
9
- * compiled file, but it's generally better to create a new file per style scope.
10
- *
11
- *= require_self
12
- *= require_tree .
13
- */
File without changes