@plotdb/chart 1.0.1 → 1.0.2

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 (164) hide show
  1. package/package.json +3 -1
  2. package/CHANGELOG.md +0 -29
  3. package/build +0 -45
  4. package/doc/charts.md +0 -58
  5. package/doc/config.md +0 -44
  6. package/doc/draft/chart.md +0 -146
  7. package/doc/draft/data.md +0 -8
  8. package/doc/draft/definition.md +0 -0
  9. package/doc/draft/events.md +0 -0
  10. package/doc/draft/filter.md +0 -0
  11. package/doc/draft/lifecycle.md +0 -89
  12. package/doc/spec.md +0 -89
  13. package/doc/todo.md +0 -27
  14. package/doc/utils/tip.md +0 -84
  15. package/src/data/en-US/category +0 -20
  16. package/src/data/en-US/fruit +0 -39
  17. package/src/data/en-US/movie +0 -125
  18. package/src/data/en-US/name +0 -58
  19. package/src/data/index.ls +0 -34
  20. package/src/data/zh-TW/category +0 -20
  21. package/src/data/zh-TW/fruits +0 -38
  22. package/src/data/zh-TW/movie +0 -125
  23. package/src/data/zh-TW/names +0 -105
  24. package/src/index.ls +0 -323
  25. package/src/index.styl +0 -6
  26. package/src/utils/axis.ls +0 -229
  27. package/src/utils/config.ls +0 -11
  28. package/src/utils/data.ls +0 -104
  29. package/src/utils/format.ls +0 -30
  30. package/src/utils/legend.ls +0 -134
  31. package/src/utils/legend.styl +0 -37
  32. package/src/utils/tint.ls +0 -66
  33. package/src/utils/tip.ls +0 -97
  34. package/web/src/pug/base.pug +0 -21
  35. package/web/src/pug/block/axis/0.0.1/index.ls +0 -32
  36. package/web/src/pug/block/axis/0.0.1/index.pug +0 -1
  37. package/web/src/pug/block/axis-bubble/0.0.1/index.ls +0 -137
  38. package/web/src/pug/block/axis-bubble/0.0.1/index.pug +0 -1
  39. package/web/src/pug/block/bar/0.0.1/index.ls +0 -270
  40. package/web/src/pug/block/bar/0.0.1/index.pug +0 -35
  41. package/web/src/pug/block/bar-list/0.0.1/index.ls +0 -81
  42. package/web/src/pug/block/bar-list/0.0.1/index.pug +0 -30
  43. package/web/src/pug/block/bar-race/0.0.1/index.ls +0 -79
  44. package/web/src/pug/block/bar-race/0.0.1/index.pug +0 -21
  45. package/web/src/pug/block/base/0.0.1/index.ls +0 -66
  46. package/web/src/pug/block/base/0.0.1/index.pug +0 -5
  47. package/web/src/pug/block/blank/0.0.1/index.ls +0 -21
  48. package/web/src/pug/block/blank/0.0.1/index.pug +0 -1
  49. package/web/src/pug/block/bubble/0.0.1/index.ls +0 -218
  50. package/web/src/pug/block/bubble/0.0.1/index.pug +0 -42
  51. package/web/src/pug/block/curve-bar/0.0.1/index.ls +0 -85
  52. package/web/src/pug/block/curve-bar/0.0.1/index.pug +0 -16
  53. package/web/src/pug/block/curve-bar/0.0.1/sample.js +0 -338
  54. package/web/src/pug/block/dumbbell/0.0.1/index.ls +0 -86
  55. package/web/src/pug/block/dumbbell/0.0.1/index.pug +0 -1
  56. package/web/src/pug/block/empty/0.0.1/index.ls +0 -28
  57. package/web/src/pug/block/empty/0.0.1/index.pug +0 -2
  58. package/web/src/pug/block/gauge/0.0.1/index.ls +0 -96
  59. package/web/src/pug/block/gauge/0.0.1/index.pug +0 -31
  60. package/web/src/pug/block/gauge/0.0.1/sample.js +0 -338
  61. package/web/src/pug/block/line/0.0.1/index.ls +0 -297
  62. package/web/src/pug/block/line/0.0.1/index.pug +0 -33
  63. package/web/src/pug/block/number/0.0.1/index.ls +0 -65
  64. package/web/src/pug/block/number/0.0.1/index.pug +0 -20
  65. package/web/src/pug/block/percent-list/0.0.1/index.ls +0 -161
  66. package/web/src/pug/block/percent-list/0.0.1/index.pug +0 -34
  67. package/web/src/pug/block/pie/0.0.1/index.ls +0 -121
  68. package/web/src/pug/block/pie/0.0.1/index.pug +0 -19
  69. package/web/src/pug/block/pie/0.0.1/sample.js +0 -338
  70. package/web/src/pug/block/pie-bubble/0.0.1/index.ls +0 -181
  71. package/web/src/pug/block/pie-bubble/0.0.1/index.pug +0 -40
  72. package/web/src/pug/block/radar/0.0.1/index.ls +0 -109
  73. package/web/src/pug/block/radar/0.0.1/index.pug +0 -1
  74. package/web/src/pug/block/radar/0.0.1/xx +0 -285
  75. package/web/src/pug/block/scatter/0.0.1/index.ls +0 -124
  76. package/web/src/pug/block/scatter/0.0.1/index.pug +0 -30
  77. package/web/src/pug/block/sheet/0.0.1/index.ls +0 -34
  78. package/web/src/pug/block/sheet/0.0.1/index.pug +0 -5
  79. package/web/src/pug/block/table/0.0.1/index.ls +0 -36
  80. package/web/src/pug/block/table/0.0.1/index.pug +0 -3
  81. package/web/src/pug/block/taiwancounty/0.0.1/index.ls +0 -70
  82. package/web/src/pug/block/taiwancounty/0.0.1/index.pug +0 -64
  83. package/web/src/pug/block/taiwantown/0.0.1/index.ls +0 -44
  84. package/web/src/pug/block/taiwantown/0.0.1/index.pug +0 -52
  85. package/web/src/pug/block/taiwanvillage/0.0.1/index.ls +0 -49
  86. package/web/src/pug/block/taiwanvillage/0.0.1/index.pug +0 -52
  87. package/web/src/pug/block/treemap/0.0.1/index.ls +0 -168
  88. package/web/src/pug/block/treemap/0.0.1/index.pug +0 -42
  89. package/web/src/pug/block/voronoi-treemap/0.0.1/index.ls +0 -170
  90. package/web/src/pug/block/voronoi-treemap/0.0.1/index.pug +0 -17
  91. package/web/src/pug/block/voronoi-treemap/0.0.1/sample.js +0 -241
  92. package/web/src/pug/block/wordcloud/0.0.1/index.ls +0 -57
  93. package/web/src/pug/block/wordcloud/0.0.1/index.pug +0 -1
  94. package/web/src/pug/block/worldmap/0.0.1/index.ls +0 -77
  95. package/web/src/pug/block/worldmap/0.0.1/index.pug +0 -12
  96. package/web/src/pug/index.ls +0 -72
  97. package/web/src/pug/index.pug +0 -51
  98. package/web/src/styl/index.styl +0 -6
  99. package/web/static/assets/block/cache.js +0 -4
  100. package/web/static/assets/custom-lib/d3/d3-array.v2.js +0 -1182
  101. package/web/static/assets/custom-lib/d3/d3-array.v2.min.js +0 -2
  102. package/web/static/assets/custom-lib/d3/d3-array.v3.js +0 -1273
  103. package/web/static/assets/custom-lib/d3/d3-array.v3.min.js +0 -1273
  104. package/web/static/assets/custom-lib/d3/d3-axis.v2.min.js +0 -2
  105. package/web/static/assets/custom-lib/d3/d3-brush.v2.min.js +0 -2
  106. package/web/static/assets/custom-lib/d3/d3-color.v2.min.js +0 -2
  107. package/web/static/assets/custom-lib/d3/d3-dispatch.v2.min.js +0 -2
  108. package/web/static/assets/custom-lib/d3/d3-drag.v2.min.js +0 -2
  109. package/web/static/assets/custom-lib/d3/d3-ease.v2.min.js +0 -2
  110. package/web/static/assets/custom-lib/d3/d3-force-boundary.v0.0.1.min.js +0 -2
  111. package/web/static/assets/custom-lib/d3/d3-force.v2.min.js +0 -2
  112. package/web/static/assets/custom-lib/d3/d3-format.v2.min.js +0 -2
  113. package/web/static/assets/custom-lib/d3/d3-geo.v2.js +0 -3127
  114. package/web/static/assets/custom-lib/d3/d3-geo.v2.min.js +0 -2
  115. package/web/static/assets/custom-lib/d3/d3-hierarchy.v2.min.js +0 -2
  116. package/web/static/assets/custom-lib/d3/d3-interpolate.v2.min.js +0 -2
  117. package/web/static/assets/custom-lib/d3/d3-path.v2.min.js +0 -2
  118. package/web/static/assets/custom-lib/d3/d3-quadtree.v2.min.js +0 -2
  119. package/web/static/assets/custom-lib/d3/d3-random.v2.min.js +0 -2
  120. package/web/static/assets/custom-lib/d3/d3-scale-chromatic.v1.min.js +0 -2
  121. package/web/static/assets/custom-lib/d3/d3-selection.v2.min.js +0 -2
  122. package/web/static/assets/custom-lib/d3/d3-shape.v2.min.js +0 -2
  123. package/web/static/assets/custom-lib/d3/d3-timer.v2.min.js +0 -2
  124. package/web/static/assets/custom-lib/d3/d3-transition.v2.min.js +0 -2
  125. package/web/static/assets/custom-lib/d3/d3.v4.js +0 -17178
  126. package/web/static/assets/custom-lib/d3/d3.v4.min.js +0 -2
  127. package/web/static/assets/custom-lib/d3/d3.v6.js +0 -19708
  128. package/web/static/assets/data/countrycode.json +0 -1
  129. package/web/static/assets/data/world-110m.json +0 -1
  130. package/web/static/assets/data/zh-to-alpha2.json +0 -1
  131. package/web/static/assets/img/fluid.svg +0 -16
  132. package/web/static/block/axis/0.0.1/index.html +0 -74
  133. package/web/static/block/axis-bubble/0.0.1/index.html +0 -217
  134. package/web/static/block/bar/0.0.1/index.html +0 -576
  135. package/web/static/block/bar-list/0.0.1/index.html +0 -226
  136. package/web/static/block/bar-race/0.0.1/index.html +0 -179
  137. package/web/static/block/base/0.0.1/index.html +0 -197
  138. package/web/static/block/blank/0.0.1/index.html +0 -37
  139. package/web/static/block/bubble/0.0.1/index.html +0 -422
  140. package/web/static/block/bubble/0.0.1/test.html +0 -0
  141. package/web/static/block/curve-bar/0.0.1/index.html +0 -143
  142. package/web/static/block/dumbbell/0.0.1/index.html +0 -173
  143. package/web/static/block/empty/0.0.1/index.html +0 -76
  144. package/web/static/block/gauge/0.0.1/index.html +0 -145
  145. package/web/static/block/line/0.0.1/index.html +0 -566
  146. package/web/static/block/number/0.0.1/index.html +0 -147
  147. package/web/static/block/percent-list/0.0.1/index.html +0 -311
  148. package/web/static/block/pie/0.0.1/index.html +0 -276
  149. package/web/static/block/pie-bubble/0.0.1/index.html +0 -353
  150. package/web/static/block/radar/0.0.1/index.html +0 -144
  151. package/web/static/block/scatter/0.0.1/index.html +0 -246
  152. package/web/static/block/sheet/0.0.1/index.html +0 -98
  153. package/web/static/block/table/0.0.1/index.html +0 -67
  154. package/web/static/block/taiwancounty/0.0.1/index.html +0 -197
  155. package/web/static/block/taiwantown/0.0.1/index.html +0 -205
  156. package/web/static/block/taiwanvillage/0.0.1/index.html +0 -215
  157. package/web/static/block/treemap/0.0.1/index.html +0 -355
  158. package/web/static/block/voronoi-treemap/0.0.1/index.html +0 -345
  159. package/web/static/block/wordcloud/0.0.1/index.html +0 -87
  160. package/web/static/block/worldmap/0.0.1/index.html +0 -202
  161. package/web/static/css/index.css +0 -6
  162. package/web/static/css/index.min.css +0 -1
  163. package/web/static/favicon.ico +0 -0
  164. package/web/static/index.html +0 -153
@@ -1,65 +0,0 @@
1
- module.exports =
2
- pkg:
3
- name: 'number', version: '0.0.1'
4
- extend: {name: "base", version: "0.0.1"}
5
- dependencies: []
6
-
7
- init: ({root, context, pubsub}) ->
8
- pubsub.fire \init, {mod: mod {context}} .then ~> it.0
9
-
10
- mod = ({context}) ->
11
- {d3,ldcolor,repeatString$,infinite} = context
12
- sample: ->
13
- raw: [{val: 12777216, name: "票房", unit: "新臺幣"}]
14
- binding:
15
- name: {key: \name}
16
- value: {key: \val, unit: '百萬元新臺幣'}
17
- config:
18
- enlarge: type: \boolean, default: false
19
- dimension:
20
- value: {type: \R, name: "value"}
21
- name: {type: \N, name: "name"}
22
- init: ->
23
- @n = Object.fromEntries <[number unit]>.map ~> [it, @layout.get-node(it)]
24
- @g = Object.fromEntries <[number unit]>.map ~> [it, d3.select(@layout.get-group it)]
25
- @g.number.append \text
26
- @g.unit.append \text
27
- @v = number: 0, unit: '', run: 0
28
-
29
- resize: ->
30
- [w,h] = [@box.width, @box.height]
31
- @size-rate = number: (@cfg.number-size-rate or 3), unit: (@cfg.unit-size-rate or 1)
32
- @v <<< do
33
- number: (@data.0 or {value: 0}).value
34
- unit: @binding.value.unit or (@data.0 or {unit: ''}).unit or ''
35
- @n.number
36
- ..style.fontSize = "#{@size-rate.number}em"
37
- ..textContent = @v.number
38
- @n.unit
39
- ..style.fontSize = \1em
40
- ..textContent = @v.unit
41
- @r = r = Object.fromEntries <[number unit]>.map ~> [it, (w / (@n[it]getBoundingClientRect!width or 1))]
42
- (if !@cfg.enlarge => <[number unit]> else <[unit]>).map ~> @r[it] = (r[it] <? 1)
43
- @n.number.style.fontSize = "#{@size-rate.number * r.number}em"
44
- @n.unit.style.fontSize = "#{@size-rate.unit * r.unit}em"
45
- @layout.update false
46
-
47
- tick: ->
48
- @g.number.select \text .text ~>
49
- @v.run = (@v.number - @v.run) * 0.1 + @v.run
50
- if @v.run == @v.number => @stop!
51
- return Math.round(@v.run)
52
-
53
- render: ->
54
- @g.number.select \text
55
- .attr \x, (@n.number.getBoundingClientRect!width / 2)
56
- .attr \font-size, "#{@size-rate.number * @r.number}em"
57
- .attr \font-weight, \bold
58
- .attr \dominant-baseline, \hanging
59
- .attr \text-anchor, \middle
60
- .text @v.run
61
- @g.unit.select \text
62
- .attr \font-size, "#{@size-rate.unit * @r.unit}em"
63
- .attr \dominant-baseline, \hanging
64
- .text @v.unit
65
- @start!
@@ -1,20 +0,0 @@
1
- div
2
- div(plug="layout")
3
- .pdl-layout
4
- div(data-type="layout")
5
- .pdl-cell(data-name="number")
6
- .pdl-cell(data-name="unit")
7
- div(data-type="render")
8
- style(type="text/css"): :stylus
9
- .pdl-layout > [data-type=layout]
10
- flex-direction: column
11
- display: flex
12
- align-items: center
13
- justify-content: center
14
- .pdl-cell
15
- line-height: 1em
16
- white-space: nowrap
17
- .pdl-cell[data-name=number]
18
- font-weight: bold
19
-
20
- script(type="@plotdb/block"): include:lsc index.ls
@@ -1,161 +0,0 @@
1
- module.exports =
2
- pkg:
3
- name: 'percent-list', version: '0.0.1'
4
- extend: {name: "base", version: "0.0.1"}
5
- dependencies: []
6
- i18n:
7
- "zh-TW": "other": "其它"
8
- init: ({root, context, pubsub, t}) ->
9
- pubsub.fire \init, mod: mod {context, t}
10
-
11
- mod = ({context, t}) ->
12
- {chart,d3,wrapSvgText,debounce} = context
13
- sample: ->
14
- raw: [
15
- "Bachchan Pandey", "The Good Maharaja", "Ramprasad Ki Tehrvi",
16
- "Madam Chief Minister", "Satya Sai Baba", "Lahore Confidential",
17
- "Sandeep Aur Pinky Faraar", "Silence... Can You Hear It?"
18
- "Hum Bhi Akele Tum Bhi Akele", "Radhe", "Shaadisthan",
19
- "Chandigarh Kare Aashiqui", "Gangubai Kathiawadi", "Attack",
20
- "The Battle of Bhima Koregaon", "Tadap", "Looop Lapeta"
21
- ].map (val) ~> {val: Math.random!, name: val}
22
- binding:
23
- name: {key: \name}
24
- value: {key: \val}
25
- config: {}
26
- dimension:
27
- value: {type: \R, name: "value", priority: 20}
28
- name: {type: \N, name: "name", priority: 10}
29
- init: ->
30
- @g =
31
- view: d3.select @layout.get-group \view
32
- link: d3.select @layout.get-group \link
33
- legend: d3.select @layout.get-group \legend
34
- @tint = tint = new chart.utils.tint!
35
- @scale =
36
- y: d3.scaleLinear!
37
- @layout.get-group \view .addEventListener \mousemove, (evt) ~>
38
- if !((n = evt.target) and n.nodeName.toLowerCase! == \rect) => return
39
- @idx = Array.from(n.parentNode.childNodes).indexOf(n)
40
- @render-debounced!
41
- @render-debounced = debounce 350, ~> @render!
42
-
43
- parse: ->
44
- @cfg.{}collapse.enabled = false
45
- @parsed = @data.map -> {} <<< it
46
- @parsed.sort (a,b) -> b.value - a.value
47
- if @cfg.collapse.enabled =>
48
- if @cfg.collapse.method == \count =>
49
- other = @parsed.splice(@cfg.collapse.threshold or 7)
50
- if other.length => @parsed.push {name: t("other"), value: other.reduce(((a,b) -> a + b.value),0)}
51
- else # == \percent
52
- [total,sum] = [@parsed.reduce(((a,b) -> a + b.value),0), 0]
53
- for idx from 0 til @parsed.length =>
54
- sum += @parsed[idx].value
55
- if (sum / total) > (@cfg.collapse.threshold or 0.75) => break
56
- other = @parsed.splice(idx + 1)
57
- if other.length => @parsed.push {name: t("other"), value: other.reduce(((a,b) -> a + b.value),0)}
58
- @tint.reset!
59
- @parsed.map ~> @tint.get(it.name or it._idx)
60
-
61
- offset = 0
62
- for i from 0 til @parsed.length =>
63
- ret = @parsed[i]
64
- ret.offset = offset
65
- offset += ret.value
66
- @total = offset or 1
67
-
68
- resize: ->
69
- @layout.update false
70
- node = @layout.get-node \legend
71
- node.textContent = ""
72
- @parsed.map ~>
73
- div = document.createElement \div
74
- p = (100 * (it.value / @total)).toFixed(1)
75
- div.textContent = it.text = "#{it.name} / #p%"
76
- node.appendChild div
77
-
78
- @nboxes = @parsed.map (d,i) ~> @layout.get-node \legend .childNodes[i] .getBoundingClientRect!
79
- @rbox = @layout.get-node \legend .getBoundingClientRect!
80
- @lbox = @layout.get-box \link
81
- box = @layout.get-box \view
82
- @layout.update false
83
- box = @layout.get-box \view
84
- [w,h] = [box.width, box.height]
85
- size = Math.min(w,h)
86
- @scale.y.range [0, box.height] .domain [0, @total]
87
- render: ->
88
- {total,cfg,layout,tint,scale,nboxes,rbox,lbox} = @
89
- if @cfg? and @cfg.palette => @tint.set(@cfg.palette.colors.map -> it.value or it)
90
- box = @layout.get-box \view
91
- offset = 0
92
- if (@idx?) and nboxes.length =>
93
- @idx = (@idx <? @nboxes.length - 1 >? 0)
94
- offset = nboxes[@idx]y - rbox.y
95
- last = nboxes[* - 1].y + nboxes[* - 1].height - rbox.y
96
- if last - offset < rbox.height => offset = last - rbox.height
97
-
98
- @g.view.selectAll \rect .data @parsed
99
- ..exit!remove!
100
- ..enter!append \rect
101
- @g.view.selectAll \rect
102
- ..attr \x, -> 0
103
- ..attr \y, (d,i) -> scale.y(d.offset)
104
- ..attr \width, -> box.width
105
- ..attr \height, (d,i) -> (scale.y(d.offset + d.value) - scale.y(d.offset) - 1) >? 1
106
- ..attr \fill, (d,i) ->
107
- return tint.get Math.ceil(((d.offset + d.value/2) / total) * 5)
108
- ret = tint.get 0, (((i % 3) - 1) / 5)
109
- if cfg.collapse.enabled =>
110
- nbox = nboxes[i]
111
- y1 = (nbox.y - rbox.y) + (nbox.height / 2)
112
- if y1 < rbox.height => return ret
113
- ret = ldcolor.hcl(ret)
114
- ret.c = ret.c * 0.1
115
- ret.l = ret.l * 1.1
116
- return ldcolor.web(ret)
117
- @g.legend.selectAll \g.label .data @parsed
118
- ..exit!remove!
119
- ..enter!append \g .attr \class, \label
120
- @g.legend.selectAll \g.label
121
- .each (d,i) ->
122
- if @_text != d.text =>
123
- @_text = d.text
124
- n = layout.get-node \legend .childNodes[i]
125
- ret = wrap-svg-text node: n, use-range: true
126
- @textContent = ""
127
- @appendChild ret
128
- .transition!duration 350
129
- .attr \opacity, (d,i) ->
130
- nbox = nboxes[i]
131
- y = nbox.y - rbox.y - offset
132
- if y < 0 or y > rbox.height - nbox.height/2 => 0 else 1
133
- .attr \transform, (d,i) ->
134
- nbox = nboxes[i]
135
- "translate(#{nbox.x - rbox.x}, #{nbox.y - rbox.y - offset})"
136
- @g.link.selectAll \path .data @parsed
137
- ..exit!remove!
138
- ..enter!append \path
139
- .attr \fill, \none
140
- .attr \stroke-width, 1
141
- @g.link.selectAll \path
142
- #.attr \stroke, cfg.line
143
- .attr \stroke, (d,i) ->
144
- return tint.get Math.ceil(((d.offset + d.value/2) / total) * 5)
145
- .transition!duration 350
146
- .attr \d, (d,i) ->
147
- x0 = 0
148
- x1 = lbox.width / 10
149
- x2 = 9 * lbox.width / 10
150
- x3 = lbox.width
151
- y0 = scale.y(d.offset + d.value / 2)
152
- nbox = nboxes[i]
153
- y1 = (nbox.y - rbox.y) + (nbox.height / 2) - offset
154
- if Math.abs(y1 - y0) < 2 => y1 = y0
155
- "M#x0 #y0 L#x1 #y0 L#x2 #y1 L#x3 #y1"
156
- .attr \opacity, (d,i) ->
157
- nbox = nboxes[i]
158
- y0 = scale.y(d.offset + d.value / 2)
159
- y1 = (nbox.y - rbox.y) + (nbox.height / 2) - offset
160
- if Math.abs(y1 - y0) < 2 => y1 = y0
161
- return if y1 > (rbox.height) or y1 < 0 => 0 else 1
@@ -1,34 +0,0 @@
1
- div
2
- div(plug="layout")
3
- .pdl-layout
4
- div(data-type="layout")
5
- .pdl-cell(data-name="view")
6
- .pdl-cell(data-name="link")
7
- .pdl-cell(data-name="legend")
8
- div(data-type="render")
9
- style(type="text/css"): :stylus
10
- .pdl-layout > div[data-type=layout]
11
- display: flex
12
- justify-content: center
13
- align-items: center
14
- padding: .5em
15
- & > [data-name=view]
16
- height: 100%
17
- min-width: 2.5em
18
- margin-right: .5em
19
- flex: 1 0 2.5em
20
- & > [data-name=link]
21
- height: 100%
22
- width: 2.5em
23
- margin-right: .5em
24
- flex: 0 0 auto
25
- & > [data-name=legend]
26
- flex: 1 0 auto
27
- width: fit-content
28
- max-width: 60%
29
- height: 100%
30
- display: flex
31
- flex-direction: column
32
- justify-content: start
33
- align-items: start
34
- script(type="@plotdb/block"): include:lsc index.ls
@@ -1,121 +0,0 @@
1
- module.exports =
2
- pkg:
3
- name: 'pie', version: '0.0.1'
4
- extend: {name: "base", version: "0.0.1"}
5
- dependencies: []
6
- i18n:
7
- "zh-TW":
8
- value: "數值"
9
- name: "名稱"
10
- other: "其它"
11
- init: ({root, context, pubsub, t}) ->
12
- pubsub.fire \init, mod: mod {context, t}
13
-
14
- mod = ({context, t}) ->
15
- {chart,d3} = context
16
- sample: ->
17
- raw: [1 to 5].map (val) ~> {val: (10 * Math.random!).toFixed(2), name: val}
18
- binding:
19
- name: {key: \name}
20
- value: {key: \val}
21
- config: {}
22
- dimension:
23
- value: {type: \R, name: "value", priority: 20}
24
- name: {type: \NO, name: "name", priority: 10}
25
- init: ->
26
- @g = Object.fromEntries <[view legend]>.map ~> [it, d3.select(@layout.get-group it).append \g]
27
- @tint = tint = new chart.utils.tint!
28
- @tip = new chart.utils.tip {
29
- root: @root
30
- accessor: ({evt}) ~>
31
- if !(evt.target and data = d3.select(evt.target).datum!) => return null
32
- v = if isNaN(data.value) => '-' else "#{(data.value).toFixed(2)}#{@binding.value.unit or ''}"
33
- return {name: data.name, value: v}
34
- range: ~> @layout.get-node \view .getBoundingClientRect!
35
- }
36
- @legend = new chart.utils.legend do
37
- layout: @layout
38
- name: 'legend'
39
- root: @root
40
- shape: (d) -> d3.select(@).attr \fill, tint.get d.text
41
- cfg: selectable: true
42
- @legend.on \select, ~> @bind!; @resize!; @render!
43
- @arc = d3.arc!
44
- .innerRadius 0
45
- .outerRadius 100
46
- .startAngle 0
47
- .endAngle(Math.PI / 2)
48
- @total = {}
49
-
50
- destroy: ->
51
- @tip.destroy!
52
-
53
- parse: ->
54
- @tint.reset!
55
- @parsed = @data.map ->
56
- ret = {} <<< it
57
- if isNaN(ret.value) => ret.value = 0
58
- ret
59
-
60
- @parsed.sort (a,b) -> b.value - a.value
61
- if @cfg.collapse? and @cfg.collapse.enabled =>
62
- if @cfg.collapse.method == \count =>
63
- other = @parsed.splice(@cfg.collapse.threshold or 7)
64
- if other.length => @parsed.push {name: t("other"), value: other.reduce(((a,b) -> a + b.value),0)}
65
- else # == \percent
66
- [total,sum] = [@parsed.reduce(((a,b) -> a + b.value),0), 0]
67
- for idx from 0 til @parsed.length =>
68
- sum += @parsed[idx].value
69
- if (sum / total) > (@cfg.collapse.threshold or 0.75) => break
70
- other = @parsed.splice(idx + 1)
71
- if other.length => @parsed.push {name: t("other"), value: other.reduce(((a,b) -> a + b.value),0)}
72
- @legend.data @parsed.map -> {text: it.name, key: it.name}
73
- bind: ->
74
- @parsed.map ~> it.picked = @legend.is-selected it.name
75
- @total.old = @total.cur
76
- @total.cur = @parsed.reduce(((a,b) -> a + (if b.picked => b.value else 0)),0) or 1
77
- if !@total.old => @total.old = @total.cur
78
-
79
- offset = 0
80
- for i from 0 til @parsed.length =>
81
- obj = @parsed[i]
82
- if !obj.old => obj.old = {s: (if @parsed[i - 1] => that.old.e else 0), e: 0}
83
- if obj.cur => obj.old = obj.cur
84
- obj.cur =
85
- s: offset
86
- e: offset + (if obj.picked => obj.value else 0)
87
- obj.angle =
88
- old: s: 2 * Math.PI * obj.old.s / @total.old, e: 2 * Math.PI * obj.old.e / @total.old
89
- cur: s: 2 * Math.PI * obj.cur.s / @total.cur, e: 2 * Math.PI * obj.cur.e / @total.cur
90
- if obj.picked => offset += obj.value
91
-
92
- resize: ->
93
- @layout.update false
94
- box = @layout.get-box \view
95
- @layout.get-node \view .style.width = "#{box.height}px"
96
- @layout.update false
97
- box = @layout.get-box \view
98
- [w,h] = [box.width, box.height]
99
- size = Math.min(w,h)
100
- @arc
101
- .innerRadius((@cfg.donut-percent or 0.7) * size/2)
102
- .outerRadius size/2
103
- render: ->
104
- {tint} = @
105
-
106
- interpolate-arc = (a1, a2) ~> (t) ~>
107
- [s,e] = <[s e]>.map (i) -> (a2[i] - a1[i]) * t + a1[i]
108
- @arc.startAngle s .endAngle e
109
- @arc!
110
-
111
- if @cfg? and @cfg.palette => @tint.set(@cfg.palette.colors.map -> it.value or it)
112
- box = @layout.get-box \view
113
- @g.view.attr \transform, "translate(#{box.width / 2},#{box.height / 2})"
114
- @g.view.selectAll \path.data .data(@parsed, -> it.name or it._idx)
115
- ..exit!remove!
116
- ..enter!append \path .attr \class, \data
117
- @g.view.selectAll \path.data
118
- .attr \fill, (d,i) ~> @tint.get(d.name or d._idx)
119
- .transition!duration 350
120
- .attrTween \d, (d,i) -> interpolate-arc d.angle.old, d.angle.cur
121
- @legend.render!
@@ -1,19 +0,0 @@
1
- div
2
- div(plug="layout")
3
- .pdl-layout
4
- div(data-type="layout")
5
- .pdl-cell(data-name="view")
6
- .pdl-cell(data-name="legend")
7
- div(data-type="render")
8
- style(type="text/css"): :stylus
9
- .pdl-layout > div[data-type=layout]
10
- display: flex
11
- justify-content: center
12
- align-items: center
13
- & > [data-name=view]
14
- height: 100%
15
- margin-right: 1em
16
- & > [data-name=legend]
17
- min-width: 6em
18
-
19
- script(type="@plotdb/block"): include:lsc index.ls