jqr-helpers 1.0.0.beta1 → 1.0.0

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.
data/Readme.md ADDED
@@ -0,0 +1,128 @@
1
+ # Jqr-Helpers
2
+
3
+ `jqr-helpers` is a set of methods that create tags that are watched by unobtrusive JavaScript
4
+ events. It is primarily designed to cut down on JavaScript event handling and
5
+ callbacks and try to allow as much as possible to happen with Rails helpers.
6
+
7
+ The two main uses of these methods are to create dialogs and handle
8
+ Ajax requests without having to write JavaScript code. In particular, the options
9
+ available to the methods provide more support for the most common ways of using
10
+ these sorts of things in a web application environment.
11
+
12
+ Although there is some overlap with Rails 3 UJS methods, the important part
13
+ is the added options available. These make more assumptions than the built-in
14
+ helper methods, but are optimized to make it much easier to use them in
15
+ common scenarios. The existing methods are not altered.
16
+
17
+ jqr-helpers was developed using jQuery 1.10 and jQuery-UI 1.10, but it should
18
+ be compatible with earlier versions as well. The assumption is that all
19
+ required JS files are included, including jQuery, jQuery-UI, and the jquery-rails
20
+ UJS adapter. jqr-helpers does not attempt to include them itself.
21
+
22
+ ## Using jqr-helpers ##
23
+
24
+ If you are running Rails >= 3.1, the required assets should be installed
25
+ automatically as part of the asset pipeline. You can require them as needed:
26
+
27
+ //= require jqr-helpers
28
+ *= require jqr-helpers
29
+
30
+ If you are running Rails 3.0, you can manually copy the JavaScript and CSS
31
+ into your public folders:
32
+
33
+ rails g jqr_helpers:install
34
+
35
+ ## Helper Methods ##
36
+
37
+ * `link_to_dialog` - open a dialog when a link is clicked
38
+ * `button_to_dialog` - open a dialog when a button is clicked
39
+ * `confirm_button` - open a nice jQuery confirm dialog (rather than a built-in browser one)
40
+ * `link_to_remote_dialog` - open a remote dialog when a link is clicked (i.e. load
41
+ the dialog content from a remote route)
42
+ * `button_to_remote_dialog` - open a remote dialog when a button is clicked
43
+ * `link_to_ajax` - send an Ajax request when a link is clicked
44
+ * `button_to_ajax` - send an Ajax request when a button is clicked
45
+ * `form_tag_ajax` - send an Ajax request when a form is submitted
46
+ * `form_for_ajax` - ditto but using Rails's `form_for` helper
47
+
48
+ There are two sets of options that recur throughout the methods here:
49
+
50
+ ## Dialog Options ##
51
+
52
+ These are parameters to pass to the `jQuery.dialog()` function.
53
+ See <http://api.jqueryui.com/dialog/>.
54
+
55
+ An extra custom option is `:title` - setting it to `false` will hide the
56
+ title bar.
57
+
58
+ Another thing to note is the special values for buttons. Usually the buttons
59
+ must have JavaScript callbacks, but 99% of the time you want the classic
60
+ OK and Cancel buttons. Passing `submit` and `close` as the values
61
+ of the buttons (or the values of the "click" attribute of the buttons)
62
+ will do just that - submit the form inside the dialog or close it.
63
+
64
+ Example:
65
+
66
+ button_to_dialog('my-dialog-id', 'Open Dialog', :buttons =>
67
+ {'OK' => 'submit', 'Cancel' => 'close'})
68
+
69
+ You can also use a special option, `:default_buttons => true`, as a shortcut
70
+ to the above buttons, since it's so common to have an OK and Cancel
71
+ button.
72
+
73
+ Another option is `:close_x => true` - this will print a green X at the top
74
+ right of the dialog. Generally this is used when `:title => false`.
75
+
76
+ Note about dialog ID - you can always pass in the special value `:next` for
77
+ this. This will use whatever element is just after the clicked element
78
+ for the dialog contents. This can be useful for printing simple dialogs inside a
79
+ foreach loop that shouldn't require a totally separate route + view.
80
+
81
+ Dialogs will by default be centered on the page and have a max height of 80%
82
+ the page height.
83
+
84
+ ## Ajax Options ##
85
+
86
+ By default, the `options` parameter in the various `_to_ajax` functions are
87
+ passed into the underlying function (e.g. `link_to_ajax` will pass them to
88
+ `link_to`), but there is support for several special options as well.
89
+
90
+ *Selector options* will act on another element once the request is complete.
91
+ Selectors can be IDs (`#selector`), or classes (`.selector`).
92
+ A class selector will be interpreted as an *ancestor* (parent) of the
93
+ element that sent the request that has the given class. So e.g. if you
94
+ are using `button_to_ajax`, giving `:update => '.my-parent'` will look for
95
+ an ancestor of the button tag with the class of `my-parent`.
96
+
97
+ * `:update` - update the given selector with the returned content.
98
+ * `:append` - insert the content as a child inside the given selector.
99
+ * `:delete` - delete all content of the given selector.
100
+
101
+ Other Ajax options:
102
+
103
+ * `:callback` (String) - the name of a JS function to call on completion.
104
+ The function will be in the scope of the original element, and
105
+ will be passed the result data of the Ajax request.
106
+ * `:use_dialog_opener` (Boolean) - if the Ajax request is sent from inside
107
+ a dialog, this indicates that the update/append/delete options should
108
+ look at the element that opened the dialog rather than the element that
109
+ fired the Ajax request. This is true by default for forms and false for
110
+ other elements.
111
+ * `:close_dialog` (Boolean) - if the Ajax request is sent from inside a dialog,
112
+ this indicates that the dialog should be closed when the request completes
113
+ successfully. This is true by default for forms and false for
114
+ other elements.
115
+
116
+ ## jQuery Events ##
117
+
118
+ There are two special events triggered by jqr-helpers:
119
+
120
+ * `jqr.load` - this is triggered when a remote call populates an element with
121
+ data. The scope for the callback is the element which has just had data
122
+ populated.
123
+ * `jqr.beforedialogopen` - for remote dialogs, this is triggered when the
124
+ link or button is clicked to open the dialog but before the request is sent out.
125
+
126
+ ***
127
+
128
+ jqr-helpers was developed by [Wishabi](http://www.wishabi.com).
@@ -0,0 +1,227 @@
1
+ (function($) {
2
+ function showThrobber(element) {
3
+ $(element).after("<img src='/images/jqr-helpers/throbber.gif' class='throbber'/>");
4
+ $(element).attr('disabled', 'disabled');
5
+ }
6
+
7
+ function hideThrobber(element) {
8
+ $(element).next().remove();
9
+ $(element).removeAttr('disabled');
10
+ }
11
+
12
+ var ujsDialogElement = null; // the element that opened the dialog
13
+
14
+ // called from dialog button value
15
+ function ujsSubmitDialogForm() {
16
+ $('.ui-dialog:visible form').first().submit();
17
+ }
18
+
19
+ // called from dialog button value
20
+ function ujsDialogClose() {
21
+ $('.ui-dialog-content:visible').dialog('destroy');
22
+ }
23
+
24
+ function ujsDialogOpen() {
25
+ if ($(this).parent().height() > $(window).height()) {
26
+ $(this).height($(window).height() * 0.8);
27
+ $(this).parent().css('top',
28
+ ($(window).height() - $(this).parent().height()) / 2
29
+ );
30
+ $(this).css('overflow-y', 'auto');
31
+ }
32
+ var x = $(this).find('.ujs-dialog-x');
33
+ if (x.length) {
34
+ $(this).parent().append(x); // to keep it fixed to the dialog
35
+ // don't let the dialog be resized - the resize functionality
36
+ // clashes with the X close functionality
37
+ $(this).dialog('option', 'resizable', false);
38
+ }
39
+ }
40
+
41
+ function ujsDialogClick(event) {
42
+ ujsDialogElement = $(this);
43
+ var dialogID = $(this).data('dialog-id');
44
+ var dialogElement = $('#' + dialogID);
45
+ if (dialogID == 'next') dialogElement = $(this).next();
46
+ if ($(this).data('close-x')) {
47
+ dialogElement.prepend('<span class="ujs-dialog-x"></span>');
48
+ }
49
+ var dialogOptions = $(this).data('dialog-options');
50
+ var open = dialogOptions['open'];
51
+ dialogOptions = $.extend(dialogOptions, {
52
+ 'open': function() {
53
+ ujsDialogOpen.call(this);
54
+ if (open) {
55
+ var openFunc = eval(open);
56
+ openFunc.call(this);
57
+ }
58
+ }
59
+ });
60
+ if (dialogOptions.buttons) {
61
+ $.each(dialogOptions.buttons, function(index, element) {
62
+ if (element == 'submit') {
63
+ dialogOptions.buttons[index] = ujsSubmitDialogForm;
64
+ }
65
+ else if (element.click == 'submit') {
66
+ dialogOptions.buttons[index].click = ujsSubmitDialogForm;
67
+ }
68
+ else if (element == 'close') {
69
+ dialogOptions.buttons[index] = ujsDialogClose;
70
+ }
71
+ else if (element.click == 'close') {
72
+ dialogOptions.buttons[index].click = ujsDialogClose;
73
+ }
74
+ });
75
+ }
76
+ var url = $(this).data('dialog-url');
77
+ if (url) {
78
+ $(this).trigger('jqr.beforedialogopen');
79
+ $(document.body).append('<div class="ui-widget-overlay ui-front">');
80
+ $(document.body).append('<div id="remote-dialog-throbber">');
81
+ if (dialogElement.length == 0) {
82
+ $('body').append("<div id='" + dialogID + "'>");
83
+ dialogElement = $('#' + dialogID);
84
+ }
85
+ dialogElement.load(url, function() {
86
+ $('.ui-widget-overlay').remove();
87
+ $('#remote-dialog-throbber').remove();
88
+ $(this).dialog(dialogOptions);
89
+ $(dialogElement).trigger('jqr.load');
90
+ });
91
+ }
92
+ else {
93
+ dialogElement.dialog(dialogOptions);
94
+ }
95
+ event.stopPropagation();
96
+ return false;
97
+ }
98
+
99
+ function ujsDialogCloseClick() {
100
+ ujsDialogClose();
101
+ return false;
102
+ }
103
+
104
+ function ujsAjaxBeforeSend() {
105
+ showThrobber(this);
106
+ var disableElement = $(this);
107
+ if ($(this).is('form'))
108
+ disableElement = $('button, input[type=submit]', this).first();
109
+ disableElement.attr('disabled', 'disabled');
110
+ }
111
+
112
+ function ujsAjaxSuccess(evt, data, status, xhr) {
113
+ hideThrobber(this);
114
+ var disableElement = $(this);
115
+ if ($(this).is('form'))
116
+ disableElement = $('button, input[type=submit]', this).first();
117
+ disableElement.attr('disabled', false);
118
+ var element = $(this);
119
+ var targetElement = element;
120
+ // if this was sent from a dialog, close the dialog and look at the
121
+ // element that opened it for update/append/delete callbacks.
122
+ if ($('.ui-dialog:visible').length) {
123
+ if (element.data('use-dialog-opener'))
124
+ targetElement = ujsDialogElement;
125
+ if (element.data('close-dialog'))
126
+ ujsDialogClose();
127
+ }
128
+ if (element.data('callback')) {
129
+ var callback = eval(element.data('callback'));
130
+ callback.call(targetElement, data);
131
+ }
132
+ if (data && data.trim().charAt(0) != '<' && data != 'success') {
133
+ alert(data);
134
+ return;
135
+ }
136
+ var selector = element.data('selector');
137
+ var target = null;
138
+ if (selector) {
139
+ if (selector[0] == '#') target = $(selector);
140
+ else target = $(targetElement).parents(selector);
141
+ switch (element.data('result-method')) {
142
+ case 'update':
143
+ target = $(data).replaceAll(target);
144
+ target.trigger('jqr.load');
145
+ break;
146
+ case 'append':
147
+ target.append(data);
148
+ target.trigger('jqr.load');
149
+ break;
150
+ case 'delete':
151
+ target.remove();
152
+ break;
153
+ }
154
+ target.effect('highlight');
155
+ }
156
+ return false;
157
+ }
158
+
159
+ function ujsAjaxError(evt, xhr, status, error) {
160
+ alert(error || 'An error occurred.');
161
+ hideThrobber(this);
162
+ }
163
+
164
+ function ujsConfirmClick() {
165
+ var div = $('<div>');
166
+ var form = this.form;
167
+ div.html($(this).data('message'));
168
+ $('body').append(div);
169
+ div.dialog({
170
+ modal: true,
171
+ width: 'auto',
172
+ maxWidth: '75%',
173
+ minWidth: '400',
174
+ minHeight: 'auto',
175
+ dialogClass: 'confirm-dialog no-title',
176
+ buttons: {
177
+ 'Yes': function() {
178
+ form.submit();
179
+ },
180
+ 'No': function() {
181
+ div.dialog('close');
182
+ div.remove();
183
+ }
184
+ }
185
+ });
186
+ return false;
187
+ }
188
+
189
+ $(function() {
190
+ $('.ujs-tab-container', this).tabs({
191
+ beforeLoad: function(event, ui) {
192
+ if (ui.tab.data('loaded')) {
193
+ event.preventDefault();
194
+ return;
195
+ }
196
+ ui.jqXHR.success(function() {
197
+ ui.tab.data('loaded', true);
198
+ });
199
+ $(ui.panel).html('Loading...');
200
+ ui.jqXHR.fail(function(jqXHR, textStatus, errorThrown) {
201
+ ui.panel.html('Error loading the tab: ' + errorThrown);
202
+ });
203
+ }
204
+ });
205
+
206
+ if ($().on) { // newer jQueries
207
+ $(document).on('click', '.ujs-dialog', ujsDialogClick);
208
+ $(document).on('click', '.ujs-dialog-close, .ujs-dialog-x',
209
+ ujsDialogCloseClick);
210
+ $(document).on('ajax:beforeSend', '.ujs-ajax', ujsAjaxBeforeSend);
211
+ $(document).on('ajax:success', '.ujs-ajax', ujsAjaxSuccess);
212
+ $(document).on('ajax:error', '.ujs-ajax', ujsAjaxError);
213
+ $(document).on('click', '[data-ujs-confirm=true]', ujsConfirmClick);
214
+ }
215
+ else {
216
+ $('.ujs-dialog').live('click', ujsDialogClick);
217
+ $('.ujs-dialog-close, .ujs-dialog-x').live('click', ujsDialogCloseClick);
218
+ $('.ujs-ajax').live('ajax:beforeSend', ujsAjaxBeforeSend);
219
+ $('.ujs-ajax').live('ajax:success', ujsAjaxSuccess);
220
+ $('.ujs-ajax').live('ajax:error', ujsAjaxError);
221
+ $('[data-ujs-confirm=true]').live('click', ujsConfirmClick);
222
+ }
223
+
224
+ });
225
+
226
+ }(jQuery));
227
+
@@ -0,0 +1,21 @@
1
+ form.ujs-ajax, form.ujs-ajax div {
2
+ display: inline;
3
+ }
4
+
5
+ .ujs-dialog-modal {
6
+ position: fixed !important;
7
+ }
8
+
9
+ .ujs-dialog-x {
10
+ position: absolute;
11
+ top: -14px;
12
+ right: -13px;
13
+ cursor: pointer;
14
+ background-image: url('/images/jqr-helpers/close.png');
15
+ width: 30px;
16
+ height: 30px;
17
+ }
18
+
19
+ .ui-dialog.no-title .ui-dialog-titlebar {
20
+ display: none;
21
+ }
@@ -0,0 +1,22 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'jqr-helpers'
3
+ s.require_paths = %w(. lib lib/jqr-helpers)
4
+ s.version = '1.0.0'
5
+ s.date = '2013-11-19'
6
+ s.summary = 'Helpers to print unobtrusive jQuery-UI tags.'
7
+ s.description = <<-EOF
8
+ This gem allows the use of several helper methods.
9
+ The tags output contain classes and data attributes that are grabbed by
10
+ unobtrusive JavaScript code and turned into jQuery UI widgets.
11
+ Helpers include Ajax requests to update elements on the page, dialogs
12
+ (including remote dialogs), and tab containers.
13
+ EOF
14
+ s.authors = ['Daniel Orner']
15
+ s.email = 'daniel.orner@wishabi.com'
16
+ s.files = `git ls-files`.split($/)
17
+ s.homepage = 'https://github.com/wishabi/jqr-helpers'
18
+ s.license = 'MIT'
19
+
20
+ s.add_dependency 'rails', '>= 3.0'
21
+
22
+ end
@@ -0,0 +1 @@
1
+ require 'jqr-helpers/railtie' if defined?(Rails)
@@ -0,0 +1,213 @@
1
+ module JqrHelpers
2
+ module Helpers
3
+
4
+ # Add a link to create a jQuery dialog.
5
+ # If a block is given, dialog_options and html_options are shifted left by
6
+ # 1 and the block is used as the html_content.
7
+ # @param dialog_id [String] The ID of the element to put in the dialog.
8
+ # @param html_content [String] Text or HTML tags to use as the link body.
9
+ # @param dialog_options [Hash] See above.
10
+ # @param html_options [Hash] Attributes to put on the link tag. There is
11
+ # a special :tag_name option that can be used to change the tag being
12
+ # created. Default is :a, but you can pass :div, :span, etc.
13
+ # @return [String]
14
+ def link_to_dialog(dialog_id, html_content='', dialog_options={},
15
+ html_options={}, &block)
16
+
17
+ if block_given?
18
+ html_options = dialog_options
19
+ dialog_options = html_content.presence || {}
20
+ html_content = capture(&block)
21
+ end
22
+
23
+ html_options[:class] ||= ''
24
+ html_options[:class] << ' ujs-dialog'
25
+ html_options[:'data-dialog-id'] = dialog_id
26
+ html_options[:'data-close-x'] = dialog_options[:close_x]
27
+
28
+ tag_name = html_options.delete(:tag_name) || :a
29
+ html_options[:href] = '#' if tag_name == :a
30
+
31
+ if dialog_options[:title] == false # not nil or blank
32
+ dialog_options[:dialogClass] ||= ''
33
+ dialog_options[:dialogClass] << ' ujs-dialog-modal no-title'
34
+ else
35
+ dialog_options[:title] ||= 'Dialog'
36
+ end
37
+ dialog_options[:modal] = true
38
+ dialog_options[:width] ||= 'auto'
39
+ if dialog_options.delete(:default_buttons)
40
+ dialog_options[:buttons] = {
41
+ :OK => 'submit',
42
+ :Cancel => 'close'
43
+ }
44
+ end
45
+
46
+ html_options[:'data-dialog-options'] = dialog_options.to_json
47
+
48
+ content_tag tag_name, html_content, html_options
49
+ end
50
+
51
+ # Add a button to create a jQuery dialog.
52
+ # @param dialog_id [String] The ID of the element to put in the dialog.
53
+ # @param html_content [String] Text or HTML tags to use as the button body.
54
+ # @param html_options [Hash] Attributes to put on the button tag.
55
+ # @param dialog_options [Hash] See above.
56
+ # @return [String]
57
+ def button_to_dialog(dialog_id, html_content, dialog_options={},
58
+ html_options={})
59
+ link_to_dialog(dialog_id, html_content, dialog_options,
60
+ html_options.merge(:tag_name => 'button'))
61
+ end
62
+
63
+ # Create a button that prompts a jQuery confirm dialog, which is nicer-looking
64
+ # than the default window.confirm() which is used by Rails. Done using
65
+ # button_to, so note that a form element will be added.
66
+ # @param html_content [String] the text or content to go inside the button
67
+ # @param url [String] the URL which the button should go to if confirmed
68
+ # @param message [String] the confirm message to prompt
69
+ # @param html_options [Hash] HTML attributes.
70
+ def confirm_button(html_content, url, message, html_options)
71
+ button_to html_content, url, html_options.merge(
72
+ :'data-message' => simple_format(message), # turn text into HTML
73
+ :'data-ujs-confirm' => true
74
+ )
75
+ end
76
+
77
+ # Same as link_to_dialog, but loads content from a remote URL instead of
78
+ # using content already on the page.
79
+ # If a block is given, dialog_options and html_options are shifted left by
80
+ # 1 and the block is used as the html_content.
81
+ # @param id [String] A unique ID to use to reference the dialog options.
82
+ # This is ultimately created as an element with that ID in the DOM,
83
+ # but the element does not have to exist already, unlike link_to_dialog.
84
+ # @param url [String] The URL to load the content from.
85
+ # @param html_content [String] Text or HTML tags to use as the link body.
86
+ # @param dialog_options [Hash] See above.
87
+ # @param html_options [Hash] Attributes to put on the link tag. There is
88
+ # a special :tag_name option that can be used to change the tag being
89
+ # created. Default is :a, but you can pass :div, :span, etc.
90
+ # @return [String]
91
+ def link_to_remote_dialog(id, url, html_content, dialog_options={},
92
+ html_options={}, &block)
93
+
94
+ if block_given?
95
+ html_options = dialog_options
96
+ dialog_options = html_content
97
+ html_content = capture(&block)
98
+ end
99
+
100
+ html_options[:'data-dialog-url'] = url
101
+ link_to_dialog(id, html_content, dialog_options, html_options)
102
+ end
103
+
104
+ # Same as button_to_dialog, but loads content from a remote URL instead of
105
+ # using content already on the page.
106
+ # @param id [String] A unique ID to use to reference the dialog options.
107
+ # This is ultimately created as an element with that ID in the DOM,
108
+ # but the element does not have to exist already, unlike button_to_dialog.
109
+ # @param url [String] The URL to load the content from.
110
+ # @param html_content [String] Text or HTML tags to use as the button body.
111
+ # @param dialog_options [Hash] See above.
112
+ # @param html_options [Hash] Attributes to put on the button tag.
113
+ # @return [String]
114
+ def button_to_remote_dialog(id, url, html_content, dialog_options={},
115
+ html_options={})
116
+ link_to_remote_dialog(id, url, html_content, dialog_options,
117
+ html_options.merge(:tag_name => 'button'))
118
+ end
119
+
120
+ # Create a link that fires off a jQuery Ajax request. This is basically
121
+ # a wrapper around link_to :remote => true.
122
+ # If a block is given, url and options will be shifted left by 1 position
123
+ # and the block contents will be used for the body.
124
+ # @param body [String] the text/content that goes inside the tag.
125
+ # @param url [String] the URL to connect to.
126
+ # @param options [Hash] Ajax options - see above.
127
+ # @return [String]
128
+ def link_to_ajax(body, url, options={}, &block)
129
+ if block_given?
130
+ options = url
131
+ url = body
132
+ body = capture(&block)
133
+ end
134
+
135
+ options[:remote] = true
136
+ options.merge!(_process_ajax_options(options))
137
+
138
+ link_to body, url, options
139
+ end
140
+
141
+ # Create a button that fires off a jQuery Ajax request. This is basically
142
+ # a wrapper around button_to :remote => true.
143
+ # @param body [String] the text/content that goes inside the tag.
144
+ # @param url [String] the URL to connect to.
145
+ # @param options [Hash] Ajax options - see above.
146
+ # @return [String]
147
+ def button_to_ajax(body, url, options={})
148
+
149
+ options[:remote] = true
150
+ options[:form] ||= {}
151
+ options[:form].merge!(_process_ajax_options(options))
152
+
153
+ button_to body, url, options
154
+ end
155
+
156
+ # Create a form tag that submits to an Ajax request. Basically a wrapper for
157
+ # form_tag with :remote => true.
158
+ # @param url [String] the URL to connect to.
159
+ # @param options [Hash] Ajax options - see above.
160
+ # @return [String]
161
+ def form_tag_ajax(url, options={}, &block)
162
+
163
+ options[:remote] = true
164
+ # note that we only override if nil - not false
165
+ options[:close_dialog] = true if options[:close_dialog].nil?
166
+ options[:use_dialog_opener] = true if options[:use_dialog_opener].nil?
167
+ options.merge!(_process_ajax_options(options))
168
+
169
+ form_tag url, options, &block
170
+ end
171
+
172
+ # Identical to form_tag_ajax except that this passes the given model into
173
+ # form_for instead of form_tag.
174
+ # @param record [ActiveRecord::Base]
175
+ # @param options [Hash]
176
+ # @return [String]
177
+ def form_for_ajax(record, options={}, &block)
178
+ options[:remote] = true
179
+ # note that we only override if nil - not false
180
+ options[:close_dialog] = true if options[:close_dialog].nil?
181
+ options[:use_dialog_opener] = true if options[:use_dialog_opener].nil?
182
+ options[:html] ||= {}
183
+ options[:html].merge!(_process_ajax_options(options))
184
+
185
+ form_for record, options, &block
186
+
187
+ end
188
+
189
+ private
190
+
191
+ # Process options related to Ajax requests (e.g. button_to_ajax).
192
+ # @param options [Hash]
193
+ # @return [Hash] HTML options to inject.
194
+ def _process_ajax_options(options)
195
+ new_options = {}
196
+ new_options[:class] = options[:class] || ''
197
+ new_options[:class] << ' ujs-ajax'
198
+ new_options[:'data-type'] = 'html'
199
+ new_options[:'data-callback'] = options.delete(:callback)
200
+ new_options[:'data-close-dialog'] = options.delete(:close_dialog)
201
+ new_options[:'data-use-dialog-opener'] = options.delete(:use_dialog_opener)
202
+
203
+ [:update, :append, :delete].each do |result_method|
204
+ selector = options.delete(result_method)
205
+ if selector
206
+ new_options[:'data-selector'] = selector
207
+ new_options[:'data-result-method'] = result_method
208
+ end
209
+ end
210
+ new_options
211
+ end
212
+ end
213
+ end
@@ -0,0 +1,25 @@
1
+ require 'rails'
2
+ require 'rails/generators'
3
+
4
+ module JqrHelpers
5
+ module Generators
6
+ class InstallGenerator < ::Rails::Generators::Base
7
+
8
+ desc 'This generator installs jqr-helper JavaScript, CSS, and image files.'
9
+ source_root File.expand_path('../../../app/assets', __FILE__)
10
+
11
+ def copy_files
12
+ log 'Copying files...'
13
+ files = [
14
+ 'javascripts/jqr-helpers.js',
15
+ 'stylesheets/jqr-helpers.css',
16
+ 'images/jqr-helpers/close.png',
17
+ 'images/jqr-helpers/throbber.gif'
18
+ ]
19
+ files.each do |file|
20
+ copy_file file, "public/#{file}"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,12 @@
1
+ require 'helpers'
2
+
3
+ module JqrHelpers
4
+ class Railtie < Rails::Railtie
5
+ initializer 'jqr-helpers.helpers' do
6
+ ActionView::Base.send :include, Helpers
7
+ end
8
+ generators do
9
+ require 'install_generator'
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ module JqrHelpers
2
+ module Rails
3
+ VERSION = '1.0.0'
4
+ end
5
+ end
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jqr-helpers
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: 6
5
- version: 1.0.0.beta1
4
+ prerelease:
5
+ version: 1.0.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Daniel Orner
@@ -36,7 +36,18 @@ email: daniel.orner@wishabi.com
36
36
  executables: []
37
37
  extensions: []
38
38
  extra_rdoc_files: []
39
- files: []
39
+ files:
40
+ - Readme.md
41
+ - app/assets/images/jqr-helpers/close.png
42
+ - app/assets/images/jqr-helpers/throbber.gif
43
+ - app/assets/javascripts/jqr-helpers.js
44
+ - app/assets/stylesheets/jqr-helpers.css
45
+ - jqr-helpers.gemspec
46
+ - lib/jqr-helpers.rb
47
+ - lib/jqr-helpers/helpers.rb
48
+ - lib/jqr-helpers/install_generator.rb
49
+ - lib/jqr-helpers/railtie.rb
50
+ - lib/jqr-helpers/version.rb
40
51
  homepage: https://github.com/wishabi/jqr-helpers
41
52
  licenses:
42
53
  - MIT
@@ -46,8 +57,6 @@ require_paths:
46
57
  - .
47
58
  - lib
48
59
  - lib/jqr-helpers
49
- - lib/generators
50
- - app/helpers
51
60
  required_ruby_version: !ruby/object:Gem::Requirement
52
61
  none: false
53
62
  requirements:
@@ -57,9 +66,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
57
66
  required_rubygems_version: !ruby/object:Gem::Requirement
58
67
  none: false
59
68
  requirements:
60
- - - ! '>'
69
+ - - ! '>='
61
70
  - !ruby/object:Gem::Version
62
- version: 1.3.1
71
+ version: '0'
63
72
  requirements: []
64
73
  rubyforge_project:
65
74
  rubygems_version: 1.8.25