@aclymatepackages/modules 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 (45) hide show
  1. package/README.md +43 -0
  2. package/babel.config.json +18 -0
  3. package/dist/components/CompaniesAutocomplete.js +126 -0
  4. package/dist/components/CompanyOnboardingInput.js +116 -0
  5. package/dist/components/ComparisonChart.js +200 -0
  6. package/dist/components/CustomTooltipDisplayRow.js +59 -0
  7. package/dist/components/EmissionsChart.js +467 -0
  8. package/dist/components/EmissionsCustomTooltip.js +181 -0
  9. package/dist/components/EmissionsPieChart.js +130 -0
  10. package/dist/components/EmissionsReductionGraph.js +118 -0
  11. package/dist/components/FootprintEquivalencies.js +181 -0
  12. package/dist/components/FootprintVideo.js +262 -0
  13. package/dist/components/FuelTypesSelect.js +36 -0
  14. package/dist/components/IndustryAutocomplete.js +58 -0
  15. package/dist/components/PlacesAutocomplete.js +173 -0
  16. package/dist/components/StripeElements.js +95 -0
  17. package/dist/components/YesNoQuestion.js +88 -0
  18. package/dist/components/stripeInput.js +293 -0
  19. package/dist/components/useChartWarningLabels.js +143 -0
  20. package/dist/index.js +118 -0
  21. package/package.json +74 -0
  22. package/public/favicon.ico +0 -0
  23. package/public/index.html +43 -0
  24. package/public/logo192.png +0 -0
  25. package/public/logo512.png +0 -0
  26. package/public/manifest.json +25 -0
  27. package/public/robots.txt +3 -0
  28. package/src/components/CompaniesAutocomplete.js +125 -0
  29. package/src/components/CompanyOnboardingInput.js +113 -0
  30. package/src/components/ComparisonChart.js +236 -0
  31. package/src/components/CustomTooltipDisplayRow.js +41 -0
  32. package/src/components/EmissionsChart.js +579 -0
  33. package/src/components/EmissionsCustomTooltip.js +146 -0
  34. package/src/components/EmissionsPieChart.js +120 -0
  35. package/src/components/EmissionsReductionGraph.js +107 -0
  36. package/src/components/FootprintEquivalencies.js +203 -0
  37. package/src/components/FootprintVideo.js +328 -0
  38. package/src/components/FuelTypesSelect.js +29 -0
  39. package/src/components/IndustryAutocomplete.js +56 -0
  40. package/src/components/PlacesAutocomplete.js +174 -0
  41. package/src/components/StripeElements.js +95 -0
  42. package/src/components/YesNoQuestion.js +68 -0
  43. package/src/components/stripeInput.js +288 -0
  44. package/src/components/useChartWarningLabels.js +139 -0
  45. package/src/index.js +35 -0
@@ -0,0 +1,467 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.symbol.description.js");
4
+ require("core-js/modules/es.object.assign.js");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ require("core-js/modules/es.array.reduce.js");
10
+ require("core-js/modules/es.object.from-entries.js");
11
+ require("core-js/modules/web.dom-collections.iterator.js");
12
+ var _react = _interopRequireDefault(require("react"));
13
+ var _dayjs = _interopRequireDefault(require("dayjs"));
14
+ var _dayOfYear = _interopRequireDefault(require("dayjs/plugin/dayOfYear"));
15
+ var _recharts = require("recharts");
16
+ var _styles = require("@mui/styles");
17
+ var _material = require("@mui/material");
18
+ var _formatters = require("@aclymatepackages/formatters");
19
+ var _dateHelpers = require("@aclymatepackages/date-helpers");
20
+ var _constants = require("@aclymatepackages/constants");
21
+ var _otherHelpers = require("@aclymatepackages/other-helpers");
22
+ var _EmissionsCustomTooltip = _interopRequireDefault(require("./EmissionsCustomTooltip"));
23
+ var _useChartWarningLabels = _interopRequireDefault(require("./useChartWarningLabels"));
24
+ var _chartHelpers = require("@aclymatepackages/chart-helpers");
25
+ var _subcategories = require("@aclymatepackages/subcategories");
26
+ const _excluded = ["totalEmissionsSumTons"],
27
+ _excluded2 = ["subcategory", "color"];
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
30
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
31
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
32
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
33
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
34
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
35
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
36
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
37
+ _dayjs.default.extend(_dayOfYear.default);
38
+ const DAYS_IN_QUARTER = _constants.DAYS_PER_YEAR / 4;
39
+ const findObjectValuesSum = object => Object.values(object).reduce((sum, value) => sum + value, 0);
40
+ const findLabelDate = (period, label) => {
41
+ if (period === "quarter") {
42
+ return (0, _dateHelpers.findQuarterDate)(label);
43
+ }
44
+ if (period === "year") {
45
+ return (0, _dateHelpers.findYearFirstDate)(label);
46
+ }
47
+ return (0, _dayjs.default)(label, "MM-YY");
48
+ };
49
+ const isDateFirstDateOfPeriod = (date, period) => {
50
+ if (period === "quarter") {
51
+ const quarterFirstDate = (0, _dateHelpers.findQuarterDate)(date);
52
+ return (0, _dayjs.default)(date).isSame(quarterFirstDate, "day");
53
+ }
54
+ if (period === "year") {
55
+ const yearFirstDate = (0, _dateHelpers.findYearFirstDate)(date);
56
+ return (0, _dayjs.default)(date).isSame(yearFirstDate, "day");
57
+ }
58
+ return (0, _dayjs.default)(date).date() === 1;
59
+ };
60
+ const findIsEstimatedFirstDateLabel = _ref => {
61
+ let {
62
+ startDate,
63
+ earliestEmissionDate,
64
+ label,
65
+ period
66
+ } = _ref;
67
+ const labelDate = findLabelDate(period, label);
68
+ const labelStartDateDifference = (0, _dateHelpers.findInclusiveDateDifference)(labelDate, startDate, period);
69
+ const labelDateIsFirstOfPeriod = isDateFirstDateOfPeriod(earliestEmissionDate, period);
70
+ return labelStartDateDifference === 1 && !labelDateIsFirstOfPeriod;
71
+ };
72
+ const findIsFirstPeriodEstimated = (chartLabelsArray, period) => !chartLabelsArray.reduce((acc, label) => acc && !findIsEstimatedFirstDateLabel({
73
+ label,
74
+ period
75
+ }), true);
76
+ const findIsDataProjected = latestEmissionDate => {
77
+ if (!(0, _dayjs.default)(latestEmissionDate).isSame((0, _dayjs.default)(), "month")) {
78
+ return false;
79
+ }
80
+ return (0, _dayjs.default)(latestEmissionDate).date() !== (0, _dayjs.default)().daysInMonth();
81
+ };
82
+ const findProjectedSubcategoryValueFromEmissions = _ref2 => {
83
+ let {
84
+ emissions,
85
+ projectionMultiplier
86
+ } = _ref2;
87
+ return subcategory => {
88
+ const recurringSubcategoryEmissionsSum = (0, _chartHelpers.sumEmissionsTonsBySubcategory)(emissions, subcategory);
89
+ return projectionMultiplier * recurringSubcategoryEmissionsSum;
90
+ };
91
+ };
92
+ const buildSubcategoriesProjectionObj = (emissions, projectionMultiplier) => {
93
+ const findProjectedSubcategoryValue = findProjectedSubcategoryValueFromEmissions({
94
+ emissions,
95
+ projectionMultiplier
96
+ });
97
+ return {
98
+ "commuting-auto_projected": findProjectedSubcategoryValue("commuting-auto"),
99
+ "home-office_projected": findProjectedSubcategoryValue("home-office"),
100
+ utilities_projected: findProjectedSubcategoryValue("utilities")
101
+ };
102
+ };
103
+ const buildScopesProjectionObj = (emissions, projectionMultiplier) => {
104
+ const findProjectedSubcategoryValue = findProjectedSubcategoryValueFromEmissions({
105
+ emissions,
106
+ projectionMultiplier
107
+ });
108
+ const projectedCommutingEmissionsTons = findProjectedSubcategoryValue("commuting-auto");
109
+ const projectedHomeOfficeEmissionsTons = findProjectedSubcategoryValue("homeOffice");
110
+ const projectedElectricityEmissionsTons = findProjectedSubcategoryValue("electricity");
111
+ const projectedGasEmissionsTons = findProjectedSubcategoryValue("gas");
112
+ return {
113
+ scope1_projected: projectedGasEmissionsTons,
114
+ scope2_projected: projectedElectricityEmissionsTons,
115
+ scope3_projected: projectedHomeOfficeEmissionsTons + projectedCommutingEmissionsTons
116
+ };
117
+ };
118
+ const buildGroupedChartData = _ref3 => {
119
+ let {
120
+ startDate = "",
121
+ period,
122
+ isDataProjected,
123
+ isFirstPeriodEstimated,
124
+ groupedEmissions,
125
+ buildProjectionObj,
126
+ buildRealDataObj,
127
+ showProjection
128
+ } = _ref3;
129
+ const findPeriodPosition = idx => {
130
+ if (!idx) {
131
+ return "first";
132
+ }
133
+ if (idx === groupedEmissions.length - 1) {
134
+ return "last";
135
+ }
136
+ return "middle";
137
+ };
138
+ const forwardProjectionPeriodFraction = period => {
139
+ if (period === "month") {
140
+ const daysInMonth = (0, _dayjs.default)().daysInMonth();
141
+ return (0, _dayjs.default)().date() / daysInMonth;
142
+ }
143
+ if (period === "quarter") {
144
+ const firstDayInQuarter = (0, _dateHelpers.findQuarterDate)((0, _dayjs.default)());
145
+ const currentDaysIntoQuarter = (0, _dayjs.default)().diff(firstDayInQuarter, "day");
146
+ return currentDaysIntoQuarter / DAYS_IN_QUARTER;
147
+ }
148
+ const currentDaysIntoYear = (0, _dayjs.default)().dayOfYear();
149
+ return currentDaysIntoYear / _constants.DAYS_PER_YEAR;
150
+ };
151
+ const backwardsProjectionPeriodFraction = period => {
152
+ const formattedStartDate = (0, _dayjs.default)(startDate);
153
+ if (period === "month") {
154
+ const daysInMonth = formattedStartDate.daysInMonth();
155
+ const daysFromEndOfMonth = daysInMonth - formattedStartDate.date();
156
+ return daysFromEndOfMonth / daysInMonth;
157
+ }
158
+ if (period === "quarter") {
159
+ const lastDateInQuarter = (0, _dateHelpers.findQuarterDate)(startDate, false);
160
+ const daysFromEndOfQuarter = Math.abs(formattedStartDate.diff(lastDateInQuarter, "day")) + 1;
161
+ return daysFromEndOfQuarter / DAYS_IN_QUARTER;
162
+ }
163
+ const daysFromEndOfYear = Math.abs(formattedStartDate.diff((0, _dayjs.default)(new Date(formattedStartDate.year(), 12, 31)), "day"));
164
+ return daysFromEndOfYear / _constants.DAYS_PER_YEAR;
165
+ };
166
+ const findPeriodProjectionMultiplier = _ref4 => {
167
+ let {
168
+ period,
169
+ position
170
+ } = _ref4;
171
+ if (!showProjection || position === "middle" || position === "first" && !isFirstPeriodEstimated || position === "last" && !isDataProjected) {
172
+ return 0;
173
+ }
174
+
175
+ //TODO: -UPDATE: this projection function doesn't take into account closed offices or terminated employee, so we probably need to rethink it
176
+ const projectionFraction = position === "first" ? backwardsProjectionPeriodFraction(period) : forwardProjectionPeriodFraction(period);
177
+ return 1 / projectionFraction - 1;
178
+ };
179
+ return groupedEmissions.map((emissionsArray, idx) => {
180
+ const position = findPeriodPosition(idx, groupedEmissions);
181
+ const projectionMultiplier = findPeriodProjectionMultiplier({
182
+ startDate,
183
+ position,
184
+ period,
185
+ isDataProjected,
186
+ isFirstPeriodEstimated
187
+ });
188
+ const projectedCategoriesObj = buildProjectionObj(emissionsArray, projectionMultiplier);
189
+ const subcategoriesObj = buildRealDataObj(emissionsArray, _subcategories.allSubcategoriesWithOther);
190
+ const chartCategoriesObj = _objectSpread(_objectSpread({}, projectedCategoriesObj), subcategoriesObj);
191
+ const buildWarningObj = () => {
192
+ const singleEmissionWarning = emissionsArray.find(_ref5 => {
193
+ let {
194
+ warning
195
+ } = _ref5;
196
+ return !!warning;
197
+ });
198
+ if (!singleEmissionWarning) {
199
+ return null;
200
+ }
201
+ const {
202
+ warning
203
+ } = singleEmissionWarning;
204
+ return warning;
205
+ };
206
+ return _objectSpread(_objectSpread({}, chartCategoriesObj), {}, {
207
+ warning: buildWarningObj(),
208
+ id: "emissions-chart-group-".concat(idx),
209
+ emissionsSumTons: (0, _otherHelpers.sumTonsCo2e)(emissionsArray),
210
+ totalEmissionsSumTons: findObjectValuesSum(chartCategoriesObj),
211
+ projectedEmissionsSumTons: findObjectValuesSum(projectedCategoriesObj)
212
+ });
213
+ });
214
+ };
215
+ const addTrendlineToChartData = chartData => {
216
+ const averageX = (chartData.length - 1) / 2;
217
+ const averageY = chartData.reduce((sum, _ref6) => {
218
+ let {
219
+ totalEmissionsSumTons
220
+ } = _ref6;
221
+ return Number(sum) + Number(totalEmissionsSumTons);
222
+ }, 0) / chartData.length;
223
+ const trendLineCalcData = chartData.map((_ref7, idx) => {
224
+ let {
225
+ totalEmissionsSumTons
226
+ } = _ref7;
227
+ const xDifferenceFromMean = idx - averageX;
228
+ const yDifferenceFromMean = totalEmissionsSumTons - averageY;
229
+ const xDifferenceSquared = xDifferenceFromMean * xDifferenceFromMean;
230
+ const xyDifferenceFromMean = xDifferenceFromMean * yDifferenceFromMean;
231
+ return {
232
+ xDifferenceSquared,
233
+ xyDifferenceFromMean
234
+ };
235
+ });
236
+ const xDifferenceSquaredSum = trendLineCalcData.reduce((sum, _ref8) => {
237
+ let {
238
+ xDifferenceSquared
239
+ } = _ref8;
240
+ return sum + xDifferenceSquared;
241
+ }, 0);
242
+ const xyDifferenceFromMeanSum = trendLineCalcData.reduce((sum, _ref9) => {
243
+ let {
244
+ xyDifferenceFromMean
245
+ } = _ref9;
246
+ return sum + xyDifferenceFromMean;
247
+ }, 0);
248
+ const trendlineSlope = xyDifferenceFromMeanSum / xDifferenceSquaredSum;
249
+ const trendlineIntercept = averageY - trendlineSlope * averageX;
250
+ const findTrendlineValue = x => trendlineSlope * x + trendlineIntercept;
251
+ return chartData.map((_ref10, idx) => {
252
+ let {
253
+ totalEmissionsSumTons
254
+ } = _ref10,
255
+ otherProps = _objectWithoutProperties(_ref10, _excluded);
256
+ return _objectSpread(_objectSpread({}, otherProps), {}, {
257
+ trendline: findTrendlineValue(idx)
258
+ });
259
+ });
260
+ };
261
+ const LabeledEmissionsChart = _ref11 => {
262
+ var _data$, _data;
263
+ let {
264
+ data,
265
+ chartRef,
266
+ type,
267
+ displayUnitLabel,
268
+ chartArray,
269
+ aspect = 3,
270
+ showTooltip = true
271
+ } = _ref11;
272
+ const {
273
+ palette
274
+ } = (0, _styles.useTheme)();
275
+ const {
276
+ warningLabels,
277
+ labelSetter
278
+ } = (0, _useChartWarningLabels.default)({
279
+ data,
280
+ warningField: "warning",
281
+ barSumField: "totalEmissionsSumTons"
282
+ });
283
+ const isTrendLineGood = ((_data$ = data[0]) === null || _data$ === void 0 ? void 0 : _data$.trendLine) > ((_data = data[data.length - 1]) === null || _data === void 0 ? void 0 : _data.trendLine);
284
+ const ChartElement = type === "bar" ? _recharts.Bar : _recharts.Area;
285
+ return /*#__PURE__*/_react.default.createElement(_material.Box, {
286
+ position: "relative"
287
+ }, /*#__PURE__*/_react.default.createElement(_recharts.ResponsiveContainer, {
288
+ aspect: aspect
289
+ }, /*#__PURE__*/_react.default.createElement(_recharts.ComposedChart, {
290
+ width: 500,
291
+ height: 300,
292
+ data: data,
293
+ ref: chartRef
294
+ }, /*#__PURE__*/_react.default.createElement(_recharts.XAxis, {
295
+ dataKey: "label",
296
+ interval: "preserveStartEnd",
297
+ height: 20
298
+ }), /*#__PURE__*/_react.default.createElement(_recharts.YAxis, {
299
+ tickFormatter: tick => "".concat((0, _formatters.formatDecimal)(tick), " ").concat(displayUnitLabel),
300
+ width: 100
301
+ }), /*#__PURE__*/_react.default.createElement(_recharts.CartesianGrid, {
302
+ strokeDasharray: "3 3"
303
+ }), showTooltip && /*#__PURE__*/_react.default.createElement(_recharts.Tooltip, {
304
+ wrapperStyle: {
305
+ zIndex: 99
306
+ },
307
+ content: /*#__PURE__*/_react.default.createElement(_EmissionsCustomTooltip.default, {
308
+ categoriesArray: chartArray,
309
+ displayUnitLabel: displayUnitLabel
310
+ })
311
+ }), chartArray.map(_ref12 => {
312
+ let {
313
+ subcategory,
314
+ color
315
+ } = _ref12,
316
+ otherProps = _objectWithoutProperties(_ref12, _excluded2);
317
+ return /*#__PURE__*/_react.default.createElement(ChartElement, _extends({
318
+ key: "emissions-chart-element-".concat(subcategory),
319
+ type: "monotone",
320
+ stroke: "none",
321
+ fillOpacity: 1,
322
+ stackId: "a",
323
+ fill: color,
324
+ dataKey: subcategory
325
+ }, otherProps), labelSetter);
326
+ }), /*#__PURE__*/_react.default.createElement(_recharts.Line, {
327
+ name: "6 Month Trend",
328
+ connectNulls: true,
329
+ dataKey: "trendline",
330
+ stroke: isTrendLineGood ? palette.secondary.main : palette.error.main,
331
+ strokeWidth: 4,
332
+ dot: false,
333
+ strokeDasharray: "5 5"
334
+ }))), warningLabels);
335
+ };
336
+ const EmissionsChart = _ref13 => {
337
+ let {
338
+ dataArray: emissions,
339
+ type,
340
+ viewMode = "subcategories",
341
+ graphPeriod,
342
+ chartRef,
343
+ showTrendline,
344
+ showProjection,
345
+ displayUnit,
346
+ unitConverter,
347
+ aspect,
348
+ isPercentageChart,
349
+ showTooltip,
350
+ startDate,
351
+ convertCarbonUnits,
352
+ displayUnitLabel
353
+ } = _ref13;
354
+ const {
355
+ chartLabelsArray,
356
+ latestEmissionDate,
357
+ scopesArray,
358
+ subcategoriesArray,
359
+ period,
360
+ groupedEmissions
361
+ } = (0, _chartHelpers.buildEmissionGroupData)(emissions, graphPeriod, startDate);
362
+ const isDataProjected = findIsDataProjected(latestEmissionDate);
363
+ const isFirstPeriodEstimated = findIsFirstPeriodEstimated(chartLabelsArray, graphPeriod);
364
+ const buildProjectionObj = viewMode === "subcategories" ? buildSubcategoriesProjectionObj : buildScopesProjectionObj;
365
+ const buildRealDataObj = viewMode === "subcategories" ? _chartHelpers.buildSubcategoriesDataObj : _chartHelpers.buildScopesRealDataObj;
366
+ const buildChartData = () => {
367
+ const preliminaryChartData = buildGroupedChartData({
368
+ startDate,
369
+ period,
370
+ isDataProjected,
371
+ isFirstPeriodEstimated,
372
+ groupedEmissions,
373
+ buildProjectionObj,
374
+ buildRealDataObj,
375
+ showProjection
376
+ });
377
+ const formattedLabels = chartLabelsArray.map((label, idx) => {
378
+ if (idx === chartLabelsArray.length - 1 && isDataProjected) {
379
+ return "".concat(label, "*");
380
+ }
381
+ if (idx || !isFirstPeriodEstimated) {
382
+ return label;
383
+ }
384
+ return "".concat(label, "**");
385
+ });
386
+ const convertChartDataObject = (chartDataObj, converter) => Object.fromEntries(Object.entries(chartDataObj).map(_ref14 => {
387
+ let [key, value] = _ref14;
388
+ if (typeof value !== "number") {
389
+ return [key, value];
390
+ }
391
+ return [key, converter(value)];
392
+ }));
393
+ const labelChartData = chartData => chartData.map((data, idx) => _objectSpread(_objectSpread({}, data), {}, {
394
+ label: formattedLabels[idx]
395
+ }));
396
+ if (isPercentageChart) {
397
+ const percentageConvertedChartData = preliminaryChartData.map(chartDataObj => {
398
+ const objectSubcategoryProperties = Object.keys(chartDataObj).filter(key => _subcategories.subcategories.find(_ref15 => {
399
+ let {
400
+ subcategory
401
+ } = _ref15;
402
+ return subcategory === key;
403
+ }));
404
+ const objectSubcategoryValues = objectSubcategoryProperties.map(subcategory => ({
405
+ key: subcategory,
406
+ value: chartDataObj[subcategory]
407
+ }));
408
+ const periodEmissionsSum = objectSubcategoryValues.reduce((sum, _ref16) => {
409
+ let {
410
+ value
411
+ } = _ref16;
412
+ return value + sum;
413
+ }, 0);
414
+ const percentageConverter = value => value / periodEmissionsSum * 100;
415
+ const newObject = Object.fromEntries(objectSubcategoryValues.map(_ref17 => {
416
+ let {
417
+ key,
418
+ value
419
+ } = _ref17;
420
+ return [key, value];
421
+ }));
422
+ return convertChartDataObject(newObject, percentageConverter);
423
+ });
424
+ return labelChartData(percentageConvertedChartData);
425
+ }
426
+ const unitConvertedChartData = preliminaryChartData.map(chartDataObj => convertChartDataObject(chartDataObj, value => unitConverter ? unitConverter(value) : convertCarbonUnits(value)));
427
+ const labeledChartData = labelChartData(unitConvertedChartData);
428
+ if (showTrendline) {
429
+ return addTrendlineToChartData(labeledChartData);
430
+ }
431
+ return labeledChartData;
432
+ };
433
+ const chartData = buildChartData();
434
+ const chartArray = viewMode === "scopes" ? scopesArray : subcategoriesArray;
435
+ return /*#__PURE__*/_react.default.createElement(_material.Grid, {
436
+ container: true,
437
+ direction: "column"
438
+ }, /*#__PURE__*/_react.default.createElement(_material.Grid, {
439
+ item: true
440
+ }, /*#__PURE__*/_react.default.createElement(LabeledEmissionsChart, {
441
+ data: chartData,
442
+ chartRef: chartRef,
443
+ type: type,
444
+ displayUnitLabel: isPercentageChart ? "%" : displayUnit || displayUnitLabel,
445
+ chartArray: chartArray,
446
+ aspect: aspect,
447
+ showTooltip: showTooltip
448
+ })), (isDataProjected || isFirstPeriodEstimated) && /*#__PURE__*/_react.default.createElement(_material.Grid, {
449
+ item: true,
450
+ container: true,
451
+ justifyContent: "flex-end"
452
+ }, /*#__PURE__*/_react.default.createElement(_material.Grid, {
453
+ item: true
454
+ }, isDataProjected && showProjection && /*#__PURE__*/_react.default.createElement(_material.Typography, {
455
+ variant: "caption",
456
+ color: "textSecondary",
457
+ display: "block",
458
+ align: "right"
459
+ }, "*Data in the most recent period is projected since this period isn't complete yet."), isFirstPeriodEstimated && showProjection && /*#__PURE__*/_react.default.createElement(_material.Typography, {
460
+ variant: "caption",
461
+ color: "textSecondary",
462
+ display: "block",
463
+ align: "right"
464
+ }, "**Data in the first period is estimated since your start date is in the middle of this period."))));
465
+ };
466
+ var _default = EmissionsChart;
467
+ exports.default = _default;
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.symbol.description.js");
4
+ require("core-js/modules/es.object.assign.js");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ require("core-js/modules/es.regexp.exec.js");
10
+ require("core-js/modules/es.string.replace.js");
11
+ require("core-js/modules/esnext.string.replace-all.js");
12
+ require("core-js/modules/web.dom-collections.iterator.js");
13
+ var _react = _interopRequireDefault(require("react"));
14
+ var _material = require("@mui/material");
15
+ var _atoms = require("@aclymatepackages/atoms");
16
+ var _formatters = require("@aclymatepackages/formatters");
17
+ var _themes = require("@aclymatepackages/themes");
18
+ var _CustomTooltipDisplayRow = _interopRequireDefault(require("./CustomTooltipDisplayRow"));
19
+ var _reactFontawesome = require("@fortawesome/react-fontawesome");
20
+ const _excluded = ["label", "trendline", "emissionsSumTons", "projectedEmissionsSumTons", "id"],
21
+ _excluded2 = ["subcategory"];
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
24
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
25
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
26
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
27
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
28
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
29
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
30
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
31
+ const StatusDisplay = _ref => {
32
+ let {
33
+ dataArray,
34
+ id
35
+ } = _ref;
36
+ const {
37
+ status
38
+ } = dataArray.find(dataObj => (dataObj === null || dataObj === void 0 ? void 0 : dataObj.id) === id) || {};
39
+ if (!status) {
40
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null);
41
+ }
42
+ const {
43
+ color,
44
+ icon,
45
+ tooltip
46
+ } = status;
47
+ return /*#__PURE__*/_react.default.createElement(_material.Grid, {
48
+ item: true
49
+ }, /*#__PURE__*/_react.default.createElement(_material.Paper, {
50
+ style: {
51
+ backgroundColor: color
52
+ }
53
+ }, /*#__PURE__*/_react.default.createElement(_material.Box, {
54
+ p: 1
55
+ }, /*#__PURE__*/_react.default.createElement(_material.Grid, {
56
+ container: true,
57
+ spacing: 2,
58
+ alignItems: "center"
59
+ }, /*#__PURE__*/_react.default.createElement(_material.Grid, {
60
+ item: true
61
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
62
+ icon: icon,
63
+ style: {
64
+ color: "white"
65
+ },
66
+ size: "2x"
67
+ })), /*#__PURE__*/_react.default.createElement(_material.Grid, {
68
+ item: true
69
+ }, /*#__PURE__*/_react.default.createElement(_material.ThemeProvider, {
70
+ theme: _themes.mergeDarkTheme
71
+ }, /*#__PURE__*/_react.default.createElement(_material.Typography, {
72
+ variant: "subtitle2",
73
+ color: "textPrimary"
74
+ }, tooltip)))))));
75
+ };
76
+ const EmissionsCustomTooltip = _ref2 => {
77
+ var _payload$;
78
+ let {
79
+ payload,
80
+ categoriesArray,
81
+ labelAnnotation = "",
82
+ dataArray = [],
83
+ displayUnitLabel
84
+ } = _ref2;
85
+ const buildSubtitle = (realCarbonVolume, projectedCarbonVolume) => {
86
+ const baseSubtitle = "".concat((0, _formatters.formatDecimal)(realCarbonVolume), " ").concat(displayUnitLabel, " CO2");
87
+ if (!projectedCarbonVolume) {
88
+ return baseSubtitle;
89
+ }
90
+ return "".concat(baseSubtitle, " (").concat((0, _formatters.formatDecimal)(projectedCarbonVolume), " projected)");
91
+ };
92
+ const columnDetails = payload === null || payload === void 0 || (_payload$ = payload[0]) === null || _payload$ === void 0 ? void 0 : _payload$.payload;
93
+ const _ref3 = columnDetails || {},
94
+ {
95
+ label = "",
96
+ trendline,
97
+ emissionsSumTons,
98
+ projectedEmissionsSumTons,
99
+ id
100
+ } = _ref3,
101
+ graphValues = _objectWithoutProperties(_ref3, _excluded);
102
+ const cleanLabel = label.replaceAll(/[*]/gi, "");
103
+ const filteredFormattedGraphValuesArray = Object.entries(graphValues).filter(_ref4 => {
104
+ let [_, value] = _ref4;
105
+ return value;
106
+ }).map(_ref5 => {
107
+ let [key, value] = _ref5;
108
+ const [subcategory, projected] = key.split("_");
109
+ return {
110
+ subcategory,
111
+ projected: !!projected,
112
+ value
113
+ };
114
+ });
115
+ const uniqueSubcategories = [...new Set(filteredFormattedGraphValuesArray.map(_ref6 => {
116
+ let {
117
+ subcategory
118
+ } = _ref6;
119
+ return subcategory;
120
+ }))];
121
+ const subcategoryDisplayArray = uniqueSubcategories.map(subcategory => {
122
+ var _filteredFormattedGra, _filteredFormattedGra2;
123
+ const realValue = (_filteredFormattedGra = filteredFormattedGraphValuesArray.find(graphValue => graphValue.subcategory === subcategory && !graphValue.projected)) === null || _filteredFormattedGra === void 0 ? void 0 : _filteredFormattedGra.value;
124
+ const projectedValue = (_filteredFormattedGra2 = filteredFormattedGraphValuesArray.find(graphValue => graphValue.subcategory === subcategory && !!graphValue.projected)) === null || _filteredFormattedGra2 === void 0 ? void 0 : _filteredFormattedGra2.value;
125
+ return {
126
+ subcategory,
127
+ realValue,
128
+ projectedValue,
129
+ subtitle: buildSubtitle(realValue, projectedValue)
130
+ };
131
+ });
132
+ const displayArrayWithIcons = subcategoryDisplayArray.map(_ref7 => {
133
+ let {
134
+ subcategory
135
+ } = _ref7,
136
+ otherProps = _objectWithoutProperties(_ref7, _excluded2);
137
+ const {
138
+ Icon,
139
+ color,
140
+ icon,
141
+ name
142
+ } = categoriesArray.find(categoryObj => categoryObj.subcategory === subcategory) || {};
143
+ return _objectSpread({
144
+ subcategory,
145
+ Icon,
146
+ icon,
147
+ color,
148
+ name
149
+ }, otherProps);
150
+ }).filter(_ref8 => {
151
+ let {
152
+ color
153
+ } = _ref8;
154
+ return color;
155
+ });
156
+ return /*#__PURE__*/_react.default.createElement(_atoms.DefaultPaper, {
157
+ style: {
158
+ zIndex: 99999,
159
+ borderColor: "transparent"
160
+ }
161
+ }, /*#__PURE__*/_react.default.createElement(_material.Grid, {
162
+ container: true,
163
+ direction: "column",
164
+ spacing: 2
165
+ }, /*#__PURE__*/_react.default.createElement(_material.Grid, {
166
+ item: true
167
+ }, /*#__PURE__*/_react.default.createElement(_material.Typography, {
168
+ variant: "h6",
169
+ color: "textPrimary"
170
+ }, "".concat(cleanLabel, " Emissions")), /*#__PURE__*/_react.default.createElement(_material.Typography, {
171
+ variant: "subtitle2",
172
+ color: "textSecondary"
173
+ }, "".concat(buildSubtitle(emissionsSumTons, projectedEmissionsSumTons), " ").concat(labelAnnotation))), displayArrayWithIcons.map((displayData, idx) => /*#__PURE__*/_react.default.createElement(_CustomTooltipDisplayRow.default, _extends({
174
+ key: "tooltip-display-row-".concat(idx)
175
+ }, displayData))), /*#__PURE__*/_react.default.createElement(StatusDisplay, {
176
+ id: id,
177
+ dataArray: dataArray
178
+ })));
179
+ };
180
+ var _default = EmissionsCustomTooltip;
181
+ exports.default = _default;