@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.
- package/README.md +43 -0
- package/babel.config.json +18 -0
- package/dist/components/CompaniesAutocomplete.js +126 -0
- package/dist/components/CompanyOnboardingInput.js +116 -0
- package/dist/components/ComparisonChart.js +200 -0
- package/dist/components/CustomTooltipDisplayRow.js +59 -0
- package/dist/components/EmissionsChart.js +467 -0
- package/dist/components/EmissionsCustomTooltip.js +181 -0
- package/dist/components/EmissionsPieChart.js +130 -0
- package/dist/components/EmissionsReductionGraph.js +118 -0
- package/dist/components/FootprintEquivalencies.js +181 -0
- package/dist/components/FootprintVideo.js +262 -0
- package/dist/components/FuelTypesSelect.js +36 -0
- package/dist/components/IndustryAutocomplete.js +58 -0
- package/dist/components/PlacesAutocomplete.js +173 -0
- package/dist/components/StripeElements.js +95 -0
- package/dist/components/YesNoQuestion.js +88 -0
- package/dist/components/stripeInput.js +293 -0
- package/dist/components/useChartWarningLabels.js +143 -0
- package/dist/index.js +118 -0
- package/package.json +74 -0
- package/public/favicon.ico +0 -0
- package/public/index.html +43 -0
- package/public/logo192.png +0 -0
- package/public/logo512.png +0 -0
- package/public/manifest.json +25 -0
- package/public/robots.txt +3 -0
- package/src/components/CompaniesAutocomplete.js +125 -0
- package/src/components/CompanyOnboardingInput.js +113 -0
- package/src/components/ComparisonChart.js +236 -0
- package/src/components/CustomTooltipDisplayRow.js +41 -0
- package/src/components/EmissionsChart.js +579 -0
- package/src/components/EmissionsCustomTooltip.js +146 -0
- package/src/components/EmissionsPieChart.js +120 -0
- package/src/components/EmissionsReductionGraph.js +107 -0
- package/src/components/FootprintEquivalencies.js +203 -0
- package/src/components/FootprintVideo.js +328 -0
- package/src/components/FuelTypesSelect.js +29 -0
- package/src/components/IndustryAutocomplete.js +56 -0
- package/src/components/PlacesAutocomplete.js +174 -0
- package/src/components/StripeElements.js +95 -0
- package/src/components/YesNoQuestion.js +68 -0
- package/src/components/stripeInput.js +288 -0
- package/src/components/useChartWarningLabels.js +139 -0
- 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;
|