x-editable-rails-bs4 1.5.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +22 -0
  3. data/README.md +221 -0
  4. data/lib/generators/x_editable_rails/install_generator.rb +12 -0
  5. data/lib/generators/x_editable_rails/templates/x-editable.yml +19 -0
  6. data/lib/x-editable-rails.rb +15 -0
  7. data/lib/x-editable-rails/configuration.rb +62 -0
  8. data/lib/x-editable-rails/version.rb +7 -0
  9. data/lib/x-editable-rails/view_helpers.rb +167 -0
  10. data/vendor/assets/images/editable/clear.png +0 -0
  11. data/vendor/assets/images/editable/loading.gif +0 -0
  12. data/vendor/assets/javascripts/editable/bootstrap-editable.js +6722 -0
  13. data/vendor/assets/javascripts/editable/bootstrap2-editable.js +7007 -0
  14. data/vendor/assets/javascripts/editable/bootstrap3-editable.js +6807 -0
  15. data/vendor/assets/javascripts/editable/inputs-ext/address.js +170 -0
  16. data/vendor/assets/javascripts/editable/inputs-ext/bootstrap-wysihtml5.js +499 -0
  17. data/vendor/assets/javascripts/editable/inputs-ext/typeahead-editable.js +86 -0
  18. data/vendor/assets/javascripts/editable/inputs-ext/typeahead.js +1139 -0
  19. data/vendor/assets/javascripts/editable/inputs-ext/wysihtml5-editable.js +146 -0
  20. data/vendor/assets/javascripts/editable/inputs-ext/wysihtml5.js +9521 -0
  21. data/vendor/assets/javascripts/editable/jquery-editable-poshytip.js +5118 -0
  22. data/vendor/assets/javascripts/editable/jqueryui-editable.js +5065 -0
  23. data/vendor/assets/javascripts/editable/rails.js.coffee +3 -0
  24. data/vendor/assets/javascripts/editable/rails/data_classes.js.coffee +23 -0
  25. data/vendor/assets/javascripts/editable/rails/editable_form.js.coffee +51 -0
  26. data/vendor/assets/javascripts/editable/rails/error_handling.js.coffee +4 -0
  27. data/vendor/assets/stylesheets/editable/bootstrap-editable.scss +674 -0
  28. data/vendor/assets/stylesheets/editable/bootstrap2-editable.scss +655 -0
  29. data/vendor/assets/stylesheets/editable/bootstrap3-editable.scss +655 -0
  30. data/vendor/assets/stylesheets/editable/inputs-ext/address.css +9 -0
  31. data/vendor/assets/stylesheets/editable/inputs-ext/bootstrap-typeahead.css +49 -0
  32. data/vendor/assets/stylesheets/editable/inputs-ext/bootstrap-wysihtml5.css +102 -0
  33. data/vendor/assets/stylesheets/editable/inputs-ext/wysiwyg-color.css +67 -0
  34. data/vendor/assets/stylesheets/editable/jquery-editable.scss +205 -0
  35. data/vendor/assets/stylesheets/editable/jqueryui-editable.scss +205 -0
  36. metadata +121 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7b318db8e6922984c3d7e2fca3438daa69a11fe6e85e43d471c7122d70b46999
4
+ data.tar.gz: 6811a0a6d5ad9f7e28a98ff9657d5a9f1bb96fd6eae7c868fc9ab82cf6197c93
5
+ SHA512:
6
+ metadata.gz: 36b4a011c954489a18817aafaca557a590a43c07c56a07d061f3e6600ea7665e82a4f4bcc71fabf4c3a2175ff7acf93f05e980a166e8aedc60a4624cdd8c6351
7
+ data.tar.gz: 4e194461803bb0550dfc4ee39f7b9fb352aeda8cb67390a6a9fa11922f73721714b2d0037f9e5794bc7a1c28c19de75b5f58ee51baa26fcd1aa7fb61d349ca81
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Jiri Kolarik
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,221 @@
1
+ # X::Editable::Rails
2
+
3
+ [![Build Status](https://travis-ci.org/werein/x-editable-rails.svg)](https://travis-ci.org/werein/x-editable-rails) [![Code Climate](https://codeclimate.com/github/werein/x-editable-rails/badges/gpa.svg)](https://codeclimate.com/github/werein/x-editable-rails) [![Test coverage](https://codeclimate.com/github/werein/x-editable-rails/badges/coverage.svg)](https://codeclimate.com/github/werein/x-editable-rails) [![Version](https://badge.fury.io/rb/x-editable-rails.svg)](https://badge.fury.io/rb/x-editable-rails) [![Dependencies](https://gemnasium.com/werein/x-editable-rails.svg)](https://gemnasium.com/werein/x-editable-rails)
4
+
5
+ X-editable for Rails
6
+
7
+ ## Live demo
8
+
9
+ Checkout live demo [here](https://x-editable-rails.herokuapp.com/?denied=true)
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'x-editable-rails'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install x-editable-rails
24
+
25
+ ## Usage
26
+
27
+ ### Assets
28
+
29
+ Choose between the following javascripts:
30
+
31
+ * bootstrap-editable
32
+ * bootstrap2-editable
33
+ * jqueryui-editable
34
+ * jquery-editable-poshytip
35
+
36
+ You'll also need to include editable/rails in your scripts for this to work.
37
+
38
+ ```coffee
39
+ #= require editable/bootstrap-editable
40
+ #= require editable/rails
41
+ ```
42
+
43
+ Choose the corresponding stylesheets:
44
+
45
+ * bootstrap-editable
46
+ * bootstrap2-editable
47
+ * jqueryui-editable
48
+ * jquery-editable
49
+
50
+ ```scss
51
+ // as CSS
52
+ *= require editable/bootstrap-editable
53
+
54
+ // or SCSS
55
+ @import "editable/bootstrap-editable";
56
+ ```
57
+
58
+ Enable editing with jQuery:
59
+
60
+ ```coffee
61
+ $('.editable').editable()
62
+ ```
63
+
64
+ For custom inputs like the Wysihtml5 editor, add these dependencies:
65
+
66
+ ```coffee
67
+ #= require editable/bootstrap-editable
68
+ #= require editable/inputs-ext/wysihtml5
69
+ #= require editable/inputs-ext/bootstrap-wysihtml5
70
+ #= require editable/inputs-ext/wysihtml5-editable
71
+ #= require editable/rails
72
+ ```
73
+
74
+ And related stylesheets:
75
+
76
+ ```css
77
+ //= require editable/bootstrap-editable
78
+ //= require editable/inputs-ext/bootstrap-wysihtml5
79
+ //= require editable/inputs-ext/wysiwyg-color
80
+ ```
81
+
82
+ ### Making Things Editable
83
+
84
+ `x-editable-rails` provides a helper method in your view to make your model values editable.
85
+ By default, you need to specify the model and property that should be editable.
86
+ A `span` element is rendered with `data-*` attributes used by `x-editable`.
87
+
88
+ ```ruby
89
+ # the editable object and the attribute to edit
90
+ %h1= editable @model, :name
91
+ ```
92
+
93
+ You can customize the tag name and title attribute:
94
+
95
+ * **tag** - `span` by default.
96
+ * **title** - The model and attribute name are used to create a capitalized title
97
+
98
+ The `editable` helper method automatically adds these `data-*` attributes used by [x-editable](http://vitalets.github.io/x-editable/docs.html).
99
+
100
+ * **url** - Uses the `polymorphic_path(model)` helper method.
101
+ * **source** - Only populated if the value is a boolean to convert `true` or `false` to "Yes" and "No".
102
+ * **value** - Uses `model.name`. If `model.name` were a boolean value or if a `source` is specified, the `source` text would be displayed rather than the raw value. (Presumably the value is an ID and the source would have the text associated with that value.)
103
+ * **placeholder** - Uses the `title` value by default
104
+
105
+ ```ruby
106
+ # editable object, what_you_want_update, e: exception - when is xeditable? false or can? :edit, object is false
107
+ %h1= editable @model, :name, url: model_path, value: @model.name.upcase
108
+ ```
109
+
110
+ Here are some special features to enhance what's baked into [x-editable](http://vitalets.github.io/x-editable/docs.html):
111
+
112
+ * **type** - The type of input is automatically detected. By default, if the value is a boolean, the `type` is "select" with a built-in `source` that outputs "Yes" and "No" (unless another `source` is specified).
113
+ * **source** - In addition to hashes or arrays of hashes, you can also use an array of strings for a simpler structure if the name and value are the same:
114
+
115
+ ```ruby
116
+ source = [ "Active", "Disabled" ]
117
+ editable @model, :enabled, source: source
118
+ ```
119
+
120
+ * **value** - This option will override the `model.name` value
121
+ * **classes** - This is a custom option for `x-editable-rails` that will change the editable element's CSS class based on the selected value. Use the `source` hash structure to map a CSS class name to a value. (This [functionality](vendor/assets/javascripts/editable/rails/data_classes.js.coffee) is toggled when the value changes and the "save" event is triggered.)
122
+
123
+ ```ruby
124
+ source = [ "Active", "Disabled" ]
125
+ classes = { "Active" => "label-success", "Disabled" => "label-default" }
126
+ editable @model, :enabled, source: source, classes: classes, class: "label"
127
+ ```
128
+
129
+ * **nested** - Name of a nested attributes (such as [globalize](https://github.com/globalize/globalize)'s `translations`)
130
+ * **nid** - ID of the nested attribute
131
+
132
+ ```ruby
133
+ %h1= editable @model, :name, nested: :translations, nid: @model.translation.id
134
+
135
+ # example of nested resource
136
+ %h1= editable [picture.gallery, picture], :name, nested: :translations, nid: picture.translation.id
137
+ ```
138
+
139
+ ### Authorization
140
+
141
+ Add a helper method to your controllers to indicate if `x-editable` should be enabled.
142
+
143
+ ```ruby
144
+ def xeditable? object = nil
145
+ true # Or something like current_user.xeditable?
146
+ end
147
+ ```
148
+
149
+ You can use [CanCan](https://github.com/ryanb/cancan) and checks the `:edit` permission for the model being edited.
150
+
151
+ ```ruby
152
+ def xeditable? object = nil
153
+ can?(:edit, object) ? true : false
154
+ end
155
+ ```
156
+
157
+ * **e** - Specify a custom (error) message to display if the value isn't editable
158
+
159
+ ### "Don't Repeat Yourself" Templates
160
+
161
+ To make your views cleaner, you can specify all your options for each class and attribute in a YAML configuration file.
162
+ Attributes where the `title` or `placeholder` are not different except maybe capitalized can be left out because they are automatically capitalized when rendered (see above).
163
+
164
+ This example uses the `MailingList` class and its attributes.
165
+ The attribute value can be a string, which is used as the `title` and `placeholder`.
166
+ If you want to specify other options, create a hash of options.
167
+
168
+ Install configuration file like this: `rails g x_editable_rails:install`, this step is not necessary
169
+
170
+ ```yaml
171
+ class_options:
172
+ MailingList:
173
+ # Specify placeholder text for each attribute or a Hash of options
174
+ name: Mailing list name
175
+ enabled:
176
+ type: select
177
+ source:
178
+ - Active
179
+ - Disabled
180
+ reply_email:
181
+ type: email
182
+ title: Reply-to email
183
+ User:
184
+ email:
185
+ type: email
186
+ password:
187
+ type: password
188
+ mailing_lists:
189
+ type: select
190
+ # specify a URL to get source via AJAX (see x-editable docs)
191
+ source: <%= ::Rails.application.routes.url_helpers.mailing_lists_source_path %>
192
+ ```
193
+
194
+ Now you can specify your editable fields without options because they will be inherited from your YAML config.
195
+
196
+ ```ruby
197
+ model = MailingList.new
198
+
199
+ editable model, :name # type: "text", title: "Mailing list name"
200
+ editable model, :enabled # type: "select", title: "Enabled", source: [ "Active", "Disabled" ]
201
+ ```
202
+
203
+ ### Examples
204
+
205
+ Gem also contains demo application with integrated x-editable
206
+
207
+ ```
208
+ cd test/dummy
209
+ rake db:migrate
210
+ rake db:seed
211
+ rails g x_editable_rails:install # optional, it generate config example
212
+ rails s
213
+ ```
214
+
215
+ ## Contributing
216
+
217
+ 1. Fork it
218
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
219
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
220
+ 4. Push to the branch (`git push origin my-new-feature`)
221
+ 5. Create new Pull Request
@@ -0,0 +1,12 @@
1
+ module XEditableRails
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ desc 'Copy example of x-editable config'
7
+ def copy_x_editable_yml
8
+ template 'x-editable.yml', 'config/x-editable.yml'
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,19 @@
1
+ # More informations you can find here: https://github.com/werein/x-editable-rails
2
+ class_options:
3
+ MailingList:
4
+ name: Mailing list name
5
+ enabled:
6
+ type: select
7
+ source:
8
+ - Active
9
+ - Disabled
10
+ reply_email:
11
+ type: email
12
+ title: Reply-to email
13
+ User:
14
+ email:
15
+ type: email
16
+ password:
17
+ type: password
18
+ mailing_lists:
19
+ type: select
@@ -0,0 +1,15 @@
1
+ require 'x-editable-rails/version'
2
+ require 'x-editable-rails/configuration'
3
+ require 'x-editable-rails/view_helpers'
4
+
5
+ module X
6
+ module Editable
7
+ module Rails
8
+ class Engine < ::Rails::Engine
9
+ initializer 'x-editable-rails.view_helpers' do
10
+ ActionView::Base.send :include, ViewHelpers
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,62 @@
1
+ module X
2
+ module Editable
3
+ module Rails
4
+ module Configuration
5
+
6
+ def method_options_for(object, method)
7
+ class_options_for(object).fetch(method, {})
8
+ end
9
+
10
+ def class_options_for(object)
11
+ class_options = options.fetch(:class_options, {})
12
+ class_options.fetch(object.class.name, {})
13
+ end
14
+
15
+ def class_options
16
+ options.fetch(:class_options, {})
17
+ end
18
+
19
+ def options
20
+ config_fn = ::Rails.root.join("config", "x-editable.yml")
21
+ if File.file?(config_fn)
22
+ @options ||= begin
23
+ options = load_yaml_file config_fn
24
+ format_class_options! options
25
+ end
26
+ else
27
+ @options = {}
28
+ end
29
+ end
30
+
31
+ def load_yaml_file(path)
32
+ source = File.read path
33
+ source = ERB.new(source).result
34
+
35
+ result = YAML.load(source)
36
+ result = {} if result.blank?
37
+
38
+ result.with_indifferent_access
39
+ end
40
+
41
+ private
42
+
43
+ # if the specified options are a string, convert to Hash and make the string the title
44
+ def format_class_options!(options)
45
+ if class_options = options[:class_options]
46
+ class_options.each do |class_name, methods|
47
+ methods.each do |method, method_options|
48
+ unless method_options.is_a? Hash
49
+ methods[method] = { title: method_options }.with_indifferent_access
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ options
56
+ end
57
+
58
+ extend self
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,7 @@
1
+ module X
2
+ module Editable
3
+ module Rails
4
+ VERSION = "1.5.5.2"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,167 @@
1
+ require 'base64'
2
+
3
+ module X
4
+ module Editable
5
+ module Rails
6
+ module ViewHelpers
7
+ #
8
+ # Options determine how the HTML tag is rendered and the remaining options are converted to data-* attributes.
9
+ #
10
+ # options:
11
+ # tag: tag name of element returned
12
+ # class: "class" attribute on element
13
+ # placeholder: "placeholder" attribute on element
14
+ # title: "title" attribute on element (defaults to placeholder)
15
+ # data: "data-*" attributes on element
16
+ # source: a Hash of friendly display values used by input elements based on (object) value
17
+ # - boolean shorthand ['Enabled', 'Disabled'] becomes { '1' => 'Enabled', '0' => 'Disabled' }
18
+ # - enumerable shorthand ['Yes', 'No', 'Maybe'] becomes { 'Yes' => 'Yes', 'No' => 'No', 'Maybe' => 'Maybe' }
19
+ # classes: a Hash of classes to add based on the value (same format and shorthands as source)
20
+ # value: override the object's value
21
+ #
22
+ def editable(object, method, options = {})
23
+ options = Configuration.method_options_for(object, method).deep_merge(options).with_indifferent_access
24
+ # merge data attributes for backwards-compatibility
25
+ options.merge! options.delete(:data){ Hash.new }
26
+
27
+ url = options.delete(:url){ polymorphic_path(object) }
28
+ object = object.last if object.kind_of?(Array)
29
+ value = options.delete(:value){ object.send(method) }
30
+ source = options[:source] ? format_source(options.delete(:source), value) : default_source_for(value)
31
+ classes = format_source(options.delete(:classes), value)
32
+ error = options.delete(:e)
33
+ html_options = options.delete(:html){ Hash.new }
34
+
35
+ if xeditable?(object)
36
+ model = object.class.model_name.param_key
37
+ nid = options.delete(:nid)
38
+ nested = options.delete(:nested)
39
+ title = options.delete(:title) do
40
+ klass = nested ? object.class.const_get(nested.to_s.classify) : object.class
41
+ klass.human_attribute_name(method)
42
+ end
43
+
44
+ output_value = output_value_for(value)
45
+ css_list = options.delete(:class).to_s.split(/\s+/).unshift('editable')
46
+ css_list << classes[output_value] if classes
47
+ type = options.delete(:type){ default_type_for(value) }
48
+ css = css_list.compact.uniq.join(' ')
49
+ tag = options.delete(:tag){ 'span' }
50
+ placeholder = options.delete(:placeholder){ title }
51
+
52
+ # any remaining options become data attributes
53
+ data = {
54
+ type: type,
55
+ model: model,
56
+ name: method,
57
+ value: ( type == 'wysihtml5' ? Base64.encode64(output_value) : output_value ),
58
+ placeholder: placeholder,
59
+ classes: classes,
60
+ source: source,
61
+ url: url,
62
+ nested: nested,
63
+ nid: nid
64
+ }.merge(options.symbolize_keys)
65
+
66
+ data.reject!{|_, value| value.nil?}
67
+
68
+ html_options.update({
69
+ class: css,
70
+ title: title,
71
+ data: data
72
+ })
73
+
74
+ content_tag tag, html_options do
75
+ if %w(select checklist).include?(data[:type].to_s) && !source.is_a?(String)
76
+ source = normalize_source(source)
77
+ content = source.detect { |t| output_value == output_value_for(t[0]) }
78
+ content.present? ? content[1] : ""
79
+ else
80
+ safe_join(source_values_for(value, source), tag(:br))
81
+ end
82
+ end
83
+ else
84
+ error || safe_join(source_values_for(value, source), tag(:br))
85
+ end
86
+ end
87
+
88
+ private
89
+
90
+ def normalize_source(source)
91
+ return [] unless source
92
+ source.map do |el|
93
+ if el.is_a? Array
94
+ el
95
+ else
96
+ [el[:value], el[:text]]
97
+ end
98
+ end
99
+ end
100
+
101
+ def output_value_for(value)
102
+ value = case value
103
+ when TrueClass
104
+ '1'
105
+ when FalseClass
106
+ '0'
107
+ when NilClass
108
+ ''
109
+ when Array
110
+ value.map{|item| output_value_for item}.join(',')
111
+ else
112
+ value.to_s
113
+ end
114
+
115
+ value
116
+ end
117
+
118
+ def source_values_for(value, source = nil)
119
+ source ||= default_source_for value
120
+
121
+ values = Array.wrap(value)
122
+
123
+ if source && ( source.first.is_a?(String) || source.kind_of?(Hash) )
124
+ values.map{|item| source[output_value_for item]}
125
+ else
126
+ values
127
+ end
128
+ end
129
+
130
+ def default_type_for(value)
131
+ case value
132
+ when TrueClass, FalseClass
133
+ 'select'
134
+ when Array
135
+ 'checklist'
136
+ else
137
+ 'text'
138
+ end
139
+ end
140
+
141
+ def default_source_for(value)
142
+ case value
143
+ when TrueClass, FalseClass
144
+ { '1' => 'Yes', '0' => 'No' }
145
+ end
146
+ end
147
+
148
+ # helper method that take some shorthand source definitions and reformats them
149
+ def format_source(source, value)
150
+ formatted_source = case value
151
+ when TrueClass, FalseClass
152
+ if source.is_a?(Array) && source.first.is_a?(String) && source.size == 2
153
+ { '1' => source[0], '0' => source[1] }
154
+ end
155
+ else
156
+ if source.is_a?(Array) && source.first.is_a?(String)
157
+ source.map { |v| { value: v, text: v } }
158
+ end
159
+ end
160
+
161
+ formatted_source || source
162
+ end
163
+
164
+ end
165
+ end
166
+ end
167
+ end