smart_listing 1.2.0 → 1.2.1
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 +14 -14
- data/app/assets/javascripts/smart_listing.coffee.erb +8 -5
- data/app/helpers/smart_listing/helper.rb +1 -0
- data/app/views/smart_listing/item/_create.js.erb +1 -1
- data/app/views/smart_listing/item/_create_continue.js.erb +1 -1
- data/app/views/smart_listing/item/_destroy.js.erb +1 -1
- data/app/views/smart_listing/item/_edit.js.erb +1 -1
- data/app/views/smart_listing/item/_remove.js.erb +1 -1
- data/app/views/smart_listing/item/_update.js.erb +1 -1
- data/lib/generators/smart_listing/install_generator.rb +3 -3
- data/lib/generators/smart_listing/templates/initializer.rb +4 -0
- data/lib/generators/smart_listing/views_generator.rb +3 -3
- data/lib/smart_listing.rb +5 -5
- data/lib/smart_listing/config.rb +3 -0
- data/lib/smart_listing/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d036e38f0ade94d2360779aad5df71aa55044c9
|
4
|
+
data.tar.gz: 77fd8c742f4f0795e6bf6e20b0ef756b60083602
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 929c87c6a88255ea1a8e1510252f6d1c08578818d94490d6b7395ed6fb24133bb818250b1e1d54df092e4b42c36f79c23e31279bc457e8d414c8edc2cecb5f3c
|
7
|
+
data.tar.gz: ad3fb94f079e41cbbc6d6ef8e56f00703a94fc93b954a522ab35a8ff4977e1b214b12cda9e89581f0a5aa008b9c4ca565a1bc37f8f75174bbad56aff50ebe1b9
|
data/README.md
CHANGED
@@ -73,7 +73,7 @@ smart_listing_render(:users)
|
|
73
73
|
- unless smart_listing.empty?
|
74
74
|
%table
|
75
75
|
%thead
|
76
|
-
%tr
|
76
|
+
%tr
|
77
77
|
%th User name
|
78
78
|
%th Email
|
79
79
|
%tbody
|
@@ -82,7 +82,7 @@ smart_listing_render(:users)
|
|
82
82
|
%td= user.name
|
83
83
|
%td= user.email
|
84
84
|
|
85
|
-
= smart_listing.paginate
|
85
|
+
= smart_listing.paginate
|
86
86
|
- else
|
87
87
|
%p.warning No records!
|
88
88
|
```
|
@@ -112,7 +112,7 @@ SmartListing supports two modes of sorting: implicit and explicit. Implicit mode
|
|
112
112
|
- unless smart_listing.empty?
|
113
113
|
%table
|
114
114
|
%thead
|
115
|
-
%tr
|
115
|
+
%tr
|
116
116
|
%th= smart_listing.sortable "User name", :name
|
117
117
|
%th= smart_listing.sortable "Email", :email
|
118
118
|
%tbody
|
@@ -121,12 +121,12 @@ SmartListing supports two modes of sorting: implicit and explicit. Implicit mode
|
|
121
121
|
%td= user.name
|
122
122
|
%td= user.email
|
123
123
|
|
124
|
-
= smart_listing.paginate
|
124
|
+
= smart_listing.paginate
|
125
125
|
- else
|
126
126
|
%p.warning No records!
|
127
127
|
```
|
128
128
|
|
129
|
-
In this case `:name` and `:email` are sorting column names. `Builder#sortable` renders special link containing column name and sort order (either `asc`, `desc`, or empty value).
|
129
|
+
In this case `:name` and `:email` are sorting column names. `Builder#sortable` renders special link containing column name and sort order (either `asc`, `desc`, or empty value).
|
130
130
|
|
131
131
|
You can also specify default sort order in the controller:
|
132
132
|
|
@@ -136,7 +136,7 @@ You can also specify default sort order in the controller:
|
|
136
136
|
|
137
137
|
Implicit mode is convenient with simple data sets. In case you want to sort by joined column names, we advise you to use explicit sorting:
|
138
138
|
```ruby
|
139
|
-
@users = smart_listing_create :users, User.active.joins(:stats), partial: "users/listing",
|
139
|
+
@users = smart_listing_create :users, User.active.joins(:stats), partial: "users/listing",
|
140
140
|
sort_attributes: [[:last_signin, "stats.last_signin_at"]],
|
141
141
|
default_sort: {last_signin: "desc"}
|
142
142
|
```
|
@@ -153,7 +153,7 @@ In order to allow managing and editing list items, we need to reorganize our vie
|
|
153
153
|
- unless smart_listing.empty?
|
154
154
|
%table
|
155
155
|
%thead
|
156
|
-
%tr
|
156
|
+
%tr
|
157
157
|
%th= smart_listing.sortable "User name", "name"
|
158
158
|
%th= smart_listing.sortable "Email", "email"
|
159
159
|
%th
|
@@ -161,9 +161,9 @@ In order to allow managing and editing list items, we need to reorganize our vie
|
|
161
161
|
- smart_listing.collection.each do |user|
|
162
162
|
%tr.editable{data: {id: user.id}}
|
163
163
|
= smart_listing.render partial: 'users/user', locals: {user: user}
|
164
|
-
= smart_listing.item_new colspan: 3, link: new_user_path
|
164
|
+
= smart_listing.item_new colspan: 3, link: new_user_path
|
165
165
|
|
166
|
-
= smart_listing.paginate
|
166
|
+
= smart_listing.paginate
|
167
167
|
- else
|
168
168
|
%p.warning No records!
|
169
169
|
```
|
@@ -174,7 +174,7 @@ In order to allow managing and editing list items, we need to reorganize our vie
|
|
174
174
|
<%= smart_listing_item :users, :new, @new_user, "users/form" %>
|
175
175
|
```
|
176
176
|
|
177
|
-
Note that `new` action does not need to create SmartListing (via `smart_listing_create`). It just initializes `@new_user` and renders JS view.
|
177
|
+
Note that `new` action does not need to create SmartListing (via `smart_listing_create`). It just initializes `@new_user` and renders JS view.
|
178
178
|
|
179
179
|
New partial for user (`users/user`) may look like this:
|
180
180
|
```haml
|
@@ -204,10 +204,10 @@ Partial name supplied to `smart_listing_item` (`users/form`) references `@user`
|
|
204
204
|
|
205
205
|
= form_for object, url: object.new_record? ? users_path : user_path(object), remote: true do |f|
|
206
206
|
%p
|
207
|
-
Name:
|
207
|
+
Name:
|
208
208
|
= f.text_field :name
|
209
209
|
%p
|
210
|
-
Email:
|
210
|
+
Email:
|
211
211
|
= f.text_field :email
|
212
212
|
%p= f.submit "Save"
|
213
213
|
```
|
@@ -228,7 +228,7 @@ SmartListing controls allow you to change somehow presented data. This is typica
|
|
228
228
|
.filter.input-append
|
229
229
|
= text_field_tag :filter, '', class: "search", placeholder: "Type name here", autocomplete: "off"
|
230
230
|
%button.btn.disabled{type: "submit"}
|
231
|
-
%
|
231
|
+
%span.glyphicon.glyphicon-search
|
232
232
|
```
|
233
233
|
|
234
234
|
This gives you nice Bootstrap-enabled filter field with keychange handler. Of course you can use any other form fields in controls too.
|
@@ -262,7 +262,7 @@ SmartListing.configure(:awesome_profile) do |config|
|
|
262
262
|
end
|
263
263
|
```
|
264
264
|
|
265
|
-
In order to use this profile, create helper method named `smart_listing_config_profile` returning profile name and put into your JS `SmartListing.config.merge()` function call. `merge()` function expects parameter with config attributes hash or reads body data-attribute named `smart-listing-config`. Hash of config attributes can be obtained by using helper method `SmartListing.config(:awesome_profile).to_json`.
|
265
|
+
In order to use this profile, create helper method named `smart_listing_config_profile` returning profile name and put into your JS `SmartListing.config.merge()` function call. `merge()` function expects parameter with config attributes hash or reads body data-attribute named `smart-listing-config`. Hash of config attributes can be obtained by using helper method `SmartListing.config(:awesome_profile).to_json`.
|
266
266
|
|
267
267
|
## Not enough?
|
268
268
|
|
@@ -24,6 +24,9 @@ class window.SmartListing
|
|
24
24
|
@element_template: (name)->
|
25
25
|
@options["constants"]["element_templates"][name]
|
26
26
|
|
27
|
+
@bootstrap_commands: (name)->
|
28
|
+
@options["constants"]["bootstrap_commands"][name]
|
29
|
+
|
27
30
|
@config: Config
|
28
31
|
|
29
32
|
|
@@ -319,8 +322,8 @@ $.fn.smart_listing.observeField = (field, opts = {}) ->
|
|
319
322
|
, 400)
|
320
323
|
|
321
324
|
$.fn.smart_listing.showPopover = (elem, body) ->
|
322
|
-
elem.popover("
|
323
|
-
elem.popover(content: body, html: true, trigger: "manual"
|
325
|
+
elem.popover(SmartListing.config.bootstrap_commands("popover_destroy"))
|
326
|
+
elem.popover(content: body, html: true, trigger: "manual")
|
324
327
|
elem.popover("show")
|
325
328
|
|
326
329
|
$.fn.smart_listing.showConfirmation = (confirmation_elem, msg, confirm_callback) ->
|
@@ -333,12 +336,12 @@ $.fn.smart_listing.showConfirmation = (confirmation_elem, msg, confirm_callback)
|
|
333
336
|
editable = $(event.currentTarget).closest(SmartListing.config.class_name("editable"))
|
334
337
|
confirm_callback(confirmation_elem)
|
335
338
|
$(confirmation_elem).click()
|
336
|
-
$(confirmation_elem).popover("
|
339
|
+
$(confirmation_elem).popover(SmartListing.config.bootstrap_commands("popover_destroy"))
|
337
340
|
)
|
338
341
|
.append(" ")
|
339
342
|
.append($("<button/>").html("No").addClass("btn btn-small").click (event) =>
|
340
343
|
editable = $(event.currentTarget).closest(SmartListing.config.class_name("editable"))
|
341
|
-
$(confirmation_elem).popover("
|
344
|
+
$(confirmation_elem).popover(SmartListing.config.bootstrap_commands("popover_destroy"))
|
342
345
|
)
|
343
346
|
)
|
344
347
|
|
@@ -438,4 +441,4 @@ ready = ->
|
|
438
441
|
$(SmartListing.config.class_name("controls")).smart_listing_controls()
|
439
442
|
|
440
443
|
$(document).ready ready
|
441
|
-
$(document).on "page:load", ready
|
444
|
+
$(document).on "page:load turbolinks:load", ready
|
@@ -11,6 +11,7 @@ module SmartListing
|
|
11
11
|
name = (args[0] || options[:name] || controller_name).to_sym
|
12
12
|
collection = args[1] || options[:collection] || smart_listing_collection
|
13
13
|
|
14
|
+
view_context = self.respond_to?(:controller) ? controller.view_context : self.view_context
|
14
15
|
options = {:config_profile => view_context.smart_listing_config_profile}.merge(options)
|
15
16
|
|
16
17
|
list = SmartListing::Base.new(name, collection, options)
|
@@ -1,3 +1,3 @@
|
|
1
1
|
var smart_listing = $('#<%= name %>').smart_listing();
|
2
2
|
smart_listing.setAutoshow(false);
|
3
|
-
smart_listing.create(<%= id || 0 %>, <%= object.persisted? %>, "<%= escape_javascript(render(:partial => part, :locals => {object_key => object})) %>");
|
3
|
+
smart_listing.create(<%= (id || 0).to_json.html_safe %>, <%= object.persisted? %>, "<%= escape_javascript(render(:partial => part, :locals => {object_key => object})) %>");
|
@@ -1,6 +1,6 @@
|
|
1
1
|
var smart_listing = $('#<%= name %>').smart_listing();
|
2
2
|
smart_listing.setAutoshow(true);
|
3
|
-
smart_listing.create(<%= id || 0 %>, <%= object.persisted? %>, "<%= escape_javascript(render(:partial => part, :locals => {object_key => object})) %>");
|
3
|
+
smart_listing.create(<%= (id || 0).to_json.html_safe %>, <%= object.persisted? %>, "<%= escape_javascript(render(:partial => part, :locals => {object_key => object})) %>");
|
4
4
|
<% if object.persisted? %>
|
5
5
|
smart_listing.new_item("<%= escape_javascript(render(:partial => new.last, :locals => {object_key => new.first})) %>");
|
6
6
|
<% end %>
|
@@ -1,2 +1,2 @@
|
|
1
1
|
var smart_listing = $('#<%= name.to_s %>').smart_listing();
|
2
|
-
smart_listing.destroy(<%= id %>, <%= object.destroyed? %>);
|
2
|
+
smart_listing.destroy(<%= id.to_json.html_safe %>, <%= object.destroyed? %>);
|
@@ -1,2 +1,2 @@
|
|
1
1
|
var smart_listing = $('#<%= name %>').smart_listing();
|
2
|
-
smart_listing.edit(<%= id %>, "<%= escape_javascript(render(:partial => part, :locals => {object_key => object})) %>");
|
2
|
+
smart_listing.edit(<%= id.to_json.html_safe %>, "<%= escape_javascript(render(:partial => part, :locals => {object_key => object})) %>");
|
@@ -1,2 +1,2 @@
|
|
1
1
|
var smart_listing = $('#<%= name %>').smart_listing();
|
2
|
-
smart_listing.remove(<%= id %>);
|
2
|
+
smart_listing.remove(<%= id.to_json.html_safe %>);
|
@@ -1,2 +1,2 @@
|
|
1
1
|
var smart_listing = $('#<%= name %>').smart_listing();
|
2
|
-
smart_listing.update(<%= id %>, <%= valid.nil? ? object.valid? : valid %>, "<%= escape_javascript(render(:partial => part, :locals => {object_key => object})) %>");
|
2
|
+
smart_listing.update(<%= id.to_json.html_safe %>, <%= valid.nil? ? object.valid? : valid %>, "<%= escape_javascript(render(:partial => part, :locals => {object_key => object})) %>");
|
@@ -5,7 +5,7 @@ module SmartListing
|
|
5
5
|
|
6
6
|
def self.banner #:nodoc:
|
7
7
|
<<-BANNER.chomp
|
8
|
-
rails g smart_listing:install
|
8
|
+
rails g smart_listing:install
|
9
9
|
|
10
10
|
Copies initializer file
|
11
11
|
BANNER
|
@@ -15,6 +15,6 @@ BANNER
|
|
15
15
|
def copy_views
|
16
16
|
template 'initializer.rb', 'config/initializers/smart_listing.rb'
|
17
17
|
end
|
18
|
-
|
19
|
-
|
18
|
+
end
|
19
|
+
end
|
20
20
|
end
|
@@ -5,7 +5,7 @@ module SmartListing
|
|
5
5
|
|
6
6
|
def self.banner #:nodoc:
|
7
7
|
<<-BANNER.chomp
|
8
|
-
rails g smart_listing:views
|
8
|
+
rails g smart_listing:views
|
9
9
|
|
10
10
|
Copies all smart listing partials templates to your application.
|
11
11
|
BANNER
|
@@ -18,6 +18,6 @@ BANNER
|
|
18
18
|
copy_file f, "app/views/smart_listing/#{f}"
|
19
19
|
end
|
20
20
|
end
|
21
|
-
|
22
|
-
|
21
|
+
end
|
22
|
+
end
|
23
23
|
end
|
data/lib/smart_listing.rb
CHANGED
@@ -68,8 +68,8 @@ module SmartListing
|
|
68
68
|
end
|
69
69
|
|
70
70
|
if @options[:array]
|
71
|
-
if @sort &&
|
72
|
-
i = sort_keys.index{|x| x[0] == @sort.first[0]}
|
71
|
+
if @sort && !@sort.empty? # when array we sort only by first attribute
|
72
|
+
i = sort_keys.index{|x| x[0] == @sort.to_h.first[0]}
|
73
73
|
@collection = @collection.sort do |x, y|
|
74
74
|
xval = x
|
75
75
|
yval = y
|
@@ -83,7 +83,7 @@ module SmartListing
|
|
83
83
|
if xval.nil? || yval.nil?
|
84
84
|
xval.nil? ? 1 : -1
|
85
85
|
else
|
86
|
-
if @sort.first[1] == "asc"
|
86
|
+
if @sort.to_h.first[1] == "asc"
|
87
87
|
(xval <=> yval) || (xval && !yval ? 1 : -1)
|
88
88
|
else
|
89
89
|
(yval <=> xval) || (yval && !xval ? 1 : -1)
|
@@ -94,13 +94,13 @@ module SmartListing
|
|
94
94
|
if @options[:paginate] && @per_page > 0
|
95
95
|
@collection = ::Kaminari.paginate_array(@collection).page(@page).per(@per_page)
|
96
96
|
if @collection.length == 0
|
97
|
-
@collection = @collection.page(@collection.
|
97
|
+
@collection = @collection.page(@collection.total_pages)
|
98
98
|
end
|
99
99
|
end
|
100
100
|
else
|
101
101
|
# let's sort by all attributes
|
102
102
|
#
|
103
|
-
@collection = @collection.order(sort_keys.collect{|s| "#{s[1]} #{@sort[s[0]]}" if @sort[s[0]]}.compact) if @sort &&
|
103
|
+
@collection = @collection.order(sort_keys.collect{|s| "#{s[1]} #{@sort[s[0]]}" if @sort[s[0]]}.compact) if @sort && !@sort.empty?
|
104
104
|
|
105
105
|
if @options[:paginate] && @per_page > 0
|
106
106
|
@collection = @collection.page(@page).per(@per_page)
|
data/lib/smart_listing/config.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smart_listing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sology
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|