material 0.4.3 → 0.5.1

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 (166) hide show
  1. package/dist/tracks.svg +10 -0
  2. package/package.json +4 -4
  3. package/src/appbar.js +1 -2
  4. package/src/control/button.js +127 -44
  5. package/src/control/button.new.js +190 -0
  6. package/src/control/dialog.js +174 -0
  7. package/src/control/{upload.js → file.js} +33 -8
  8. package/src/control/link.js +61 -0
  9. package/src/control/list.js +77 -0
  10. package/src/control/loading.js +128 -0
  11. package/src/control/module/addclass.js +16 -0
  12. package/src/control/module/attributes.js +3 -1
  13. package/src/control/search.js +98 -0
  14. package/src/control/select.js +80 -22
  15. package/src/control/selecter.js +246 -0
  16. package/src/control/switch.js +272 -0
  17. package/src/control/switcher.js +245 -0
  18. package/src/control/text.js +18 -3
  19. package/src/control/textfield.js +89 -15
  20. package/src/field/image.js +9 -3
  21. package/src/form/build.js +28 -4
  22. package/src/form/cancel.js +7 -3
  23. package/src/form/controller.js +90 -0
  24. package/src/form/create.js +11 -7
  25. package/src/form/data.js +82 -0
  26. package/src/form/delete.js +2 -1
  27. package/src/form/fetch.js +5 -3
  28. package/src/form/render.js +11 -9
  29. package/src/form/set.js +27 -12
  30. package/src/form/submit.js +11 -37
  31. package/src/form/update.js +35 -16
  32. package/src/layout.js +25 -21
  33. package/src/list/add.js +34 -0
  34. package/src/list/build.js +96 -12
  35. package/src/list/click.js +10 -5
  36. package/src/list/collection.js +187 -0
  37. package/src/list/create.js +21 -11
  38. package/src/list/display.js +78 -0
  39. package/src/list/empty.js +4 -1
  40. package/src/list/filter.js +114 -0
  41. package/src/list/load.js +2 -2
  42. package/src/list/remove.js +17 -4
  43. package/src/list/render.js +32 -9
  44. package/src/list/request.js +182 -0
  45. package/src/list/search.js +118 -35
  46. package/src/list/select.js +151 -30
  47. package/src/list/status.js +10 -3
  48. package/src/list/update.js +49 -8
  49. package/src/list/virtual.js +195 -127
  50. package/src/map/build.js +103 -0
  51. package/src/map/countries.js +114 -0
  52. package/src/map/display.js +135 -0
  53. package/src/map/focus.js +39 -0
  54. package/src/map/init.js +24 -0
  55. package/src/map/label.js +0 -0
  56. package/src/map/mode.js +44 -0
  57. package/src/map/mouse.js +65 -0
  58. package/src/map/select.js +68 -0
  59. package/src/map/set.js +71 -0
  60. package/src/map/viewport.js +46 -0
  61. package/src/map.js +71 -0
  62. package/src/module/attach.js +9 -2
  63. package/src/module/mediator.js +56 -0
  64. package/src/module/object.js +17 -1
  65. package/src/module/observer.js +1 -1
  66. package/src/module/passive.js +17 -0
  67. package/src/module/remove.js +74 -0
  68. package/src/module/scrollbar.js +48 -0
  69. package/src/module/smoothscroll.js +20 -0
  70. package/src/module/viewport.js +20 -0
  71. package/src/selector.js +239 -0
  72. package/src/skin/material/base/body.sass +3 -0
  73. package/src/skin/material/button/file.sass +1 -1
  74. package/src/skin/material/container/container.sass +1 -1
  75. package/src/skin/material/container/dialog.sass +57 -1
  76. package/src/skin/material/container/drawer.sass +3 -3
  77. package/src/skin/material/control/button.sass +125 -0
  78. package/src/skin/material/control/dialog.sass +0 -0
  79. package/src/skin/material/control/progress.sass +136 -0
  80. package/src/skin/material/control/search.sass +40 -0
  81. package/src/skin/material/control/selecter.sass +131 -0
  82. package/src/skin/material/control/selector.sass +38 -0
  83. package/src/skin/material/control/slider.sass +2 -2
  84. package/src/skin/material/control/switch.sass +146 -3
  85. package/src/skin/material/control/switcher.sass +41 -0
  86. package/src/skin/material/control/textfield.sass +2 -1
  87. package/src/skin/material/icon/cancel.svg +1 -0
  88. package/src/skin/material/material.sass +3 -0
  89. package/src/skin/material/view/list.sass +81 -188
  90. package/src/skin/material/view/listview.sass +187 -96
  91. package/src/skin/material/view/tabview.sass +6 -4
  92. package/src/skin/material.bak/base/body.sass +52 -0
  93. package/src/skin/material.bak/base/elevation.sass +50 -0
  94. package/src/skin/material.bak/base/grid.sass +63 -0
  95. package/src/skin/material.bak/base/typo.sass +107 -0
  96. package/src/skin/material.bak/button/action.sass +89 -0
  97. package/src/skin/material.bak/button/button.sass +183 -0
  98. package/src/skin/material.bak/button/file.sass +24 -0
  99. package/src/skin/material.bak/button/floating.sass +113 -0
  100. package/src/skin/material.bak/button/raised.sass +101 -0
  101. package/src/skin/material.bak/button/stroked.sass +71 -0
  102. package/src/skin/material.bak/component/component.sass +7 -0
  103. package/src/skin/material.bak/component/divider.sass +17 -0
  104. package/src/skin/material.bak/component/image.sass +6 -0
  105. package/src/skin/material.bak/component/label.sass +2 -0
  106. package/src/skin/material.bak/component/progress.sass +138 -0
  107. package/src/skin/material.bak/component/subheader.sass +3 -0
  108. package/src/skin/material.bak/component/text.sass +85 -0
  109. package/src/skin/material.bak/container/appbar.sass +167 -0
  110. package/src/skin/material.bak/container/banner.sass +38 -0
  111. package/src/skin/material.bak/container/card.sass +18 -0
  112. package/src/skin/material.bak/container/container.sass +1 -0
  113. package/src/skin/material.bak/container/dialog.sass +184 -0
  114. package/src/skin/material.bak/container/drawer.sass +159 -0
  115. package/src/skin/material.bak/container/drawernew.sass +159 -0
  116. package/src/skin/material.bak/container/menu.sass +58 -0
  117. package/src/skin/material.bak/container/snackbar.sass +18 -0
  118. package/src/skin/material.bak/container/tabs.sass +75 -0
  119. package/src/skin/material.bak/container/toolbar.sass +161 -0
  120. package/src/skin/material.bak/control/button.sass +125 -0
  121. package/src/skin/material.bak/control/checkbox.sass +105 -0
  122. package/src/skin/material.bak/control/dialog.sass +0 -0
  123. package/src/skin/material.bak/control/search.sass +40 -0
  124. package/src/skin/material.bak/control/selecter.sass +128 -0
  125. package/src/skin/material.bak/control/slider.sass +181 -0
  126. package/src/skin/material.bak/control/switch.sass +284 -0
  127. package/src/skin/material.bak/control/switcher.sass +35 -0
  128. package/src/skin/material.bak/control/textfield.sass +126 -0
  129. package/src/skin/material.bak/control/tooltip.sass +36 -0
  130. package/src/skin/material.bak/icon/back.svg +5 -0
  131. package/src/skin/material.bak/icon/cancel.svg +1 -0
  132. package/src/skin/material.bak/icon/checkbox.svg +4 -0
  133. package/src/skin/material.bak/icon/forward.svg +5 -0
  134. package/src/skin/material.bak/icon/menu.svg +4 -0
  135. package/src/skin/material.bak/icon/pin.svg +4 -0
  136. package/src/skin/material.bak/layout/layout.sass +69 -0
  137. package/src/skin/material.bak/layout/resizer.sass +69 -0
  138. package/src/skin/material.bak/material.css +2042 -0
  139. package/src/skin/material.bak/material.css.map +7 -0
  140. package/src/skin/material.bak/material.sass +65 -0
  141. package/src/skin/material.bak/module/ripple.sass +9 -0
  142. package/src/skin/material.bak/theme/default.sass +50 -0
  143. package/src/skin/material.bak/theme/ocean.sass +29 -0
  144. package/src/skin/material.bak/theme/theme.sass +3 -0
  145. package/src/skin/material.bak/view/calendar.sass +193 -0
  146. package/src/skin/material.bak/view/form.sass +15 -0
  147. package/src/skin/material.bak/view/grid.sass +116 -0
  148. package/src/skin/material.bak/view/list.sass +89 -0
  149. package/src/skin/material.bak/view/listview.sass +195 -0
  150. package/src/skin/material.bak/view/map.sass +6 -0
  151. package/src/skin/material.bak/view/page.sass +4 -0
  152. package/src/skin/material.bak/view/tabview-bak.sass +40 -0
  153. package/src/skin/material.bak/view/tabview.sass +55 -0
  154. package/src/skin/material.bak/view/tree.sass +73 -0
  155. package/src/skin/material.bak/view/view.sass +7 -0
  156. package/src/switch.js +1 -1
  157. package/src/tabs/setup.js +0 -0
  158. package/src/tabview.js +64 -14
  159. package/src/tooltip.js +23 -5
  160. package/src/view/build.js +13 -1
  161. package/src/view/display.js +63 -2
  162. package/src/form/clean.js +0 -6
  163. package/src/form/controls.js +0 -56
  164. package/src/form/mode.js +0 -8
  165. package/src/form/setup.js +0 -5
  166. package/src/list/fetch.js +0 -66
@@ -0,0 +1,182 @@
1
+ export default {
2
+ request (page, size, more, cb) {
3
+ // console.log('request', page, size, more, cb)
4
+ if (more !== true) {
5
+ this.ui.body.innerHTML = ''
6
+ this.virtual.reset()
7
+ this.dataList = []
8
+ this.data = []
9
+ this.page = 1
10
+ this.stop = true
11
+ } else {
12
+ if (this.dataList.length < size) {
13
+ // console.log('no more request needed, data ', this.dataList.length)
14
+ return
15
+ }
16
+ }
17
+
18
+ this.data = this.data || []
19
+ var signal = null
20
+
21
+ if (this.abortController) {
22
+ // console.log('abort')
23
+ this.abortController.abort()
24
+ this.abortController = null
25
+ }
26
+
27
+ if (more !== true && window.AbortController) {
28
+ this.abortController = new AbortController()
29
+ signal = this.abortController.signal
30
+ }
31
+
32
+ page = page || 1
33
+ size = size || this.options.list.size
34
+ // console.log('size', this.options.name, size)
35
+
36
+ if (page === 1) {
37
+ this.ui.body.scrolltop = 0
38
+ }
39
+
40
+ var route = this.buildRoute(page, size)
41
+
42
+ if (more !== true && this.options.count) {
43
+ this.requestCount(route)
44
+ }
45
+
46
+ // console.log('route - ', this.rand, route)
47
+
48
+ fetch(route, {signal}).then((resp) => {
49
+ return resp.json()
50
+ }).then((data) => {
51
+ if (this.options.debug) {
52
+ console.log('data', route, data.length, data)
53
+ }
54
+
55
+ // console.log('route', route);
56
+
57
+ data = data || []
58
+
59
+ if (data.error) {
60
+ console.log('error', data.error)
61
+ return
62
+ }
63
+
64
+ if (data.length < this.size && more) {
65
+ this.stop = true
66
+ } else {
67
+ this.stop = false
68
+ }
69
+
70
+ if (more === true) {
71
+ var a = this.data.concat(data)
72
+ this.data = a
73
+ this.storeData(data, more)
74
+ this.virtual.add(this.data)
75
+ } else {
76
+ this.data = []
77
+ this.data = data
78
+ this.storeData(data)
79
+ this.render(data)
80
+ }
81
+
82
+ if (cb) cb()
83
+
84
+ this.emit('fetched', data)
85
+
86
+ this.loaded = true
87
+
88
+ if (page === 1 && data.length < 1) {
89
+ this.emit('empty')
90
+ }
91
+ }).catch(function (e) {
92
+ // console.log('error', e.message)
93
+ })
94
+ },
95
+
96
+ requestCount (route, signal) {
97
+ // console.log('fetchCount', route)
98
+ fetch(route + '&count=1', {signal}).then((resp) => {
99
+ return resp.json()
100
+ }).then((data) => {
101
+ // console.log('data', data.count)
102
+ this.count = data.count
103
+ this.statusDisplay('count', data.count)
104
+ }).catch(function (e) {
105
+ // console.log('error', e.message)
106
+ })
107
+ },
108
+
109
+ addParams (route, params) {
110
+ // console.log('addParams', route, params)
111
+
112
+ if (!route) {
113
+ console.log('error: no route specified!')
114
+
115
+ return
116
+ }
117
+
118
+ if (route.indexOf('?') > -1) {
119
+ // console.log('?', route, route.length, route[route.length - 1])
120
+ if (route[route.length - 1] === '&' || route[route.length - 1] === '?') {
121
+ route = route + params
122
+ } else {
123
+ route = route + '&' + params
124
+ }
125
+ } else {
126
+ // console.log('add ?')
127
+ route = route + '?' + params
128
+ }
129
+
130
+ return route
131
+ },
132
+
133
+ buildRoute (page, size, path) {
134
+ // console.log('buildroute', this.options.route, path)
135
+ path = path || 'list'
136
+
137
+ page = page || 1
138
+ size = size || this.options.list.size
139
+
140
+ var route = this.options.route
141
+
142
+ if (path) {
143
+ route = this.options.route[path]
144
+ }
145
+
146
+ if (this.routeAddOn) {
147
+ route = this.routeAddOn(route, path)
148
+ }
149
+
150
+ if (this.params && this.params()) {
151
+ // console.log('params', route, this.params())
152
+ route = this.addParams(route, this.params())
153
+ } else {
154
+
155
+ }
156
+
157
+ if (this.ui.filter && this.ui.filter.root.classList.contains('selected')) {
158
+ route = this.addParams(route, this.getFilter())
159
+ }
160
+
161
+ if (this.options.pagination) {
162
+ route = this.addParams(route, 'page=' + page + '&size=' + size)
163
+ }
164
+
165
+ return route
166
+ },
167
+
168
+ storeData (list, more) {
169
+ // console.log('storeData', list.length, more)
170
+ if (more !== true) {
171
+ this.dataList = []
172
+ }
173
+
174
+ // console.log('storeData', this.dataStore)
175
+ this.dataStore = this.dataStore || {}
176
+
177
+ for (var i = 0; i < list.length; i++) {
178
+ this.dataList.push(list[i][this.dataId])
179
+ this.dataStore[list[i][this.dataId]] = list[i]
180
+ }
181
+ }
182
+ }
@@ -1,30 +1,89 @@
1
1
  export default {
2
- /**
3
- * [search description]
4
- * @param {[type]} ev [description]
5
- * @return {[type]} [description]
6
- */
7
- search (ev) {
8
- // console.log('search', ev)
9
- var keywords = ev.target.value
10
- if (keywords.length < 4) return
2
+ search (keywords, page, size, more) {
3
+ // console.log('search', keywords, page, size, more)
4
+
5
+ this.emit('searching')
6
+
7
+ if (more !== true) {
8
+ this.ui.body.innerHTML = ''
9
+ this.virtual.reset()
10
+ this.data = []
11
+ this.dataList = []
12
+ this.data = []
13
+ this.page = 1
14
+ this.stop = false
15
+ }
16
+
17
+ this.data = this.data || []
18
+ var signal = null
19
+
20
+ if (this.abortController) {
21
+ this.abortController.abort()
22
+ this.abortController = null
23
+ }
24
+
25
+ if (more !== true) {
26
+ this.abortController = new AbortController()
27
+ signal = this.abortController.signal
28
+ }
11
29
 
12
- fetch(this.options.route.search + '?search=' + keywords).then((resp) => {
30
+ page = page || 1
31
+ size = size || this.options.list.size
32
+
33
+ if (page === 1) {
34
+ this.ui.body.scrolltop = 0
35
+ }
36
+
37
+ var route = this.buildRoute(page, size, 'search')
38
+
39
+ route = this.addParams(route, 'search=' + keywords)
40
+
41
+ // console.log('route', route)
42
+
43
+ if (more !== true && this.options.count) {
44
+ this.requestCount(route)
45
+ }
46
+
47
+ fetch(route, {signal}).then((resp) => {
13
48
  return resp.json()
14
- }).then((list) => {
49
+ }).then((data) => {
50
+ // console.log('data', data)
51
+ this.storeData(data)
52
+
53
+ this.data = data || []
54
+
15
55
  // console.log('list', list)
16
- this.store(list)
17
- this.ui['search-list'].innerHTML = ''
18
- this.renderSearch(list)
56
+
57
+ if (data.error) {
58
+ console.log('error', data.error)
59
+ return
60
+ }
61
+
62
+ if (data.length < this.size && more) {
63
+ this.stop = true
64
+ }
65
+
66
+ if (more === true) {
67
+ var a = this.data.concat(data)
68
+ this.data = a
69
+ this.storeData(data, more)
70
+ this.virtual.add(this.data)
71
+ } else {
72
+ this.data = []
73
+ this.data = data
74
+ this.storeData(data)
75
+ this.render(data)
76
+ }
77
+
78
+ this.emit('fetched', data)
79
+ }).catch(function (e) {
80
+ // console.log('error', e.message)
19
81
  })
20
82
  },
21
83
 
22
- renderSearch (list) {
23
- console.log('render', list.length, list)
24
- for (var i = 0; i < list.length; i++) {
25
- var info = list[i]
26
- this.renderItem(info, 'search')
27
- }
84
+ cancelSearch () {
85
+ // console.log('cancel search')
86
+ this.ui.body.innerHTML = ''
28
87
  },
29
88
 
30
89
  /**
@@ -34,12 +93,10 @@ export default {
34
93
  toggleSearch (e) {
35
94
  e.stopPropagation()
36
95
  // console.log('toggle search', this.ui.body)
37
- if (!this.ui['search-input'].classList.contains('show')) {
96
+ if (!this.ui['search-input'].root.classList.contains('show')) {
38
97
  this.showSearch()
39
- if (this.ui.delete) { this.ui.delete.disable() }
40
98
  } else {
41
99
  this.hideSearch()
42
- if (this.ui.delete) { this.ui.delete.enable() }
43
100
  }
44
101
  },
45
102
 
@@ -48,25 +105,51 @@ export default {
48
105
  * @return {[type]} [description]
49
106
  */
50
107
  showSearch () {
108
+ if (this.hideFilter) {
109
+ this.hideFilter()
110
+ }
111
+
51
112
  // console.log('showSearch')
113
+ this.mode = 'search'
114
+ this.root.classList.add('search-mode')
115
+
116
+ if (this.ui.search) {
117
+ this.ui.search.root.classList.add('selected')
118
+ }
119
+
120
+ if (this.ui['search-input']) {
121
+ this.ui['search-input'].input.value = ''
122
+ this.ui['search-input'].root.classList.add('show')
123
+ this.ui['search-input'].input.focus()
124
+ }
52
125
 
53
- this.ui['search'].root.classList.add('selected')
54
- this.ui['search-input'].classList.add('show')
55
- this.ui['search-list'].classList.add('show')
56
- this.ui.body.classList.add('hide')
57
- this.ui['search-input'].focus()
126
+ this.ui.body.innerHTML = ''
127
+
128
+ // this.ui['search-list'].classList.add('show')
129
+ // this.ui.body.classList.add('hide')
58
130
  },
59
131
 
60
132
  /**
61
133
  * [hideSearch description]
62
134
  * @return {[type]} [description]
63
135
  */
64
- hideSearch () {
65
- // console.log('hideSearch')
66
- this.ui['search'].root.classList.remove('selected')
67
- this.ui['search-input'].classList.remove('show')
68
- this.ui['search-list'].classList.remove('show')
69
- this.ui.body.classList.remove('hide')
70
- }
136
+ hideSearch (notfetch) {
137
+ // console.log('hideSearch', notfetch)
138
+ this.mode = 'standard'
139
+ this.root.classList.remove('search-mode')
71
140
 
141
+ if (this.ui.search) {
142
+ this.ui.search.root.classList.remove('selected')
143
+ }
144
+ if (this.ui['search-input']) {
145
+ this.ui['search-input'].root.classList.remove('show')
146
+ this.ui['search-input'].input.value = ''
147
+ }
148
+ // this.ui['search-list'].classList.remove('show')
149
+ // this.ui.body.classList.remove('hide')
150
+ // console.log('request', notfetch)
151
+ if (!notfetch) {
152
+ this.request()
153
+ }
154
+ }
72
155
  }
@@ -1,62 +1,183 @@
1
1
  export default {
2
- select (item) {
3
- // console.log('select')
4
-
5
- if (!item.dataset.id) return
2
+ select (item, silent) {
3
+ // console.log('select', item.dataset.id)
4
+ if (!item || !item.dataset.id) return
6
5
 
7
6
  var id = item.dataset.id
8
7
 
8
+ this.index = this.dataList.indexOf(id)
9
+ this.info = this.dataStore[id]
10
+
9
11
  if (this.options.preventSelectAgain && this.id === id) {
10
12
  return
11
13
  }
12
14
 
13
- if (this.mode === 'create') {
14
- // console.log('cancel create', this.newItem)
15
- if (this.newItem) {
16
- this.ui.body.removeChild(this.newItem)
17
- this.newItem = null
18
- }
19
- this.mode = null
20
- }
15
+ var selected = this.ui.body.querySelector('.selected')
16
+ if (selected) selected.classList.remove('selected')
21
17
 
22
18
  if (id) {
23
19
  this.highlight(item)
24
20
  this.item = item
25
21
  this.id = id
26
- if (this.ui.delete) { this.ui.delete.enable() }
27
- this.emit('select', id)
22
+
23
+ if (silent !== true) {
24
+ this.emit('select', id)
25
+ this.emit('selectItem', item)
26
+ }
28
27
  } else {
29
28
  this.id = null
30
- if (this.item) {
31
- this.item.classList.remove('selected')
32
- }
33
- this.ui.delete.disable()
29
+ this.item = null
34
30
  }
35
31
  },
36
32
 
37
33
  unselect () {
34
+ // console.log('unselect')
35
+ var item = this.ui.body.querySelector('[data-id="' + this.id + '"]') || this.item
38
36
  this.id = null
39
- if (this.item) {
40
- this.item.classList.remove('selected')
37
+ if (item) {
38
+ item.classList.remove('selected')
41
39
  }
40
+ this.index = null
42
41
  this.item = null
43
42
  },
44
43
 
45
- next () {
46
- // console.log('next', this.item)
47
- if (this.item && this.item.nextSibling) {
48
- this.select(this.item.nextSibling)
44
+ getItemById (id, silent) {
45
+ // console.log('selectItemById', id)
46
+ var item = this.ui.body.querySelector('[data-id="' + id + '"]')
47
+
48
+ if (!item) {
49
+ return null
49
50
  } else {
50
- if (!this.item && this.ui.body.firstChild) {
51
- this.select(this.ui.body.firstChild)
51
+ return item
52
+ }
53
+ },
54
+
55
+ selectById (id, silent) {
56
+ // console.log('selectById', id)
57
+
58
+ if (!this.dataList) {
59
+ return false
60
+ }
61
+
62
+ var index = this.dataList.indexOf(id)
63
+ if (index < 0) {
64
+ // console.log('can\'t selectid, not in the list')
65
+ return false
66
+ }
67
+
68
+ this.index = index
69
+ this.id = id
70
+
71
+ this.selectItemById(id, 'down')
72
+
73
+ return id
74
+ },
75
+
76
+ selectItemById (id, direction) {
77
+ // console.log('selectItemById', id)
78
+ var item = this.ui.body.querySelector('[data-id="' + id + '"]')
79
+
80
+ this.id = id
81
+
82
+ if (!item) {
83
+ var index = this.dataList.indexOf(id)
84
+ // console.log('not found in DOM, check in dataList', index)
85
+ if (index > -1) {
86
+ var listSize = this.options.list.size
87
+ var slice = listSize * index / listSize
88
+ // console.log('getSlice', slice)
52
89
  }
90
+
91
+ return
92
+ }
93
+
94
+ // console.log('item found', item)
95
+
96
+ // if (this.item) this.item.classList.remove('selected')
97
+
98
+ var selected = this.ui.body.querySelector('.selected')
99
+ if (selected) selected.classList.remove('selected')
100
+
101
+ this.item = item
102
+ item.classList.add('selected')
103
+
104
+ if (this.options.updatePosition === true) {
105
+ this.selectPosition(item, direction)
106
+ }
107
+
108
+ return item
109
+ },
110
+
111
+ selectPosition (item, direction) {
112
+ var offsetY = this.options.item.height
113
+ direction = direction || 'down'
114
+ // console.log('selectPosition', this.ui.body, direction)
115
+
116
+ this.coord = this.ui.body.getBoundingClientRect()
117
+
118
+ // console.log('coord', this.coord)
119
+
120
+ var itemTop = item.offsetTop + this.coord.top - this.ui.body.scrollTop
121
+
122
+ if (direction === 'down' && itemTop + this.options.item.height + offsetY - this.coord.y > this.coord.height) {
123
+ var top = this.ui.body.scrollTop + itemTop - this.coord.height - this.coord.y + this.options.item.height + offsetY
124
+ this.ui.body.scrollTo({
125
+ top: top,
126
+ left: 0
127
+ // behavior: 'smooth'
128
+ })
129
+ }
130
+
131
+ if (direction === 'up' && itemTop - offsetY < this.coord.top + this.coord.y) {
132
+ var top = this.ui.body.scrollTop + itemTop - this.coord.top - offsetY
133
+ // console.lof('scrollTo', top, item)
134
+ this.ui.body.scrollTo({
135
+ left: 0,
136
+ top: top
137
+ // behavior: 'smooth'
138
+ })
139
+ }
140
+ },
141
+
142
+ selectNext (silent) {
143
+ // console.log('selectNext', this.id)
144
+ var idx = this.dataList.indexOf(this.id)
145
+
146
+ var id = this.dataList[idx + 1]
147
+
148
+ // console.log('id', id)
149
+
150
+ if (id) {
151
+ this.id = id
152
+ // console.log('item', item)
153
+ this.selectItemById(id, 'down')
154
+
155
+ if (silent !== true) {
156
+ this.emit('select', id)
157
+ }
158
+ return id
159
+ } else {
160
+ return false
53
161
  }
54
162
  },
55
163
 
56
- previous () {
57
- // console.log('previous', this.item)
58
- if (this.item && this.item.previousSibling) {
59
- this.select(this.item.previousSibling)
164
+ selectPrevious (silent) {
165
+ // console.log('selectPrevious', this.id)
166
+ var idx = this.dataList.indexOf(this.id)
167
+
168
+ var id = this.dataList[idx - 1]
169
+
170
+ if (id) {
171
+ this.id = id
172
+ // console.log('item', item)
173
+ this.selectItemById(id, 'up')
174
+
175
+ if (silent !== true) {
176
+ this.emit('select', id)
177
+ }
178
+ return id
179
+ } else {
180
+ return false
60
181
  }
61
182
  },
62
183
 
@@ -1,14 +1,21 @@
1
1
  export default {
2
2
 
3
- status (prop, info) {
3
+ statusDisplay (prop, info) {
4
+ // console.log('status', prop, info)
4
5
  if (prop === 'count') {
5
6
  this.statusCount(info)
6
7
  }
7
8
  },
8
9
 
9
- statusCount (info) {
10
+ statusCount (count) {
11
+ // console.log('statusCount', count)
12
+ var items = 'items'
13
+ if (this.status && this.status.count && this.status.count.name) {
14
+ items = this.status.count.name
15
+ }
16
+
10
17
  if (this.ui.count) {
11
- this.ui.count.innerHTML = info
18
+ this.ui.count.innerHTML = '<span class="number">' + count + '</span> ' + items
12
19
  }
13
20
  }
14
21
  }
@@ -2,19 +2,60 @@ import Layout from '../layout'
2
2
 
3
3
  export default {
4
4
  update (info) {
5
- console.log('update', info)
6
- // console.log('selected', this.info, this.item)
5
+ // console.log('update', info)
7
6
 
8
- this.info = info
7
+ this.getUpdatedInfo(info[this.dataId])
8
+ },
9
+
10
+ getUpdatedIndex (id) {
11
+ // console.log('getUpdatedIndex', id)
12
+ var index = null
13
+ for (var i = 0; i < this.data.length; i++) {
14
+ // console.log('--', this.data[i][this.dataId], id)
15
+ if (this.data[i][this.dataId] === id) {
16
+ index = i
17
+ break
18
+ }
19
+ }
20
+
21
+ return index
22
+ },
23
+
24
+ getUpdatedInfo (id) {
25
+ // console.log('getUpdatedInfo', id)
26
+ var index = this.getUpdatedIndex(id)
27
+ // console.log('index', index)
28
+ var route = this.buildRoute(index + 1, 1)
29
+ // console.log('roote', route)
30
+ fetch(route).then((resp) => {
31
+ return resp.json()
32
+ }).then((data) => {
33
+ // console.log('info', data)
34
+ this.updateUpdatedInfo(data[0], index, id)
35
+ })
36
+ },
9
37
 
10
- var item = this.ui.body.querySelector('[data-id="' + info._id + '"]')
38
+ updateUpdatedInfo (info, index, id) {
39
+ // console.log('updateUpdatedInfo', info, index)
40
+
41
+ if (!info) return
42
+ if (info[this.dataId] !== id) return
43
+
44
+ this.info = info
11
45
 
12
- item.innerHTML = ''
46
+ // update datalist
47
+ this.data[index] = info
13
48
 
14
- var layout = new Layout(this.options.layout.item, item)
49
+ // update datastore
50
+ this.dataStore[info[this.dataId]] = info
15
51
 
16
- this.renderInfo(layout, info)
52
+ // update item if on the screen
53
+ var item = this.ui.body.querySelector('[data-id="' + info[this.dataId] + '"]')
54
+ if (item) {
55
+ item.innerHTML = ''
56
+ var layout = new Layout(this.options.layout.item, item)
17
57
 
18
- return item
58
+ this.renderInfo(layout, info)
59
+ }
19
60
  }
20
61
  }