chr 0.2.1 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/Gruntfile.coffee +50 -16
  4. data/app/assets/javascripts/chr.coffee +9 -16
  5. data/app/assets/javascripts/chr/core/chr.coffee +38 -20
  6. data/app/assets/javascripts/chr/core/item.coffee +30 -24
  7. data/app/assets/javascripts/chr/core/list.coffee +30 -60
  8. data/app/assets/javascripts/chr/core/list_config.coffee +65 -0
  9. data/app/assets/javascripts/chr/core/list_pagination.coffee +27 -0
  10. data/app/assets/javascripts/chr/core/list_reorder.coffee +75 -0
  11. data/app/assets/javascripts/chr/core/list_search.coffee +41 -0
  12. data/app/assets/javascripts/chr/core/module.coffee +55 -32
  13. data/app/assets/javascripts/chr/core/utils.coffee +34 -13
  14. data/app/assets/javascripts/chr/core/view.coffee +70 -97
  15. data/app/assets/javascripts/chr/form/form.coffee +63 -49
  16. data/app/assets/javascripts/chr/form/input-checkbox.coffee +40 -27
  17. data/app/assets/javascripts/chr/form/input-color.coffee +26 -8
  18. data/app/assets/javascripts/chr/form/input-date.coffee +0 -0
  19. data/app/assets/javascripts/chr/form/input-file.coffee +81 -46
  20. data/app/assets/javascripts/chr/form/input-form.coffee +162 -0
  21. data/app/assets/javascripts/chr/form/input-form_reorder.coffee +67 -0
  22. data/app/assets/javascripts/chr/form/input-hidden.coffee +27 -11
  23. data/app/assets/javascripts/chr/form/input-list.coffee +60 -56
  24. data/app/assets/javascripts/chr/form/input-list_reorder.coffee +37 -0
  25. data/app/assets/javascripts/chr/form/input-password.coffee +31 -0
  26. data/app/assets/javascripts/chr/form/input-select.coffee +61 -35
  27. data/app/assets/javascripts/chr/form/input-string.coffee +55 -25
  28. data/app/assets/javascripts/chr/form/input-text.coffee +22 -5
  29. data/app/assets/javascripts/chr/store/mongosteen-array-store.coffee +1 -1
  30. data/app/assets/javascripts/chr/vendor/ace.js +18280 -0
  31. data/app/assets/javascripts/chr/vendor/marked.js +1272 -0
  32. data/app/assets/javascripts/chr/vendor/mode-html.js +2436 -0
  33. data/app/assets/javascripts/chr/vendor/mode-markdown.js +2820 -0
  34. data/app/assets/javascripts/chr/vendor/redactor.fixedtoolbar.js +110 -0
  35. data/app/assets/javascripts/input-html.coffee +78 -0
  36. data/app/assets/javascripts/input-markdown.coffee +88 -0
  37. data/app/assets/javascripts/input-redactor.coffee +66 -0
  38. data/app/assets/stylesheets/_chr.scss +6 -6
  39. data/app/assets/stylesheets/_input-redactor.scss +34 -0
  40. data/app/assets/stylesheets/core/_mixins.scss +75 -0
  41. data/app/assets/stylesheets/form/_input-checkbox.scss +18 -0
  42. data/app/assets/stylesheets/form/{_input_color.scss → _input-color.scss} +0 -0
  43. data/app/assets/stylesheets/form/{_input_file.scss → _input-file.scss} +1 -0
  44. data/app/assets/stylesheets/form/{_nested_form.scss → _input-form.scss} +0 -0
  45. data/app/assets/stylesheets/form/{_input_list.scss → _input-list.scss} +0 -0
  46. data/app/assets/stylesheets/form/_input-string.scss +8 -0
  47. data/bower.json +3 -2
  48. data/{app/assets/javascripts/chr-dist.js → dist/chr.js} +1472 -1337
  49. data/dist/input-ace.js +24936 -0
  50. data/dist/input-redactor.js +156 -0
  51. data/lib/chr/version.rb +1 -1
  52. data/package.json +2 -2
  53. metadata +29 -13
  54. data/app/assets/javascripts/chr/core/list-pagination.coffee +0 -26
  55. data/app/assets/javascripts/chr/core/list-reorder.coffee +0 -70
  56. data/app/assets/javascripts/chr/core/list-search.coffee +0 -37
  57. data/app/assets/javascripts/chr/form/nested-form.coffee +0 -164
  58. data/app/assets/stylesheets/form/_input_checkbox.scss +0 -91
  59. data/app/assets/stylesheets/form/_input_string.scss +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7349b5bd70a0b05aaf3a633a3c51b3f7c626da3f
4
- data.tar.gz: 96896128a99565eb3f1b59419d8b4678b6cd27bc
3
+ metadata.gz: c1e8a41bc74d5c9663f0f5d10ac550ada054fe57
4
+ data.tar.gz: cf8bb324690c3c73033768e2683cb2270fed88f3
5
5
  SHA512:
6
- metadata.gz: 756015e110eb04f9bf47d08b3d7185181a3e14438118d1b7fd7d90454f72f22610c4c7d36b6bf1792b84d54680b1e1c6b4b254937e0d63fb1cc8749df9ece105
7
- data.tar.gz: ed74cff422c37caeaf12ed7941b0caa53fc702eae5f5cf3497bec744acafb033483dca054df145ceaa2eeba88da9a17d037a9fb51f40bcbe7feb764d1e35a51b
6
+ metadata.gz: 15adb4c217afc3aeb3c8af54f251fb7d7e358490607c2cd67643a2f67b9221001caef951abf4541d3df7621fc85eaeed4d7ec6d987c43a9e8a4a11fc99a10bdd
7
+ data.tar.gz: 58ce4a8966c8c7408f57fe5f0fb9f7df2a9898e21f5c120014cb4e4bfea1f0b4d9cb5832ef249ee72f07b9ebf0ba62982e4926485f515755ec30071358da2c03
data/.gitignore CHANGED
@@ -5,5 +5,4 @@ _site
5
5
  *swp
6
6
  Gemfile.lock
7
7
  tmp
8
- dist
9
8
  node_modules
data/Gruntfile.coffee CHANGED
@@ -8,39 +8,52 @@ module.exports = (grunt) ->
8
8
  bare: true
9
9
  files:
10
10
  'build/chr.js': [
11
- #
12
- 'app/assets/javascripts/chr/core/item.coffee'
11
+ # core
12
+ 'app/assets/javascripts/chr/core/utils.coffee'
13
+ 'app/assets/javascripts/chr/core/chr.coffee'
14
+ 'app/assets/javascripts/chr/core/module.coffee'
15
+ 'app/assets/javascripts/chr/core/list_config.coffee'
16
+ 'app/assets/javascripts/chr/core/list_pagination.coffee'
17
+ 'app/assets/javascripts/chr/core/list_reorder.coffee'
18
+ 'app/assets/javascripts/chr/core/list_search.coffee'
13
19
  'app/assets/javascripts/chr/core/list.coffee'
14
- 'app/assets/javascripts/chr/core/list-search.coffee'
15
- 'app/assets/javascripts/chr/core/list-scroll.coffee'
16
- 'app/assets/javascripts/chr/core/list-reorder.coffee'
20
+ 'app/assets/javascripts/chr/core/item.coffee'
17
21
  'app/assets/javascripts/chr/core/view.coffee'
18
- 'app/assets/javascripts/chr/core/module.coffee'
19
- #
22
+ # form
20
23
  'app/assets/javascripts/chr/form/form.coffee'
24
+ 'app/assets/javascripts/chr/form/input-form_reorder.coffee'
25
+ 'app/assets/javascripts/chr/form/input-form.coffee'
21
26
  'app/assets/javascripts/chr/form/input-string.coffee'
27
+ 'app/assets/javascripts/chr/form/input-hidden.coffee'
22
28
  'app/assets/javascripts/chr/form/input-checkbox.coffee'
23
29
  'app/assets/javascripts/chr/form/input-color.coffee'
30
+ 'app/assets/javascripts/chr/form/input-date.coffee'
24
31
  'app/assets/javascripts/chr/form/input-file.coffee'
25
- 'app/assets/javascripts/chr/form/input-hidden.coffee'
32
+ 'app/assets/javascripts/chr/form/input-list_reorder.coffee'
26
33
  'app/assets/javascripts/chr/form/input-list.coffee'
34
+ 'app/assets/javascripts/chr/form/input-password.coffee'
27
35
  'app/assets/javascripts/chr/form/input-select.coffee'
28
36
  'app/assets/javascripts/chr/form/input-text.coffee'
29
- 'app/assets/javascripts/chr/form/nested-form.coffee'
30
- #
37
+ # stores
31
38
  'app/assets/javascripts/chr/store/_array-store.coffee'
32
39
  'app/assets/javascripts/chr/store/_object-store.coffee'
33
40
  'app/assets/javascripts/chr/store/rest-array-store.coffee'
34
41
  'app/assets/javascripts/chr/store/rest-object-store.coffee'
35
42
  'app/assets/javascripts/chr/store/mongosteen-array-store.coffee'
36
43
  'app/assets/javascripts/chr/store/mongosteen-object-store.coffee'
37
- #
38
- 'app/assets/javascripts/chr/core/utils.coffee'
39
- 'app/assets/javascripts/chr/core/chr.coffee'
44
+ ]
45
+
46
+ 'build/input-ace.js': [
47
+ 'app/assets/javascripts/input-html.coffee'
48
+ 'app/assets/javascripts/input-markdown.coffee'
49
+ ]
50
+
51
+ 'build/input-redactor.js': [
52
+ 'app/assets/javascripts/input-redactor.coffee'
40
53
  ]
41
54
 
42
55
  concat:
43
- vendor:
56
+ chr:
44
57
  src: [
45
58
  'app/assets/javascripts/chr/vendor/slip.js'
46
59
  'app/assets/javascripts/chr/vendor/jquery.scrollparent.js'
@@ -48,7 +61,24 @@ module.exports = (grunt) ->
48
61
  'app/assets/javascripts/chr/vendor/jquery.typeahead.js'
49
62
  'build/chr.js'
50
63
  ]
51
- dest: 'app/assets/javascripts/chr-dist.js'
64
+ dest: 'dist/chr.js'
65
+
66
+ ace:
67
+ src: [
68
+ 'app/assets/javascripts/chr/vendor/ace.js'
69
+ 'app/assets/javascripts/chr/vendor/mode-html.js'
70
+ 'app/assets/javascripts/chr/vendor/mode-markdown.js'
71
+ 'app/assets/javascripts/chr/vendor/marked.js'
72
+ 'build/input-ace.js'
73
+ ]
74
+ dest: 'dist/input-ace.js'
75
+
76
+ redactor:
77
+ src: [
78
+ 'app/assets/javascripts/chr/vendor/redactor.fixedtoolbar.js'
79
+ 'build/input-redactor.js'
80
+ ]
81
+ dest: 'dist/input-redactor.js'
52
82
 
53
83
  clean: [
54
84
  'build'
@@ -58,4 +88,8 @@ module.exports = (grunt) ->
58
88
  grunt.loadNpmTasks('grunt-contrib-concat')
59
89
  grunt.loadNpmTasks('grunt-contrib-clean')
60
90
 
61
- grunt.registerTask('default', ['coffee', 'concat', 'clean'])
91
+ grunt.registerTask('default', ['coffee', 'concat', 'clean'])
92
+
93
+
94
+
95
+
@@ -1,33 +1,26 @@
1
- #= require ./chr/vendor/jquery.scrollparent
2
- #= require ./chr/vendor/jquery.textarea_autosize
3
- #= require ./chr/vendor/jquery.typeahead
4
- #= require ./chr/vendor/slip
1
+ #= require ./chr/core/utils
2
+ #= require ./chr/core/chr
5
3
 
6
- #= require ./chr/core/item
4
+ #= require ./chr/core/module
7
5
  #= require ./chr/core/list
8
- #= require ./chr/core/list-search
9
- #= require ./chr/core/list-pagination
10
- #= require ./chr/core/list-reorder
6
+ #= require ./chr/core/item
11
7
  #= require ./chr/core/view
12
- #= require ./chr/core/module
13
8
 
14
9
  #= require ./chr/form/form
10
+ #= require ./chr/form/input-form
11
+ #= require ./chr/form/input-hidden
15
12
  #= require ./chr/form/input-string
13
+ #= require ./chr/form/input-text
16
14
  #= require ./chr/form/input-checkbox
15
+ #= require ./chr/form/input-password
17
16
  #= require ./chr/form/input-color
18
17
  #= require ./chr/form/input-file
19
- #= require ./chr/form/input-hidden
20
18
  #= require ./chr/form/input-list
21
19
  #= require ./chr/form/input-select
22
- #= require ./chr/form/input-text
23
- #= require ./chr/form/nested-form
24
20
 
25
21
  #= require ./chr/store/_object-store
26
22
  #= require ./chr/store/_array-store
27
23
  #= require ./chr/store/rest-object-store
28
24
  #= require ./chr/store/rest-array-store
29
25
  #= require ./chr/store/mongosteen-object-store
30
- #= require ./chr/store/mongosteen-array-store
31
-
32
- #= require ./chr/core/utils
33
- #= require ./chr/core/chr
26
+ #= require ./chr/store/mongosteen-array-store
@@ -8,25 +8,34 @@
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
  # CHARACTER
11
+ # -----------------------------------------------------------------------------
12
+ # Public attributes:
13
+ # modules
14
+ # formInputs
15
+ # itemsPerPageRequest
11
16
  #
12
- # public methods:
17
+ # Public methods:
13
18
  # start(@config) - start the character app with configuration
14
19
  # addMenuItem(moduleName, title) - add item to main menu
15
20
  # showAlert(message) - show alert notification
16
21
  # showError(message) - show error message
22
+ # isMobile() - check if running on mobile
23
+ # unsetActiveListItems() - clear selection from all list items
24
+ # updateHash(hash, skipHashChange=false)
17
25
  #
18
26
  # -----------------------------------------------------------------------------
19
27
  class @Chr
20
28
  constructor: ->
21
- @modules = {}
29
+ @formInputs = {}
30
+ @modules = {}
22
31
 
32
+ @itemsPerPageRequest = Math.ceil($(window).height() / 60) * 2
23
33
 
24
- _unset_active_menu_items: ->
25
- $('.sidebar .menu a.active').removeClass('active')
26
34
 
35
+ # PRIVATE ===============================================
27
36
 
28
- unsetActiveListItems: ->
29
- $('.list .items .item.active').removeClass('active')
37
+ _unset_active_menu_items: ->
38
+ $('.sidebar .menu a.active').removeClass('active')
30
39
 
31
40
 
32
41
  _set_active_menu_item: ->
@@ -37,8 +46,6 @@ class @Chr
37
46
  return $(a).addClass('active')
38
47
 
39
48
 
40
- # TODO: this piece of navigation code isn't clear, need to refactor to make
41
- # it more readable
42
49
  _navigate: (path) -> #/<module>[/<list>][/new]OR[/view/<objectId>]
43
50
  crumbs = path.split('/')
44
51
 
@@ -57,7 +64,6 @@ class @Chr
57
64
  if crumbs.length > 0
58
65
  for crumb in crumbs
59
66
  if crumb == 'new'
60
- # TODO: reset list data — why?
61
67
  return @module.showView(null, config, 'New')
62
68
 
63
69
  if crumb == 'view'
@@ -72,10 +78,22 @@ class @Chr
72
78
  else
73
79
  @module.showNestedList(crumb)
74
80
  else
75
- # show module root list for the case when same module picked
76
- @module.destroyView()
77
- while @module.activeList != @module.rootList
78
- @module.hideActiveList(false)
81
+ @module.showRootList()
82
+
83
+
84
+ # PUBLIC ================================================
85
+
86
+ unsetActiveListItems: ->
87
+ $('.list .items .item.active').removeClass('active')
88
+
89
+
90
+ isMobile: ->
91
+ $(window).width() < 760
92
+
93
+
94
+ updateHash: (hash, skipHashChange=false) ->
95
+ window._skipHashchange = skipHashChange
96
+ location.hash = hash
79
97
 
80
98
 
81
99
  start: (@config) ->
@@ -94,8 +112,8 @@ class @Chr
94
112
  @_unset_active_menu_items()
95
113
  @unsetActiveListItems()
96
114
 
97
- # this workaround allows to skip chr _navigate method
98
- # for silent hashchanges, e.g close view event
115
+ # this allows to skip chr _navigate method for silent hashchanges,
116
+ # e.g. close view event
99
117
  if not window._skipHashchange then @_navigate(location.hash)
100
118
  window._skipHashchange = false
101
119
 
@@ -109,11 +127,11 @@ class @Chr
109
127
  # if not mobile navigate on first page load or page refresh
110
128
  window._skipHashchange = false
111
129
 
112
- # if hash is not empty go to hash path module
130
+ # if hash is not empty go to module
113
131
  if location.hash != ''
114
132
  @_navigate(location.hash)
115
- $(this).trigger 'hashchange'
116
- else if ! _isMobile()
133
+ $(this).trigger('hashchange')
134
+ else if ! @isMobile()
117
135
  # if on desktop/tablet while hash is empty go to first module in the list
118
136
  location.hash = '#/' + Object.keys(@modules)[0]
119
137
 
@@ -127,11 +145,11 @@ class @Chr
127
145
 
128
146
 
129
147
  showError: (message) ->
130
- console.log 'Error: ' + message
148
+ alert 'Error: ' + message
131
149
 
132
150
 
133
151
  # -----------------------------------------------------------------------------
134
- # INIT
152
+ # Initialize `chr` object in global scope
135
153
  # -----------------------------------------------------------------------------
136
154
  window.chr = new Chr()
137
155
 
@@ -8,7 +8,7 @@
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
  # LIST ITEM
11
- #
11
+ # -----------------------------------------------------------------------------
12
12
  # public methods:
13
13
  # render()
14
14
  # destroy()
@@ -18,29 +18,11 @@
18
18
  class @Item
19
19
  constructor: (@module, @path, @object, @config) ->
20
20
  @$el =$ """<a class='item' href='#{ @path }' data-id='#{ @object._id }' data-title=''></a>"""
21
- @$el.on 'click', (e) => @_on_click(e)
21
+ @$el.on 'click', (e) => @_click(e)
22
22
  @render()
23
23
 
24
24
 
25
- _on_click: (e) ->
26
- if @.$el.hasClass('active') then e.preventDefault() ; return
27
-
28
- window._skipHashchange = true
29
- location.hash = $(e.currentTarget).attr('href')
30
-
31
- title = $(e.currentTarget).attr('data-title')
32
- id = $(e.currentTarget).attr('data-id')
33
- crumbs = location.href.split('/')
34
-
35
- # view for a arrayStore item
36
- if crumbs[crumbs.length - 2] == 'view'
37
- return @module.showViewByObjectId(id, @config, title, true)
38
-
39
- if @config.objectStore
40
- return @module.showViewByObjectId('', @config, title, true)
41
-
42
- @module.showNestedList(_last(crumbs), true)
43
-
25
+ # PRIVATE ===============================================
44
26
 
45
27
  _is_folder: ->
46
28
  # update this logic as it's not reliable
@@ -52,11 +34,11 @@ class @Item
52
34
  title ?= @object[@config.itemTitleField] # based on config
53
35
  title ?= _firstNonEmptyValue(@object) # auto-generated: first non empty value
54
36
  title ?= "No Title"
55
- title = _stripHtml(title)
37
+ title = title.plainText()
56
38
 
57
- @$title =$ "<div class='item-title'>#{title}</div>"
39
+ @$title =$ "<div class='item-title'>#{ title }</div>"
58
40
  @$el.append(@$title)
59
- @$el.attr 'data-title', title
41
+ @$el.attr('data-title', title)
60
42
 
61
43
 
62
44
  _render_subtitle: ->
@@ -78,6 +60,30 @@ class @Item
78
60
  @$el.addClass 'has-thumbnail'
79
61
 
80
62
 
63
+ # EVENTS ================================================
64
+
65
+ _click: (e) ->
66
+ if @.$el.hasClass('active') then e.preventDefault() ; return
67
+
68
+ hash = $(e.currentTarget).attr('href')
69
+ crumbs = hash.split('/')
70
+ title = $(e.currentTarget).attr('data-title')
71
+ id = $(e.currentTarget).attr('data-id')
72
+
73
+ chr.updateHash(hash, true)
74
+
75
+ # show view for a arrayStore item
76
+ if crumbs[crumbs.length - 2] == 'view'
77
+ return @module.showViewByObjectId(id, @config, title, true)
78
+ # show objectStore item view
79
+ if @config.objectStore
80
+ return @module.showViewByObjectId('', @config, title, true)
81
+ # show nested list
82
+ @module.showNestedList(_last(crumbs), true)
83
+
84
+
85
+ # PUBLIC ================================================
86
+
81
87
  render: ->
82
88
  @$el.html('').removeClass('item-folder has-subtitle has-thumbnail')
83
89
  @_render_title()
@@ -8,8 +8,9 @@
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
  # LIST
11
+ # -----------------------------------------------------------------------------
11
12
  #
12
- # configuration options:
13
+ # Configuration options:
13
14
  # itemClass - item class to be used instead of default one
14
15
  # itemTitleField - object attributes name for list item title
15
16
  # itemSubtitleField - object attributes name for list item subtitle
@@ -19,13 +20,20 @@
19
20
  # onListShow - callback on list is shown
20
21
  # objects - objects array to be added to the store on start
21
22
  #
22
- # public methods:
23
+ # Public methods:
23
24
  # hide() - hide list
24
25
  # show() - show list
25
26
  # updateItems() - update list items (sync through store with backend)
26
27
  # isVisible() - check if list is visible
27
28
  #
29
+ # Dependencies:
30
+ #= require ./list_config
31
+ #= require ./list_pagination
32
+ #= require ./list_reorder
33
+ #= require ./list_search
34
+ #
28
35
  # -----------------------------------------------------------------------------
36
+
29
37
  class @List
30
38
  constructor: (@module, @name, @config, @parentList) ->
31
39
  @configItemsCount = 0
@@ -33,6 +41,7 @@ class @List
33
41
  @items = {}
34
42
  @title = @config.title ? @name.titleize()
35
43
  @itemClass = @config.itemClass ? Item
44
+
36
45
  @showWithParent = false
37
46
  if @parentList
38
47
  @showWithParent = @parentList.config.showNestedListsAside || false
@@ -56,7 +65,7 @@ class @List
56
65
  # back button
57
66
  if @parentList
58
67
  @$backBtn =$ "<a href='#/#{ @parentList.path }' class='back silent'></a>"
59
- @$backBtn.on 'click', (e) => @_on_back(e)
68
+ @$backBtn.on 'click', (e) => @_back(e)
60
69
  else
61
70
  @$backBtn =$ "<a href='#/' class='back'></a>"
62
71
  @$header.prepend @$backBtn
@@ -68,7 +77,7 @@ class @List
68
77
  # new item button
69
78
  if not @config.disableNewItems and @config.formSchema
70
79
  @$newBtn =$ "<a href='#/#{ @path }/new' class='new silent'></a>"
71
- @$newBtn.on 'click', (e) => @_on_new(e)
80
+ @$newBtn.on 'click', (e) => @_new(e)
72
81
  @$header.append @$newBtn
73
82
 
74
83
  # search
@@ -88,6 +97,8 @@ class @List
88
97
  @config.onListInit?(@)
89
98
 
90
99
 
100
+ # PRIVATE ===============================================
101
+
91
102
  _bind_hashchange: ->
92
103
  $(chr).on 'hashchange', => @_set_active_item()
93
104
 
@@ -108,56 +119,6 @@ class @List
108
119
  @module.name + ( if crumbs.length > 0 then '/' + crumbs.reverse().join('/') else '' )
109
120
 
110
121
 
111
- _process_config_items: ->
112
- for slug, config of @config.items
113
- object = { _id: slug, _title: config.title ? slug.titleize() }
114
-
115
- #if config.objectStore
116
- # $.extend(object, config.objectStore.get())
117
-
118
- if config.items or config.arrayStore
119
- @module.addNestedList(slug, config, this)
120
-
121
- @_add_item("#/#{ @path }/#{ slug }", object, 0, config)
122
- @configItemsCount += 1
123
-
124
-
125
- _bind_config_object_store: ->
126
-
127
-
128
- _bind_config_array_store: ->
129
- # item added
130
- @config.arrayStore.on 'object_added', (e, data) =>
131
- @_add_item("#/#{ @path }/view/#{ data.object._id }", data.object, data.position, @config)
132
-
133
- if @config.objects
134
- @config.arrayStore.addObjects(@config.objects)
135
-
136
- # item updated
137
- @config.arrayStore.on 'object_changed', (e, data) =>
138
- item = @items[data.object._id]
139
- if item then item.render() ; @_update_item_position(item, data.position)
140
-
141
- # item removed
142
- @config.arrayStore.on 'object_removed', (e, data) =>
143
- item = @items[data.object_id]
144
- if item then item.destroy() ; delete @items[data.object_id]
145
-
146
- # items loaded
147
- @config.arrayStore.on 'objects_added', (e, data) =>
148
- @_hide_spinner()
149
- @_set_active_item()
150
-
151
- if @config.arrayStore.pagination
152
- _listBindPagination(this)
153
-
154
- if @config.arrayStore.searchable
155
- _listBindSearch(this)
156
-
157
- if @config.arrayStore.reorderable
158
- _listBindReorder(this)
159
-
160
-
161
122
  _add_item: (path, object, position, config) ->
162
123
  item = new @itemClass(@module, path, object, config)
163
124
  @items[object._id] = item
@@ -174,14 +135,16 @@ class @List
174
135
 
175
136
 
176
137
  _show_spinner: ->
177
- @$el.addClass 'show-spinner'
138
+ @$el.addClass('show-spinner')
178
139
 
179
140
 
180
141
  _hide_spinner: ->
181
- @$el.removeClass 'show-spinner'
142
+ @$el.removeClass('show-spinner')
143
+
182
144
 
145
+ # EVENTS ================================================
183
146
 
184
- _on_back: (e) ->
147
+ _back: (e) ->
185
148
  @module.chr.unsetActiveListItems()
186
149
  @module.destroyView()
187
150
 
@@ -191,12 +154,13 @@ class @List
191
154
  @module.hideActiveList(true)
192
155
 
193
156
 
194
- _on_new: (e) ->
195
- window._skipHashchange = true
196
- location.hash = $(e.currentTarget).attr('href')
157
+ _new: (e) ->
158
+ chr.updateHash($(e.currentTarget).attr('href'), true)
197
159
  @module.showView(null, @config, 'New', true)
198
160
 
199
161
 
162
+ # PUBLIC ================================================
163
+
200
164
  hide: (animate) ->
201
165
  if animate then @$el.fadeOut() else @$el.hide()
202
166
 
@@ -226,5 +190,11 @@ class @List
226
190
  @$el.is(':visible')
227
191
 
228
192
 
193
+ include(List, listConfig)
194
+ include(List, listPagination)
195
+ include(List, listReorder)
196
+ include(List, listSearch)
197
+
198
+
229
199
 
230
200