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.
- checksums.yaml +4 -4
- data/.coffeescript-style.json +98 -0
- data/.hound.yml +16 -0
- data/.ruby-style.yml +239 -0
- data/.scss-style.yml +145 -0
- data/.travis.yml +2 -2
- data/README.md +10 -3
- data/app/assets/javascripts/chr/chr.coffee +4 -25
- data/app/assets/javascripts/chr/chr_router.coffee +2 -14
- data/app/assets/javascripts/chr/item.coffee +2 -19
- data/app/assets/javascripts/chr/list.coffee +6 -18
- data/app/assets/javascripts/chr/list_config.coffee +3 -10
- data/app/assets/javascripts/chr/list_pagination.coffee +1 -9
- data/app/assets/javascripts/chr/list_reorder.coffee +1 -8
- data/app/assets/javascripts/chr/list_search.coffee +2 -10
- data/app/assets/javascripts/chr/list_tabs.coffee +42 -0
- data/app/assets/javascripts/chr/module-categories.coffee +0 -2
- data/app/assets/javascripts/chr/module.coffee +1 -19
- data/app/assets/javascripts/chr/utils.coffee +0 -6
- data/app/assets/javascripts/chr/view.coffee +37 -36
- data/app/assets/javascripts/chr/view_tabs.coffee +19 -8
- data/app/assets/javascripts/stores/rest-array.coffee +23 -36
- data/app/assets/stylesheets/chr/layout.scss +17 -13
- data/app/assets/stylesheets/chr/themes/basic.scss +13 -13
- data/lib/chr/version.rb +1 -1
- data/templates/character_admin.coffee.erb +1 -1
- data/test/integration/article_fullsize_test.rb +5 -5
- data/test/integration/article_test.rb +2 -2
- data/test/integration/magazine_article_test.rb +5 -5
- data/test/integration/restricted_article_test.rb +3 -3
- data/test/integration/sport_article_test.rb +2 -2
- data/test/rails_app/.gitignore +15 -0
- data/test/rails_app/.ruby-version +1 -0
- data/test/rails_app/.sample.env +6 -0
- data/test/rails_app/Procfile +1 -0
- data/test/rails_app/README.md +45 -0
- data/test/rails_app/Rakefile +1 -1
- data/test/rails_app/app/assets/images/.keep +0 -0
- data/test/rails_app/app/assets/javascripts/admin.coffee +82 -102
- data/test/rails_app/app/assets/javascripts/application.coffee +2 -0
- data/test/rails_app/app/assets/stylesheets/admin.scss +4 -1
- data/test/rails_app/app/assets/stylesheets/application.scss +1 -0
- data/test/rails_app/app/controllers/admin/base_controller.rb +5 -0
- data/test/rails_app/app/controllers/admin/devise_overrides/passwords_controller.rb +9 -0
- data/test/rails_app/app/controllers/admin/devise_overrides/sessions_controller.rb +11 -0
- data/test/rails_app/app/controllers/concerns/.keep +0 -0
- data/test/rails_app/app/helpers/body_class_helper.rb +15 -0
- data/test/rails_app/app/mailers/.keep +0 -0
- data/test/rails_app/app/models/.keep +0 -0
- data/test/rails_app/app/models/article.rb +0 -4
- data/test/rails_app/app/models/concerns/.keep +0 -0
- data/test/rails_app/app/uploaders/article_image_uploader.rb +0 -4
- data/test/rails_app/app/views/admin/devise_overrides/passwords/edit.html.erb +31 -0
- data/test/rails_app/app/views/admin/devise_overrides/passwords/new.html.erb +19 -0
- data/test/rails_app/app/views/admin/devise_overrides/sessions/new.html.erb +29 -0
- data/test/rails_app/app/views/admin/index.html.erb +1 -3
- data/test/rails_app/app/views/application/_analytics.html.erb +9 -0
- data/test/rails_app/app/views/application/_flashes.html.erb +7 -0
- data/test/rails_app/app/views/application/_javascript.html.erb +12 -0
- data/test/rails_app/app/views/layouts/admin.html.erb +13 -11
- data/test/rails_app/app/views/layouts/application.html.erb +22 -7
- data/test/rails_app/bin/rails +3 -2
- data/test/rails_app/bin/rake +3 -2
- data/test/rails_app/bin/setup +28 -22
- data/test/rails_app/bin/spring +6 -6
- data/test/rails_app/config/application.rb +12 -1
- data/test/rails_app/config/boot.rb +1 -2
- data/test/rails_app/config/environments/development.rb +2 -0
- data/test/rails_app/config/environments/production.rb +16 -1
- data/test/rails_app/config/environments/staging.rb +9 -0
- data/test/rails_app/config/environments/test.rb +1 -3
- data/test/rails_app/config/initializers/assets.rb +2 -3
- data/test/rails_app/config/initializers/carrierwave.rb +23 -4
- data/test/rails_app/config/initializers/devise.rb +265 -0
- data/test/rails_app/config/initializers/errors.rb +34 -0
- data/test/rails_app/config/initializers/json_encoding.rb +1 -0
- data/test/rails_app/config/locales/devise.en.yml +62 -0
- data/test/rails_app/config/mongoid.yml +131 -8
- data/test/rails_app/config/newrelic.yml +34 -0
- data/test/rails_app/config/puma.rb +18 -0
- data/test/rails_app/config/routes.rb +86 -0
- data/test/rails_app/config/secrets.yml +8 -16
- data/test/rails_app/config/smtp.rb +9 -0
- data/test/rails_app/lib/assets/.keep +0 -0
- data/test/rails_app/lib/tasks/.keep +0 -0
- data/test/rails_app/lib/tasks/bundler_audit.rake +12 -0
- data/test/rails_app/lib/tasks/dev.rake +12 -0
- data/test/rails_app/public/404.html +4 -2
- data/test/rails_app/public/422.html +4 -2
- data/test/rails_app/public/500.html +4 -2
- data/test/rails_app/vendor/assets/javascripts/.keep +0 -0
- data/test/rails_app/vendor/assets/stylesheets/.keep +0 -0
- data/test/support/character_front_end.rb +10 -9
- data/test/support/chr/list_pagination.rb +8 -8
- data/test/support/chr/list_reorder.rb +4 -1
- data/test/support/chr/view.rb +4 -3
- data/test/support/stores/rest-array.rb +3 -3
- data/test/test_helper.rb +13 -7
- metadata +77 -6
- data/test/rails_app/app/assets/javascripts/application.js +0 -1
- 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
|
-
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
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
|
-
#
|
|
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(
|
|
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) =>
|
|
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) =>
|
|
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
|
|
27
|
+
@dataFetchLock = false
|
|
34
28
|
@lastPageLoaded = false
|
|
35
29
|
|
|
36
|
-
@searchable
|
|
37
|
-
@searchQuery
|
|
30
|
+
@searchable = @config.searchable ? false
|
|
31
|
+
@searchQuery = ''
|
|
32
|
+
@filterParams = {}
|
|
38
33
|
|
|
39
|
-
@pagination
|
|
40
|
-
@nextPage
|
|
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]
|
|
142
|
+
params[@requestParams.page] = @nextPage
|
|
158
143
|
params[@requestParams.perPage] = @objectsPerPage
|
|
159
144
|
|
|
160
145
|
if @searchable && @searchQuery.length > 0
|
|
161
|
-
params[@requestParams.search]
|
|
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
|
|
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
|
-
|