beyond-rails 0.0.239 → 0.0.245

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 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