@aclymatepackages/modules 2.0.9 → 2.0.10

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.
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ require("core-js/modules/web.dom-collections.iterator.js");
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _dayjs = _interopRequireDefault(require("dayjs"));
10
+ var _recharts = require("recharts");
11
+ var _material = require("@mui/material");
12
+ var _atoms = require("@aclymatepackages/atoms");
13
+ var _converters = require("@aclymatepackages/converters");
14
+ var _formatters = require("@aclymatepackages/formatters");
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+ 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; }
17
+ 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; }
18
+ 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; }
19
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
20
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
21
+ const AccountingChartTooltip = _ref => {
22
+ let {
23
+ convertCarbonUnits,
24
+ displayUnitLabel,
25
+ payload: passedPayload
26
+ } = _ref;
27
+ const {
28
+ payload
29
+ } = passedPayload[0] || {};
30
+ if (!payload) {
31
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null);
32
+ }
33
+ const {
34
+ year,
35
+ baseline,
36
+ tonsCo2e,
37
+ isPledgeYear,
38
+ overEmitted,
39
+ underEmitted,
40
+ expectedPercentage,
41
+ future,
42
+ expectedTonsCo2e
43
+ } = payload;
44
+ const buildTextIcon = () => {
45
+ const title = "".concat(year, "- ").concat((0, _formatters.formatDecimal)(convertCarbonUnits(tonsCo2e || expectedTonsCo2e)), " ").concat(displayUnitLabel);
46
+ if (baseline) {
47
+ return {
48
+ title,
49
+ subtitle: "Baseline Year"
50
+ };
51
+ }
52
+ if (isPledgeYear) {
53
+ return {
54
+ title,
55
+ subtitle: "Pledge Year"
56
+ };
57
+ }
58
+ if (future) {
59
+ return {
60
+ title,
61
+ subtitle: "No more than ".concat((0, _formatters.formatDecimal)(convertCarbonUnits(expectedTonsCo2e)), " ").concat(displayUnitLabel, " allowed")
62
+ };
63
+ }
64
+ if (!expectedPercentage) {
65
+ return {
66
+ title,
67
+ subtitle: "You emitted ".concat((0, _formatters.formatDecimal)(overEmitted || underEmitted), "% of your baseline")
68
+ };
69
+ }
70
+ return {
71
+ title,
72
+ subtitle: "You emitted ".concat((0, _formatters.formatDecimal)(overEmitted || underEmitted), "% of your reduction pledge")
73
+ };
74
+ };
75
+ const {
76
+ title,
77
+ subtitle
78
+ } = buildTextIcon();
79
+ return /*#__PURE__*/_react.default.createElement(_atoms.DefaultPaper, null, /*#__PURE__*/_react.default.createElement(_material.Grid, {
80
+ container: true,
81
+ direction: "column",
82
+ spacing: 2
83
+ }, /*#__PURE__*/_react.default.createElement(_material.Grid, {
84
+ item: true
85
+ }, /*#__PURE__*/_react.default.createElement(_material.Typography, {
86
+ variant: "h4"
87
+ }, title), /*#__PURE__*/_react.default.createElement(_material.Typography, {
88
+ variant: "subtitle1",
89
+ color: "textSecondary"
90
+ }, subtitle))));
91
+ };
92
+ const AccountingChart = _ref2 => {
93
+ let {
94
+ accountingYears,
95
+ pledgeYear,
96
+ pledgeYears,
97
+ baselineDate,
98
+ pledgeTons,
99
+ baselineTons,
100
+ convertCarbonUnits = tons => tons,
101
+ displayUnitLabel = "tons",
102
+ card
103
+ } = _ref2;
104
+ const {
105
+ palette
106
+ } = (0, _material.useTheme)();
107
+ const buildChartData = () => {
108
+ const pledgeBaselineTonsMultiplier = pledgeTons / baselineTons;
109
+ const findYearChartProps = _ref3 => {
110
+ let {
111
+ baseline,
112
+ baselinePercentage,
113
+ year,
114
+ pledgePercentage,
115
+ expectedPercentage,
116
+ tonsCo2e
117
+ } = _ref3;
118
+ if (baseline) {
119
+ return {
120
+ baseline: 100,
121
+ year,
122
+ tonsCo2e
123
+ };
124
+ }
125
+ if (!pledgeYear || pledgeYear > year) {
126
+ const underEmittedObj = baselinePercentage <= 100 ? {
127
+ underEmitted: baselinePercentage
128
+ } : {};
129
+ const overEmittedObj = baselinePercentage > 100 ? {
130
+ overEmitted: baselinePercentage
131
+ } : {};
132
+ return _objectSpread(_objectSpread({
133
+ year,
134
+ tonsCo2e
135
+ }, underEmittedObj), overEmittedObj);
136
+ }
137
+ const buildPledgeYearProps = function buildPledgeYearProps() {
138
+ let multiplier = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
139
+ const underEmittedObj = pledgePercentage <= expectedPercentage ? {
140
+ underEmitted: pledgePercentage * multiplier,
141
+ expectedPercentage: (expectedPercentage - pledgePercentage) * multiplier
142
+ } : {};
143
+ const overEmittedObj = pledgePercentage > expectedPercentage ? {
144
+ overEmitted: (pledgePercentage - expectedPercentage) * multiplier,
145
+ expectedPercentage: expectedPercentage * multiplier
146
+ } : {};
147
+ return _objectSpread(_objectSpread({
148
+ year,
149
+ tonsCo2e,
150
+ isPledgeYear: year === pledgeYear
151
+ }, underEmittedObj), overEmittedObj);
152
+ };
153
+ if (pledgeYear === (0, _dayjs.default)(baselineDate).year()) {
154
+ return buildPledgeYearProps();
155
+ }
156
+ return buildPledgeYearProps(pledgeBaselineTonsMultiplier);
157
+ };
158
+ const existingYearsChartData = accountingYears.map(findYearChartProps);
159
+ const futureYearsChartData = pledgeYears ? pledgeYears.filter(_ref4 => {
160
+ let {
161
+ year
162
+ } = _ref4;
163
+ return !existingYearsChartData.find(existingYear => existingYear.year === year);
164
+ }).map(_ref5 => {
165
+ let {
166
+ year,
167
+ expectedPercentage,
168
+ expectedTonsCo2e
169
+ } = _ref5;
170
+ return {
171
+ year,
172
+ future: expectedPercentage * pledgeBaselineTonsMultiplier,
173
+ expectedTonsCo2e
174
+ };
175
+ }) : [];
176
+ return [...existingYearsChartData, ...futureYearsChartData];
177
+ };
178
+ const chartDataArray = buildChartData();
179
+ const barAreasArray = [{
180
+ dataKey: "baseline",
181
+ color: palette.primary.main
182
+ }, {
183
+ dataKey: "underEmitted",
184
+ color: palette.secondary.main
185
+ }, {
186
+ dataKey: "expectedPercentage",
187
+ color: palette.backgroundGray.dark
188
+ }, {
189
+ dataKey: "overEmitted",
190
+ color: palette.error.main
191
+ }, {
192
+ dataKey: "future",
193
+ color: (0, _converters.hexToRgba)(palette.backgroundGray.main, 0.8)
194
+ }];
195
+ return /*#__PURE__*/_react.default.createElement(_material.Box, {
196
+ position: "relative",
197
+ style: {
198
+ width: "100%"
199
+ }
200
+ }, /*#__PURE__*/_react.default.createElement(_recharts.ResponsiveContainer, {
201
+ width: "100%",
202
+ aspect: card ? 3 : 2.5
203
+ }, /*#__PURE__*/_react.default.createElement(_recharts.BarChart, {
204
+ data: chartDataArray
205
+ }, /*#__PURE__*/_react.default.createElement(_recharts.CartesianGrid, {
206
+ strokeDasharray: "3 3"
207
+ }), /*#__PURE__*/_react.default.createElement(_recharts.XAxis, {
208
+ dataKey: "year",
209
+ interval: "equidistantPreserveChart",
210
+ height: 20
211
+ }), /*#__PURE__*/_react.default.createElement(_recharts.YAxis, {
212
+ width: 70,
213
+ name: "Percentage",
214
+ tickFormatter: tick => "".concat((0, _formatters.formatDecimal)(tick), "%")
215
+ }), /*#__PURE__*/_react.default.createElement(_recharts.Tooltip, {
216
+ wrapperStyle: {
217
+ zIndex: 99
218
+ },
219
+ content: /*#__PURE__*/_react.default.createElement(AccountingChartTooltip, {
220
+ convertCarbonUnits: convertCarbonUnits,
221
+ displayUnitLabel: displayUnitLabel
222
+ })
223
+ }), barAreasArray.map((_ref6, idx) => {
224
+ let {
225
+ dataKey,
226
+ color
227
+ } = _ref6;
228
+ return /*#__PURE__*/_react.default.createElement(_recharts.Bar, {
229
+ key: "view-chart-bar-".concat(idx),
230
+ dataKey: dataKey,
231
+ fill: color,
232
+ stackId: "a",
233
+ isAnimationActive: false
234
+ });
235
+ }), /*#__PURE__*/_react.default.createElement(_recharts.ReferenceLine, {
236
+ y: 100
237
+ }))));
238
+ };
239
+ var _default = exports.default = AccountingChart;
@@ -323,7 +323,7 @@ const EmissionsChart = _ref14 => {
323
323
  showTooltip = true,
324
324
  startDate,
325
325
  convertCarbonUnits = tons => tons,
326
- displayUnitLabel,
326
+ displayUnitLabel = "tons",
327
327
  branding,
328
328
  netZeroPercentage,
329
329
  noLine = true
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aclymatepackages/modules",
3
- "version": "2.0.9",
3
+ "version": "2.0.10",
4
4
  "description": "Aclymate modules",
5
5
  "author": "William Loopesko",
6
6
  "main": "dist/index.js",
@@ -0,0 +1,240 @@
1
+ import React from "react";
2
+ import dayjs from "dayjs";
3
+
4
+ import {
5
+ XAxis,
6
+ YAxis,
7
+ CartesianGrid,
8
+ ResponsiveContainer,
9
+ Bar,
10
+ BarChart,
11
+ ReferenceLine,
12
+ Tooltip,
13
+ } from "recharts";
14
+
15
+ import { Box, Typography, Grid, useTheme } from "@mui/material";
16
+
17
+ import { DefaultPaper } from "@aclymatepackages/atoms";
18
+ import { hexToRgba } from "@aclymatepackages/converters";
19
+ import { formatDecimal } from "@aclymatepackages/formatters";
20
+
21
+ const AccountingChartTooltip = ({
22
+ convertCarbonUnits,
23
+ displayUnitLabel,
24
+ payload: passedPayload,
25
+ }) => {
26
+ const { payload } = passedPayload[0] || {};
27
+ if (!payload) {
28
+ return <></>;
29
+ }
30
+
31
+ const {
32
+ year,
33
+ baseline,
34
+ tonsCo2e,
35
+ isPledgeYear,
36
+ overEmitted,
37
+ underEmitted,
38
+ expectedPercentage,
39
+ future,
40
+ expectedTonsCo2e,
41
+ } = payload;
42
+
43
+ const buildTextIcon = () => {
44
+ const title = `${year}- ${formatDecimal(
45
+ convertCarbonUnits(tonsCo2e || expectedTonsCo2e)
46
+ )} ${displayUnitLabel}`;
47
+
48
+ if (baseline) {
49
+ return { title, subtitle: "Baseline Year" };
50
+ }
51
+
52
+ if (isPledgeYear) {
53
+ return { title, subtitle: "Pledge Year" };
54
+ }
55
+ if (future) {
56
+ return {
57
+ title,
58
+ subtitle: `No more than ${formatDecimal(
59
+ convertCarbonUnits(expectedTonsCo2e)
60
+ )} ${displayUnitLabel} allowed`,
61
+ };
62
+ }
63
+
64
+ if (!expectedPercentage) {
65
+ return {
66
+ title,
67
+ subtitle: `You emitted ${formatDecimal(
68
+ overEmitted || underEmitted
69
+ )}% of your baseline`,
70
+ };
71
+ }
72
+
73
+ return {
74
+ title,
75
+ subtitle: `You emitted ${formatDecimal(
76
+ overEmitted || underEmitted
77
+ )}% of your reduction pledge`,
78
+ };
79
+ };
80
+
81
+ const { title, subtitle } = buildTextIcon();
82
+
83
+ return (
84
+ <DefaultPaper>
85
+ <Grid container direction="column" spacing={2}>
86
+ <Grid item>
87
+ <Typography variant="h4">{title}</Typography>
88
+ <Typography variant="subtitle1" color="textSecondary">
89
+ {subtitle}
90
+ </Typography>
91
+ </Grid>
92
+ </Grid>
93
+ </DefaultPaper>
94
+ );
95
+ };
96
+
97
+ const AccountingChart = ({
98
+ accountingYears,
99
+ pledgeYear,
100
+ pledgeYears,
101
+ baselineDate,
102
+ pledgeTons,
103
+ baselineTons,
104
+ convertCarbonUnits = (tons) => tons,
105
+ displayUnitLabel = "tons",
106
+ card,
107
+ }) => {
108
+ const { palette } = useTheme();
109
+
110
+ const buildChartData = () => {
111
+ const pledgeBaselineTonsMultiplier = pledgeTons / baselineTons;
112
+
113
+ const findYearChartProps = ({
114
+ baseline,
115
+ baselinePercentage,
116
+ year,
117
+ pledgePercentage,
118
+ expectedPercentage,
119
+ tonsCo2e,
120
+ }) => {
121
+ if (baseline) {
122
+ return { baseline: 100, year, tonsCo2e };
123
+ }
124
+
125
+ if (!pledgeYear || pledgeYear > year) {
126
+ const underEmittedObj =
127
+ baselinePercentage <= 100 ? { underEmitted: baselinePercentage } : {};
128
+
129
+ const overEmittedObj =
130
+ baselinePercentage > 100 ? { overEmitted: baselinePercentage } : {};
131
+
132
+ return { year, tonsCo2e, ...underEmittedObj, ...overEmittedObj };
133
+ }
134
+
135
+ const buildPledgeYearProps = (multiplier = 1) => {
136
+ const underEmittedObj =
137
+ pledgePercentage <= expectedPercentage
138
+ ? {
139
+ underEmitted: pledgePercentage * multiplier,
140
+ expectedPercentage:
141
+ (expectedPercentage - pledgePercentage) * multiplier,
142
+ }
143
+ : {};
144
+
145
+ const overEmittedObj =
146
+ pledgePercentage > expectedPercentage
147
+ ? {
148
+ overEmitted:
149
+ (pledgePercentage - expectedPercentage) * multiplier,
150
+ expectedPercentage: expectedPercentage * multiplier,
151
+ }
152
+ : {};
153
+
154
+ return {
155
+ year,
156
+ tonsCo2e,
157
+ isPledgeYear: year === pledgeYear,
158
+ ...underEmittedObj,
159
+ ...overEmittedObj,
160
+ };
161
+ };
162
+
163
+ if (pledgeYear === dayjs(baselineDate).year()) {
164
+ return buildPledgeYearProps();
165
+ }
166
+
167
+ return buildPledgeYearProps(pledgeBaselineTonsMultiplier);
168
+ };
169
+
170
+ const existingYearsChartData = accountingYears.map(findYearChartProps);
171
+
172
+ const futureYearsChartData = pledgeYears
173
+ ? pledgeYears
174
+ .filter(
175
+ ({ year }) =>
176
+ !existingYearsChartData.find(
177
+ (existingYear) => existingYear.year === year
178
+ )
179
+ )
180
+ .map(({ year, expectedPercentage, expectedTonsCo2e }) => ({
181
+ year,
182
+ future: expectedPercentage * pledgeBaselineTonsMultiplier,
183
+ expectedTonsCo2e,
184
+ }))
185
+ : [];
186
+
187
+ return [...existingYearsChartData, ...futureYearsChartData];
188
+ };
189
+
190
+ const chartDataArray = buildChartData();
191
+
192
+ const barAreasArray = [
193
+ { dataKey: "baseline", color: palette.primary.main },
194
+ { dataKey: "underEmitted", color: palette.secondary.main },
195
+ { dataKey: "expectedPercentage", color: palette.backgroundGray.dark },
196
+ { dataKey: "overEmitted", color: palette.error.main },
197
+ { dataKey: "future", color: hexToRgba(palette.backgroundGray.main, 0.8) },
198
+ ];
199
+
200
+ return (
201
+ <Box position="relative" style={{ width: "100%" }}>
202
+ <ResponsiveContainer width="100%" aspect={card ? 3 : 2.5}>
203
+ <BarChart data={chartDataArray}>
204
+ <CartesianGrid strokeDasharray="3 3" />
205
+ <XAxis
206
+ dataKey="year"
207
+ interval="equidistantPreserveChart"
208
+ height={20}
209
+ />
210
+ <YAxis
211
+ width={70}
212
+ name="Percentage"
213
+ tickFormatter={(tick) => `${formatDecimal(tick)}%`}
214
+ />
215
+ <Tooltip
216
+ wrapperStyle={{ zIndex: 99 }}
217
+ content={
218
+ <AccountingChartTooltip
219
+ convertCarbonUnits={convertCarbonUnits}
220
+ displayUnitLabel={displayUnitLabel}
221
+ />
222
+ }
223
+ />
224
+ {barAreasArray.map(({ dataKey, color }, idx) => (
225
+ <Bar
226
+ key={`view-chart-bar-${idx}`}
227
+ dataKey={dataKey}
228
+ fill={color}
229
+ stackId="a"
230
+ isAnimationActive={false}
231
+ />
232
+ ))}
233
+ <ReferenceLine y={100} />
234
+ </BarChart>
235
+ </ResponsiveContainer>
236
+ </Box>
237
+ );
238
+ };
239
+
240
+ export default AccountingChart;
@@ -339,7 +339,7 @@ const EmissionsChart = ({
339
339
  showTooltip = true,
340
340
  startDate,
341
341
  convertCarbonUnits = (tons) => tons,
342
- displayUnitLabel,
342
+ displayUnitLabel = "tons",
343
343
  branding,
344
344
  netZeroPercentage,
345
345
  noLine = true,