@quillsql/react 1.0.0

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 (272) hide show
  1. package/.eslintrc.json +19 -0
  2. package/.prettierrc +11 -0
  3. package/example/README.md +46 -0
  4. package/example/package-lock.json +12111 -0
  5. package/example/package.json +43 -0
  6. package/example/public/favicon.ico +0 -0
  7. package/example/public/index.html +43 -0
  8. package/example/public/logo192.png +0 -0
  9. package/example/public/logo512.png +0 -0
  10. package/example/public/manifest.json +25 -0
  11. package/example/public/robots.txt +3 -0
  12. package/example/src/App.css +38 -0
  13. package/example/src/App.test.tsx +9 -0
  14. package/example/src/App.tsx +46 -0
  15. package/example/src/index.css +13 -0
  16. package/example/src/index.tsx +19 -0
  17. package/example/src/logo.svg +1 -0
  18. package/example/src/react-app-env.d.ts +1 -0
  19. package/example/src/reportWebVitals.ts +15 -0
  20. package/example/src/setupTests.ts +5 -0
  21. package/example/tsconfig.json +26 -0
  22. package/lib/AppContext.d.ts +29 -0
  23. package/lib/AppContext.js +94 -0
  24. package/lib/AppContext.js.map +1 -0
  25. package/lib/BarList.d.ts +17 -0
  26. package/lib/BarList.js +81 -0
  27. package/lib/BarList.js.map +1 -0
  28. package/lib/Button.d.ts +26 -0
  29. package/lib/Button.js +151 -0
  30. package/lib/Button.js.map +1 -0
  31. package/lib/Chart.d.ts +26 -0
  32. package/lib/Chart.js +532 -0
  33. package/lib/Chart.js.map +1 -0
  34. package/lib/Context.d.ts +28 -0
  35. package/lib/Context.js +126 -0
  36. package/lib/Context.js.map +1 -0
  37. package/lib/ContextProvider.d.ts +28 -0
  38. package/lib/ContextProvider.js +93 -0
  39. package/lib/ContextProvider.js.map +1 -0
  40. package/lib/Dashboard.d.ts +9 -0
  41. package/lib/Dashboard.js +271 -0
  42. package/lib/Dashboard.js.map +1 -0
  43. package/lib/DateRangePicker/Calendar.d.ts +15 -0
  44. package/lib/DateRangePicker/Calendar.js +94 -0
  45. package/lib/DateRangePicker/Calendar.js.map +1 -0
  46. package/lib/DateRangePicker/DateRangePicker.d.ts +31 -0
  47. package/lib/DateRangePicker/DateRangePicker.js +105 -0
  48. package/lib/DateRangePicker/DateRangePicker.js.map +1 -0
  49. package/lib/DateRangePicker/DateRangePickerButton.d.ts +21 -0
  50. package/lib/DateRangePicker/DateRangePickerButton.js +39 -0
  51. package/lib/DateRangePicker/DateRangePickerButton.js.map +1 -0
  52. package/lib/DateRangePicker/dateRangePickerUtils.d.ts +13 -0
  53. package/lib/DateRangePicker/dateRangePickerUtils.js +313 -0
  54. package/lib/DateRangePicker/dateRangePickerUtils.js.map +1 -0
  55. package/lib/DateRangePicker/index.d.ts +2 -0
  56. package/lib/DateRangePicker/index.js +2 -0
  57. package/lib/DateRangePicker/index.js.map +1 -0
  58. package/lib/DateRangePicker.d.ts +32 -0
  59. package/lib/DateRangePicker.js +105 -0
  60. package/lib/DateRangePicker.js.map +1 -0
  61. package/lib/PieChart.d.ts +63 -0
  62. package/lib/PieChart.js +589 -0
  63. package/lib/PieChart.js.map +1 -0
  64. package/lib/QuillProvider.d.ts +13 -0
  65. package/lib/QuillProvider.js +19 -0
  66. package/lib/QuillProvider.js.map +1 -0
  67. package/lib/assets/ArrowDownHeadIcon.d.ts +5 -0
  68. package/lib/assets/ArrowDownHeadIcon.js +29 -0
  69. package/lib/assets/ArrowDownHeadIcon.js.map +1 -0
  70. package/lib/assets/ArrowDownIcon.d.ts +5 -0
  71. package/lib/assets/ArrowDownIcon.js +29 -0
  72. package/lib/assets/ArrowDownIcon.js.map +1 -0
  73. package/lib/assets/ArrowDownRightIcon.d.ts +5 -0
  74. package/lib/assets/ArrowDownRightIcon.js +29 -0
  75. package/lib/assets/ArrowDownRightIcon.js.map +1 -0
  76. package/lib/assets/ArrowLeftHeadIcon.d.ts +5 -0
  77. package/lib/assets/ArrowLeftHeadIcon.js +29 -0
  78. package/lib/assets/ArrowLeftHeadIcon.js.map +1 -0
  79. package/lib/assets/ArrowRightHeadIcon.d.ts +5 -0
  80. package/lib/assets/ArrowRightHeadIcon.js +29 -0
  81. package/lib/assets/ArrowRightHeadIcon.js.map +1 -0
  82. package/lib/assets/ArrowRightIcon.d.ts +5 -0
  83. package/lib/assets/ArrowRightIcon.js +29 -0
  84. package/lib/assets/ArrowRightIcon.js.map +1 -0
  85. package/lib/assets/ArrowUpHeadIcon.d.ts +5 -0
  86. package/lib/assets/ArrowUpHeadIcon.js +29 -0
  87. package/lib/assets/ArrowUpHeadIcon.js.map +1 -0
  88. package/lib/assets/ArrowUpIcon.d.ts +5 -0
  89. package/lib/assets/ArrowUpIcon.js +29 -0
  90. package/lib/assets/ArrowUpIcon.js.map +1 -0
  91. package/lib/assets/ArrowUpRightIcon.d.ts +5 -0
  92. package/lib/assets/ArrowUpRightIcon.js +29 -0
  93. package/lib/assets/ArrowUpRightIcon.js.map +1 -0
  94. package/lib/assets/CalendarIcon.d.ts +5 -0
  95. package/lib/assets/CalendarIcon.js +29 -0
  96. package/lib/assets/CalendarIcon.js.map +1 -0
  97. package/lib/assets/DoubleArrowLeftHeadIcon.d.ts +5 -0
  98. package/lib/assets/DoubleArrowLeftHeadIcon.js +29 -0
  99. package/lib/assets/DoubleArrowLeftHeadIcon.js.map +1 -0
  100. package/lib/assets/DoubleArrowRightHeadIcon.d.ts +5 -0
  101. package/lib/assets/DoubleArrowRightHeadIcon.js +29 -0
  102. package/lib/assets/DoubleArrowRightHeadIcon.js.map +1 -0
  103. package/lib/assets/ExclamationFilledIcon.d.ts +5 -0
  104. package/lib/assets/ExclamationFilledIcon.js +29 -0
  105. package/lib/assets/ExclamationFilledIcon.js.map +1 -0
  106. package/lib/assets/LoadingSpinner.d.ts +5 -0
  107. package/lib/assets/LoadingSpinner.js +29 -0
  108. package/lib/assets/LoadingSpinner.js.map +1 -0
  109. package/lib/assets/SearchIcon.d.ts +5 -0
  110. package/lib/assets/SearchIcon.js +29 -0
  111. package/lib/assets/SearchIcon.js.map +1 -0
  112. package/lib/assets/XCircleIcon.d.ts +5 -0
  113. package/lib/assets/XCircleIcon.js +29 -0
  114. package/lib/assets/XCircleIcon.js.map +1 -0
  115. package/lib/assets/index.d.ts +16 -0
  116. package/lib/assets/index.js +17 -0
  117. package/lib/assets/index.js.map +1 -0
  118. package/lib/components/Dropdown/Dropdown.d.ts +12 -0
  119. package/lib/components/Dropdown/Dropdown.js +60 -0
  120. package/lib/components/Dropdown/Dropdown.js.map +1 -0
  121. package/lib/components/Dropdown/DropdownItem.d.ts +8 -0
  122. package/lib/components/Dropdown/DropdownItem.js +54 -0
  123. package/lib/components/Dropdown/DropdownItem.js.map +1 -0
  124. package/lib/components/Dropdown/index.d.ts +2 -0
  125. package/lib/components/Dropdown/index.js +3 -0
  126. package/lib/components/Dropdown/index.js.map +1 -0
  127. package/lib/components/Modal/Dropdown/Dropdown.d.ts +12 -0
  128. package/lib/components/Modal/Dropdown/Dropdown.js +52 -0
  129. package/lib/components/Modal/Dropdown/Dropdown.js.map +1 -0
  130. package/lib/components/Modal/Dropdown/DropdownItem.d.ts +8 -0
  131. package/lib/components/Modal/Dropdown/DropdownItem.js +51 -0
  132. package/lib/components/Modal/Dropdown/DropdownItem.js.map +1 -0
  133. package/lib/components/Modal/Dropdown/index.d.ts +2 -0
  134. package/lib/components/Modal/Dropdown/index.js +3 -0
  135. package/lib/components/Modal/Dropdown/index.js.map +1 -0
  136. package/lib/components/Modal/Modal.d.ts +13 -0
  137. package/lib/components/Modal/Modal.js +71 -0
  138. package/lib/components/Modal/Modal.js.map +1 -0
  139. package/lib/components/Modal/index.d.ts +1 -0
  140. package/lib/components/Modal/index.js +2 -0
  141. package/lib/components/Modal/index.js.map +1 -0
  142. package/lib/components/selectUtils.d.ts +9 -0
  143. package/lib/components/selectUtils.js +37 -0
  144. package/lib/components/selectUtils.js.map +1 -0
  145. package/lib/contexts/BaseColorContext.d.ts +3 -0
  146. package/lib/contexts/BaseColorContext.js +5 -0
  147. package/lib/contexts/BaseColorContext.js.map +1 -0
  148. package/lib/contexts/HoveredValueContext.d.ts +7 -0
  149. package/lib/contexts/HoveredValueContext.js +6 -0
  150. package/lib/contexts/HoveredValueContext.js.map +1 -0
  151. package/lib/contexts/RootStylesContext.d.ts +3 -0
  152. package/lib/contexts/RootStylesContext.js +4 -0
  153. package/lib/contexts/RootStylesContext.js.map +1 -0
  154. package/lib/contexts/SelectedValueContext.d.ts +7 -0
  155. package/lib/contexts/SelectedValueContext.js +7 -0
  156. package/lib/contexts/SelectedValueContext.js.map +1 -0
  157. package/lib/contexts/index.d.ts +4 -0
  158. package/lib/contexts/index.js +5 -0
  159. package/lib/contexts/index.js.map +1 -0
  160. package/lib/hooks/index.d.ts +4 -0
  161. package/lib/hooks/index.js +5 -0
  162. package/lib/hooks/index.js.map +1 -0
  163. package/lib/hooks/useInternalState.d.ts +3 -0
  164. package/lib/hooks/useInternalState.js +15 -0
  165. package/lib/hooks/useInternalState.js.map +1 -0
  166. package/lib/hooks/useOnClickOutside.d.ts +2 -0
  167. package/lib/hooks/useOnClickOutside.js +19 -0
  168. package/lib/hooks/useOnClickOutside.js.map +1 -0
  169. package/lib/hooks/useOnWindowResize.d.ts +4 -0
  170. package/lib/hooks/useOnWindowResize.js +15 -0
  171. package/lib/hooks/useOnWindowResize.js.map +1 -0
  172. package/lib/hooks/useSelectOnKeyDown.d.ts +2 -0
  173. package/lib/hooks/useSelectOnKeyDown.js +64 -0
  174. package/lib/hooks/useSelectOnKeyDown.js.map +1 -0
  175. package/lib/index.d.ts +3 -0
  176. package/lib/index.js +5 -0
  177. package/lib/index.js.map +1 -0
  178. package/lib/lib/colorClassNames.d.ts +19 -0
  179. package/lib/lib/colorClassNames.js +3175 -0
  180. package/lib/lib/colorClassNames.js.map +1 -0
  181. package/lib/lib/constants.d.ts +16 -0
  182. package/lib/lib/constants.js +47 -0
  183. package/lib/lib/constants.js.map +1 -0
  184. package/lib/lib/font.d.ts +13 -0
  185. package/lib/lib/font.js +14 -0
  186. package/lib/lib/font.js.map +1 -0
  187. package/lib/lib/hexColors.d.ts +3 -0
  188. package/lib/lib/hexColors.js +29 -0
  189. package/lib/lib/hexColors.js.map +1 -0
  190. package/lib/lib/index.d.ts +10 -0
  191. package/lib/lib/index.js +11 -0
  192. package/lib/lib/index.js.map +1 -0
  193. package/lib/lib/inputTypes.d.ts +20 -0
  194. package/lib/lib/inputTypes.js +37 -0
  195. package/lib/lib/inputTypes.js.map +1 -0
  196. package/lib/lib/shape.d.ts +73 -0
  197. package/lib/lib/shape.js +74 -0
  198. package/lib/lib/shape.js.map +1 -0
  199. package/lib/lib/sizing.d.ts +46 -0
  200. package/lib/lib/sizing.js +43 -0
  201. package/lib/lib/sizing.js.map +1 -0
  202. package/lib/lib/spacing.d.ts +264 -0
  203. package/lib/lib/spacing.js +265 -0
  204. package/lib/lib/spacing.js.map +1 -0
  205. package/lib/lib/theme.d.ts +22 -0
  206. package/lib/lib/theme.js +46 -0
  207. package/lib/lib/theme.js.map +1 -0
  208. package/lib/lib/utils.d.ts +12 -0
  209. package/lib/lib/utils.js +69 -0
  210. package/lib/lib/utils.js.map +1 -0
  211. package/lib/styles.css +12019 -0
  212. package/package.json +48 -0
  213. package/postcss.config.js +6 -0
  214. package/src/BarList.tsx +236 -0
  215. package/src/Chart.tsx +934 -0
  216. package/src/Context.tsx +204 -0
  217. package/src/Dashboard.tsx +379 -0
  218. package/src/DateRangePicker/Calendar.tsx +425 -0
  219. package/src/DateRangePicker/DateRangePicker.tsx +251 -0
  220. package/src/DateRangePicker/DateRangePickerButton.tsx +176 -0
  221. package/src/DateRangePicker/dateRangePickerUtils.tsx +460 -0
  222. package/src/DateRangePicker/index.ts +3 -0
  223. package/src/PieChart.tsx +838 -0
  224. package/src/QuillProvider.tsx +28 -0
  225. package/src/assets/ArrowDownHeadIcon.tsx +11 -0
  226. package/src/assets/ArrowDownIcon.tsx +14 -0
  227. package/src/assets/ArrowDownRightIcon.tsx +14 -0
  228. package/src/assets/ArrowLeftHeadIcon.tsx +11 -0
  229. package/src/assets/ArrowRightHeadIcon.tsx +11 -0
  230. package/src/assets/ArrowRightIcon.tsx +14 -0
  231. package/src/assets/ArrowUpHeadIcon.tsx +11 -0
  232. package/src/assets/ArrowUpIcon.tsx +14 -0
  233. package/src/assets/ArrowUpRightIcon.tsx +14 -0
  234. package/src/assets/CalendarIcon.tsx +14 -0
  235. package/src/assets/DoubleArrowLeftHeadIcon.tsx +18 -0
  236. package/src/assets/DoubleArrowRightHeadIcon.tsx +20 -0
  237. package/src/assets/ExclamationFilledIcon.tsx +14 -0
  238. package/src/assets/LoadingSpinner.tsx +11 -0
  239. package/src/assets/SearchIcon.tsx +14 -0
  240. package/src/assets/XCircleIcon.tsx +14 -0
  241. package/src/assets/index.ts +16 -0
  242. package/src/components/Dropdown/Dropdown.tsx +179 -0
  243. package/src/components/Dropdown/DropdownItem.tsx +86 -0
  244. package/src/components/Dropdown/index.ts +2 -0
  245. package/src/components/Modal/Modal.tsx +113 -0
  246. package/src/components/Modal/index.ts +1 -0
  247. package/src/components/selectUtils.ts +67 -0
  248. package/src/contexts/BaseColorContext.tsx +8 -0
  249. package/src/contexts/HoveredValueContext.tsx +12 -0
  250. package/src/contexts/RootStylesContext.tsx +5 -0
  251. package/src/contexts/SelectedValueContext.tsx +13 -0
  252. package/src/contexts/index.ts +4 -0
  253. package/src/hooks/index.ts +4 -0
  254. package/src/hooks/useInternalState.tsx +18 -0
  255. package/src/hooks/useOnClickOutside.tsx +23 -0
  256. package/src/hooks/useOnWindowResize.tsx +17 -0
  257. package/src/hooks/useSelectOnKeyDown.tsx +80 -0
  258. package/src/index.ts +4 -0
  259. package/src/lib/colorClassNames.ts +3191 -0
  260. package/src/lib/constants.ts +52 -0
  261. package/src/lib/font.ts +14 -0
  262. package/src/lib/hexColors.ts +28 -0
  263. package/src/lib/index.ts +10 -0
  264. package/src/lib/inputTypes.ts +62 -0
  265. package/src/lib/shape.ts +75 -0
  266. package/src/lib/sizing.ts +47 -0
  267. package/src/lib/spacing.ts +264 -0
  268. package/src/lib/theme.ts +49 -0
  269. package/src/lib/utils.tsx +81 -0
  270. package/src/styles.css +5 -0
  271. package/tailwind.config.js +16 -0
  272. package/tsconfig.json +22 -0
package/src/Chart.tsx ADDED
@@ -0,0 +1,934 @@
1
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
2
+ // src/Button.tsx
3
+
4
+ import React, { useState, useEffect, useContext } from 'react';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import {
7
+ Card,
8
+ Text,
9
+ Metric,
10
+ Flex,
11
+ ProgressBar,
12
+ AreaChart,
13
+ } from '@tremor/react';
14
+ import {
15
+ Area,
16
+ CartesianGrid,
17
+ Legend,
18
+ ComposedChart as ReChartsAreaChart,
19
+ ResponsiveContainer,
20
+ Tooltip,
21
+ XAxis,
22
+ YAxis,
23
+ Bar,
24
+ BarChart as ReChartsBarChart,
25
+ } from 'recharts';
26
+ import { format } from 'date-fns';
27
+ import BarList from './BarList';
28
+ import PieChart, { findComplementaryAndAnalogousColors } from './PieChart';
29
+ import axios from 'axios';
30
+ import {
31
+ ClientContext,
32
+ DashboardContext,
33
+ DateFilterContext,
34
+ ThemeContext,
35
+ } from './Context';
36
+ import Skeleton from 'react-loading-skeleton';
37
+ import 'react-loading-skeleton/dist/skeleton.css';
38
+
39
+ const colorValues = [
40
+ 'slate',
41
+ 'gray',
42
+ 'zinc',
43
+ 'neutral',
44
+ 'stone',
45
+ 'red',
46
+ 'orange',
47
+ 'amber',
48
+ 'yellow',
49
+ 'lime',
50
+ 'green',
51
+ 'emerald',
52
+ 'teal',
53
+ 'cyan',
54
+ 'sky',
55
+ 'blue',
56
+ 'indigo',
57
+ 'violet',
58
+ 'purple',
59
+ 'fuchsia',
60
+ 'pink',
61
+ 'rose',
62
+ ] as const;
63
+
64
+ export type Color = (typeof colorValues)[number];
65
+
66
+ interface ButtonProps {
67
+ text: string;
68
+ onClick?: () => void;
69
+ className?: string;
70
+ }
71
+
72
+ // const data = [
73
+ // {
74
+ // date: 'Jan 22',
75
+ // SemiAnalysis: 2890,
76
+ // 'The Pragmatic Engineer': 2338,
77
+ // },
78
+ // {
79
+ // date: 'Feb 22',
80
+ // SemiAnalysis: 2756,
81
+ // 'The Pragmatic Engineer': 2103,
82
+ // },
83
+ // {
84
+ // date: 'Mar 22',
85
+ // SemiAnalysis: 3322,
86
+ // 'The Pragmatic Engineer': 2194,
87
+ // },
88
+ // {
89
+ // date: 'Apr 22',
90
+ // SemiAnalysis: 3470,
91
+ // 'The Pragmatic Engineer': 2108,
92
+ // },
93
+ // {
94
+ // date: 'May 22',
95
+ // SemiAnalysis: 3475,
96
+ // 'The Pragmatic Engineer': 1812,
97
+ // },
98
+ // {
99
+ // date: 'Jun 22',
100
+ // SemiAnalysis: 3129,
101
+ // 'The Pragmatic Engineer': 1726,
102
+ // },
103
+ // ];
104
+
105
+ const data = [
106
+ {
107
+ date_trunc: '2022-04-01T00:00:00.000Z',
108
+ avg_days: 17.8471360852448,
109
+ median_days: 7.36806134259259,
110
+ },
111
+ {
112
+ date_trunc: '2022-05-01T00:00:00.000Z',
113
+ avg_days: 17.4874354062884,
114
+ median_days: 7.9372337962963,
115
+ },
116
+ {
117
+ date_trunc: '2022-06-01T00:00:00.000Z',
118
+ avg_days: 18.240144813895,
119
+ median_days: 7.89506365740741,
120
+ },
121
+ {
122
+ date_trunc: '2022-07-01T00:00:00.000Z',
123
+ avg_days: 16.2354793525833,
124
+ median_days: 7.548125,
125
+ },
126
+ {
127
+ date_trunc: '2022-08-01T00:00:00.000Z',
128
+ avg_days: 13.2098485657861,
129
+ median_days: 5.95611111111111,
130
+ },
131
+ {
132
+ date_trunc: '2022-09-01T00:00:00.000Z',
133
+ avg_days: 19.5792522310747,
134
+ median_days: 7.37486111111111,
135
+ },
136
+ {
137
+ date_trunc: '2022-10-01T00:00:00.000Z',
138
+ avg_days: 27.538275364544,
139
+ median_days: 13.9421527777778,
140
+ },
141
+ {
142
+ date_trunc: '2022-11-01T00:00:00.000Z',
143
+ avg_days: 21.6456397342308,
144
+ median_days: 10.1523958333333,
145
+ },
146
+ {
147
+ date_trunc: '2022-12-01T00:00:00.000Z',
148
+ avg_days: 15.5662888454861,
149
+ median_days: 8.40572916666667,
150
+ },
151
+ {
152
+ date_trunc: '2023-01-01T00:00:00.000Z',
153
+ avg_days: 11.2846224012116,
154
+ median_days: 5.96854166666667,
155
+ },
156
+ {
157
+ date_trunc: '2023-02-01T00:00:00.000Z',
158
+ avg_days: 9.69899060044893,
159
+ median_days: 5.82388310185185,
160
+ },
161
+ {
162
+ date_trunc: '2023-03-01T00:00:00.000Z',
163
+ avg_days: 7.18273680555556,
164
+ median_days: 4.78365162037037,
165
+ },
166
+ ];
167
+
168
+ const valueFormatter = (number: number) => {
169
+ // const dollar = '$ ' + Intl.NumberFormat('us').format(number).toString();
170
+ // const final = number > 0 ? dollar.slice(0, -4) + 'k' : '';
171
+ // return final;
172
+ // return number.toFixed(0);
173
+ // return number;
174
+ const absNumber = Math.abs(number);
175
+ const formatter = new Intl.NumberFormat('en-US', {
176
+ style: 'currency',
177
+ currency: 'USD',
178
+ minimumFractionDigits: 0,
179
+ maximumFractionDigits: 0,
180
+ });
181
+
182
+ if (absNumber >= 1000000) {
183
+ return formatter.format(number / 1000000000).toString() + 'M';
184
+ } else if (absNumber >= 1000) {
185
+ return formatter.format(number / 1000).toString() + 'K';
186
+ } else {
187
+ return formatter.format(number).toString();
188
+ }
189
+ };
190
+
191
+ const yAxisFields = [
192
+ { field: 'avg_days', label: 'average days' },
193
+ { field: 'median_days', label: 'median days' },
194
+ ];
195
+
196
+ const labelFormatter = (name: string) => {
197
+ // return yAxisFields.filter(elem => elem.field === name)[0].label;
198
+ return name;
199
+ };
200
+
201
+ export const ChartTooltipFrame = ({
202
+ children,
203
+ }: {
204
+ children: React.ReactNode;
205
+ }) => (
206
+ <div
207
+ className="bg-white text-sm rounded-md border shadow-lg"
208
+ // className={twMerge(
209
+ // 'bg-white',
210
+ // 'font-normal',
211
+ // 'border-[12px]',
212
+ // 'border-[1px]',
213
+ // 'text-[#212121]'
214
+ // // boxShadow.lg
215
+ // )}
216
+ >
217
+ {children}
218
+ </div>
219
+ );
220
+
221
+ export interface ChartTooltipRowProps {
222
+ value: string;
223
+ name: string;
224
+ color: Color;
225
+ }
226
+
227
+ export const ChartTooltipRow = ({
228
+ value,
229
+ name,
230
+ color,
231
+ }: ChartTooltipRowProps) => (
232
+ <div className="flex items-center justify-between space-x-8">
233
+ <div className="flex items-center space-x-2">
234
+ <span
235
+ style={{ background: color, borderWidth: 2, borderColor: 'white' }}
236
+ className={twMerge(
237
+ // 'shrink-0',
238
+ // 'bg-black',
239
+ // 'bg-white',
240
+ // 'border-black',
241
+ // sizing.sm.height,
242
+ // sizing.sm.width,
243
+ 'h-3',
244
+ 'w-3',
245
+ 'shadow',
246
+ 'rounded-full'
247
+ // border.md.all,
248
+ // boxShadow.md
249
+ )}
250
+ />
251
+ <p
252
+ // className={twMerge(
253
+ // 'font-medium tabular-nums text-right whitespace-nowrap',
254
+ // 'text-[#212121] !important'
255
+ // )}
256
+ className="font-medium tabular-nums text-right whitespace-nowrap text-black"
257
+ >
258
+ {value}
259
+ </p>
260
+ </div>
261
+ <p
262
+ className={twMerge(
263
+ 'text-right whitespace-nowrap',
264
+ // getColorClassNames(DEFAULT_COLOR, colorPalette.text).textColor,
265
+ 'text-gray-500'
266
+ // fontWeight.sm
267
+ )}
268
+ >
269
+ {name}
270
+ </p>
271
+ </div>
272
+ );
273
+
274
+ export interface ChartTooltipProps {
275
+ active: boolean | undefined;
276
+ payload: any;
277
+ label: string;
278
+ colors: string[];
279
+ valueFormatter: any;
280
+ }
281
+
282
+ const ChartTooltip = ({
283
+ active,
284
+ payload,
285
+ label,
286
+ colors,
287
+ valueFormatter,
288
+ }: ChartTooltipProps) => {
289
+ if (active && payload) {
290
+ return (
291
+ <ChartTooltipFrame>
292
+ <div
293
+ className="flex flex-col py-2 px-4 border-b gray-200"
294
+ // className={
295
+ // twMerge()
296
+ // getColorClassNames(DEFAULT_COLOR, colorPalette.lightBorder)
297
+ // .borderColor,
298
+ // spacing.twoXl.paddingX,
299
+ // spacing.sm.paddingY,
300
+ // border.sm.bottom
301
+ // }
302
+ >
303
+ <p
304
+ style={{ textAlign: 'left' }}
305
+ className={twMerge(
306
+ 'text-elem',
307
+ 'text-black',
308
+ 'font-medium',
309
+ 'gray-700'
310
+ // getColorClassNames(DEFAULT_COLOR, colorPalette.darkText)
311
+ // .textColor,
312
+ // fontWeight.md
313
+ )}
314
+ >
315
+ {!isNaN(new Date(label))
316
+ ? format(new Date(label), 'MMM yyyy')
317
+ : label}
318
+ {/* {label} */}
319
+ </p>
320
+ </div>
321
+
322
+ <div
323
+ className="px-4 space-y-1 py-2 px-4"
324
+ // className={
325
+ // twMerge()
326
+ // spacing.twoXl.paddingX,
327
+ // spacing.sm.paddingY,
328
+ // 'space-y-1'
329
+ // }
330
+ >
331
+ {payload.map(
332
+ ({ value, name }: { value: number; name: string }, idx: number) => (
333
+ <ChartTooltipRow
334
+ key={`id-${idx}`}
335
+ value={valueFormatter(value)}
336
+ name={labelFormatter(name)}
337
+ // color={categoryColors.get(name) ?? BaseColors.Blue}
338
+ color={colors[idx]}
339
+ />
340
+ )
341
+ )}
342
+ </div>
343
+ </ChartTooltipFrame>
344
+ );
345
+ }
346
+ return null;
347
+ };
348
+
349
+ interface ChartProps {
350
+ colors: string[];
351
+ className?: any;
352
+ chartId?: string;
353
+ containerStyle?: React.CSSProperties;
354
+ dashboard: any;
355
+ dispatch: any;
356
+ client: any;
357
+ dateFilter?: any;
358
+ theme: any;
359
+ }
360
+
361
+ // @ts-ignore
362
+ function sumByKey(arr, key) {
363
+ // @ts-ignore
364
+ return arr.reduce((acc, cur) => {
365
+ const val = parseInt(cur[key], 10);
366
+ return isNaN(val) ? acc : acc + val;
367
+ }, 0);
368
+ }
369
+
370
+ const Chart = ({ chartId, colors, containerStyle }) => {
371
+ const { dispatch, dashboard } = useContext(DashboardContext);
372
+ const { dateFilter } = useContext(DateFilterContext);
373
+ const [client, _] = useContext(ClientContext);
374
+ const [theme] = useContext(ThemeContext);
375
+ return (
376
+ <ChartUpdater
377
+ dispatch={dispatch}
378
+ dashboard={dashboard}
379
+ dateFilter={dateFilter}
380
+ chartId={chartId}
381
+ containerStyle={containerStyle}
382
+ colors={colors}
383
+ client={client}
384
+ />
385
+ );
386
+ };
387
+
388
+ const ChartUpdater: React.FC<ChartProps> = ({
389
+ colors,
390
+ chartId,
391
+ className,
392
+ containerStyle,
393
+ dashboard,
394
+ dateFilter,
395
+ dispatch,
396
+ client,
397
+ theme,
398
+ }) => {
399
+ const [chartConfig, setChartConfig] = useState<any>(null);
400
+ const [loading, setLoading] = useState(true);
401
+
402
+ useEffect(() => {
403
+ if (!dateFilter.startDate && !dateFilter.endDate) {
404
+ return;
405
+ }
406
+
407
+ let isSubscribed = true;
408
+ async function getChartOptions(id: string) {
409
+ if (isSubscribed) {
410
+ if (
411
+ dashboard[id] &&
412
+ (dashboard[id].startDate === dateFilter.startDate ||
413
+ dashboard[id].endDate === dateFilter.endDate)
414
+ ) {
415
+ const {
416
+ xAxisField,
417
+ yAxisFields,
418
+ xAxisLabel,
419
+ yAxisLabel,
420
+ chartType,
421
+ rows,
422
+ startDate,
423
+ endDate,
424
+ } = dashboard[id];
425
+ setChartConfig({
426
+ xAxisField,
427
+ yAxisFields,
428
+ xAxisLabel,
429
+ yAxisLabel,
430
+ chartType,
431
+ rows,
432
+ startDate,
433
+ endDate,
434
+ });
435
+ setLoading(false);
436
+ return;
437
+ }
438
+ const { publicKey, customerId, authToken } = client;
439
+ // const resp = await axios.get(
440
+ // `https://quill-344421.uc.r.appspot.com/dashitem/${publicKey}/${customerId}/${chartId}/`,
441
+ // {
442
+ // headers: { Authorization: `Bearer ` },
443
+ // }
444
+ // );
445
+ const { startDate, endDate } = dateFilter;
446
+ setLoading(true);
447
+ const resp = await axios.get(
448
+ 'https://quill-344421.uc.r.appspot.com/item',
449
+ {
450
+ params: {
451
+ id: chartId,
452
+ orgId: customerId,
453
+ publicKey: publicKey,
454
+ startDate: startDate.toISOString(),
455
+ endDate: endDate.toISOString(),
456
+ },
457
+ }
458
+ );
459
+ const {
460
+ xAxisField,
461
+ yAxisFields,
462
+ xAxisLabel,
463
+ yAxisLabel,
464
+ chartType,
465
+ rows,
466
+ } = resp.data;
467
+ setChartConfig({
468
+ xAxisField,
469
+ yAxisFields,
470
+ xAxisLabel,
471
+ yAxisLabel,
472
+ chartType,
473
+ rows,
474
+ startDate,
475
+ endDate,
476
+ });
477
+ setLoading(false);
478
+ dispatch({ type: 'UPDATE_DASHBOARD_ITEM', id, data: resp.data });
479
+ }
480
+ }
481
+ if (
482
+ (chartId && !chartConfig) ||
483
+ (chartId &&
484
+ chartConfig &&
485
+ (chartConfig.startDate !== dateFilter.startDate ||
486
+ chartConfig.endDate !== dateFilter.endDate))
487
+ ) {
488
+ getChartOptions(chartId);
489
+ }
490
+ return () => {
491
+ isSubscribed = false;
492
+ };
493
+ }, [chartConfig, dateFilter]);
494
+
495
+ if (!chartConfig || loading) {
496
+ return (
497
+ <div className="flex flex-col flex-1 h-[100%]" style={containerStyle}>
498
+ <Skeleton
499
+ count={1}
500
+ height={containerStyle?.height}
501
+ borderRadius={8}
502
+ // highlightColor="#F7F7F8"
503
+ highlightColor="#FDFDFD"
504
+ // baseColor="#F3F4F6"
505
+ baseColor="#F9F9FA"
506
+ width={'calc(100% - 50px)'}
507
+ />
508
+ </div>
509
+ );
510
+ }
511
+
512
+ if (chartConfig?.chartType === 'pie') {
513
+ const { xAxisField, yAxisFields } = chartConfig;
514
+ return (
515
+ <PieChart
516
+ // @ts-ignore
517
+ containerStyle={containerStyle}
518
+ data={chartConfig.rows.map(row => {
519
+ return {
520
+ ...row,
521
+ count:
522
+ parseInt(row[yAxisFields[0].field]) /
523
+ sumByKey(chartConfig.rows, yAxisFields[0].field),
524
+ };
525
+ })}
526
+ category={yAxisFields[0].field}
527
+ index={xAxisField}
528
+ colors={colors}
529
+ />
530
+ );
531
+ }
532
+
533
+ if (chartConfig?.chartType === 'bar') {
534
+ // return <BarList color="#E6DEFC" />;
535
+ return (
536
+ <BarChart
537
+ colors={colors}
538
+ yAxisFields={chartConfig.yAxisFields}
539
+ // @ts-ignore
540
+ data={chartConfig.rows.map(row => {
541
+ const fieldKeys = chartConfig.yAxisFields.map(elem => elem.field);
542
+ const newRow = row;
543
+ for (const key of fieldKeys) {
544
+ newRow[key] = parseFloat(row[key]);
545
+ }
546
+ return newRow;
547
+ })}
548
+ xAxisField={chartConfig.xAxisField}
549
+ xAxisLabel={chartConfig.xAxisLabel}
550
+ containerStyle={containerStyle}
551
+ />
552
+ );
553
+ }
554
+
555
+ if (chartConfig?.chartType === 'metric') {
556
+ return (
557
+ <div
558
+ style={{
559
+ // fontFamily: theme.fontFamily,
560
+ fontSize: 32,
561
+ fontWeight: '600',
562
+ textOverflow: 'ellipsis',
563
+ margin: 0,
564
+ marginLeft: 0,
565
+ padding: 20,
566
+ whiteSpace: 'nowrap',
567
+ display: 'block',
568
+ maxWidth: '100%',
569
+ textAlign: 'left',
570
+ overflow: 'hidden',
571
+ height: '100%',
572
+ color: '#394150',
573
+ // background: 'red',
574
+ }}
575
+ className="flex flex-col text-xl"
576
+ >
577
+ {formatNumber(
578
+ chartConfig.rows[0][chartConfig.xAxisField],
579
+ chartConfig.xAxisLabel
580
+ )}
581
+ </div>
582
+ );
583
+ }
584
+
585
+ return (
586
+ <LineChart
587
+ colors={colors}
588
+ yAxisFields={chartConfig.yAxisFields}
589
+ // @ts-ignore
590
+ data={chartConfig.rows}
591
+ xAxisField={chartConfig.xAxisField}
592
+ xAxisLabel={chartConfig.xAxisLabel}
593
+ containerStyle={containerStyle}
594
+ />
595
+ );
596
+ };
597
+
598
+ function formatNumber(num, label) {
599
+ num = Number(num);
600
+ if (num < 1000) {
601
+ return num.toFixed(2) + ' ' + label;
602
+ }
603
+ if (num >= 1.0e6) {
604
+ return '$ ' + Math.round(num / 1.0e6).toLocaleString() + 'M';
605
+ } else {
606
+ return '$ ' + Math.round(num / 1.0e6).toLocaleString() + 'M';
607
+ }
608
+ }
609
+
610
+ // @ts-ignore
611
+ function getDomain(data, fields) {
612
+ // @ts-ignore
613
+ const fieldsArray = fields.map(elem => elem.field);
614
+ const [minValue, maxValue] = data.reduce(
615
+ // @ts-ignore
616
+ ([min, max], item) => [
617
+ // @ts-ignore
618
+ Math.min(min, ...fieldsArray.map(field => item[field])),
619
+ // @ts-ignore
620
+ Math.max(max, ...fieldsArray.map(field => item[field])),
621
+ ],
622
+ [Infinity, -Infinity]
623
+ );
624
+
625
+ const adjustedMin = Math.min(minValue, 0);
626
+ const padding = Math.round(0.2 * (maxValue - minValue));
627
+ const adjustedMax = maxValue + padding;
628
+
629
+ return [adjustedMin, adjustedMax];
630
+ }
631
+
632
+ function BarChart({
633
+ colors,
634
+ yAxisFields,
635
+ data,
636
+ containerStyle,
637
+ xAxisField,
638
+ xAxisLabel,
639
+ }: {
640
+ colors: string[];
641
+ yAxisFields: any[];
642
+ data: any[];
643
+ containerStyle?: React.CSSProperties;
644
+ xAxisField: string;
645
+ xAxisLabel: string;
646
+ }) {
647
+ const newColors = findComplementaryAndAnalogousColors(colors[0], colors[1]);
648
+ return (
649
+ <div style={containerStyle} className="flex flex-col flex-1 h-full w-full">
650
+ <ResponsiveContainer width="100%" height={'100%'}>
651
+ <ReChartsBarChart
652
+ data={data}
653
+ // stackOffset={'none'}
654
+ layout={'horizontal'}
655
+ >
656
+ <CartesianGrid
657
+ strokeDasharray="3 3"
658
+ horizontal={true}
659
+ vertical={false}
660
+ />
661
+
662
+ <YAxis
663
+ // width={56}
664
+ // width={30}
665
+ // textAnchor="start"
666
+ hide={false}
667
+ axisLine={false}
668
+ tickLine={false}
669
+ type="number"
670
+ // domain={getDomain(data, yAxisFields)}
671
+ // domain={[0, 150]}
672
+ tick={{ transform: 'translate(-3, 0)' }}
673
+ style={{
674
+ fontSize: '12px',
675
+ fontFamily: 'Inter; Helvetica',
676
+ }}
677
+ // tickFormatter={valueFormatter}
678
+ />
679
+ <XAxis
680
+ hide={false}
681
+ dataKey={xAxisField}
682
+ // interval="preserveStartEnd"
683
+ tick={{ transform: 'translate(0, 6)' }} //padding between labels and axis
684
+ style={{
685
+ fontSize: '12px',
686
+ // TODO: generalize
687
+ fontFamily: 'Inter; Helvetica',
688
+ marginTop: '20px',
689
+ }}
690
+ tickLine={false}
691
+ axisLine={false}
692
+ />
693
+ {/* <XAxis
694
+ hide={false}
695
+ dataKey={xAxisField}
696
+ interval="preserveStartEnd"
697
+ tick={{ transform: 'translate(0, 6)' }} //padding between labels and axis
698
+ style={{
699
+ fontSize: '12px',
700
+ // TODO: generalize
701
+ fontFamily: 'Inter; Helvetica',
702
+ marginTop: '20px',
703
+ }}
704
+ tickLine={false}
705
+ axisLine={false}
706
+ />
707
+ <YAxis
708
+ width={56}
709
+ hide={false}
710
+ axisLine={false}
711
+ tickLine={false}
712
+ type="number"
713
+ // domain={getDomain(data, yAxisFields)}
714
+ domain={[0, 5]}
715
+ tick={{ transform: 'translate(-3, 0)' }}
716
+ style={{
717
+ fontSize: '12px',
718
+ fontFamily: 'Inter; Helvetica',
719
+ }}
720
+ tickFormatter={valueFormatter}
721
+ /> */}
722
+ <Tooltip
723
+ wrapperStyle={{ outline: 'none' }}
724
+ isAnimationActive={false}
725
+ cursor={{ fill: '#d1d5db', opacity: '0.15' }}
726
+ content={({ active, payload, label }) => {
727
+ return (
728
+ <ChartTooltip
729
+ active={active}
730
+ payload={payload}
731
+ label={label}
732
+ valueFormatter={valueFormatter}
733
+ colors={newColors}
734
+ />
735
+ );
736
+ }}
737
+ position={{ y: 0 }}
738
+ />
739
+ {/* <Legend
740
+ verticalAlign="top"
741
+ height={100}
742
+ content={({ payload }) =>
743
+ ChartLegend({ payload }, categoryColors, setLegendHeight)
744
+ }
745
+ /> */}
746
+ {yAxisFields.map((elem, index) => (
747
+ <Bar
748
+ key={elem.field}
749
+ name={elem.label}
750
+ dataKey={elem.field}
751
+ type="linear"
752
+ // stackId={stack || relative ? "a" : undefined}
753
+ fill={newColors[index]}
754
+ // barSize={20}
755
+ isAnimationActive={true}
756
+ />
757
+ ))}
758
+ </ReChartsBarChart>
759
+ </ResponsiveContainer>
760
+ </div>
761
+ );
762
+ }
763
+
764
+ function LineChart({
765
+ colors,
766
+ yAxisFields,
767
+ data,
768
+ containerStyle,
769
+ xAxisField,
770
+ xAxisLabel,
771
+ }: {
772
+ colors: string[];
773
+ yAxisFields: any[];
774
+ data: any[];
775
+ containerStyle?: React.CSSProperties;
776
+ xAxisField: string;
777
+ xAxisLabel: string;
778
+ }) {
779
+ // console.log('CONTAINER: ', containerStyle);
780
+ if (!yAxisFields || !yAxisFields.length) {
781
+ return null;
782
+ }
783
+ return (
784
+ <div style={containerStyle} className="flex flex-col flex-1 h-full w-full">
785
+ <ResponsiveContainer width="100%" height={'100%'}>
786
+ <ReChartsAreaChart data={data}>
787
+ <CartesianGrid
788
+ strokeDasharray="3 3"
789
+ horizontal={true}
790
+ vertical={false}
791
+ />
792
+ <XAxis
793
+ // hide={!showXAxis}
794
+ dataKey={xAxisField}
795
+ tick={{ transform: 'translate(0, 6)' }}
796
+ // ticks={
797
+ // startEndOnly
798
+ // ? [data[0][index], data[data.length - 1][index]]
799
+ // : undefined
800
+ // }
801
+ style={{
802
+ fontSize: '12px',
803
+ fontFamily: 'Inter; Helvetica',
804
+ // color: '#6269E9',
805
+ }}
806
+ // interval="preserveStartEnd"
807
+ interval="preserveStartEnd"
808
+ // interval={0}
809
+ tickLine={false}
810
+ axisLine={false}
811
+ padding={{ left: 10, right: 10 }}
812
+ minTickGap={5}
813
+ tickFormatter={tick => format(new Date(tick), 'MMM yyyy')}
814
+ />
815
+ <YAxis
816
+ // textAnchor="left"
817
+ // tickMargin={0}
818
+ // width={56}
819
+ // width={30}
820
+ // hide={!showYAxis}
821
+ axisLine={false}
822
+ tickLine={false}
823
+ type="number"
824
+ // domain={yAxisDomain as AxisDomain}
825
+ domain={getDomain(data, yAxisFields)}
826
+ tick={{ transform: 'translate(-3, 0)' }}
827
+ style={{
828
+ fontSize: '12px',
829
+ fontFamily: 'Inter; Helvetica',
830
+ }}
831
+ tickFormatter={valueFormatter}
832
+ />
833
+ <Tooltip
834
+ wrapperStyle={{ outline: 'none' }}
835
+ isAnimationActive={false}
836
+ cursor={{ stroke: '#d1d5db', strokeWidth: 1 }}
837
+ content={({ active, payload, label }) => {
838
+ return (
839
+ <ChartTooltip
840
+ active={active}
841
+ payload={payload}
842
+ label={label}
843
+ valueFormatter={valueFormatter}
844
+ colors={colors}
845
+ />
846
+ );
847
+ }}
848
+ position={{ y: 0 }}
849
+ />
850
+ {/* <Legend
851
+ verticalAlign="top"
852
+ height={100}
853
+ content={({ payload }) =>
854
+ ChartLegend({ payload }, categoryColors, setLegendHeight)
855
+ }
856
+ /> */}
857
+
858
+ {/* <defs>
859
+ <linearGradient id={'colorUj'} x1="0" y1="0" x2="0" y2="1">
860
+ <stop offset="5%" stopColor={'#E14F62'} stopOpacity={0.4} />
861
+ <stop
862
+ offset="95%"
863
+ stopColor={'rgba(0,0,0,0)'}
864
+ stopOpacity={0}
865
+ />
866
+ </linearGradient>
867
+ </defs> */}
868
+
869
+ {yAxisFields.map((elem, index) => (
870
+ <defs key={`defs${elem}`}>
871
+ <linearGradient
872
+ id={`gradient${index}`}
873
+ x1="0"
874
+ y1="0"
875
+ x2="0"
876
+ y2="1"
877
+ >
878
+ <stop offset="5%" stopColor={colors[index]} stopOpacity={0.4} />
879
+ <stop
880
+ offset="95%"
881
+ stopColor={'rgba(0,0,0,0)'}
882
+ stopOpacity={0}
883
+ />
884
+ </linearGradient>
885
+ </defs>
886
+ ))}
887
+
888
+ {/* {categories.map(category => {
889
+ console.log('category: ', category);
890
+ return ( */}
891
+ {yAxisFields.map((elem, index) => (
892
+ <Area
893
+ key={elem.field}
894
+ name={elem.label}
895
+ type="linear"
896
+ dataKey={elem.field}
897
+ stroke={colors[index]}
898
+ // if hide area
899
+ // fill="transparent"
900
+ fill={`url(#gradient${index})`}
901
+ strokeWidth={2}
902
+ dot={false}
903
+ isAnimationActive={true}
904
+ />
905
+ ))}
906
+
907
+ {/* <Area
908
+ key="The Pragmatic Engineer"
909
+ name="The Pragmatic Engineer"
910
+ type="linear"
911
+ dataKey="The Pragmatic Engineer"
912
+ stroke={'#E14F62'}
913
+ fill={`url(#colorUj)`}
914
+ strokeWidth={2}
915
+ dot={false}
916
+ isAnimationActive={true}
917
+ /> */}
918
+ {/* <Bar
919
+ dataKey="The Pragmatic Engineer"
920
+ type="linear"
921
+ barSize={20}
922
+ isAnimationActive={true}
923
+ fill="#d958e5"
924
+ /> */}
925
+
926
+ {/* );
927
+ })} */}
928
+ </ReChartsAreaChart>
929
+ </ResponsiveContainer>
930
+ </div>
931
+ );
932
+ }
933
+
934
+ export default Chart;