smart_listing 0.9.4 → 0.9.5

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: 34f2ebadeaeafd444b806b6392bd706ebd298d24
4
- data.tar.gz: dd9ebe392e5a3976e2c69183d32cb90c6cf67e2d
3
+ metadata.gz: 3b40428000bfc11c02baa6cc4bc4ffa833895374
4
+ data.tar.gz: 8216002025b1b94989383185e3a0e74ef6f3edd2
5
5
  SHA512:
6
- metadata.gz: 6cc5d0d352c80b62fcd0526ce62385a2c58e0eda3563131d56748d2a8cc235e0144c078f8b9e5aa01cc5ea2b14b4c930489b2986de40e7f51e04a7d008542646
7
- data.tar.gz: 239bdd2c28d6f113c864ef5054135a5a7b65fcf83e2dc482da3a162eb610e34a4e2a73c6c1a2064a403eb0868bec9c1411d648bf8ebf61b6e7da0d9c482573c2
6
+ metadata.gz: fb27518994b2809cca48dc8c1b51fe6a5345eba4083d7f376f724924aa7f37ecfc86ef96f67f5245a9dd9a2880ad12ca0a24ebea54b8f4e5174844908fbcf0f6
7
+ data.tar.gz: c54bbcf9716bfc35e186ddaa0fcae0e4dcaa86c59e5facd0adb383adc36c016badcd210a1dda6139ba5124645f93c9b3365d7ead9d2f71bd82a66c133b32a113
@@ -113,6 +113,8 @@ class SmartListing
113
113
  data = {}
114
114
  data[checkbox.val()] = checkbox.is(":checked")
115
115
  $.ajax({
116
+ beforeSend: (xhr, settings) ->
117
+ xhr.setRequestHeader "accept", "*/*;q=0.5, " + settings.accepts.script
116
118
  url: @container.data("callback-href"),
117
119
  type: "POST",
118
120
  data: data,
@@ -0,0 +1,339 @@
1
+ # Useful when SmartListing target url is different than current one
2
+ $.rails.href = (element) ->
3
+ element.attr('href') || element.data('<% SmartListing.config.data_attributes(:href) %>')
4
+
5
+ class SmartListing
6
+ constructor: (e) ->
7
+ @container = e
8
+ @name = @container.attr('id')
9
+ @loading = @container.find(".<%= SmartListing.config.classes(:loading) %>")
10
+ @content = @container.find(".<%= SmartListing.config.classes(:content) %>")
11
+ @status = $(".<%= SmartListing.config.classes(:status) %>[data-<%= SmartListing.config.data_attributes(:main) %>='#{@name}']")
12
+ @confirmed = null
13
+
14
+ @container.on 'ajax:before', (e) =>
15
+ @fadeLoading()
16
+
17
+ @container.on 'ajax:success', (e) =>
18
+ if $(e.target).is('.<%= SmartListing.config.classes(:item_actions) %> <%= SmartListing.config.selectors(:item_action_destroy) %>')
19
+ # handle HEAD OK response for deletion request
20
+ editable = $(e.target).closest('.<%= SmartListing.config.classes(:editable) %>')
21
+ if @container.find(".<%= SmartListing.config.classes(:editable) %>").length == 1
22
+ @reload()
23
+ return false
24
+ else
25
+ editable.remove()
26
+
27
+ @changeItemCount(-1)
28
+ @refresh()
29
+
30
+ @fadeLoaded()
31
+ return false
32
+
33
+ @container.on 'click', '<%= SmartListing.config.selectors(:edit_cancel) %>', (event) =>
34
+ editable = $(event.currentTarget).closest('.<%= SmartListing.config.classes(:editable) %>')
35
+ if(editable.length > 0)
36
+ # Cancel edit
37
+ @cancelEdit(editable)
38
+ else
39
+ # Cancel new record
40
+ @container.find('.<%= SmartListing.config.classes(:new_item_placeholder) %>').addClass('<%= SmartListing.config.classes(:hidden) %>')
41
+ @container.find('.<%= SmartListing.config.classes(:new_item_action) %>').removeClass('<%= SmartListing.config.classes(:hidden) %>')
42
+ false
43
+
44
+ @container.on 'click', '.<%= SmartListing.config.classes(:item_actions) %> a[data-<%= SmartListing.config.data_attributes(:confirmation) %>]', (event) =>
45
+ # Check if we are confirming the right element
46
+ if(@confirmed != event.currentTarget)
47
+ # We need confirmation
48
+ $.fn.smart_listing.showPopover $(event.currentTarget), $(event.currentTarget).data('<%= SmartListing.config.data_attributes(:confirmation) %>'), (confirm_elem) =>
49
+ @confirmed = confirm_elem[0]
50
+ false
51
+ else
52
+ # Confirmed, reset flag and go ahead with deletion
53
+ @confirmed = null
54
+ true
55
+
56
+ @container.on 'click', 'input[type=text].<%= SmartListing.config.classes(:autoselect) %>', (event) ->
57
+ $(this).select()
58
+
59
+ @container.on 'change', '.<%= SmartListing.config.classes(:callback) %>', (event) =>
60
+ checkbox = $(event.currentTarget)
61
+ id = checkbox.closest("<%= SmartListing.config.selectors(:row) %>").data("<%= SmartListing.config.data_attributes(:id) %>")
62
+ data = {}
63
+ data[checkbox.val()] = checkbox.is(":checked")
64
+ $.ajax({
65
+ beforeSend: (xhr, settings) ->
66
+ xhr.setRequestHeader "accept", "*/*;q=0.5, " + settings.accepts.script
67
+ url: @container.data("<%= SmartListing.config.data_attributes(:callback_href) %>"),
68
+ type: "POST",
69
+ data: data,
70
+ })
71
+
72
+ fadeLoading: =>
73
+ $.fn.smart_listing.onLoading(@content, @loading)
74
+
75
+ fadeLoaded: =>
76
+ $.fn.smart_listing.onLoaded(@content, @loading)
77
+
78
+ itemCount: =>
79
+ parseInt(@container.find('.<%= SmartListing.config.classes(:pagination_per_page) %> .<%= SmartListing.config.classes(:pagination_count) %>').html())
80
+
81
+ maxCount: =>
82
+ parseInt(@container.data('<%= SmartListing.config.data_attributes(:max_count) %>'))
83
+
84
+ changeItemCount: (value) =>
85
+ @container.find('.<%= SmartListing.config.classes(:pagination_per_page) %> .<%= SmartListing.config.classes(:pagination_count) %>').html(@itemCount() + value)
86
+
87
+ cancelEdit: (editable) =>
88
+ if editable.data('<%= SmartListing.config.data_attributes(:inline_edit_backup) %>')
89
+ editable.html(editable.data('<%= SmartListing.config.data_attributes(:inline_edit_backup) %>'))
90
+ editable.removeClass('<%= SmartListing.config.classes(:inline_editing) %>')
91
+ editable.removeData('<%= SmartListing.config.data_attributes(:inline_edit_backup) %>')
92
+
93
+ # Callback called when record is added/deleted using ajax request
94
+ refresh: () =>
95
+ header = @content.find('<%= SmartListing.config.selectors(:head) %>')
96
+ footer = @content.find('.<%= SmartListing.config.classes(:pagination_per_page) %>')
97
+ no_records = @content.find('.<%= SmartListing.config.classes(:no_records) %>')
98
+
99
+ if @itemCount() == 0
100
+ header.hide()
101
+ footer.hide()
102
+ no_records.show()
103
+ else
104
+ header.show()
105
+ footer.show()
106
+ no_records.hide()
107
+
108
+ if @maxCount()
109
+ if @itemCount() >= @maxCount()
110
+ if @itemCount()
111
+ @container.find('.<%= SmartListing.config.classes(:new_item_action) %>').addClass('<%= SmartListing.config.classes(:hidden) %>')
112
+ @container.find('.<%= SmartListing.config.classes(:new_item_action) %> .<%= SmartListing.config.classes(:new_item_button) %>').addClass('<%= SmartListing.config.classes(:hidden) %>')
113
+ else
114
+ @container.find('.<%= SmartListing.config.classes(:new_item_action) %>').removeClass('<%= SmartListing.config.classes(:hidden) %>')
115
+ @container.find('.<%= SmartListing.config.classes(:new_item_action) %> .<%= SmartListing.config.classes(:new_item_button) %>').removeClass('<%= SmartListing.config.classes(:hidden) %>')
116
+
117
+ @status.each (index, status) =>
118
+ $(status).find('.<%= SmartListing.config.classes(:limit) %>').html(@maxCount() - @itemCount())
119
+ if @maxCount() - @itemCount() == 0
120
+ $(status).find('.<%= SmartListing.config.classes(:limit_alert) %>').show()
121
+ else
122
+ $(status).find('.<%= SmartListing.config.classes(:limit_alert) %>').hide()
123
+
124
+ # Trigger AJAX request to reload the list
125
+ reload: () =>
126
+ $.rails.handleRemote(@container)
127
+
128
+ params: () =>
129
+ @container.data('<%= SmartListing.config.data_attributes(:params) %>')
130
+
131
+ #################################################################################################
132
+ # Methods executed by rails UJS:
133
+
134
+ new_item: (content) =>
135
+ new_item_action = @container.find('.<%= SmartListing.config.classes(:new_item_action) %>')
136
+ new_item_placeholder = @container.find('.<%= SmartListing.config.classes(:new_item_placeholder) %>').addClass('<%= SmartListing.config.classes(:hidden) %>')
137
+
138
+ @container.find('.<%= SmartListing.config.classes(:editable) %>').each (i, v) =>
139
+ @cancelEdit($(v))
140
+
141
+ new_item_action.addClass('<%= SmartListing.config.classes(:hidden) %>')
142
+ new_item_placeholder.removeClass('<%= SmartListing.config.classes(:hidden) %>')
143
+ new_item_placeholder.html(content)
144
+ new_item_placeholder.addClass('<%= SmartListing.config.classes(:inline_editing) %>')
145
+
146
+ @fadeLoaded()
147
+
148
+ create: (id, success, content) =>
149
+ new_item_action = @container.find('.<%= SmartListing.config.classes(:new_item_action) %>')
150
+ new_item_placeholder = @container.find('.<%= SmartListing.config.classes(:new_item_placeholder) %>')
151
+
152
+ if success
153
+ new_item_placeholder.addClass('<%= SmartListing.config.classes(:hidden) %>')
154
+ new_item_action.removeClass('<%= SmartListing.config.classes(:hidden) %>')
155
+
156
+ new_item = $('<tr />').addClass('<%= SmartListing.config.classes(:editable) %>')
157
+ new_item.attr('data-<%= SmartListing.config.data_attributes(:id) %>', id)
158
+ new_item.html(content)
159
+ new_item_placeholder.before(new_item)
160
+
161
+ @changeItemCount(1)
162
+ @refresh()
163
+ else
164
+ new_item_placeholder.html(content)
165
+
166
+ @fadeLoaded()
167
+
168
+ edit: (id, content) =>
169
+ @container.find('.<%= SmartListing.config.classes(:editable) %>').each (i, v) =>
170
+ @cancelEdit($(v))
171
+ @container.find('.<%= SmartListing.config.classes(:new_item_placeholder) %>').addClass('<%= SmartListing.config.classes(:hidden) %>')
172
+ @container.find('.<%= SmartListing.config.classes(:new_item_action) %>').removeClass('<%= SmartListing.config.classes(:hidden) %>')
173
+
174
+ editable = @container.find(".<%= SmartListing.config.classes(:editable) %>[data-<%= SmartListing.config.data_attributes(:id) %>=#{id}]")
175
+ editable.data('<%= SmartListing.config.data_attributes(:inline_edit_backup) %>', editable.html())
176
+ editable.html(content)
177
+ editable.addClass('<%= SmartListing.config.classes(:inline_editing) %>')
178
+
179
+ @fadeLoaded()
180
+
181
+ update: (id, success, content) =>
182
+ editable = @container.find(".<%= SmartListing.config.classes(:editable) %>[data-<%= SmartListing.config.data_attributes(:id) %>=#{id}]")
183
+ if success
184
+ editable.removeClass('<%= SmartListing.config.classes(:inline_editing) %>')
185
+ editable.removeData('<%= SmartListing.config.data_attributes(:inline_edit_backup) %>')
186
+ editable.html(content)
187
+
188
+ @refresh()
189
+ else
190
+ editable.html(content)
191
+
192
+ @fadeLoaded()
193
+
194
+ destroy: (id, destroyed) =>
195
+ # No need to do anything here, already handled by ajax:success handler
196
+
197
+ remove: (id) =>
198
+ editable = @container.find(".<%= SmartListing.config.classes(:editable) %>[data-<%= SmartListing.config.data_attributes(:id) %>=#{id}]").first()
199
+ editable.remove()
200
+
201
+ update_list: (content, data) =>
202
+ $.each data, (key, value) =>
203
+ @container.data(key, value)
204
+
205
+ @content.html(content)
206
+
207
+ @refresh()
208
+ @fadeLoaded()
209
+
210
+ $.fn.smart_listing = () ->
211
+ map = $(this).map () ->
212
+ if !$(this).data('<%= SmartListing.config.data_attributes(:main) %>')
213
+ $(this).data('<%= SmartListing.config.data_attributes(:main) %>', new SmartListing($(this)))
214
+ $(this).data('<%= SmartListing.config.data_attributes(:main) %>')
215
+ if map.length == 1
216
+ map[0]
217
+ else
218
+ map
219
+
220
+ $.fn.smart_listing.observeField = (field, opts = {}) ->
221
+ key_timeout = null
222
+ last_value = null
223
+ options =
224
+ onFilled: () ->
225
+ onEmpty: () ->
226
+ onChange: () ->
227
+ options = $.extend(options, opts)
228
+
229
+ keyChange = () ->
230
+ if field.val().length > 0
231
+ options.onFilled()
232
+ else
233
+ options.onEmpty()
234
+
235
+ if field.val() == last_value && field.val().length != 0
236
+ return
237
+ lastValue = field.val()
238
+
239
+ options.onChange()
240
+
241
+ field.data('<%= SmartListing.config.data_attributes(:observed) %>', true)
242
+
243
+ field.bind 'keydown', (e) ->
244
+ if(key_timeout)
245
+ clearTimeout(key_timeout)
246
+
247
+ key_timeout = setTimeout(->
248
+ keyChange()
249
+ , 400)
250
+
251
+ $.fn.smart_listing.showPopover = (confirmation_elem, msg, confirm) ->
252
+ buildPopover = (confirmation_elem, msg) ->
253
+ deletion_popover = $('<div/>').addClass('confirmation_box')
254
+ deletion_popover.append($('<p/>').html(msg))
255
+ deletion_popover.append($('<p/>')
256
+ .append($('<button/>').html('Yes').addClass('btn btn-danger ').click (event) =>
257
+ # set @confirmed element and emulate click on icon
258
+ editable = $(event.currentTarget).closest('.<%= SmartListing.config.classes(:editable) %>')
259
+ confirm(confirmation_elem)
260
+ $(confirmation_elem).click()
261
+ $(confirmation_elem).popover('destroy')
262
+ )
263
+ .append(" ")
264
+ .append($('<button/>').html('No').addClass('btn btn-small').click (event) =>
265
+ editable = $(event.currentTarget).closest('.<%= SmartListing.config.classes(:editable) %>')
266
+ $(confirmation_elem).popover('destroy')
267
+ )
268
+ )
269
+
270
+ confirmation_elem.popover('destroy')
271
+ confirmation_elem.popover(content: buildPopover(confirmation_elem, msg), html: true, trigger: 'manual', title: null)
272
+ confirmation_elem.popover('show')
273
+
274
+ $.fn.smart_listing.onLoading = (content, loader) ->
275
+ content.stop(true).fadeTo(500, 0.2)
276
+ loading.show()
277
+ loading.stop(true).fadeTo(500, 1)
278
+
279
+ $.fn.smart_listing.onLoaded = (content, loader) ->
280
+ content.stop(true).fadeTo(500, 1)
281
+ loading.stop(true).fadeTo 500, 0, () =>
282
+ loading.hide()
283
+
284
+ $.fn.smart_listing_controls = () ->
285
+ $(this).each () ->
286
+ controls = $(this)
287
+ smart_listing = $("##{controls.data('<%= SmartListing.config.data_attributes(:main) %>')}")
288
+ reset = controls.find(".<%= SmartListing.config.classes(:controls_reset) %>")
289
+
290
+ controls.submit ->
291
+ # Merges smart list params with the form action url before submitting.
292
+ # This preserves smart list settings (page, sorting etc.).
293
+
294
+ prms = $.extend({}, smart_listing.smart_listing().params())
295
+ if $(this).data('<%= SmartListing.config.classes(:controls_reset) %>')
296
+ prms[$(this).data('<%= SmartListing.config.classes(:controls_reset) %>')] = null
297
+
298
+ if $.rails.href(smart_listing)
299
+ # If smart list has different target url than current one
300
+ controls.attr('action', $.rails.href(smart_listing) + "?" + jQuery.param(prms))
301
+ else
302
+ controls.attr('action', "?" + jQuery.param(prms))
303
+
304
+ smart_listing.trigger('ajax:before')
305
+ true
306
+
307
+ controls.find('input, select').change () ->
308
+ unless $(this).data('<%= SmartListing.config.data_attributes(:observed) %>') # do not submit controls form when changed field is observed (observing submits form by itself)
309
+ controls.submit()
310
+
311
+ $.fn.smart_listing_controls.filter(controls.find('.<%= SmartListing.config.classes(:filtering) %>'))
312
+
313
+ $.fn.smart_listing_controls.filter = (filter) ->
314
+ form = filter.closest('form')
315
+ button = filter.find('button')
316
+ icon = filter.find('<%= SmartListing.config.selectors(:filtering_icon) %>')
317
+ field = filter.find('input')
318
+
319
+ $.fn.smart_listing.observeField(field,
320
+ onFilled: ->
321
+ icon.removeClass('<%= SmartListing.config.classes(:filtering_search) %>')
322
+ icon.addClass('<%= SmartListing.config.classes(:filtering_cancel) %>')
323
+ button.removeClass('<%= SmartListing.config.classes(:filtering_disabled) %>')
324
+ onEmpty: ->
325
+ icon.addClass('<%= SmartListing.config.classes(:filtering_search) %>')
326
+ icon.removeClass('<%= SmartListing.config.classes(:filtering_cancel) %>')
327
+ button.addClass('<%= SmartListing.config.classes(:filtering_disabled) %>')
328
+ onChange: ->
329
+ form.submit()
330
+ )
331
+
332
+ icon.click ->
333
+ if field.val().length > 0
334
+ field.val('')
335
+ field.trigger('keydown')
336
+
337
+ $ ->
338
+ $('.<%= SmartListing.config.classes(:main) %>').smart_listing()
339
+ $('.<%= SmartListing.config.classes(:controls) %>').smart_listing_controls()
@@ -38,9 +38,13 @@ module SmartListing
38
38
  @smart_listing.collection
39
39
  end
40
40
 
41
+ def empty?
42
+ @smart_listing.count == 0
43
+ end
44
+
41
45
  def pagination_per_page_links options = {}
42
- container_classes = ["pagination_per_page"]
43
- container_classes << "hidden" if empty?
46
+ container_classes = [SmartListing.config.classes(:pagination_per_page)]
47
+ container_classes << SmartListing.config.classes(:hidden) if empty?
44
48
 
45
49
  per_page_sizes = @smart_listing.page_sizes.clone
46
50
  per_page_sizes.push(0) if @smart_listing.unlimited_per_page?
@@ -78,7 +82,7 @@ module SmartListing
78
82
  locals = {
79
83
  :ordered => @smart_listing.sort_attr == attribute && (!@smart_listing.sort_extra || @smart_listing.sort_extra == extra.to_s),
80
84
  :url => @template.url_for(sanitize_params(@template.params.merge(sort_params))),
81
- :container_classes => ["sortable"],
85
+ :container_classes => [SmartListing.config.classes(:sortable)],
82
86
  :attribute => attribute,
83
87
  :title => title
84
88
  }
@@ -113,15 +117,15 @@ module SmartListing
113
117
 
114
118
  # Add new item button & placeholder to list
115
119
  def item_new options = {}
116
- new_item_action_classes = %w{new_item_action}
117
- new_item_action_classes << "hidden" if !empty? && max_count?
118
- no_records_classes = %w{no_records}
119
- no_records_classes << "hidden" unless empty?
120
+ new_item_action_classes = [SmartListing.config.classes(:new_item_action)]
121
+ new_item_action_classes << SmartListing.config.classes(:hidden) if !empty? && max_count?
122
+ no_records_classes = [SmartListing.config.classes(:no_records)]
123
+ no_records_classes << SmartListing.config.classes(:hidden) unless empty?
120
124
  new_item_button_classes = []
121
- new_item_button_classes << "hidden" if max_count?
125
+ new_item_button_classes << SmartListing.config.classes(:hidden) if max_count?
122
126
 
123
127
  locals = {
124
- :placeholder_classes => %w{new_item_placeholder hidden},
128
+ :placeholder_classes => [SmartListing.config.classes(:new_item_placeholder), SmartListing.config.classes(:hidden)],
125
129
  :new_item_action_classes => new_item_action_classes,
126
130
  :colspan => options.delete(:colspan),
127
131
  :no_items_classes => no_records_classes,
@@ -168,17 +172,17 @@ module SmartListing
168
172
  output = ""
169
173
 
170
174
  data = {}
171
- data['max-count'] = @smart_listings[name].max_count if @smart_listings[name].max_count && @smart_listings[name].max_count > 0
172
- data['href'] = @smart_listings[name].href if @smart_listings[name].href
173
- data['callback_href'] = @smart_listings[name].callback_href if @smart_listings[name].callback_href
175
+ data[SmartListing.config.data_attributes(:max_count)] = @smart_listings[name].max_count if @smart_listings[name].max_count && @smart_listings[name].max_count > 0
176
+ data[SmartListing.config.data_attributes(:href)] = @smart_listings[name].href if @smart_listings[name].href
177
+ data[SmartListing.config.data_attributes(:callback_href)] = @smart_listings[name].callback_href if @smart_listings[name].callback_href
174
178
  data.merge!(options[:data]) if options[:data]
175
179
 
176
180
  if bare
177
181
  output = capture(builder, &block)
178
182
  else
179
- output = content_tag(:div, :class => "smart_listing", :id => name, :data => data) do
180
- concat(content_tag(:div, "", :class => "loading"))
181
- concat(content_tag(:div, :class => "content") do
183
+ output = content_tag(:div, :class => SmartListing.config.classes(:main), :id => name, :data => data) do
184
+ concat(content_tag(:div, "", :class => SmartListing.config.classes(:loading)))
185
+ concat(content_tag(:div, :class => SmartListing.config.classes(:content)) do
182
186
  concat(capture(builder, &block))
183
187
  end)
184
188
  end
@@ -202,6 +206,12 @@ module SmartListing
202
206
 
203
207
  action_name = action[:name].to_sym
204
208
  case action_name
209
+ when :show
210
+ locals = {
211
+ :url => action.delete(:url),
212
+ :icon => action.delete(:icon),
213
+ }
214
+ concat(render(:partial => 'smart_listing/action_show', :locals => locals))
205
215
  when :edit
206
216
  locals = {
207
217
  :url => action.delete(:url),
@@ -249,8 +259,8 @@ module SmartListing
249
259
  :part => smart_listing.partial,
250
260
  :smart_listing => builder,
251
261
  :smart_listing_data => {
252
- :params => smart_listing.all_params,
253
- 'max-count' => smart_listing.max_count,
262
+ SmartListing.config.data_attributes(:params) => smart_listing.all_params,
263
+ SmartListing.config.data_attributes(:max_count) => smart_listing.max_count,
254
264
  }
255
265
  })
256
266
  end
@@ -0,0 +1,9 @@
1
+ <%#
2
+ Show action.
3
+
4
+ Available local variables:
5
+ url
6
+ icon
7
+ -%>
8
+
9
+ <%= link_to(url, :class => "show", :title => t("smart_listing.actions.show") ) do %><%= content_tag(:i, '', :class => icon || "glyphicon glyphicon-share-alt") %><% end %>
@@ -5,6 +5,7 @@ en:
5
5
  actions:
6
6
  destroy: Destroy
7
7
  edit: Edit
8
+ show: Show
8
9
  views:
9
10
  pagination:
10
11
  per_page: Per page
data/lib/smart_listing.rb CHANGED
@@ -1,5 +1,7 @@
1
+ require 'smart_listing/config'
1
2
  require "smart_listing/engine"
2
3
  require "kaminari"
4
+
3
5
  module SmartListing
4
6
  class Base
5
7
  if Rails.env.development?
@@ -45,6 +47,7 @@ module SmartListing
45
47
  def setup params, cookies
46
48
  @page = params[param_names[:page]]
47
49
  @per_page = !params[param_names[:per_page]] || params[param_names[:per_page]].empty? ? (@options[:memorize_per_page] && cookies[param_names[:per_page]].to_i > 0 ? cookies[param_names[:per_page]].to_i : page_sizes.first) : params[param_names[:per_page]].to_i
50
+ @per_page = DEFAULT_PAGE_SIZES.first unless DEFAULT_PAGE_SIZES.include?(@per_page)
48
51
  @sort_attr = params[param_names[:sort_attr]] || @options[:default_sort_attr]
49
52
  @sort_order = ["asc", "desc"].include?(params[param_names[:sort_order]]) ? params[param_names[:sort_order]] : "desc"
50
53
  @sort_extra = params[param_names[:sort_extra]]
@@ -52,6 +55,7 @@ module SmartListing
52
55
  cookies[param_names[:per_page]] = @per_page if @options[:memorize_per_page]
53
56
 
54
57
  @count = @collection.size
58
+ @count = @count.length if @count.is_a?(Hash)
55
59
 
56
60
  # Reset @page if greater than total number of pages
57
61
  no_pages = (@count.to_f / @per_page.to_f).ceil.to_i
@@ -0,0 +1,90 @@
1
+ module SmartListing
2
+ def self.configure(&block)
3
+ yield @config ||= SmartListing::Configuration.new
4
+ end
5
+
6
+ def self.config
7
+ @config ||= SmartListing::Configuration.new
8
+ end
9
+
10
+ class Configuration
11
+ DEFAULTS = {
12
+ :constants => {
13
+ :classes => {
14
+ :main => "smart-listing",
15
+ :editable => "editable",
16
+ :content => "content",
17
+ :loading => "loading",
18
+ :status => "smart-listing-status",
19
+ :item_actions => "actions",
20
+ :new_item_placeholder => "new-item-placeholder",
21
+ :new_item_action => "new-item-action",
22
+ :new_item_button => "btn",
23
+ :hidden => "hidden",
24
+ :autoselect => "autoselect",
25
+ :callback => "callback",
26
+ :pagination_per_page => "pagination-per-page",
27
+ :pagination_count => "count",
28
+ :inline_editing => "info",
29
+ :no_records => "no-records",
30
+ :limit => "limit",
31
+ :limit_alert => "limit-alert",
32
+ :controls => "smart-listing-controls",
33
+ :controls_reset => "reset",
34
+ :filtering => "filter",
35
+ :filtering_search => "glyphicon-search",
36
+ :filtering_cancel => "glyphicon-remove",
37
+ :filtering_disabled => "disabled",
38
+ :sortable => "sortable",
39
+ },
40
+ :data_attributes => {
41
+ :main => "smart-listing",
42
+ :confirmation => "confirmation",
43
+ :id => "id",
44
+ :href => "href",
45
+ :callback_href => "callback-href",
46
+ :max_count => "max-count",
47
+ :inline_edit_backup => "smart-listing-edit-backup",
48
+ :params => "params",
49
+ :observed => "observed",
50
+ :href => "href",
51
+ },
52
+ :selectors => {
53
+ :item_action_destroy => "a.destroy",
54
+ :edit_cancel => "button.cancel",
55
+ :row => "tr",
56
+ :head => "thead",
57
+ :filtering_icon => "i"
58
+ }
59
+ }
60
+ }
61
+
62
+ def initialize
63
+ @options = DEFAULTS
64
+ end
65
+
66
+ def method_missing(sym, *args, &block)
67
+ @options[sym] = *args
68
+ end
69
+
70
+ def constants key, value = nil
71
+ if value == nil
72
+ @options[:constants][key]
73
+ else
74
+ @options[:constants][key].merge!(value)
75
+ end
76
+ end
77
+
78
+ def classes key
79
+ @options[:constants][:classes][key]
80
+ end
81
+
82
+ def data_attributes key
83
+ @options[:constants][:data_attributes][key]
84
+ end
85
+
86
+ def selectors key
87
+ @options[:constants][:selectors][key]
88
+ end
89
+ end
90
+ end
@@ -1,3 +1,3 @@
1
1
  module SmartListing
2
- VERSION = "0.9.4"
2
+ VERSION = "0.9.5"
3
3
  end
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: 0.9.4
4
+ version: 0.9.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sology
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-14 00:00:00.000000000 Z
11
+ date: 2014-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -78,6 +78,7 @@ files:
78
78
  - Rakefile
79
79
  - app/assets/javascripts/smart_listing/application.js
80
80
  - app/assets/javascripts/smart_listing/smart_listing.coffee
81
+ - app/assets/javascripts/smart_listing/smart_listing.coffee.erb
81
82
  - app/assets/stylesheets/smart_listing/application.css
82
83
  - app/helpers/smart_listing/application_helper.rb
83
84
  - app/helpers/smart_listing/helper.rb
@@ -85,6 +86,7 @@ files:
85
86
  - app/views/smart_listing/_action_delete.html.erb
86
87
  - app/views/smart_listing/_action_edit.html.erb
87
88
  - app/views/smart_listing/_action_inactive.html.erb
89
+ - app/views/smart_listing/_action_show.html.erb
88
90
  - app/views/smart_listing/_item_new.html.erb
89
91
  - app/views/smart_listing/_pagination_per_page_link.html.erb
90
92
  - app/views/smart_listing/_pagination_per_page_links.html.erb
@@ -100,6 +102,7 @@ files:
100
102
  - config/routes.rb
101
103
  - lib/generators/smart_listing/views_generator.rb
102
104
  - lib/smart_listing.rb
105
+ - lib/smart_listing/config.rb
103
106
  - lib/smart_listing/engine.rb
104
107
  - lib/smart_listing/version.rb
105
108
  - lib/tasks/smart_list_tasks.rake