rails_admin_select2 0.0.1.pre → 0.0.2.pre
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.
@@ -0,0 +1,6 @@
|
|
1
|
+
<%- tags_value = field.value || '' %>
|
2
|
+
<%- tags_predefined = "[%s]" % field.tags.map{ |t| "\"#{t.to_s}\"" }.join(',') %>
|
3
|
+
<%= form.hidden_field(field.method_name, { :class => 'select2', :style => 'width:75%', :value => tags_value }) %>
|
4
|
+
<script type="text/javascript">
|
5
|
+
$(<%= "#{field.abstract_model.to_s.underscore}_#{field.method_name}" %>).select2({ tags: <%= tags_predefined.html_safe %> });
|
6
|
+
</script>
|
data/lib/rails_admin_select2.rb
CHANGED
@@ -8,34 +8,115 @@ module RailsAdmin
|
|
8
8
|
module Fields
|
9
9
|
module Types
|
10
10
|
# Add support for select2 input fields to RailsAdmin.
|
11
|
+
#
|
12
|
+
# Select2 home with demos: http://ivaynberg.github.io/select2/.
|
11
13
|
class Select2 < RailsAdmin::Config::Fields::Base
|
12
14
|
RailsAdmin::Config::Fields::Types::register(self)
|
15
|
+
# For relations, render a (multi)select select2 field.
|
16
|
+
# For strings, render a hidden field for tagging (if :tags is an array).
|
13
17
|
def initialize(parent, name, properties)
|
14
18
|
super(parent, name, properties)
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
+
# Mongoid allows field aliases (:as).
|
20
|
+
# Map both names and aliases to field meta information.
|
21
|
+
@fields = Hash[*(abstract_model.model.fields.map{|k,v| [[k.to_sym,v],[v.options[:as].try(:to_sym),v]]}.flatten)].delete_if{|k,v| k.nil?}
|
22
|
+
@relation = abstract_model.model.reflect_on_association(name)
|
23
|
+
@arity = {
|
24
|
+
:embeds_one => :one,
|
25
|
+
:embedded_in => :one,
|
26
|
+
:embeds_many => :many,
|
27
|
+
:belongs_to => :one,
|
28
|
+
:has_one => :one,
|
29
|
+
:has_many => :many,
|
30
|
+
:has_and_belongs_to_many => :many
|
31
|
+
}
|
32
|
+
end
|
33
|
+
# If tags have been supplied, render a select2 field for tagging.
|
34
|
+
# See http://ivaynberg.github.io/select2/#tags.
|
35
|
+
#
|
36
|
+
# The tags supplied will be available as choices in the tagging field,
|
37
|
+
# new tags can be added.
|
38
|
+
#
|
39
|
+
# To render a tagging field without predefined choices, supply []
|
40
|
+
# to tags, like so:
|
41
|
+
#
|
42
|
+
# config.model "Model" do
|
43
|
+
# edit do
|
44
|
+
# field do
|
45
|
+
# tags []
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
# If no tags have been supplied, a collection of associated objects
|
51
|
+
# will be rendered for selection. See the :collection instance option.
|
52
|
+
#
|
53
|
+
# To disable tagging (the default) explicitly, set tags to nil.
|
54
|
+
register_instance_option(:tags) do
|
55
|
+
tagging? ? [] : nil
|
19
56
|
end
|
20
57
|
register_instance_option(:partial) do
|
21
|
-
:form_select2
|
58
|
+
tagging? ? :form_select2_tags : :form_select2
|
22
59
|
end
|
60
|
+
# If true, allow selecting multiple associated objects.
|
61
|
+
#
|
62
|
+
# This will be true, if the association macro is one of
|
63
|
+
# :has_many, :has_and_belongs_to_many, or :embeds_many.
|
64
|
+
#
|
65
|
+
# Raise a RuntimeError if tagging? has been enabled.
|
23
66
|
register_instance_option(:multiple?) do
|
24
|
-
|
67
|
+
if tagging?
|
68
|
+
raise RuntimeError.new "cannot render select2 because #{abstract_model.model.to_s}##{@name} does not define a relation"
|
69
|
+
end
|
70
|
+
@arity[@relation.macro] == :many
|
25
71
|
end
|
72
|
+
# Per default, assemble a collection of all objects for this
|
73
|
+
# association by class name.
|
74
|
+
#
|
75
|
+
# For instance, if the association to render is article.article_group,
|
76
|
+
# the collection used for the select2 field will contain all ArticleGroups.
|
77
|
+
#
|
78
|
+
# If :tags have been supplied, a tagging field will be rendered
|
79
|
+
# and no collection is required/will be assembled.
|
26
80
|
register_instance_option(:collection) do
|
27
|
-
|
81
|
+
return nil if tagging?
|
82
|
+
@relation.class_name.safe_constantize.all.map{ |object| [ object.name, object.id ] }
|
28
83
|
end
|
29
|
-
# For Mongoid, the method_name
|
30
|
-
# e.g. children_ids or parent_id
|
84
|
+
# For Mongoid, the method_name for referenced associations is <name>_id[s],
|
85
|
+
# e.g. children_ids or parent_id; for embedded documents it is <name> or
|
86
|
+
# <name>s, respectively.
|
31
87
|
#
|
32
|
-
#
|
33
|
-
# append '
|
34
|
-
# of associations, respectively.
|
88
|
+
# Return #{name} for embedded documents, #{name}_id for referenced documents;
|
89
|
+
# append 's', if the association references multiple documents.
|
35
90
|
#
|
36
|
-
# TODO
|
91
|
+
# TODO How does this work in AR?
|
37
92
|
def method_name
|
38
|
-
|
93
|
+
return @name if tagging?
|
94
|
+
embedded = [ :embeds_one, :embeds_many, :embedded_in ].include? @relation.macro
|
95
|
+
m = embedded ? @relation.name.to_s.singularize : "#{@relation.name.to_s.singularize}_id"
|
96
|
+
multiple? ? m.pluralize : m
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
# Return true, if this tagging should be enabled for this field.
|
102
|
+
#
|
103
|
+
# For tagging to be enabled, the type of the field must be
|
104
|
+
# Mongoid::Fields::Standard and the type of the attribute
|
105
|
+
# must be String.
|
106
|
+
#
|
107
|
+
# Tagging is not supported for relation fields (associations).
|
108
|
+
def tagging?
|
109
|
+
# The name of a relation and the name of the field
|
110
|
+
# storing values for the relation differ (<name>_id[s] vs <name>).
|
111
|
+
# If @fields does not contain a value for @name,
|
112
|
+
# this field is a relation and tagging is not supported.
|
113
|
+
return false unless @fields.has_key?(@name)
|
114
|
+
# Tagging requires a field of type Mongoid::Fields::Standard
|
115
|
+
# with an attribute of type String.
|
116
|
+
klass = @fields[@name].class
|
117
|
+
type = @fields[@name].options[:type]
|
118
|
+
# TODO allow type of String and Array?
|
119
|
+
klass == Mongoid::Fields::Standard && [ ::String ].include?(type)
|
39
120
|
end
|
40
121
|
end
|
41
122
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_admin_select2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2.pre
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-09
|
12
|
+
date: 2013-10-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails_admin
|
@@ -50,6 +50,7 @@ executables: []
|
|
50
50
|
extensions: []
|
51
51
|
extra_rdoc_files: []
|
52
52
|
files:
|
53
|
+
- app/views/rails_admin/main/_form_select2_tags.html.erb
|
53
54
|
- app/views/rails_admin/main/_form_select2.html.erb
|
54
55
|
- lib/rails_admin_select2/version.rb
|
55
56
|
- lib/rails_admin_select2/engine.rb
|
@@ -68,6 +69,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
68
69
|
- - ! '>='
|
69
70
|
- !ruby/object:Gem::Version
|
70
71
|
version: '0'
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
hash: 652118273
|
71
75
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
76
|
none: false
|
73
77
|
requirements:
|
@@ -81,4 +85,3 @@ signing_key:
|
|
81
85
|
specification_version: 3
|
82
86
|
summary: Select2 for rails_admin
|
83
87
|
test_files: []
|
84
|
-
has_rdoc:
|