chr 0.5.1 → 0.5.3

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.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/.coffeescript-style.json +98 -0
  3. data/.hound.yml +16 -0
  4. data/.ruby-style.yml +239 -0
  5. data/.scss-style.yml +145 -0
  6. data/.travis.yml +2 -2
  7. data/README.md +10 -3
  8. data/app/assets/javascripts/chr/chr.coffee +4 -25
  9. data/app/assets/javascripts/chr/chr_router.coffee +2 -14
  10. data/app/assets/javascripts/chr/item.coffee +2 -19
  11. data/app/assets/javascripts/chr/list.coffee +6 -18
  12. data/app/assets/javascripts/chr/list_config.coffee +3 -10
  13. data/app/assets/javascripts/chr/list_pagination.coffee +1 -9
  14. data/app/assets/javascripts/chr/list_reorder.coffee +1 -8
  15. data/app/assets/javascripts/chr/list_search.coffee +2 -10
  16. data/app/assets/javascripts/chr/list_tabs.coffee +42 -0
  17. data/app/assets/javascripts/chr/module-categories.coffee +0 -2
  18. data/app/assets/javascripts/chr/module.coffee +1 -19
  19. data/app/assets/javascripts/chr/utils.coffee +0 -6
  20. data/app/assets/javascripts/chr/view.coffee +37 -36
  21. data/app/assets/javascripts/chr/view_tabs.coffee +19 -8
  22. data/app/assets/javascripts/stores/rest-array.coffee +23 -36
  23. data/app/assets/stylesheets/chr/layout.scss +17 -13
  24. data/app/assets/stylesheets/chr/themes/basic.scss +13 -13
  25. data/lib/chr/version.rb +1 -1
  26. data/templates/character_admin.coffee.erb +1 -1
  27. data/test/integration/article_fullsize_test.rb +5 -5
  28. data/test/integration/article_test.rb +2 -2
  29. data/test/integration/magazine_article_test.rb +5 -5
  30. data/test/integration/restricted_article_test.rb +3 -3
  31. data/test/integration/sport_article_test.rb +2 -2
  32. data/test/rails_app/.gitignore +15 -0
  33. data/test/rails_app/.ruby-version +1 -0
  34. data/test/rails_app/.sample.env +6 -0
  35. data/test/rails_app/Procfile +1 -0
  36. data/test/rails_app/README.md +45 -0
  37. data/test/rails_app/Rakefile +1 -1
  38. data/test/rails_app/app/assets/images/.keep +0 -0
  39. data/test/rails_app/app/assets/javascripts/admin.coffee +82 -102
  40. data/test/rails_app/app/assets/javascripts/application.coffee +2 -0
  41. data/test/rails_app/app/assets/stylesheets/admin.scss +4 -1
  42. data/test/rails_app/app/assets/stylesheets/application.scss +1 -0
  43. data/test/rails_app/app/controllers/admin/base_controller.rb +5 -0
  44. data/test/rails_app/app/controllers/admin/devise_overrides/passwords_controller.rb +9 -0
  45. data/test/rails_app/app/controllers/admin/devise_overrides/sessions_controller.rb +11 -0
  46. data/test/rails_app/app/controllers/concerns/.keep +0 -0
  47. data/test/rails_app/app/helpers/body_class_helper.rb +15 -0
  48. data/test/rails_app/app/mailers/.keep +0 -0
  49. data/test/rails_app/app/models/.keep +0 -0
  50. data/test/rails_app/app/models/article.rb +0 -4
  51. data/test/rails_app/app/models/concerns/.keep +0 -0
  52. data/test/rails_app/app/uploaders/article_image_uploader.rb +0 -4
  53. data/test/rails_app/app/views/admin/devise_overrides/passwords/edit.html.erb +31 -0
  54. data/test/rails_app/app/views/admin/devise_overrides/passwords/new.html.erb +19 -0
  55. data/test/rails_app/app/views/admin/devise_overrides/sessions/new.html.erb +29 -0
  56. data/test/rails_app/app/views/admin/index.html.erb +1 -3
  57. data/test/rails_app/app/views/application/_analytics.html.erb +9 -0
  58. data/test/rails_app/app/views/application/_flashes.html.erb +7 -0
  59. data/test/rails_app/app/views/application/_javascript.html.erb +12 -0
  60. data/test/rails_app/app/views/layouts/admin.html.erb +13 -11
  61. data/test/rails_app/app/views/layouts/application.html.erb +22 -7
  62. data/test/rails_app/bin/rails +3 -2
  63. data/test/rails_app/bin/rake +3 -2
  64. data/test/rails_app/bin/setup +28 -22
  65. data/test/rails_app/bin/spring +6 -6
  66. data/test/rails_app/config/application.rb +12 -1
  67. data/test/rails_app/config/boot.rb +1 -2
  68. data/test/rails_app/config/environments/development.rb +2 -0
  69. data/test/rails_app/config/environments/production.rb +16 -1
  70. data/test/rails_app/config/environments/staging.rb +9 -0
  71. data/test/rails_app/config/environments/test.rb +1 -3
  72. data/test/rails_app/config/initializers/assets.rb +2 -3
  73. data/test/rails_app/config/initializers/carrierwave.rb +23 -4
  74. data/test/rails_app/config/initializers/devise.rb +265 -0
  75. data/test/rails_app/config/initializers/errors.rb +34 -0
  76. data/test/rails_app/config/initializers/json_encoding.rb +1 -0
  77. data/test/rails_app/config/locales/devise.en.yml +62 -0
  78. data/test/rails_app/config/mongoid.yml +131 -8
  79. data/test/rails_app/config/newrelic.yml +34 -0
  80. data/test/rails_app/config/puma.rb +18 -0
  81. data/test/rails_app/config/routes.rb +86 -0
  82. data/test/rails_app/config/secrets.yml +8 -16
  83. data/test/rails_app/config/smtp.rb +9 -0
  84. data/test/rails_app/lib/assets/.keep +0 -0
  85. data/test/rails_app/lib/tasks/.keep +0 -0
  86. data/test/rails_app/lib/tasks/bundler_audit.rake +12 -0
  87. data/test/rails_app/lib/tasks/dev.rake +12 -0
  88. data/test/rails_app/public/404.html +4 -2
  89. data/test/rails_app/public/422.html +4 -2
  90. data/test/rails_app/public/500.html +4 -2
  91. data/test/rails_app/vendor/assets/javascripts/.keep +0 -0
  92. data/test/rails_app/vendor/assets/stylesheets/.keep +0 -0
  93. data/test/support/character_front_end.rb +10 -9
  94. data/test/support/chr/list_pagination.rb +8 -8
  95. data/test/support/chr/list_reorder.rb +4 -1
  96. data/test/support/chr/view.rb +4 -3
  97. data/test/support/stores/rest-array.rb +3 -3
  98. data/test/test_helper.rb +13 -7
  99. metadata +77 -6
  100. data/test/rails_app/app/assets/javascripts/application.js +0 -1
  101. data/test/rails_app/app/assets/stylesheets/application.css +0 -1
@@ -1,10 +1,9 @@
1
1
  # -----------------------------------------------------------------------------
2
2
  # LIST SEARCH
3
3
  # -----------------------------------------------------------------------------
4
-
5
4
  @listSearch =
6
5
 
7
- # PRIVATE ===============================================
6
+ # PRIVATE ===================================================================
8
7
 
9
8
  _bind_search: ->
10
9
  @$search =$ "<div class='search'></div>"
@@ -27,27 +26,20 @@
27
26
  @$searchIcon.on 'click', (e) => e.preventDefault() ; @_on_search_show()
28
27
  @$searchCancel.on 'click', (e) => e.preventDefault() ; @_on_search_cancel()
29
28
 
30
-
31
- # EVENTS ================================================
29
+ # EVENTS ====================================================================
32
30
 
33
31
  _on_search: ->
34
32
  query = @$searchInput.val()
35
33
  @showSpinner()
36
34
  @config.arrayStore.search(query)
37
35
 
38
-
39
36
  _on_search_show: ->
40
37
  @$el.addClass('list-search')
41
38
  @$searchInput.focus()
42
39
  @$search.show()
43
40
 
44
-
45
41
  _on_search_cancel: ->
46
42
  @$el.removeClass('list-search')
47
43
  @$searchInput.val('')
48
44
  @showSpinner()
49
45
  @config.arrayStore.reset()
50
-
51
-
52
-
53
-
@@ -0,0 +1,42 @@
1
+ # -----------------------------------------------------------------------------
2
+ # LIST TABS
3
+ # -----------------------------------------------------------------------------
4
+ @listTabs =
5
+
6
+ # PRIVATE ===================================================================
7
+
8
+ _bind_tabs: ->
9
+ @$title.addClass "title-with-tabs"
10
+ @$tabs =$ "<aside class='header-tabs'>"
11
+ @$title.after @$tabs
12
+ @tabLinks = []
13
+
14
+ for title, urlParams of @config.listTabs
15
+ @_add_tab(title, urlParams)
16
+
17
+ $firstTab = @tabLinks[0]
18
+ @selectTab($firstTab, false)
19
+
20
+ _add_tab: (title, urlParams) ->
21
+ $tab =$ "<a href='#'>#{title}</a>"
22
+ @$tabs.append $tab
23
+ @tabLinks.push $tab
24
+
25
+ $tab.on "click", (e) =>
26
+ e.preventDefault()
27
+ $tab =$ e.currentTarget
28
+ @selectTab($tab, true)
29
+
30
+ # PUBLIC ====================================================================
31
+
32
+ selectTab: ($tab, resetList) ->
33
+ @$tabs.children().removeClass "active"
34
+ $tab.addClass "active"
35
+ tabName = $tab.html()
36
+ params = @config.listTabs[tabName]
37
+
38
+ if resetList
39
+ @showSpinner()
40
+ @config.arrayStore.filter(params)
41
+ else
42
+ @config.arrayStore.filterParams = params
@@ -1,8 +1,6 @@
1
1
  # ------------------------------------------------------------------------------
2
2
  # Author: Alexander Kravets <alex@slatestudio.com>,
3
3
  # Slate Studio (http://www.slatestudio.com)
4
- # ------------------------------------------------------------------------------
5
-
6
4
  # ------------------------------------------------------------------------------
7
5
  # MODULE CATEGORIES
8
6
  # ------------------------------------------------------------------------------
@@ -1,11 +1,6 @@
1
1
  # -----------------------------------------------------------------------------
2
2
  # Author: Alexander Kravets <alex@slatestudio.com>,
3
3
  # Slate Studio (http://www.slatestudio.com)
4
- #
5
- # Coding Guide:
6
- # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
7
- # -----------------------------------------------------------------------------
8
-
9
4
  # -----------------------------------------------------------------------------
10
5
  # MODULE
11
6
  # -----------------------------------------------------------------------------
@@ -24,7 +19,6 @@
24
19
  # destroyView ()
25
20
  # show ()
26
21
  # hide ()
27
- #
28
22
  # -----------------------------------------------------------------------------
29
23
  class @Module
30
24
  constructor: (@chr, @name, @config) ->
@@ -41,18 +35,15 @@ class @Module
41
35
  @menuTitle ?= @name.titleize()
42
36
  @menuIcon = @config.menuIcon
43
37
 
44
-
45
- # PUBLIC ================================================
38
+ # PUBLIC ====================================================================
46
39
 
47
40
  onModuleInit: ->
48
41
  @config.onModuleInit?(this)
49
42
 
50
-
51
43
  addNestedList: (name, config, parentList) ->
52
44
  path = [ parentList.path, name ].join('/')
53
45
  @nestedLists[name] = new List(this, path, name, config, parentList)
54
46
 
55
-
56
47
  showList: (name) ->
57
48
  if ! name # show root list, hide all nested
58
49
  list.hide() for key, list of @nestedLists
@@ -62,28 +53,19 @@ class @Module
62
53
 
63
54
  @activeList.show()
64
55
 
65
-
66
56
  showView: (objectId, config) ->
67
57
  @view = new View(this, config, @activeList.path, @activeList.name)
68
58
  @$el.append(@view.$el)
69
59
  @view.show(objectId)
70
60
 
71
-
72
61
  show: ->
73
62
  @$el.show()
74
63
  @showList()
75
64
 
76
-
77
65
  hide: ->
78
66
  @destroyView()
79
67
  @$el.hide()
80
68
 
81
-
82
69
  destroyView: ->
83
70
  @view?.destroy()
84
71
  @view = null
85
-
86
-
87
-
88
-
89
-
@@ -1,11 +1,6 @@
1
1
  # -----------------------------------------------------------------------------
2
2
  # Author: Alexander Kravets <alex@slatestudio.com>,
3
3
  # Slate Studio (http://www.slatestudio.com)
4
- #
5
- # Coding Guide:
6
- # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
7
- # -----------------------------------------------------------------------------
8
-
9
4
  # -----------------------------------------------------------------------------
10
5
  # UTILS
11
6
  # -----------------------------------------------------------------------------
@@ -59,7 +54,6 @@ if typeof String.prototype.endsWith != 'function'
59
54
  if typeof String.prototype.plainText != 'function'
60
55
  String.prototype.plainText = () -> return $("<div>#{ this }</div>").text()
61
56
 
62
-
63
57
  # -----------------------------------------------------------------------------
64
58
  # Mixins: http://arcturo.github.io/library/coffeescript/03_classes.html
65
59
  # -----------------------------------------------------------------------------
@@ -1,26 +1,26 @@
1
1
  # -----------------------------------------------------------------------------
2
2
  # Author: Alexander Kravets <alex@slatestudio.com>,
3
3
  # Slate Studio (http://www.slatestudio.com)
4
- #
5
- # Coding Guide:
6
- # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
7
- # -----------------------------------------------------------------------------
8
-
9
4
  # -----------------------------------------------------------------------------
10
5
  # VIEW
11
6
  # -----------------------------------------------------------------------------
7
+ # Options:
8
+ # formClass - custom form class to be used
9
+ # formSchema - form schema for object, autogenerated if missing
10
+ # disableDelete - do not add delete button below the form
11
+ # disableSave - do not add save button in header
12
+ # fullsizeView — use fullsize layout in desktop mode
13
+ # defaultNewObject - used to generate new form
14
+ # viewTabs - hash with group input names and titles
12
15
  #
13
- # Config options:
14
- # formClass - custom form class to be used
15
- # formSchema - form schema for object, autogenerated if missing
16
- # disableDelete - do not add delete button below the form
17
- # disableSave - do not add save button in header
18
- # fullsizeView — use fullsize layout in desktop mode
19
- # onViewShow - on show callback
20
- # onSaveSuccess - on document succesfully saved callback
21
- # defaultNewObject - used to generate new form
16
+ # Callbacks:
17
+ # onViewShow - on show callback
18
+ # onNewShow - on new object view show callback
19
+ # onEditShow - on edit object view show callback
20
+ # onSaveSuccess - on document succesfully saved callback
21
+ # onSaveError - on document save error callback
22
22
  #
23
- # Public methods:
23
+ # Methods:
24
24
  # show(objectId)
25
25
  # destroy()
26
26
  # showSpinner()
@@ -28,7 +28,6 @@
28
28
  #
29
29
  # Dependencies:
30
30
  #= require ./view_tabs
31
- #
32
31
  # -----------------------------------------------------------------------------
33
32
  class @View
34
33
  constructor: (@module, @config, @closePath, @listName) ->
@@ -57,8 +56,7 @@ class @View
57
56
  @$content =$ "<div class='content'></div>"
58
57
  @$el.append @$content
59
58
 
60
-
61
- # PRIVATE ===============================================
59
+ # PRIVATE ===================================================================
62
60
 
63
61
  _set_title: ->
64
62
  if ! @object
@@ -76,30 +74,31 @@ class @View
76
74
 
77
75
  @$title.html(title.plainText())
78
76
 
79
-
80
77
  _add_delete_button: ->
81
78
  unless @config.disableDelete or @config.objectStore or (! @object)
82
79
  @$deleteBtn =$ "<a href='#' class='view-delete'>Delete</a>"
83
80
  @$deleteBtn.on 'click', (e) => @_delete(e)
84
81
  @$content.append @$deleteBtn
85
82
 
86
-
87
83
  _save_success: ->
88
- @$el.removeClass('view-saving')
84
+ @$el.removeClass("view-new")
85
+ @$el.addClass("view-edit")
86
+ @$el.removeClass("view-saving")
87
+
89
88
  @_set_title()
90
89
  @form.hideValidationErrors()
91
90
  @form.updateValues(@object)
92
91
 
93
92
  @config.onSaveSuccess?(@)
94
93
 
95
-
96
94
  _save_error: (message, validationErrors) ->
97
95
  @$el.removeClass('view-saving')
98
96
  @form.showValidationErrors(validationErrors)
99
97
  chr.showError(message)
100
98
 
99
+ @config.onSaveError?(@, validationErrors)
101
100
 
102
- # EVENTS ================================================
101
+ # EVENTS ====================================================================
103
102
 
104
103
  _save: (e) ->
105
104
  e.preventDefault()
@@ -111,7 +110,8 @@ class @View
111
110
  @store.update @object._id, serializedFormObj,
112
111
  onSuccess: (@object) =>
113
112
  @_save_success()
114
- onError: (errors) => @_save_error('Changes are not saved.', errors)
113
+ onError: (errors) =>
114
+ @_save_error('Changes are not saved.', errors)
115
115
  else
116
116
  @store.push serializedFormObj,
117
117
  onSuccess: (@object) =>
@@ -120,8 +120,8 @@ class @View
120
120
  chr.updateHash("#{ @closePath }/view/#{ @object._id }", true)
121
121
  @path = window.location.hash
122
122
  @config.onViewShow?(@)
123
- onError: (errors) => @_save_error('Document is not created due to an error.', errors)
124
-
123
+ onError: (errors) =>
124
+ @_save_error('Document is not created due to an error.', errors)
125
125
 
126
126
  _delete: (e) ->
127
127
  e.preventDefault()
@@ -133,8 +133,7 @@ class @View
133
133
  chr.mobileListLock(false)
134
134
  onError: -> chr.showError('Can\'t delete document.')
135
135
 
136
-
137
- _render_form: ->
136
+ _render_form: (newObject=false) ->
138
137
  @_set_title()
139
138
 
140
139
  @hideSpinner()
@@ -154,30 +153,32 @@ class @View
154
153
  @_add_delete_button()
155
154
  if @config.viewTabs
156
155
  @_build_tabs()
157
- @config.onViewShow?(@)
158
156
 
157
+ if newObject
158
+ @$el.addClass("view-new")
159
+ @config.onNewShow?(@)
160
+ else
161
+ @$el.addClass("view-edit")
162
+ @config.onEditShow?(@)
163
+
164
+ @config.onViewShow?(@)
159
165
 
160
166
  _show_error: ->
161
167
  @hideSpinner()
162
168
  chr.showError("can\'t show view for requested object, application error 500")
163
169
 
164
-
165
- # PUBLIC ================================================
166
-
170
+ # PUBLIC ====================================================================
167
171
 
168
172
  showSpinner: ->
169
173
  @$el.addClass('show-spinner')
170
174
 
171
-
172
175
  hideSpinner: ->
173
176
  @$el.removeClass('show-spinner')
174
177
 
175
-
176
178
  destroy: ->
177
179
  @form?.destroy()
178
180
  @$el.remove()
179
181
 
180
-
181
182
  show: (objectId) ->
182
183
  callbacks =
183
184
  onSuccess: (@object) => @_render_form()
@@ -188,7 +189,7 @@ class @View
188
189
  # new for array store
189
190
  if objectId == null
190
191
  @object = null
191
- @_render_form()
192
+ @_render_form(true)
192
193
 
193
194
  # object store
194
195
  else if objectId == ''
@@ -1,18 +1,32 @@
1
1
  # -----------------------------------------------------------------------------
2
+ # Author: Alexander Kravets <alex@slatestudio.com>,
3
+ # Slate Studio (http://www.slatestudio.com)
4
+ # -----------------------------------------------------------------------------
2
5
  # VIEW TABS
3
6
  # -----------------------------------------------------------------------------
4
-
7
+ # Example:
8
+ #
9
+ # viewTabs:
10
+ # editor: 'Page'
11
+ # settings: 'Options'
12
+ # formSchema:
13
+ # editor:
14
+ # type: 'group'
15
+ # inputs:
16
+ # ...
17
+ # settings:
18
+ # type: 'group'
19
+ # inputs:
20
+ # ...
21
+ # -----------------------------------------------------------------------------
5
22
  @viewTabs =
6
-
7
- # PRIVATE ===============================================
8
-
23
+ # PRIVATE ===================================================================
9
24
  _build_tabs: ->
10
25
  @$title.addClass 'title-with-tabs'
11
26
 
12
27
  @_create_tabs()
13
28
  @_activate_tab(0)
14
29
 
15
-
16
30
  _create_tabs: ->
17
31
  @tabGroups = []
18
32
  groupsHash = {}
@@ -27,7 +41,6 @@
27
41
  @tabGroups.push(groupsHash[tab_id])
28
42
  @$tabs.append(@_create_button(tab_title))
29
43
 
30
-
31
44
  _create_button: (name) ->
32
45
  $tabButton =$ "<a href='#'>#{ name }</a>"
33
46
  $tabButton.on 'click', (e) =>
@@ -35,12 +48,10 @@
35
48
  e.preventDefault()
36
49
  return $tabButton
37
50
 
38
-
39
51
  _on_tab_click: ($link) ->
40
52
  index = @$tabs.children().index($link)
41
53
  @_activate_tab(index)
42
54
 
43
-
44
55
  _activate_tab: (index) ->
45
56
  @$tabs.children().removeClass('active')
46
57
  @$tabs.find(":nth-child(#{ index + 1 })").addClass('active')
@@ -1,15 +1,9 @@
1
1
  # -----------------------------------------------------------------------------
2
2
  # Author: Alexander Kravets <alex@slatestudio.com>,
3
3
  # Slate Studio (http://www.slatestudio.com)
4
- #
5
- # Coding Guide:
6
- # https://github.com/thoughtbot/guides/tree/master/style/coffeescript
7
- # -----------------------------------------------------------------------------
8
-
9
4
  # -----------------------------------------------------------------------------
10
5
  # REST ARRAY STORE
11
6
  # -----------------------------------------------------------------------------
12
- #
13
7
  # Config options:
14
8
  # pagination - enable pagination for resource index, default `true`
15
9
  # searchable - enable resource search, default `false`
@@ -23,21 +17,22 @@
23
17
  # push
24
18
  # update
25
19
  # remove
26
- #
20
+ # filter
27
21
  # -----------------------------------------------------------------------------
28
22
  class @RestArrayStore extends ArrayStore
29
23
 
30
- # PRIVATE ===============================================
24
+ # PRIVATE ===================================================================
31
25
 
32
26
  _initialize_store: ->
33
- @dataFetchLock = false
27
+ @dataFetchLock = false
34
28
  @lastPageLoaded = false
35
29
 
36
- @searchable = @config.searchable ? false
37
- @searchQuery = ''
30
+ @searchable = @config.searchable ? false
31
+ @searchQuery = ''
32
+ @filterParams = {}
38
33
 
39
- @pagination = @config.pagination ? true
40
- @nextPage = 1
34
+ @pagination = @config.pagination ? true
35
+ @nextPage = 1
41
36
  @objectsPerPage = chr.itemsPerPageRequest ? 20
42
37
 
43
38
  @requestParams ?=
@@ -47,17 +42,14 @@ class @RestArrayStore extends ArrayStore
47
42
 
48
43
  @_configure_store()
49
44
 
50
-
51
45
  _configure_store: ->
52
46
  @ajaxConfig = {}
53
47
 
54
-
55
48
  # generate rest url for resource
56
49
  _resource_url: (type, id) ->
57
50
  objectPath = if id then "/#{ id }" else ''
58
51
  "#{ @config.path }#{ objectPath }"
59
52
 
60
-
61
53
  _request_url: (type, id) ->
62
54
  url = @_resource_url(type, id)
63
55
 
@@ -67,7 +59,6 @@ class @RestArrayStore extends ArrayStore
67
59
 
68
60
  return url
69
61
 
70
-
71
62
  # do requests to database api
72
63
  _ajax: (type, id, data, success, error) ->
73
64
  options = $.extend @ajaxConfig,
@@ -84,7 +75,6 @@ class @RestArrayStore extends ArrayStore
84
75
  @dataFetchLock = true
85
76
  $.ajax options
86
77
 
87
-
88
78
  # check how this works with sorting enabled
89
79
  _sync_with_data_objects: (objects) ->
90
80
  if objects.length == 0 then return @_reset_data()
@@ -109,7 +99,6 @@ class @RestArrayStore extends ArrayStore
109
99
  for id in updateDataObjectIds
110
100
  @_update_data_object(id, objectsMap[id])
111
101
 
112
-
113
102
  # update next page counter and check if the last page was loaded
114
103
  _update_next_page: (data) ->
115
104
  if @pagination
@@ -123,17 +112,14 @@ class @RestArrayStore extends ArrayStore
123
112
  else
124
113
  @lastPageLoaded = true
125
114
 
126
-
127
115
  _is_pagination_edge_case: ->
128
116
  ( @pagination && @lastPageLoaded == false )
129
117
 
130
-
131
118
  _reload_current_page: (callbacks) ->
132
119
  @nextPage -= 1
133
120
  @load(true, callbacks)
134
121
 
135
-
136
- # PUBLIC ================================================
122
+ # PUBLIC ====================================================================
137
123
 
138
124
  # load a single object
139
125
  loadObject: (id, callbacks={}) ->
@@ -145,7 +131,6 @@ class @RestArrayStore extends ArrayStore
145
131
  callbacks.onSuccess(object)
146
132
  ), callbacks.onError
147
133
 
148
-
149
134
  # load next page objects from database and trigger 'objects_added' event
150
135
  load: (sync=false, callbacks={}) ->
151
136
  callbacks.onSuccess ?= $.noop
@@ -154,11 +139,15 @@ class @RestArrayStore extends ArrayStore
154
139
  params = {}
155
140
 
156
141
  if @pagination
157
- params[@requestParams.page] = @nextPage
142
+ params[@requestParams.page] = @nextPage
158
143
  params[@requestParams.perPage] = @objectsPerPage
159
144
 
160
145
  if @searchable && @searchQuery.length > 0
161
- params[@requestParams.search] = @searchQuery
146
+ params[@requestParams.search] = @searchQuery
147
+
148
+ else
149
+ # apply filter params if there is no search query
150
+ $.extend(params, @filterParams)
162
151
 
163
152
  params = $.param(params)
164
153
 
@@ -175,18 +164,22 @@ class @RestArrayStore extends ArrayStore
175
164
  $(this).trigger('objects_added', { objects: data })
176
165
  ), -> chr.showError('Error while loading data, application error 500.')
177
166
 
167
+ # reset data and load again first page, this method is used by filters and
168
+ # search. when search is canceled it should keep previously set filter params
169
+ reset: (@searchQuery='', filterParams) ->
170
+ if filterParams
171
+ @filterParams = filterParams
178
172
 
179
- # reset data and load again first page
180
- reset: (@searchQuery='') ->
181
173
  @lastPageLoaded = false
182
- @nextPage = 1
174
+ @nextPage = 1
183
175
  @load(true)
184
176
 
185
-
186
177
  # load search results first page
187
178
  search: (searchQuery) ->
188
179
  @reset(searchQuery)
189
180
 
181
+ filter: (filterParams) ->
182
+ @reset('', filterParams)
190
183
 
191
184
  # add new object
192
185
  push: (serializedFormObject, callbacks={}) ->
@@ -207,7 +200,6 @@ class @RestArrayStore extends ArrayStore
207
200
 
208
201
  ), callbacks.onError
209
202
 
210
-
211
203
  # update objects attributes
212
204
  update: (id, serializedFormObject, callbacks={}) ->
213
205
  callbacks.onSuccess ?= $.noop
@@ -232,7 +224,6 @@ class @RestArrayStore extends ArrayStore
232
224
 
233
225
  ), callbacks.onError
234
226
 
235
-
236
227
  # delete object
237
228
  remove: (id, callbacks={}) ->
238
229
  callbacks.onSuccess ?= $.noop
@@ -249,7 +240,3 @@ class @RestArrayStore extends ArrayStore
249
240
  callbacks.onSuccess()
250
241
 
251
242
  ), callbacks.onError
252
-
253
-
254
-
255
-