beyond-rails 0.0.239 → 0.0.245

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5909cd5877a32b19eab6147bd2b240bd910832d9b7138073b0ecd439a0282be8
4
- data.tar.gz: 857fa2f0909a69fec32b1bbe6a5a02348dc3bc00b191ef0bcf26c9038025594e
3
+ metadata.gz: 14a11baddc8aa18a29a74c0774442e2b5486b49ad44a7e435497176aa8a0c230
4
+ data.tar.gz: 92a0ac4ab51c30bac1f93cc092bb05c6ac4fd4e0c53eb792b983e967dd77f0a9
5
5
  SHA512:
6
- metadata.gz: e1222887fa75efd27100d2f3e45462c7b7655d50dbef27bd6e4408c249580614c8eaddad80b40e4bc760b40522c84153b7bc527063031ecc1e4ff2fb4994c849
7
- data.tar.gz: f7704ffaf4a75dd6bb4372f4969772f621e2d91ac8ce45074545af24f6388c823133cbced360ccad789cc0c0fa624e354d9d3bf80bf0a0e6364f7e3884b7ace6
6
+ metadata.gz: 480156108ca39681b88309ac8554648af5d2aa47dfcf9ee077a940f19f4fd87de40a3a630d5a9b81a3a5244529ca07d377ef94f7ff64a3189bd6a065e76c0cff
7
+ data.tar.gz: 1b458994269fcc000dd7e5b670e7c69cb816fe56e251a51b55ff7ce78a6925c6951df7897c1f21e86dc5d130def90f4d71c60167ec515ff1b3c0eb4d3cf1c482
@@ -4,12 +4,7 @@ import isDef from '../utils/isDef'
4
4
  import isUndef from '../utils/isUndef'
5
5
  import isInt from '../utils/isInt'
6
6
  import { mem, range, sortBy, throttle, uniqBy } from '../utils'
7
-
8
- const defaultBarStyles = [
9
- '#5469d4',
10
- '#7c54d4',
11
- '#a254d4'
12
- ]
7
+ import { DEFAULT_CHART_STYLES } from '../consts'
13
8
 
14
9
  @supportDom
15
10
  @chartCommon
@@ -35,8 +30,8 @@ export default class BarChart {
35
30
  this.yLabelMargin = isDef(options.yLanelMargin) ? options.yLabelMargin : 14
36
31
 
37
32
  this.fontSize = options.fontSize || 12
38
- this.bgColor = options.bgColor || '#fff'
39
- this.barStyles = options.barStyles || defaultBarStyles
33
+ this.bg = options.bg || '#fff'
34
+ this.barStyles = options.barStyles || DEFAULT_CHART_STYLES
40
35
 
41
36
  this.yLabelRows = []
42
37
  this.barPosMap = new Map()
@@ -3,6 +3,7 @@ import chartCommon from '../decorators/chartCommon'
3
3
  import isDef from '../utils/isDef'
4
4
  import isUndef from '../utils/isUndef'
5
5
  import { mem, range, sortBy, throttle, uniqBy } from '../utils'
6
+ import { DEFAULT_CHART_STYLES } from '../consts'
6
7
 
7
8
  /**
8
9
  * -------------------------------------------------------------------------------------------------
@@ -27,11 +28,6 @@ import { mem, range, sortBy, throttle, uniqBy } from '../utils'
27
28
  * v |
28
29
  * --------------------------------------------------------------------------------------------------
29
30
  **/
30
- const defaultLineStyles = [
31
- '#5469d4',
32
- '#7c54d4',
33
- '#a254d4'
34
- ]
35
31
 
36
32
  @supportDom
37
33
  @chartCommon
@@ -56,16 +52,15 @@ export default class LineChart {
56
52
  this.xLabelMargin = isDef(options.xLabelMargin) ? options.xLabelMargin : 10
57
53
  this.yLabelMargin = isDef(options.yLanelMargin) ? options.yLabelMargin : 10
58
54
 
59
- this.lineStyles = options.lineStyles || defaultLineStyles
55
+ this.lineStyles = options.lineStyles || DEFAULT_CHART_STYLES
60
56
 
61
- this.bgColor = options.bgColor || '#fff'
57
+ this.bg = options.bg || '#fff'
62
58
  this.fontSize = options.fontSize || 12
63
59
 
64
60
  this.xStep = options.xStep
65
61
  this.yStep = options.yStep
66
62
 
67
63
  this.lineLabels = options.lineLabels || []
68
- this.lineLabelMargin = isDef(options.lineLabelMargin) ? options.lineLabelMargin : 20
69
64
 
70
65
  this.pointPosMap = new Map()
71
66
  this.xLabelRows = []
@@ -78,6 +73,7 @@ export default class LineChart {
78
73
  this.setDpr()
79
74
  this.setDomSizeIfNeeded()
80
75
  this.setCanvas()
76
+ this.setLabelBox()
81
77
  this.clear()
82
78
  this.bindMedia()
83
79
  this.bindPointMouseOver()
@@ -93,8 +89,7 @@ export default class LineChart {
93
89
  }
94
90
 
95
91
  get contentHeight() {
96
- return this.height - (this.yPadding * 2) - this.xLabelMargin -
97
- this.xLabelHeight - this.lineLabelBoxHeight
92
+ return this.height - (this.yPadding * 2) - this.xLabelMargin - this.xLabelHeight
98
93
  }
99
94
 
100
95
  get firstX() {
@@ -115,17 +110,6 @@ export default class LineChart {
115
110
  return yLabelRows[yLabelRows.length - 1].value
116
111
  }
117
112
 
118
- get lineLabelHeight() {
119
- return this.fontSize
120
- }
121
-
122
- get lineLabelBoxHeight() {
123
- if (this.lineLabels.length > 0) {
124
- return this.lineLabelMargin + this.lineLabelHeight
125
- }
126
- return 0
127
- }
128
-
129
113
  get xAxisStart() {
130
114
  return this.xPadding + (this.xLabelWidth / 2)
131
115
  }
@@ -145,7 +129,7 @@ export default class LineChart {
145
129
  }
146
130
 
147
131
  get yAxisStart() {
148
- return this.height - this.yPadding - this.lineLabelBoxHeight -
132
+ return this.height - this.yPadding -
149
133
  this.xLabelHeight - this.xLabelMargin + (this.yLabelHeight / 2)
150
134
  }
151
135
 
@@ -185,7 +169,6 @@ export default class LineChart {
185
169
  this.drawYAxis()
186
170
  this.drawBgLines()
187
171
  this.drawLines()
188
- this.drawLineLables()
189
172
  }
190
173
 
191
174
  drawBgLines() {
@@ -232,29 +215,6 @@ export default class LineChart {
232
215
  })
233
216
  }
234
217
 
235
- drawLineLables() {
236
- const { ctx, lineStyles, lineLabelHeight } = this
237
- const rectSize = 7
238
-
239
- const rectGutter = 7
240
- const labelGutter = 14
241
- const rectMargin = 1
242
- const y = this.height - this.yPadding
243
- let x = this.xPadding
244
-
245
- this.lineLabels.forEach((name, i) => {
246
- ctx.fillStyle = lineStyles[i] || '#000'
247
- ctx.fillRect(x, y - lineLabelHeight + rectMargin, rectSize, rectSize)
248
-
249
- x += (rectSize + rectGutter)
250
- ctx.fillStyle = '#000'
251
- ctx.textAlign = 'left'
252
- ctx.textBaseline = 'top'
253
- ctx.fillText(name, x, y - lineLabelHeight)
254
- x += (ctx.measureText(name).width + labelGutter)
255
- })
256
- }
257
-
258
218
  clearVerticalLine() {
259
219
  const { ctx } = this.firstLayer
260
220
  ctx.clearRect(0, 0, this.width, this.height)
@@ -279,7 +239,7 @@ export default class LineChart {
279
239
  drawXAxis() {
280
240
  const { ctx, firstX, xLabelRows, xAxisStart, xRatio } = this
281
241
 
282
- const y = this.height - this.yPadding - this.lineLabelBoxHeight
242
+ const y = this.height - this.yPadding
283
243
 
284
244
  const scaleMargin = 4
285
245
  const scaleSize = 4
@@ -538,7 +498,10 @@ export default class LineChart {
538
498
  return this.raf(() => this.clear())
539
499
  }
540
500
  this.setPointPos()
541
- this.raf(() => this.draw())
501
+ this.raf(() => {
502
+ this.drawLabels(this.lineLabels, this.lineStyles)
503
+ this.draw()
504
+ })
542
505
  }
543
506
 
544
507
  setPointPos() {
@@ -0,0 +1,256 @@
1
+ import supportDom from '../decorators/supportDom'
2
+ import chartCommon from '../decorators/chartCommon'
3
+ import isFn from '../utils/isFn'
4
+ import isDef from '../utils/isDef'
5
+ import isUndef from '../utils/isUndef'
6
+ import { throttle } from '../utils'
7
+ import { DEFAULT_CHART_STYLES } from '../consts'
8
+
9
+ @supportDom
10
+ @chartCommon
11
+ export default class PieChart {
12
+
13
+ constructor(dom, options = {}) {
14
+ this.dom = dom
15
+ this.data = []
16
+ this.total = 0
17
+
18
+ this.options = options
19
+ this.height = options.height
20
+ this.width = options.width
21
+ this.padding = isDef(options.padding) ? options.padding : 30
22
+ this.styles = options.styles || DEFAULT_CHART_STYLES
23
+ this.bg = options.bg || '#fff'
24
+
25
+ this.init()
26
+ }
27
+
28
+ init() {
29
+ this.setDpr()
30
+ this.setDomSizeIfNeeded()
31
+ this.setCanvas()
32
+ this.setLabelBox()
33
+ this.clear()
34
+ this.bindMedia()
35
+ this.bindPointMouseOver()
36
+ }
37
+
38
+ get x() {
39
+ return this.width / 2
40
+ }
41
+
42
+ get y() {
43
+ return this.height / 2
44
+ }
45
+
46
+ get radius() {
47
+ return this.contentWidth / 2
48
+ }
49
+
50
+ get pieWidth() {
51
+ return this.radius * .3
52
+ }
53
+
54
+ get centerCircleRadius() {
55
+ return this.radius - this.pieWidth
56
+ }
57
+
58
+ get contentWidth() {
59
+ return this.width - (this.padding * 2)
60
+ }
61
+
62
+ get contentHeight() {
63
+ return this.height - (this.padding * 2)
64
+ }
65
+
66
+ bindPointMouseOver() {
67
+ if (isUndef(this.options.onPieMouseOver)) {
68
+ return
69
+ }
70
+ if (! ('onmousemove' in this.canvas)) {
71
+ return
72
+ }
73
+ this.addLayer()
74
+ const canvas = this.getHighestCanvas()
75
+ this.addEvent(canvas, 'mousemove', throttle(this.handleMouseMove.bind(this), 30))
76
+ }
77
+
78
+ draw() {
79
+ this.clear()
80
+ this.drawPie()
81
+ }
82
+
83
+ drawPie() {
84
+ const { x, y, radius, centerCircleRadius, ctx, total } = this
85
+
86
+ let distance = 0
87
+
88
+ this.data.forEach((row, i) => {
89
+
90
+ const ratio = (row.value / total)
91
+ const startAngle = Math.PI * (-.5 + 2 * distance)
92
+ const endAngle = Math.PI * (-.5 + 2 * (distance + ratio))
93
+
94
+ const options = {
95
+ style: this.styles[i]
96
+ }
97
+ this.fillArc(ctx, x, y, radius, startAngle, endAngle, options)
98
+ distance += ratio
99
+ })
100
+
101
+ this.fillCircle(ctx, x, y, centerCircleRadius, '#fff')
102
+ }
103
+
104
+ handleDprChange() {
105
+ this.setDpr()
106
+ this.refresh()
107
+ }
108
+
109
+ getPosAngle(x1, y1, x2, y2) {
110
+
111
+ let x = x2
112
+ let y = y2
113
+
114
+ if (x1 >= 0) {
115
+ x -= x1
116
+ }
117
+ if (y1 >= 0) {
118
+ y -= y1
119
+ }
120
+ if (x1 < 0) {
121
+ x += x1
122
+ }
123
+ if (y2 < 0) {
124
+ y += y2
125
+ }
126
+
127
+ let angle = Math.atan2(y, x) * 180 / Math.PI
128
+ if (angle < 0) {
129
+ angle = 180 + (180 + angle)
130
+ }
131
+ return (angle + 90) % 360
132
+ }
133
+
134
+ handleMouseMove(event) {
135
+
136
+ const { x, y } = this
137
+ const canvasMousePos = this.getMousePosInCanvas(event)
138
+ const mousePos = this.getMousePos(canvasMousePos)
139
+ const mouseX = canvasMousePos.x
140
+ const mouseY = canvasMousePos.y
141
+
142
+ const distanceToCenterPoint = Math.sqrt(Math.pow(mouseX - x, 2) +
143
+ Math.pow(mouseY - y, 2))
144
+
145
+ const inCenterCircle = distanceToCenterPoint <= this.centerCircleRadius
146
+
147
+ this.clearSliceGlow()
148
+
149
+ if (inCenterCircle) {
150
+ return this.options.onPieMouseOver(mousePos, null)
151
+ }
152
+
153
+ const inPieCircle = distanceToCenterPoint <= this.radius
154
+ if (! inPieCircle) {
155
+ return this.options.onPieMouseOver(mousePos, null)
156
+ }
157
+ const angle = this.getPosAngle(x, y, mouseX, mouseY)
158
+ const matchedRow = this.data.find(row => {
159
+ return (row.startAngle <= angle) && (angle <= row.endAngle)
160
+ })
161
+ if (matchedRow) {
162
+ this.drawSliceGlow(matchedRow)
163
+ this.options.onPieMouseOver(mousePos, matchedRow)
164
+ }
165
+ }
166
+
167
+ drawSliceGlow(row) {
168
+ const index = this.data.findIndex(r => r === row)
169
+ this.clearSliceGlow()
170
+ const { x, y, radius, centerCircleRadius } = this
171
+ const ctx = this.firstLayer.canvas.getContext('2d')
172
+
173
+ const delta = 90 * Math.PI / 180
174
+ const startAngle = (row.startAngle * Math.PI / 180) - delta
175
+ const endAngle = (row.endAngle * Math.PI / 180) - delta
176
+
177
+ const options = {
178
+ style: this.styles[index],
179
+ alpha: .3
180
+ }
181
+ const radiusDelta = (radius - centerCircleRadius) * .3
182
+ this.fillArc(ctx, x, y, radius + radiusDelta, startAngle, endAngle, options)
183
+ this.fillCircle(this.firstLayer.ctx, x, y, centerCircleRadius, '#fff')
184
+ }
185
+
186
+ clearSliceGlow() {
187
+ const ctx = this.firstLayer.canvas.getContext('2d')
188
+ ctx.clearRect(0, 0, this.width, this.height)
189
+ }
190
+
191
+ refresh() {
192
+ this.raf(() => {
193
+ this.clearCanvasSize(this.canvas)
194
+ this.layers.forEach(layer => this.clearCanvasSize(layer.canvas))
195
+ this.setDomSizeIfNeeded()
196
+ this.setCanvasSize(this.canvas)
197
+ this.layers.forEach(layer => this.setCanvasSize(layer.canvas))
198
+ this.draw()
199
+ })
200
+ }
201
+
202
+ setAngles(data) {
203
+ const { total } = this
204
+ let startAngle = 0
205
+ return data.map(row => {
206
+ const endAngle = startAngle + ((row.value / total) * 360)
207
+ const nextRow = Object.assign({}, row, { startAngle, endAngle })
208
+ startAngle = endAngle
209
+ return nextRow
210
+ })
211
+ }
212
+
213
+ handleLabelMouseOver(event, index) {
214
+ const row = this.data[index]
215
+ this.drawSliceGlow(row)
216
+
217
+ if (isFn(this.options.onLabelMouseOver)) {
218
+ const canvasMousePos = this.getMousePosInCanvas(event)
219
+ const mousePos = this.getMousePos(canvasMousePos)
220
+ this.options.onLabelMouseOver(mousePos, row)
221
+ }
222
+ }
223
+
224
+ handleLabelMouseLeave(event, index) {
225
+ this.clearSliceGlow()
226
+
227
+ if (isFn(this.options.onLabelMouseOver)) {
228
+ const canvasMousePos = this.getMousePosInCanvas(event)
229
+ const mousePos = this.getMousePos(canvasMousePos)
230
+ this.options.onLabelMouseOver(mousePos)
231
+ }
232
+ }
233
+
234
+ setData(arr) {
235
+ const data = arr || []
236
+ this.total = data.reduce((t, row) => t + row.value, 0)
237
+ this.data = this.setAngles(data)
238
+ this.raf(() => {
239
+ const labels = this.data.map(row => row.label)
240
+ this.drawLabels(labels, this.styles)
241
+ this.draw()
242
+ })
243
+ }
244
+
245
+ destroy() {
246
+ const { dom, canvas } = this
247
+
248
+ this.unbindMedia()
249
+ this.removeAllLayers()
250
+
251
+ if (dom.contains(canvas)) {
252
+ dom.removeChild(canvas)
253
+ dom.style.removeProperty('position')
254
+ }
255
+ }
256
+ }
@@ -3,3 +3,13 @@ import locale from 'date-fns/locale/zh-TW'
3
3
  export const DEFAULT_TIMEZONE = 'Asia/Taipei'
4
4
 
5
5
  export const DEFAULT_LOCALE = locale
6
+
7
+ export const DEFAULT_CHART_STYLES = [
8
+ '#5469d4',
9
+ '#7c54d4',
10
+ '#a254d4',
11
+ '#c040a2',
12
+ '#ff5604',
13
+ '#0be4e3',
14
+ '#00d924'
15
+ ]
@@ -1,6 +1,8 @@
1
1
  import raf from '../utils/raf'
2
2
  import isUndef from '../utils/isUndef'
3
+ import isFn from '../utils/isFn'
3
4
  import { getDomPos, range, toPixel, isFunction } from '../utils'
5
+ import { DEFAULT_CHART_STYLES } from '../consts'
4
6
 
5
7
  export default function chartCommon(target) {
6
8
 
@@ -12,6 +14,7 @@ export default function chartCommon(target) {
12
14
  }
13
15
 
14
16
  init() {
17
+ this.offLabels = []
15
18
  this.layers = []
16
19
  if (isFunction(super.init)) {
17
20
  super.init()
@@ -50,10 +53,15 @@ export default function chartCommon(target) {
50
53
 
51
54
  clear() {
52
55
  const { ctx } = this
53
- ctx.fillStyle = this.bgColor
56
+ ctx.fillStyle = this.bg
54
57
  ctx.fillRect(0, 0, this.width, this.height)
55
58
  }
56
59
 
60
+ getHypotenuse(x1, y1, x2, y2) {
61
+ return Math.sqrt(Math.pow(x2 - x1, 2) +
62
+ Math.pow(y2 - y1, 2))
63
+ }
64
+
57
65
  fillCircle(ctx, x, y, radius, style, alpha) {
58
66
  ctx.save()
59
67
  ctx.beginPath()
@@ -65,6 +73,18 @@ export default function chartCommon(target) {
65
73
  ctx.restore()
66
74
  }
67
75
 
76
+ fillArc(ctx, x, y, radius, startAngle = 0, endAngle = 2 * Math.PI, options = {}) {
77
+ ctx.save()
78
+ ctx.beginPath()
79
+ ctx.arc(x, y, radius, startAngle, endAngle)
80
+ ctx.fillStyle = options.style || '#555'
81
+ ctx.globalAlpha = options.alpha || 1
82
+ ctx.lineTo(x, y)
83
+ ctx.fill()
84
+ ctx.closePath()
85
+ ctx.restore()
86
+ }
87
+
68
88
  getAutoStep(firstValue, lastValue, pointsLength) {
69
89
  return (lastValue - firstValue) / (pointsLength - 1)
70
90
  }
@@ -186,6 +206,52 @@ export default function chartCommon(target) {
186
206
  this.dom.appendChild(canvas)
187
207
  }
188
208
 
209
+ setLabelBox() {
210
+ const box = document.createElement('div')
211
+ box.className = 'chart-box'
212
+ this.labelBox = box
213
+ this.dom.appendChild(box)
214
+ }
215
+
216
+ drawLabels(labels, styles = DEFAULT_CHART_STYLES) {
217
+ if (labels.length <= 0) {
218
+ return
219
+ }
220
+ const { labelBox, handleLabelMouseOver, handleLabelMouseLeave } = this
221
+ this.dom.style.backgroundColor = this.bg
222
+
223
+ this.offLabels.forEach(off => off())
224
+ labelBox.innerHTML = ''
225
+
226
+ this.offLabels.length = 0
227
+
228
+ labels.forEach((label, i) => {
229
+
230
+ const div = document.createElement('div')
231
+ div.className = 'chart-box-item'
232
+
233
+ const square = document.createElement('div')
234
+ square.className = 'chart-box-square'
235
+ square.style.backgroundColor = styles[i]
236
+ div.appendChild(square)
237
+
238
+ const span = document.createElement('span')
239
+ span.textContent = label
240
+ div.appendChild(span)
241
+
242
+ labelBox.appendChild(div)
243
+
244
+ if (isFn(handleLabelMouseOver)) {
245
+ const off = this.addEvent(div, 'mouseover', event => this.handleLabelMouseOver(event, i))
246
+ this.offLabels.push(off)
247
+ }
248
+ if (isFn(handleLabelMouseLeave)) {
249
+ const off = this.addEvent(div, 'mouseleave', event => this.handleLabelMouseLeave(event, i))
250
+ this.offLabels.push(off)
251
+ }
252
+ })
253
+ }
254
+
189
255
  setCanvasFontSize(canvas, fontSize) {
190
256
  const ctx = canvas.getContext('2d')
191
257
  const args = ctx.font.split(' ')
@@ -25,7 +25,12 @@ export default function supportDom(target) {
25
25
 
26
26
  addEvent(dom, name, func) {
27
27
  dom.addEventListener(name, func)
28
- this._listeners.push({ dom, name, func })
28
+ const listener = { dom, name, func }
29
+ this._listeners.push(listener)
30
+
31
+ return () => {
32
+ this._listeners = this._listeners.filter(l => l !== listener)
33
+ }
29
34
  }
30
35
 
31
36
  removeEvents() {
@@ -17,6 +17,7 @@ import LineChart from './components/LineChart'
17
17
  import Menu from './components/Menu'
18
18
  import Modal from './components/Modal'
19
19
  import Navbar from './components/Navbar'
20
+ import PieChart from './components/PieChart'
20
21
  import Radio from './components/Radio'
21
22
  import SearchDropdown from './components/SearchDropdown'
22
23
  import Sidebar from './components/Sidebar'
@@ -53,6 +54,7 @@ export {
53
54
  Menu,
54
55
  Modal,
55
56
  Navbar,
57
+ PieChart,
56
58
  Radio,
57
59
  SearchDropdown,
58
60
  Sidebar,
@@ -0,0 +1,3 @@
1
+ export default function isFn(fn) {
2
+ return (typeof fn === 'function')
3
+ }
@@ -123,6 +123,10 @@ a.btn.btn-outline {
123
123
  }
124
124
  }
125
125
 
126
+ .btn-outline .ring-loader div {
127
+ border-color: $text-color-light transparent transparent transparent;
128
+ }
129
+
126
130
  .btn .badge {
127
131
  margin-left: .5rem;
128
132
  font-weight: 400;
@@ -12,3 +12,23 @@
12
12
  z-index: 1;
13
13
  border: 1px solid #e8e8e8;
14
14
  }
15
+
16
+ .chart-box {
17
+ display: flex;
18
+ flex-wrap: wrap;
19
+ padding-left: 14px;
20
+ padding-right: 14px;
21
+ padding-bottom: 10px;
22
+ .chart-box-item {
23
+ cursor: default;
24
+ font-size: 12px;
25
+ display: inline-flex;
26
+ align-items: center;
27
+ margin-right: 1.4em;
28
+ .chart-box-square {
29
+ transform: translateY(1px);
30
+ @include size(10px);
31
+ margin-right: .5em;
32
+ }
33
+ }
34
+ }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beyond-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.239
4
+ version: 0.0.245
5
5
  platform: ruby
6
6
  authors:
7
7
  - kmsheng
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-11-06 00:00:00.000000000 Z
12
+ date: 2020-11-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sassc
@@ -140,6 +140,7 @@ files:
140
140
  - src/js/components/Menu.js
141
141
  - src/js/components/Modal.js
142
142
  - src/js/components/Navbar.js
143
+ - src/js/components/PieChart.js
143
144
  - src/js/components/Radio.js
144
145
  - src/js/components/SearchDropdown.js
145
146
  - src/js/components/Sidebar.js
@@ -194,6 +195,7 @@ files:
194
195
  - src/js/utils/getKey.js
195
196
  - src/js/utils/index.js
196
197
  - src/js/utils/isDef.js
198
+ - src/js/utils/isFn.js
197
199
  - src/js/utils/isInt.js
198
200
  - src/js/utils/isStr.js
199
201
  - src/js/utils/isTouchDevice.js