chr 0.5.1 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
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
-