diff --git a/3/ecolyo.ad3feaef7217068a0c1a.js b/3/ecolyo.2c30ac255135a1fb70fe.js similarity index 91% rename from 3/ecolyo.ad3feaef7217068a0c1a.js rename to 3/ecolyo.2c30ac255135a1fb70fe.js index 10b8c1a57acbcf99e33cebdb77b984f6ebfbf46e..c30b2ad1c7d691c07fbe1bb12053023ef04751a3 100644 --- a/3/ecolyo.ad3feaef7217068a0c1a.js +++ b/3/ecolyo.2c30ac255135a1fb70fe.js @@ -15,16 +15,16 @@ var _regenerator = _interopRequireDefault(__webpack_require__("hJxD")); var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("HZZ/")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); var _core = __webpack_require__("rMFn"); -var _IconButton = _interopRequireDefault(__webpack_require__("x0Kp")); var _leftArrow = _interopRequireDefault(__webpack_require__("2JOZ")); var _maxPower = _interopRequireDefault(__webpack_require__("4Z+8")); var _minimum = _interopRequireDefault(__webpack_require__("1YWU")); var _offPeakHour = _interopRequireDefault(__webpack_require__("9uLI")); var _rightArrow = _interopRequireDefault(__webpack_require__("Mvn8")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _Loader = _interopRequireDefault(__webpack_require__("6oIw")); var _cozyClient = __webpack_require__("xEu0"); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _consumption = _interopRequireDefault(__webpack_require__("zET3")); @@ -237,7 +237,7 @@ var ElecHalfHourMonthlyAnalysis = function ElecHalfHourMonthlyAnalysis(_ref) { }, [emas]); return /*#__PURE__*/_react.default.createElement("div", { className: "special-elec-container" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { className: "elec-icon", icon: (0, _picto.getNavPicto)(_enums.FluidType.ELECTRICITY, true, true), size: 42 @@ -247,18 +247,17 @@ var ElecHalfHourMonthlyAnalysis = function ElecHalfHourMonthlyAnalysis(_ref) { className: "activation-text text-18-normal" }, t("timestep.half_an_hour.analysis_waiting_data")), isHalfHourActivated && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", { className: "navigator" - }, /*#__PURE__*/_react.default.createElement(_IconButton.default, { - "aria-label": t('consumption.accessibility.button_previous_value'), + }, /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { + icon: _leftArrow.default, + sized: 24, onClick: function onClick() { return setIsWeekend(function (prev) { return !prev; }); }, + "aria-label": t('consumption.accessibility.button_previous_value'), className: "arrow-prev" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { - icon: _leftArrow.default, - size: 24 - })), /*#__PURE__*/_react.default.createElement("div", { + }), /*#__PURE__*/_react.default.createElement("div", { className: "average text-18-normal" }, /*#__PURE__*/_react.default.createElement("div", { className: "text-1" @@ -266,24 +265,23 @@ var ElecHalfHourMonthlyAnalysis = function ElecHalfHourMonthlyAnalysis(_ref) { className: "text-2 text-18-bold" }, t('special_elec.weektype'), ' ', /*#__PURE__*/_react.default.createElement("span", { className: isWeekend ? 'weekend' : 'week' - }, isWeekend ? t('special_elec.weekend') : t('special_elec.week')))), /*#__PURE__*/_react.default.createElement(_IconButton.default, { - "aria-label": t('consumption.accessibility.button_next_value'), + }, isWeekend ? t('special_elec.weekend') : t('special_elec.week')))), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { + icon: _rightArrow.default, + sized: 24, onClick: function onClick() { return setIsWeekend(function (prev) { return !prev; }); }, + "aria-label": t('consumption.accessibility.button_next_value'), className: "arrow-next" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { - icon: _rightArrow.default, - size: 24 - }))), isLoading && /*#__PURE__*/_react.default.createElement(_Loader.default, { + })), isLoading && /*#__PURE__*/_react.default.createElement(_Loader.default, { color: "elec" }), !isLoading && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, getPowerChart(), enedisAnalysisValues && isDataFullyComplete(monthDataloads) && /*#__PURE__*/_react.default.createElement("div", { className: "min-max" }, /*#__PURE__*/_react.default.createElement("div", { className: "container" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _maxPower.default, size: 40, className: "minIcon" @@ -299,7 +297,7 @@ var ElecHalfHourMonthlyAnalysis = function ElecHalfHourMonthlyAnalysis(_ref) { className: "text-18-normal" }, " kVA")) : /*#__PURE__*/_react.default.createElement("span", null, "----"))), (enedisAnalysisValues === null || enedisAnalysisValues === void 0 ? void 0 : enedisAnalysisValues.offPeakHoursRatio) != null && /*#__PURE__*/_react.default.createElement("div", { className: "container" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _offPeakHour.default, size: 40, className: "minIcon" @@ -315,27 +313,25 @@ var ElecHalfHourMonthlyAnalysis = function ElecHalfHourMonthlyAnalysis(_ref) { className: "text-18-normal" }, " %")))), /*#__PURE__*/_react.default.createElement("div", { className: "container consomin" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _minimum.default, size: 40, className: "minIcon" }), /*#__PURE__*/_react.default.createElement("div", { className: "text text-18-normal" - }, /*#__PURE__*/_react.default.createElement("div", null, t('special_elec.min')), /*#__PURE__*/_react.default.createElement("div", null, t('special_elec.percentage')), /*#__PURE__*/_react.default.createElement("div", null, t('special_elec.price'))), /*#__PURE__*/_react.default.createElement("div", { - className: "value" }, enedisAnalysisValues.minimumLoad !== 0 && enedisAnalysisValues.minimumLoad !== null ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", { + className: "row" + }, /*#__PURE__*/_react.default.createElement("div", null, t('special_elec.min')), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("span", { className: "text-18-bold" - }, enedisAnalysisValues.minimumLoad.toFixed(1), /*#__PURE__*/_react.default.createElement("span", { - className: "text-18-normal" - }, " kWh")), /*#__PURE__*/_react.default.createElement("div", { + }, enedisAnalysisValues.minimumLoad.toFixed(1)), /*#__PURE__*/_react.default.createElement("span", null, " kWh"))), /*#__PURE__*/_react.default.createElement("div", { + className: "row" + }, /*#__PURE__*/_react.default.createElement("div", null, t('special_elec.percentage')), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("span", { className: "text-18-bold" - }, (facturePercentage === null || facturePercentage === void 0 ? void 0 : facturePercentage.toFixed(0)) || '---', /*#__PURE__*/_react.default.createElement("span", { - className: "text-18-normal" - }, " %")), /*#__PURE__*/_react.default.createElement("div", { + }, (facturePercentage === null || facturePercentage === void 0 ? void 0 : facturePercentage.toFixed(0)) || '---'), /*#__PURE__*/_react.default.createElement("span", null, " %"))), /*#__PURE__*/_react.default.createElement("div", { + className: "row" + }, /*#__PURE__*/_react.default.createElement("div", null, t('special_elec.price')), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("span", { className: "text-18-bold" - }, elecPrice !== null && elecPrice !== void 0 && elecPrice.price ? (enedisAnalysisValues.minimumLoad * elecPrice.price).toFixed(1) : '---', /*#__PURE__*/_react.default.createElement("span", { - className: "text-18-normal" - }, " \u20AC"))) : /*#__PURE__*/_react.default.createElement("span", null, "----"))), /*#__PURE__*/_react.default.createElement(_core.Button, { + }, elecPrice !== null && elecPrice !== void 0 && elecPrice.price ? (enedisAnalysisValues.minimumLoad * elecPrice.price).toFixed(1) : '---'), /*#__PURE__*/_react.default.createElement("span", null, " \u20AC")))) : /*#__PURE__*/_react.default.createElement("span", null, "----"))), /*#__PURE__*/_react.default.createElement(_core.Button, { className: "btnText", onClick: function onClick() { return setOpenInfoModal(true); @@ -358,7 +354,7 @@ exports.default = _default; exports = module.exports = __webpack_require__("DjJv")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.analysisRow {\n display: flex;\n margin-bottom: 1rem;\n}\n.analysisRow .user-graph .container-graph {\n justify-content: flex-end;\n}\n.analysisRow .user-graph .container-graph .graph {\n border-radius: 0.35rem 0 0 0.35rem;\n}\n.analysisRow .user-graph .price.not-connected {\n color: #a0a0a0;\n height: 2rem;\n width: 100%;\n align-items: center;\n display: flex;\n}\n.analysisRow .icon-container {\n flex-basis: 10%;\n display: flex;\n justify-content: center;\n}\n.analysisRow .icon-container svg {\n align-self: center;\n width: 40px;\n}\n.analysisRow .icon-container svg.noData {\n opacity: 0.6;\n}\n.analysisRow .average-graph {\n color: #bfcce4;\n}\n.analysisRow .average-graph .price {\n text-align: right;\n}\n.analysisRow .average-graph .price.not-connected {\n opacity: 0.55;\n}\n.analysisRow .average-graph .graph {\n background-color: #bfcce4;\n}\n\n.user-graph,\n.average-graph {\n display: flex;\n justify-content: space-between;\n flex-basis: 45%;\n align-items: center;\n}\n\n.consumption-multifluid .user-graph {\n color: #e3b82a;\n}\n.consumption-multifluid .user-graph .graph {\n background-color: #e3b82a;\n}\n\n.consumption-electricity .user-graph {\n color: #d87b39;\n}\n.consumption-electricity .user-graph .graph {\n background-color: #d87b39;\n}\n\n.consumption-water .user-graph {\n color: #3a98ec;\n}\n.consumption-water .user-graph .graph {\n background-color: #3a98ec;\n}\n\n.consumption-gas .user-graph {\n color: #45d1b8;\n}\n.consumption-gas .user-graph .graph {\n background-color: #45d1b8;\n}\n\n.container-graph {\n flex-basis: 50%;\n display: flex;\n}\n\n.price {\n min-width: 5.25rem;\n}\n\n.graph {\n border-radius: 0 0.35rem 0.35rem 0;\n padding-left: 0.25rem;\n height: 2rem;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.analysisRow {\n display: flex;\n}\n.analysisRow .user-graph .container-graph {\n justify-content: flex-end;\n}\n.analysisRow .user-graph .container-graph .graph {\n border-radius: 0.35rem 0 0 0.35rem;\n}\n.analysisRow .user-graph .price.not-connected {\n color: #a0a0a0;\n height: 2rem;\n width: 100%;\n align-items: center;\n display: flex;\n}\n.analysisRow .icon-container {\n flex-basis: 10%;\n display: flex;\n justify-content: center;\n}\n.analysisRow .icon-container svg {\n align-self: center;\n width: 40px;\n}\n.analysisRow .icon-container svg.noData {\n opacity: 0.6;\n}\n.analysisRow .average-graph {\n color: #bfcce4;\n}\n.analysisRow .average-graph .price {\n text-align: right;\n}\n.analysisRow .average-graph .price.not-connected {\n opacity: 0.55;\n}\n.analysisRow .average-graph .graph {\n background-color: #bfcce4;\n}\n\n.user-graph,\n.average-graph {\n display: flex;\n justify-content: space-between;\n flex-basis: 45%;\n align-items: center;\n}\n\n.consumption-multifluid .user-graph {\n color: #e3b82a;\n}\n.consumption-multifluid .user-graph .graph {\n background-color: #e3b82a;\n}\n\n.consumption-electricity .user-graph {\n color: #d87b39;\n}\n.consumption-electricity .user-graph .graph {\n background-color: #d87b39;\n}\n\n.consumption-water .user-graph {\n color: #3a98ec;\n}\n.consumption-water .user-graph .graph {\n background-color: #3a98ec;\n}\n\n.consumption-gas .user-graph {\n color: #45d1b8;\n}\n.consumption-gas .user-graph .graph {\n background-color: #45d1b8;\n}\n\n.container-graph {\n flex-basis: 50%;\n display: flex;\n}\n\n.price {\n min-width: 5.25rem;\n}\n\n.graph {\n border-radius: 0 0.35rem 0.35rem 0;\n padding-left: 0.25rem;\n height: 2rem;\n}", ""]); @@ -369,7 +365,7 @@ exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE exports = module.exports = __webpack_require__("DjJv")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.special-elec-container {\n color: white;\n}\n.special-elec-container .elec-icon {\n margin: auto;\n display: block;\n}\n.special-elec-container .title {\n text-align: center;\n margin-top: 1rem;\n color: #e0e0e0;\n}\n.special-elec-container .navigator {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n text-align: center;\n margin: 1rem 0;\n}\n.special-elec-container .navigator .text-1 {\n color: #e0e0e0;\n}\n.special-elec-container .navigator .week {\n color: #e2bca1;\n}\n.special-elec-container .navigator .weekend {\n color: #ffd597;\n}\n.special-elec-container .minIcon {\n margin: auto 0.8rem auto 0;\n}\n.special-elec-container .activation-text {\n margin: 1rem 0 0.7rem 0;\n}\n.special-elec-container .oauthform-button-content {\n display: flex;\n padding: 0.5rem;\n}\n.special-elec-container .oauthform-button-text {\n text-align: left;\n margin-left: 1rem;\n}\n.special-elec-container .container {\n margin-bottom: 1rem;\n padding: 1rem;\n border: 1px solid #e0e0e0;\n border-radius: 10px;\n display: flex;\n}\n.special-elec-container .container .min {\n max-width: 150px;\n}\n.special-elec-container .container .text {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n.special-elec-container .container .value {\n margin-left: auto;\n display: flex;\n flex-direction: column;\n align-items: self-end;\n min-width: 80px;\n justify-content: space-between;\n}\n.special-elec-container .container .kvAval {\n margin: auto 0 auto auto;\n}\n.special-elec-container .consomin {\n min-height: 100px;\n}\n.special-elec-container .no_data {\n text-align: center;\n color: white;\n}\n.special-elec-container button {\n display: flex;\n margin: auto;\n}\n\n.graph-elec-half-hour {\n height: 12rem;\n margin-top: 2rem;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.special-elec-container {\n color: white;\n}\n.special-elec-container .elec-icon {\n margin: auto;\n display: block;\n}\n.special-elec-container .title {\n text-align: center;\n margin-top: 1rem;\n color: #e0e0e0;\n}\n.special-elec-container .navigator {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n text-align: center;\n margin: 1rem 0;\n}\n.special-elec-container .navigator .text-1 {\n color: #e0e0e0;\n}\n.special-elec-container .navigator .week {\n color: #e2bca1;\n}\n.special-elec-container .navigator .weekend {\n color: #ffd597;\n}\n.special-elec-container .minIcon {\n margin: auto 0.8rem auto 0;\n}\n.special-elec-container .activation-text {\n margin: 1rem 0 0.7rem 0;\n}\n.special-elec-container .oauthform-button-content {\n display: flex;\n padding: 0.5rem;\n}\n.special-elec-container .oauthform-button-text {\n text-align: left;\n margin-left: 1rem;\n}\n.special-elec-container .container {\n margin-bottom: 1rem;\n padding: 1rem;\n border: 1px solid #e0e0e0;\n border-radius: 10px;\n display: flex;\n}\n.special-elec-container .container .min {\n max-width: 150px;\n}\n.special-elec-container .container .text {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n width: 100%;\n}\n.special-elec-container .container .text .row {\n justify-content: space-between;\n}\n.special-elec-container .container .value {\n margin-left: auto;\n display: flex;\n flex-direction: column;\n align-items: self-end;\n min-width: 80px;\n justify-content: space-between;\n}\n.special-elec-container .container .kvAval {\n margin: auto 0 auto auto;\n}\n.special-elec-container .consomin {\n min-height: 100px;\n}\n.special-elec-container .no_data {\n text-align: center;\n color: white;\n}\n.special-elec-container button {\n display: flex;\n margin: auto;\n}\n\n.graph-elec-half-hour {\n height: 12rem;\n margin-top: 2rem;\n}", ""]); @@ -419,11 +415,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var _core = __webpack_require__("rMFn"); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); var _hooks = __webpack_require__("6FOS"); __webpack_require__("kSCg"); @@ -446,14 +441,13 @@ var TemperatureComparisonModal = function TemperatureComparisonModal(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { className: "modal-start-root" - }, /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('analysis.temperature_comparison.modal.close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 18 - })), /*#__PURE__*/_react.default.createElement("div", { + sized: 18, + onClick: handleCloseClick, + "aria-label": t('analysis.temperature_comparison.modal.close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "content" }, /*#__PURE__*/_react.default.createElement("div", { className: "text-20-bold subtitle" @@ -564,7 +558,7 @@ exports.default = _default; exports = module.exports = __webpack_require__("DjJv")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.analysis-graph .consumption-title {\n display: flex;\n justify-content: space-between;\n margin-bottom: 1rem;\n}\n.analysis-graph .consumption-title .user-title,\n.analysis-graph .consumption-title .average-title {\n flex-basis: 45%;\n line-height: 3rem;\n}\n.analysis-graph .consumption-title .user-title {\n line-height: 3rem;\n text-align: right;\n color: #e3b82a;\n}\n.analysis-graph .consumption-title .average-title {\n color: #bfcce4;\n}\n.analysis-graph .consumption-sep {\n border: 1px solid #7b7b7b;\n margin: 1rem 0;\n}\n.analysis-graph div.expansion-panel-root {\n border: solid 2px #bfcce4;\n color: #bfcce4;\n margin-block: 0 !important;\n box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.5490196078);\n}\n.analysis-graph .accordion-title {\n font-weight: bold;\n}\n.analysis-graph .accordion-desc {\n color: #e0e0e0;\n}\n.analysis-graph div.expansion-panel-summary {\n padding: 0 1rem;\n}\n.analysis-graph .loader-container {\n min-height: 350px;\n display: flex;\n justify-content: center;\n align-items: center;\n margin: auto;\n}\n.analysis-graph .accordion-icon {\n color: #bfcce4;\n}\n\n.no-profile {\n display: flex;\n align-items: center;\n flex-direction: column;\n gap: 1rem;\n}\n.no-profile div {\n text-align: center;\n color: #ffffff;\n}\n.no-profile button {\n max-width: 320px;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.analysis-graph {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n.analysis-graph .consumption-title {\n display: flex;\n justify-content: space-between;\n}\n.analysis-graph .consumption-title .user-title,\n.analysis-graph .consumption-title .average-title {\n flex-basis: 45%;\n line-height: 3rem;\n}\n.analysis-graph .consumption-title .user-title {\n line-height: 3rem;\n text-align: right;\n color: #e3b82a;\n}\n.analysis-graph .consumption-title .average-title {\n color: #bfcce4;\n}\n.analysis-graph .consumption-sep {\n border: 1px solid #7b7b7b;\n margin: 1rem 0;\n}\n.analysis-graph div.expansion-panel-root {\n border: solid 2px #bfcce4;\n color: #bfcce4;\n margin-block: 0 !important;\n box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.5490196078);\n}\n.analysis-graph .accordion-title {\n font-weight: bold;\n}\n.analysis-graph .accordion-desc {\n color: #e0e0e0;\n}\n.analysis-graph div.expansion-panel-summary {\n padding: 0 1rem;\n}\n.analysis-graph .loader-container {\n min-height: 350px;\n display: flex;\n justify-content: center;\n align-items: center;\n margin: auto;\n}\n.analysis-graph .accordion-icon {\n color: #bfcce4;\n}\n\n.no-profile {\n display: flex;\n align-items: center;\n flex-direction: column;\n gap: 1rem;\n}\n.no-profile div {\n text-align: center;\n color: #ffffff;\n}\n.no-profile button {\n max-width: 320px;\n}", ""]); @@ -625,11 +619,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var _core = __webpack_require__("rMFn"); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); var _utils = __webpack_require__("RgLR"); __webpack_require__("GCHL"); @@ -652,14 +645,12 @@ var ElecInfoModal = function ElecInfoModal(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, t('elec_info_modal.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('elec_info_modal.accessibility.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('elec_info_modal.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { + onClick: handleCloseClick, + "aria-label": t('elec_info_modal.accessibility.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "elecInfoModal" }, /*#__PURE__*/_react.default.createElement("div", { className: "title text-18-bold" @@ -1097,26 +1088,30 @@ var Comparison = function Comparison(_ref) { return /*#__PURE__*/_react.default.createElement("div", { className: "comparison" }, !isLoading && /*#__PURE__*/_react.default.createElement("div", { + role: "tablist", className: "tabs" }, /*#__PURE__*/_react.default.createElement(_core.Button, { + role: "tab", className: period === 'year' ? 'active' : '', onClick: function onClick() { return dispatch((0, _analysis.setPeriod)('year')); } }, t("analysis.compare.year_tab")), /*#__PURE__*/_react.default.createElement(_core.Button, { + role: "tab", className: period === 'month' ? 'active' : '', onClick: function onClick() { return dispatch((0, _analysis.setPeriod)('month')); } }, t("analysis.compare.month_tab"))), /*#__PURE__*/_react.default.createElement("div", { + role: "list", className: "performanceIndicators" - }, isLoading && /*#__PURE__*/_react.default.createElement("div", { + }, /*#__PURE__*/_react.default.createElement(_TemperatureComparison.default, null), isLoading && /*#__PURE__*/_react.default.createElement("div", { style: { height: "".concat(loaderPlaceholderHeight, "px"), display: 'flex', justifyContent: 'center' } - }, /*#__PURE__*/_react.default.createElement(_Loader.default, null)), !isLoading && /*#__PURE__*/_react.default.createElement(_TemperatureComparison.default, null), !isLoading && fluidsWithData.length === 0 && [_enums.FluidType.ELECTRICITY, _enums.FluidType.WATER, _enums.FluidType.GAS].map(function (fluid) { + }, /*#__PURE__*/_react.default.createElement(_Loader.default, null)), !isLoading && fluidsWithData.length === 0 && [_enums.FluidType.ELECTRICITY, _enums.FluidType.WATER, _enums.FluidType.GAS].map(function (fluid) { return /*#__PURE__*/_react.default.createElement(_FluidPerformanceIndicator.default, { key: fluid, fluidType: fluid, @@ -1179,7 +1174,7 @@ exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE exports = module.exports = __webpack_require__("DjJv")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.fi-root {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 0.5rem 1.5rem;\n}\n@media only screen and (max-width : 768px) {\n .fi-root {\n margin-bottom: 0;\n }\n}\n.fi-root .fi-content {\n min-height: 23.875rem;\n max-width: 45.75rem;\n width: 100%;\n}\n.fi-root .fi-content .fi-header {\n margin-top: 1rem;\n margin-bottom: 1.25rem;\n color: #e0e0e0;\n font-size: 1rem;\n}\n\n.fpi {\n display: flex;\n flex-direction: row;\n border: 1px solid #7b7b7b;\n border-radius: 4px;\n padding: 16px 22px;\n gap: 1rem;\n align-items: center;\n box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.5490196078);\n transition: background-color 0.3s;\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n cursor: pointer;\n}\n.fpi:hover {\n background: linear-gradient(180deg, rgba(70, 71, 77, 0.7) 0%, rgba(57, 58, 63, 0.7) 100%);\n}\n.fpi .fpi-content {\n display: flex;\n flex-direction: column;\n gap: 4px;\n text-align: left;\n}\n.fpi .fpi-content .fpi-value {\n display: flex;\n flex-direction: row;\n gap: 4px;\n align-items: flex-end;\n}\n.fpi .fpi-content .fpi-value .fpi-load {\n font-size: 1.75rem;\n font-weight: 900;\n color: #ffffff;\n}\n.fpi .fpi-content .fpi-value .fpi-unit {\n font-size: 1.125rem;\n color: #e0e0e0;\n}\n.fpi .fpi-content .fpi-comparison .percent {\n font-weight: 700;\n}\n.fpi .fpi-content .fpi-comparison .percent.positive {\n color: #d25959;\n}\n.fpi .fpi-content .fpi-comparison .percent.negative {\n color: #7fd771;\n}\n.fpi .fpi-content .fpi-comparison .fpi-comparison-date {\n color: #a0a0a0;\n}\n.fpi .fpi-content .fpi-no-comparison {\n font-size: 0.875rem;\n color: #a0a0a0;\n}\n.fpi .fpi-content .fpi-content-no-data {\n color: #e0e0e0;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.fi-root {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 0.5rem 1.5rem;\n}\n@media only screen and (max-width : 768px) {\n .fi-root {\n margin-bottom: 0;\n }\n}\n.fi-root .fi-content {\n min-height: 23.875rem;\n max-width: 45.75rem;\n width: 100%;\n}\n.fi-root .fi-content .fi-header {\n margin-top: 1rem;\n margin-bottom: 1.25rem;\n color: #e0e0e0;\n font-size: 1rem;\n}\n\nbutton.fpi {\n border: 1px solid #7b7b7b;\n box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.5490196078);\n transition: background-color 0.3s;\n}\nbutton.fpi .fpi-content {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\nbutton.fpi .fpi-content .fpi-value {\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n}\nbutton.fpi .fpi-content .fpi-value .fpi-load {\n font-size: 1.75rem;\n font-weight: 900;\n color: #ffffff;\n}\nbutton.fpi .fpi-content .fpi-value .fpi-unit {\n font-size: 1.125rem;\n color: #e0e0e0;\n}\nbutton.fpi .fpi-content .fpi-comparison .percent {\n font-weight: 700;\n}\nbutton.fpi .fpi-content .fpi-comparison .percent.positive {\n color: #d25959;\n}\nbutton.fpi .fpi-content .fpi-comparison .percent.negative {\n color: #7fd771;\n}\nbutton.fpi .fpi-content .fpi-comparison .fpi-comparison-date {\n color: #a0a0a0;\n}\nbutton.fpi .fpi-content .fpi-no-comparison {\n font-size: 0.875rem;\n color: #a0a0a0;\n}\nbutton.fpi .fpi-content .fpi-content-no-data {\n color: #e0e0e0;\n}", ""]); @@ -1244,11 +1239,11 @@ var _regenerator = _interopRequireDefault(__webpack_require__("hJxD")); var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("HZZ/")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); var _core = __webpack_require__("rMFn"); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); var _EstimatedConsumptionModal = _interopRequireDefault(__webpack_require__("ACk+")); var _Loader = _interopRequireDefault(__webpack_require__("6oIw")); var _cozyClient = __webpack_require__("xEu0"); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _consumption = _interopRequireDefault(__webpack_require__("zET3")); @@ -1310,7 +1305,12 @@ var TotalAnalysisChart = function TotalAnalysisChart(_ref) { }; consumptionService = new _consumption.default(client); _context.next = 4; - return consumptionService.getGraphData(timePeriod, _enums.TimeStep.MONTH, fluidsWithData, undefined, undefined, true); + return consumptionService.getGraphData({ + timePeriod: timePeriod, + timeStep: _enums.TimeStep.MONTH, + fluidTypes: fluidsWithData, + isHome: true + }); case 4: monthTotalData = _context.sent; if (monthTotalData !== null && monthTotalData !== void 0 && monthTotalData.actualData) { @@ -1384,14 +1384,17 @@ var TotalAnalysisChart = function TotalAnalysisChart(_ref) { return setOpenEstimationModal(false); } }), dataLoadValueDetailArray && fluidsWithData.length > 1 && /*#__PURE__*/_react.default.createElement("div", { + role: "list", + "aria-label": t('analysis_pie.details'), className: "total-card-container" }, dataLoadValueDetailArray.map(function (dataload, index) { return /*#__PURE__*/_react.default.createElement("div", { key: index, + role: "listitem", className: "total-card" }, /*#__PURE__*/_react.default.createElement("div", { className: "text-18-bold fluidconso" - }, dataload.value !== -1 ? "".concat((0, _utils.formatNumberValues)(dataload.value), " \u20AC") : '--- €'), /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, dataload.value !== -1 ? "".concat((0, _utils.formatNumberValues)(dataload.value), " \u20AC") : '--- €'), /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { className: "euro-fluid-icon", icon: (0, _picto.getNavPicto)(index, true, true), size: 38 @@ -1442,50 +1445,46 @@ var ProfileComparatorRow = function ProfileComparatorRow(_ref) { var isMulti = fluidType === _enums.FluidType.MULTIFLUID; var isElecOrGas = fluidType === _enums.FluidType.ELECTRICITY || fluidType === _enums.FluidType.GAS; var FLUIDNAME = (0, _utils.getFluidName)(fluidType).toUpperCase(); - var fluidLoad = forecast && !isMulti ? forecast.fluidForecast[fluidType].load : 0; + var fluidLoad = !isMulti && forecast ? forecast.fluidForecast[fluidType].load : 0; var formatFluidConsumptionForConso = function formatFluidConsumptionForConso() { if (isMulti) { return "".concat((0, _utils.formatNumberValues)(userPriceConsumption).toString(), " \u20AC"); - } else { - if (performanceValue) { - // keeps unit in kWh for electricity and gas - if (isElecOrGas) { - return "".concat(Math.round(performanceValue), " ").concat(t("FLUID.".concat(FLUIDNAME, ".UNIT"))); - } - return performanceValue >= 1000 || fluidLoad >= 1000 ? (0, _utils.formatNumberValues)(performanceValue / 1000).toString() + ' ' + t("FLUID.".concat(FLUIDNAME, ".MEGAUNIT")) : Math.round(performanceValue) + ' ' + t("FLUID.".concat(FLUIDNAME, ".UNIT")); - } else { - return '-'; + } + if (performanceValue) { + // keeps unit in kWh for electricity and gas + if (isElecOrGas) { + return "".concat(Math.round(performanceValue), " ").concat(t("FLUID.".concat(FLUIDNAME, ".UNIT"))); } + return performanceValue >= 1000 || fluidLoad >= 1000 ? (0, _utils.formatNumberValues)(performanceValue / 1000).toString() + ' ' + t("FLUID.".concat(FLUIDNAME, ".MEGAUNIT")) : Math.round(performanceValue) + ' ' + t("FLUID.".concat(FLUIDNAME, ".UNIT")); } + return '-'; }; var formatFluidConsumptionForForecast = function formatFluidConsumptionForForecast() { if (isMulti) { return "".concat((0, _utils.formatNumberValues)(homePriceConsumption).toString(), " \u20AC"); - } else { - // keeps unit in kWh for electricity and gas - if (isElecOrGas) { - return "".concat(Math.round(fluidLoad), " ").concat(t('FLUID.' + FLUIDNAME + '.UNIT')); - } - return performanceValue && performanceValue >= 1000 || fluidLoad >= 1000 ? (0, _utils.formatNumberValues)(fluidLoad / 1000).toString() + ' ' + t("FLUID.".concat(FLUIDNAME, ".MEGAUNIT")) : Math.round(fluidLoad) + ' ' + t("FLUID.".concat(FLUIDNAME, ".UNIT")); } + // keeps unit in kWh for electricity and gas + if (isElecOrGas) { + return "".concat(Math.round(fluidLoad), " ").concat(t("FLUID.".concat(FLUIDNAME, ".UNIT"))); + } + return performanceValue && performanceValue >= 1000 || fluidLoad >= 1000 ? (0, _utils.formatNumberValues)(fluidLoad / 1000).toString() + ' ' + t("FLUID.".concat(FLUIDNAME, ".MEGAUNIT")) : Math.round(fluidLoad) + ' ' + t("FLUID.".concat(FLUIDNAME, ".UNIT")); }; var getWidthForConso = function getWidthForConso() { if (isMulti) { return "".concat(userPriceConsumption / maxPriceConsumption * 100, "%"); - } else { - return "".concat(converterService.LoadToEuro(performanceValue || 0, fluidType) / maxPriceConsumption * 100, "%"); } + return "".concat(converterService.LoadToEuro(performanceValue || 0, fluidType) / maxPriceConsumption * 100, "%"); }; var getWidthForForecast = function getWidthForForecast() { if (isMulti) { return "".concat(homePriceConsumption / maxPriceConsumption * 100, "%"); - } else { - var fluidValue = forecast ? forecast.fluidForecast[fluidType].value : 0; - return "".concat(fluidValue / maxPriceConsumption * 100, "%"); } + var fluidValue = forecast ? forecast.fluidForecast[fluidType].value : 0; + return "".concat(fluidValue / maxPriceConsumption * 100, "%"); }; var comparaisonText = connected ? formatFluidConsumptionForConso() : t("analysis.no_data"); return /*#__PURE__*/_react.default.createElement("div", { + "aria-label": t("analysis.accessibility.comparison_".concat(FLUIDNAME.toLowerCase())), className: "analysisRow consumption-".concat(FLUIDNAME.toLowerCase()) }, /*#__PURE__*/_react.default.createElement("div", { className: "user-graph" @@ -1538,18 +1537,17 @@ exports.default = void 0; var _regenerator = _interopRequireDefault(__webpack_require__("hJxD")); var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("HZZ/")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); -var _IconButton = _interopRequireDefault(__webpack_require__("x0Kp")); var _graphIcon = _interopRequireDefault(__webpack_require__("dXiQ")); var _leftArrow = _interopRequireDefault(__webpack_require__("2JOZ")); var _rightArrow = _interopRequireDefault(__webpack_require__("Mvn8")); var _BarChart = _interopRequireDefault(__webpack_require__("Ddw2")); var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _DataloadSection = _interopRequireDefault(__webpack_require__("LW1u")); var _useChartResize2 = __webpack_require__("ITzw"); var _Loader = _interopRequireDefault(__webpack_require__("6oIw")); var _cozyClient = __webpack_require__("xEu0"); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _consumption = _interopRequireDefault(__webpack_require__("zET3")); @@ -1633,7 +1631,11 @@ var MaxConsumptionCard = function MaxConsumptionCard(_ref) { }; consumptionService = new _consumption.default(client); _context.next = 7; - return consumptionService.getGraphData(timePeriod, _enums.TimeStep.DAY, [currentFluid]); + return consumptionService.getGraphData({ + timePeriod: timePeriod, + timeStep: _enums.TimeStep.DAY, + fluidTypes: [currentFluid] + }); case 7: monthlyData = _context.sent; if (monthlyData && (monthlyData === null || monthlyData === void 0 ? void 0 : monthlyData.actualData.length) > 0) { @@ -1676,30 +1678,28 @@ var MaxConsumptionCard = function MaxConsumptionCard(_ref) { return dataload[maxIndex]; }; var buttonPrev = function buttonPrev() { - return /*#__PURE__*/_react.default.createElement(_IconButton.default, { - "aria-label": t('consumption.accessibility.button_previous_value'), + return /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { + icon: _leftArrow.default, + sized: 24, onClick: function onClick() { return handleFluidChange(-1); }, - className: "arrow-prev", - disabled: fluidsWithData.length <= 1 - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { - icon: _leftArrow.default, - size: 24 - })); + disabled: fluidsWithData.length <= 1, + "aria-label": t('consumption.accessibility.button_previous_value'), + className: "arrow-prev" + }); }; var buttonNext = function buttonNext() { - return /*#__PURE__*/_react.default.createElement(_IconButton.default, { - "aria-label": t('consumption.accessibility.button_next_value'), + return /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { + icon: _rightArrow.default, + sized: 24, onClick: function onClick() { return handleFluidChange(1); }, - className: "arrow-next", - disabled: fluidsWithData.length <= 1 - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { - icon: _rightArrow.default, - size: 24 - })); + disabled: fluidsWithData.length <= 1, + "aria-label": t('consumption.accessibility.button_next_value'), + className: "arrow-next" + }); }; return /*#__PURE__*/_react.default.createElement("div", { className: "max-consumption-container", @@ -1805,6 +1805,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; +var _StyledCard = _interopRequireDefault(__webpack_require__("y8/m")); var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); var _I18n = __webpack_require__("nUfk"); var _enums = __webpack_require__("j0hM"); @@ -1848,7 +1849,8 @@ var FluidPerformanceIndicator = function FluidPerformanceIndicator(_ref) { } navigate(url); }; - return /*#__PURE__*/_react.default.createElement("button", { + return /*#__PURE__*/_react.default.createElement(_StyledCard.default, { + role: "listitem", className: "fpi", onClick: function onClick() { return handleFluidClick(fluidType); @@ -1857,10 +1859,12 @@ var FluidPerformanceIndicator = function FluidPerformanceIndicator(_ref) { icon: iconType, size: 50 }), /*#__PURE__*/_react.default.createElement("div", { + "data-testid": "fluid-type-".concat(_enums.FluidType[fluidType]), className: "fpi-content" }, !displayedValue && /*#__PURE__*/_react.default.createElement("div", { className: "fpi-content-no-data" }, /*#__PURE__*/_react.default.createElement("span", null, t('performance_indicator.fpi.no_data'))), displayedValue && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", { + "data-testid": "fluid-value-".concat(_enums.FluidType[fluidType]), className: "fpi-value" }, /*#__PURE__*/_react.default.createElement("span", { className: "fpi-load" @@ -1869,6 +1873,7 @@ var FluidPerformanceIndicator = function FluidPerformanceIndicator(_ref) { }, t("FLUID.".concat(_enums.FluidType[fluidType], ".UNIT")))), (performanceIndicator === null || performanceIndicator === void 0 ? void 0 : performanceIndicator.percentageVariation) === null && /*#__PURE__*/_react.default.createElement("span", { className: "fpi-no-comparison" }, t('performance_indicator.fpi.no_comparison')), (performanceIndicator === null || performanceIndicator === void 0 ? void 0 : performanceIndicator.percentageVariation) !== null && /*#__PURE__*/_react.default.createElement("div", { + "data-testid": "fluid-comparison-".concat(_enums.FluidType[fluidType]), className: "fpi-comparison" }, /*#__PURE__*/_react.default.createElement("span", { className: "percent ".concat(positive ? 'positive' : 'negative') @@ -1982,7 +1987,7 @@ var ___CSS_LOADER_URL___0___ = urlEscape(__webpack_require__("2a4+")); var ___CSS_LOADER_URL___1___ = urlEscape(__webpack_require__("W1x+")); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.temperatureComparison {\n display: flex;\n border: 1px solid #7b7b7b;\n border-radius: 4px;\n padding: 4px 4px 8px 22px;\n box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.5490196078);\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n background-position: bottom right;\n background-repeat: no-repeat;\n}\n.temperatureComparison.hot {\n background-image: url(" + ___CSS_LOADER_URL___0___ + "), linear-gradient(259deg, rgba(6, 29, 62, 0) 25.28%, #77aee0 121.36%), radial-gradient(185.82% 146.65% at 50% 79.83%, rgba(6, 29, 62, 0) 0%, #e0bc77 100%);\n}\n.temperatureComparison.cold {\n background-image: url(" + ___CSS_LOADER_URL___1___ + "), radial-gradient(185.82% 146.65% at 50% 79.83%, rgba(6, 29, 62, 0) 0%, #77a3e0 100%);\n}\n.temperatureComparison .tc-content {\n text-align: left;\n padding-top: 4px;\n flex-grow: 1;\n color: #ffffff;\n}\n.temperatureComparison .tc-content .tc-text {\n font-weight: 200;\n}\n.temperatureComparison .tc-content .tc-period {\n font-weight: 900;\n}\n.temperatureComparison .info-icon {\n padding: 0;\n stroke: #ffffff;\n align-items: flex-start;\n height: 100%;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.temperatureComparison {\n display: flex;\n align-items: center;\n border: 1px solid #7b7b7b;\n border-radius: 4px;\n padding: 8px 4px 8px 20px;\n box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.5490196078);\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n background-position: bottom right;\n background-repeat: no-repeat;\n height: 60px;\n transition: all 0.3s ease-in-out;\n}\n.temperatureComparison.loading {\n justify-content: center;\n}\n.temperatureComparison.hot {\n background-image: url(" + ___CSS_LOADER_URL___0___ + "), linear-gradient(259deg, rgba(6, 29, 62, 0) 25.28%, #77aee0 121.36%), radial-gradient(185.82% 146.65% at 50% 79.83%, rgba(6, 29, 62, 0) 0%, #e0bc77 100%);\n}\n.temperatureComparison.cold {\n background-image: url(" + ___CSS_LOADER_URL___1___ + "), radial-gradient(185.82% 146.65% at 50% 79.83%, rgba(6, 29, 62, 0) 0%, #77a3e0 100%);\n}\n.temperatureComparison .tc-content {\n text-align: left;\n flex-grow: 1;\n color: #ffffff;\n}\n.temperatureComparison .buttonContainer {\n display: flex;\n align-items: flex-start;\n height: 100%;\n}\n.temperatureComparison .buttonContainer .info-icon {\n align-items: flex-start;\n padding: 0;\n position: relative;\n top: -4px;\n stroke: #ffffff;\n}", ""]); @@ -2411,6 +2416,7 @@ var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("HZZ/")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); var _exclamationMark = _interopRequireDefault(__webpack_require__("ojjW")); var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); +var _Loader = _interopRequireDefault(__webpack_require__("6oIw")); var _cozyClient = __webpack_require__("xEu0"); var _I18n = __webpack_require__("nUfk"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); @@ -2429,18 +2435,19 @@ var TemperatureComparison = function TemperatureComparison() { }), period = _useAppSelector.period, analysisMonth = _useAppSelector.analysisMonth; - var _useState = (0, _react.useState)(), + var _useState = (0, _react.useState)(''), _useState2 = (0, _slicedToArray2.default)(_useState, 2), temperatureDifference = _useState2[0], setTemperatureDifference = _useState2[1]; - var _useState3 = (0, _react.useState)(true), + var _useState3 = (0, _react.useState)(false), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), - positive = _useState4[0], - setPositive = _useState4[1]; - var _useState5 = (0, _react.useState)(false), + openDetailsModal = _useState4[0], + setOpenDetailsModal = _useState4[1]; + var _useState5 = (0, _react.useState)(true), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), - openTemperatureComparisonModal = _useState6[0], - setOpenTemperatureComparisonModal = _useState6[1]; + isLoading = _useState6[0], + setIsLoading = _useState6[1]; + var positive = Number(temperatureDifference) >= 0; var consumptionService = (0, _react.useMemo)(function () { return new _consumption.default(client); }, [client]); @@ -2461,25 +2468,24 @@ var TemperatureComparison = function TemperatureComparison() { } function _handleTemperatureComparison() { _handleTemperatureComparison = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() { - var startMonthTemperature, endMonthTemperature, _temperatureDifference; + var _yield$Promise$all, _yield$Promise$all2, startTemperature, endTemperature, _temperatureDifference; return _regenerator.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; - return consumptionService.fetchAvgTemperature(comparisonDates.startMonth.year, comparisonDates.startMonth.month); + return Promise.all([consumptionService.fetchAvgTemperature(comparisonDates.startMonth.year, comparisonDates.startMonth.month), consumptionService.fetchAvgTemperature(comparisonDates.endMonth.year, comparisonDates.endMonth.month)]); case 2: - startMonthTemperature = _context.sent; - _context.next = 5; - return consumptionService.fetchAvgTemperature(comparisonDates.endMonth.year, comparisonDates.endMonth.month); - case 5: - endMonthTemperature = _context.sent; - if (startMonthTemperature !== null && endMonthTemperature !== null) { - _temperatureDifference = endMonthTemperature - startMonthTemperature; + _yield$Promise$all = _context.sent; + _yield$Promise$all2 = (0, _slicedToArray2.default)(_yield$Promise$all, 2); + startTemperature = _yield$Promise$all2[0]; + endTemperature = _yield$Promise$all2[1]; + if (startTemperature !== null && endTemperature !== null) { + _temperatureDifference = endTemperature - startTemperature; setTemperatureDifference(_temperatureDifference.toFixed(1)); - setPositive(_temperatureDifference >= 0); } - case 7: + setIsLoading(false); + case 8: case "end": return _context.stop(); } @@ -2490,7 +2496,13 @@ var TemperatureComparison = function TemperatureComparison() { } handleTemperatureComparison(); }, [consumptionService, comparisonDates.endMonth.month, comparisonDates.endMonth.year, comparisonDates.startMonth.month, comparisonDates.startMonth.year]); - return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, temperatureDifference && /*#__PURE__*/_react.default.createElement("div", { + if (isLoading) { + return /*#__PURE__*/_react.default.createElement("div", { + className: "temperatureComparison loading" + }, /*#__PURE__*/_react.default.createElement(_Loader.default, null)); + } + if (!temperatureDifference) return null; + return /*#__PURE__*/_react.default.createElement("div", { className: "temperatureComparison ".concat(positive ? 'hot' : 'cold') }, /*#__PURE__*/_react.default.createElement("div", { className: "tc-content" @@ -2499,26 +2511,28 @@ var TemperatureComparison = function TemperatureComparison() { }, positive ? '+' : '', temperatureDifference, "\xA0"), /*#__PURE__*/_react.default.createElement("span", { className: "text-18" }, t('analysis.temperature_comparison.unit'))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("span", { - className: "tc-text text-12" + className: "text-12" }, t('analysis.temperature_comparison.comparison')), /*#__PURE__*/_react.default.createElement("span", { - className: "tc-period text-12-bold" + className: "text-12-bold" }, "\xA0", comparisonDates.startMonth.toLocaleString({ month: 'long', year: 'numeric' - })))), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { + })))), /*#__PURE__*/_react.default.createElement("div", { + className: "buttonContainer" + }, /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _exclamationMark.default, sized: 16, onClick: function onClick() { - return setOpenTemperatureComparisonModal(true); + return setOpenDetailsModal(true); }, "aria-label": t('analysis.temperature_comparison.info_button'), className: "info-icon" - }), /*#__PURE__*/_react.default.createElement(_TemperatureComparisonModal.default, { - open: openTemperatureComparisonModal, + })), /*#__PURE__*/_react.default.createElement(_TemperatureComparisonModal.default, { + open: openDetailsModal, handleCloseClick: function handleCloseClick() { - return setOpenTemperatureComparisonModal(false); + return setOpenDetailsModal(false); } - }))); + })); }; var _default = TemperatureComparison; exports.default = _default; @@ -2549,7 +2563,6 @@ var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); var _Loader = _interopRequireDefault(__webpack_require__("6oIw")); var _cozyClient = __webpack_require__("xEu0"); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _reactRouterDom = __webpack_require__("Iyno"); @@ -2697,13 +2710,12 @@ var ProfileComparator = function ProfileComparator(_ref) { }, size: "large", "data-testid": "goToProfile" - }, t('analysis.accessibility.button_go_to_profil')), /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('analysis.accessibility.button_go_to_profil')), /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _noProfilePlaceholder.default, width: "100%", - height: "60%", - alt: "pas de profil remplis" + height: "60%" })); - var Consumption = /*#__PURE__*/_react.default.createElement("div", { + var comparison = /*#__PURE__*/_react.default.createElement("div", { className: "analysis-graph" }, isLoading ? /*#__PURE__*/_react.default.createElement("div", { className: "loader-container" @@ -2711,7 +2723,7 @@ var ProfileComparator = function ProfileComparator(_ref) { className: "consumption-title text-20-bold" }, /*#__PURE__*/_react.default.createElement("div", { className: "user-title" - }, t('analysis.user_consumption')), /*#__PURE__*/_react.default.createElement("div", null), /*#__PURE__*/_react.default.createElement("div", { + }, t('analysis.user_consumption')), /*#__PURE__*/_react.default.createElement("div", { className: "average-title" }, t("analysis.comparison"))), /*#__PURE__*/_react.default.createElement(_ProfileComparatorRow.default, { fluidType: _enums.FluidType.MULTIFLUID, @@ -2753,9 +2765,8 @@ var ProfileComparator = function ProfileComparator(_ref) { } }, /*#__PURE__*/_react.default.createElement(_core.AccordionSummary, { "aria-label": t('profile_type.accessibility.button_toggle_average_home'), - expandIcon: /*#__PURE__*/_react.default.createElement(_Icon.default, { + expandIcon: /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _chevronDown.default, - size: 16, className: "accordion-icon" }), classes: { @@ -2788,9 +2799,7 @@ var ProfileComparator = function ProfileComparator(_ref) { }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _profileEdit.default, size: 40 - }))), /*#__PURE__*/_react.default.createElement("div", { - className: "analysis-graph" - }, !profile.isProfileTypeCompleted && profileNotCompleted, profile.isProfileTypeCompleted && Consumption)); + }))), !profile.isProfileTypeCompleted && profileNotCompleted, profile.isProfileTypeCompleted && comparison); }; var _default = ProfileComparator; exports.default = _default; diff --git a/4/ecolyo.99b4574d799ae4772f6e.js b/4/ecolyo.3185369b41951a4b6742.js similarity index 97% rename from 4/ecolyo.99b4574d799ae4772f6e.js rename to 4/ecolyo.3185369b41951a4b6742.js index 9d91037d0deeca36875545881f9d116d12e2bd78..5d7a7dc8c6fbe8c6cbed13ac45cf5d1ca4ac53cc 100644 --- a/4/ecolyo.99b4574d799ae4772f6e.js +++ b/4/ecolyo.3185369b41951a4b6742.js @@ -37,8 +37,9 @@ var _core = __webpack_require__("rMFn"); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _questionMark = _interopRequireDefault(__webpack_require__("pAsk")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); __webpack_require__("H2r+"); var NoDataModal = function NoDataModal(_ref) { @@ -56,18 +57,16 @@ var NoDataModal = function NoDataModal(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, t('consumption_visualizer.modal.window_title')), /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('consumption_visualizer.modal.close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('consumption_visualizer.modal.window_title')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { + onClick: handleCloseClick, + "aria-label": t('consumption_visualizer.modal.close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "nodata-modal" }, /*#__PURE__*/_react.default.createElement("div", { className: "question-mark" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _questionMark.default, size: 36 })), /*#__PURE__*/_react.default.createElement("div", { @@ -394,8 +393,8 @@ var _defineProperty2 = _interopRequireDefault(__webpack_require__("J58c")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); var _core = __webpack_require__("rMFn"); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _hooks = __webpack_require__("6FOS"); @@ -476,14 +475,12 @@ var EpglConnectModal = function EpglConnectModal(_ref) { root: 'modal-root', paper: 'modal-paper' } - }, /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('auth.accessibility.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseModal - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { + onClick: handleCloseModal, + "aria-label": t('auth.accessibility.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "partners-connection-step-content" }, steps[currentStep].content), /*#__PURE__*/_react.default.createElement("div", { className: "partners-connection-step-navigation" @@ -573,14 +570,19 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; +var _I18n = __webpack_require__("nUfk"); var _enums = __webpack_require__("j0hM"); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); var _FluidButton = _interopRequireDefault(__webpack_require__("jjMk")); __webpack_require__("m067"); var FluidButtons = function FluidButtons(_ref) { var activeFluid = _ref.activeFluid; + var _useI18n = (0, _I18n.useI18n)(), + t = _useI18n.t; var orderedFluids = [_enums.FluidType.MULTIFLUID, _enums.FluidType.ELECTRICITY, _enums.FluidType.WATER, _enums.FluidType.GAS]; return /*#__PURE__*/_react.default.createElement("div", { + role: "tablist", + "aria-label": t('consumption.accessibility.fluid_menu'), className: "fluid-buttons" }, /*#__PURE__*/_react.default.createElement("div", { className: "content" @@ -912,7 +914,6 @@ var _triggers = __webpack_require__("JPZu"); var _ConnectionFlow = _interopRequireDefault(__webpack_require__("LJzA")); var _flowEvents = __webpack_require__("PKGP"); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _luxon = __webpack_require__("1EDv"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); @@ -1267,7 +1268,7 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) { } return /*#__PURE__*/_react.default.createElement("div", { className: "konnector-icon" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: currentFluidStatus.connection.account ? iconType : _offlineParam.default, size: 49 }), statusIcon && /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { @@ -1407,9 +1408,8 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) { } }, /*#__PURE__*/_react.default.createElement(_core.AccordionSummary, { "aria-label": t("konnector_options.accessibility.button_toggle_detail_".concat(currentFluidName)), - expandIcon: /*#__PURE__*/_react.default.createElement(_Icon.default, { + expandIcon: /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _chevronDown.default, - size: 16, className: "accordion-icon" }), classes: { @@ -1551,7 +1551,8 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && var DataloadConsumptionVisualizer = function DataloadConsumptionVisualizer(_ref) { var fluidType = _ref.fluidType, dataload = _ref.dataload, - compareDataload = _ref.compareDataload; + compareDataload = _ref.compareDataload, + focusable = _ref.focusable; var _useAppSelector = (0, _hooks.useAppSelector)(function (state) { return state.ecolyo.chart; }), @@ -1575,7 +1576,8 @@ var DataloadConsumptionVisualizer = function DataloadConsumptionVisualizer(_ref) className: "dataloadvisualizer-root" }, /*#__PURE__*/_react.default.createElement(_DataloadNoValue.default, { dataload: dataload, - fluidType: fluidType + fluidType: fluidType, + focusable: focusable })); } return /*#__PURE__*/_react.default.createElement("div", { @@ -1586,17 +1588,20 @@ var DataloadConsumptionVisualizer = function DataloadConsumptionVisualizer(_ref) dataload: compareDataload, fluidType: fluidType, dataloadSectionType: _enums.DataloadSectionType.LEFT, - toggleEstimationModal: toggleEstimationModal + toggleEstimationModal: toggleEstimationModal, + focusable: focusable }), /*#__PURE__*/_react.default.createElement(_DataloadSection.default, { dataload: dataload, fluidType: fluidType, dataloadSectionType: _enums.DataloadSectionType.RIGHT, - toggleEstimationModal: toggleEstimationModal + toggleEstimationModal: toggleEstimationModal, + focusable: focusable })) : /*#__PURE__*/_react.default.createElement(_DataloadSection.default, { dataload: dataload, fluidType: fluidType, dataloadSectionType: _enums.DataloadSectionType.NO_COMPARE, - toggleEstimationModal: toggleEstimationModal + toggleEstimationModal: toggleEstimationModal, + focusable: focusable })), /*#__PURE__*/_react.default.createElement(_EstimatedConsumptionModal.default, { open: openEstimationModal, handleCloseClick: toggleEstimationModal @@ -1623,8 +1628,9 @@ var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _consentOutdatedEnedis = _interopRequireDefault(__webpack_require__("0Pit")); var _consentOutdatedGrdf = _interopRequireDefault(__webpack_require__("saJs")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _reactRouterDom = __webpack_require__("Iyno"); @@ -1683,18 +1689,16 @@ var ExpiredConsentModal = function ExpiredConsentModal(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, t('consumption_visualizer.modal.window_title')), /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('consumption_visualizer.modal.close'), - className: "modal-paper-close-button", - onClick: toggleModal - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('consent_outdated.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { + onClick: toggleModal, + "aria-label": t('consent_outdated.accessibility.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "expired-consent-modal" }, /*#__PURE__*/_react.default.createElement("div", { className: "icon-main" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: fluidType === _enums.FluidType.ELECTRICITY ? _consentOutdatedEnedis.default : _consentOutdatedGrdf.default, size: 135 })), /*#__PURE__*/_react.default.createElement("div", { @@ -1963,7 +1967,8 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && var InfoDataConsumptionVisualizer = function InfoDataConsumptionVisualizer(_ref) { var dataload = _ref.dataload, fluidType = _ref.fluidType, - lastDataDate = _ref.lastDataDate; + lastDataDate = _ref.lastDataDate, + focusable = _ref.focusable; var _useI18n = (0, _I18n.useI18n)(), t = _useI18n.t; var _useState = (0, _react.useState)(false), @@ -1980,7 +1985,8 @@ var InfoDataConsumptionVisualizer = function InfoDataConsumptionVisualizer(_ref) var key = fluidType === _enums.FluidType.MULTIFLUID ? 'last_valid_data_multi' : 'last_available_data'; return /*#__PURE__*/_react.default.createElement(_core.Button, { className: "btnText", - onClick: moveToLatestDate + onClick: moveToLatestDate, + tabIndex: focusable ? 0 : -1 }, t("consumption_visualizer.".concat(key), { date: lastDate })); @@ -1990,7 +1996,8 @@ var InfoDataConsumptionVisualizer = function InfoDataConsumptionVisualizer(_ref) className: "btnText", onClick: function onClick() { return setOpenNoDataModal(true); - } + }, + tabIndex: focusable ? 0 : -1 }, /*#__PURE__*/_react.default.createElement("span", { className: "text-16-normal underlined-error" }, t('consumption_visualizer.why_no_data'))), /*#__PURE__*/_react.default.createElement(_NoDataModal.default, { @@ -2112,6 +2119,9 @@ var FluidChartSlide = function FluidChartSlide(_ref) { _useAppSelector$globa = _useAppSelector.global, fluidStatus = _useAppSelector$globa.fluidStatus, fluidTypes = _useAppSelector$globa.fluidTypes; + + /** Determines if child elements should be focusable */ + var focusable = currentIndex === index; var _useState = (0, _react.useState)({ actualData: [], comparisonData: null @@ -2162,7 +2172,14 @@ var FluidChartSlide = function FluidChartSlide(_ref) { isMulti = fluidType === _enums.FluidType.MULTIFLUID; fluidTypeArray = isMulti ? fluidTypes : [fluidType]; _context.next = 15; - return consumptionService.getGraphData(timePeriod, currentTimeStep, fluidTypeArray, fluidStatus, compareTimePeriod, isMulti); + return consumptionService.getGraphData({ + timePeriod: timePeriod, + timeStep: currentTimeStep, + fluidTypes: fluidTypeArray, + fluidStatus: fluidStatus, + compareTimePeriod: compareTimePeriod, + isHome: isMulti + }); case 15: graphData = _context.sent; if (subscribed && graphData && (graphData === null || graphData === void 0 ? void 0 : graphData.actualData.length) > 0) { @@ -2196,7 +2213,8 @@ var FluidChartSlide = function FluidChartSlide(_ref) { }, /*#__PURE__*/_react.default.createElement(_Loader.default, { fluidType: fluidType })) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ConsumptionVisualizer.default, { - fluidType: fluidType + fluidType: fluidType, + focusable: focusable }), /*#__PURE__*/_react.default.createElement(_BarChart.default, { chartData: chartData, fluidType: fluidType, @@ -2204,7 +2222,8 @@ var FluidChartSlide = function FluidChartSlide(_ref) { showCompare: showCompare, height: height, width: width, - isSwitching: isSwitching + isSwitching: isSwitching, + focusable: focusable }))); }; var _default = FluidChartSlide; @@ -2225,12 +2244,11 @@ Object.defineProperty(exports, "__esModule", { exports.default = void 0; var _Button = _interopRequireDefault(__webpack_require__("49+2")); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); -var _IconButton = _interopRequireDefault(__webpack_require__("x0Kp")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _warnOrange = _interopRequireDefault(__webpack_require__("U6yK")); var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); __webpack_require__("1ZXI"); @@ -2266,16 +2284,14 @@ var PartnerIssueModal = function PartnerIssueModal(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, t('feedback.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_IconButton.default, { - "aria-label": t('feedback.accessibility.button_close'), - className: "modal-paper-close-button", + }, t('feedback.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { + icon: _close.default, onClick: function onClick() { return handleCloseClick(issuedFluid); - } - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { - icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { + }, + "aria-label": t('feedback.accessibility.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "partnerIssueModal" }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _warnOrange.default, @@ -2325,7 +2341,8 @@ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var ConsumptionVisualizer = function ConsumptionVisualizer(_ref) { - var fluidType = _ref.fluidType; + var fluidType = _ref.fluidType, + focusable = _ref.focusable; var _useAppSelector = (0, _hooks.useAppSelector)(function (state) { return state.ecolyo; }), @@ -2372,13 +2389,15 @@ var ConsumptionVisualizer = function ConsumptionVisualizer(_ref) { }, /*#__PURE__*/_react.default.createElement(_DataloadConsumptionVisualizer.default, { fluidType: fluidType, dataload: dataload, - compareDataload: compareDataload + compareDataload: compareDataload, + focusable: focusable }), /*#__PURE__*/_react.default.createElement("div", { className: "consumptionvisualizer-info" }, /*#__PURE__*/_react.default.createElement(_InfoDataConsumptionVisualizer.default, { dataload: dataload, fluidType: fluidType, - lastDataDate: lastDataDate + lastDataDate: lastDataDate, + focusable: focusable }))); }; var _default = ConsumptionVisualizer; @@ -2476,7 +2495,7 @@ var FluidChartSwipe = function FluidChartSwipe(_ref) { return setIsSwitching(true); } : null, onTransitionEnd: function onTransitionEnd() { - setIsSwitching(false); + return setIsSwitching(false); }, axis: "x-reverse" })); @@ -2556,17 +2575,30 @@ var _Button = _interopRequireDefault(__webpack_require__("49+2")); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _I18n = __webpack_require__("nUfk"); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); +var _reactRouterDom = __webpack_require__("Iyno"); +var _global = __webpack_require__("33gc"); var _hooks = __webpack_require__("6FOS"); __webpack_require__("k8St"); var ReleaseNotesModal = function ReleaseNotesModal(_ref) { - var open = _ref.open, - handleCloseClick = _ref.handleCloseClick; + var open = _ref.open; var _useI18n = (0, _I18n.useI18n)(), t = _useI18n.t; + var navigate = (0, _reactRouterDom.useNavigate)(); + var dispatch = (0, _hooks.useAppDispatch)(); var _useAppSelector = (0, _hooks.useAppSelector)(function (state) { return state.ecolyo.global; }), releaseNotes = _useAppSelector.releaseNotes; + var handleCloseClick = function handleCloseClick() { + dispatch((0, _global.showReleaseNotes)({ + show: false, + notes: releaseNotes.notes, + redirectLink: releaseNotes.redirectLink + })); + if (releaseNotes.redirectLink) { + navigate(releaseNotes.redirectLink); + } + }; return /*#__PURE__*/_react.default.createElement(_Dialog.default, { open: open, disableEscapeKeyDown: true, @@ -2625,8 +2657,8 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; var _StyledCard = _interopRequireDefault(__webpack_require__("y8/m")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); var _reactRouterDom = __webpack_require__("Iyno"); var _hooks = __webpack_require__("6FOS"); @@ -2647,16 +2679,18 @@ var KonnectorViewerList = function KonnectorViewerList() { return /*#__PURE__*/_react.default.createElement("div", { className: "konnector-section-root" }, /*#__PURE__*/_react.default.createElement("div", { + role: "list", className: "konnectorsList" }, fluidStatus.map(function (fluidStatusItem) { return /*#__PURE__*/_react.default.createElement(_StyledCard.default, { + role: "listitem", key: fluidStatusItem.fluidType, className: "connection-card", onClick: function onClick() { return goToFluid(fluidStatusItem.fluidType); }, fluidType: fluidStatusItem.fluidType - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: (0, _picto.getAddPicto)(fluidStatusItem.fluidType), size: 36 }), /*#__PURE__*/_react.default.createElement("div", { @@ -2945,8 +2979,8 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; var _CHALLENGE = _interopRequireDefault(__webpack_require__("bWtM")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); __webpack_require__("m2rX"); var HalfHourNoDataFailure = function HalfHourNoDataFailure() { @@ -2954,7 +2988,7 @@ var HalfHourNoDataFailure = function HalfHourNoDataFailure() { t = _useI18n.t; return /*#__PURE__*/_react.default.createElement("div", { className: "halfHour" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { className: "imgResult", icon: _CHALLENGE.default, size: 180 @@ -3483,7 +3517,8 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } var DataloadNoValue = function DataloadNoValue(_ref) { var dataload = _ref.dataload, - fluidType = _ref.fluidType; + fluidType = _ref.fluidType, + focusable = _ref.focusable; var _useI18n = (0, _I18n.useI18n)(), t = _useI18n.t; var dispatch = (0, _hooks.useAppDispatch)(); @@ -3523,7 +3558,8 @@ var DataloadNoValue = function DataloadNoValue(_ref) { classes: { root: 'btnText', label: 'text-22-normal' - } + }, + tabIndex: focusable ? 0 : -1 }, t('consumption_visualizer.missing_data')); } return /*#__PURE__*/_react.default.createElement("div", { @@ -3736,6 +3772,7 @@ var FluidButton = function FluidButton(_ref) { } }, [fluidStatus, fluidType, isConnected, isErrored, isMulti]); return /*#__PURE__*/_react.default.createElement(_core.IconButton, { + role: "tab", className: "fluid-title fluid-button", onClick: goToFluid }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { @@ -3933,12 +3970,12 @@ var _consentOutdatedEnedis = _interopRequireDefault(__webpack_require__("0Pit")) var _dataNok = _interopRequireDefault(__webpack_require__("OvaW")); var _dataOk = _interopRequireDefault(__webpack_require__("uCOS")); var _classnames = _interopRequireDefault(__webpack_require__("uRLs")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); var _Loader = _interopRequireDefault(__webpack_require__("6oIw")); var _connectionWaitingText = _interopRequireDefault(__webpack_require__("VXZ9")); var _firstConnectionWaitingText = _interopRequireDefault(__webpack_require__("pImA")); var _flowEvents = __webpack_require__("PKGP"); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _lodash = __webpack_require__("nHcj"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); @@ -4008,7 +4045,7 @@ var KonnectorModal = function KonnectorModal(_ref) { var connectionSuccessContent = function connectionSuccessContent() { return /*#__PURE__*/_react.default.createElement("div", { className: "konnector-config" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _dataOk.default, size: 48 }), /*#__PURE__*/_react.default.createElement("div", { @@ -4063,7 +4100,7 @@ var KonnectorModal = function KonnectorModal(_ref) { // LOGIN FAILED FOR ENEDIS AND EGL _react.default.createElement("div", { className: "konnector-config" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _dataNok.default, size: 48 }), /*#__PURE__*/_react.default.createElement("div", { @@ -4085,7 +4122,7 @@ var KonnectorModal = function KonnectorModal(_ref) { // MISMATCH UPDATE ERROR ENEDIS _react.default.createElement("div", { className: "headerError konnector-config mismatch" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _consentOutdatedEnedis.default, width: 120, height: 80 @@ -4099,7 +4136,7 @@ var KonnectorModal = function KonnectorModal(_ref) { className: "info text-15-normal" }, t('konnector_modal.mismatch.text3'))), error === _enums.KonnectorError.USER_ACTION_NEEDED_ACCOUNT_REMOVED && fluidType === _enums.FluidType.GAS && /*#__PURE__*/_react.default.createElement("div", { className: "konnector-config" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _dataNok.default, size: 48 }), /*#__PURE__*/_react.default.createElement("div", { @@ -4113,7 +4150,7 @@ var KonnectorModal = function KonnectorModal(_ref) { // DEFAULT CASE _react.default.createElement("div", { className: "konnector-config" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _dataNok.default, size: 48 }), /*#__PURE__*/_react.default.createElement("div", { @@ -4152,12 +4189,11 @@ var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("HZZ/")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); var _Button = _interopRequireDefault(__webpack_require__("49+2")); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); -var _IconButton = _interopRequireDefault(__webpack_require__("x0Kp")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _bullhorn = _interopRequireDefault(__webpack_require__("l2OD")); var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _luxon = __webpack_require__("1EDv"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _utils = __webpack_require__("RgLR"); @@ -4216,14 +4252,12 @@ var CustomPopupModal = function CustomPopupModal(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, customPopup.title), /*#__PURE__*/_react.default.createElement(_IconButton.default, { - "aria-label": t('feedback.accessibility.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, customPopup.title), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { + onClick: handleCloseClick, + "aria-label": t('feedback.accessibility.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "customPopupModal" }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: icon, @@ -4542,11 +4576,9 @@ var _cozyClient = __webpack_require__("xEu0"); var _enums = __webpack_require__("j0hM"); var _luxon = __webpack_require__("1EDv"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); -var _reactRouterDom = __webpack_require__("Iyno"); var _dateChart = _interopRequireDefault(__webpack_require__("Aj1I")); var _profile = _interopRequireDefault(__webpack_require__("uCkj")); var _chart = __webpack_require__("dklY"); -var _global = __webpack_require__("33gc"); var _hooks = __webpack_require__("6FOS"); var _modal = __webpack_require__("IvDH"); var _date = __webpack_require__("0bnf"); @@ -4562,7 +4594,6 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol 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) { (0, _defineProperty2.default)(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; } var ConsumptionView = function ConsumptionView(_ref) { var fluidType = _ref.fluidType; - var navigate = (0, _reactRouterDom.useNavigate)(); var client = (0, _cozyClient.useClient)(); var dispatch = (0, _hooks.useAppDispatch)(); var _useAppSelector = (0, _hooks.useAppSelector)(function (state) { @@ -4589,42 +4620,19 @@ var ConsumptionView = function ConsumptionView(_ref) { _useState2 = (0, _slicedToArray2.default)(_useState, 2), openExpiredConsentModal = _useState2[0], setOpenExpiredConsentModal = _useState2[1]; - var _useState3 = (0, _react.useState)(releaseNotes.show), + var _useState3 = (0, _react.useState)([]), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), - openReleaseNoteModal = _useState4[0], - setOpenReleaseNoteModal = _useState4[1]; - var _useState5 = (0, _react.useState)([]), - _useState6 = (0, _slicedToArray2.default)(_useState5, 2), - consentExpiredFluids = _useState6[0], - setConsentExpiredFluids = _useState6[1]; + consentExpiredFluids = _useState4[0], + setConsentExpiredFluids = _useState4[1]; var profileService = (0, _react.useMemo)(function () { return new _profile.default(client); }, [client]); var updateKey = !isMulti && currentFluidStatus.lastDataDate ? "".concat(currentFluidStatus.lastDataDate.toLocaleString(), " + ").concat(currentFluidStatus.status + fluidType) : ''; var lastDataDateKey = !isMulti && currentFluidStatus.lastDataDate ? "".concat(currentFluidStatus.lastDataDate.toLocaleString() + fluidType) : ''; - var getPartnerKey = function getPartnerKey(fluidType) { - switch (fluidType) { - case _enums.FluidType.ELECTRICITY: - return 'enedis'; - case _enums.FluidType.WATER: - return 'egl'; - case _enums.FluidType.GAS: - return 'grdf'; - default: - throw new Error('unknown fluidtype'); - } + var getTitleKey = function getTitleKey(fluidType) { + if (fluidType === _enums.FluidType.MULTIFLUID) return 'common.title_consumption'; + return "common.title_consumption_".concat((0, _utils.getFluidName)(fluidType)); }; - var handleCloseReleaseNoteModal = (0, _react.useCallback)(function () { - setOpenReleaseNoteModal(false); - dispatch((0, _global.showReleaseNotes)({ - show: false, - notes: releaseNotes.notes, - redirectLink: releaseNotes.redirectLink - })); - if (releaseNotes.redirectLink) { - navigate(releaseNotes.redirectLink); - } - }, [dispatch, navigate, releaseNotes.notes, releaseNotes.redirectLink]); var handleClosePartnerIssueModal = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() { var profileValues, updatedProfile; return _regenerator.default.wrap(function _callee$(_context) { @@ -4641,12 +4649,12 @@ var ConsumptionView = function ConsumptionView(_ref) { } _context.next = 6; return profileService.updateProfile({ - partnersIssueSeenDate: _objectSpread(_objectSpread({}, profileValues.partnersIssueSeenDate), {}, (0, _defineProperty2.default)({}, getPartnerKey(fluidType), (0, _utils.getTodayDate)())) + partnersIssueSeenDate: _objectSpread(_objectSpread({}, profileValues.partnersIssueSeenDate), {}, (0, _defineProperty2.default)({}, (0, _utils.getPartnerKey)(fluidType), (0, _utils.getTodayDate)())) }); case 6: updatedProfile = _context.sent; if (updatedProfile) { - dispatch((0, _modal.openPartnersModal)(_objectSpread(_objectSpread({}, partnersIssueModal), {}, (0, _defineProperty2.default)({}, getPartnerKey(fluidType), false)))); + dispatch((0, _modal.openPartnersModal)(_objectSpread(_objectSpread({}, partnersIssueModal), {}, (0, _defineProperty2.default)({}, (0, _utils.getPartnerKey)(fluidType), false)))); } case 8: case "end": @@ -4739,9 +4747,9 @@ var ConsumptionView = function ConsumptionView(_ref) { dispatch((0, _chart.setCurrentIndex)(updatedIndex)); }; return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_CozyBar.default, { - titleKey: "common.title_consumption" + titleKey: getTitleKey(fluidType) }), /*#__PURE__*/_react.default.createElement(_Header.default, { - desktopTitleKey: "common.title_consumption" + desktopTitleKey: getTitleKey(fluidType) }, /*#__PURE__*/_react.default.createElement(_DateNavigator.default, { disableNext: (0, _date.isLastDateReached)(selectedDate, currentTimeStep), disablePrev: disablePrev, @@ -4763,9 +4771,8 @@ var ConsumptionView = function ConsumptionView(_ref) { fluidType: fluidType })), !isMulti && /*#__PURE__*/_react.default.createElement(_KonnectorViewerCard.default, { fluidType: fluidType - }), isMulti && !showOfflineData && /*#__PURE__*/_react.default.createElement(_KonnectorViewerList.default, null)), openReleaseNoteModal && /*#__PURE__*/_react.default.createElement(_ReleaseNotesModal.default, { - open: openReleaseNoteModal, - handleCloseClick: handleCloseReleaseNoteModal + }), isMulti && !showOfflineData && /*#__PURE__*/_react.default.createElement(_KonnectorViewerList.default, null)), releaseNotes.show && /*#__PURE__*/_react.default.createElement(_ReleaseNotesModal.default, { + open: releaseNotes.show }), fluidStatus.filter(function (fluid) { return fluid.maintenance; }).filter(function (fluid) { @@ -4774,7 +4781,7 @@ var ConsumptionView = function ConsumptionView(_ref) { return /*#__PURE__*/_react.default.createElement(_PartnerIssueModal.default, { key: issuedFluid.fluidType, issuedFluid: issuedFluid.fluidType, - open: partnersIssueModal[getPartnerKey(issuedFluid.fluidType)], + open: partnersIssueModal[(0, _utils.getPartnerKey)(issuedFluid.fluidType)], handleCloseClick: handleClosePartnerIssueModal }); }), /*#__PURE__*/_react.default.createElement(_CustomPopupModal.default, { @@ -5345,57 +5352,6 @@ exports.default = _default; /***/ }), -/***/ "y8/m": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _interopRequireDefault = __webpack_require__("jm00"); -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; -var _extends2 = _interopRequireDefault(__webpack_require__("LGLP")); -var _objectWithoutProperties2 = _interopRequireDefault(__webpack_require__("UdSB")); -var _CardActionArea = _interopRequireDefault(__webpack_require__("Cg3G")); -var _CardContent = _interopRequireDefault(__webpack_require__("9T7s")); -var _styles = __webpack_require__("yrWy"); -var _react = _interopRequireDefault(__webpack_require__("ivGQ")); -var _utils = __webpack_require__("RgLR"); -var _excluded = ["fluidType", "children", "className"]; -var CardBase = (0, _styles.withStyles)({ - root: { - background: 'var(--greyLinearGradientBackground)', - boxSizing: 'border-box', - boxShadow: '0px 4px 8px rgba(0, 0, 0, 0.75)', - borderRadius: '4px' - } -})(_CardActionArea.default); -var CardContentBase = (0, _styles.withStyles)({ - root: { - color: 'white', - display: 'flex', - alignItems: 'center', - gap: '1rem', - boxSizing: 'border-box' - } -})(_CardContent.default); -var StyledCard = function StyledCard(_ref) { - var fluidType = _ref.fluidType, - children = _ref.children, - className = _ref.className, - props = (0, _objectWithoutProperties2.default)(_ref, _excluded); - var cardClass = className + (fluidType !== undefined ? " ".concat((0, _utils.getFluidName)(fluidType)) : ''); - return /*#__PURE__*/_react.default.createElement(CardBase, (0, _extends2.default)({}, props, { - className: cardClass - }), /*#__PURE__*/_react.default.createElement(CardContentBase, null, children)); -}; -var _default = StyledCard; -exports.default = _default; - -/***/ }), - /***/ "yr6m": /***/ (function(module, exports, __webpack_require__) { diff --git a/5/ecolyo.d6973bef36480ddc925b.js b/5/ecolyo.dbb9361b7c3d2399eabb.js similarity index 91% rename from 5/ecolyo.d6973bef36480ddc925b.js rename to 5/ecolyo.dbb9361b7c3d2399eabb.js index 1f9ba33ddd560d76d4031e306ea205f3c83c343f..4dea009b4f7cdb1a2319af1960e17a33a643ad04 100644 --- a/5/ecolyo.d6973bef36480ddc925b.js +++ b/5/ecolyo.dbb9361b7c3d2399eabb.js @@ -41,8 +41,9 @@ var _core = __webpack_require__("rMFn"); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _warnOrange = _interopRequireDefault(__webpack_require__("U6yK")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); __webpack_require__("Xfrj"); var EcogestureResetModal = function EcogestureResetModal(_ref) { @@ -61,16 +62,14 @@ var EcogestureResetModal = function EcogestureResetModal(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, t('feedback.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('feedback.accessibility.button_close'), - className: "modal-paper-close-button", - onClick: closeEcogestureResetModal - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('feedback.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { + onClick: closeEcogestureResetModal, + "aria-label": t('feedback.accessibility.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "eg-reset-modal" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _warnOrange.default, size: 63 }), /*#__PURE__*/_react.default.createElement("div", { @@ -163,43 +162,6 @@ if(content.locals) module.exports = content.locals; if(false) {} -/***/ }), - -/***/ "DqCF": -/***/ (function(module, exports, __webpack_require__) { - - -var content = __webpack_require__("JBZ6"); - -if(typeof content === 'string') content = [[module.i, content, '']]; - -var transform; -var insertInto; - - - -var options = {"hmr":true} - -options.transform = transform -options.insertInto = undefined; - -var update = __webpack_require__("HkU0")(content, options); - -if(content.locals) module.exports = content.locals; - -if(false) {} - -/***/ }), - -/***/ "JBZ6": -/***/ (function(module, exports, __webpack_require__) { - -exports = module.exports = __webpack_require__("DjJv")(false); -// Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.eg-init-modal {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n.eg-init-modal .title {\n text-align: center;\n color: #e3b82a;\n}\n.eg-init-modal .buttons-container {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}", ""]); - - - /***/ }), /***/ "NiCU": @@ -593,6 +555,14 @@ var EcogestureTabsView = function EcogestureTabsView() { subscribed = false; }; }, [profileEcogesture, profileType, dispatch, profile.ecogestureHash, profile.isProfileTypeCompleted, ecogestureService]); + var handleCloseInitModal = function handleCloseInitModal(redirect) { + dispatch((0, _profile.updateProfile)({ + haveSeenEcogestureModal: true + })); + if (redirect) { + navigate('/ecogesture-form?modal=false'); + } + }; return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_CozyBar.default, { titleKey: "common.title_ecogestures" }), /*#__PURE__*/_react.default.createElement(_Header.default, { @@ -674,7 +644,15 @@ var EcogestureTabsView = function EcogestureTabsView() { displaySelection: false, selectionTotal: totalAvailable, selectionViewed: totalViewed - }))), /*#__PURE__*/_react.default.createElement(_EcogestureInitModal.default, null), openEcResetModal && /*#__PURE__*/_react.default.createElement(_EcogestureResetModal.default, { + }))), /*#__PURE__*/_react.default.createElement(_EcogestureInitModal.default, { + open: !profile.haveSeenEcogestureModal, + onClose: function onClose() { + return handleCloseInitModal(false); + }, + onAccept: function onAccept() { + return handleCloseInitModal(true); + } + }), openEcResetModal && /*#__PURE__*/_react.default.createElement(_EcogestureResetModal.default, { open: openEcResetModal, closeEcogestureResetModal: closeEcogestureResetModal, handleConfirmReset: handleConfirmReset @@ -812,6 +790,7 @@ var EcogestureCard = function EcogestureCard(_ref) { } }, [ecogesture]); return /*#__PURE__*/_react.default.createElement(_StyledEcogestureCard.default, { + role: "listitem", onClick: function onClick() { return navigate("/ecogesture/".concat(ecogesture.id)); }, @@ -833,90 +812,6 @@ exports.default = _default; /***/ }), -/***/ "mEyn": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _interopRequireDefault = __webpack_require__("jm00"); -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; -var _core = __webpack_require__("rMFn"); -var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); -var _close = _interopRequireDefault(__webpack_require__("lCJQ")); -var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); -var _react = _interopRequireDefault(__webpack_require__("ivGQ")); -var _reactRouterDom = __webpack_require__("Iyno"); -var _hooks = __webpack_require__("6FOS"); -var _profile = __webpack_require__("quVB"); -__webpack_require__("DqCF"); -var EcogestureInitModal = function EcogestureInitModal() { - var _useI18n = (0, _I18n.useI18n)(), - t = _useI18n.t; - var navigate = (0, _reactRouterDom.useNavigate)(); - var dispatch = (0, _hooks.useAppDispatch)(); - var _useAppSelector = (0, _hooks.useAppSelector)(function (state) { - return state.ecolyo.profile; - }), - haveSeenEcogestureModal = _useAppSelector.haveSeenEcogestureModal; - var openEcogestureInitModal = !haveSeenEcogestureModal; - var handleLaunchForm = function handleLaunchForm() { - dispatch((0, _profile.updateProfile)({ - haveSeenEcogestureModal: true - })); - navigate('/ecogesture-form?modal=false'); - }; - var handleCloseEcogestureInitModal = function handleCloseEcogestureInitModal() { - dispatch((0, _profile.updateProfile)({ - haveSeenEcogestureModal: true - })); - }; - return /*#__PURE__*/_react.default.createElement(_Dialog.default, { - open: openEcogestureInitModal, - onClose: handleCloseEcogestureInitModal, - "aria-labelledby": "accessibility-title", - classes: { - root: 'modal-root', - paper: 'modal-paper' - } - }, /*#__PURE__*/_react.default.createElement("div", { - id: "accessibility-title" - }, t('feedback.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('feedback.accessibility.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseEcogestureInitModal - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { - icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { - className: "eg-init-modal" - }, /*#__PURE__*/_react.default.createElement("div", { - className: "title text-20-bold" - }, t('ecogesture.initModal.title')), /*#__PURE__*/_react.default.createElement("div", { - className: "text-16-normal" - }, t('ecogesture.initModal.text1')), /*#__PURE__*/_react.default.createElement("div", { - className: "text-16-normal" - }, t('ecogesture.initModal.text2')), /*#__PURE__*/_react.default.createElement("div", { - className: "buttons-container" - }, /*#__PURE__*/_react.default.createElement(_core.Button, { - "aria-label": t('ecogesture.initModal.btn2'), - onClick: handleLaunchForm, - className: "btnPrimary" - }, t('ecogesture.initModal.btn2')), /*#__PURE__*/_react.default.createElement(_core.Button, { - "aria-label": t('ecogesture.initModal.btn1'), - onClick: handleCloseEcogestureInitModal, - className: "btnSecondary" - }, t('ecogesture.initModal.btn1'))))); -}; -var _default = EcogestureInitModal; -exports.default = _default; - -/***/ }), - /***/ "xDcM": /***/ (function(module, exports, __webpack_require__) { @@ -1073,6 +968,7 @@ var EcogestureList = function EcogestureList(_ref) { }, /*#__PURE__*/_react.default.createElement("div", { className: "efficiency-button-content" }, selectFilters(), displaySelection && continueSelection()), /*#__PURE__*/_react.default.createElement("div", { + role: "list", className: "ecogesture-content" }, renderEcogestureContent(), !displaySelection && openResetEcogestureModal && /*#__PURE__*/_react.default.createElement(_Button.default, { onClick: openResetEcogestureModal, diff --git a/6/ecolyo.2ee34eefa2ad7b22a46e.js b/6/ecolyo.e92ae3d82791b9a4a362.js similarity index 97% rename from 6/ecolyo.2ee34eefa2ad7b22a46e.js rename to 6/ecolyo.e92ae3d82791b9a4a362.js index 922ee24b49293f10c3e7101b103cf567ced4afac..af265b4ae0efae773c4a332b5b4fa2633ea8c38c 100644 --- a/6/ecolyo.2ee34eefa2ad7b22a46e.js +++ b/6/ecolyo.e92ae3d82791b9a4a362.js @@ -184,8 +184,9 @@ var _core = __webpack_require__("rMFn"); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _download = _interopRequireDefault(__webpack_require__("Qyft")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); __webpack_require__("ibSJ"); var ExportStartModal = function ExportStartModal(_ref) { @@ -206,18 +207,17 @@ var ExportStartModal = function ExportStartModal(_ref) { id: "accessibility-title" }, t('export.modal_start.accessibility_title')), /*#__PURE__*/_react.default.createElement("div", { className: "modal-start-root" - }, /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('export.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 18 - })), /*#__PURE__*/_react.default.createElement("div", { + sized: 18, + onClick: handleCloseClick, + "aria-label": t('export.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "content" }, /*#__PURE__*/_react.default.createElement("div", { className: "icon-main" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _download.default, size: 48 })), /*#__PURE__*/_react.default.createElement("div", { @@ -288,6 +288,7 @@ var _questionMark = _interopRequireDefault(__webpack_require__("pAsk")); var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); var _I18n = __webpack_require__("nUfk"); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); +var _reactRouterDom = __webpack_require__("Iyno"); var _hooks = __webpack_require__("6FOS"); var _modal = __webpack_require__("IvDH"); __webpack_require__("MmZq"); @@ -303,9 +304,11 @@ var HelpLink = function HelpLink() { className: "help-header text-16-normal-uppercase" }, t('help.title_help')), /*#__PURE__*/_react.default.createElement(_Link.default, { className: "help-card-link", + component: _reactRouterDom.Link, onClick: function onClick() { return dispatch((0, _modal.openFeedbackModal)(true)); - } + }, + to: "" }, /*#__PURE__*/_react.default.createElement("div", { className: "card" }, /*#__PURE__*/_react.default.createElement("div", { @@ -342,10 +345,10 @@ var _core = __webpack_require__("rMFn"); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var Sentry = _interopRequireWildcard(__webpack_require__("5QCN")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _Loader = _interopRequireDefault(__webpack_require__("6oIw")); var _cozyClient = __webpack_require__("xEu0"); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _fileSaver = _interopRequireDefault(__webpack_require__("KGKl")); var _react2 = _interopRequireWildcard(__webpack_require__("ivGQ")); @@ -463,7 +466,13 @@ var ExportLoadingModal = function ExportLoadingModal(_ref) { endDate: lastDataDate[0] }; _context2.next = 12; - return consumptionService.getGraphData(timePeriod, _enums.TimeStep.MONTH, [fluidType], undefined, undefined, false, true); + return consumptionService.getGraphData({ + timePeriod: timePeriod, + timeStep: _enums.TimeStep.MONTH, + fluidTypes: [fluidType], + isHome: false, + isExport: true + }); case 12: dataLoad = _context2.sent; if (dataLoad !== null && dataLoad !== void 0 && dataLoad.actualData) { @@ -616,14 +625,13 @@ var ExportLoadingModal = function ExportLoadingModal(_ref) { id: "accessibility-title" }, t('export.modal_loading.accessibility_title')), /*#__PURE__*/_react2.default.createElement("div", { className: "modal-loading-root" - }, /*#__PURE__*/_react2.default.createElement(_core.IconButton, { - "aria-label": t('export.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react2.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react2.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 18 - })), /*#__PURE__*/_react2.default.createElement("div", { + sized: 18, + onClick: handleCloseClick, + "aria-label": t('export.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react2.default.createElement("div", { className: "content" }, /*#__PURE__*/_react2.default.createElement("div", { className: "icon-main" @@ -714,7 +722,6 @@ var _StyledCard = _interopRequireDefault(__webpack_require__("y8/m")); var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); var _useExploration3 = _interopRequireDefault(__webpack_require__("CRx8")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _reactRouterDom = __webpack_require__("Iyno"); @@ -772,16 +779,15 @@ var ProfileTypeOptions = function ProfileTypeOptions() { } }, /*#__PURE__*/_react.default.createElement(_core.AccordionSummary, { "aria-label": t('profile_type.accessibility.button_toggle_detail_profile'), - expandIcon: /*#__PURE__*/_react.default.createElement(_Icon.default, { + expandIcon: /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _chevronDown.default, - size: 16, className: "accordion-icon" }), classes: { root: 'expansion-panel-summary', content: 'expansion-panel-content' } - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { className: "profile-icon", icon: _profile.default, size: 42 @@ -881,8 +887,9 @@ var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _exportDone = _interopRequireDefault(__webpack_require__("4X/A")); var _warnCross = _interopRequireDefault(__webpack_require__("R0sU")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); __webpack_require__("uG/q"); var ExportDoneModal = function ExportDoneModal(_ref) { @@ -903,18 +910,17 @@ var ExportDoneModal = function ExportDoneModal(_ref) { id: "accessibility-title" }, t('export.modal_done.accessibility_title')), /*#__PURE__*/_react.default.createElement("div", { className: "modal-done-root" - }, /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('export.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 18 - })), /*#__PURE__*/_react.default.createElement("div", { + sized: 18, + onClick: handleCloseClick, + "aria-label": t('export.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "content" }, /*#__PURE__*/_react.default.createElement("div", { className: "icon-main" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: error ? _warnCross.default : _exportDone.default, size: 44 })), !error && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", { @@ -1069,7 +1075,12 @@ var ReportOptions = function ReportOptions() { }; consumptionService = new _consumption.default(client); _context.next = 4; - return consumptionService.getMaxLoad(timePeriod, _enums.TimeStep.DAY, [_enums.FluidType.WATER], undefined, false, true); + return consumptionService.getMaxLoad({ + maxTimePeriod: timePeriod, + timeStep: _enums.TimeStep.DAY, + fluidTypes: [_enums.FluidType.WATER], + withDate: true + }); case 4: lastSemesterMax = _context.sent; if (lastSemesterMax) { @@ -1448,9 +1459,9 @@ var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); var _core = __webpack_require__("rMFn"); var _chevronDown = _interopRequireDefault(__webpack_require__("dDs/")); var _export = _interopRequireDefault(__webpack_require__("Xpo0")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); var _cozyClient = __webpack_require__("xEu0"); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _lodash = __webpack_require__("nHcj"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); @@ -1571,16 +1582,15 @@ var ExportData = function ExportData() { } }, /*#__PURE__*/_react.default.createElement(_core.AccordionSummary, { "aria-label": t('profile_type.accessibility.button_toggle_export'), - expandIcon: /*#__PURE__*/_react.default.createElement(_Icon.default, { + expandIcon: /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _chevronDown.default, - size: 16, className: "accordion-icon" }), classes: { root: 'expansion-panel-summary', content: 'expansion-panel-content' } - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { className: "export-icon", icon: _export.default, size: 42 @@ -1597,7 +1607,7 @@ var ExportData = function ExportData() { }, t('export.fluid_select')), exportableFluids.length === 0 ? /*#__PURE__*/_react.default.createElement("div", { className: "text-15-normal grey" }, t('export.no_data')) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, fluidCheckbox(), /*#__PURE__*/_react.default.createElement(_core.Button, { - "aria-label": t('unsubscribe.button_accessibility'), + "aria-label": t('profile_type.accessibility.button_export_data'), onClick: function onClick() { return setShowExportModal('start'); }, diff --git a/7/ecolyo.d61472e75eb196504d3e.js b/7/ecolyo.62d0f8799ccda737a9e5.js similarity index 58% rename from 7/ecolyo.d61472e75eb196504d3e.js rename to 7/ecolyo.62d0f8799ccda737a9e5.js index e910bde1be443c3b0f4ca4792453756694af872f..887a4a04296a277d70a1e4e0410d1ab7e5b38afa 100644 --- a/7/ecolyo.d61472e75eb196504d3e.js +++ b/7/ecolyo.62d0f8799ccda737a9e5.js @@ -40,12 +40,11 @@ exports.default = void 0; var _regenerator = _interopRequireDefault(__webpack_require__("hJxD")); var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("HZZ/")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); -var _core = __webpack_require__("rMFn"); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _cozyClient = __webpack_require__("xEu0"); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _luxon = __webpack_require__("1EDv"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); @@ -108,14 +107,12 @@ var EstimatedConsumptionModal = function EstimatedConsumptionModal(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, t('consumption_visualizer.modal.window_title')), /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('consumption_visualizer.modal.close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('consumption_visualizer.modal.window_title')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { + onClick: handleCloseClick, + "aria-label": t('consumption_visualizer.modal.close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "estimation-modal" }, /*#__PURE__*/_react.default.createElement("div", { className: "text-20-normal modal-title" @@ -243,7 +240,8 @@ var BarChart = function BarChart(_ref) { marginBottom = _ref$marginBottom === void 0 ? 50 : _ref$marginBottom, isSwitching = _ref.isSwitching, _ref$clickable = _ref.clickable, - clickable = _ref$clickable === void 0 ? true : _ref$clickable; + clickable = _ref$clickable === void 0 ? true : _ref$clickable, + focusable = _ref.focusable; var getContentWidth = function getContentWidth() { return width - marginLeft - marginRight; }; @@ -300,7 +298,8 @@ var BarChart = function BarChart(_ref) { isSwitching: isSwitching, isMultiMissingFluid: data.state === _enums.DataloadState.AGGREGATED_WITH_EMPTY || data.state === _enums.DataloadState.AGGREGATED_WITH_COMING || data.state === _enums.DataloadState.AGGREGATED_WITH_HOLE_OR_MISSING, clickable: clickable, - average: averageConsumption + average: averageConsumption, + focusable: focusable }); })), /*#__PURE__*/_react.default.createElement(_AxisBottom.default, { data: chartData.actualData, @@ -321,7 +320,7 @@ exports.default = _default; exports = module.exports = __webpack_require__("DjJv")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.date-navigator {\n display: flex;\n flex-direction: row;\n justify-content: space-around;\n width: 100%;\n margin: auto;\n padding-bottom: 0.6rem;\n max-width: 45.75rem;\n}\n.date-navigator .date-navigator-button.disable {\n opacity: 0.3;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.date-navigator {\n display: flex;\n flex-direction: row;\n justify-content: space-around;\n width: 100%;\n margin: auto;\n padding-bottom: 0.6rem;\n max-width: 45.75rem;\n}\n.date-navigator .date-navigator-button.disable {\n opacity: 0.3;\n}\n.date-navigator .date-navigator-format {\n display: flex;\n flex-direction: column;\n min-width: 7.81rem;\n text-align: center;\n align-items: center;\n align-self: center;\n}\n@media all and (max-width: 320px) {\n .date-navigator .date-navigator-format {\n min-width: 10.32rem;\n }\n}\n.date-navigator .date-navigator-format .date-navigator-format-date {\n color: #e0e0e0;\n}\n.date-navigator .date-navigator-format .date-navigator-format-date::first-letter {\n text-transform: uppercase;\n}\n.date-navigator .date-navigator-format .date-navigator-format-date.timeRange {\n white-space: normal;\n}", ""]); @@ -352,7 +351,8 @@ var DataloadSection = function DataloadSection(_ref) { var dataload = _ref.dataload, fluidType = _ref.fluidType, dataloadSectionType = _ref.dataloadSectionType, - toggleEstimationModal = _ref.toggleEstimationModal; + toggleEstimationModal = _ref.toggleEstimationModal, + focusable = _ref.focusable; var _useI18n = (0, _I18n.useI18n)(), t = _useI18n.t; var isLeft = dataloadSectionType === _enums.DataloadSectionType.LEFT; @@ -378,11 +378,13 @@ var DataloadSection = function DataloadSection(_ref) { dataload: dataload, fluidType: fluidType, dataloadSectionType: dataloadSectionType, - toggleEstimationModal: toggleEstimationModal + toggleEstimationModal: toggleEstimationModal, + focusable: focusable })), /*#__PURE__*/_react.default.createElement(_DataloadSectionDetail.default, { dataload: dataload, fluidType: fluidType, - dataloadSectionType: dataloadSectionType + dataloadSectionType: dataloadSectionType, + focusable: focusable })); }; var _default = DataloadSection; @@ -390,84 +392,6 @@ exports.default = _default; /***/ }), -/***/ "RHUT": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _interopRequireDefault = __webpack_require__("jm00"); -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; -var _enums = __webpack_require__("j0hM"); -var _luxon = __webpack_require__("1EDv"); -var _react = _interopRequireDefault(__webpack_require__("ivGQ")); -__webpack_require__("anDk"); -var DateNavigatorFormat = function DateNavigatorFormat(_ref) { - var timeStep = _ref.timeStep, - date = _ref.date, - inline = _ref.inline; - var formatDate = function formatDate(_timeStep) { - switch (_timeStep) { - case _enums.TimeStep.YEAR: - return [date.toLocaleString({ - year: 'numeric' - }), '']; - case _enums.TimeStep.MONTH: - return [date.toLocaleString({ - month: 'long' - }), date.toLocaleString({ - year: 'numeric' - })]; - case _enums.TimeStep.DAY: - case _enums.TimeStep.WEEK: - return [date.toLocaleString({ - weekday: 'long', - day: '2-digit' - }), date.toLocaleString({ - month: 'long' - })]; - case _enums.TimeStep.HALF_AN_HOUR: - /** - * Format date to range: - * 9:00 - 9:30 - * Day 0X Month - */ - return ["".concat(date.toLocaleString({ - hour: 'numeric', - minute: 'numeric' - }), " -\n ").concat(date.plus({ - minutes: 30 - }).toLocaleString({ - hour: 'numeric', - minute: 'numeric' - })), date.toLocaleString({ - weekday: 'long', - day: '2-digit', - month: 'long' - })]; - default: - return [date.toLocaleString(_luxon.DateTime.DATETIME_SHORT), '']; - } - }; - var formatedDate = formatDate(timeStep); - return /*#__PURE__*/_react.default.createElement("div", { - className: "date-navigator-format" - }, inline ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, formatedDate[0] && formatedDate[1] && /*#__PURE__*/_react.default.createElement("div", { - className: "date-navigator-format-date text-16-bold" - }, formatedDate[0], " ", formatedDate[1])) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, formatedDate[0] && /*#__PURE__*/_react.default.createElement("div", { - className: "date-navigator-format-date text-16-bold timeRange" - }, formatedDate[0]), formatedDate[1] && /*#__PURE__*/_react.default.createElement("div", { - className: "date-navigator-format-date text-15-normal" - }, formatedDate[1]))); -}; -var _default = DateNavigatorFormat; -exports.default = _default; - -/***/ }), - /***/ "SgF1": /***/ (function(module, exports, __webpack_require__) { @@ -499,7 +423,8 @@ var DataloadSectionValue = function DataloadSectionValue(_ref) { var dataload = _ref.dataload, fluidType = _ref.fluidType, dataloadSectionType = _ref.dataloadSectionType, - toggleEstimationModal = _ref.toggleEstimationModal; + toggleEstimationModal = _ref.toggleEstimationModal, + focusable = _ref.focusable; var _useI18n = (0, _I18n.useI18n)(), t = _useI18n.t; var FLUIDNAME = (0, _utils.getFluidName)(fluidType).toUpperCase(); @@ -512,7 +437,8 @@ var DataloadSectionValue = function DataloadSectionValue(_ref) { label: 'text-14-normal' }, size: "small", - onClick: toggleEstimationModal + onClick: toggleEstimationModal, + tabIndex: focusable ? 0 : -1 }, t('consumption_visualizer.estimated'))); } var formattedValue = (0, _utils.formatNumberValues)(dataload.value, FLUIDNAME, true); @@ -527,32 +453,6 @@ exports.default = _default; /***/ }), -/***/ "anDk": -/***/ (function(module, exports, __webpack_require__) { - - -var content = __webpack_require__("zsMR"); - -if(typeof content === 'string') content = [[module.i, content, '']]; - -var transform; -var insertInto; - - - -var options = {"hmr":true} - -options.transform = transform -options.insertInto = undefined; - -var update = __webpack_require__("HkU0")(content, options); - -if(content.locals) module.exports = content.locals; - -if(false) {} - -/***/ }), - /***/ "bbLk": /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -606,371 +506,6 @@ exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE -/***/ }), - -/***/ "mY6q": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _interopRequireDefault = __webpack_require__("jm00"); -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; -var _regenerator = _interopRequireDefault(__webpack_require__("hJxD")); -var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); -var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("HZZ/")); -var _classCallCheck2 = _interopRequireDefault(__webpack_require__("GeFe")); -var _createClass2 = _interopRequireDefault(__webpack_require__("Zvb3")); -var _defineProperty2 = _interopRequireDefault(__webpack_require__("J58c")); -var Sentry = _interopRequireWildcard(__webpack_require__("5QCN")); -var _cozyClient = __webpack_require__("xEu0"); -var _cozyLogger = _interopRequireDefault(__webpack_require__("rUPj")); -var _doctypes = __webpack_require__("rVhO"); -var _logger = _interopRequireDefault(__webpack_require__("DPwE")); -var _fluidConfig = _interopRequireDefault(__webpack_require__("i5q2")); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -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; } -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) { (0, _defineProperty2.default)(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; } -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } -var logStack = _cozyLogger.default.namespace('fluidPricesService'); -var FluidPricesService = /*#__PURE__*/function () { - function FluidPricesService(_client) { - (0, _classCallCheck2.default)(this, FluidPricesService); - (0, _defineProperty2.default)(this, "_client", void 0); - this._client = _client; - } - - /** - * Get all prices available in database - */ - (0, _createClass2.default)(FluidPricesService, [{ - key: "getAllPrices", - value: function () { - var _getAllPrices = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() { - var query, _yield$this$_client$q, fluidsPrices; - return _regenerator.default.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - query = (0, _cozyClient.Q)(_doctypes.FLUIDSPRICES_DOCTYPE).limitBy(900); // TODO : handle case of 1000+ entries in doctype - _context.next = 3; - return this._client.query(query); - case 3: - _yield$this$_client$q = _context.sent; - fluidsPrices = _yield$this$_client$q.data; - return _context.abrupt("return", fluidsPrices); - case 6: - case "end": - return _context.stop(); - } - } - }, _callee, this); - })); - function getAllPrices() { - return _getAllPrices.apply(this, arguments); - } - return getAllPrices; - }() - /** - * Get a price according to a fluidType and a data. This method return the nearest and valid price for the given date. - */ - }, { - key: "getPrices", - value: function () { - var _getPrices = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(fluidType, date) { - var query, _yield$this$_client$q2, fluidsPrices; - return _regenerator.default.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - query = (0, _cozyClient.Q)(_doctypes.FLUIDSPRICES_DOCTYPE).where({ - startDate: { - $lte: date.toISO({ - suppressMilliseconds: true - }).toString() - }, - fluidType: fluidType - }).indexFields(['startDate']).sortBy([{ - startDate: 'desc' - }]).limitBy(1); - _context2.next = 3; - return this._client.query(query); - case 3: - _yield$this$_client$q2 = _context2.sent; - fluidsPrices = _yield$this$_client$q2.data; - return _context2.abrupt("return", fluidsPrices[0]); - case 6: - case "end": - return _context2.stop(); - } - } - }, _callee2, this); - })); - function getPrices(_x, _x2) { - return _getPrices.apply(this, arguments); - } - return getPrices; - }() - /** - * Get current prices for all fluidTypes. - */ - }, { - key: "getAllLastPrices", - value: function () { - var _getAllLastPrices = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() { - var query, _yield$this$_client$q3, fluidsPrices, configService, fluidConfig, recoveredFluidsPrices; - return _regenerator.default.wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - query = (0, _cozyClient.Q)(_doctypes.FLUIDSPRICES_DOCTYPE).where({ - endDate: { - $eq: '' - } - }).indexFields(['fluidType']).sortBy([{ - fluidType: 'asc' - }]).limitBy(3); - _context3.next = 3; - return this._client.query(query); - case 3: - _yield$this$_client$q3 = _context3.sent; - fluidsPrices = _yield$this$_client$q3.data; - if (!(fluidsPrices.length !== 3)) { - _context3.next = 12; - break; - } - configService = new _fluidConfig.default(); - fluidConfig = configService.getFluidConfig(); - recoveredFluidsPrices = []; // Getting default fluid price - fluidConfig.forEach(function (config) { - recoveredFluidsPrices.push({ - _id: '0', - fluidType: config.fluidTypeId, - price: config.coefficient, - startDate: config.startDate, - endDate: '', - UpdatedAt: '2000-01-01T00:00:00Z' - }); - }); - - // Replacing default prices if available - fluidsPrices.forEach(function (fluidPrice) { - recoveredFluidsPrices[fluidPrice.fluidType] = fluidPrice; - }); - return _context3.abrupt("return", recoveredFluidsPrices); - case 12: - return _context3.abrupt("return", fluidsPrices); - case 13: - case "end": - return _context3.stop(); - } - } - }, _callee3, this); - })); - function getAllLastPrices() { - return _getAllLastPrices.apply(this, arguments); - } - return getAllLastPrices; - }() - /** - * Delete all fluidPrices entities from the db - * @returns {boolean} - true when deleted with success - * @throws {Error} - */ - }, { - key: "deleteAllFluidsPrices", - value: function () { - var _deleteAllFluidsPrices = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4() { - var fluidsPrices, _iterator, _step, price, errorMessage; - return _regenerator.default.wrap(function _callee4$(_context4) { - while (1) { - switch (_context4.prev = _context4.next) { - case 0: - _context4.next = 2; - return this.getAllPrices(); - case 2: - fluidsPrices = _context4.sent; - _context4.prev = 3; - _iterator = _createForOfIteratorHelper(fluidsPrices); - _context4.prev = 5; - _iterator.s(); - case 7: - if ((_step = _iterator.n()).done) { - _context4.next = 13; - break; - } - price = _step.value; - _context4.next = 11; - return this._client.destroy(price); - case 11: - _context4.next = 7; - break; - case 13: - _context4.next = 18; - break; - case 15: - _context4.prev = 15; - _context4.t0 = _context4["catch"](5); - _iterator.e(_context4.t0); - case 18: - _context4.prev = 18; - _iterator.f(); - return _context4.finish(18); - case 21: - return _context4.abrupt("return", true); - case 24: - _context4.prev = 24; - _context4.t1 = _context4["catch"](3); - errorMessage = "deleteAllFluidsPrices: ".concat(JSON.stringify(_context4.t1)); - logStack('error', errorMessage); - _logger.default.error(errorMessage); - Sentry.captureException(_context4.t1); - return _context4.abrupt("return", false); - case 31: - case "end": - return _context4.stop(); - } - } - }, _callee4, this, [[3, 24], [5, 15, 18, 21]]); - })); - function deleteAllFluidsPrices() { - return _deleteAllFluidsPrices.apply(this, arguments); - } - return deleteAllFluidsPrices; - }() - /** - * Check if a fluidprice exists in db - * @returns {Promise<FluidPrice | null>} price or null - */ - }, { - key: "checkIfPriceExists", - value: function () { - var _checkIfPriceExists = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(fluidPrice) { - var query, _yield$this$_client$q4, _yield$this$_client$q5, price; - return _regenerator.default.wrap(function _callee5$(_context5) { - while (1) { - switch (_context5.prev = _context5.next) { - case 0: - query = (0, _cozyClient.Q)(_doctypes.FLUIDSPRICES_DOCTYPE).where({ - startDate: { - $eq: fluidPrice.startDate - }, - fluidType: { - $eq: fluidPrice.fluidType - } - }); - _context5.next = 3; - return this._client.query(query); - case 3: - _yield$this$_client$q4 = _context5.sent; - _yield$this$_client$q5 = (0, _slicedToArray2.default)(_yield$this$_client$q4.data, 1); - price = _yield$this$_client$q5[0]; - if (!price) { - _context5.next = 10; - break; - } - return _context5.abrupt("return", price); - case 10: - return _context5.abrupt("return", null); - case 11: - case "end": - return _context5.stop(); - } - } - }, _callee5, this); - })); - function checkIfPriceExists(_x3) { - return _checkIfPriceExists.apply(this, arguments); - } - return checkIfPriceExists; - }() - /** - * Creates a new fluidPrice - * @returns {Promise<FluidPrice | null>} price or null - */ - }, { - key: "createPrice", - value: function () { - var _createPrice = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(newPrice) { - var _yield$this$_client$c, createdPrice, errorMessage; - return _regenerator.default.wrap(function _callee6$(_context6) { - while (1) { - switch (_context6.prev = _context6.next) { - case 0: - _context6.prev = 0; - _context6.next = 3; - return this._client.create(_doctypes.FLUIDSPRICES_DOCTYPE, newPrice); - case 3: - _yield$this$_client$c = _context6.sent; - createdPrice = _yield$this$_client$c.data; - return _context6.abrupt("return", createdPrice); - case 8: - _context6.prev = 8; - _context6.t0 = _context6["catch"](0); - errorMessage = "'Error creating new createdPrice: ".concat(JSON.stringify(_context6.t0)); - logStack('error', errorMessage); - _logger.default.error(errorMessage); - Sentry.captureException(_context6.t0); - throw _context6.t0; - case 15: - case "end": - return _context6.stop(); - } - } - }, _callee6, this, [[0, 8]]); - })); - function createPrice(_x4) { - return _createPrice.apply(this, arguments); - } - return createPrice; - }() - /** - * Updates a price in db - */ - }, { - key: "updatePrice", - value: function () { - var _updatePrice = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(doc, attributes) { - var _yield$this$_client$s, fluidPrice; - return _regenerator.default.wrap(function _callee7$(_context7) { - while (1) { - switch (_context7.prev = _context7.next) { - case 0: - _context7.next = 2; - return this._client.save(_objectSpread(_objectSpread({}, doc), attributes)); - case 2: - _yield$this$_client$s = _context7.sent; - fluidPrice = _yield$this$_client$s.data; - if (!fluidPrice) { - _context7.next = 6; - break; - } - return _context7.abrupt("return", fluidPrice); - case 6: - return _context7.abrupt("return", null); - case 7: - case "end": - return _context7.stop(); - } - } - }, _callee7, this); - })); - function updatePrice(_x5, _x6) { - return _updatePrice.apply(this, arguments); - } - return updatePrice; - }() - }]); - return FluidPricesService; -}(); -exports.default = FluidPricesService; - /***/ }), /***/ "r5RG": @@ -985,14 +520,13 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(__webpack_require__("J58c")); -var _IconButton = _interopRequireDefault(__webpack_require__("x0Kp")); var _leftArrow = _interopRequireDefault(__webpack_require__("2JOZ")); var _rightArrow = _interopRequireDefault(__webpack_require__("Mvn8")); var _classnames = _interopRequireDefault(__webpack_require__("uRLs")); -var _DateNavigatorFormat = _interopRequireDefault(__webpack_require__("RHUT")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); +var _date = __webpack_require__("0bnf"); __webpack_require__("3BFW"); var DateNavigator = function DateNavigator(_ref) { var disableNext = _ref.disableNext, @@ -1005,29 +539,32 @@ var DateNavigator = function DateNavigator(_ref) { timeStep = _ref.timeStep; var _useI18n = (0, _I18n.useI18n)(), t = _useI18n.t; + var formattedDate = (0, _date.formatDate)(timeStep, navigatorDate); return /*#__PURE__*/_react.default.createElement("div", { + role: "group", + "aria-label": t('consumption.accessibility.navigation_group'), className: "date-navigator" - }, /*#__PURE__*/_react.default.createElement(_IconButton.default, { - disabled: disablePrev, - onClick: handlePrevDate, - className: (0, _classnames.default)('date-navigator-button', (0, _defineProperty2.default)({}, 'disable', disablePrev)), - "aria-label": t('consumption.accessibility.button_previous_value') - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _leftArrow.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement(_DateNavigatorFormat.default, { - timeStep: timeStep, - date: navigatorDate, - inline: inlineDateDisplay - }), /*#__PURE__*/_react.default.createElement(_IconButton.default, { - disabled: disableNext, - onClick: handleNextDate, - className: (0, _classnames.default)('date-navigator-button', (0, _defineProperty2.default)({}, 'disable', disableNext)), - "aria-label": t('consumption.accessibility.button_next_value') - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + onClick: handlePrevDate, + disabled: disablePrev, + "aria-label": t('consumption.accessibility.button_previous_value'), + className: (0, _classnames.default)('date-navigator-button', (0, _defineProperty2.default)({}, 'disable', disablePrev)) + }), /*#__PURE__*/_react.default.createElement("div", { + className: "date-navigator-format" + }, inlineDateDisplay ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, formattedDate[0] && formattedDate[1] && /*#__PURE__*/_react.default.createElement("div", { + className: "date-navigator-format-date text-16-bold" + }, formattedDate[0], " ", formattedDate[1])) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, formattedDate[0] && /*#__PURE__*/_react.default.createElement("div", { + className: "date-navigator-format-date text-16-bold timeRange" + }, formattedDate[0]), formattedDate[1] && /*#__PURE__*/_react.default.createElement("div", { + className: "date-navigator-format-date text-15-normal" + }, formattedDate[1]))), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _rightArrow.default, - size: 16 - }))); + onClick: handleNextDate, + disabled: disableNext, + "aria-label": t('consumption.accessibility.button_next_value'), + className: (0, _classnames.default)('date-navigator-button', (0, _defineProperty2.default)({}, 'disable', disableNext)) + })); }; var _default = DateNavigator; exports.default = _default; @@ -1047,8 +584,8 @@ Object.defineProperty(exports, "__esModule", { exports.default = void 0; var _defineProperty2 = _interopRequireDefault(__webpack_require__("J58c")); var _classnames = _interopRequireDefault(__webpack_require__("uRLs")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); var _reactRouterDom = __webpack_require__("Iyno"); @@ -1058,7 +595,8 @@ var _utils = __webpack_require__("RgLR"); var DataloadSectionDetail = function DataloadSectionDetail(_ref) { var dataload = _ref.dataload, fluidType = _ref.fluidType, - dataloadSectionType = _ref.dataloadSectionType; + dataloadSectionType = _ref.dataloadSectionType, + focusable = _ref.focusable; var _useI18n = (0, _I18n.useI18n)(), t = _useI18n.t; var converterService = new _converter.default(); @@ -1077,6 +615,7 @@ var DataloadSectionDetail = function DataloadSectionDetail(_ref) { } if (isMulti && isCompare && dataload.valueDetail) { return /*#__PURE__*/_react.default.createElement("div", { + role: "group", className: "dataloadvisualizer-euro text-16-normal" }, dataload.valueDetail.map(function (value, index) { var _classNames2; @@ -1088,11 +627,13 @@ var DataloadSectionDetail = function DataloadSectionDetail(_ref) { var isMissing = value.state === _enums.DataloadState.MISSING; return /*#__PURE__*/_react.default.createElement(_reactRouterDom.NavLink, { key: _enums.FluidType[index], + "aria-label": t("consumption_visualizer.cost_per_fluid.".concat(_enums.FluidType[index].toLowerCase())), to: "/consumption/".concat(_enums.FluidType[index].toLowerCase()), - className: "dataloadvisualizer-euro-link" + className: "dataloadvisualizer-euro-link", + tabIndex: focusable ? 0 : -1 }, /*#__PURE__*/_react.default.createElement("div", { className: (0, _classnames.default)('dataloadvisualizer-euro-fluid', (_classNames2 = {}, (0, _defineProperty2.default)(_classNames2, _enums.FluidType[index].toLowerCase(), isValid || isUpcoming || isComing || isEmpty || isHole), (0, _defineProperty2.default)(_classNames2, "error", isMissing), _classNames2)) - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { className: "dataloadvisualizer-euro-fluid-icon", icon: (0, _picto.getNavPicto)(index, true, true), size: 22 @@ -1103,10 +644,11 @@ var DataloadSectionDetail = function DataloadSectionDetail(_ref) { className: "dataloadvisualizer-euro text-16-normal" }, /*#__PURE__*/_react.default.createElement(_reactRouterDom.NavLink, { to: "/consumption/".concat((0, _utils.getFluidName)(fluidType)), - className: "dataloadvisualizer-euro-link" + className: "dataloadvisualizer-euro-link", + tabIndex: focusable ? 0 : -1 }, /*#__PURE__*/_react.default.createElement("div", { className: "dataloadvisualizer-euro-fluid ".concat((0, _utils.getFluidName)(fluidType)) - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { className: "dataloadvisualizer-euro-fluid-icon", icon: (0, _picto.getNavPicto)(fluidType, true, true), size: 22 @@ -1117,14 +659,54 @@ exports.default = _default; /***/ }), -/***/ "zsMR": +/***/ "y8/m": /***/ (function(module, exports, __webpack_require__) { -exports = module.exports = __webpack_require__("DjJv")(false); -// Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.date-navigator-format {\n display: flex;\n flex-direction: column;\n min-width: 7.81rem;\n text-align: center;\n align-items: center;\n align-self: center;\n}\n@media all and (max-width: 320px) {\n .date-navigator-format {\n min-width: 10.32rem;\n }\n}\n.date-navigator-format .date-navigator-format-date {\n color: #e0e0e0;\n}\n.date-navigator-format .date-navigator-format-date::first-letter {\n text-transform: uppercase;\n}\n.date-navigator-format .date-navigator-format-date.timeRange {\n white-space: normal;\n}", ""]); +"use strict"; +var _interopRequireDefault = __webpack_require__("jm00"); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _extends2 = _interopRequireDefault(__webpack_require__("LGLP")); +var _objectWithoutProperties2 = _interopRequireDefault(__webpack_require__("UdSB")); +var _CardActionArea = _interopRequireDefault(__webpack_require__("Cg3G")); +var _CardContent = _interopRequireDefault(__webpack_require__("9T7s")); +var _styles = __webpack_require__("yrWy"); +var _react = _interopRequireDefault(__webpack_require__("ivGQ")); +var _utils = __webpack_require__("RgLR"); +var _excluded = ["fluidType", "children", "className"]; +var CardBase = (0, _styles.withStyles)({ + root: { + background: 'var(--greyLinearGradientBackground)', + boxSizing: 'border-box', + boxShadow: '0px 4px 8px rgba(0, 0, 0, 0.75)', + borderRadius: '4px' + } +})(_CardActionArea.default); +var CardContentBase = (0, _styles.withStyles)({ + root: { + color: 'white', + display: 'flex', + alignItems: 'center', + gap: '1rem', + boxSizing: 'border-box' + } +})(_CardContent.default); +var StyledCard = function StyledCard(_ref) { + var fluidType = _ref.fluidType, + children = _ref.children, + className = _ref.className, + props = (0, _objectWithoutProperties2.default)(_ref, _excluded); + var cardClass = className + (fluidType !== undefined ? " ".concat((0, _utils.getFluidName)(fluidType)) : ''); + return /*#__PURE__*/_react.default.createElement(CardBase, (0, _extends2.default)({}, props, { + className: cardClass + }), /*#__PURE__*/_react.default.createElement(CardContentBase, null, children)); +}; +var _default = StyledCard; +exports.default = _default; /***/ }) diff --git a/8/ecolyo.7350ff71d0fdf6a621af.js b/8/ecolyo.76b674e1f6db43a6a522.js similarity index 88% rename from 8/ecolyo.7350ff71d0fdf6a621af.js rename to 8/ecolyo.76b674e1f6db43a6a522.js index 4d3495781afd8616323a5e12d3028ff5087c406d..aa10abe7ce53c7d284e40bd3e96231c5b056479a 100644 --- a/8/ecolyo.7350ff71d0fdf6a621af.js +++ b/8/ecolyo.76b674e1f6db43a6a522.js @@ -91,7 +91,6 @@ var _useExploration3 = _interopRequireDefault(__webpack_require__("CRx8")); var _Loader = _interopRequireDefault(__webpack_require__("6oIw")); var _cozyClient = __webpack_require__("xEu0"); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react2 = _interopRequireWildcard(__webpack_require__("ivGQ")); var _reactRouterDom = __webpack_require__("Iyno"); var _ecogesture = _interopRequireDefault(__webpack_require__("eUT5")); @@ -237,7 +236,9 @@ var SingleEcogestureView = function SingleEcogestureView() { }), /*#__PURE__*/_react2.default.createElement(_Header.default, { desktopTitleKey: "common.title_ecogesture", displayBackArrow: true - }), /*#__PURE__*/_react2.default.createElement(_Content.default, null, isLoading && /*#__PURE__*/_react2.default.createElement("div", { + }), /*#__PURE__*/_react2.default.createElement(_Content.default, null, /*#__PURE__*/_react2.default.createElement("div", { + className: "content-wrapper" + }, isLoading && /*#__PURE__*/_react2.default.createElement("div", { className: "loaderContainer" }, /*#__PURE__*/_react2.default.createElement(_Loader.default, null)), !isLoading && !ecogesture && /*#__PURE__*/_react2.default.createElement(_EcogestureNotFound.default, { text: t('error_page.no_ecogesture'), @@ -275,7 +276,8 @@ var SingleEcogestureView = function SingleEcogestureView() { }); } }, t("ecogesture_modal.show_".concat(showDetails ? 'less' : 'more'))), /*#__PURE__*/_react2.default.createElement(_core.Collapse, { - in: showDetails + in: showDetails, + timeout: 300 }, /*#__PURE__*/_react2.default.createElement("div", { className: "longDescription text-16-normal-150" }, ecogesture.longDescription))), /*#__PURE__*/_react2.default.createElement("div", { @@ -287,7 +289,7 @@ var SingleEcogestureView = function SingleEcogestureView() { root: "btnSecondary objective-btn ".concat(isObjective && 'active'), label: 'text-15-normal' } - }, /*#__PURE__*/_react2.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react2.default.createElement(_StyledIcon.default, { className: "status-icon", icon: isObjective ? _objectiveEnabled.default : _objectiveDisabled.default, size: 40 @@ -298,11 +300,11 @@ var SingleEcogestureView = function SingleEcogestureView() { root: "btnSecondary doing-btn ".concat(isDoing && 'active'), label: 'text-15-normal' } - }, /*#__PURE__*/_react2.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react2.default.createElement(_StyledIcon.default, { className: "status-icon", icon: isDoing ? _doingEnabled.default : _doingDisabled.default, size: 40 - }), /*#__PURE__*/_react2.default.createElement("span", null, t('ecogesture.doing'))))))); + }), /*#__PURE__*/_react2.default.createElement("span", null, t('ecogesture.doing')))))))); }; var _default = SingleEcogestureView; exports.default = _default; @@ -414,7 +416,7 @@ var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WE exports = module.exports = __webpack_require__("DjJv")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.single-ecogesture {\n color: #e0e0e0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 1rem 1.2rem;\n}\n.single-ecogesture .icon-container {\n margin: auto;\n max-width: 180px;\n width: 100%;\n display: flex;\n}\n.single-ecogesture .icon-container .icon-big {\n margin: auto;\n}\n.single-ecogesture .details {\n flex-direction: column;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.single-ecogesture .details .title {\n color: #a0a0a0;\n}\n.single-ecogesture .details .efficiency {\n display: flex;\n gap: 0.5rem;\n}\n.single-ecogesture .styled-container {\n line-height: 150%;\n padding: 1rem;\n margin: 1.5rem 0 1rem;\n max-width: 500px;\n display: flex;\n flex-direction: column;\n}\n.single-ecogesture .styled-container .long-name {\n text-align: center;\n color: white;\n}\n.single-ecogesture .styled-container .showMore {\n margin: auto;\n text-align: center;\n text-decoration: underline;\n margin-top: 1.5rem;\n}\n.single-ecogesture .styled-container .showMore span {\n text-transform: none;\n}\n.single-ecogesture .styled-container .longDescription {\n margin: 1em 0.5rem;\n text-align: left;\n}\n.single-ecogesture .buttons-selection {\n width: 100%;\n display: flex;\n gap: 0.5rem;\n justify-content: center;\n}\n.single-ecogesture .buttons-selection button.btnSecondary {\n height: 45px;\n max-width: 160px;\n width: 100%;\n border-radius: 4px;\n}\n.single-ecogesture .buttons-selection .objective-btn span {\n color: #e0e0e0;\n}\n.single-ecogesture .buttons-selection .objective-btn.active {\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(12, 44, 91, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #4470b3;\n border-color: transparent;\n}\n.single-ecogesture .buttons-selection .objective-btn.active span {\n color: white;\n}\n.single-ecogesture .buttons-selection .doing-btn span {\n color: #e0e0e0;\n}\n.single-ecogesture .buttons-selection .doing-btn.active {\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(41, 87, 33, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #21a90b;\n border-color: transparent;\n}\n.single-ecogesture .buttons-selection .doing-btn.active span {\n color: white;\n}\n.single-ecogesture .buttons-selection .MuiIconButton-label {\n justify-content: flex-start;\n color: white;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.content-wrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n height: 100%;\n}\n.content-wrapper .single-ecogesture {\n color: #e0e0e0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 1rem 1.2rem;\n}\n.content-wrapper .single-ecogesture .icon-container {\n margin: auto;\n max-width: 180px;\n width: 100%;\n display: flex;\n}\n.content-wrapper .single-ecogesture .icon-container .icon-big {\n margin: auto;\n}\n.content-wrapper .single-ecogesture .details {\n flex-direction: column;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.content-wrapper .single-ecogesture .details .title {\n color: #a0a0a0;\n}\n.content-wrapper .single-ecogesture .details .efficiency {\n display: flex;\n gap: 0.5rem;\n}\n.content-wrapper .single-ecogesture .styled-container {\n line-height: 150%;\n padding: 1rem;\n margin: 1.5rem 0 1rem;\n max-width: 500px;\n display: flex;\n flex-direction: column;\n}\n.content-wrapper .single-ecogesture .styled-container .long-name {\n text-align: center;\n color: white;\n}\n.content-wrapper .single-ecogesture .styled-container .showMore {\n margin: auto;\n text-align: center;\n text-decoration: underline;\n margin-top: 1.5rem;\n}\n.content-wrapper .single-ecogesture .styled-container .showMore span {\n text-transform: none;\n}\n.content-wrapper .single-ecogesture .styled-container .longDescription {\n margin: 1em 0.5rem;\n text-align: left;\n}\n.content-wrapper .single-ecogesture .buttons-selection {\n width: 100%;\n display: flex;\n gap: 0.5rem;\n justify-content: center;\n}\n.content-wrapper .single-ecogesture .buttons-selection button.btnSecondary {\n height: 45px;\n max-width: 160px;\n width: 100%;\n border-radius: 4px;\n}\n.content-wrapper .single-ecogesture .buttons-selection .objective-btn span {\n color: #e0e0e0;\n}\n.content-wrapper .single-ecogesture .buttons-selection .objective-btn.active {\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(12, 44, 91, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #4470b3;\n border-color: transparent;\n}\n.content-wrapper .single-ecogesture .buttons-selection .objective-btn.active span {\n color: white;\n}\n.content-wrapper .single-ecogesture .buttons-selection .doing-btn span {\n color: #e0e0e0;\n}\n.content-wrapper .single-ecogesture .buttons-selection .doing-btn.active {\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(41, 87, 33, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #21a90b;\n border-color: transparent;\n}\n.content-wrapper .single-ecogesture .buttons-selection .doing-btn.active span {\n color: white;\n}\n.content-wrapper .single-ecogesture .buttons-selection .MuiIconButton-label {\n justify-content: flex-start;\n color: white;\n}", ""]); diff --git a/README.md b/README.md index b25b56912533e54d1338a32e278e0107c0112791..8815278c5a9504a6982dca5867cd261d3a24b3ef 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,13 @@ Ecolyo is a mobile-first app allowing citizens to visualise easily their energy consumption (electricity, gas, water ...). The app allows data visualisation but give also some tips on how to reduce energy consumption. +## Ecolyo au-delà de la Métropole de Lyon + +<https://doc-self-data.apps.grandlyon.com/docs/ecolyo/share/> + ## How does it works ? -Ecolyo uses "konnectors" for fetching data. More on : +Ecolyo uses "konnectors" for fetching data. More information on our [konnector documentation](https://doc-self-data.apps.grandlyon.com/docs/konnectors/introduction/). Repositories for our konnectors : - [enedis konnector](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/enedis-sge-konnector) - [grdf konnector](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/grdf-konnector) @@ -14,21 +18,11 @@ Ecolyo uses "konnectors" for fetching data. More on : ## Development -For a more complete look at our project, check our [Self Data Docs](https://doc-self-data.apps.grandlyon.com/) +For a more complete look at our project and our installation guide, check our **[Self Data Docs](https://doc-self-data.apps.grandlyon.com/)** _:pushpin: Note:_ we recommend to use [Yarn] instead of NPM for package management. -Developing the Cozy Ecolyo app requires you to be familiar with [cozy's documentation](https://docs.cozy.io/en/). - -You can then clone the app repository and install dependencies: - -```sh -git clone https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git -cd ecolyo -yarn -``` - -Cozy's apps use a standard set of _npm scripts_ to run common tasks, like watch, lint, test, build… +Developing the Cozy Ecolyo app requires you to be familiar with [cozy's documentation](https://docs.cozy.io/en/). Cozy's apps use a standard set of _scripts_ to run common tasks, like watch, lint, test, build… ### Run it inside a default Cozy using Docker diff --git a/app/ecolyo.5eedcd902009a77ffe0a.js b/app/ecolyo.554a8422165fe8f24237.js similarity index 97% rename from app/ecolyo.5eedcd902009a77ffe0a.js rename to app/ecolyo.554a8422165fe8f24237.js index 1d3c1aa608150036477d94b9bac404741fbd834b..3672ebb4a95b2890c11d585ecdd8000c18d33e20 100644 --- a/app/ecolyo.5eedcd902009a77ffe0a.js +++ b/app/ecolyo.554a8422165fe8f24237.js @@ -64,7 +64,7 @@ /******/ /******/ // script path function /******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + "/ecolyo." + {"3":"ad3feaef7217068a0c1a","4":"99b4574d799ae4772f6e","5":"d6973bef36480ddc925b","6":"2ee34eefa2ad7b22a46e","7":"d61472e75eb196504d3e","8":"7350ff71d0fdf6a621af","9":"73a97eac0086801c9dc9","10":"26edbface76655274ad8","11":"3baf0b358c1c353001a4"}[chunkId] + ".js" +/******/ return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + "/ecolyo." + {"3":"2c30ac255135a1fb70fe","4":"3185369b41951a4b6742","5":"dbb9361b7c3d2399eabb","6":"e92ae3d82791b9a4a362","7":"62d0f8799ccda737a9e5","8":"76b674e1f6db43a6a522","9":"73a97eac0086801c9dc9","10":"26edbface76655274ad8","11":"3baf0b358c1c353001a4"}[chunkId] + ".js" /******/ } /******/ /******/ // The require function @@ -573,7 +573,7 @@ var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WE /***/ "/pGb": /***/ (function(module) { -module.exports = JSON.parse("[{\"_id\":\"EXPLORATION001\",\"state\":0,\"description\":\"Complétez votre profil depuis la partie \\\"Analyse\\\" pour remporter 5 étoiles.\",\"complementary_description\":\"Si c’est déjà fait, allez consulter les informations de votre profil dans la partie \\\"Options\\\".\",\"target\":1,\"type\":1,\"date\":null,\"ecogesture_id\":\"\",\"fluid_condition\":[],\"message_success\":\"Vous avez complété votre profil. Vous bénéficierez d'une analyse de vos consommations davantage personnalisée et d'un nouveau mode de tri des astuces.\"},{\"_id\":\"EXPLORATION002\",\"state\":0,\"description\":\"Consultez l'astuce Professeur Celsius pour remporter 5 étoiles.\",\"complementary_description\":\"\",\"target\":1,\"type\":3,\"date\":null,\"ecogesture_id\":\"ECOGESTURE0037\",\"fluid_condition\":[],\"message_success\":\"Vous avez consulté l'astuce Professeur Celsius et être prêts pour adopter de bons comportements en hiver.\"},{\"_id\":\"EXPLORATION003\",\"state\":0,\"description\":\"Consultez vos données sur une période de 5 ans.\",\"complementary_description\":\"\",\"target\":1,\"type\":2,\"date\":null,\"ecogesture_id\":\"\",\"fluid_condition\":[],\"message_success\":\"Vous avez consulté vos données sur une période de 5 ans. Avez-vous appris des choses en les consultant ? Dans tous les cas...\"},{\"_id\":\"EXPLORATION004\",\"state\":0,\"description\":\"Consultez vos données électriques au pas de temps demi-heure.\",\"complementary_description\":\"\",\"target\":1,\"type\":1,\"date\":null,\"ecogesture_id\":\"\",\"fluid_condition\":[0],\"message_success\":\"Vous avez consulté vos données de consommation à la demi-heure. Devenez un fin connaisseur de vos consommations électriques en consultant ces données , elles vont vous en apprendre sur vos usages quotidiens.\"},{\"_id\":\"EXPLORATION004_0\",\"state\":0,\"description\":\"Consultez l'astuce Lord Kelvin pour remporter 5 étoiles.\",\"complementary_description\":\"\",\"target\":1,\"type\":3,\"date\":null,\"ecogesture_id\":\"ECOGESTURE0031\",\"fluid_condition\":[],\"message_success\":\"Vous avez consulté l'astuce Professeur Kelvin et êtes prêts à adopter des bonnes pratiques en hiver.\"},{\"_id\":\"EXPLORATION005\",\"state\":0,\"description\":\"Envoyez-nous un avis (sincère :)) sur notre service. Vous remporterez 5 étoiles !\",\"complementary_description\":\"Pour cela, écrivez-nous via le Service d'Assistance Utilisateurs et sa rubrique \\\"J'ai une idée à partager\\\".\",\"target\":1,\"type\":1,\"date\":null,\"ecogesture_id\":\"\",\"fluid_condition\":[],\"message_success\":\"Avis bien reçu ! Merci. Il va être lu par nos équipes. En attendant...\"},{\"_id\":\"EXPLORATION006\",\"state\":0,\"description\":\"Parlez en bien d’Ecolyo à un ami (quitte à mentir)\",\"complementary_description\":\"\",\"target\":1,\"type\":0,\"date\":null,\"ecogesture_id\":\"\",\"fluid_condition\":[],\"message_success\":\"Vous avez répandu la bonne nouvelle\"},{\"_id\":\"EXPLORATION007\",\"state\":0,\"description\":\"Consultez 3 fois Ecolyo\",\"complementary_description\":\"\",\"target\":3,\"type\":1,\"date\":null,\"ecogesture_id\":\"\",\"fluid_condition\":[],\"message_success\":\"Vous vous êtes connecté à Ecolyo 3 fois\"},{\"_id\":\"EXPLORATION008\",\"state\":0,\"description\":\"Placez l'appli Ecolyo en favoris (rappel des raccourcis)\",\"complementary_description\":\"\",\"target\":1,\"type\":0,\"date\":null,\"ecogesture_id\":\"\",\"fluid_condition\":[],\"message_success\":\"Vous avez placé l'appli Ecolyo en favoris\"}]"); +module.exports = JSON.parse("[{\"_id\":\"EXPLORATION001\",\"state\":0,\"description\":\"Complétez votre profil depuis la partie \\\"Analyse\\\" pour remporter 5 étoiles.\",\"complementary_description\":\"Si c’est déjà fait, allez consulter les informations de votre profil dans la partie \\\"Options\\\".\",\"target\":1,\"type\":1,\"date\":null,\"ecogesture_id\":\"\",\"fluid_condition\":[],\"message_success\":\"Vous avez complété votre profil. Vous bénéficierez d'une analyse de vos consommations davantage personnalisée et d'un nouveau mode de tri des astuces.\"},{\"_id\":\"EXPLORATION002\",\"state\":0,\"description\":\"Consultez l'astuce Professeur Celsius pour remporter 5 étoiles.\",\"complementary_description\":\"\",\"target\":1,\"type\":3,\"date\":null,\"ecogesture_id\":\"ECOGESTURE0037\",\"fluid_condition\":[],\"message_success\":\"Vous avez consulté l'astuce Professeur Celsius et être prêts pour adopter de bons comportements en hiver.\"},{\"_id\":\"EXPLORATION003\",\"state\":0,\"description\":\"Découvrez le pas de temps de \\\"5 ans\\\" dans la page Consos et consultez ainsi vos données dans leur historique le plus profond.\",\"complementary_description\":\"\",\"target\":1,\"type\":2,\"date\":null,\"ecogesture_id\":\"\",\"fluid_condition\":[],\"message_success\":\"Vous avez consulté vos données sur une période de 5 ans. Avez-vous appris des choses en les consultant ? Dans tous les cas...\"},{\"_id\":\"EXPLORATION004\",\"state\":0,\"description\":\"Consultez vos données électriques au pas de temps demi-heure.\",\"complementary_description\":\"\",\"target\":1,\"type\":1,\"date\":null,\"ecogesture_id\":\"\",\"fluid_condition\":[0],\"message_success\":\"Vous avez consulté vos données de consommation à la demi-heure. Devenez un fin connaisseur de vos consommations électriques en consultant ces données , elles vont vous en apprendre sur vos usages quotidiens.\"},{\"_id\":\"EXPLORATION004_0\",\"state\":0,\"description\":\"Consultez l'astuce Lord Kelvin pour remporter 5 étoiles.\",\"complementary_description\":\"\",\"target\":1,\"type\":3,\"date\":null,\"ecogesture_id\":\"ECOGESTURE0031\",\"fluid_condition\":[],\"message_success\":\"Vous avez consulté l'astuce Professeur Kelvin et êtes prêts à adopter des bonnes pratiques en hiver.\"},{\"_id\":\"EXPLORATION005\",\"state\":0,\"description\":\"Envoyez-nous un avis (sincère :)) sur notre service. Vous remporterez 5 étoiles !\",\"complementary_description\":\"Pour cela, écrivez-nous via le Service d'Assistance Utilisateurs et sa rubrique \\\"J'ai une idée à partager\\\".\",\"target\":1,\"type\":1,\"date\":null,\"ecogesture_id\":\"\",\"fluid_condition\":[],\"message_success\":\"Avis bien reçu ! Merci. Il va être lu par nos équipes. En attendant...\"},{\"_id\":\"EXPLORATION006\",\"state\":0,\"description\":\"Parlez en bien d’Ecolyo à un ami (quitte à mentir)\",\"complementary_description\":\"\",\"target\":1,\"type\":0,\"date\":null,\"ecogesture_id\":\"\",\"fluid_condition\":[],\"message_success\":\"Vous avez répandu la bonne nouvelle\"},{\"_id\":\"EXPLORATION007\",\"state\":0,\"description\":\"Consultez 3 fois Ecolyo\",\"complementary_description\":\"\",\"target\":3,\"type\":1,\"date\":null,\"ecogesture_id\":\"\",\"fluid_condition\":[],\"message_success\":\"Vous vous êtes connecté à Ecolyo 3 fois\"},{\"_id\":\"EXPLORATION008\",\"state\":0,\"description\":\"Placez l'appli Ecolyo en favoris (rappel des raccourcis)\",\"complementary_description\":\"\",\"target\":1,\"type\":0,\"date\":null,\"ecogesture_id\":\"\",\"fluid_condition\":[],\"message_success\":\"Vous avez placé l'appli Ecolyo en favoris\"}]"); /***/ }), @@ -1068,7 +1068,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.SUMMER_WEEK_DATES = void 0; exports.compareDates = compareDates; -exports.getActualAnalysisDate = exports.convertDateToShortDateString = exports.convertDateToMonthYearString = void 0; +exports.getActualAnalysisDate = exports.formatDate = exports.convertDateToShortDateString = exports.convertDateToMonthYearString = void 0; exports.getCurrentSeason = getCurrentSeason; exports.getLagDays = void 0; exports.getOppositeSeason = getOppositeSeason; @@ -1242,6 +1242,54 @@ function getOppositeSeason(currentSeason) { } } +/** + * Returns an array of the formatted date. It returns an array for display purposes. + */ +var formatDate = function formatDate(timeStep, date) { + switch (timeStep) { + case _enums.TimeStep.YEAR: + return [date.toLocaleString({ + year: 'numeric' + }), '']; + case _enums.TimeStep.MONTH: + return [date.toLocaleString({ + month: 'long' + }), date.toLocaleString({ + year: 'numeric' + })]; + case _enums.TimeStep.DAY: + case _enums.TimeStep.WEEK: + return [date.toLocaleString({ + weekday: 'long', + day: '2-digit' + }), date.toLocaleString({ + month: 'long' + })]; + case _enums.TimeStep.HALF_AN_HOUR: + /** + * Format date to range: + * 9:00 - 9:30 + * Day 0X Month + */ + return ["".concat(date.toLocaleString({ + hour: 'numeric', + minute: 'numeric' + }), " - ").concat(date.plus({ + minutes: 30 + }).toLocaleString({ + hour: 'numeric', + minute: 'numeric' + })), date.toLocaleString({ + weekday: 'long', + day: '2-digit', + month: 'long' + })]; + default: + return [date.toLocaleString(_luxon.DateTime.DATETIME_SHORT), '']; + } +}; +exports.formatDate = formatDate; + /***/ }), /***/ "0qf9": @@ -1270,11 +1318,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var _IconButton = _interopRequireDefault(__webpack_require__("x0Kp")); var _backArrow = _interopRequireDefault(__webpack_require__("6lzc")); var _feedback = _interopRequireDefault(__webpack_require__("RlEB")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _reactRouterDom = __webpack_require__("Iyno"); @@ -1284,7 +1331,6 @@ var _modal = __webpack_require__("IvDH"); __webpack_require__("/Zod"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -/** Header for desktop view */ var Header = function Header(_ref) { var desktopTitleKey = _ref.desktopTitleKey, displayBackArrow = _ref.displayBackArrow, @@ -1323,24 +1369,21 @@ var Header = function Header(_ref) { }, /*#__PURE__*/_react.default.createElement("div", { className: "header-content" }, /*#__PURE__*/_react.default.createElement("div", { - className: !desktopTitleKey ? 'header-content-top header-content-top-right' : 'header-content-top' - }, desktopTitleKey && /*#__PURE__*/_react.default.createElement("div", { - className: "header-text-desktop ".concat(screenType === _enums.ScreenType.MOBILE ? 'text-14-normal-uppercase' : 'text-22-bold') - }, displayBackArrow && /*#__PURE__*/_react.default.createElement(_IconButton.default, { - "aria-label": t('header.accessibility.button_back'), - className: "header-back-button", - onClick: handleClickBack - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + className: "header-content-top" + }, screenType !== _enums.ScreenType.MOBILE && displayBackArrow && /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _backArrow.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("span", null, t(desktopTitleKey))), /*#__PURE__*/_react.default.createElement(_IconButton.default, { - "aria-label": t('header.accessibility.button_open_feedbacks'), - className: !desktopTitleKey ? 'header-feedbacks-button right' : 'header-feedbacks-button', - onClick: handleClickFeedbacks - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + onClick: handleClickBack, + "aria-label": t('header.accessibility.button_back'), + className: "header-back-button" + }), desktopTitleKey && /*#__PURE__*/_react.default.createElement("div", { + className: "".concat(displayBackArrow && desktopTitleKey ? 'header-text-selection' : 'header-text-desktop', " ").concat(screenType === _enums.ScreenType.MOBILE ? 'text-14-normal-uppercase' : 'text-22-bold') + }, /*#__PURE__*/_react.default.createElement("span", null, t(desktopTitleKey))), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _feedback.default, - size: 40 - }))), children)), /*#__PURE__*/_react.default.createElement("div", { + sized: 40, + onClick: handleClickFeedbacks, + "aria-label": t('header.accessibility.button_open_feedbacks'), + className: "header-feedbacks-button" + })), children)), /*#__PURE__*/_react.default.createElement("div", { className: "header-bar" })); }; @@ -1989,12 +2032,12 @@ exports.InitStepsErrors = exports.InitSteps = void 0; var InitSteps; exports.InitSteps = InitSteps; (function (InitSteps) { - InitSteps[InitSteps["MIGRATION"] = 0] = "MIGRATION"; - InitSteps[InitSteps["CONSENT"] = 1] = "CONSENT"; + InitSteps[InitSteps["CONSENT"] = 0] = "CONSENT"; + InitSteps[InitSteps["PRICES"] = 1] = "PRICES"; InitSteps[InitSteps["PROFILE"] = 2] = "PROFILE"; - InitSteps[InitSteps["CHALLENGES"] = 3] = "CHALLENGES"; - InitSteps[InitSteps["PRICES"] = 4] = "PRICES"; - InitSteps[InitSteps["CONSOS"] = 5] = "CONSOS"; + InitSteps[InitSteps["CONSOS"] = 3] = "CONSOS"; + InitSteps[InitSteps["MIGRATION"] = 4] = "MIGRATION"; + InitSteps[InitSteps["CHALLENGES"] = 5] = "CHALLENGES"; })(InitSteps || (exports.InitSteps = InitSteps = {})); var InitStepsErrors; exports.InitStepsErrors = InitStepsErrors; @@ -3659,9 +3702,9 @@ var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("HZZ/")); var _Button = _interopRequireDefault(__webpack_require__("49+2")); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _chronoMini = _interopRequireDefault(__webpack_require__("YfsH")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); var _cozyClient = __webpack_require__("xEu0"); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _challenge = _interopRequireDefault(__webpack_require__("J5Yu")); @@ -3710,7 +3753,7 @@ var ActionModal = function ActionModal(_ref) { id: "accessibility-title" }, t('action_modal.accessibility.window_title')), /*#__PURE__*/_react.default.createElement("div", { className: "action-modal" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _chronoMini.default, size: 75 }), /*#__PURE__*/_react.default.createElement("div", { @@ -4260,7 +4303,7 @@ exports.i(__webpack_require__("/O3k"), ""); exports.push([module.i, "@import url(https://fonts.googleapis.com/css2?family=Lato:wght@400;700&display=swap);", ""]); // Module -exports.push([module.i, "/* Cozy UI utilities classes */\n/* Cozy UI React components styles */\n/* App styles */\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\nhtml {\n background: #121212;\n}\n\nbody {\n background: #121212;\n overflow: unset !important;\n color: #e0e0e0;\n}\n\n.column {\n display: flex;\n flex-direction: column;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.cozy-bar {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: 0;\n}\n\n[role=banner] .coz-bar-container {\n background-color: #ffffff;\n}\n@media only screen and (max-width : 768px) {\n [role=banner] .coz-bar-container {\n padding: 0.6rem 0 0 0;\n background-color: unset;\n }\n}\n\n.coz-bar-wrapper {\n box-shadow: unset !important;\n background: unset !important;\n}\n\n.coz-label {\n color: #32363f;\n}\n\n.content-view-loading {\n height: 80vh;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n color: #e0e0e0;\n}\n.content-view-loading .content-view-loading-text {\n padding-top: 1rem;\n margin: 0 2rem;\n text-align: center;\n}\n.content-view-loading .content-view-loading-button {\n max-width: 50vw;\n margin-top: 1rem;\n}\n\n[role=main] {\n /* width */\n /* Track */\n /* Handle */\n}\n[role=main]::-webkit-scrollbar {\n width: 10px;\n}\n[role=main]::-webkit-scrollbar-track {\n background: #3e4045;\n}\n[role=main]::-webkit-scrollbar-thumb {\n background: #6f7074;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n* {\n font-family: Lato, sans-serif;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np {\n color: #a0a0a0;\n font-family: Lato, sans-serif;\n}\n\n.home-title {\n font-size: 1rem;\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 120%;\n text-transform: uppercase;\n}\n\n.app-title {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 21px;\n line-height: 24px;\n text-align: center;\n letter-spacing: 0.15px;\n color: #e0e0e0;\n text-shadow: 0px -1px 0px #060609, 0px 1px 0px rgba(255, 255, 255, 0.07);\n}\n\n.text-10, .text-10-italic, .text-10-bold, .text-10-bold-capitalize, .text-10-bold-uppercase, .text-10-normal, .text-10-normal-150, .text-10-normal-uppercase {\n font-style: normal;\n font-size: 0.625rem;\n line-height: 120%;\n}\n.text-10-normal, .text-10-normal-150, .text-10-normal-uppercase {\n font-weight: normal;\n}\n.text-10-normal-uppercase {\n text-transform: uppercase;\n}\n.text-10-normal-150 {\n line-height: 150%;\n}\n.text-10-bold, .text-10-bold-capitalize, .text-10-bold-uppercase {\n font-weight: 700;\n}\n.text-10-bold-uppercase {\n text-transform: uppercase;\n}\n.text-10-bold-capitalize {\n text-transform: capitalize;\n}\n.text-10-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-12, .text-12-italic, .text-12-bold, .text-12-bold-capitalize, .text-12-bold-uppercase, .text-12-normal, .text-12-normal-150, .text-12-normal-uppercase {\n font-style: normal;\n font-size: 0.75rem;\n line-height: 120%;\n}\n.text-12-normal, .text-12-normal-150, .text-12-normal-uppercase {\n font-weight: normal;\n}\n.text-12-normal-uppercase {\n text-transform: uppercase;\n}\n.text-12-normal-150 {\n line-height: 150%;\n}\n.text-12-bold, .text-12-bold-capitalize, .text-12-bold-uppercase {\n font-weight: 700;\n}\n.text-12-bold-uppercase {\n text-transform: uppercase;\n}\n.text-12-bold-capitalize {\n text-transform: capitalize;\n}\n.text-12-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-13, .text-13-italic, .text-13-bold, .text-13-bold-capitalize, .text-13-bold-uppercase, .text-13-normal, .text-13-normal-150, .text-13-normal-uppercase {\n font-style: normal;\n font-size: 0.8125rem;\n line-height: 120%;\n}\n.text-13-normal, .text-13-normal-150, .text-13-normal-uppercase {\n font-weight: normal;\n}\n.text-13-normal-uppercase {\n text-transform: uppercase;\n}\n.text-13-normal-150 {\n line-height: 150%;\n}\n.text-13-bold, .text-13-bold-capitalize, .text-13-bold-uppercase {\n font-weight: 700;\n}\n.text-13-bold-uppercase {\n text-transform: uppercase;\n}\n.text-13-bold-capitalize {\n text-transform: capitalize;\n}\n.text-13-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-14, .text-14-italic, .text-14-bold, .text-14-bold-capitalize, .text-14-bold-uppercase, .text-14-normal, .text-14-normal-150, .text-14-normal-uppercase {\n font-style: normal;\n font-size: 0.875rem;\n line-height: 120%;\n}\n.text-14-normal, .text-14-normal-150, .text-14-normal-uppercase {\n font-weight: normal;\n}\n.text-14-normal-uppercase {\n text-transform: uppercase;\n}\n.text-14-normal-150 {\n line-height: 150%;\n}\n.text-14-bold, .text-14-bold-capitalize, .text-14-bold-uppercase {\n font-weight: 700;\n}\n.text-14-bold-uppercase {\n text-transform: uppercase;\n}\n.text-14-bold-capitalize {\n text-transform: capitalize;\n}\n.text-14-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-15, .text-15-italic, .text-15-bold, .text-15-bold-capitalize, .text-15-bold-uppercase, .text-15-normal, .text-15-normal-150, .text-15-normal-uppercase {\n font-style: normal;\n font-size: 0.938rem;\n line-height: 120%;\n}\n.text-15-normal, .text-15-normal-150, .text-15-normal-uppercase {\n font-weight: normal;\n}\n.text-15-normal-uppercase {\n text-transform: uppercase;\n}\n.text-15-normal-150 {\n line-height: 150%;\n}\n.text-15-bold, .text-15-bold-capitalize, .text-15-bold-uppercase {\n font-weight: 700;\n}\n.text-15-bold-uppercase {\n text-transform: uppercase;\n}\n.text-15-bold-capitalize {\n text-transform: capitalize;\n}\n.text-15-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-16, .text-16-italic, .text-16-bold, .text-16-bold-capitalize, .text-16-bold-uppercase, .text-16-normal, .text-16-normal-150, .text-16-normal-uppercase {\n font-style: normal;\n font-size: 1rem;\n line-height: 120%;\n}\n.text-16-normal, .text-16-normal-150, .text-16-normal-uppercase {\n font-weight: normal;\n}\n.text-16-normal-uppercase {\n text-transform: uppercase;\n}\n.text-16-normal-150 {\n line-height: 150%;\n}\n.text-16-bold, .text-16-bold-capitalize, .text-16-bold-uppercase {\n font-weight: 700;\n}\n.text-16-bold-uppercase {\n text-transform: uppercase;\n}\n.text-16-bold-capitalize {\n text-transform: capitalize;\n}\n.text-16-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-18, .text-18-italic, .text-18-bold, .text-18-bold-capitalize, .text-18-bold-uppercase, .text-18-normal, .text-18-normal-150, .text-18-normal-uppercase {\n font-style: normal;\n font-size: 1.125rem;\n line-height: 120%;\n}\n.text-18-normal, .text-18-normal-150, .text-18-normal-uppercase {\n font-weight: normal;\n}\n.text-18-normal-uppercase {\n text-transform: uppercase;\n}\n.text-18-normal-150 {\n line-height: 150%;\n}\n.text-18-bold, .text-18-bold-capitalize, .text-18-bold-uppercase {\n font-weight: 700;\n}\n.text-18-bold-uppercase {\n text-transform: uppercase;\n}\n.text-18-bold-capitalize {\n text-transform: capitalize;\n}\n.text-18-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-19, .text-19-italic, .text-19-bold, .text-19-bold-capitalize, .text-19-bold-uppercase, .text-19-normal, .text-19-normal-150, .text-19-normal-uppercase {\n font-style: normal;\n font-size: 1.188rem;\n line-height: 120%;\n}\n.text-19-normal, .text-19-normal-150, .text-19-normal-uppercase {\n font-weight: normal;\n}\n.text-19-normal-uppercase {\n text-transform: uppercase;\n}\n.text-19-normal-150 {\n line-height: 150%;\n}\n.text-19-bold, .text-19-bold-capitalize, .text-19-bold-uppercase {\n font-weight: 700;\n}\n.text-19-bold-uppercase {\n text-transform: uppercase;\n}\n.text-19-bold-capitalize {\n text-transform: capitalize;\n}\n.text-19-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-20, .text-20-italic, .text-20-bold, .text-20-bold-capitalize, .text-20-bold-uppercase, .text-20-normal, .text-20-normal-150, .text-20-normal-uppercase {\n font-style: normal;\n font-size: 1.25rem;\n line-height: 120%;\n}\n.text-20-normal, .text-20-normal-150, .text-20-normal-uppercase {\n font-weight: normal;\n}\n.text-20-normal-uppercase {\n text-transform: uppercase;\n}\n.text-20-normal-150 {\n line-height: 150%;\n}\n.text-20-bold, .text-20-bold-capitalize, .text-20-bold-uppercase {\n font-weight: 700;\n}\n.text-20-bold-uppercase {\n text-transform: uppercase;\n}\n.text-20-bold-capitalize {\n text-transform: capitalize;\n}\n.text-20-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-21, .text-21-italic, .text-21-bold, .text-21-bold-capitalize, .text-21-bold-uppercase, .text-21-normal, .text-21-normal-150, .text-21-normal-uppercase {\n font-style: normal;\n font-size: 1.313rem;\n line-height: 120%;\n}\n.text-21-normal, .text-21-normal-150, .text-21-normal-uppercase {\n font-weight: normal;\n}\n.text-21-normal-uppercase {\n text-transform: uppercase;\n}\n.text-21-normal-150 {\n line-height: 150%;\n}\n.text-21-bold, .text-21-bold-capitalize, .text-21-bold-uppercase {\n font-weight: 700;\n}\n.text-21-bold-uppercase {\n text-transform: uppercase;\n}\n.text-21-bold-capitalize {\n text-transform: capitalize;\n}\n.text-21-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-22, .text-22-italic, .text-22-bold, .text-22-bold-capitalize, .text-22-bold-uppercase, .text-22-normal, .text-22-normal-150, .text-22-normal-uppercase {\n font-style: normal;\n font-size: 1.375rem;\n line-height: 120%;\n}\n.text-22-normal, .text-22-normal-150, .text-22-normal-uppercase {\n font-weight: normal;\n}\n.text-22-normal-uppercase {\n text-transform: uppercase;\n}\n.text-22-normal-150 {\n line-height: 150%;\n}\n.text-22-bold, .text-22-bold-capitalize, .text-22-bold-uppercase {\n font-weight: 700;\n}\n.text-22-bold-uppercase {\n text-transform: uppercase;\n}\n.text-22-bold-capitalize {\n text-transform: capitalize;\n}\n.text-22-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-24, .text-24-italic, .text-24-bold, .text-24-bold-capitalize, .text-24-bold-uppercase, .text-24-normal, .text-24-normal-150, .text-24-normal-uppercase {\n font-style: normal;\n font-size: 1.5rem;\n line-height: 120%;\n}\n.text-24-normal, .text-24-normal-150, .text-24-normal-uppercase {\n font-weight: normal;\n}\n.text-24-normal-uppercase {\n text-transform: uppercase;\n}\n.text-24-normal-150 {\n line-height: 150%;\n}\n.text-24-bold, .text-24-bold-capitalize, .text-24-bold-uppercase {\n font-weight: 700;\n}\n.text-24-bold-uppercase {\n text-transform: uppercase;\n}\n.text-24-bold-capitalize {\n text-transform: capitalize;\n}\n.text-24-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-26, .text-26-italic, .text-26-bold, .text-26-bold-capitalize, .text-26-bold-uppercase, .text-26-normal, .text-26-normal-150, .text-26-normal-uppercase {\n font-style: normal;\n font-size: 1.625rem;\n line-height: 120%;\n}\n.text-26-normal, .text-26-normal-150, .text-26-normal-uppercase {\n font-weight: normal;\n}\n.text-26-normal-uppercase {\n text-transform: uppercase;\n}\n.text-26-normal-150 {\n line-height: 150%;\n}\n.text-26-bold, .text-26-bold-capitalize, .text-26-bold-uppercase {\n font-weight: 700;\n}\n.text-26-bold-uppercase {\n text-transform: uppercase;\n}\n.text-26-bold-capitalize {\n text-transform: capitalize;\n}\n.text-26-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-28, .text-28-italic, .text-28-bold, .text-28-bold-capitalize, .text-28-bold-uppercase, .text-28-normal, .text-28-normal-150, .text-28-normal-uppercase {\n font-style: normal;\n font-size: 1.75rem;\n line-height: 120%;\n}\n.text-28-normal, .text-28-normal-150, .text-28-normal-uppercase {\n font-weight: normal;\n}\n.text-28-normal-uppercase {\n text-transform: uppercase;\n}\n.text-28-normal-150 {\n line-height: 150%;\n}\n.text-28-bold, .text-28-bold-capitalize, .text-28-bold-uppercase {\n font-weight: 700;\n}\n.text-28-bold-uppercase {\n text-transform: uppercase;\n}\n.text-28-bold-capitalize {\n text-transform: capitalize;\n}\n.text-28-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-36, .text-36-italic, .text-36-bold, .text-36-bold-capitalize, .text-36-bold-uppercase, .text-36-normal, .text-36-normal-150, .text-36-normal-uppercase {\n font-style: normal;\n font-size: 2.25rem;\n line-height: 120%;\n}\n.text-36-normal, .text-36-normal-150, .text-36-normal-uppercase {\n font-weight: normal;\n}\n.text-36-normal-uppercase {\n text-transform: uppercase;\n}\n.text-36-normal-150 {\n line-height: 150%;\n}\n.text-36-bold, .text-36-bold-capitalize, .text-36-bold-uppercase {\n font-weight: 700;\n}\n.text-36-bold-uppercase {\n text-transform: uppercase;\n}\n.text-36-bold-capitalize {\n text-transform: capitalize;\n}\n.text-36-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n/* Card */\n.card-title-on {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1.125rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-text-bold {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-indicator {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n/* Chart */\n.chart-ticks-x-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n}\n@media only screen and (max-width : 768px) {\n .chart-ticks-x-text {\n font-size: 0.685rem;\n }\n}\n\n.chart-ticks-y-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 0.9rem;\n line-height: 120%;\n}\n@media only screen and (max-width : 768px) {\n .chart-ticks-y-text {\n font-size: 0.75rem;\n }\n}\n\n/* Cozy bar */\n.cozybar {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 1.3125rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.axis {\n color: #7b7b7b;\n}\n.axis .tick-text {\n fill: #7b7b7b;\n}\n.axis .tick-text.tick-text-selected {\n fill: #e0e0e0;\n}\n.axis .separator {\n text-align: center;\n margin: 0 2px;\n font-size: 1rem !important;\n}\n\n.value-text {\n fill: #7b7b7b;\n}\n.value-text.selected {\n fill: #e0e0e0;\n}\n\n.barContainer.disabled *,\n.barFill.disabled * {\n cursor: default !important;\n}\n.barContainer:hover,\n.barFill:hover {\n cursor: pointer;\n}\n\n.background-true {\n opacity: 0.1;\n}\n.background-true:hover {\n cursor: pointer;\n}\n\n.background-false {\n opacity: 0;\n}\n\n.bar-compare-ELECTRICITY:hover,\n.bar-compare-GAS:hover,\n.bar-compare-WATER:hover,\n.bar-compare-MULTIFLUID:hover,\n.bar-MULTIFLUID:hover,\n.bar-WATER:hover,\n.bar-GAS:hover,\n.bar-ELECTRICITY:hover {\n cursor: pointer;\n}\n.bar-compare-ELECTRICITY:hover.disabled,\n.bar-compare-GAS:hover.disabled,\n.bar-compare-WATER:hover.disabled,\n.bar-compare-MULTIFLUID:hover.disabled,\n.bar-MULTIFLUID:hover.disabled,\n.bar-WATER:hover.disabled,\n.bar-GAS:hover.disabled,\n.bar-ELECTRICITY:hover.disabled {\n cursor: default;\n}\n\n.bar-ELECTRICITY {\n fill: #5d3d2a;\n}\n.bar-ELECTRICITY.selected {\n fill: #d87b39;\n filter: drop-shadow(0 -0.1rem 0.2rem #d87b39);\n}\n\n.bar-compare-ELECTRICITY {\n fill: #795c47;\n}\n.bar-compare-ELECTRICITY.selected {\n fill: #e2bca1;\n filter: drop-shadow(0 -0.1rem 0.2rem #e2bca1);\n}\n\n.bar-WATER {\n fill: #20415e;\n}\n.bar-WATER.selected {\n fill: #3a98ec;\n filter: drop-shadow(0 -0.1rem 0.2rem #3a98ec);\n}\n\n.bar-compare-WATER {\n fill: #4d5c6e;\n}\n.bar-compare-WATER.selected {\n fill: #abd4fa;\n filter: drop-shadow(0 -0.1rem 0.2rem #abd4fa);\n}\n\n.bar-GAS {\n fill: #184940;\n}\n.bar-GAS.selected {\n fill: #45d1b8;\n filter: drop-shadow(0 -0.1rem 0.2rem #45d1b8);\n}\n\n.bar-compare-GAS {\n fill: #597773;\n}\n.bar-compare-GAS.selected {\n fill: #a8f7e9;\n filter: drop-shadow(0 -0.1rem 0.2rem #a8f7e9);\n}\n\n.bar-MULTIFLUID {\n fill: #705d1d;\n}\n.bar-MULTIFLUID.selected {\n fill: #e3b82a;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n.bar-MULTIFLUID.disabled:hover {\n cursor: default;\n}\n\n.bar-duel {\n fill: #61f0f2;\n}\n.bar-duel.selected {\n fill: #61f0f2;\n filter: drop-shadow(0 -0.1rem 0.2rem #61f0f2);\n}\n.bar-duel.disabled:hover {\n cursor: default;\n}\n\n.bar-UPCOMING {\n fill: #7b7b7b;\n opacity: 0.6;\n}\n.bar-UPCOMING.selected {\n fill: #7b7b7b;\n}\n.bar-UPCOMING.disabled:hover {\n cursor: default;\n}\n\n.bar-compare-MULTIFLUID {\n fill: #7d6a4e;\n}\n.bar-compare-MULTIFLUID.selected {\n fill: #ffd597;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n\n.bar-average {\n stroke-width: 2;\n stroke: #e3b82a;\n}\n\n.week {\n fill: #e2bca1;\n}\n.week.selected {\n fill: #e2bca1;\n filter: drop-shadow(0 -0.1rem 0.2rem #e2bca1);\n}\n\n.weekend {\n fill: #ffd597;\n}\n.weekend.selected {\n fill: #ffd597;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n\n/** Animation **/\n.bounce-1 {\n animation-name: bounce-1;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n transform-box: fill-box;\n}\n\n@keyframes bounce-1 {\n 0% {\n transform: scale(0.1, 0.1);\n }\n 28% {\n transform: scale(0.1, 1.1);\n }\n 45% {\n transform: scale(0.8, 0.95);\n }\n 55% {\n transform: scale(1, 1);\n }\n 65% {\n transform: scale(1, 0.98);\n }\n 75% {\n transform: scale(1, 1);\n }\n}\n.bounce-2 {\n animation-name: bounce-2;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n transform-box: fill-box;\n}\n\n@keyframes bounce-2 {\n 0% {\n transform: scale(1, 1);\n }\n 28% {\n transform: scale(1, 1.1);\n }\n 45% {\n transform: scale(0.8, 0.95);\n }\n 55% {\n transform: scale(1, 1);\n }\n 65% {\n transform: scale(1, 0.98);\n }\n 75% {\n transform: scale(1, 1);\n }\n}\n.bounce-3 {\n animation-name: bounce-3;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n}\n\n@keyframes bounce-3 {\n 0% {\n opacity: 0.6;\n transform: scaleY(1);\n }\n 50% {\n transform: scaleY(1.1);\n opacity: 0.8;\n }\n 100% {\n transform: scaleY(1);\n opacity: 1;\n }\n}\n/** Animation delay **/\n.delay {\n animation-duration: 0.4s;\n}\n\n.delay--0 {\n animation-duration: 0.4s;\n}\n\n.delay--1 {\n animation-duration: 0.48s;\n}\n\n.delay--2 {\n animation-duration: 0.56s;\n}\n\n.delay--3 {\n animation-duration: 0.64s;\n}\n\n.delay--4 {\n animation-duration: 0.72s;\n}\n\n.delay--5 {\n animation-duration: 0.8s;\n}\n\n.delay--6 {\n animation-duration: 0.88s;\n}\n\n.delay--7 {\n animation-duration: 0.96s;\n}\n\n.delay--8 {\n animation-duration: 1.04s;\n}\n\n.delay--9 {\n animation-duration: 1.12s;\n}\n\n.delay--10 {\n animation-duration: 1.2s;\n}\n\n.delay--11 {\n animation-duration: 1.28s;\n}\n\n.delay--12 {\n animation-duration: 1.36s;\n}\n\n.delay--13 {\n animation-duration: 1.44s;\n}\n\n.delay--14 {\n animation-duration: 1.52s;\n}\n\n.delay--15 {\n animation-duration: 1.6s;\n}\n\n.delay--16 {\n animation-duration: 1.68s;\n}\n\n.delay--17 {\n animation-duration: 1.76s;\n}\n\n.delay--18 {\n animation-duration: 1.84s;\n}\n\n.delay--19 {\n animation-duration: 1.92s;\n}\n\n.delay--20 {\n animation-duration: 2s;\n}\n\n.delay--21 {\n animation-duration: 2.08s;\n}\n\n.delay--22 {\n animation-duration: 2.16s;\n}\n\n.delay--23 {\n animation-duration: 2.24s;\n}\n\n.delay--24 {\n animation-duration: 2.32s;\n}\n\n.delay--25 {\n animation-duration: 2.4s;\n}\n\n.delay--26 {\n animation-duration: 2.48s;\n}\n\n.delay--27 {\n animation-duration: 2.56s;\n}\n\n.delay--28 {\n animation-duration: 2.64s;\n}\n\n.delay--29 {\n animation-duration: 2.72s;\n}\n\n.delay--30 {\n animation-duration: 2.8s;\n}\n\n.delay--31 {\n animation-duration: 2.88s;\n}\n\n.delay--32 {\n animation-duration: 2.96s;\n}\n\n.delay--33 {\n animation-duration: 3.04s;\n}\n\n.delay--34 {\n animation-duration: 3.12s;\n}\n\n.delay--35 {\n animation-duration: 3.2s;\n}\n\n.delay--36 {\n animation-duration: 3.28s;\n}\n\n.delay--37 {\n animation-duration: 3.36s;\n}\n\n.delay--38 {\n animation-duration: 3.44s;\n}\n\n.delay--39 {\n animation-duration: 3.52s;\n}\n\n.delay--40 {\n animation-duration: 3.6s;\n}\n\n.delay--41 {\n animation-duration: 3.68s;\n}\n\n.delay--42 {\n animation-duration: 3.76s;\n}\n\n.delay--43 {\n animation-duration: 3.84s;\n}\n\n.delay--44 {\n animation-duration: 3.92s;\n}\n\n.delay--45 {\n animation-duration: 4s;\n}\n\n.delay--46 {\n animation-duration: 4.08s;\n}\n\n.delay--47 {\n animation-duration: 4.16s;\n}\n\n.delay--48 {\n animation-duration: 4.24s;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\nbutton span {\n font-size: 1rem;\n font-weight: 700;\n}\nbutton.btnPrimary {\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017;\n border: 1px solid;\n border-color: transparent;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n}\nbutton.btnPrimary span:first-child {\n color: #121212;\n}\nbutton.btnPrimary:hover, button.btnPrimary:focus, button.btnPrimary.active, button.btnPrimary:disabled {\n background-color: #b89318;\n}\nbutton.btnPrimary:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btnSecondary {\n background: transparent;\n border: 1px solid;\n border-color: #e0e0e0;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n}\nbutton.btnSecondary span:first-child {\n color: #e0e0e0;\n}\nbutton.btnSecondary:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btnText {\n text-decoration: underline;\n}\nbutton.btnText span {\n text-transform: none;\n font-weight: 400;\n}\nbutton.btnPrimaryNegative {\n background: linear-gradient(180deg, #61f0f2 0%, #48c2c4 100%);\n border: 1px solid;\n border-color: transparent;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n}\nbutton.btnPrimaryNegative span:first-child {\n color: #121212;\n}\nbutton.btnPrimaryNegative:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btnPrimaryNegative:hover {\n opacity: 0.7;\n}\nbutton.btnIncrement {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n border: 1px solid;\n border-color: transparent;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n min-width: 40px;\n width: 40px;\n height: 40px;\n border-radius: 4px;\n box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.55);\n}\nbutton.btnIncrement span:first-child {\n color: #ffffff;\n}\nbutton.btnIncrement:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ninput.inputText,\ninput.inputNumber {\n box-sizing: border-box;\n border: 1px solid #7b7b7b;\n background: transparent;\n transition: all 300ms ease;\n color: #e0e0e0;\n}\ninput.inputText:focus, input.inputText:focus-visible,\ninput.inputNumber:focus,\ninput.inputNumber:focus-visible {\n border-color: #e3b82a;\n outline: none;\n}\n\ninput.inputText {\n appearance: none;\n border-radius: 4px;\n height: 45px;\n width: 100%;\n max-width: 280px;\n padding: 0 0.5rem;\n}\n\ninput.inputNumber {\n border-radius: 2px;\n height: 40px;\n width: 60px;\n max-width: 5rem;\n text-align: center;\n}\n\ninput.inputCheckbox {\n width: 24px;\n min-width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n border-radius: 4px;\n cursor: pointer;\n appearance: none;\n background: #121212;\n position: relative;\n border: solid 1px #7b7b7b;\n}\ninput.inputCheckbox:checked {\n background: #e3b82a;\n border-color: #e3b82a;\n}\ninput.inputCheckbox:checked:before, input.inputCheckbox:checked:after {\n content: \"\";\n position: absolute;\n display: inline-block;\n background: #121212;\n border-radius: 0.5rem;\n}\ninput.inputCheckbox:checked:before {\n width: 3px;\n height: 12px;\n left: 10px;\n top: 4px;\n transform: rotate(41deg);\n}\ninput.inputCheckbox:checked:after {\n width: 3px;\n height: 6px;\n left: 5px;\n top: 8px;\n transform: rotate(133deg);\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.card {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n box-sizing: border-box;\n box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);\n border-radius: 4px;\n padding: 16px;\n}\n.card:hover {\n background: linear-gradient(180deg, rgba(70, 71, 77, 0.7) 0%, rgba(57, 58, 63, 0.7) 100%);\n}\n.card.rich-card {\n padding: 16px;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ndiv.modal-root .MuiBackdrop-root {\n background-color: hsla(231deg, 11%, 12%, 0.85);\n}\n\ndiv.modal-paper {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n width: 36rem;\n max-width: 100%;\n max-height: 90vh;\n padding: 2rem;\n box-sizing: border-box;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n margin: 0 0 0 13.75rem;\n align-items: center;\n color: #ffffff;\n}\n@media only screen and (max-width : 1023px) {\n div.modal-paper {\n width: 35rem;\n margin: 0;\n }\n}\n@media only screen and (max-width : 768px) {\n div.modal-paper {\n padding: 1rem 1rem 1.5rem;\n width: 85%;\n max-width: 35rem;\n margin: 0;\n }\n}\ndiv.modal-paper.no-padding {\n padding: 0;\n}\ndiv.modal-paper.blue-border {\n border: 1px solid rgba(88, 255, 255, 0.2509803922);\n}\ndiv.modal-paper.blue-light-border {\n border: 1px solid #61f0f2;\n}\ndiv.modal-paper.yellow-border {\n border: 1px solid rgba(227, 184, 42, 0.4);\n}\ndiv.modal-paper .modal-paper-close-button {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n padding: 5px 5px;\n z-index: 10;\n}\n\ndiv.modal-paper-full-screen {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n width: 100%;\n max-width: 100%;\n height: 100%;\n max-height: 100%;\n padding: 0;\n margin: 0;\n box-sizing: border-box;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n color: #ffffff;\n display: flex;\n align-items: center;\n}\ndiv.modal-paper-full-screen.dark-background {\n background: #121212;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ndiv.expansion-panel-root {\n margin: 1.2rem 0;\n color: #e0e0e0;\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n border-radius: 4px;\n box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);\n transition: background-color 0.6s ease;\n box-sizing: border-box;\n}\ndiv.expansion-panel-root.Mui-expanded:first-child {\n margin: 1.2rem 0;\n}\ndiv.expansion-panel-root.Mui-expanded:last-child {\n margin: 1.2rem 0;\n}\ndiv.expansion-panel-root.red-border {\n border: 1px solid #d25959;\n}\n\ndiv.expansion-panel-summary {\n padding: 0.25rem 1.2rem;\n min-height: 4rem;\n}\ndiv.expansion-panel-summary.Mui-focused {\n border-radius: 4px;\n background-color: unset;\n box-shadow: 0 0 0 1px #e0e0e0;\n}\ndiv.expansion-panel-summary.Mui-expanded {\n min-height: 4rem;\n}\ndiv.expansion-panel-summary.Mui-expanded.small {\n min-height: 3rem;\n}\ndiv.expansion-panel-summary.small {\n padding: 0 1.2rem;\n min-height: 3rem;\n}\ndiv.expansion-panel-summary.bold-text {\n font-weight: bold;\n}\n\ndiv.expansion-panel-content {\n display: flex;\n align-items: center;\n}\ndiv.expansion-panel-content.Mui-expanded {\n margin: 0.75rem 0;\n}\n\ndiv.expansion-panel-details {\n padding: 0 1.2rem 1.2rem;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\na {\n color: #deaf0e;\n}\na:visited {\n color: #deaf0e;\n}\n\na:focus {\n outline: none;\n box-shadow: inset 0 0 0 1px #e0e0e0;\n}\na:focus > div:first-child {\n box-shadow: 0 0 0 1px #e0e0e0;\n}\n\na.MuiLink-underlineHover:hover {\n text-decoration: none;\n}\n\na.MuiTypography-colorPrimary {\n color: #e0e0e0;\n}\n\n:root {\n white-space: pre-line;\n --blue: #58ffff;\n --blue40: rgba(88, 255, 255, 0.2509803922);\n --blueBackground: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n --blueRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n --blueRadialGradientTrans: radial-gradient(circle, #58ffff 0%, rgba(255, 255, 255, 0) 100%);\n --elecColor: #d87b39;\n --elecColor40: rgba(216, 123, 57, 0.4);\n --elecCompareColor: #e2bca1;\n --gasColor: #45d1b8;\n --gasColor40: rgba(69, 209, 184, 0.4);\n --gasCompareColor: #a8f7e9;\n --waterColor: #3a98ec;\n --waterColor40: rgba(58, 152, 236, 0.4);\n --waterCompareColor: #abd4fa;\n --multiColor: #e3b82a;\n --multiCompareColor: #ffd597;\n --redPrimary: #d25959;\n --greyBright: #e0e0e0;\n --greyDark: #7b7b7b;\n --textWhite: #ffffff;\n --softGrey: #a0a0a0;\n --darkLight: #25262b;\n --darkLight2: #121212;\n --textFont: Lato, sans-serif;\n --greyLinearGradientBackground: linear-gradient(180deg, #323339 0%, #25262b 100%);\n --multiColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%);\n --elecColorRadialGradientTrans: radial-gradient(circle, #d87b39 0%, rgba(255, 255, 255, 0) 100%);\n --waterColorRadialGradientTrans: radial-gradient(circle, #3a98ec 0%, rgba(255, 255, 255, 0) 100%);\n --gasColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%);\n --multiColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017;\n --elecColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(158, 67, 2, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #d87b39;\n --gasColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(4, 106, 88, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #45d1b8;\n --waterColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(2, 93, 174, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #3a98ec;\n}\n\n.application {\n overflow-x: hidden;\n background-color: #121212;\n}\n\n.accordion-icon {\n color: #ffffff;\n}\n\n.loaderContainer {\n height: 80vh;\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n}\n\n.makeStyles-fab-1 {\n top: 12px;\n left: 3rem !important;\n width: 36px !important;\n height: 36px !important;\n background-color: #323339 !important;\n}\n\ninput:-webkit-autofill,\ninput:-webkit-autofill:hover,\ninput:-webkit-autofill:focus,\ninput:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px #1b1c22 inset !important;\n}", ""]); +exports.push([module.i, "/* Cozy UI utilities classes */\n/* Cozy UI React components styles */\n/* App styles */\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\nhtml {\n background: #121212;\n}\n\nbody {\n background: #121212;\n overflow: unset !important;\n color: #e0e0e0;\n}\n\n.column {\n display: flex;\n flex-direction: column;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.cozy-bar {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: 0;\n}\n\n[role=banner] .coz-bar-container {\n background-color: #ffffff;\n}\n@media only screen and (max-width : 768px) {\n [role=banner] .coz-bar-container {\n padding: 0.6rem 0 0 0;\n background-color: unset;\n }\n}\n\n.coz-bar-wrapper {\n box-shadow: unset !important;\n background: unset !important;\n}\n\n.coz-label {\n color: #32363f;\n}\n\n.content-view-loading {\n height: 80vh;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n color: #e0e0e0;\n}\n.content-view-loading .content-view-loading-text {\n padding-top: 1rem;\n margin: 0 2rem;\n text-align: center;\n}\n.content-view-loading .content-view-loading-button {\n max-width: 50vw;\n margin-top: 1rem;\n}\n\n[role=main] {\n /* width */\n /* Track */\n /* Handle */\n}\n[role=main]::-webkit-scrollbar {\n width: 10px;\n}\n[role=main]::-webkit-scrollbar-track {\n background: #3e4045;\n}\n[role=main]::-webkit-scrollbar-thumb {\n background: #6f7074;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n* {\n font-family: Lato, sans-serif;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np {\n color: #a0a0a0;\n font-family: Lato, sans-serif;\n}\n\n.home-title {\n font-size: 1rem;\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 120%;\n text-transform: uppercase;\n}\n\n.app-title {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 21px;\n line-height: 24px;\n text-align: center;\n letter-spacing: 0.15px;\n color: #e0e0e0;\n text-shadow: 0px -1px 0px #060609, 0px 1px 0px rgba(255, 255, 255, 0.07);\n}\n\n.text-10, .text-10-italic, .text-10-bold, .text-10-bold-capitalize, .text-10-bold-uppercase, .text-10-normal, .text-10-normal-150, .text-10-normal-uppercase {\n font-style: normal;\n font-size: 0.625rem;\n line-height: 120%;\n}\n.text-10-normal, .text-10-normal-150, .text-10-normal-uppercase {\n font-weight: normal;\n}\n.text-10-normal-uppercase {\n text-transform: uppercase;\n}\n.text-10-normal-150 {\n line-height: 150%;\n}\n.text-10-bold, .text-10-bold-capitalize, .text-10-bold-uppercase {\n font-weight: 700;\n}\n.text-10-bold-uppercase {\n text-transform: uppercase;\n}\n.text-10-bold-capitalize {\n text-transform: capitalize;\n}\n.text-10-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-12, .text-12-italic, .text-12-bold, .text-12-bold-capitalize, .text-12-bold-uppercase, .text-12-normal, .text-12-normal-150, .text-12-normal-uppercase {\n font-style: normal;\n font-size: 0.75rem;\n line-height: 120%;\n}\n.text-12-normal, .text-12-normal-150, .text-12-normal-uppercase {\n font-weight: normal;\n}\n.text-12-normal-uppercase {\n text-transform: uppercase;\n}\n.text-12-normal-150 {\n line-height: 150%;\n}\n.text-12-bold, .text-12-bold-capitalize, .text-12-bold-uppercase {\n font-weight: 700;\n}\n.text-12-bold-uppercase {\n text-transform: uppercase;\n}\n.text-12-bold-capitalize {\n text-transform: capitalize;\n}\n.text-12-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-13, .text-13-italic, .text-13-bold, .text-13-bold-capitalize, .text-13-bold-uppercase, .text-13-normal, .text-13-normal-150, .text-13-normal-uppercase {\n font-style: normal;\n font-size: 0.8125rem;\n line-height: 120%;\n}\n.text-13-normal, .text-13-normal-150, .text-13-normal-uppercase {\n font-weight: normal;\n}\n.text-13-normal-uppercase {\n text-transform: uppercase;\n}\n.text-13-normal-150 {\n line-height: 150%;\n}\n.text-13-bold, .text-13-bold-capitalize, .text-13-bold-uppercase {\n font-weight: 700;\n}\n.text-13-bold-uppercase {\n text-transform: uppercase;\n}\n.text-13-bold-capitalize {\n text-transform: capitalize;\n}\n.text-13-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-14, .text-14-italic, .text-14-bold, .text-14-bold-capitalize, .text-14-bold-uppercase, .text-14-normal, .text-14-normal-150, .text-14-normal-uppercase {\n font-style: normal;\n font-size: 0.875rem;\n line-height: 120%;\n}\n.text-14-normal, .text-14-normal-150, .text-14-normal-uppercase {\n font-weight: normal;\n}\n.text-14-normal-uppercase {\n text-transform: uppercase;\n}\n.text-14-normal-150 {\n line-height: 150%;\n}\n.text-14-bold, .text-14-bold-capitalize, .text-14-bold-uppercase {\n font-weight: 700;\n}\n.text-14-bold-uppercase {\n text-transform: uppercase;\n}\n.text-14-bold-capitalize {\n text-transform: capitalize;\n}\n.text-14-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-15, .text-15-italic, .text-15-bold, .text-15-bold-capitalize, .text-15-bold-uppercase, .text-15-normal, .text-15-normal-150, .text-15-normal-uppercase {\n font-style: normal;\n font-size: 0.938rem;\n line-height: 120%;\n}\n.text-15-normal, .text-15-normal-150, .text-15-normal-uppercase {\n font-weight: normal;\n}\n.text-15-normal-uppercase {\n text-transform: uppercase;\n}\n.text-15-normal-150 {\n line-height: 150%;\n}\n.text-15-bold, .text-15-bold-capitalize, .text-15-bold-uppercase {\n font-weight: 700;\n}\n.text-15-bold-uppercase {\n text-transform: uppercase;\n}\n.text-15-bold-capitalize {\n text-transform: capitalize;\n}\n.text-15-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-16, .text-16-italic, .text-16-bold, .text-16-bold-capitalize, .text-16-bold-uppercase, .text-16-normal, .text-16-normal-150, .text-16-normal-uppercase {\n font-style: normal;\n font-size: 1rem;\n line-height: 120%;\n}\n.text-16-normal, .text-16-normal-150, .text-16-normal-uppercase {\n font-weight: normal;\n}\n.text-16-normal-uppercase {\n text-transform: uppercase;\n}\n.text-16-normal-150 {\n line-height: 150%;\n}\n.text-16-bold, .text-16-bold-capitalize, .text-16-bold-uppercase {\n font-weight: 700;\n}\n.text-16-bold-uppercase {\n text-transform: uppercase;\n}\n.text-16-bold-capitalize {\n text-transform: capitalize;\n}\n.text-16-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-18, .text-18-italic, .text-18-bold, .text-18-bold-capitalize, .text-18-bold-uppercase, .text-18-normal, .text-18-normal-150, .text-18-normal-uppercase {\n font-style: normal;\n font-size: 1.125rem;\n line-height: 120%;\n}\n.text-18-normal, .text-18-normal-150, .text-18-normal-uppercase {\n font-weight: normal;\n}\n.text-18-normal-uppercase {\n text-transform: uppercase;\n}\n.text-18-normal-150 {\n line-height: 150%;\n}\n.text-18-bold, .text-18-bold-capitalize, .text-18-bold-uppercase {\n font-weight: 700;\n}\n.text-18-bold-uppercase {\n text-transform: uppercase;\n}\n.text-18-bold-capitalize {\n text-transform: capitalize;\n}\n.text-18-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-19, .text-19-italic, .text-19-bold, .text-19-bold-capitalize, .text-19-bold-uppercase, .text-19-normal, .text-19-normal-150, .text-19-normal-uppercase {\n font-style: normal;\n font-size: 1.188rem;\n line-height: 120%;\n}\n.text-19-normal, .text-19-normal-150, .text-19-normal-uppercase {\n font-weight: normal;\n}\n.text-19-normal-uppercase {\n text-transform: uppercase;\n}\n.text-19-normal-150 {\n line-height: 150%;\n}\n.text-19-bold, .text-19-bold-capitalize, .text-19-bold-uppercase {\n font-weight: 700;\n}\n.text-19-bold-uppercase {\n text-transform: uppercase;\n}\n.text-19-bold-capitalize {\n text-transform: capitalize;\n}\n.text-19-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-20, .text-20-italic, .text-20-bold, .text-20-bold-capitalize, .text-20-bold-uppercase, .text-20-normal, .text-20-normal-150, .text-20-normal-uppercase {\n font-style: normal;\n font-size: 1.25rem;\n line-height: 120%;\n}\n.text-20-normal, .text-20-normal-150, .text-20-normal-uppercase {\n font-weight: normal;\n}\n.text-20-normal-uppercase {\n text-transform: uppercase;\n}\n.text-20-normal-150 {\n line-height: 150%;\n}\n.text-20-bold, .text-20-bold-capitalize, .text-20-bold-uppercase {\n font-weight: 700;\n}\n.text-20-bold-uppercase {\n text-transform: uppercase;\n}\n.text-20-bold-capitalize {\n text-transform: capitalize;\n}\n.text-20-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-21, .text-21-italic, .text-21-bold, .text-21-bold-capitalize, .text-21-bold-uppercase, .text-21-normal, .text-21-normal-150, .text-21-normal-uppercase {\n font-style: normal;\n font-size: 1.313rem;\n line-height: 120%;\n}\n.text-21-normal, .text-21-normal-150, .text-21-normal-uppercase {\n font-weight: normal;\n}\n.text-21-normal-uppercase {\n text-transform: uppercase;\n}\n.text-21-normal-150 {\n line-height: 150%;\n}\n.text-21-bold, .text-21-bold-capitalize, .text-21-bold-uppercase {\n font-weight: 700;\n}\n.text-21-bold-uppercase {\n text-transform: uppercase;\n}\n.text-21-bold-capitalize {\n text-transform: capitalize;\n}\n.text-21-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-22, .text-22-italic, .text-22-bold, .text-22-bold-capitalize, .text-22-bold-uppercase, .text-22-normal, .text-22-normal-150, .text-22-normal-uppercase {\n font-style: normal;\n font-size: 1.375rem;\n line-height: 120%;\n}\n.text-22-normal, .text-22-normal-150, .text-22-normal-uppercase {\n font-weight: normal;\n}\n.text-22-normal-uppercase {\n text-transform: uppercase;\n}\n.text-22-normal-150 {\n line-height: 150%;\n}\n.text-22-bold, .text-22-bold-capitalize, .text-22-bold-uppercase {\n font-weight: 700;\n}\n.text-22-bold-uppercase {\n text-transform: uppercase;\n}\n.text-22-bold-capitalize {\n text-transform: capitalize;\n}\n.text-22-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-24, .text-24-italic, .text-24-bold, .text-24-bold-capitalize, .text-24-bold-uppercase, .text-24-normal, .text-24-normal-150, .text-24-normal-uppercase {\n font-style: normal;\n font-size: 1.5rem;\n line-height: 120%;\n}\n.text-24-normal, .text-24-normal-150, .text-24-normal-uppercase {\n font-weight: normal;\n}\n.text-24-normal-uppercase {\n text-transform: uppercase;\n}\n.text-24-normal-150 {\n line-height: 150%;\n}\n.text-24-bold, .text-24-bold-capitalize, .text-24-bold-uppercase {\n font-weight: 700;\n}\n.text-24-bold-uppercase {\n text-transform: uppercase;\n}\n.text-24-bold-capitalize {\n text-transform: capitalize;\n}\n.text-24-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-26, .text-26-italic, .text-26-bold, .text-26-bold-capitalize, .text-26-bold-uppercase, .text-26-normal, .text-26-normal-150, .text-26-normal-uppercase {\n font-style: normal;\n font-size: 1.625rem;\n line-height: 120%;\n}\n.text-26-normal, .text-26-normal-150, .text-26-normal-uppercase {\n font-weight: normal;\n}\n.text-26-normal-uppercase {\n text-transform: uppercase;\n}\n.text-26-normal-150 {\n line-height: 150%;\n}\n.text-26-bold, .text-26-bold-capitalize, .text-26-bold-uppercase {\n font-weight: 700;\n}\n.text-26-bold-uppercase {\n text-transform: uppercase;\n}\n.text-26-bold-capitalize {\n text-transform: capitalize;\n}\n.text-26-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-28, .text-28-italic, .text-28-bold, .text-28-bold-capitalize, .text-28-bold-uppercase, .text-28-normal, .text-28-normal-150, .text-28-normal-uppercase {\n font-style: normal;\n font-size: 1.75rem;\n line-height: 120%;\n}\n.text-28-normal, .text-28-normal-150, .text-28-normal-uppercase {\n font-weight: normal;\n}\n.text-28-normal-uppercase {\n text-transform: uppercase;\n}\n.text-28-normal-150 {\n line-height: 150%;\n}\n.text-28-bold, .text-28-bold-capitalize, .text-28-bold-uppercase {\n font-weight: 700;\n}\n.text-28-bold-uppercase {\n text-transform: uppercase;\n}\n.text-28-bold-capitalize {\n text-transform: capitalize;\n}\n.text-28-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-36, .text-36-italic, .text-36-bold, .text-36-bold-capitalize, .text-36-bold-uppercase, .text-36-normal, .text-36-normal-150, .text-36-normal-uppercase {\n font-style: normal;\n font-size: 2.25rem;\n line-height: 120%;\n}\n.text-36-normal, .text-36-normal-150, .text-36-normal-uppercase {\n font-weight: normal;\n}\n.text-36-normal-uppercase {\n text-transform: uppercase;\n}\n.text-36-normal-150 {\n line-height: 150%;\n}\n.text-36-bold, .text-36-bold-capitalize, .text-36-bold-uppercase {\n font-weight: 700;\n}\n.text-36-bold-uppercase {\n text-transform: uppercase;\n}\n.text-36-bold-capitalize {\n text-transform: capitalize;\n}\n.text-36-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n/* Card */\n.card-title-on {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1.125rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-text-bold {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-indicator {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n/* Chart */\n.chart-ticks-x-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n}\n@media only screen and (max-width : 768px) {\n .chart-ticks-x-text {\n font-size: 0.685rem;\n }\n}\n\n.chart-ticks-y-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 0.9rem;\n line-height: 120%;\n}\n@media only screen and (max-width : 768px) {\n .chart-ticks-y-text {\n font-size: 0.75rem;\n }\n}\n\n/* Cozy bar */\n.cozybar {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 1.3125rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.axis {\n color: #7b7b7b;\n}\n.axis .tick-text {\n fill: #7b7b7b;\n}\n.axis .tick-text.tick-text-selected {\n fill: #e0e0e0;\n}\n.axis .separator {\n text-align: center;\n margin: 0 2px;\n font-size: 1rem !important;\n}\n\n.value-text {\n fill: #7b7b7b;\n}\n.value-text.selected {\n fill: #e0e0e0;\n}\n\n.barContainer.disabled *,\n.barFill.disabled * {\n cursor: default !important;\n}\n.barContainer:hover,\n.barFill:hover {\n cursor: pointer;\n}\n\n.background-true {\n opacity: 0.1;\n}\n.background-true:hover {\n cursor: pointer;\n}\n\n.background-false {\n opacity: 0;\n}\n\n.bar-compare-ELECTRICITY:hover,\n.bar-compare-GAS:hover,\n.bar-compare-WATER:hover,\n.bar-compare-MULTIFLUID:hover,\n.bar-MULTIFLUID:hover,\n.bar-WATER:hover,\n.bar-GAS:hover,\n.bar-ELECTRICITY:hover {\n cursor: pointer;\n}\n.bar-compare-ELECTRICITY:hover.disabled,\n.bar-compare-GAS:hover.disabled,\n.bar-compare-WATER:hover.disabled,\n.bar-compare-MULTIFLUID:hover.disabled,\n.bar-MULTIFLUID:hover.disabled,\n.bar-WATER:hover.disabled,\n.bar-GAS:hover.disabled,\n.bar-ELECTRICITY:hover.disabled {\n cursor: default;\n}\n\n.bar-ELECTRICITY {\n fill: #5d3d2a;\n}\n.bar-ELECTRICITY.selected {\n fill: #d87b39;\n filter: drop-shadow(0 -0.1rem 0.2rem #d87b39);\n}\n\n.bar-compare-ELECTRICITY {\n fill: #795c47;\n}\n.bar-compare-ELECTRICITY.selected {\n fill: #e2bca1;\n filter: drop-shadow(0 -0.1rem 0.2rem #e2bca1);\n}\n\n.bar-WATER {\n fill: #20415e;\n}\n.bar-WATER.selected {\n fill: #3a98ec;\n filter: drop-shadow(0 -0.1rem 0.2rem #3a98ec);\n}\n\n.bar-compare-WATER {\n fill: #4d5c6e;\n}\n.bar-compare-WATER.selected {\n fill: #abd4fa;\n filter: drop-shadow(0 -0.1rem 0.2rem #abd4fa);\n}\n\n.bar-GAS {\n fill: #184940;\n}\n.bar-GAS.selected {\n fill: #45d1b8;\n filter: drop-shadow(0 -0.1rem 0.2rem #45d1b8);\n}\n\n.bar-compare-GAS {\n fill: #597773;\n}\n.bar-compare-GAS.selected {\n fill: #a8f7e9;\n filter: drop-shadow(0 -0.1rem 0.2rem #a8f7e9);\n}\n\n.bar-MULTIFLUID {\n fill: #705d1d;\n}\n.bar-MULTIFLUID.selected {\n fill: #e3b82a;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n.bar-MULTIFLUID.disabled:hover {\n cursor: default;\n}\n\n.bar-duel {\n fill: #61f0f2;\n}\n.bar-duel.selected {\n fill: #61f0f2;\n filter: drop-shadow(0 -0.1rem 0.2rem #61f0f2);\n}\n.bar-duel.disabled:hover {\n cursor: default;\n}\n\n.bar-UPCOMING {\n fill: #7b7b7b;\n opacity: 0.6;\n}\n.bar-UPCOMING.selected {\n fill: #7b7b7b;\n}\n.bar-UPCOMING.disabled:hover {\n cursor: default;\n}\n\n.bar-compare-MULTIFLUID {\n fill: #7d6a4e;\n}\n.bar-compare-MULTIFLUID.selected {\n fill: #ffd597;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n\n.bar-average {\n stroke-width: 2;\n stroke: #e3b82a;\n}\n\n.week {\n fill: #e2bca1;\n}\n.week.selected {\n fill: #e2bca1;\n filter: drop-shadow(0 -0.1rem 0.2rem #e2bca1);\n}\n\n.weekend {\n fill: #ffd597;\n}\n.weekend.selected {\n fill: #ffd597;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n\n.barValue {\n outline: none;\n}\n.barValue:focus-visible {\n outline: 1px solid;\n}\n\n/** Animation **/\n.bounce-1 {\n animation-name: bounce-1;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n transform-box: fill-box;\n}\n\n@keyframes bounce-1 {\n 0% {\n transform: scale(0.1, 0.1);\n }\n 28% {\n transform: scale(0.1, 1.1);\n }\n 45% {\n transform: scale(0.8, 0.95);\n }\n 55% {\n transform: scale(1, 1);\n }\n 65% {\n transform: scale(1, 0.98);\n }\n 75% {\n transform: scale(1, 1);\n }\n}\n.bounce-2 {\n animation-name: bounce-2;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n transform-box: fill-box;\n}\n\n@keyframes bounce-2 {\n 0% {\n transform: scale(1, 1);\n }\n 28% {\n transform: scale(1, 1.1);\n }\n 45% {\n transform: scale(0.8, 0.95);\n }\n 55% {\n transform: scale(1, 1);\n }\n 65% {\n transform: scale(1, 0.98);\n }\n 75% {\n transform: scale(1, 1);\n }\n}\n.bounce-3 {\n animation-name: bounce-3;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n}\n\n@keyframes bounce-3 {\n 0% {\n opacity: 0.6;\n transform: scaleY(1);\n }\n 50% {\n transform: scaleY(1.1);\n opacity: 0.8;\n }\n 100% {\n transform: scaleY(1);\n opacity: 1;\n }\n}\n/** Animation delay **/\n.delay {\n animation-duration: 0.4s;\n}\n\n.delay--0 {\n animation-duration: 0.4s;\n}\n\n.delay--1 {\n animation-duration: 0.48s;\n}\n\n.delay--2 {\n animation-duration: 0.56s;\n}\n\n.delay--3 {\n animation-duration: 0.64s;\n}\n\n.delay--4 {\n animation-duration: 0.72s;\n}\n\n.delay--5 {\n animation-duration: 0.8s;\n}\n\n.delay--6 {\n animation-duration: 0.88s;\n}\n\n.delay--7 {\n animation-duration: 0.96s;\n}\n\n.delay--8 {\n animation-duration: 1.04s;\n}\n\n.delay--9 {\n animation-duration: 1.12s;\n}\n\n.delay--10 {\n animation-duration: 1.2s;\n}\n\n.delay--11 {\n animation-duration: 1.28s;\n}\n\n.delay--12 {\n animation-duration: 1.36s;\n}\n\n.delay--13 {\n animation-duration: 1.44s;\n}\n\n.delay--14 {\n animation-duration: 1.52s;\n}\n\n.delay--15 {\n animation-duration: 1.6s;\n}\n\n.delay--16 {\n animation-duration: 1.68s;\n}\n\n.delay--17 {\n animation-duration: 1.76s;\n}\n\n.delay--18 {\n animation-duration: 1.84s;\n}\n\n.delay--19 {\n animation-duration: 1.92s;\n}\n\n.delay--20 {\n animation-duration: 2s;\n}\n\n.delay--21 {\n animation-duration: 2.08s;\n}\n\n.delay--22 {\n animation-duration: 2.16s;\n}\n\n.delay--23 {\n animation-duration: 2.24s;\n}\n\n.delay--24 {\n animation-duration: 2.32s;\n}\n\n.delay--25 {\n animation-duration: 2.4s;\n}\n\n.delay--26 {\n animation-duration: 2.48s;\n}\n\n.delay--27 {\n animation-duration: 2.56s;\n}\n\n.delay--28 {\n animation-duration: 2.64s;\n}\n\n.delay--29 {\n animation-duration: 2.72s;\n}\n\n.delay--30 {\n animation-duration: 2.8s;\n}\n\n.delay--31 {\n animation-duration: 2.88s;\n}\n\n.delay--32 {\n animation-duration: 2.96s;\n}\n\n.delay--33 {\n animation-duration: 3.04s;\n}\n\n.delay--34 {\n animation-duration: 3.12s;\n}\n\n.delay--35 {\n animation-duration: 3.2s;\n}\n\n.delay--36 {\n animation-duration: 3.28s;\n}\n\n.delay--37 {\n animation-duration: 3.36s;\n}\n\n.delay--38 {\n animation-duration: 3.44s;\n}\n\n.delay--39 {\n animation-duration: 3.52s;\n}\n\n.delay--40 {\n animation-duration: 3.6s;\n}\n\n.delay--41 {\n animation-duration: 3.68s;\n}\n\n.delay--42 {\n animation-duration: 3.76s;\n}\n\n.delay--43 {\n animation-duration: 3.84s;\n}\n\n.delay--44 {\n animation-duration: 3.92s;\n}\n\n.delay--45 {\n animation-duration: 4s;\n}\n\n.delay--46 {\n animation-duration: 4.08s;\n}\n\n.delay--47 {\n animation-duration: 4.16s;\n}\n\n.delay--48 {\n animation-duration: 4.24s;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\nbutton span {\n font-size: 1rem;\n font-weight: 700;\n}\nbutton.btnPrimary {\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017;\n border: 1px solid;\n border-color: transparent;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n}\nbutton.btnPrimary span:first-child {\n color: #121212;\n}\nbutton.btnPrimary:hover, button.btnPrimary:focus, button.btnPrimary.active, button.btnPrimary:disabled {\n background-color: #b89318;\n}\nbutton.btnPrimary:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btnSecondary {\n background: transparent;\n border: 1px solid;\n border-color: #e0e0e0;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n}\nbutton.btnSecondary span:first-child {\n color: #e0e0e0;\n}\nbutton.btnSecondary:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btnText {\n text-decoration: underline;\n}\nbutton.btnText span {\n text-transform: none;\n font-weight: 400;\n}\nbutton.btnPrimaryNegative {\n background: linear-gradient(180deg, #61f0f2 0%, #48c2c4 100%);\n border: 1px solid;\n border-color: transparent;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n}\nbutton.btnPrimaryNegative span:first-child {\n color: #121212;\n}\nbutton.btnPrimaryNegative:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btnPrimaryNegative:hover {\n opacity: 0.7;\n}\nbutton.btnIncrement {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n border: 1px solid;\n border-color: transparent;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n min-width: 40px;\n width: 40px;\n height: 40px;\n border-radius: 4px;\n box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.55);\n}\nbutton.btnIncrement span:first-child {\n color: #ffffff;\n}\nbutton.btnIncrement:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ninput.inputText,\ninput.inputNumber {\n box-sizing: border-box;\n border: 1px solid #7b7b7b;\n background: transparent;\n transition: all 300ms ease;\n color: #e0e0e0;\n}\ninput.inputText:focus, input.inputText:focus-visible,\ninput.inputNumber:focus,\ninput.inputNumber:focus-visible {\n border-color: #e3b82a;\n outline: none;\n}\n\ninput.inputText {\n appearance: none;\n border-radius: 4px;\n height: 45px;\n width: 100%;\n max-width: 280px;\n padding: 0 0.5rem;\n}\n\ninput.inputNumber {\n border-radius: 2px;\n height: 40px;\n width: 60px;\n max-width: 5rem;\n text-align: center;\n}\n\ninput.inputCheckbox {\n width: 24px;\n min-width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n border-radius: 4px;\n cursor: pointer;\n appearance: none;\n background: #121212;\n position: relative;\n border: solid 1px #7b7b7b;\n}\ninput.inputCheckbox:checked {\n background: #e3b82a;\n border-color: #e3b82a;\n}\ninput.inputCheckbox:checked:before, input.inputCheckbox:checked:after {\n content: \"\";\n position: absolute;\n display: inline-block;\n background: #121212;\n border-radius: 0.5rem;\n}\ninput.inputCheckbox:checked:before {\n width: 3px;\n height: 12px;\n left: 10px;\n top: 4px;\n transform: rotate(41deg);\n}\ninput.inputCheckbox:checked:after {\n width: 3px;\n height: 6px;\n left: 5px;\n top: 8px;\n transform: rotate(133deg);\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.card {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n box-sizing: border-box;\n box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);\n border-radius: 4px;\n padding: 16px;\n}\n.card:hover {\n background: linear-gradient(180deg, rgba(70, 71, 77, 0.7) 0%, rgba(57, 58, 63, 0.7) 100%);\n}\n.card.rich-card {\n padding: 16px;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ndiv.modal-root .MuiBackdrop-root {\n background-color: hsla(231deg, 11%, 12%, 0.85);\n}\n\ndiv.modal-paper {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n width: 36rem;\n max-width: 100%;\n max-height: 90vh;\n padding: 2rem;\n box-sizing: border-box;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n margin: 0 0 0 13.75rem;\n align-items: center;\n color: #ffffff;\n}\n@media only screen and (max-width : 1023px) {\n div.modal-paper {\n width: 35rem;\n margin: 0;\n }\n}\n@media only screen and (max-width : 768px) {\n div.modal-paper {\n padding: 1rem 1rem 1.5rem;\n width: 85%;\n max-width: 35rem;\n margin: 0;\n }\n}\ndiv.modal-paper.no-padding {\n padding: 0;\n}\ndiv.modal-paper.blue-border {\n border: 1px solid rgba(88, 255, 255, 0.2509803922);\n}\ndiv.modal-paper.blue-light-border {\n border: 1px solid #61f0f2;\n}\ndiv.modal-paper.yellow-border {\n border: 1px solid rgba(227, 184, 42, 0.4);\n}\ndiv.modal-paper .modal-paper-close-button {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n padding: 5px 5px;\n z-index: 10;\n}\n\ndiv.modal-paper-full-screen {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n width: 100%;\n max-width: 100%;\n height: 100%;\n max-height: 100%;\n padding: 0;\n margin: 0;\n box-sizing: border-box;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n color: #ffffff;\n display: flex;\n align-items: center;\n}\ndiv.modal-paper-full-screen.dark-background {\n background: #121212;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ndiv.expansion-panel-root {\n margin: 1.2rem 0;\n color: #e0e0e0;\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n border-radius: 4px;\n box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);\n transition: background-color 0.6s ease;\n box-sizing: border-box;\n}\ndiv.expansion-panel-root.Mui-expanded:first-child {\n margin: 1.2rem 0;\n}\ndiv.expansion-panel-root.Mui-expanded:last-child {\n margin: 1.2rem 0;\n}\ndiv.expansion-panel-root.red-border {\n border: 1px solid #d25959;\n}\n\ndiv.expansion-panel-summary {\n padding: 0.25rem 1.2rem;\n min-height: 4rem;\n}\ndiv.expansion-panel-summary.Mui-focused {\n border-radius: 4px;\n background-color: unset;\n box-shadow: 0 0 0 1px #e0e0e0;\n}\ndiv.expansion-panel-summary.Mui-expanded {\n min-height: 4rem;\n}\ndiv.expansion-panel-summary.Mui-expanded.small {\n min-height: 3rem;\n}\ndiv.expansion-panel-summary.small {\n padding: 0 1.2rem;\n min-height: 3rem;\n}\ndiv.expansion-panel-summary.bold-text {\n font-weight: bold;\n}\n\ndiv.expansion-panel-content {\n display: flex;\n align-items: center;\n}\ndiv.expansion-panel-content.Mui-expanded {\n margin: 0.75rem 0;\n}\n\ndiv.expansion-panel-details {\n padding: 0 1.2rem 1.2rem;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\na {\n color: #deaf0e;\n}\na:visited {\n color: #deaf0e;\n}\n\na:focus {\n outline: none;\n box-shadow: inset 0 0 0 1px #e0e0e0;\n}\na:focus > div:first-child {\n box-shadow: 0 0 0 1px #e0e0e0;\n}\n\na.MuiLink-underlineHover:hover {\n text-decoration: none;\n}\n\na.MuiTypography-colorPrimary {\n color: #e0e0e0;\n}\n\n:root {\n white-space: pre-line;\n --blue: #58ffff;\n --blue40: rgba(88, 255, 255, 0.2509803922);\n --blueBackground: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n --blueRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n --blueRadialGradientTrans: radial-gradient(circle, #58ffff 0%, rgba(255, 255, 255, 0) 100%);\n --elecColor: #d87b39;\n --elecColor40: rgba(216, 123, 57, 0.4);\n --elecCompareColor: #e2bca1;\n --gasColor: #45d1b8;\n --gasColor40: rgba(69, 209, 184, 0.4);\n --gasCompareColor: #a8f7e9;\n --waterColor: #3a98ec;\n --waterColor40: rgba(58, 152, 236, 0.4);\n --waterCompareColor: #abd4fa;\n --multiColor: #e3b82a;\n --multiCompareColor: #ffd597;\n --redPrimary: #d25959;\n --greyBright: #e0e0e0;\n --greyDark: #7b7b7b;\n --textWhite: #ffffff;\n --softGrey: #a0a0a0;\n --darkLight: #25262b;\n --darkLight2: #121212;\n --textFont: Lato, sans-serif;\n --greyLinearGradientBackground: linear-gradient(180deg, #323339 0%, #25262b 100%);\n --multiColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%);\n --elecColorRadialGradientTrans: radial-gradient(circle, #d87b39 0%, rgba(255, 255, 255, 0) 100%);\n --waterColorRadialGradientTrans: radial-gradient(circle, #3a98ec 0%, rgba(255, 255, 255, 0) 100%);\n --gasColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%);\n --multiColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017;\n --elecColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(158, 67, 2, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #d87b39;\n --gasColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(4, 106, 88, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #45d1b8;\n --waterColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(2, 93, 174, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #3a98ec;\n}\n\n.application {\n overflow-x: hidden;\n background-color: #121212;\n}\n\n.accordion-icon {\n color: #ffffff;\n}\n\n.loaderContainer {\n height: 80vh;\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n}\n\n.makeStyles-fab-1 {\n top: 12px;\n left: 3rem !important;\n width: 36px !important;\n height: 36px !important;\n background-color: #323339 !important;\n}\n\ninput:-webkit-autofill,\ninput:-webkit-autofill:hover,\ninput:-webkit-autofill:focus,\ninput:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px #1b1c22 inset !important;\n}", ""]); @@ -4877,6 +4920,7 @@ var _luxon = __webpack_require__("1EDv"); var _logger = _interopRequireDefault(__webpack_require__("DPwE")); var _utils = __webpack_require__("RgLR"); var _converter = _interopRequireDefault(__webpack_require__("U1XD")); +var _fluidsPrices = _interopRequireDefault(__webpack_require__("mY6q")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } var logStack = _cozyLogger.default.namespace('profileTypeService'); @@ -5250,33 +5294,46 @@ var ProfileTypeService = /*#__PURE__*/function () { } return getDetailsMonthlyForecast; }() + /** + * Get fluid forecast with adjusted price + */ }, { key: "getFluidForecast", value: function () { var _getFluidForecast = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(fluidType, year, month) { - var detailsMonthlyForecast, fluidLoad, converterService, fluidValue, fluidForecast; + var converterService, fluidsPricesService, detailsMonthlyForecast, fluidLoad, date, priceData, priceForecast, fluidPrice, fluidForecast; return _regenerator.default.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: - _context5.next = 2; + converterService = new _converter.default(); + fluidsPricesService = new _fluidsPrices.default(this._client); + _context5.next = 4; return this.getDetailsMonthlyForecast(fluidType, year, month); - case 2: + case 4: detailsMonthlyForecast = _context5.sent; fluidLoad = 0; Object.values(detailsMonthlyForecast).forEach(function (load) { if (load !== null) fluidLoad += load; }); - converterService = new _converter.default(); - fluidValue = parseFloat(converterService.LoadToEuro(fluidLoad, fluidType).toPrecision(5)); + date = _luxon.DateTime.fromObject({ + year: year, + month: month + }); + _context5.next = 10; + return fluidsPricesService.getPrices(fluidType, date); + case 10: + priceData = _context5.sent; + priceForecast = fluidLoad * priceData.price; + fluidPrice = parseFloat(converterService.LoadToEuro(fluidLoad, fluidType, priceForecast).toPrecision(5)); fluidForecast = { fluidType: fluidType, load: fluidLoad, - value: fluidValue, + value: fluidPrice, detailsMonthlyForecast: detailsMonthlyForecast }; return _context5.abrupt("return", fluidForecast); - case 9: + case 15: case "end": return _context5.stop(); } @@ -5476,27 +5533,31 @@ var DuelService = /*#__PURE__*/function () { }, { key: "isPeriodComplete", value: function () { - var _isPeriodComplete = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(period, fluidType, duration) { - var maxDiffperiod, maxDiffperiodMilli, isComplete, newPeriod, diffFromNow, consumptionService, dataLoad; + var _isPeriodComplete = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(period, fluidTypes, duration) { + var maxDiffPeriod, maxDiffPeriodMilli, isComplete, newPeriod, diffFromNow, consumptionService, dataLoad; return _regenerator.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: - maxDiffperiod = _luxon.Duration.fromObject({ + maxDiffPeriod = _luxon.Duration.fromObject({ months: 6 }); - maxDiffperiodMilli = maxDiffperiod.as('milliseconds'); + maxDiffPeriodMilli = maxDiffPeriod.as('milliseconds'); isComplete = true; newPeriod = { startDate: period.startDate.minus(duration), endDate: period.endDate.minus(duration) }; - diffFromNow = newPeriod.endDate.diffNow().toObject().milliseconds; - diffFromNow = diffFromNow ? Math.abs(diffFromNow) : 0; + diffFromNow = Math.abs(newPeriod.endDate.diffNow().toObject().milliseconds || 0); consumptionService = new _consumption.default(this._client); - _context2.next = 9; - return consumptionService.getGraphData(period, _enums.TimeStep.DAY, fluidType, undefined, undefined, true); - case 9: + _context2.next = 8; + return consumptionService.getGraphData({ + timePeriod: period, + timeStep: _enums.TimeStep.DAY, + fluidTypes: fluidTypes, + isHome: true + }); + case 8: dataLoad = _context2.sent; if (dataLoad !== null && dataLoad !== void 0 && dataLoad.actualData) { dataLoad.actualData.forEach(function (d) { @@ -5505,27 +5566,27 @@ var DuelService = /*#__PURE__*/function () { }).length > 0) isComplete = false; }); } - if (!(diffFromNow && !isComplete && diffFromNow > maxDiffperiodMilli)) { - _context2.next = 13; + if (!(diffFromNow && !isComplete && diffFromNow > maxDiffPeriodMilli)) { + _context2.next = 12; break; } return _context2.abrupt("return", false); - case 13: + case 12: if (!isComplete) { - _context2.next = 17; + _context2.next = 16; break; } _context2.t0 = period; - _context2.next = 20; - break; - case 17: _context2.next = 19; - return this.isPeriodComplete(newPeriod, fluidType, duration); - case 19: + break; + case 16: + _context2.next = 18; + return this.isPeriodComplete(newPeriod, fluidTypes, duration); + case 18: _context2.t0 = _context2.sent; - case 20: + case 19: return _context2.abrupt("return", _context2.t0); - case 21: + case 20: case "end": return _context2.stop(); } @@ -5544,7 +5605,7 @@ var DuelService = /*#__PURE__*/function () { key: "getAllDuelEntities", value: function () { var _getAllDuelEntities = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() { - var query, _yield$this$_client$q, dueles; + var query, _yield$this$_client$q, duels; return _regenerator.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { @@ -5554,8 +5615,8 @@ var DuelService = /*#__PURE__*/function () { return this._client.query(query); case 3: _yield$this$_client$q = _context3.sent; - dueles = _yield$this$_client$q.data; - return _context3.abrupt("return", dueles); + duels = _yield$this$_client$q.data; + return _context3.abrupt("return", duels); case 6: case "end": return _context3.stop(); @@ -6642,8 +6703,10 @@ if(false) {} var _interopRequireDefault = __webpack_require__("jm00"); +var _core = __webpack_require__("rMFn"); var Sentry = _interopRequireWildcard(__webpack_require__("5QCN")); var _tracing = __webpack_require__("zN4E"); +var _theme = __webpack_require__("tHDY"); var _cozyClient = _interopRequireWildcard(__webpack_require__("xEu0")); var _cozyDeviceHelper = __webpack_require__("Kv7L"); var _oauth = __webpack_require__("XjBu"); @@ -6758,9 +6821,11 @@ var init = function init() { }, /*#__PURE__*/_react2.default.createElement(_I18n.I18n, { lang: locale, polyglot: polyglot - }, /*#__PURE__*/_react2.default.createElement(_reactRouterDom.HashRouter, history, /*#__PURE__*/_react2.default.createElement(App, { + }, /*#__PURE__*/_react2.default.createElement(_reactRouterDom.HashRouter, history, /*#__PURE__*/_react2.default.createElement(_core.ThemeProvider, { + theme: _theme.theme + }, /*#__PURE__*/_react2.default.createElement(App, { tracker: tracker - }))))))); + })))))))); }; // initial rendering of the application @@ -9035,9 +9100,10 @@ var QuizQuestionContent = function QuizQuestionContent(_ref) { }, /*#__PURE__*/_react.default.createElement("div", { className: "question-container" }, /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { - className: "btn-back", icon: _close.default, - onClick: goBack + onClick: goBack, + "aria-label": t('quiz.accessibility.window_quit'), + className: "btn-back" }), /*#__PURE__*/_react.default.createElement("p", { className: "index-question" }, questionIndex + 1, "/5"), /*#__PURE__*/_react.default.createElement("p", { @@ -9971,6 +10037,32 @@ var insertInto; +var options = {"hmr":true} + +options.transform = transform +options.insertInto = undefined; + +var update = __webpack_require__("HkU0")(content, options); + +if(content.locals) module.exports = content.locals; + +if(false) {} + +/***/ }), + +/***/ "DqCF": +/***/ (function(module, exports, __webpack_require__) { + + +var content = __webpack_require__("JBZ6"); + +if(typeof content === 'string') content = [[module.i, content, '']]; + +var transform; +var insertInto; + + + var options = {"hmr":true} options.transform = transform @@ -10935,7 +11027,7 @@ var SplashRoot = function SplashRoot(_ref) { } function _loadData() { _loadData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7() { - var initializationService, customPopupService, partnersInfoService, ms, startTime, transaction, termsStatus, profile, profileType, profileEcogesture, migrationsResult, _yield$Promise$all, _yield$Promise$all2, duelHash, quizHash, challengeHash, explorationHash, analysisResult, updatedProfile, fluidStatus, lastDataDate, _iterator, _step, fluid, userChallengeList, _filteredCurrentOngoi, _filteredCurrentOngoi2, _filteredCurrentOngoi3, _filteredCurrentDuelC, filteredCurrentOngoingChallenge, actionService, updatedUserChallenge, filteredCurrentDuelChallenge, _yield$initialization, _updatedUserChallenge, dataloads, challengeService, _yield$challengeServi, isDone; + var initializationService, customPopupService, partnersInfoService, ms, startTime, transaction, _yield$Promise$all, _yield$Promise$all2, termsStatus, profile, profileType, profileEcogesture, fluidStatus, migrationsResult, _yield$Promise$all3, _yield$Promise$all4, duelHash, quizHash, challengeHash, explorationHash, analysisResult, updatedProfile, lastDataDate, _iterator, _step, fluid, userChallengeList, _filteredCurrentOngoi, _filteredCurrentOngoi2, _filteredCurrentOngoi3, _filteredCurrentDuelC, filteredCurrentOngoingChallenge, actionService, updatedUserChallenge, filteredCurrentDuelChallenge, _yield$initialization, _updatedUserChallenge, dataloads, challengeService, _yield$challengeServi, isDone; return _regenerator.default.wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { @@ -10949,31 +11041,22 @@ var SplashRoot = function SplashRoot(_ref) { name: 'Initialize app' }); _context7.prev = 6; - _context7.next = 9; - return initializationService.initConsent(); - case 9: - termsStatus = _context7.sent; + console.group('Initialization logs'); + // Run init steps in parallel + _context7.next = 10; + return Promise.all([initializationService.initConsent(), initializationService.initFluidPrices(), initializationService.initProfile(), initializationService.initProfileType(), initializationService.initProfileEcogesture(), initializationService.initFluidStatus()]); + case 10: + _yield$Promise$all = _context7.sent; + _yield$Promise$all2 = (0, _slicedToArray2.default)(_yield$Promise$all, 6); + termsStatus = _yield$Promise$all2[0]; + profile = _yield$Promise$all2[2]; + profileType = _yield$Promise$all2[3]; + profileEcogesture = _yield$Promise$all2[4]; + fluidStatus = _yield$Promise$all2[5]; if (subscribed) dispatch((0, _global.updateTermsStatus)(termsStatus)); - - // Init fluidPrices - _context7.next = 13; - return initializationService.initFluidPrices(); - case 13: - _context7.next = 15; - return initializationService.initProfile(); - case 15: - profile = _context7.sent; - _context7.next = 18; - return initializationService.initProfileType(); - case 18: - profileType = _context7.sent; - _context7.next = 21; - return initializationService.initProfileEcogesture(); - case 21: - profileEcogesture = _context7.sent; - _context7.next = 24; + _context7.next = 20; return ms.runMigrations(_migration.migrations); - case 24: + case 20: migrationsResult = _context7.sent; // Init last release notes when they exist dispatch((0, _global.showReleaseNotes)({ @@ -10982,20 +11065,20 @@ var SplashRoot = function SplashRoot(_ref) { show: migrationsResult.show })); if (!(subscribed && profile)) { - _context7.next = 45; + _context7.next = 41; break; } setValidExploration(_enums.UserExplorationID.EXPLORATION007); - _context7.next = 30; + _context7.next = 26; return Promise.all([initializationService.initDuelEntity(profile.duelHash), initializationService.initQuizEntity(profile.quizHash), initializationService.initExplorationEntity(profile.challengeHash), initializationService.initChallengeEntity(profile.explorationHash), initializationService.initAnalysis(profile)]); - case 30: - _yield$Promise$all = _context7.sent; - _yield$Promise$all2 = (0, _slicedToArray2.default)(_yield$Promise$all, 5); - duelHash = _yield$Promise$all2[0]; - quizHash = _yield$Promise$all2[1]; - challengeHash = _yield$Promise$all2[2]; - explorationHash = _yield$Promise$all2[3]; - analysisResult = _yield$Promise$all2[4]; + case 26: + _yield$Promise$all3 = _context7.sent; + _yield$Promise$all4 = (0, _slicedToArray2.default)(_yield$Promise$all3, 5); + duelHash = _yield$Promise$all4[0]; + quizHash = _yield$Promise$all4[1]; + challengeHash = _yield$Promise$all4[2]; + explorationHash = _yield$Promise$all4[3]; + analysisResult = _yield$Promise$all4[4]; updatedProfile = { duelHash: duelHash, quizHash: quizHash, @@ -11007,21 +11090,18 @@ var SplashRoot = function SplashRoot(_ref) { dispatch((0, _profile.updateProfile)(updatedProfile)); dispatch((0, _analysis.setAnalysisMonth)(analysisResult.monthlyAnalysisDate)); if (!profileType) { - _context7.next = 43; + _context7.next = 39; break; } - _context7.next = 43; + _context7.next = 39; return loadProfileType(profileType); - case 43: + case 39: if (profileEcogesture) { dispatch((0, _profileEcogesture.setProfileEcogesture)(profileEcogesture)); } dispatch((0, _global.toggleAnalysisNotification)(!profile.haveSeenLastAnalysis)); - case 45: - _context7.next = 47; - return initializationService.initFluidStatus(); - case 47: - fluidStatus = _context7.sent; + case 41: + // Process fluids status if (subscribed) { dispatch((0, _global.setFluidStatus)(fluidStatus)); lastDataDate = _luxon.DateTime.fromISO('0001-01-01'); @@ -11040,12 +11120,12 @@ var SplashRoot = function SplashRoot(_ref) { } } // Init Challenge - _context7.next = 51; + _context7.next = 44; return initializationService.initUserChallenges(fluidStatus); - case 51: + case 44: userChallengeList = _context7.sent; if (!subscribed) { - _context7.next = 78; + _context7.next = 71; break; } dispatch((0, _challenge2.setUserChallengeList)(userChallengeList)); @@ -11057,18 +11137,18 @@ var SplashRoot = function SplashRoot(_ref) { } // Set action to notification if action is accomplished if (!(((_filteredCurrentOngoi2 = filteredCurrentOngoingChallenge[0]) === null || _filteredCurrentOngoi2 === void 0 ? void 0 : _filteredCurrentOngoi2.action.state) === _enums.UserActionState.ONGOING)) { - _context7.next = 62; + _context7.next = 55; break; } actionService = new _action.default(client); - _context7.next = 60; + _context7.next = 53; return actionService.isActionDone(filteredCurrentOngoingChallenge[0]); - case 60: + case 53: updatedUserChallenge = _context7.sent; if (updatedUserChallenge) { dispatch((0, _challenge2.updateUserChallengeList)(updatedUserChallenge)); } - case 62: + case 55: // Set Notification if action state is notification if (((_filteredCurrentOngoi3 = filteredCurrentOngoingChallenge[0]) === null || _filteredCurrentOngoi3 === void 0 ? void 0 : _filteredCurrentOngoi3.action.state) === _enums.UserActionState.NOTIFICATION) { dispatch((0, _global.toggleChallengeActionNotification)(true)); @@ -11077,17 +11157,17 @@ var SplashRoot = function SplashRoot(_ref) { return challenge.state === _enums.UserChallengeState.DUEL; }); if (!(((_filteredCurrentDuelC = filteredCurrentDuelChallenge[0]) === null || _filteredCurrentDuelC === void 0 ? void 0 : _filteredCurrentDuelC.duel.state) === _enums.UserDuelState.ONGOING)) { - _context7.next = 78; + _context7.next = 71; break; } - _context7.next = 67; + _context7.next = 60; return initializationService.initDuelProgress(filteredCurrentDuelChallenge[0]); - case 67: + case 60: _yield$initialization = _context7.sent; _updatedUserChallenge = _yield$initialization.updatedUserChallenge; dataloads = _yield$initialization.dataloads; if (!subscribed) { - _context7.next = 78; + _context7.next = 71; break; } dispatch((0, _challenge2.setChallengeConsumption)({ @@ -11096,13 +11176,13 @@ var SplashRoot = function SplashRoot(_ref) { })); // Check is duel is done and display notification challengeService = new _challenge.default(client); - _context7.next = 75; + _context7.next = 68; return challengeService.isChallengeDone(_updatedUserChallenge, dataloads); - case 75: + case 68: _yield$challengeServi = _context7.sent; isDone = _yield$challengeServi.isDone; dispatch((0, _global.toggleChallengeDuelNotification)(isDone)); - case 78: + case 71: /** * Load custom popup and partners info synchronously so these treatments don't block the loading */ @@ -11163,26 +11243,27 @@ var SplashRoot = function SplashRoot(_ref) { }); }); } - _context7.next = 88; + _context7.next = 81; break; - case 83: - _context7.prev = 83; + case 76: + _context7.prev = 76; _context7.t0 = _context7["catch"](6); if (_context7.t0.message === 'Failed to fetch' && !initStepErrors) { setInitStepErrors(_models.InitStepsErrors.UNKNOWN_ERROR); } _logger.default.error("[Initialization] Error : ".concat(_context7.t0)); Sentry.captureException(_context7.t0); - case 88: - _context7.prev = 88; + case 81: + _context7.prev = 81; + console.groupEnd(); transaction.finish(); - return _context7.finish(88); - case 91: + return _context7.finish(81); + case 85: case "end": return _context7.stop(); } } - }, _callee7, null, [[6, 83, 88, 91]]); + }, _callee7, null, [[6, 76, 81, 85]]); })); return _loadData.apply(this, arguments); } @@ -11221,14 +11302,13 @@ exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); var _Button = _interopRequireDefault(__webpack_require__("49+2")); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); -var _IconButton = _interopRequireDefault(__webpack_require__("x0Kp")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _ecolyo = _interopRequireDefault(__webpack_require__("1yW6")); var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _useExploration3 = _interopRequireDefault(__webpack_require__("CRx8")); var _cozyClient = __webpack_require__("xEu0"); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _enums = __webpack_require__("j0hM"); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); var _hooks = __webpack_require__("6FOS"); @@ -11265,14 +11345,12 @@ var FeedbackModal = function FeedbackModal() { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, t('feedback.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_IconButton.default, { - "aria-label": t('feedback.accessibility.button_close'), - className: "modal-paper-close-button", - onClick: closeModal - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('feedback.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { + onClick: closeModal, + "aria-label": t('feedback.accessibility.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "fb-root" }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _ecolyo.default, @@ -11366,7 +11444,7 @@ exports.ECOGESTURE_DOCTYPE = ECOGESTURE_DOCTYPE; /***/ "Hsuv": /***/ (function(module) { -module.exports = JSON.parse("{\"common\":{\"title_app\":\"Ecolyo\",\"title_consumption\":\"Conso\",\"title_challenge\":\"Défis\",\"title_quiz\":\"Quiz\",\"title_exploration\":\"Exploration\",\"title_action\":\"Action\",\"title_duel\":\"Duel final\",\"title_ecogesture\":\"Astuce\",\"title_ecogestures\":\"Astuces\",\"title_ecogestures_choice\":\"Sélection des astuces\",\"title_options\":\"Options\",\"title_analysis\":\"Analyse\",\"title_profiletype\":\"Ajuster mon profil\",\"title_legal_notice\":\"Mentions légales\",\"title_gcu\":\"Conditions générales d’utilisation\",\"title_accessibility\":\"Accessibilité : non conforme\",\"title_sge_connect\":\"Connexion à l'électricité\",\"title_gas_connect\":\"Connexion au gaz\",\"accessibility\":{\"loading\":\"Chargement\"},\"funders_logo\":\"Logo des financeurs : Métropole de Lyon, Etat via la Banque des Territoires et son programme France 2030, Union Européenne\"},\"navigation\":{\"consumption\":\"Conso\",\"challenges\":\"Défis\",\"ecogestures\":\"Astuces\",\"options\":\"Options\",\"analysis\":\"Analyse\"},\"FLUID\":{\"ELECTRICITY\":{\"NAME\":\"Électricité\",\"LABEL\":\"Électricité\",\"LABEL_PREPOSITION\":\"d'électricité\",\"UNIT\":\"kWh\",\"ADD\":\"Ajouter l'électricité\",\"MEGAUNIT\":\"MWh\",\"provider\":\"Enedis\"},\"WATER\":{\"NAME\":\"Eau\",\"LABEL\":\"Eau\",\"LABEL_PREPOSITION\":\"d'eau\",\"ADD\":\"Ajouter l'eau\",\"UNIT\":\"L\",\"MEGAUNIT\":\"m³\",\"provider\":\"Eau Publique du Grand Lyon\"},\"GAS\":{\"NAME\":\"Gaz\",\"LABEL\":\"Gaz\",\"LABEL_PREPOSITION\":\"de gaz\",\"ADD\":\"Ajouter le gaz\",\"UNIT\":\"kWh\",\"MEGAUNIT\":\"MWh\",\"provider\":\"GRDF\"},\"MULTIFLUID\":{\"NAME\":\"Multi fluide\",\"LABEL\":\"Multi\",\"UNIT\":\"€\"}},\"action\":{\"duration\":\"Durée : %{smartCount} jours\",\"result\":\"Résultat\",\"finished\":\"Défi terminé !\",\"details\":\"Détail de l'astuce\",\"apply\":\"J'applique cette action\",\"other\":\"Je choisis une autre action\",\"resultText1\":\"Cela n'a pas été trop difficile ?\",\"resultText2\":\"Jetez un coup d'œil dans la page conso dans 1 à 3 jours, le temps que vos données arrivent, pour voir l'impact de votre action.\",\"resultText3\":\"Pas de baisse de significative ? Pas de panique, en maintenant cette pratique dans le temps, les économies d'énergies et d'eau seront davantage visibles.\",\"resultText4\":\"Dans tous les cas, bravo, vous remportez...\",\"ok\":\"Ok\"},\"action_modal\":{\"accept\":\"Je relève le défi\",\"refuse\":\"Je me défile\",\"accessibility\":{\"window_title\":\"Fenêtre de confirmation\",\"button_accept\":\"Accepter\",\"button_refuse\":\"Refuser\"}},\"analysis\":{\"viewTitle\":\"Analyse\",\"warning_title\":\"Analyse incomplète\",\"warning_text\":\"Ecolyo n'a pas encore reçu toutes les données %{fluidList} pour ce mois\",\"comparison\":\"Comparatif\",\"analysis_date\":\"Conso totale\",\"challenge\":\"Défis terminés en\",\"user_consumption\":\"Votre conso\",\"average_home\":\"Conso moyenne d'un profil similaire\",\"average_home_description\":\"Le comparatif ici présenté est calculé sur la base d'un profil similaire au vôtre. Il s'agit d'un calcul et non d'une comparaison avec les autres utilisateurs de l'application. Sont pris en compte l'ensemble des informations entrées dans votre profil : mode de chauffage, âge du logement et éventuels travaux de rénovation, etc. Ce modèle a été créé avec l'Agence Locale de l'Energie sur la base de chiffres issues du Schéma Directeur des Energies de la Métropole de Lyon et de Chiffres-clé publiés par l'ADEME (l'Agence de l'Environnement et de la Maîtrise de l'Energie).\",\"approximative_description\":\"Pour comparer votre consommation avec un foyer similaire ou avec une conso idéale, veuillez détailler votre profil\",\"no_data\":\"Pas de données\",\"accessibility\":{\"button_go_to_profil\":\"Détailler mon profil\"},\"max_day\":\"Jour où vous avez le plus consommé\",\"compare\":{\"title\":\"Comparateur\",\"month_tab\":\"Comparer au mois dernier\",\"year_tab\":\"Comparer à l'année dernière\"},\"temperature_comparison\":{\"unit\":\"°C\",\"comparison\":\"par rapport à\",\"info_button\":\"Information sur l'indice météo\",\"modal\":{\"title\":\"Indice météo\",\"month_comparison\":\"Écart de température moyenne entre le mois observé et le mois précédent.\",\"year_comparison\":\"Écart de température moyenne entre le mois observé et le même mois de l'année précédente.\",\"data_info\":\"Données Météo France issues de la station météo Lyon Bron.\",\"close\":\"Fermer la fenêtre\"}}},\"analysis_error_modal\":{\"title\":\"Aucune analyse\",\"message\":\"Pour profiter d’une analyse de vos consommations, connectez au moins un de vos compteurs.\",\"go_to_conso\":\"Je connecte mes compteurs\",\"understood\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_understood\":\"J'ai compris\",\"button_goto_konnector\":\"Aller aux connecteurs\"}},\"analysis_pie\":{\"total\":\"Conso totale\",\"month\":\"Au mois \",\"estimation\":\"Comment sont estimés<br>les prix ?\"},\"special_elec\":{\"title\":\"Spécial Électricité\",\"average\":\"Conso moyenne\",\"weektype\":\"un jour de \",\"week\":\"semaine\",\"weekend\":\"week-end\",\"min\":\"Conso minimum\",\"percentage\":\"Part dans la facture\",\"price\":\"Soit\",\"maxPower\":\"Puissance maximum atteinte\",\"offPeakHour\":\"Consommation en heures creuses\",\"showModal\":\"Plus d'infos\"},\"elec_info_modal\":{\"accessibility\":{\"window_title\":\"electricity-info-modal\",\"button_close\":\"close-modal\"},\"maxPowerTitle\":\"Qu’est-ce que la puissance maximum ?\",\"maxPowerDetails-1\":\"C’est la puissance maximum délivrée par tous les appareils fonctionnant au même moment dans votre logement.\",\"maxPowerDetails-2\":\"Vous avez choisi une puissance maximum dans votre offre d’électricité (3, 6 ou 9 kVA...) que vous ne devez pas dépasser pour ne pas faire sauter votre compteur. \",\"maxPowerDetails-3\":\"Cette puissance varie d'un mois à l'autre, regardez cette valeur sur l'ensemble de l'année pour vérifier si votre puissance souscrite correspond bien à votre usage.\",\"offPeakTitle\":\"Sur quelle base est calculé mon ratio Heures Pleines / Heures Creuses ?\",\"offPeakDetails-1\":\"D'après Enedis, vos plages d'heures creuses sont les suivantes : %{offPeakHours}. Nous avons donc simplement calculé, à l'aide vos consommations à la demi-heure, quelle part de votre consommation est réalisée sur vos heures creuses.\",\"minPowerTitle\":\"Qu’est-ce que la consommation minimum ?\",\"minPowerDetails-1\":\"Elle correspond à votre plus petite consommation du mois sur un créneau d'une demi-heure.\",\"minPowerDetails-2\":\"Nous extrapolons cette consommation sur 1 mois afin vous donner un aperçu de la consommation de vos consommations électriques en veille (box, télé, chargeurs, ...) ou encore de celle, incompressible, de vos appareils de froid (frigo, congélateur).\"},\"auth\":{\"enedissgegrandlyon\":{\"title\":\"Ecolyo doit se connecter à l’électricité\",\"bill\":\"Munissez-vous d’une <span>facture d’électricité</span> pour valider la connexion\",\"connect\":\"Je me connecte à l'électricité\",\"accessibility\":{\"connect\":\"Se connecter\"},\"identityTitle\":\"Nom inscrit sur la facture\",\"firstName\":\"Prénom\",\"lastName\":\"Nom\",\"pdlTitle\":\"Numéro de votre compteur électrique (PDL)\",\"pdlLabel\":\"N° (14 chiffres)\",\"pdlModal\":{\"title\":\"Qu'est-ce qu'un PDL ?\",\"title_accessibility\":\"Modale qu'est ce qu'un PDL ?\",\"txt1\":\"Votre numéro de point de livraison (PDL) peut aussi s’appeler PRM si vous possédez un compteur Linky.\",\"txt2\":\"Ce numéro est composé de 14 chiffres.\",\"txt3\":\"Votre numéro de PDL ou PRM se trouve sur votre facture d’électricité.\",\"txt4\":\"Si vous avez un compteur Linky, appuyez sur le bouton “+” et faites défiler l’affichage jusqu’à obtenir l’affichage suivant :\",\"button\":\"J'ai compris\",\"button_accessibility\":\"Bouton valider\",\"prm_accessibility\":\"Écran d'un compteur Linky présentant le numéro PRM\"},\"addressTitle\":\"Adresse du titulaire\",\"address\":\"Numéro et voie\",\"zipCode\":\"Code postal\",\"city\":\"Ville\",\"headConsent\":\"En acceptant de partager vos données, celles-ci seront directement transférées à Ecolyo à l’intérieur de votre cloud personnel, sans que la Métropole n’y accède ni ne les visualise.\",\"textConsent\":\"Afin de vous offrir des fonctionnalités de visualisation et d'analyse, Ecolyo a besoin des données suivantes : \",\"consentLi1\":\"L'historique et le relevé de vos consommations quotidiennes en kWh\",\"consentLi2\":\"L'historique et le relevé de vos consommations au pas de temps 30 minutes\",\"consentLi3\":\"Les puissances maximales atteintes quotidiennement\",\"consentLi4\":\"Les données contractuelles (début de contrat et puissance souscrite)\",\"consentCheck1\":\"Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un an</span>\",\"consentCheck2\":\"J’atteste être le titulaire du point de livraison (PDL) renseigné à l’étape précédente\"},\"grdfgrandlyon\":{\"title\":\"Ecolyo doit se connecter au gaz\",\"bill\":\"Munissez-vous d’une <span>facture de gaz</span> pour valider la connexion\",\"connect\":\"Je me connecte au gaz\",\"accessibility\":{\"connect\":\"Se connecter\"},\"identityTitle\":\"Nom inscrit sur la facture\",\"firstName\":\"Prénom\",\"lastName\":\"Nom\",\"email\":\"Email\",\"zipCode\":\"Code postal\",\"pceTitle\":\"Numéro de votre compteur de gaz (PCE)\",\"pceLabel\":\"N° (14 chiffres)\",\"pceHint\":\"Où trouver le numéro de PCE ?\",\"pceModal\":{\"title\":\"Où trouver le n° de PCE ?\",\"txt1\":\"Votre numéro de <span>PCE</span> - ou <span>Point de comptage et d'estimation</span> - se trouve sur votre facture au niveau de vos informations contractuelles (parfois en 1ère page... parfois en dernière !)<br/><br/> C'est un identifiant à 14 chiffres.\",\"button\":\"J'ai compris\",\"accessibility\":\"Titre de la modale\",\"button-accessibility\":\"Bouton valider\"},\"headConsent\":\"Vous allez partager vos données à la Métropole de Lyon. Elles seront directement transférées à Ecolyo à l'intérieur de votre cloud personnel, sans que la Métropole n'y accède ni ne les visualise.\",\"textConsent\":\"Afin de vous offrir des fonctionnalités de visualisation et d'analyse, Ecolyo a besoin des données suivantes :\",\"consentLi1\":\"L'historique de vos consommations (jusqu’à 36 mois) et le relevé quotidien de vos consommations\",\"consentLi2\":\"Les données contractuelles (type de compteur, date de début de contrat)\",\"consentCheck1\":\"Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un an</span>\",\"consentCheck2\":\"J’atteste être le titulaire du point de livraison (PCE) renseigné à l’étape précédente\",\"waiting\":{\"mailSent\":\"Un mail vous a été envoyé...\",\"mailDelay\":\"La réception du mail peut prendre 15min, l'envoi des mails se faisant tous les 1/4 d'heure\",\"validate\":\"Merci de valider l'autorisation d'accès à vos données\",\"comeback\":\"Une fois ce clic effectué, revenez ici pour accéder à vos données\",\"button_done\":\"C’est fait !\"}},\"eglgrandlyon\":{\"bill\":\"Munissez-vous d’une <span>facture d'eau</span> pour valider la connexion\",\"connect\":\"Je me connecte à l'eau\",\"accessibility\":{\"connect\":\"Se connecter\"},\"connect_form\":{\"login\":\"Identifiant (7 chiffres)\",\"password\":\"Mot de passe\",\"label\":\"Je connecte Ecolyo à mon compte Eau Publique du Grand Lyon\"},\"no_account\":{\"title\":\"Ecolyo doit se connecter à l'eau\"},\"with_account\":{\"title\":\"Votre compte Eau Publique du Grand Lyon a bien été créé ?\",\"subtitle1\":\"Plus qu’à donner votre accord pour connecter votre compteur d'eau et Ecolyo !\"},\"step1\":{\"info1\":\"La connexion se fait via <span>votre compte Eau Publique du Grand Lyon</span>.\",\"info2\":\"Possédez-vous un <span>compte Eau Publique du Grand Lyon</span> ?\"},\"step2\":{\"info1\":\"Une fois votre compte créé, <span>n'oubliez pas de revenir sur Ecolyo</span> pour finaliser la connexion.\"},\"button_go_to_partner_site\":\"Aller sur EPGL\"},\"connect_oauth\":{\"loading\":\"Chargement...\"},\"accessibility\":{\"button_reveal_password\":\"Afficher le mot de passe\",\"button_connect\":\"Se connecter\",\"button_create_account\":\"Se créer un compte\",\"window_title\":\"Fenêtre d'information sur la création de compte.\",\"button_close\":\"Fermer la fenêtre.\"},\"button_previous\":\"Précédent\",\"button_connect\":\"Se connecter\",\"button_create_account\":\"Se créer un compte\",\"button_has_account\":\"J'ai déjà un compte\",\"button_validate\":\"J'ai compris\",\"button_showOfflineData\":\"Voir mes anciennes données\",\"warningOfflineData\":\"Attention, vous visualisez d’anciennes données. Pour actualiser vos données, connectez votre compteur\"},\"challenge\":{\"card\":{\"ongoing\":{\"quiz\":\"Quiz\",\"exploration\":\"Explorations\",\"action\":\"Actions\",\"duel\":\"Duel Final\",\"result\":\"Résultat\",\"duelDone\":\"du duel final\"},\"locked\":{\"desc\":\"À débloquer en terminant le défi précédent\"}},\"card_done\":{\"saving\":\"Économie de\",\"depense\":\"Dépense de\",\"win\":\"Gagné\",\"lost\":\"Perdu\",\"final_defi\":\"sur le duel final\",\"final_defi_view\":\"Revoir le duel final\",\"reset_defi\":\"Relancer le défi\"},\"card_last\":{\"title\":\"Tous les défis sont terminés\",\"message1\":\"Nous travaillons actuellement à vous proposer de nouveaux défis.\",\"button\":\"Suggérer une idée de défi\"},\"card_unlocked\":{\"button_launch\":\"Lancer le défi\"},\"accessibility\":{\"button_launch\":\"Lancer le défi\",\"button_goto_konnector\":\"Aller aux connecteurs\",\"button_slider_previous\":\"Précédent\",\"button_slider_next\":\"Suivant\"}},\"challenge_no_fluid_modal\":{\"title\":\"Oups !\",\"content\":\"Connectez au moins 1 fluide pour pouvoir jouer\",\"button_validate\":\"Ok\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_validate\":\"Valider\"}},\"consumption\":{\"display_last_data\":\"Voir mes dernières consos\",\"accessibility\":{\"button_previous_period\":\"Afficher la période précédente\",\"button_next_period\":\"Afficher la période suivante\",\"button_previous_value\":\"Sélectionner la valeur précédente\",\"button_next_value\":\"Sélectionner la valeur suivante\",\"checkbox_compare\":\"Afficher ou cacher la comparaison\"},\"partner_issue_modal\":{\"title\":\"Attention !\",\"accessibility_title\":\"Modale de maintenance partenaire\",\"error_connect_gaz\":\"La connexion à vos données de <span class='gaz'>gaz</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='gaz'>GRDF</span> ou dans notre service)\",\"error_connect_elec\":\"La connexion à vos données d'<span class='elec'>électricité</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='elec'>Enedis</span> ou dans notre service)\",\"error_connect_water\":\"La connexion à vos données d'<span class='water'>eau</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='water'>Eau Publique du Grand Lyon</span> ou dans notre service)\",\"additional_text\":\"La visualisation et/ou la connexion à vos données de consommation peut s'en trouver affectée.<br /><br /><i>Merci pour votre patience en attendant un retour à la normale :)</i>\",\"ok\":\"Ok\"},\"compared\":\"Comparé\"},\"consumption_details\":{\"detail\":\"Détail par fluide\",\"connect\":\"Connecter d'autres fluides\",\"mini_cards_label\":\"AUTRES ENERGIES\"},\"consumption_visualizer\":{\"missing_data\":\"Données manquantes\",\"no_data\":\"Pas de données\",\"why_no_data\":\"Pourquoi n'ai-je pas de données ?\",\"last_valid_data\":\"Dernières données valides : %{date}\",\"last_available_data\":\"Dernières données disponibles : %{date}\",\"last_valid_data_multi\":\"Dernières données complètes : %{date}\",\"data_to_come\":\"À venir\",\"aie\":\"Aïe !\",\"data_empty\":\"Vide\",\"estimated\":\"estimés\",\"dataModal\":{\"list_title\":\"3 raisons possibles :\",\"item1\":\"le lien entre Ecolyo et le fournisseur de données est rompu : une mise à jour de ce lien (en bas de la page) peut résoudre ce problème.\",\"item2\":\"un problème technique chez votre gestionnaire : se connecter directement chez ce gestionnaire pour vérifier que cette donnée apparaît.\",\"item3\":\"pour le gaz : vous n'avez pas autorisé Ecolyo à accéder aux données de consommation de cette période.\",\"item4\":\"vous n'aviez tout simplement pas de compteur communicant à l'époque !\"},\"modal\":{\"window_title\":\"info estimation des prix\",\"title\":\"Comment sont estimés les prix ?\",\"close\":\"Fermer la fenêtre\",\"part1\":\"Le prix de votre électricité ou de votre gaz dépend de l'offre choisie auprès de votre fournisseur. N’ayant pas accès à cette information, Ecolyo affiche un prix moyen par fluide. \",\"part2\":\"Tarifs moyens retenus :\",\"list1\":\" : 1 kWh = %{elecPrice} €TTC (il correspond au tarif réglementé d’EDF au %{elecPriceStartDate} pour une puissance souscrite de 3 ou 6 kVA et hors offre heure pleine/heure creuse)\",\"list2\":\" : 1 kWh = %{gasPrice} €TTC (Prix repère de vente de gaz publié par la Commission de Régulation de l'Energie au %{gasPriceStartDate} pour un consommateur \\\"Cuisson/Eau Chaude\\\")\",\"list3\":\" : 1 litre d’eau = %{waterPrice} € TTC (prix constaté au %{waterPriceStartDate} pour un abonnement et une consommation de 120 m3/an sur la Métropole de Lyon)\",\"part3\":\"Le coût de votre abonnement n'est pas pris en compte pour l'électricité.\"},\"release_notes_modal\":{\"title\":\"Du nouveau sur Ecolyo !\",\"message\":\"Les mises à jour suivantes ont été effectuées sur votre application :\",\"go_back\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre de notifications\",\"button_go_back\":\"J'ai compris\"}}},\"ecogestures\":{\"loading\":\"Chargement des astuces\"},\"duel\":{\"global_error\":\"Oups. Une erreur est survenue. Veuillez retourner à l'écran d’accueil des défis\",\"button_go_back\":\"Retour\",\"average_info\":\"%{average} euros étant votre moyenne actuelle, relevez-vous le défi ?\",\"button_start\":\"Allons-y !\",\"goal1\":\"Faites moins que votre moyenne actuelle sur %{durationInDays} jours\",\"goal2\":\"pour gagner le badge %{title}\",\"goal_done\":\"Duel remporté\",\"goal_failed\":\"Duel perdu\",\"caption_average\":\"Votre moyenne à titre indicatif\",\"caption_consumption\":\"Votre consommation\",\"caption_incoming\":\"Données à venir\",\"accessibility\":{\"button_go_back\":\"Retour\",\"button_start_duel\":\"Lancer le duel\",\"button_start_quiz\":\"Lancer le quiz\"}},\"duel_result_modal\":{\"success\":{\"title\":\"Félicitations\",\"message1\":\"Vous avez économisé %{value} €\",\"message2\":\"et gagné le badge %{title} !\",\"button_validate\":\"Youpi\"},\"lost\":{\"title\":\"Presque\",\"message1\":\"Vous avez dépassé de %{value} €\",\"message2\":\"et manqué le badge %{title}\",\"button_validate\":\"Zut alors\"},\"accessibility\":{\"window_title\":\"Fenêtre de résultat\",\"button_validate\":\"Valider\"}},\"last_duel_modal\":{\"title\":\"Félicitations !\",\"subtitle\":\"Vous avez terminé tous les défis !\",\"message1\":\"Nous travaillons actuellement à vous proposer de nouveaux défis.\",\"message2\":\"Vous pouvez donner votre avis sur ce que vous aimeriez en cliquant sur la bulle d'aide.\"},\"duel_empty_value_modal\":{\"title\":\"Oups !\",\"message\":\"Impossible de lancer le duel. Il nous manque en effet certaines de vos données de consommation pour vous proposer un duel à votre hauteur.\",\"button\":\"Je retourne au menu des défis\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_validate\":\"Retourner au menu des défis\"}},\"ecogesture\":{\"title_tab_0\":\"Objectifs\",\"title_tab_1\":\"Je fais déjà\",\"title_tab_2\":\"Toutes\",\"MENU_TITLE\":\"Filtrer\",\"ALL\":\"Tous les usages\",\"HEATING\":\"Chauffage\",\"AIR_CONDITIONING\":\"Climatisation\",\"ECS\":\"Eau chaude\",\"COLD_WATER\":\"Eau froide\",\"ELECTRICITY_SPECIFIC\":\"Électricité courante\",\"COOKING\":\"Cuisson\",\"selection\":\"Sélectionner les astuces les plus adaptées à votre consommation\",\"selection_2\":\"vues sur\",\"button_selection\":\"Continuer ma sélection\",\"no_ecogesture\":\"Aucune astuce ne correspond à votre filtrage\",\"no_ecogesture_filter\":{\"text1\":\"Nous n'avons pas trouvé d'astuces adaptées à votre profil dans cette catégorie.\",\"text2\":\"En effet, de par votre profil et vos modes de chauffage, d'eau ou d'eau chaude sanitaire, nous n'avons pas identifié d’astuces vous permettant de diminuer vos factures à titre individuel. Toutefois, vous pouvez toujours agir pour préserver les ressources en appliquant et diffusant autour de vous les autres bonnes pratiques présentées dans la partie \\\"Toutes les astuces\\\".\"},\"adjust_profil\":{\"description\":\"Pour une sélection d’astuces adaptée à votre consommation, vous pouvez ajuster votre profil.\",\"button_go_to_profil\":\"Ajuster mon profil\"},\"accessibility\":{\"window_title\":\"Fenêtre d'information'\",\"button_close\":\"Fermer la fenêtre\",\"button_selection\":\"Aller à la page de sélection\"},\"doing\":\"Je fais déjà\",\"objective\":\"Objectif\",\"emptyList\":{\"obj1\":\"Les astuces présentées sont des actions qui vous permettent de réduire vos consommations et donc vos factures. On parle parfois d’écogestes.\",\"obj1_done\":\"Aucune astuce n’a été sélectionnée comme objectif actuellement.\",\"obj2\":\"Vous pouvez sélectionner ceux à mettre en objectifs et ceux que vous appliquez déjà.\",\"obj2_done\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous souhaitez garder en objectif dans cette section.\",\"doing1\":\"Aucune astuce n’a été sélectionnée dans la catégorie appliquée actuellement.\",\"doing1_done\":\"Aucune astuce n’est indiquée comme déjà appliquée actuellement.\",\"doing2\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous mettez déjà en pratique dans cette section.\",\"doing2_done\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous mettez déjà en pratique dans cette section.\",\"btn1\":\"Voir toutes les astuces\",\"btn2\":\"Sélectionner\"},\"initModal\":{\"title\":\"Sélectionner mes astuces\",\"text1\":\"Les astuces présentées sont des actions qui vous permettent de réduire vos consommations et donc vos factures. On parle parfois d’écogestes \",\"text2\":\"Vous pouvez sélectionner celles à mettre en objectifs et celles que vous appliquez déjà.\",\"launchForm\":\"Afin de pré-sélectionner les astuces correspondant à votre consommation, merci de répondre à quelques rapides questions.\",\"btn1\":\"Plus tard\",\"btn2\":\"C'est parti !\"},\"reset\":\"Réinitialiser ma sélection\",\"resetModal\":{\"title_part1\":\"Cette action\",\"title_part2\":\"supprimera votre liste d’astuces\",\"title_part3\":\"sélectionnées dans\",\"title_part4\":\"“Objectifs”\",\"title_part5\":\"et\",\"title_part6\":\"“Je fais déjà”\",\"text1\":\"Vous pourrez ensuite faire une nouvelle sélection adaptée à votre consommation.\",\"text2\":\"Souhaitez-vous réinitialiser votre sélection d’astuces ?\",\"btn1\":\"Non\",\"btn2\":\"Réinitialiser\"}},\"ecogesture_modal\":{\"title_ecogesture\":\"Astuce\",\"title_action\":\"Action\",\"efficiency\":\"Efficacité\",\"show_less\":\"Voir moins\",\"show_more\":\"Voir plus\",\"select_action\":\"Je choisis cette action\",\"accessibility\":{\"window_title_ecogesture\":\"Fenêtre astuce\",\"window_title_action\":\"Fenêtre action\",\"button_close\":\"Fermer la fenêtre\",\"button_select_action\":\"Sélectionner cette action\",\"button_see_more_detail\":\"Afficher plus de détails\"}},\"ecogesture_info_modal\":{\"header\":\"Comment sont choisis les astuces adaptées à mon profil ?\",\"text\":\"Les astuces adaptés à votre profil sont aujourd’hui choisies en fonction des compteurs individuels que vous possédez (communicants ou non). Ceux présentés ici vous permettent d'agir sur vos consommations individuelles. Des modes de tri plus personnalisables seront proposés à l'avenir.\",\"button_close\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre d'information\",\"button_close\":\"Fermer la fenêtre\"}},\"ecogesture_form\":{\"heating_type\":{\"title\":\"Chauffage\",\"question\":\"Quel est votre type de chauffage ?\",\"individual\":\"Individuel\",\"collective\":\"Collectif\"},\"warming_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Bois\",\"4\":\"Fioul\",\"5\":\"Autre\",\"title\":\"Source chauffage\",\"question\":\"Quelle source d’énergie principale utilisez-vous pour vous chauffer ?\",\"no_fluid_text\":\"Produit ni par de l'électricité, ni par du gaz, ni par du bois ou du fuel\",\"0_text\":\"Produit grâce à de l'électricité\",\"2_text\":\"Produit grâce au gaz\",\"3_text\":\"Produit grâce au bois\",\"4_text\":\"Produit grâce au fioul\",\"5_text\":\"Produit grâce à un autre moyen\"},\"hot_water\":{\"title\":\"Eau chaude\",\"question\":\"Quel est votre type de production d’eau chaude ?\",\"individual\":\"Individuelle\",\"collective\":\"Collective\"}},\"ecogesture_profile\":{\"equipments\":{\"question\":\"Quels équipements possédez-vous ?\",\"hint\":\"Plusieurs réponses possibles\",\"air_conditioning\":\"Climatisation\",\"computer\":\"Ordinateur\",\"microwave\":\"Micro-ondes\",\"oven\":\"Four\",\"washing_machine\":\"Lave-linge\",\"dishwasher\":\"Lave-vaisselle\",\"cooking_plates\":\"Plaques électriques\",\"outside\":\"Extérieur\",\"dryer\":\"Sèche-linge\",\"refregirator\":\"Réfrigérateur\",\"fan\":\"Ventilateur\",\"water_heater\":\"Chauffe-eau\",\"curtain\":\"Rideaux\",\"internet_box\":\"Box internet\",\"ventilation\":\"VMC\",\"freezer\":\"Congélateur\",\"boiler\":\"Chaudière\",\"hydraulic_heating\":\"Chauffage hydraulique\",\"accessible_label\":\"Sélection d'équipement\"}},\"ecogesture_selection\":{\"header\":\"Sélection des astuces\",\"title\":\"Vous avez parcouru un groupe de %{smartCount} astuces\",\"text\":\"Voulez-vous continuer sur votre lancée ou remettre cette sélection à plus tard ?\",\"title_final\":\"Félicitations !\",\"text_final_1\":\"Vous avez terminé la sélection des astuces adaptées à votre consommation.\",\"text_final_2\":\"Vous pouvez les retrouver dans les sections “Objectifs” et “Je fais déjà” selon que vous les pratiquiez déjà ou non.\",\"button_go_to_ecogesture\":\"Plus tard\",\"button_ok\":\"J'ai compris\",\"button_continue\":\"Poursuivre\",\"button_objective\":\"Objectif\",\"button_doing\":\"Je fais déjà\",\"button_skip\":\"Pas intéressé\",\"accessibility\":{\"window_title\":\"Fenêtre d'information'\",\"button_close\":\"Fermer la fenêtre\",\"button_go_to_ecogesture\":\"Retourner aux astuces\",\"button_continue\":\"Poursuivre\",\"button_ok\":\"Fermer la sélection\"},\"selectionModal\":{\"title\":\"Des astuces correspondant à votre profil ont été trouvées !\",\"text\":\"À vous de choisir celles que vous souhaitez mettre en objectif et celles que vous faites déjà.\",\"button_close\":\"C'est parti !\"}},\"exploration\":{\"global_error\":\"Oups. Une erreur est survenue. Veuillez retourner à l'écran d’accueil des défis\",\"button_go_back\":\"Retour\",\"button_already_done\":\"C’est déjà fait !\",\"button_come_back\":\"Je reviens quand cela sera fait\",\"button_start\":\"C'est parti !\",\"watch_consumption\":\"Je fonce\",\"congratulation\":\"Bravo !\",\"earn\":\"Vous remportez\",\"button_confirm\":\"Ok\",\"interval\":{\"explanation\":\"Vous pouvez vérifier cette informations sur l'écran Conso.\"},\"accessibility\":{\"button_already_done\":\"Marquer l'exploration comme déjà réalisée\",\"button_confirm\":\"Valider\",\"button_come_back\":\"Fermer l'exploration\",\"button_go_back\":\"Retour\",\"button_start\":\"Lancer l'exploration\"}},\"error_page\":{\"main\":\"Erreur\",\"back\":\"Retour\",\"no_ecogesture\":\"Oups ! Nous n'avons pas trouvé l'astuce demandée.\"},\"help\":{\"title_help\":\"une question ? un problème ? une suggestion ?\",\"read_help\":\"Nous écrire via le Service d'Assistance Utilisateur\"},\"feedback\":{\"title\":\"Vous allez contacter le Service Assistance Utilisateur du Grand Lyon.\",\"text1\":\"Vous pourrez nous remonter un problème, chercher de l'aide pour vous connecter plus facilement, ou encore nous partager une bonne idée d'évolution.\",\"text2\":\"N'hésitez pas à nous écrire ! L'équipe Ecolyo vous répondra avec plaisir :)\",\"later\":\"Plus tard\",\"lets_go\":\"J'y vais\",\"accessibility\":{\"window_title\":\"Fenêtre de partage de retours\",\"button_close\":\"Fermer la fenêtre de partage de retours\"}},\"dataShare\":{\"title1\":\"Bienvenue !\",\"title1Update\":\"Ecolyo évolue !\",\"title2Update\":\"Pour continuer à utiliser Ecolyo, merci d’accepter les modalités de traitement des données ci-dessous.\",\"part1\":\"Nous avons besoin de l’adresse email utilisée lors de la création de votre Cozy Métropole de Lyon, ci-après nommé cloud personnel.\",\"part2\":\"Cette donnée de compte est conservée dans Ecolyo le temps de l’utilisation de ce service.\",\"part3\":\"La Métropole de Lyon utilisera cet email afin de vous tenir informé·e :\",\"item1\":\"En réponse à vos demandes, si vous avez pris l’initiative de nous contacter.\",\"item2\":\"En cas de problème majeur avec la gestion de votre compte.\",\"item3\":\"De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.\",\"part4\":\"Vos données privées de consommation d’énergie et d’eau sont récupérées, sauvegardées et stockées dans votre cloud personnel à votre initiative sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part5\":\"Il en est de même pour les données privées de composition du logement et du foyer, fournies par vos soins. Elles restent également sans visibilité de la Métropole de Lyon sur leur contenu.\\nLes données d’identification entrées lors de la connexion aux données de consommations d’électricité sont quant à elles conservées dans un espace sécurisé de la Métropole de Lyon et sont utilisées uniquement à des fins de contrôle du consentement par des organismes extérieurs.\",\"part6\":\"Dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées et pseudonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation, d’évaluer globalement l’usage de l’application via des mesures d’audience ainsi que d’évaluer à terme l’impact global en termes de baisse des consommations énergétiques de notre service.\",\"part7\":\"Au sein de votre cloud personnel, vous pouvez à tout moment exercer vos droits d’accès, de rectification, de portabilité, de limitation et d’opposition en consultant notamment la page Options.\",\"part8\":\"Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :\",\"part9\":\"Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 \",\"part10\":\"ou en ligne, au moyen du formulaire disponible à l'adresse suivante : \",\"link1\":\"<a href=\\\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\\\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/</a>\",\"validDataConsent\":\"Je consens au traitement de mes données tel que décrit ci-dessus.\",\"validCGU\":\"Je valide les \",\"validCGU_button\":\"Conditions Générales d’Utilisation\",\"validLegal\":\" du service et ai pris connaissance des \",\"validLegal_button\":\"Mentions Légales\",\"validLegal2\":\"de celui-ci.\",\"button_accept\":\"C'est parti !\",\"accessibility\":{\"button_accept\":\"Accepter les conditions générales d'utilisation\"}},\"minorUpdate\":{\"title\":\"Ecolyo évolue !\",\"button\":\"J'ai compris\"},\"gcu\":{\"title\":\"Conditions générales d’utilisation du service\",\"version\":\"Version du 12.12.2022\",\"content\":{\"title1\":\"Ecolyo, késako ?\",\"part1_1\":\"Ecolyo est un service proposé par la Métropole de Lyon vous permettant de suivre au même endroit vos consommations d’électricité, de gaz et d’eau, en kWh, en litres, en euros et à différentes échelles de temps. Ce service vous permet également de participer à des défis individuels et vous offre une analyse de vos consommations. Des astuces vous sont aussi proposées afin de vous permettre de réduire vos consommations.\",\"part1_2\":\"C’est un service gratuit qui prend la forme d’un site web dit « responsive », c’est-à-dire qu’il peut être consulté sur ordinateur ou sur mobile. Sur mobile, c’est une application que l’on a souhaitée ergonomique, réactive et esthétique pour votre plaisir de navigation et d’utilisation au quotidien.\",\"part1_3\":\"Tous les termes « techniques » sont définis en bas de page.\",\"title2\":\"Quelles fonctionnalités le service propose-t-il ?\",\"part2_1\":\"La fonctionnalité principale d’Ecolyo est la visualisation, au même endroit, de vos consommations d’électricité, de gaz et d’eau et ce, à différents pas de temps (de la demi-heure – uniquement pour l’électricité, à plusieurs années, en passant par les pas de temps journaliers et mensuels). La visualisation des consommations se fait en kWh pour l’énergie et en L pour l’eau ainsi qu’en euros (euros résultant d’un prix moyenné).\",\"part2_2\":\"Au-delà de la visualisation de vos consommations et parce que nous souhaitons vous aider à diminuer ces consommations vous retrouverez plusieurs autres pages : \",\"part2_2_list1\":\"Défis : Des quiz, et actions à mettre en place vous seront proposés pour vous pousser à réduire vos consommations.\",\"part2_2_list2\":\"Astuces : Une liste d’astuces pour maîtriser ses consommations d’énergie et d’eau à trier par usage, et avec une possibilité de les adapter plus précisément à votre profil.\",\"part2_2_list3\":\"Analyse : Une analyse de vos consommations réelles en comparaison à celle d’un foyer étant proche d’une vôtre.\",\"part2_3\":\"Pour la page Analyse ainsi que pour la partie personnalisation des astuces, des éléments supplémentaires sur votre profil vous seront demandés. L’ensemble de ces informations récoltées à l’aide du formulaire peuvent être modifiées par la suite.\",\"part2_4\":\"Dernière page : la page Options dans laquelle vous pourrez vous abonner à un service d’alerte sur vos consommations d’eau, de quoi ajuster votre profil ou encore vous désabonner de la lettre mensuelle.\",\"title3\":\"Comment ai-je accès à mes données d’électricité, de gaz et d’eau ?\",\"part3_1\":\"Pour visualiser vos consommations réelles et profiter pleinement du potentiel de notre service, il vous faut au minimum un des trois compteurs communicants suivants : Linky (pour l’électricité), Gazpar (pour le gaz), Téléo (pour l’eau).\",\"part3_2\":\"Ces compteurs sont opérés par les gestionnaires de réseaux. Pour Linky, c’est Enedis, le gestionnaire de réseau de distribution d’électricité. Pour Gazpar, GRDF est responsable de cette gestion. Et pour Téléo, c’est Eau Publique du Grand Lyon.\",\"part3_3\":\"Ces acteurs sont responsables de la relève de vos données. Ces données servent notamment à votre fournisseur d’électricité, de gaz ou d’eau pour permettre la facturation de vos consommations d’énergie. Des fournisseurs d’électricité ou de gaz il y en a des dizaines. Les gestionnaires de réseaux (… et de votre compteur) ne sont qu’au nombre de trois. Nous avons donc décidé de travailler avec eux, au plus près de la donnée brute issue de vos compteurs.\",\"part3_4\":\"Il vous faudra donc avoir un compte chez GRDF et Eau Publique du Grand Lyon pour accéder à vos données. Si vous n’en avez pas, il suffira de vous en créer un. Ceci ne sera à faire qu’une fois, au début.\",\"title4\":\"Ecolyo se trouve dans un cloud personnel Métropole de Lyon, qu’est-ce que cela signifie ?\",\"part4_1\":\"Comme vous avez dû le remarquer, lors de votre première connexion à Ecolyo vous avez dû vous créer un compte Cozy Métropole de Lyon. Ce cloud personnel est un espace sécurisé porté par l’ambition de vous apporter visibilité, transparence et maîtrise sur l’usage de vos données personnelles, et dont les fonctionnalités vous permettant de récupérer, synchroniser, stocker et partager vos données avec les destinataires de votre choix. Le service Ecolyo se déploie à l’intérieur de cet espace protégé. Dans ce cloud personnel, vous pourrez accéder également à d’autres services. Toutes les données traitées par Ecolyo, mais aussi les autres services que vous seriez amenés à utiliser dans ce cloud personnel restent dans ce Cloud Personnel Grand Lyon et n’en sortent pas, sauf si vous décidez vous-même de partager vos données avec des tiers.\",\"part4_2\":\"Pour en savoir plus sur ce cloud et son utilisation, ainsi que la durée de conservation de vos données, vous pouvez lire les conditions générales d’utilisation du service <a href=\\\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\\\">ici</a>.\",\"title5\":\"Et donc concrètement pour Ecolyo, quelles données sont collectées et qui y a accès ?\",\"part5_1\":\"Pour qu’Ecolyo ait accès à vos données de consommations, vous devrez activer vos différents connecteurs. À ce moment-là, pour la connexion aux données de gaz et d’eau à travers un parcours qui vous conduira de manière intuitive sur le site de chacun des gestionnaires de réseaux concerné, vous pourrez donner votre consentement à partager ces données avec le Service Ecolyo, et ce pour une durée limitée dans le temps. Pour l’électricité, le don du consentement et la connexion aux données se fait directement dans notre service. Quid de la durée de ce consentement ? Pour les données électriques, elle est par défaut d'un an. Pour les données gaz, cela sera à vous de la définir (nous vous recommandons 1 an pour une expérience optimale). Les données utilisées pour vérifier la bonne connexion de vos données d’électricité sont stockées du côté de la Métropole de Lyon sur des serveurs sécurisés.\",\"part5_2\":\"Vos connecteurs, une fois configurés, permettent le transfert de vos données de consommations au service Ecolyo. Le transfert de ces données de consommation se fait sans que personne n’accède à leur contenu, pas même la Métropole de Lyon. En effet, ces données sont stockées et traitées directement dans votre cloud personnel qui en assure la protection. Tous les calculs, analyses et traitements sur ces données sont faites DANS votre espace personnel sans visibilité sur le contenu des données par la Métropole de Lyon.\",\"part5_3\":\"Vous pouvez bien sûr mettre fin à la récupération/ au transfert de vos données de consommation sur votre espace cloud personnel à tout moment et à plusieurs niveaux : \",\"part5_3_list1\":\"Vous pouvez supprimer le transfert quotidien de vos données en supprimant tout simplement le connecteur dans la page Consos (en bas).\",\"part5_3_list2\":\"Pour supprimer l’ensemble de vos données ainsi que votre cloud personnel Métropole de Lyon, vous devez demander la suppression de votre cloud. Pour faire cela, rendez-vous dans les paramètres de votre cloud personnel via la barre blanche en haut d’Ecolyo et appuyez sur le bouton « Supprimer mon compte » dans la partie paramètres.\",\"part5_4\":\"Des données sur le profil de votre foyer peuvent être également remplies au sein de l’application. Ces données s’enrichiront au fur et à mesure de votre utilisation du service avec d’autres informations : défis réalisés, étoiles gagnées, etc. L’ensemble de ces données restent à l’intérieur de votre cloud personnel, sans que personne n’y ait accès.\",\"part5_5\":\"Enfin, afin de permettre une mise à jour quotidienne de vos données de consommations, vos identifiants Eau Publique du Grand Lyon, un jeton d’identification GRDF ainsi que vos numéros de compteurs sont stockés.\",\"title6\":\"Personne n’a donc accès à mes données, pas même la Métropole de Lyon, vraiment ?\",\"part6_1\":\"Conformément aux indications du paragraphe précédent, la Métropole de Lyon n’accède ni à vos données de consommations ni aux données utilisées via certaines fonctionnalités du service comme le formulaire (celui-là même qui permet l’analyse de vos consommations personnalisée ainsi qu’une sélection d’éco-gestes personnalisés). Toutes ces informations sont bien gardées au chaud dans votre cloud personnel Métropole de Lyon\",\"part6_2\":\"Seul vous pouvez accepter de partager vos données, documents ou fichiers privés avec la Métropole de Lyon, ses partenaires ou d’autres utilisateurs ou acteurs (publics ou privés) après recueil de votre consentement éclairé et par une action expresse de votre part.\",\"part6_3\":\"La Métropole de Lyon n'a cependant accès qu’à l’adresse email utilisée lors la création de votre cloud personnel Métropole de Lyon. Elle utilise cet email afin de vous tenir informé·e :\",\"part6_3_list1\":\"En réponse à vos demandes, si vous avez pris l’initiative de nous contacter. \",\"part6_3_list2\":\"En cas de problème majeur avec la gestion de votre compte.\",\"part6_3_list3\":\"De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.\",\"part6_4\":\"Elle stocke également les informations transmises lors de la connexion à l’électricité (nom, adresse postale). Ces informations doivent être stockées car la Métropole de Lyon est régulièrement contrôlée par Enedis et doit prouver détenir le consentement des personnes pour lesquelles elle va chercher la donnée.\",\"part6_5\":\"Par ailleurs, et dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques anonymisées nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation ainsi que d’évaluer l’impact global en termes de baisse des consommations énergétiques de notre service. Parmi ces statistiques, des mesures d’audience de la fréquentation des différentes pages du service sont réalisées. Vous pouvez, via la page Options, à tout instant, décider de vous opposer à la récupération de ces données d’utilisation.\",\"title8\":\"Encore des questions ?\",\"part8_1\":\"N’hésitez pas à consulter la FAQ ou à nous contacter via le formulaire de contact présente sur l’ensemble des pages.\",\"part8_2\":\"Dernière option, contactez-nous directement à <a href=\\\"mailto:ecolyo@grandlyon.com\\\">ecolyo(at)grandlyon.com</a>.\",\"title9\":\"LEXIQUE\",\"part9_1_title\":\"Cloud personnel Métropole de Lyon : \",\"part9_1_content\":\"Cloud personnel : appelé aussi le « domicile numérique », le cloud personnel est souvent réduit à un simple espace de stockage de documents mais il est bien plus que ça. C'est un espace individuel et sécurisé où vous pouvez accéder à des services sans exposer aucune donnée à l’extérieur. Vous seul pouvez y accéder, personne d'autre.\",\"part9_2_title\":\"Connecteur : \",\"part9_2_content\":\"Un connecteur est un service, installé dans votre cloud personnel également, qui a pour but uniquement d’aller récupérer les données auprès de différents partenaires/sources de données. Dans le cadre d’Ecolyo, trois connecteurs sont pré-installés dans votre cloud personnel : celui d’Enedis, celui de GRDF et celui d’Eau Publique du Grand Lyon.\",\"part9_3_title\":\"Compteur communicant : \",\"part9_3_content\":\"Un compteur communicant est un compteur qui mesure de manière précise et détaillée vos consommations et peut transmettre ces données au gestionnaire de réseau via une technologie radio (c'est le cas pour Gazpar et Téléo par exemple) ou via les réseaux électriques (via Courant Porteur en ligne, c'est le cas pour Linky par exemple).\",\"part9_4_title\":\"Fournisseur : \",\"part9_4_content\":\"Votre fournisseur d’électricité, de gaz ou d’eau est l’entreprise qui vous facture votre électricité, gaz ou eau. Côté électricité il en existe <a href=\\\"https://www.enedis.fr/liste-des-fournisseurs-delectricite\\\">aujourd’hui plus de 50</a>, chacun proposant des tarifs différents.\",\"part9_5_title\":\"Gestionnaire de réseau de distribution : \",\"part9_5_content\":\"Appelé aussi parfois distributeur, il est en charge de la livraison de votre électricité, gaz ou eau jusqu’à votre domicile. Il est aussi en charge du compteur qui relève vos consommations. Il transmet vos données de consommations à votre fournisseur afin qu’il effectue la facturation de vos consommations d’énergie. Il peut également les transmettre à tout acteur avec qui vous avez décidé de partager ces données.\"}},\"gcu_modal\":{\"button_accept\":\"J'accepte\",\"accessibility\":{\"window_title\":\"Conditions générales d’utilisation\",\"button_accept\":\"Accepter les conditions générales d'utilisation\"}},\"matomo\":{\"matomo_title\":\"Suivi statistiques d'usage Matomo\"},\"header\":{\"accessibility\":{\"button_back\":\"Retour à la page précédente\",\"button_open_feedbacks\":\"Ouvrir le partage de retours\"}},\"konnector_form\":{\"label_updated_at\":\"Dernière mise-à-jour le\",\"button_update\":\"Mettre à jour\",\"loading\":\"Chargement...\",\"wait_end_issue\":\"Attendre la fin de la maintenance avant de mettre à jour.\",\"button_disconnect\":\"Déconnecter\",\"issue\":\"Le problème semble venir de \",\"resolve\":\"Une mise à jour peut résoudre ce problème.\",\"login_failed\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"not_installed\":\"Le connecteur n'est pas installé. Veuillez l'installer en cliquant sur le bouton ci-dessous.\",\"button_install\":\"Installer\",\"error_account_creation\":\"Une erreur est survenue, veuillez essayer de nouveau.\",\"error_no_login_password\":\"Identifiant et mot de passe requis\",\"error_login_failed\":\"Identifiants invalides\",\"error_update\":\"Un problème est survenu lors du rapatriement de vos données.\",\"error_update_oauth\":\"Votre autorisation pour afficher vos données %{fluid} a expiré.\",\"button_oauth_reload\":\"Redonner mon consentement\",\"OK\":\"Ok\",\"konnector_delta\":{\"ELECTRICITY\":\"La donnée de consommation électrique arrive normalement à J+1. Un retard d'un ou deux jours est parfois constaté.\",\"GAS\":\"La donnée de consommation de gaz arrive normalement à J+3. Un retard d'un ou deux jours est parfois constaté.\",\"WATER\":\"La donnée de consommation d'eau arrive normalement à J+3. Un retard d'un ou deux jours est parfois constaté.\"},\"accessibility\":{\"button_install\":\"Installer le connecteur\",\"button_update\":\"Mettre à jour votre connexion\",\"button_disconnect\":\"Déconnecter votre connecteur\"}},\"konnector_options\":{\"label_connect_to_electricity\":\"Se connecter à l'électricité\",\"label_connect_to_water\":\"Se connecter à l'eau\",\"label_connect_to_gas\":\"Se connecter au gaz\",\"label_offline_electricity\":\"Électricité déconnectée\",\"label_offline_water\":\"Eau déconnectée\",\"label_offline_gas\":\"Gaz déconnecté\",\"partner_issue\":\"En maintenance\",\"outdated\":\"Données manquantes depuis %{isOutdatedData} jours\",\"accessibility\":{\"label_ko_status\":\"Connecteur en erreur\",\"button_toggle_detail_electricity\":\"Afficher ou masquer le détail de la connexion à l'électricité\",\"button_toggle_detail_water\":\"Afficher ou masquer le détail de la connexion à l'eau\",\"button_toggle_detail_gas\":\"Afficher ou masquer le détail de la connexion au gaz\"}},\"konnector_modal\":{\"loading_data\":\"Veuillez patienter, vos données sont en cours de chargement.\",\"loading_data_update\":\"Veuillez patienter, vos données sont en cours de mise à jour.\",\"logging_txt\":\"Nous vérifions vos informations d'identité\",\"success_txt\":\"Félicitations !\",\"success_data_electricity\":\"Vos données de consommation d'électricité sont maintenant connectées à Ecolyo.\",\"success_data_water\":\"Vos données de consommation d'eau sont maintenant connectées à Ecolyo.\",\"success_data_gas\":\"Vos données de consommation de gaz sont maintenant connectées à Ecolyo.\",\"success_data_additional_electricity\":\"Les données de consommations mettent entre un et deux jours pour arriver.\",\"success_data_additional_water\":\"Les données de consommations mettent entre trois et cinq jours pour arriver.\",\"success_data_additional_gas\":\"Les données de consommations mettent entre trois et cinq jours pour arriver.\",\"success_update_txt\":\"Connexion réussie !\",\"success_data_update_electricity\":\"Ecolyo est bien connecté à votre compteur d'électricité.\",\"success_data_update_water\":\"Ecolyo est bien connecté à votre compteur d'eau.\",\"success_data_update_gas\":\"Ecolyo est bien connecté à votre compteur de gaz.\",\"success_data_additional_update_electricity\":\"Sachez que la donnée de consommation d'électricité arrive entre J+1 et J+2.<br /><br />S'il vous manque encore des données, c'est qu'elles n'ont pas encore été mises à disposition par le gestionnaire de votre compteur. Merci pour votre patience !\",\"success_data_additional_update_water\":\"Sachez que la donnée de consommation d'eau arrive entre J+3 et J+5.<br /><br />S'il vous manque encore des données, c'est qu'elles n'ont pas encore été mises à disposition par le gestionnaire de votre compteur. Merci pour votre patience !\",\"success_data_additional_update_gas\":\"Sachez que la donnée de consommation de gaz arrive entre J+3 et J+5.<br /><br />S'il vous manque encore des données, c'est qu'elles n'ont pas encore été mises à disposition par le gestionnaire de votre compteur. Merci pour votre patience !\",\"error_txt\":\"Aïe !\",\"mismatch\":{\"title\":\"Vos données n'ont pas pu être récupérées.\",\"text1\":\"Vos nom et numéro de compteur ne correspondent plus. Merci de reconfigurer votre connecteur.\",\"text2\":\"Reconfigurer mon connecteur ?\",\"text3\":\"La reconfiguration de votre connecteur passe par sa suppression et sa nouvelle installation. Vos données seront conservées.\"},\"error_credentials_water\":\"Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter. L'identifiant est un numéro à 7 chiffres (différent de votre numéro de contrat).\",\"error_credentials_electricity\":\"Il semblerait que les nom(s) et adresse ne concordent pas avec le numéro de votre compteur.\",\"error_credentials_electricity_2\":\"Nous ne pouvons vous donner accès aux données de consommation.\",\"error_credentials_update_water\":\"Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter.\",\"error_credentials_update_electricity\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"error_credentials_update_gas\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"error_consent_form_gas_title\":\"L'accès à vos données a été bloqué par GRDF suite à un consentement précédemment supprimé par vos soins.\",\"error_consent_form_gas_report\":\"Merci de nous signaler le problème.\",\"error_data_electricity\":\"Un problème est survenu. Vos données de consommation d’électricité ne seront pas chargées.\",\"error_data_water\":\"Un problème est survenu. Vos données de consommation d’eau ne seront pas chargées.\",\"error_data_gas\":\"Il semblerait que le service de connexion à vos données de gaz soit momentanément en panne.\",\"error_data_update_electricity\":\"Un problème est survenu. Vos données de consommation d’électricité n’ont pas été mises à jour.\",\"error_data_update_water\":\"Un problème est survenu. Vos données de consommation d’eau n’ont pas été mises à jour.\",\"error_data_update_gas\":\"Un problème est survenu. Vos données de consommation de gaz n’ont pas été mises à jour.\",\"error_data_2\":\"Merci de réessayer plus tard.\",\"button_validate\":\"Ok\",\"button_understood\":\"J'ai compris\",\"button_try_again\":\"Réessayer\",\"button_contact\":\"Nous contacter\",\"button_check_info\":\"Vérifier les infos\",\"button_go\":\"J'y vais\",\"button_later\":\"Plus tard\",\"show_common_error\":\"Voir les erreurs récurrentes\",\"show_common_error_list\":\"<span>Le problème peut provenir des cas suivants :</span><ul><li>Vous avez un co-titulaire sur votre contrat. Veillez à bien entrer le nom du <span class=\\\"gold\\\">titulaire du contrat</span> et non le co-titulaire.</li><li> Votre nom comporte un tiret ? Tentez sans le tiret.</li><li>Entrez bien le nom de votre commune de résidence en entier (tirets et accents inclus)</li><li>Avez-vous bien entré le <span class=\\\"gold\\\">numéro de votre compteur</span> (PDL) ? Tout autre numéro (de contrat, de client) ne fonctionne pas.</li></ul><p>Si vous rencontrez toujours des difficultés, contactez notre service d'aide </p><div class=\\\"center\\\">Avez-vous pensez à vérifier ces informations ?</div>\",\"accessibility\":{\"window_title\":\"Fenêtre d'attente de connexion\",\"button_close\":\"Fermer la fenêtre\"}},\"consent_outdated\":{\"title\":{\"0\":\"Votre autorisation pour afficher vos données d’électricité a expiré\",\"2\":\"Aïe !\"},\"text1\":{\"0\":\"Veuillez re-donner votre consentement pour la transmission et la reconnexion de vos données ENEDIS à Ecolyo.\",\"2\":\"L'accès à vos données de consommation de gaz a expiré.\"},\"text2\":{\"0\":\"Souhaitez-vous renouveler votre accord dès maintenant pour un an ?\",\"2\":\"Merci de redonner votre consentement pour y accéder.\"},\"later\":\"Plus tard\",\"go\":\"J'y vais\",\"no\":\"Non\",\"yes\":\"Oui\"},\"legal\":{\"read_legal\":\"Lire les mentions légales\",\"title_legal\":\"Mentions légales & CGU\",\"version\":\"Version du 12.12.2022\",\"site\":\"Site du service Ecolyo : <a href=\\\"https://ecolyo.com/\\\"> https://ecolyo.com/</a>\",\"adress\":\"Métropole de Lyon - 20, rue du Lac – CS 33569 - 69505 Lyon cedex 03\",\"phone\":\"Tél : (33) 4 78 63 40 40\",\"mail\":\"<a href=\\\"mailto:ecolyo@grandlyon.com\\\"> ecolyo(at)grandlyon.com</a>\",\"p1b\":\"Directrice de publication : \",\"p1\":\"Blandine MELAY, Responsable du Service Transition Énergétique\",\"p2b\":\"Animation éditoriale, gestion et mise à jour : \",\"p2\":\"Marion BERTHOLON, Chargée de services numériques pour la transition énergétique\",\"p3b\":\"Photographies : \",\"p3\":\"sauf mention contraire, les photos sont la propriété de la Métropole de Lyon\",\"p4b\":\"Conception et Charte graphique : \",\"p4\":\"Florent Dufier\",\"p5b\":\"Réalisation technique : \",\"p5\":\"Métropole de Lyon, Sopra Steria\",\"p6b\":\"Maintenance technique : \",\"p6\":\"Délégation Développement économique, emploi & savoirs - Innovation numérique & systèmes d’information - Usages et services numériques - Développement des services numériques\",\"title1\":\"Crédits\",\"part1\":\"Ce site est le résultat de développements spécifiques réalisés dans les langages Go, TypeScript, HTML et Sass. Les développements s’appuient sur plusieurs bibliothèques et frameworks libres : axios, cozy-bar, cozy-client, cozy-harvest-lib, cozy-scripts, cozy-ui, d3, detect-browser, global, lodash, luxon, moment, moment-timezone, node-sass, object-hash, react, react-dom, react-redux, react-router-dom, react-swipeable-views, redux-devtools-extension, sass-loader. Les tests de l’application s’appuient sur les bibliothèques et frameworks libres suivants: jest-junit, react-test-renderer, redux-mock-store. La pile technique intègre également les applications Cozy stack, Yarn, Docker, ACH. Les déploiements sont réalisés sur le registre hébergé chez Cozy. L’équipe de réalisation utilise au quotidien les applications GitLab, IceScrum, RocketChat, SonarQube.\",\"title2\":\"Traitement des données personnelles et droit d’accès, de modification et de suppression\",\"part2\":\"Conformément à la réglementation en vigueur en matière de protection des données personnelles, le service Ecolyo a fait l’objet d’une inscription au registre des traitements de la Métropole de Lyon. Ecolyo fait partie de l’écosystème de services orientés « self data » déployés par la Métropole de Lyon avec l’ambition d’offrir aux usagers métropolitains les outils et les services leur permettant d’exercer directement leur droit à la portabilité, dans un cadre apte à garantir aussi bien la transparence et le contrôle sur l’usage de leurs données personnelles que l’exploitation directe du contenu de ces données selon leurs libres choix. Le self data est en effet selon la Fondation Internet Nouvelle Génération (FING) « la production, l’exploitation et le partage de données personnelles par les individus, sous leur contrôle et à leurs propres fins ». Au sein de cet environnement self data, la gestion des données s’appuie sur l’organisation suivante des rôles et responsabilités associées : \",\"part2-1\":\"Les partenaires du service GRDF et Eau Publique du Grand Lyon sont responsables exclusivement des seuls traitements de Données Personnelles relatifs à la collecte des données de consommation de gaz et d’eau de l’utilisateur et à leur transmission sur la plateforme de cloud personnel, après consentement de l’utilisateur.\",\"part2-2\":\"Enedis est responsable de la collecte des données de consommation d’électricité et de leur mise à disposition à la Métropole de Lyon qui, elle en gère la transmission sur la plateforme du cloud personnel de l’utilisateur, après avoir récupéré le consentement de l’utilisateur.\",\"part2-3\":\"La Métropole de Lyon est responsable de traitement sur le périmètre du service Ecolyo qu’elle propose à l’usager, ainsi que des traitements nécessaires à la fourniture de la plateforme de cloud personnel qu’elle met à disposition de l’usager pour accéder au service Ecolyo. En sa qualité de responsable de ces traitements, elle collecte et traite : \",\"part2-3-1\":\"Les données de compte de l’usager renseignées par l’usager au sein de son espace de cloud personnel Grand Lyon à des fins de gestion du compte et de communication avec l’usager ;\",\"part2-3-2\":\"Les données de compte de l’utilisateur lui permettant de connecter ses données d’électricité à Ecolyo ;\",\"part2-3-3\":\"Les données privées de consommation d’énergie et d’eau dont la récupération, la sauvegarde, le stockage, la synchronisation et le partage sur la plateforme de cloud personnel sont initiés par l’usager sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part2-3-4\":\"Les données privées sur la composition du logement et du foyer de l’utilisateur, fournies par l’utilisateur lui-même au sein du service, sont traitées par le service sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part2-3-5\":\"Des métriques d’usage du service anonymisées et remontées périodiquement afin d’améliorer la qualité du service et d’évaluer son impact (Plus d’informations sur la manière dont votre anonymat est bien préservé dans ce processus <a href=\\\"https://ecolyo.com/cloud_statistiques.html\\\">ici</a>).\",\"part2-4\":\"La Métropole réalise également des mesures d’audience à l’aide de la solution Matomo. Afin de vous fournir un meilleur service et d’améliorer votre expérience d'utilisateur, nous utilisons des solutions de mesure d’audience qui utilisent la technologie des « cookies », des fichiers texte qui sont enregistrés sur votre ordinateur et qui permettent de générer des informations envoyées aux serveurs de mesure d’audience. Sur ces serveurs, l’adresse IP est anonymisée. Les données recueillies ont uniquement pour finalité de permettre d'analyser la fréquentation de nos pages afin d'en améliorer le contenu. Il s'agit de statistiques agrégées permettant de connaître le nombre de visites et de visiteurs différents, les pages les plus populaires, les chemins préférés, les niveaux d'activité par jour de la semaine et par heure de la journée, les principales erreurs etc. Vous avez cependant le droit de vous opposer à l’utilisation de ces cookies, et donc au traitement de vos données personnelles de navigation, en vous rendant dans la page Options de notre service.\",\"part2-5\":\"L’usager est seul décisionnaire des finalités d’utilisation qu’il souhaite définir pour le traitement de ses données personnelles de consommation, à la suite de leur transmission par les partenaires du service Ecolyo sur son cloud personnel. Ainsi, dans le cadre de l’utilisation d’Ecolyo, l’usager ne recevra les données des partenaires du service : Enedis, GRDF et Eau Publique du Grand Lyon seulement qu’à sa demande expresse après la saisie de ses identifiants.\",\"part2-6\":\"L’utilisateur est donc le seul à accéder :\",\"part2-6-1\":\"À ses données de consommation d’électricité horaires, journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-6-2\":\"À ses données de consommation de gaz journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-6-3\":\"À ses données de consommation eau journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-7\":\"Les engagements et responsabilités de la Métropole de Lyon concernant la protection des données et la confidentialité des données Ecolyo sont précisés dans les Mentions légales et les conditions d’utilisation du cloud personnel Grand Lyon qui accueille aujourd’hui le service Ecolyo et sans lequel le service ne peut pas fonctionner. Pour plus d’informations sur les engagements et responsabilités de la Métropole de Lyon concernant la protection et la confidentialité dans le cloud personnel, nous vous invitons à vous référer <a href=\\\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\\\">aux mentions légales et CGU du cloud personnel métropolitain.</a> \",\"part2-8\":\"Conformément à la loi 78-17 du 6 janvier 1978 modifiée relative à l’information, aux fichiers et aux libertés, vous disposez d’un droit d’accès, de rectification et d’opposition au traitement de vos données à caractère personnel. Votre cloud personnel vous permet d’exercer ces droits directement dans cet espace sur vos données de compte. S’agissant des données de consommations d’électricité et de gaz, l’utilisateur peut supprimer son consentement à partager ses données en supprimant son connecteur dans la page Consos.\",\"part2-9\":\"Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :\",\"part2-10\":\"Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 ou en ligne, au moyen du formulaire disponible à l'adresse suivante : <a href=\\\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\\\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/.</a>\",\"part2-11\":\"L’exercice de ces droits sur vos données personnelles auprès de la Métropole de Lyon concerne exclusivement les données traitées dans le cadre du service « Ecolyo ».\",\"title3\":\"Dispositions légales\",\"part3-1\":\"Les divers éléments du site web (la forme, la mise en page, le fonds, la structure …) sont protégés par le droit des dessins et modèles, le droit d’auteur, le droit des marques ainsi que le droit à l’image et ils ne peuvent être copiés ou imités en tout ou partie sauf autorisation expresse de la Métropole de Lyon.\",\"part3-2\":\"Toute personne ne respectant pas les dispositions légales applicables se rend coupable du délit de contrefaçon et est passible des sanctions pénales prévues par la loi.\",\"title4\":\"Droits d’auteurs\",\"part4-1\":\"Les photographies, textes, logos, pictogrammes, ainsi que toutes œuvres intégrées dans le site sont la propriété de la \\\"Métropole de Lyon\\\" ou de tiers ayant autorisé la \\\"Métropole de Lyon\\\" à les utiliser.\",\"part4-2\":\"Les reproductions, les transmissions, les modifications, les réutilisations, sur un support papier ou informatique, dudit site et des œuvres qui y sont reproduites ne sont autorisées que pour un usage personnel et privé conforme aux dispositions de l’article L 122-5 du Code de la Propriété Intellectuelle. Ces reproductions devront ainsi notamment indiquer clairement la source et l’auteur du site et/ou de ces œuvres multimédias. En aucun cas ces reproductions ne sauraient porter préjudice aux droits des tiers. Les reproductions, les transmissions, les modifications, les réutilisations à des fins publicitaires, commerciales ou d’information, de tout ou partie du site, sont totalement interdites.\",\"title5\":\"Logo de la Métropole de Lyon et d’Ecolyo\",\"part5\":\"Les logos de la Métropole de Lyon et d’Ecolyo ne peuvent pas être modifiés – proportions, couleurs, éléments, constituants – et ne peuvent pas être sujet à aucune transformation, animation ou tout autre processus. Les logos de la Métropole de Lyon et d’Ecolyo ne peuvent être utilisés et associés qu’aux seules informations vérifiables. Ils ne peuvent être notamment utilisés que pour illustrer des relations avec la Métropole de Lyon ou des actions de sponsorings dûment établies. Quel que soit le cas d’espèce, la Métropole de Lyon se réserve le droit d’approuver ou de désapprouver toute utilisation des logos de la Métropole de Lyon et d’Ecolyo, pour assurer son utilisation correcte, conformément à l’éthique, la morale et aux intérêts de la Métropole de Lyon. Les conditions susmentionnées s’appliquent dans le cadre de pages web, elles ne font pas référence à l’utilisation des logos dans tout autre document. La Métropole de Lyon se réserve le droit de modifier les conditions d’utilisation des logos de la Métropole de Lyon et d’Ecolyo à tout moment et sans préavis.\",\"title6\":\"Droit des bases de données\",\"part6\":\"Les bases de données sont protégées par la loi du 1er juillet 1998 et le régime français du droit d’auteur.\",\"title7\":\"Établissements de liens vers le site Ecolyo\",\"part7-1\":\"La Métropole de Lyon autorise la mise en place d’un lien hypertexte vers son service Ecolyo pour tous les sites internet, à l’exclusion de ceux diffusant des informations à caractère polémique, pornographique, xénophobe ou pouvant, dans une plus large mesure porter atteinte à la sensibilité du plus grand nombre.\",\"part7-2\":\"Le lien doit aboutir à la page d’accueil du service (<a href=\\\"https://ecolyo.com\\\">https://ecolyo.com</a>), cette page devant apparaître dans une nouvelle fenêtre. Les pages du service Ecolyo ne doivent en aucun cas être intégrées à l’intérieur des pages d’un autre site (iframe).\",\"part7-3\":\"Dans tous les cas d’espèce, La Métropole de Lyon se réserve le droit de demander la suppression d’un lien si elle estime que le site cible ne respecte pas les règles ainsi définies.\",\"title8\":\"Liens vers des sites tiers depuis le site Ecolyo\",\"part8\":\"Les liens hypertextes mis en œuvre au sein du site en direction d’autres sites et/ou de pages personnelles et d’une manière générale vers toutes ressources existantes sur internet ne sauraient engager la responsabilité de la Métropole de Lyon quant aux liens qu’ils contiennent ou aux changements ou mises à jour qui leur sont apportés.\",\"title9\":\"Mise en garde générale\",\"part9-1\":\"Nos services mettent tout en œuvre pour offrir aux visiteurs de ce site web des informations fiables et vérifiées. Cependant, malgré tous les soins apportés, le site peut comporter des inexactitudes, des défauts de mise à jour ou des erreurs.\",\"part9-2\":\"Nous remercions les utilisateurs du site de nous faire part d’éventuelles omissions, erreurs ou corrections par mail sur la boite aux lettres du webmestre ou directement via le formulaire proposé dans le service.\",\"accessibility\":{\"button_close\":\"Fermer la fenêtre\"}},\"oauth\":{\"window\":{\"title\":\"OAuth\"}},\"onboarding\":{\"welcomeModal\":{\"title\":\"Vous êtes à mi-chemin !\",\"part1\":\"Votre cloud personnel a bien été créé.\",\"part2\":\"Il vous faut maintenant donner votre accord pour connecter vos compteurs au service.\",\"button_valid\":\"Ok\",\"accessibility\":{\"window_title\":\"Fenêtre de bienvenue\",\"button_valid\":\"Valider\"}}},\"performance_indicator\":{\"bilan\":{\"text1\":\"Par rapport à \",\"text2\":\"soit une différence de : \"},\"error_no_compare\":\"comparaison impossible\",\"error_no_compare_reason\":\"(manque de données)\",\"error_no_compare_no_data\":\"Vos consommations pour cette période sont incomplètes à cause d’un problème technique concernant :\",\"fpi\":{\"no_data\":\"Données non disponibles\",\"no_comparison\":\"Pas de comparaison possible\"}},\"profile\":{\"report\":{\"title_bilan\":\"Inscription à la lettre mensuelle\",\"switch_label_bilan\":\"Recevoir mon bilan de consommation et des conseils\",\"title_alert\":\"Alerte Consommation Excessive d'Eau\",\"switch_label_alert\":\"Être prévenu d’un dépassement anormal de ma consommation d’eau\",\"input_label_alert\":\"Si ma consommation d’eau quotidienne dépasse :\",\"input_label_subtext_alert\":\"Votre consommation quotidienne maximum sur les 6 derniers mois : \"},\"accessibility\":{\"button_toggle_mail_report\":\"Recevoir mon bilan mensuel par mail\",\"button_toggle_consumption_alert\":\"Recevoir des alertes sur mes consommations journalières\",\"input_water_alert_report\":\"Indiquer une limite de consommation d'eau journalière\"}},\"profile_type\":{\"title_profile\":\"Mes données\",\"read_profile\":\"Ajuster mon profil\",\"button_update_profile\":\"J'ajuste mon profil\",\"your_profile\":\"Mon profil\",\"multi_choices\":\"Plusieurs réponses possibles\",\"housing_type\":{\"title\":\"Logement\",\"question\":\"De quel type de logement disposez-vous ?\",\"individual_house\":\"Maison individuelle\",\"apartment\":\"Appartement\"},\"construction_year\":{\"title\":\"Construction\",\"question\":\"Quelle est son année de construction ?\",\"text_before_1948\":\"Construit avant 1948\",\"text_between_1948_and_1974\":\"Construit entre 1948 et 1974\",\"text_between_1975_and_1989\":\"Construit entre 1975 et 1989\",\"text_between_1990_and_1998\":\"Construit entre 1990 et 1998\",\"text_after_1998\":\"Construit après 1998\",\"text_unknown\":\"Construit après 1998\",\"before_1948\":\"Avant 1948\",\"between_1948_and_1974\":\"Entre 1948 et 1974\",\"between_1975_and_1989\":\"Entre 1975 et 1989\",\"between_1990_and_1998\":\"Entre 1990 et 1998\",\"after_1998\":\"Après 1998\",\"unknown\":\"Je ne sais pas\"},\"occupantsNumber\":{\"single\":\" occupant\",\"multi\":\" occupants\"},\"area\":{\"title\":\"Surface\",\"question\":\"Quelle est sa surface en m² ?\",\"name\":\" m²\"},\"occupants_number\":{\"title\":\"Nombre d'occupants\",\"question\":\"Combien il y a-t-il d'occupants ?\"},\"outside_facing_walls\":{\"1\":\"1 façade\",\"2\":\"2 façades\",\"3\":\"3 façades\",\"4\":\"4 façades\",\"title\":\"Murs extérieurs\",\"question\":\"Combien de façades donnent sur l'extérieur ?\",\"text\":{\"single\":\" façade donne sur l'extérieur\",\"multi\":\" façades donnent sur l'extérieur\"}},\"floor\":{\"title\":\"Étage\",\"question\":\"À quel étage est votre appartement ?\",\"ground_floor\":\"Au rez-de-chaussée\",\"intermediate_floor\":\"Étage intermédiaire\",\"last_floor\":\"Dernier étage\",\"not_applicable\":\"Sans objet\"},\"heating\":{\"title\":\"Chauffage\",\"question\":\"Quel est votre type de chauffage ?\",\"individual\":\"Individuel\",\"collective\":\"Collectif\"},\"individual_insulation_work\":{\"title\":\"Travaux de rénovation\",\"question\":\"Quels travaux de rénovation avez-vous réalisés ces 10 dernières années ?\",\"none\":\"Aucun\",\"roof_insulation\":\"Isolation toiture\",\"window_replacement\":\"Remplacement fenêtres\",\"wall_insulation\":\"Isolation des murs\",\"window_replacement_and_wall_insulation\":\"Remplacement fenêtres et isolation des murs\",\"window_replacement_and_roof_insulation\":\"Remplacement fenêtres et isolation toiture\",\"roof_and_wall_insulation\":\"Isolation toiture et murs\",\"window_replacement_and_roof_and_wall_insulation\":\"Remplacement fenêtre et isolation des murs et isolation toiture\",\"built_after_1998\":\"construit après 1998\"},\"facilities_installation\":{\"title\":\"Équipement\"},\"ventilation\":{\"title\":\"Ventilation double flux\",\"question\":\"Êtes-vous équipé d'une ventilation double flux ?\",\"yes\":\"Oui\",\"no\":\"Non\",\"unknown\":\"Je ne sais pas\",\"text\":\"Équipé d'une ventilation double flux\"},\"heater_replacement\":{\"title\":\"Pompe à chaleur ou poêle à bois\",\"question\":\"Au cours de ces 10 dernières années, avez-vous remplacé votre chaudière ou vous êtes-vous équipé d'une pompe à chaleur ou d'un poêle à bois ?\",\"yes\":\"Oui\",\"no\":\"Non\",\"unknown\":\"Je ne sais pas\",\"text\":\"Équipé d'une pompe à chaleur ou poêle à bois\"},\"cold_water\":{\"title\":\"Eau\",\"question\":\"Votre eau est-elle comprise dans vos charges collectives ?\",\"individual\":\"Non\",\"collective\":\"Oui\",\"individual_text\":\"Individuelle\",\"collective_text\":\"Collective\"},\"hot_water\":{\"title\":\"Eau chaude\",\"question\":\"Quel est votre type de production d’eau chaude ?\",\"individual\":\"Individuelle\",\"collective\":\"Collective\"},\"hot_water_equipment\":{\"title\":\"Eau chaude\",\"question\":\"Utilisez-vous l’un de ces équipements pour produire votre eau chaude ?\",\"solar\":\"Chauffe-eau solaire\",\"thermodynamic\":\"Chauffe-eau thermodynamique\",\"other\":\"Aucun des deux\"},\"warming_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Bois\",\"4\":\"Fioul\",\"5\":\"Autre\",\"title\":\"Source chauffage\",\"question\":\"Quelle source d’énergie principale utilisez-vous pour vous chauffer ?\",\"no_fluid_text\":\"Produit ni par de l'électricité, ni par du gaz, ni par du bois ou du fuel\",\"0_text\":\"Produit grâce à de l'électricité\",\"2_text\":\"Produit grâce au gaz\",\"3_text\":\"Produit grâce au bois\",\"4_text\":\"Produit grâce au fioul\",\"5_text\":\"Produit grâce à un autre moyen\"},\"hot_water_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Autre (Fioul, Bois)\",\"title\":\"Source eau chaude\",\"question\":\"Avec quelle source d’énergie votre eau chaude est-elle produite ?\",\"no_fluid_text\":\"Produite ni par de l'électricité, ni par du gaz\",\"0_text\":\"Produite grâce à de l'électricité\",\"2_text\":\"Produite grâce au gaz\",\"3_text\":\"Produite à partir d'un autre moyen que l'électricité ou le gaz\"},\"cooking_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"title\":\"Source cuisson\",\"question\":\"Quel mode de cuisson principal utilisez-vous ?\"},\"update_date\":{\"title\":\"Date de prise d'effet\",\"question\":\"A partir de quelle date souhaitez-vous que ce nouveau profil soit pris en compte dans l'analyse de vos données ?\"},\"fluidType\":{\"0\":\"Électricité\",\"1\":\"Eau\",\"2\":\"Gaz\"},\"form\":{\"button_previous\":\"Précédent\",\"button_next\":\"Suivant\",\"button_end\":\"Terminer\",\"button_loading\":\"Chargement...\"},\"finished\":{\"title\":\"Terminé !\",\"label1\":\"Grâce à ces informations, vous pourrez comparer votre consommation avec celle d'un foyer vous ressemblant davantage !\",\"label2\":\"Nous pourrons aussi vous proposer des astuces pour maîtriser vos consommations adaptées à votre profil.\",\"button_validate\":\"OK\"},\"accessibility\":{\"button_end\":\"Terminer la mise à jour du profil\",\"button_next\":\"Aller à la section suivante\",\"button_previous\":\"Retour à la section précédente\",\"button_update_profile\":\"Ouvrir la page de mise à jour du profil\",\"button_toggle_detail_profile\":\"Afficher ou masquer le détail du profil\",\"button_toggle_export\":\"Afficher ou masquer l'export des données'\",\"button_toggle_average_home\":\"Afficher ou masquer les informations sur le comparatif'\",\"button_validate\":\"Valider\"}},\"export\":{\"title_export\":\"Télécharger mes données\",\"text1\":\"Vous allez télécharger l'historique mensuel de vos fluides sélectionnés\",\"fluid_select\":\"Pour quel(s) fluide(s) souhaitez vous exporter vos données ?\",\"no_data\":\"Vous n'avez aucune donnée de fluide...\",\"button_download\":\"Télécharger\",\"month\":\"Mois\",\"year\":\"Année\",\"consumption\":\"Consommation\",\"maxpower\":\"Puissance max (kVA)\",\"button_close\":\"Fermer la fenêtre\",\"modal_start\":{\"accessibility_title\":\"Commencer le téléchargement\",\"text1\":\"Vous allez télécharger des données personnelles, Ecolyo n’est plus responsable de celles-ci une fois téléchargées\",\"text2\":\"Les données seront téléchargées sous forme de document excel (.xls)\",\"text3\":\"Lancer le téléchargement ?\",\"button_cancel\":\"Annuler\"},\"modal_loading\":{\"accessibility_title\":\"Téléchargement en cours\",\"text1\":\"Données en cours de téléchargement\",\"text2\":\"Veuillez ne pas quitter l’application pendant la récupération et le téléchargement de vos données\",\"button_cancel\":\"Annuler le téléchargement\"},\"modal_done\":{\"accessibility_title\":\"Téléchargement terminé\",\"text1\":\"Vos données ont bien été téléchargées !\",\"text2\":\"Vous pouvez maintenant retrouver l’historique de vos données sur votre appareil\",\"error1\":\"Aïe !\",\"error2\":\"Il semblerait qu’une erreur se soit produite lors du téléchargement de vos données.\",\"button_close\":\"Fermer\",\"button_close_error\":\"Revenir plus tard\"}},\"quiz\":{\"explanation\":\"Répondez correctement aux 5 questions et remportez 5 des 15 étoiles nécessaires pour débloquer le duel final\",\"score_final\":\"SCORE FINAL\",\"correct\":\"Bravo !\",\"wrong\":\"Raté !\",\"rightAnswer\":\"Bonne réponse :\",\"earn\":\"Vous remportez\",\"button_go_back\":\"Retour\",\"button_end_quiz\":\"Youpi !\",\"button_try_again\":\"Réessayer\",\"button_validate\":\"Valider\",\"next\":\"Suivant\",\"consumption_question\":\"Question sur votre consommation\",\"accessibility\":{\"window_title\":\"Fenêtre de résultat\",\"button_end_quiz\":\"Terminer le quiz\",\"button_go_back\":\"Retour\",\"button_go_next\":\"Suivant\",\"button_try_again\":\"Relancer le quiz\",\"button_validate\":\"Valider\"}},\"splashscreen\":{\"error_loading\":\"Une erreur est survenue\",\"button_reload\":\"Réessayer\",\"accessibility\":{\"button_reload\":\"Recharger la page\"},\"migration_error\":\"Mise à jour de l'application\",\"consent_error\":\"Vérification de vos consentements pour partager vos données avec Ecolyo\",\"profile_error\":\"Chargement de votre profil utilisateur\",\"profileType_error\":\"Chargement de votre profil de consommation.\",\"challenges_error\":\"Actualisation de votre progression dans les défis\",\"analysis_error\":\"Chargement de votre analyse mensuelle\",\"index_error\":\"Chargement des index\",\"prices_error\":\"Mise à jour des prix\",\"consos_error\":\"Connexion à vos données de consommation\",\"partners_error\":\"Récupération de l'état des services partenaires\",\"unknown_error\":\"Veuillez vérifier votre connexion internet\",\"network_error\":\"Erreur de réseau\",\"step\":{\"0\":\"Mise à jour de l'application\",\"1\":\"Vérification de vos consentements pour partager vos données avec Ecolyo\",\"2\":\"Chargement de votre profil\",\"3\":\"Actualisation de votre progression dans les défis\",\"4\":\"Mise à jour des prix\",\"5\":\"Connexion à vos données de consommation\"}},\"timestep\":{\"today\":\"Aujourd'hui\",\"year\":{\"period\":\"5 ans\",\"comparelabel\":\"Comparer à l'année précédente\"},\"month\":{\"period\":\"Année\",\"comparelabel\":\"Comparer à l'année précédente\",\"current\":\"année actuelle\",\"last\":\"année précédente\"},\"day\":{\"period\":\"Mois\",\"comparelabel\":\"Comparer au mois précédent\",\"current\":\"mois actuel\",\"last\":\"mois précédent\"},\"week\":{\"period\":\"Semaine\",\"comparelabel\":\"Comparer à la semaine précédente\",\"current\":\"semaine actuelle\",\"last\":\"semaine précédente\"},\"half_an_hour\":{\"period\":\"Jour\",\"comparelabel\":\"Comparer à la journée précédente\",\"gather_data_title\":\"La récupération de vos données demi-horaires prend environ 24h.\",\"current\":\"jour actuel\",\"last\":\"jour précédent\",\"gather_data_subtitle\":\"Votre connexion a bien été prise en compte mais un délai de 24h est en général nécessaire à l’obtention de vos données.\\nÀ demain !\",\"gather_data_failure\":\"Il semblerait que votre compteur ne nous permette pas d'accéder à des données de consommation plus fines.\",\"analysis_waiting_data\":\"Pour bénéficier d'une analyse approfondie de votre consommation électrique, il nous faut récupérer vos données de consommation horaires. La récupération de ces données prend environ 24h. A bientôt !\"},\"accessibility\":{\"button_zoom_in\":\"Sélectionner le pas de temps précédent\",\"button_zoom_out\":\"Sélectionner le pas de temps suivant\"}},\"unsubscribe\":{\"error\":\"Une erreur est survenue lors de votre désinscription, merci de ré-essayer plus tard.\",\"unsubscribed\":\"Vous êtes désormais désabonné de la newsletter Ecolyo\",\"subscribed\":\"Vous êtes désormais à nouveau abonné à la newsletter Ecolyo\",\"content\":\"Vous ne recevrez plus la notification de votre bilan ainsi que les conseils associés au mois en cours.\",\"button_subscribe\":\"Me ré-abonner\",\"button_home\":\"Me connecter à Ecolyo\",\"button_accessibility\":\"Bouton de désinscription\"},\"welcome_modal\":{\"title\":\"Félicitations\",\"perso\":\"Votre espace personnel a bien été créé.\",\"connect\":\"Vous pouvez maintenant connecter vos compteurs d’énergie à Ecolyo en toute sécurité.\",\"button_valid\":\"Ok\",\"accessibility\":{\"title\":\"Fenêtre de félicitations\",\"button_valid\":\"Valider\"}}}"); +module.exports = JSON.parse("{\"common\":{\"title_app\":\"Ecolyo\",\"title_consumption\":\"Conso\",\"title_consumption_electricity\":\"Conso électrique\",\"title_consumption_gas\":\"Conso de gaz\",\"title_consumption_water\":\"Conso d'eau\",\"title_challenge\":\"Défis\",\"title_quiz\":\"Quiz\",\"title_exploration\":\"Exploration\",\"title_action\":\"Action\",\"title_duel\":\"Duel final\",\"title_ecogesture\":\"Astuce\",\"title_ecogestures\":\"Astuces\",\"title_ecogestures_choice\":\"Sélection des astuces\",\"title_options\":\"Options\",\"title_analysis\":\"Analyse\",\"title_profiletype\":\"Ajuster mon profil\",\"title_legal_notice\":\"Mentions légales\",\"title_gcu\":\"Conditions générales d’utilisation\",\"title_accessibility\":\"Accessibilité : non conforme\",\"title_sge_connect\":\"Connexion à l'électricité\",\"title_gas_connect\":\"Connexion au gaz\",\"accessibility\":{\"loading\":\"Chargement\"},\"funders_logo\":\"Logo des financeurs : Métropole de Lyon, Etat via la Banque des Territoires et son programme France 2030, Union Européenne\"},\"navigation\":{\"consumption\":\"Conso\",\"challenges\":\"Défis\",\"ecogestures\":\"Astuces\",\"options\":\"Options\",\"analysis\":\"Analyse\"},\"FLUID\":{\"ELECTRICITY\":{\"NAME\":\"Électricité\",\"LABEL\":\"Électricité\",\"LABEL_PREPOSITION\":\"d'électricité\",\"UNIT\":\"kWh\",\"ADD\":\"Ajouter l'électricité\",\"MEGAUNIT\":\"MWh\",\"provider\":\"Enedis\"},\"WATER\":{\"NAME\":\"Eau\",\"LABEL\":\"Eau\",\"LABEL_PREPOSITION\":\"d'eau\",\"ADD\":\"Ajouter l'eau\",\"UNIT\":\"L\",\"MEGAUNIT\":\"m³\",\"provider\":\"Eau Publique du Grand Lyon\"},\"GAS\":{\"NAME\":\"Gaz\",\"LABEL\":\"Gaz\",\"LABEL_PREPOSITION\":\"de gaz\",\"ADD\":\"Ajouter le gaz\",\"UNIT\":\"kWh\",\"MEGAUNIT\":\"MWh\",\"provider\":\"GRDF\"},\"MULTIFLUID\":{\"NAME\":\"Multi fluide\",\"LABEL\":\"Multi\",\"UNIT\":\"€\"}},\"action\":{\"duration\":\"Durée : %{smartCount} jours\",\"result\":\"Résultat\",\"finished\":\"Défi terminé !\",\"details\":\"Détail de l'astuce\",\"apply\":\"J'applique cette action\",\"other\":\"Je choisis une autre action\",\"resultText1\":\"Cela n'a pas été trop difficile ?\",\"resultText2\":\"Jetez un coup d'œil dans la page conso dans 1 à 3 jours, le temps que vos données arrivent, pour voir l'impact de votre action.\",\"resultText3\":\"Pas de baisse de significative ? Pas de panique, en maintenant cette pratique dans le temps, les économies d'énergies et d'eau seront davantage visibles.\",\"resultText4\":\"Dans tous les cas, bravo, vous remportez...\",\"ok\":\"Ok\"},\"action_modal\":{\"accept\":\"Je relève le défi\",\"refuse\":\"Je me défile\",\"accessibility\":{\"window_title\":\"Fenêtre de confirmation\",\"button_accept\":\"Accepter\",\"button_refuse\":\"Refuser\"}},\"analysis\":{\"viewTitle\":\"Analyse\",\"warning_title\":\"Analyse incomplète\",\"warning_text\":\"Ecolyo n'a pas encore reçu toutes les données %{fluidList} pour ce mois\",\"comparison\":\"Comparatif\",\"analysis_date\":\"Conso totale\",\"challenge\":\"Défis terminés en\",\"user_consumption\":\"Votre conso\",\"average_home\":\"Conso moyenne d'un profil similaire\",\"average_home_description\":\"Le comparatif ici présenté est calculé sur la base d'un profil similaire au vôtre. Il s'agit d'un calcul et non d'une comparaison avec les autres utilisateurs de l'application. Sont pris en compte l'ensemble des informations entrées dans votre profil : mode de chauffage, âge du logement et éventuels travaux de rénovation, etc. Ce modèle a été créé avec l'Agence Locale de l'Energie sur la base de chiffres issues du Schéma Directeur des Energies de la Métropole de Lyon et de Chiffres-clé publiés par l'ADEME (l'Agence de l'Environnement et de la Maîtrise de l'Energie).\",\"approximative_description\":\"Pour comparer votre consommation avec un foyer similaire ou avec une conso idéale, veuillez détailler votre profil\",\"no_data\":\"Pas de données\",\"accessibility\":{\"button_go_to_profil\":\"Détailler mon profil\",\"comparison_multifluid\":\"Vos dépenses (tous fluides confondus) vs Dépenses moyennes\",\"comparison_electricity\":\"Votre consommation d'électricité vs Consommation moyenne\",\"comparison_water\":\"Votre consommation d'eau vs Consommation moyenne\",\"comparison_gas\":\"Votre consommation de gaz vs Consommation moyenne\"},\"max_day\":\"Jour où vous avez le plus consommé\",\"compare\":{\"title\":\"Comparateur\",\"month_tab\":\"Comparer au mois dernier\",\"year_tab\":\"Comparer à l'année dernière\"},\"temperature_comparison\":{\"unit\":\"°C\",\"comparison\":\"par rapport à\",\"info_button\":\"Information sur l'indice météo\",\"modal\":{\"title\":\"Indice météo\",\"month_comparison\":\"Écart de température moyenne entre le mois observé et le mois précédent.\",\"year_comparison\":\"Écart de température moyenne entre le mois observé et le même mois de l'année précédente.\",\"data_info\":\"Données Météo France issues de la station météo Lyon Bron.\",\"close\":\"Fermer la fenêtre\"}}},\"analysis_error_modal\":{\"title\":\"Aucune analyse\",\"message\":\"Pour profiter d’une analyse de vos consommations, connectez au moins un de vos compteurs.\",\"go_to_conso\":\"Je connecte mes compteurs\",\"understood\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_understood\":\"J'ai compris\",\"button_goto_konnector\":\"Aller aux connecteurs\"}},\"analysis_pie\":{\"total\":\"Conso totale\",\"details\":\"Détail par fluide\",\"month\":\"Au mois \",\"estimation\":\"Comment sont estimés<br>les prix ?\"},\"special_elec\":{\"title\":\"Spécial Électricité\",\"average\":\"Conso moyenne\",\"weektype\":\"un jour de \",\"week\":\"semaine\",\"weekend\":\"week-end\",\"min\":\"Conso minimum\",\"percentage\":\"Part dans la facture\",\"price\":\"Soit\",\"maxPower\":\"Puissance maximum atteinte\",\"offPeakHour\":\"Consommation en heures creuses\",\"showModal\":\"Plus d'infos\"},\"elec_info_modal\":{\"accessibility\":{\"window_title\":\"Information sur les statistiques Enedis\",\"button_close\":\"Fermer la fenêtre d'information\"},\"maxPowerTitle\":\"Qu’est-ce que la puissance maximum ?\",\"maxPowerDetails-1\":\"C’est la puissance maximum délivrée par tous les appareils fonctionnant au même moment dans votre logement.\",\"maxPowerDetails-2\":\"Vous avez choisi une puissance maximum dans votre offre d’électricité (3, 6 ou 9 kVA...) que vous ne devez pas dépasser pour ne pas faire sauter votre compteur. \",\"maxPowerDetails-3\":\"Cette puissance varie d'un mois à l'autre, regardez cette valeur sur l'ensemble de l'année pour vérifier si votre puissance souscrite correspond bien à votre usage.\",\"offPeakTitle\":\"Sur quelle base est calculé mon ratio Heures Pleines / Heures Creuses ?\",\"offPeakDetails-1\":\"D'après Enedis, vos plages d'heures creuses sont les suivantes : %{offPeakHours}. Nous avons donc simplement calculé, à l'aide vos consommations à la demi-heure, quelle part de votre consommation est réalisée sur vos heures creuses.\",\"minPowerTitle\":\"Qu’est-ce que la consommation minimum ?\",\"minPowerDetails-1\":\"Elle correspond à votre plus petite consommation du mois sur un créneau d'une demi-heure.\",\"minPowerDetails-2\":\"Nous extrapolons cette consommation sur 1 mois afin vous donner un aperçu de la consommation de vos consommations électriques en veille (box, télé, chargeurs, ...) ou encore de celle, incompressible, de vos appareils de froid (frigo, congélateur).\"},\"auth\":{\"enedissgegrandlyon\":{\"title\":\"Ecolyo doit se connecter à l’électricité\",\"bill\":\"Munissez-vous d’une <span>facture d’électricité</span> pour valider la connexion\",\"connect\":\"Je me connecte à l'électricité\",\"accessibility\":{\"connect\":\"Se connecter\"},\"identityTitle\":\"Nom inscrit sur la facture\",\"firstName\":\"Prénom\",\"lastName\":\"Nom\",\"pdlTitle\":\"Numéro de votre compteur électrique (PDL)\",\"pdlLabel\":\"N° (14 chiffres)\",\"pdlModal\":{\"title\":\"Qu'est-ce qu'un PDL ?\",\"title_accessibility\":\"Modale qu'est ce qu'un PDL ?\",\"txt1\":\"Votre numéro de point de livraison (PDL) peut aussi s’appeler PRM si vous possédez un compteur Linky.\",\"txt2\":\"Ce numéro est composé de 14 chiffres.\",\"txt3\":\"Votre numéro de PDL ou PRM se trouve sur votre facture d’électricité.\",\"txt4\":\"Si vous avez un compteur Linky, appuyez sur le bouton “+” et faites défiler l’affichage jusqu’à obtenir l’affichage suivant :\",\"button\":\"J'ai compris\",\"button_accessibility\":\"Bouton valider\",\"prm_accessibility\":\"Écran d'un compteur Linky présentant le numéro PRM\"},\"addressTitle\":\"Adresse du titulaire\",\"address\":\"Numéro et voie\",\"zipCode\":\"Code postal\",\"city\":\"Ville\",\"headConsent\":\"En acceptant de partager vos données, celles-ci seront directement transférées à Ecolyo à l’intérieur de votre cloud personnel, sans que la Métropole n’y accède ni ne les visualise.\",\"textConsent\":\"Afin de vous offrir des fonctionnalités de visualisation et d'analyse, Ecolyo a besoin des données suivantes : \",\"consentLi1\":\"L'historique et le relevé de vos consommations quotidiennes en kWh\",\"consentLi2\":\"L'historique et le relevé de vos consommations au pas de temps 30 minutes\",\"consentLi3\":\"Les puissances maximales atteintes quotidiennement\",\"consentLi4\":\"Les données contractuelles (début de contrat et puissance souscrite)\",\"consentCheck1\":\"Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un an</span>\",\"consentCheck2\":\"J’atteste être le titulaire du point de livraison (PDL) renseigné à l’étape précédente\"},\"grdfgrandlyon\":{\"title\":\"Ecolyo doit se connecter au gaz\",\"bill\":\"Munissez-vous d’une <span>facture de gaz</span> pour valider la connexion\",\"connect\":\"Je me connecte au gaz\",\"accessibility\":{\"connect\":\"Se connecter\"},\"identityTitle\":\"Nom inscrit sur la facture\",\"firstName\":\"Prénom\",\"lastName\":\"Nom\",\"email\":\"Email\",\"zipCode\":\"Code postal\",\"pceTitle\":\"Numéro de votre compteur de gaz (PCE)\",\"pceLabel\":\"N° (14 chiffres)\",\"pceHint\":\"Où trouver le numéro de PCE ?\",\"pceModal\":{\"title\":\"Où trouver le n° de PCE ?\",\"txt1\":\"Votre numéro de <span>PCE</span> - ou <span>Point de comptage et d'estimation</span> - se trouve sur votre facture au niveau de vos informations contractuelles (parfois en 1ère page... parfois en dernière !)<br/><br/> C'est un identifiant à 14 chiffres.\",\"button\":\"J'ai compris\",\"accessibility\":\"Titre de la modale\",\"button-accessibility\":\"Bouton valider\"},\"headConsent\":\"Vous allez partager vos données à la Métropole de Lyon. Elles seront directement transférées à Ecolyo à l'intérieur de votre cloud personnel, sans que la Métropole n'y accède ni ne les visualise.\",\"textConsent\":\"Afin de vous offrir des fonctionnalités de visualisation et d'analyse, Ecolyo a besoin des données suivantes :\",\"consentLi1\":\"L'historique de vos consommations (jusqu’à 36 mois) et le relevé quotidien de vos consommations\",\"consentLi2\":\"Les données contractuelles (type de compteur, date de début de contrat)\",\"consentCheck1\":\"Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un an</span>\",\"consentCheck2\":\"J’atteste être le titulaire du point de livraison (PCE) renseigné à l’étape précédente\",\"waiting\":{\"mailSent\":\"Un mail vous a été envoyé...\",\"mailDelay\":\"La réception du mail peut prendre 15min, l'envoi des mails se faisant tous les 1/4 d'heure\",\"validate\":\"Merci de valider l'autorisation d'accès à vos données\",\"comeback\":\"Une fois ce clic effectué, revenez ici pour accéder à vos données\",\"button_done\":\"C’est fait !\"}},\"eglgrandlyon\":{\"bill\":\"Munissez-vous d’une <span>facture d'eau</span> pour valider la connexion\",\"connect\":\"Je me connecte à l'eau\",\"accessibility\":{\"connect\":\"Se connecter\"},\"connect_form\":{\"login\":\"Identifiant (7 chiffres)\",\"password\":\"Mot de passe\",\"label\":\"Je connecte Ecolyo à mon compte Eau Publique du Grand Lyon\"},\"no_account\":{\"title\":\"Ecolyo doit se connecter à l'eau\"},\"with_account\":{\"title\":\"Votre compte Eau Publique du Grand Lyon a bien été créé ?\",\"subtitle1\":\"Plus qu’à donner votre accord pour connecter votre compteur d'eau et Ecolyo !\"},\"step1\":{\"info1\":\"La connexion se fait via <span>votre compte Eau Publique du Grand Lyon</span>.\",\"info2\":\"Possédez-vous un <span>compte Eau Publique du Grand Lyon</span> ?\"},\"step2\":{\"info1\":\"Une fois votre compte créé, <span>n'oubliez pas de revenir sur Ecolyo</span> pour finaliser la connexion.\"},\"button_go_to_partner_site\":\"Aller sur EPGL\"},\"connect_oauth\":{\"loading\":\"Chargement...\"},\"accessibility\":{\"button_reveal_password\":\"Afficher le mot de passe\",\"button_connect\":\"Se connecter\",\"button_create_account\":\"Se créer un compte\",\"window_title\":\"Fenêtre d'information sur la création de compte.\",\"button_close\":\"Fermer la fenêtre.\"},\"button_previous\":\"Précédent\",\"button_connect\":\"Se connecter\",\"button_create_account\":\"Se créer un compte\",\"button_has_account\":\"J'ai déjà un compte\",\"button_validate\":\"J'ai compris\",\"button_showOfflineData\":\"Voir mes anciennes données\",\"warningOfflineData\":\"Attention, vous visualisez d’anciennes données. Pour actualiser vos données, connectez votre compteur\"},\"challenge\":{\"card\":{\"ongoing\":{\"quiz\":\"Quiz\",\"exploration\":\"Explorations\",\"action\":\"Actions\",\"duel\":\"Duel Final\",\"result\":\"Résultat\",\"duelDone\":\"du duel final\"},\"locked\":{\"desc\":\"À débloquer en terminant le défi précédent\"}},\"card_done\":{\"saving\":\"Économie de\",\"depense\":\"Dépense de\",\"win\":\"Gagné\",\"lost\":\"Perdu\",\"final_defi\":\"sur le duel final\",\"final_defi_view\":\"Revoir le duel final\",\"reset_defi\":\"Relancer le défi\"},\"card_last\":{\"title\":\"Tous les défis sont terminés\",\"message1\":\"Nous travaillons actuellement à vous proposer de nouveaux défis.\",\"button\":\"Suggérer une idée de défi\"},\"card_unlocked\":{\"button_launch\":\"Lancer le défi\"},\"accessibility\":{\"button_launch\":\"Lancer le défi\",\"button_goto_konnector\":\"Aller aux connecteurs\",\"button_slider_previous\":\"Précédent\",\"button_slider_next\":\"Suivant\"}},\"challenge_no_fluid_modal\":{\"title\":\"Oups !\",\"content\":\"Connectez au moins 1 fluide pour pouvoir jouer\",\"button_validate\":\"Ok\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_validate\":\"Valider\"}},\"consumption\":{\"display_last_data\":\"Voir mes dernières consos\",\"accessibility\":{\"navigation_group\":\"Choix de la période\",\"fluid_menu\":\"Choix du fluide\",\"button_previous_period\":\"Afficher la période précédente\",\"button_next_period\":\"Afficher la période suivante\",\"button_previous_value\":\"Sélectionner la valeur précédente\",\"button_next_value\":\"Sélectionner la valeur suivante\",\"checkbox_compare\":\"Afficher ou cacher la comparaison\",\"bar\":\"Consommation du %{date} : %{value} %{unit}\"},\"partner_issue_modal\":{\"title\":\"Attention !\",\"accessibility_title\":\"Modale de maintenance partenaire\",\"error_connect_gaz\":\"La connexion à vos données de <span class='gaz'>gaz</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='gaz'>GRDF</span> ou dans notre service)\",\"error_connect_elec\":\"La connexion à vos données d'<span class='elec'>électricité</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='elec'>Enedis</span> ou dans notre service)\",\"error_connect_water\":\"La connexion à vos données d'<span class='water'>eau</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='water'>Eau Publique du Grand Lyon</span> ou dans notre service)\",\"additional_text\":\"La visualisation et/ou la connexion à vos données de consommation peut s'en trouver affectée.<br /><br /><i>Merci pour votre patience en attendant un retour à la normale :)</i>\",\"ok\":\"Ok\"},\"compared\":\"Comparé\"},\"consumption_details\":{\"detail\":\"Détail par fluide\",\"connect\":\"Connecter d'autres fluides\",\"mini_cards_label\":\"AUTRES ENERGIES\"},\"consumption_visualizer\":{\"missing_data\":\"Données manquantes\",\"no_data\":\"Pas de données\",\"why_no_data\":\"Pourquoi n'ai-je pas de données ?\",\"last_valid_data\":\"Dernières données valides : %{date}\",\"last_available_data\":\"Dernières données disponibles : %{date}\",\"last_valid_data_multi\":\"Dernières données complètes : %{date}\",\"data_to_come\":\"À venir\",\"aie\":\"Aïe !\",\"data_empty\":\"Vide\",\"estimated\":\"estimés\",\"cost_per_fluid\":{\"electricity\":\"Part de l'électricité\",\"water\":\"Part de l'eau\",\"gas\":\"Part du gaz\"},\"dataModal\":{\"list_title\":\"3 raisons possibles :\",\"item1\":\"le lien entre Ecolyo et le fournisseur de données est rompu : une mise à jour de ce lien (en bas de la page) peut résoudre ce problème.\",\"item2\":\"un problème technique chez votre gestionnaire : se connecter directement chez ce gestionnaire pour vérifier que cette donnée apparaît.\",\"item3\":\"pour le gaz : vous n'avez pas autorisé Ecolyo à accéder aux données de consommation de cette période.\",\"item4\":\"vous n'aviez tout simplement pas de compteur communicant à l'époque !\"},\"modal\":{\"window_title\":\"info estimation des prix\",\"title\":\"Comment sont estimés les prix ?\",\"close\":\"Fermer la fenêtre\",\"part1\":\"Le prix de votre électricité ou de votre gaz dépend de l'offre choisie auprès de votre fournisseur. N’ayant pas accès à cette information, Ecolyo affiche un prix moyen par fluide. \",\"part2\":\"Tarifs moyens retenus :\",\"list1\":\" : 1 kWh = %{elecPrice} €TTC (il correspond au tarif réglementé d’EDF au %{elecPriceStartDate} pour une puissance souscrite de 3 ou 6 kVA et hors offre heure pleine/heure creuse)\",\"list2\":\" : 1 kWh = %{gasPrice} €TTC (Prix repère de vente de gaz publié par la Commission de Régulation de l'Energie au %{gasPriceStartDate} pour un consommateur \\\"Cuisson/Eau Chaude\\\")\",\"list3\":\" : 1 litre d’eau = %{waterPrice} € TTC (prix constaté au %{waterPriceStartDate} pour un abonnement et une consommation de 120 m3/an sur la Métropole de Lyon)\",\"part3\":\"Le coût de votre abonnement n'est pas pris en compte pour l'électricité.\"},\"release_notes_modal\":{\"title\":\"Du nouveau sur Ecolyo !\",\"message\":\"Les mises à jour suivantes ont été effectuées sur votre application :\",\"go_back\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre de notifications\",\"button_go_back\":\"J'ai compris\"}}},\"ecogestures\":{\"loading\":\"Chargement des astuces\"},\"duel\":{\"global_error\":\"Oups. Une erreur est survenue. Veuillez retourner à l'écran d’accueil des défis\",\"button_go_back\":\"Retour\",\"average_info\":\"%{average} euros étant votre moyenne actuelle, relevez-vous le défi ?\",\"button_start\":\"Allons-y !\",\"goal1\":\"Faites moins que votre moyenne actuelle sur %{durationInDays} jours\",\"goal2\":\"pour gagner le badge %{title}\",\"goal_done\":\"Duel remporté\",\"goal_failed\":\"Duel perdu\",\"caption_average\":\"Votre moyenne à titre indicatif\",\"caption_consumption\":\"Votre consommation\",\"caption_incoming\":\"Données à venir\",\"accessibility\":{\"button_go_back\":\"Retour\",\"button_start_duel\":\"Lancer le duel\",\"button_start_quiz\":\"Lancer le quiz\"}},\"duel_result_modal\":{\"success\":{\"title\":\"Félicitations\",\"message1\":\"Vous avez économisé %{value} €\",\"message2\":\"et gagné le badge %{title} !\",\"button_validate\":\"Youpi\"},\"lost\":{\"title\":\"Presque\",\"message1\":\"Vous avez dépassé de %{value} €\",\"message2\":\"et manqué le badge %{title}\",\"button_validate\":\"Zut alors\"},\"accessibility\":{\"window_title\":\"Fenêtre de résultat\",\"button_validate\":\"Valider\"}},\"last_duel_modal\":{\"title\":\"Félicitations !\",\"subtitle\":\"Vous avez terminé tous les défis !\",\"message1\":\"Nous travaillons actuellement à vous proposer de nouveaux défis.\",\"message2\":\"Vous pouvez donner votre avis sur ce que vous aimeriez en cliquant sur la bulle d'aide.\",\"close\":\"Fermer la fenêtre\"},\"duel_empty_value_modal\":{\"title\":\"Oups !\",\"message\":\"Impossible de lancer le duel. Il nous manque en effet certaines de vos données de consommation pour vous proposer un duel à votre hauteur.\",\"button\":\"Je retourne au menu des défis\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_validate\":\"Retourner au menu des défis\"}},\"ecogesture\":{\"title_tab_0\":\"Objectifs\",\"title_tab_1\":\"Je fais déjà\",\"title_tab_2\":\"Toutes\",\"MENU_TITLE\":\"Filtrer\",\"ALL\":\"Tous les usages\",\"HEATING\":\"Chauffage\",\"AIR_CONDITIONING\":\"Climatisation\",\"ECS\":\"Eau chaude\",\"COLD_WATER\":\"Eau froide\",\"ELECTRICITY_SPECIFIC\":\"Électricité courante\",\"COOKING\":\"Cuisson\",\"selection\":\"Sélectionner les astuces les plus adaptées à votre consommation\",\"selection_2\":\"vues sur\",\"button_selection\":\"Continuer ma sélection\",\"no_ecogesture\":\"Aucune astuce ne correspond à votre filtrage\",\"no_ecogesture_filter\":{\"text1\":\"Nous n'avons pas trouvé d'astuces adaptées à votre profil dans cette catégorie.\",\"text2\":\"En effet, de par votre profil et vos modes de chauffage, d'eau ou d'eau chaude sanitaire, nous n'avons pas identifié d’astuces vous permettant de diminuer vos factures à titre individuel. Toutefois, vous pouvez toujours agir pour préserver les ressources en appliquant et diffusant autour de vous les autres bonnes pratiques présentées dans la partie \\\"Toutes les astuces\\\".\"},\"adjust_profil\":{\"description\":\"Pour une sélection d’astuces adaptée à votre consommation, vous pouvez ajuster votre profil.\",\"button_go_to_profil\":\"Ajuster mon profil\"},\"accessibility\":{\"window_title\":\"Fenêtre d'information'\",\"button_close\":\"Fermer la fenêtre\",\"button_selection\":\"Aller à la page de sélection\"},\"doing\":\"Je fais déjà\",\"objective\":\"Objectif\",\"emptyList\":{\"obj1\":\"Les astuces présentées sont des actions qui vous permettent de réduire vos consommations et donc vos factures. On parle parfois d’écogestes.\",\"obj1_done\":\"Aucune astuce n’a été sélectionnée comme objectif actuellement.\",\"obj2\":\"Vous pouvez sélectionner ceux à mettre en objectifs et ceux que vous appliquez déjà.\",\"obj2_done\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous souhaitez garder en objectif dans cette section.\",\"doing1\":\"Aucune astuce n’a été sélectionnée dans la catégorie appliquée actuellement.\",\"doing1_done\":\"Aucune astuce n’est indiquée comme déjà appliquée actuellement.\",\"doing2\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous mettez déjà en pratique dans cette section.\",\"doing2_done\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous mettez déjà en pratique dans cette section.\",\"btn1\":\"Voir toutes les astuces\",\"btn2\":\"Sélectionner\"},\"initModal\":{\"title\":\"Sélectionner mes astuces\",\"text1\":\"Les astuces présentées dans cette page sont des actions qui vous permettent de réduire vos consommations. Elles sont appelées parfois aussi écogestes.\",\"text2\":\"Répondez à un court questionnaire pour générer une liste d'astuces adaptée à votre profil puis sélectionnez celles que vous suivez déjà et celles que vous voulez vous mettre en objectif !\",\"btn1\":\"Plus tard\",\"btn2\":\"C'est parti !\"},\"reset\":\"Réinitialiser ma sélection\",\"resetModal\":{\"title_part1\":\"Cette action\",\"title_part2\":\"supprimera votre liste d’astuces\",\"title_part3\":\"sélectionnées dans\",\"title_part4\":\"“Objectifs”\",\"title_part5\":\"et\",\"title_part6\":\"“Je fais déjà”\",\"text1\":\"Vous pourrez ensuite faire une nouvelle sélection adaptée à votre consommation.\",\"text2\":\"Souhaitez-vous réinitialiser votre sélection d’astuces ?\",\"btn1\":\"Non\",\"btn2\":\"Réinitialiser\"}},\"ecogesture_modal\":{\"title_ecogesture\":\"Astuce\",\"title_action\":\"Action\",\"efficiency\":\"Efficacité\",\"show_less\":\"Voir moins\",\"show_more\":\"Voir plus\",\"select_action\":\"Je choisis cette action\",\"accessibility\":{\"window_title_ecogesture\":\"Fenêtre astuce\",\"window_title_action\":\"Fenêtre action\",\"button_close\":\"Fermer la fenêtre\",\"button_select_action\":\"Sélectionner cette action\",\"button_see_more_detail\":\"Afficher plus de détails\"}},\"ecogesture_info_modal\":{\"header\":\"Comment sont choisis les astuces adaptées à mon profil ?\",\"text\":\"Les astuces adaptés à votre profil sont aujourd’hui choisies en fonction des compteurs individuels que vous possédez (communicants ou non). Ceux présentés ici vous permettent d'agir sur vos consommations individuelles. Des modes de tri plus personnalisables seront proposés à l'avenir.\",\"button_close\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre d'information\",\"button_close\":\"Fermer la fenêtre\"}},\"ecogesture_form\":{\"heating_type\":{\"title\":\"Chauffage\",\"question\":\"Quel est votre type de chauffage ?\",\"individual\":\"Individuel\",\"collective\":\"Collectif\"},\"warming_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Bois\",\"4\":\"Fioul\",\"5\":\"Autre\",\"title\":\"Source chauffage\",\"question\":\"Quelle source d’énergie principale utilisez-vous pour vous chauffer ?\",\"no_fluid_text\":\"Produit ni par de l'électricité, ni par du gaz, ni par du bois ou du fuel\",\"0_text\":\"Produit grâce à de l'électricité\",\"2_text\":\"Produit grâce au gaz\",\"3_text\":\"Produit grâce au bois\",\"4_text\":\"Produit grâce au fioul\",\"5_text\":\"Produit grâce à un autre moyen\"},\"hot_water\":{\"title\":\"Eau chaude\",\"question\":\"Quel est votre type de production d’eau chaude ?\",\"individual\":\"Individuelle\",\"collective\":\"Collective\"}},\"ecogesture_profile\":{\"equipments\":{\"question\":\"Quels équipements possédez-vous ?\",\"hint\":\"Plusieurs réponses possibles\",\"air_conditioning\":\"Climatisation\",\"computer\":\"Ordinateur\",\"microwave\":\"Micro-ondes\",\"oven\":\"Four\",\"washing_machine\":\"Lave-linge\",\"dishwasher\":\"Lave-vaisselle\",\"cooking_plates\":\"Plaques électriques\",\"outside\":\"Extérieur\",\"dryer\":\"Sèche-linge\",\"refregirator\":\"Réfrigérateur\",\"fan\":\"Ventilateur\",\"water_heater\":\"Chauffe-eau\",\"curtain\":\"Rideaux\",\"internet_box\":\"Box internet\",\"ventilation\":\"VMC\",\"freezer\":\"Congélateur\",\"boiler\":\"Chaudière\",\"hydraulic_heating\":\"Chauffage hydraulique\",\"accessible_label\":\"Liste des équipements\"}},\"ecogesture_selection\":{\"header\":\"Sélection des astuces\",\"title\":\"Vous avez parcouru un groupe de %{smartCount} astuces\",\"text\":\"Voulez-vous continuer sur votre lancée ou remettre cette sélection à plus tard ?\",\"title_final\":\"Félicitations !\",\"text_final_1\":\"Vous avez terminé la sélection des astuces adaptées à votre consommation.\",\"text_final_2\":\"Vous pouvez les retrouver dans les sections “Objectifs” et “Je fais déjà” selon que vous les pratiquiez déjà ou non.\",\"button_go_to_ecogesture\":\"Plus tard\",\"button_ok\":\"J'ai compris\",\"button_continue\":\"Poursuivre\",\"button_objective\":\"Objectif\",\"button_doing\":\"Je fais déjà\",\"button_skip\":\"Pas intéressé\",\"accessibility\":{\"window_title\":\"Fenêtre d'information'\",\"button_close\":\"Fermer la fenêtre\",\"button_go_to_ecogesture\":\"Retourner aux astuces\",\"button_continue\":\"Poursuivre\",\"button_ok\":\"Fermer la sélection\"},\"selectionModal\":{\"title\":\"Des astuces correspondant à votre profil ont été trouvées !\",\"text\":\"À vous de choisir celles que vous souhaitez mettre en objectif et celles que vous faites déjà.\",\"button_close\":\"C'est parti !\"}},\"exploration\":{\"global_error\":\"Oups. Une erreur est survenue. Veuillez retourner à l'écran d’accueil des défis\",\"button_go_back\":\"Retour\",\"button_already_done\":\"C’est déjà fait !\",\"button_come_back\":\"Je reviens quand cela sera fait\",\"button_start\":\"C'est parti !\",\"watch_consumption\":\"Je fonce\",\"congratulation\":\"Bravo !\",\"earn\":\"Vous remportez\",\"button_confirm\":\"Ok\",\"interval\":{\"explanation\":\"Vous pouvez vérifier cette informations sur l'écran Conso.\"},\"accessibility\":{\"button_already_done\":\"Marquer l'exploration comme déjà réalisée\",\"button_confirm\":\"Valider\",\"button_come_back\":\"Fermer l'exploration\",\"button_go_back\":\"Retour\",\"button_start\":\"Lancer l'exploration\"}},\"error_page\":{\"main\":\"Erreur\",\"back\":\"Retour\",\"no_ecogesture\":\"Oups ! Nous n'avons pas trouvé l'astuce demandée.\"},\"help\":{\"title_help\":\"une question ? un problème ? une suggestion ?\",\"read_help\":\"Nous écrire via le Service d'Assistance Utilisateur\"},\"feedback\":{\"title\":\"Vous allez contacter le Service Assistance Utilisateur du Grand Lyon.\",\"text1\":\"Vous pourrez nous remonter un problème, chercher de l'aide pour vous connecter plus facilement, ou encore nous partager une bonne idée d'évolution.\",\"text2\":\"N'hésitez pas à nous écrire ! L'équipe Ecolyo vous répondra avec plaisir :)\",\"later\":\"Plus tard\",\"lets_go\":\"J'y vais\",\"accessibility\":{\"window_title\":\"Fenêtre de partage de retours\",\"button_close\":\"Fermer la fenêtre de partage de retours\"}},\"dataShare\":{\"title1\":\"Bienvenue !\",\"title1Update\":\"Ecolyo évolue !\",\"title2Update\":\"Pour continuer à utiliser Ecolyo, merci d’accepter les modalités de traitement des données ci-dessous.\",\"part1\":\"Nous avons besoin de l’adresse email utilisée lors de la création de votre Cozy Métropole de Lyon, ci-après nommé cloud personnel.\",\"part2\":\"Cette donnée de compte est conservée dans Ecolyo le temps de l’utilisation de ce service.\",\"part3\":\"La Métropole de Lyon utilisera cet email afin de vous tenir informé·e :\",\"item1\":\"En réponse à vos demandes, si vous avez pris l’initiative de nous contacter.\",\"item2\":\"En cas de problème majeur avec la gestion de votre compte.\",\"item3\":\"De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.\",\"part4\":\"Vos données privées de consommation d’énergie et d’eau sont récupérées, sauvegardées et stockées dans votre cloud personnel à votre initiative sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part5\":\"Il en est de même pour les données privées de composition du logement et du foyer, fournies par vos soins. Elles restent également sans visibilité de la Métropole de Lyon sur leur contenu.\\nLes données d’identification entrées lors de la connexion aux données de consommations d’électricité sont quant à elles conservées dans un espace sécurisé de la Métropole de Lyon et sont utilisées uniquement à des fins de contrôle du consentement par des organismes extérieurs.\",\"part6\":\"Dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées et pseudonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation, d’évaluer globalement l’usage de l’application via des mesures d’audience ainsi que d’évaluer à terme l’impact global en termes de baisse des consommations énergétiques de notre service.\",\"part7\":\"Au sein de votre cloud personnel, vous pouvez à tout moment exercer vos droits d’accès, de rectification, de portabilité, de limitation et d’opposition en consultant notamment la page Options.\",\"part8\":\"Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :\",\"part9\":\"Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 \",\"part10\":\"ou en ligne, au moyen du formulaire disponible à l'adresse suivante : \",\"link1\":\"<a href=\\\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\\\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/</a>\",\"validDataConsent\":\"Je consens au traitement de mes données tel que décrit ci-dessus.\",\"validCGU\":\"Je valide les \",\"validCGU_button\":\"Conditions Générales d’Utilisation\",\"validLegal\":\" du service et ai pris connaissance des \",\"validLegal_button\":\"Mentions Légales\",\"validLegal2\":\"de celui-ci.\",\"button_accept\":\"C'est parti !\",\"accessibility\":{\"button_accept\":\"Accepter les conditions générales d'utilisation\"}},\"minorUpdate\":{\"title\":\"Ecolyo évolue !\",\"button\":\"J'ai compris\"},\"gcu\":{\"title\":\"Conditions générales d’utilisation du service\",\"version\":\"Version du 12.12.2022\",\"content\":{\"title1\":\"Ecolyo, késako ?\",\"part1_1\":\"Ecolyo est un service proposé par la Métropole de Lyon vous permettant de suivre au même endroit vos consommations d’électricité, de gaz et d’eau, en kWh, en litres, en euros et à différentes échelles de temps. Ce service vous permet également de participer à des défis individuels et vous offre une analyse de vos consommations. Des astuces vous sont aussi proposées afin de vous permettre de réduire vos consommations.\",\"part1_2\":\"C’est un service gratuit qui prend la forme d’un site web dit « responsive », c’est-à-dire qu’il peut être consulté sur ordinateur ou sur mobile. Sur mobile, c’est une application que l’on a souhaitée ergonomique, réactive et esthétique pour votre plaisir de navigation et d’utilisation au quotidien.\",\"part1_3\":\"Tous les termes « techniques » sont définis en bas de page.\",\"title2\":\"Quelles fonctionnalités le service propose-t-il ?\",\"part2_1\":\"La fonctionnalité principale d’Ecolyo est la visualisation, au même endroit, de vos consommations d’électricité, de gaz et d’eau et ce, à différents pas de temps (de la demi-heure – uniquement pour l’électricité, à plusieurs années, en passant par les pas de temps journaliers et mensuels). La visualisation des consommations se fait en kWh pour l’énergie et en L pour l’eau ainsi qu’en euros (euros résultant d’un prix moyenné).\",\"part2_2\":\"Au-delà de la visualisation de vos consommations et parce que nous souhaitons vous aider à diminuer ces consommations vous retrouverez plusieurs autres pages : \",\"part2_2_list1\":\"Défis : Des quiz, et actions à mettre en place vous seront proposés pour vous pousser à réduire vos consommations.\",\"part2_2_list2\":\"Astuces : Une liste d’astuces pour maîtriser ses consommations d’énergie et d’eau à trier par usage, et avec une possibilité de les adapter plus précisément à votre profil.\",\"part2_2_list3\":\"Analyse : Une analyse de vos consommations réelles en comparaison à celle d’un foyer étant proche d’une vôtre.\",\"part2_3\":\"Pour la page Analyse ainsi que pour la partie personnalisation des astuces, des éléments supplémentaires sur votre profil vous seront demandés. L’ensemble de ces informations récoltées à l’aide du formulaire peuvent être modifiées par la suite.\",\"part2_4\":\"Dernière page : la page Options dans laquelle vous pourrez vous abonner à un service d’alerte sur vos consommations d’eau, de quoi ajuster votre profil ou encore vous désabonner de la lettre mensuelle.\",\"title3\":\"Comment ai-je accès à mes données d’électricité, de gaz et d’eau ?\",\"part3_1\":\"Pour visualiser vos consommations réelles et profiter pleinement du potentiel de notre service, il vous faut au minimum un des trois compteurs communicants suivants : Linky (pour l’électricité), Gazpar (pour le gaz), Téléo (pour l’eau).\",\"part3_2\":\"Ces compteurs sont opérés par les gestionnaires de réseaux. Pour Linky, c’est Enedis, le gestionnaire de réseau de distribution d’électricité. Pour Gazpar, GRDF est responsable de cette gestion. Et pour Téléo, c’est Eau Publique du Grand Lyon.\",\"part3_3\":\"Ces acteurs sont responsables de la relève de vos données. Ces données servent notamment à votre fournisseur d’électricité, de gaz ou d’eau pour permettre la facturation de vos consommations d’énergie. Des fournisseurs d’électricité ou de gaz il y en a des dizaines. Les gestionnaires de réseaux (… et de votre compteur) ne sont qu’au nombre de trois. Nous avons donc décidé de travailler avec eux, au plus près de la donnée brute issue de vos compteurs.\",\"part3_4\":\"Il vous faudra donc avoir un compte chez GRDF et Eau Publique du Grand Lyon pour accéder à vos données. Si vous n’en avez pas, il suffira de vous en créer un. Ceci ne sera à faire qu’une fois, au début.\",\"title4\":\"Ecolyo se trouve dans un cloud personnel Métropole de Lyon, qu’est-ce que cela signifie ?\",\"part4_1\":\"Comme vous avez dû le remarquer, lors de votre première connexion à Ecolyo vous avez dû vous créer un compte Cozy Métropole de Lyon. Ce cloud personnel est un espace sécurisé porté par l’ambition de vous apporter visibilité, transparence et maîtrise sur l’usage de vos données personnelles, et dont les fonctionnalités vous permettant de récupérer, synchroniser, stocker et partager vos données avec les destinataires de votre choix. Le service Ecolyo se déploie à l’intérieur de cet espace protégé. Dans ce cloud personnel, vous pourrez accéder également à d’autres services. Toutes les données traitées par Ecolyo, mais aussi les autres services que vous seriez amenés à utiliser dans ce cloud personnel restent dans ce Cloud Personnel Grand Lyon et n’en sortent pas, sauf si vous décidez vous-même de partager vos données avec des tiers.\",\"part4_2\":\"Pour en savoir plus sur ce cloud et son utilisation, ainsi que la durée de conservation de vos données, vous pouvez lire les conditions générales d’utilisation du service <a href=\\\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\\\">ici</a>.\",\"title5\":\"Et donc concrètement pour Ecolyo, quelles données sont collectées et qui y a accès ?\",\"part5_1\":\"Pour qu’Ecolyo ait accès à vos données de consommations, vous devrez activer vos différents connecteurs. À ce moment-là, pour la connexion aux données de gaz et d’eau à travers un parcours qui vous conduira de manière intuitive sur le site de chacun des gestionnaires de réseaux concerné, vous pourrez donner votre consentement à partager ces données avec le Service Ecolyo, et ce pour une durée limitée dans le temps. Pour l’électricité, le don du consentement et la connexion aux données se fait directement dans notre service. Quid de la durée de ce consentement ? Pour les données électriques, elle est par défaut d'un an. Pour les données gaz, cela sera à vous de la définir (nous vous recommandons 1 an pour une expérience optimale). Les données utilisées pour vérifier la bonne connexion de vos données d’électricité sont stockées du côté de la Métropole de Lyon sur des serveurs sécurisés.\",\"part5_2\":\"Vos connecteurs, une fois configurés, permettent le transfert de vos données de consommations au service Ecolyo. Le transfert de ces données de consommation se fait sans que personne n’accède à leur contenu, pas même la Métropole de Lyon. En effet, ces données sont stockées et traitées directement dans votre cloud personnel qui en assure la protection. Tous les calculs, analyses et traitements sur ces données sont faites DANS votre espace personnel sans visibilité sur le contenu des données par la Métropole de Lyon.\",\"part5_3\":\"Vous pouvez bien sûr mettre fin à la récupération/ au transfert de vos données de consommation sur votre espace cloud personnel à tout moment et à plusieurs niveaux : \",\"part5_3_list1\":\"Vous pouvez supprimer le transfert quotidien de vos données en supprimant tout simplement le connecteur dans la page Consos (en bas).\",\"part5_3_list2\":\"Pour supprimer l’ensemble de vos données ainsi que votre cloud personnel Métropole de Lyon, vous devez demander la suppression de votre cloud. Pour faire cela, rendez-vous dans les paramètres de votre cloud personnel via la barre blanche en haut d’Ecolyo et appuyez sur le bouton « Supprimer mon compte » dans la partie paramètres.\",\"part5_4\":\"Des données sur le profil de votre foyer peuvent être également remplies au sein de l’application. Ces données s’enrichiront au fur et à mesure de votre utilisation du service avec d’autres informations : défis réalisés, étoiles gagnées, etc. L’ensemble de ces données restent à l’intérieur de votre cloud personnel, sans que personne n’y ait accès.\",\"part5_5\":\"Enfin, afin de permettre une mise à jour quotidienne de vos données de consommations, vos identifiants Eau Publique du Grand Lyon, un jeton d’identification GRDF ainsi que vos numéros de compteurs sont stockés.\",\"title6\":\"Personne n’a donc accès à mes données, pas même la Métropole de Lyon, vraiment ?\",\"part6_1\":\"Conformément aux indications du paragraphe précédent, la Métropole de Lyon n’accède ni à vos données de consommations ni aux données utilisées via certaines fonctionnalités du service comme le formulaire (celui-là même qui permet l’analyse de vos consommations personnalisée ainsi qu’une sélection d’éco-gestes personnalisés). Toutes ces informations sont bien gardées au chaud dans votre cloud personnel Métropole de Lyon\",\"part6_2\":\"Seul vous pouvez accepter de partager vos données, documents ou fichiers privés avec la Métropole de Lyon, ses partenaires ou d’autres utilisateurs ou acteurs (publics ou privés) après recueil de votre consentement éclairé et par une action expresse de votre part.\",\"part6_3\":\"La Métropole de Lyon n'a cependant accès qu’à l’adresse email utilisée lors la création de votre cloud personnel Métropole de Lyon. Elle utilise cet email afin de vous tenir informé·e :\",\"part6_3_list1\":\"En réponse à vos demandes, si vous avez pris l’initiative de nous contacter. \",\"part6_3_list2\":\"En cas de problème majeur avec la gestion de votre compte.\",\"part6_3_list3\":\"De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.\",\"part6_4\":\"Elle stocke également les informations transmises lors de la connexion à l’électricité (nom, adresse postale). Ces informations doivent être stockées car la Métropole de Lyon est régulièrement contrôlée par Enedis et doit prouver détenir le consentement des personnes pour lesquelles elle va chercher la donnée.\",\"part6_5\":\"Par ailleurs, et dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques anonymisées nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation ainsi que d’évaluer l’impact global en termes de baisse des consommations énergétiques de notre service. Parmi ces statistiques, des mesures d’audience de la fréquentation des différentes pages du service sont réalisées. Vous pouvez, via la page Options, à tout instant, décider de vous opposer à la récupération de ces données d’utilisation.\",\"title8\":\"Encore des questions ?\",\"part8_1\":\"N’hésitez pas à consulter la FAQ ou à nous contacter via le formulaire de contact présente sur l’ensemble des pages.\",\"part8_2\":\"Dernière option, contactez-nous directement à <a href=\\\"mailto:ecolyo@grandlyon.com\\\">ecolyo(at)grandlyon.com</a>.\",\"title9\":\"LEXIQUE\",\"part9_1_title\":\"Cloud personnel Métropole de Lyon : \",\"part9_1_content\":\"Cloud personnel : appelé aussi le « domicile numérique », le cloud personnel est souvent réduit à un simple espace de stockage de documents mais il est bien plus que ça. C'est un espace individuel et sécurisé où vous pouvez accéder à des services sans exposer aucune donnée à l’extérieur. Vous seul pouvez y accéder, personne d'autre.\",\"part9_2_title\":\"Connecteur : \",\"part9_2_content\":\"Un connecteur est un service, installé dans votre cloud personnel également, qui a pour but uniquement d’aller récupérer les données auprès de différents partenaires/sources de données. Dans le cadre d’Ecolyo, trois connecteurs sont pré-installés dans votre cloud personnel : celui d’Enedis, celui de GRDF et celui d’Eau Publique du Grand Lyon.\",\"part9_3_title\":\"Compteur communicant : \",\"part9_3_content\":\"Un compteur communicant est un compteur qui mesure de manière précise et détaillée vos consommations et peut transmettre ces données au gestionnaire de réseau via une technologie radio (c'est le cas pour Gazpar et Téléo par exemple) ou via les réseaux électriques (via Courant Porteur en ligne, c'est le cas pour Linky par exemple).\",\"part9_4_title\":\"Fournisseur : \",\"part9_4_content\":\"Votre fournisseur d’électricité, de gaz ou d’eau est l’entreprise qui vous facture votre électricité, gaz ou eau. Côté électricité il en existe <a href=\\\"https://www.enedis.fr/liste-des-fournisseurs-delectricite\\\">aujourd’hui plus de 50</a>, chacun proposant des tarifs différents.\",\"part9_5_title\":\"Gestionnaire de réseau de distribution : \",\"part9_5_content\":\"Appelé aussi parfois distributeur, il est en charge de la livraison de votre électricité, gaz ou eau jusqu’à votre domicile. Il est aussi en charge du compteur qui relève vos consommations. Il transmet vos données de consommations à votre fournisseur afin qu’il effectue la facturation de vos consommations d’énergie. Il peut également les transmettre à tout acteur avec qui vous avez décidé de partager ces données.\"}},\"gcu_modal\":{\"button_accept\":\"J'accepte\",\"accessibility\":{\"window_title\":\"Conditions générales d’utilisation\",\"button_accept\":\"Accepter les conditions générales d'utilisation\"}},\"matomo\":{\"matomo_title\":\"Suivi statistiques d'usage Matomo\"},\"header\":{\"accessibility\":{\"button_back\":\"Retour à la page précédente\",\"button_open_feedbacks\":\"Ouvrir le partage de retours\"}},\"konnector_form\":{\"label_updated_at\":\"Dernière mise-à-jour le\",\"button_update\":\"Mettre à jour\",\"loading\":\"Chargement...\",\"wait_end_issue\":\"Attendre la fin de la maintenance avant de mettre à jour.\",\"button_disconnect\":\"Déconnecter\",\"issue\":\"Le problème semble venir de \",\"resolve\":\"Une mise à jour peut résoudre ce problème.\",\"login_failed\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"not_installed\":\"Le connecteur n'est pas installé. Veuillez l'installer en cliquant sur le bouton ci-dessous.\",\"button_install\":\"Installer\",\"error_account_creation\":\"Une erreur est survenue, veuillez essayer de nouveau.\",\"error_no_login_password\":\"Identifiant et mot de passe requis\",\"error_login_failed\":\"Identifiants invalides\",\"error_update\":\"Un problème est survenu lors du rapatriement de vos données.\",\"error_update_oauth\":\"Votre autorisation pour afficher vos données %{fluid} a expiré.\",\"button_oauth_reload\":\"Redonner mon consentement\",\"OK\":\"Ok\",\"konnector_delta\":{\"ELECTRICITY\":\"La donnée de consommation électrique arrive normalement à J+1. Un retard d'un ou deux jours est parfois constaté.\",\"GAS\":\"La donnée de consommation de gaz arrive normalement à J+3. Un retard d'un ou deux jours est parfois constaté.\",\"WATER\":\"La donnée de consommation d'eau arrive normalement à J+3. Un retard d'un ou deux jours est parfois constaté.\"},\"accessibility\":{\"button_install\":\"Installer le connecteur\",\"button_update\":\"Mettre à jour votre connexion\",\"button_disconnect\":\"Déconnecter votre connecteur\"}},\"konnector_options\":{\"label_connect_to_electricity\":\"Se connecter à l'électricité\",\"label_connect_to_water\":\"Se connecter à l'eau\",\"label_connect_to_gas\":\"Se connecter au gaz\",\"label_offline_electricity\":\"Électricité déconnectée\",\"label_offline_water\":\"Eau déconnectée\",\"label_offline_gas\":\"Gaz déconnecté\",\"partner_issue\":\"En maintenance\",\"outdated\":\"Données manquantes depuis %{isOutdatedData} jours\",\"accessibility\":{\"label_ko_status\":\"Connecteur en erreur\",\"button_toggle_detail_electricity\":\"Afficher ou masquer le détail de la connexion à l'électricité\",\"button_toggle_detail_water\":\"Afficher ou masquer le détail de la connexion à l'eau\",\"button_toggle_detail_gas\":\"Afficher ou masquer le détail de la connexion au gaz\"}},\"konnector_modal\":{\"loading_data\":\"Veuillez patienter, vos données sont en cours de chargement.\",\"loading_data_update\":\"Veuillez patienter, vos données sont en cours de mise à jour.\",\"logging_txt\":\"Nous vérifions vos informations d'identité\",\"success_txt\":\"Félicitations !\",\"success_data_electricity\":\"Vos données de consommation d'électricité sont maintenant connectées à Ecolyo.\",\"success_data_water\":\"Vos données de consommation d'eau sont maintenant connectées à Ecolyo.\",\"success_data_gas\":\"Vos données de consommation de gaz sont maintenant connectées à Ecolyo.\",\"success_data_additional_electricity\":\"Les données de consommations mettent entre un et deux jours pour arriver.\",\"success_data_additional_water\":\"Les données de consommations mettent entre trois et cinq jours pour arriver.\",\"success_data_additional_gas\":\"Les données de consommations mettent entre trois et cinq jours pour arriver.\",\"success_update_txt\":\"Connexion réussie !\",\"success_data_update_electricity\":\"Ecolyo est bien connecté à votre compteur d'électricité.\",\"success_data_update_water\":\"Ecolyo est bien connecté à votre compteur d'eau.\",\"success_data_update_gas\":\"Ecolyo est bien connecté à votre compteur de gaz.\",\"success_data_additional_update_electricity\":\"Sachez que la donnée de consommation d'électricité arrive entre J+1 et J+2.<br /><br />S'il vous manque encore des données, c'est qu'elles n'ont pas encore été mises à disposition par le gestionnaire de votre compteur. Merci pour votre patience !\",\"success_data_additional_update_water\":\"Sachez que la donnée de consommation d'eau arrive entre J+3 et J+5.<br /><br />S'il vous manque encore des données, c'est qu'elles n'ont pas encore été mises à disposition par le gestionnaire de votre compteur. Merci pour votre patience !\",\"success_data_additional_update_gas\":\"Sachez que la donnée de consommation de gaz arrive entre J+3 et J+5.<br /><br />S'il vous manque encore des données, c'est qu'elles n'ont pas encore été mises à disposition par le gestionnaire de votre compteur. Merci pour votre patience !\",\"error_txt\":\"Aïe !\",\"mismatch\":{\"title\":\"Vos données n'ont pas pu être récupérées.\",\"text1\":\"Vos nom et numéro de compteur ne correspondent plus. Merci de reconfigurer votre connecteur.\",\"text2\":\"Reconfigurer mon connecteur ?\",\"text3\":\"La reconfiguration de votre connecteur passe par sa suppression et sa nouvelle installation. Vos données seront conservées.\"},\"error_credentials_water\":\"Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter. L'identifiant est un numéro à 7 chiffres (différent de votre numéro de contrat).\",\"error_credentials_electricity\":\"Il semblerait que les nom(s) et adresse ne concordent pas avec le numéro de votre compteur.\",\"error_credentials_electricity_2\":\"Nous ne pouvons vous donner accès aux données de consommation.\",\"error_credentials_update_water\":\"Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter.\",\"error_credentials_update_electricity\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"error_credentials_update_gas\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"error_consent_form_gas_title\":\"L'accès à vos données a été bloqué par GRDF suite à un consentement précédemment supprimé par vos soins.\",\"error_consent_form_gas_report\":\"Merci de nous signaler le problème.\",\"error_data_electricity\":\"Un problème est survenu. Vos données de consommation d’électricité ne seront pas chargées.\",\"error_data_water\":\"Un problème est survenu. Vos données de consommation d’eau ne seront pas chargées.\",\"error_data_gas\":\"Il semblerait que le service de connexion à vos données de gaz soit momentanément en panne.\",\"error_data_update_electricity\":\"Un problème est survenu. Vos données de consommation d’électricité n’ont pas été mises à jour.\",\"error_data_update_water\":\"Un problème est survenu. Vos données de consommation d’eau n’ont pas été mises à jour.\",\"error_data_update_gas\":\"Un problème est survenu. Vos données de consommation de gaz n’ont pas été mises à jour.\",\"error_data_2\":\"Merci de réessayer plus tard.\",\"button_validate\":\"Ok\",\"button_understood\":\"J'ai compris\",\"button_try_again\":\"Réessayer\",\"button_contact\":\"Nous contacter\",\"button_check_info\":\"Vérifier les infos\",\"button_go\":\"J'y vais\",\"button_later\":\"Plus tard\",\"show_common_error\":\"Voir les erreurs récurrentes\",\"show_common_error_list\":\"<span>Le problème peut provenir des cas suivants :</span><ul><li>Vous avez un co-titulaire sur votre contrat. Veillez à bien entrer le nom du <span class=\\\"gold\\\">titulaire du contrat</span> et non le co-titulaire.</li><li> Votre nom comporte un tiret ? Tentez sans le tiret.</li><li>Entrez bien le nom de votre commune de résidence en entier (tirets et accents inclus)</li><li>Avez-vous bien entré le <span class=\\\"gold\\\">numéro de votre compteur</span> (PDL) ? Tout autre numéro (de contrat, de client) ne fonctionne pas.</li></ul><p>Si vous rencontrez toujours des difficultés, contactez notre service d'aide </p><div class=\\\"center\\\">Avez-vous pensez à vérifier ces informations ?</div>\",\"accessibility\":{\"window_title\":\"Fenêtre d'attente de connexion\",\"button_close\":\"Fermer la fenêtre\"}},\"consent_outdated\":{\"title\":{\"0\":\"Votre autorisation pour afficher vos données d’électricité a expiré\",\"2\":\"Aïe !\"},\"text1\":{\"0\":\"Veuillez re-donner votre consentement pour la transmission et la reconnexion de vos données ENEDIS à Ecolyo.\",\"2\":\"L'accès à vos données de consommation de gaz a expiré.\"},\"text2\":{\"0\":\"Souhaitez-vous renouveler votre accord dès maintenant pour un an ?\",\"2\":\"Merci de redonner votre consentement pour y accéder.\"},\"later\":\"Plus tard\",\"go\":\"J'y vais\",\"no\":\"Non\",\"yes\":\"Oui\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur, consentement expiré\",\"button_close\":\"Fermer la fenêtre\"}},\"legal\":{\"read_legal\":\"Lire les mentions légales\",\"title_legal\":\"Mentions légales & CGU\",\"version\":\"Version du 12.12.2022\",\"site\":\"Site du service Ecolyo : <a href=\\\"https://ecolyo.com/\\\"> https://ecolyo.com/</a>\",\"adress\":\"Métropole de Lyon - 20, rue du Lac – CS 33569 - 69505 Lyon cedex 03\",\"phone\":\"Tél : (33) 4 78 63 40 40\",\"mail\":\"<a href=\\\"mailto:ecolyo@grandlyon.com\\\"> ecolyo(at)grandlyon.com</a>\",\"p1b\":\"Directrice de publication : \",\"p1\":\"Blandine MELAY, Responsable du Service Transition Énergétique\",\"p2b\":\"Animation éditoriale, gestion et mise à jour : \",\"p2\":\"Marion BERTHOLON, Chargée de services numériques pour la transition énergétique\",\"p3b\":\"Photographies : \",\"p3\":\"sauf mention contraire, les photos sont la propriété de la Métropole de Lyon\",\"p4b\":\"Conception et Charte graphique : \",\"p4\":\"Florent Dufier\",\"p5b\":\"Réalisation technique : \",\"p5\":\"Métropole de Lyon, Sopra Steria\",\"p6b\":\"Maintenance technique : \",\"p6\":\"Délégation Développement économique, emploi & savoirs - Innovation numérique & systèmes d’information - Usages et services numériques - Développement des services numériques\",\"title1\":\"Crédits\",\"part1\":\"Ce site est le résultat de développements spécifiques réalisés dans les langages Go, TypeScript, HTML et Sass. Les développements s’appuient sur plusieurs bibliothèques et frameworks libres : axios, cozy-bar, cozy-client, cozy-harvest-lib, cozy-scripts, cozy-ui, d3, detect-browser, global, lodash, luxon, moment, moment-timezone, node-sass, object-hash, react, react-dom, react-redux, react-router-dom, react-swipeable-views, redux-devtools-extension, sass-loader. Les tests de l’application s’appuient sur les bibliothèques et frameworks libres suivants: jest-junit, react-test-renderer, redux-mock-store. La pile technique intègre également les applications Cozy stack, Yarn, Docker, ACH. Les déploiements sont réalisés sur le registre hébergé chez Cozy. L’équipe de réalisation utilise au quotidien les applications GitLab, IceScrum, RocketChat, SonarQube.\",\"title2\":\"Traitement des données personnelles et droit d’accès, de modification et de suppression\",\"part2\":\"Conformément à la réglementation en vigueur en matière de protection des données personnelles, le service Ecolyo a fait l’objet d’une inscription au registre des traitements de la Métropole de Lyon. Ecolyo fait partie de l’écosystème de services orientés « self data » déployés par la Métropole de Lyon avec l’ambition d’offrir aux usagers métropolitains les outils et les services leur permettant d’exercer directement leur droit à la portabilité, dans un cadre apte à garantir aussi bien la transparence et le contrôle sur l’usage de leurs données personnelles que l’exploitation directe du contenu de ces données selon leurs libres choix. Le self data est en effet selon la Fondation Internet Nouvelle Génération (FING) « la production, l’exploitation et le partage de données personnelles par les individus, sous leur contrôle et à leurs propres fins ». Au sein de cet environnement self data, la gestion des données s’appuie sur l’organisation suivante des rôles et responsabilités associées : \",\"part2-1\":\"Les partenaires du service GRDF et Eau Publique du Grand Lyon sont responsables exclusivement des seuls traitements de Données Personnelles relatifs à la collecte des données de consommation de gaz et d’eau de l’utilisateur et à leur transmission sur la plateforme de cloud personnel, après consentement de l’utilisateur.\",\"part2-2\":\"Enedis est responsable de la collecte des données de consommation d’électricité et de leur mise à disposition à la Métropole de Lyon qui, elle en gère la transmission sur la plateforme du cloud personnel de l’utilisateur, après avoir récupéré le consentement de l’utilisateur.\",\"part2-3\":\"La Métropole de Lyon est responsable de traitement sur le périmètre du service Ecolyo qu’elle propose à l’usager, ainsi que des traitements nécessaires à la fourniture de la plateforme de cloud personnel qu’elle met à disposition de l’usager pour accéder au service Ecolyo. En sa qualité de responsable de ces traitements, elle collecte et traite : \",\"part2-3-1\":\"Les données de compte de l’usager renseignées par l’usager au sein de son espace de cloud personnel Grand Lyon à des fins de gestion du compte et de communication avec l’usager ;\",\"part2-3-2\":\"Les données de compte de l’utilisateur lui permettant de connecter ses données d’électricité à Ecolyo ;\",\"part2-3-3\":\"Les données privées de consommation d’énergie et d’eau dont la récupération, la sauvegarde, le stockage, la synchronisation et le partage sur la plateforme de cloud personnel sont initiés par l’usager sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part2-3-4\":\"Les données privées sur la composition du logement et du foyer de l’utilisateur, fournies par l’utilisateur lui-même au sein du service, sont traitées par le service sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part2-3-5\":\"Des métriques d’usage du service anonymisées et remontées périodiquement afin d’améliorer la qualité du service et d’évaluer son impact (Plus d’informations sur la manière dont votre anonymat est bien préservé dans ce processus <a href=\\\"https://ecolyo.com/cloud_statistiques.html\\\">ici</a>).\",\"part2-4\":\"La Métropole réalise également des mesures d’audience à l’aide de la solution Matomo. Afin de vous fournir un meilleur service et d’améliorer votre expérience d'utilisateur, nous utilisons des solutions de mesure d’audience qui utilisent la technologie des « cookies », des fichiers texte qui sont enregistrés sur votre ordinateur et qui permettent de générer des informations envoyées aux serveurs de mesure d’audience. Sur ces serveurs, l’adresse IP est anonymisée. Les données recueillies ont uniquement pour finalité de permettre d'analyser la fréquentation de nos pages afin d'en améliorer le contenu. Il s'agit de statistiques agrégées permettant de connaître le nombre de visites et de visiteurs différents, les pages les plus populaires, les chemins préférés, les niveaux d'activité par jour de la semaine et par heure de la journée, les principales erreurs etc. Vous avez cependant le droit de vous opposer à l’utilisation de ces cookies, et donc au traitement de vos données personnelles de navigation, en vous rendant dans la page Options de notre service.\",\"part2-5\":\"L’usager est seul décisionnaire des finalités d’utilisation qu’il souhaite définir pour le traitement de ses données personnelles de consommation, à la suite de leur transmission par les partenaires du service Ecolyo sur son cloud personnel. Ainsi, dans le cadre de l’utilisation d’Ecolyo, l’usager ne recevra les données des partenaires du service : Enedis, GRDF et Eau Publique du Grand Lyon seulement qu’à sa demande expresse après la saisie de ses identifiants.\",\"part2-6\":\"L’utilisateur est donc le seul à accéder :\",\"part2-6-1\":\"À ses données de consommation d’électricité horaires, journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-6-2\":\"À ses données de consommation de gaz journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-6-3\":\"À ses données de consommation eau journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-7\":\"Les engagements et responsabilités de la Métropole de Lyon concernant la protection des données et la confidentialité des données Ecolyo sont précisés dans les Mentions légales et les conditions d’utilisation du cloud personnel Grand Lyon qui accueille aujourd’hui le service Ecolyo et sans lequel le service ne peut pas fonctionner. Pour plus d’informations sur les engagements et responsabilités de la Métropole de Lyon concernant la protection et la confidentialité dans le cloud personnel, nous vous invitons à vous référer <a href=\\\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\\\">aux mentions légales et CGU du cloud personnel métropolitain.</a> \",\"part2-8\":\"Conformément à la loi 78-17 du 6 janvier 1978 modifiée relative à l’information, aux fichiers et aux libertés, vous disposez d’un droit d’accès, de rectification et d’opposition au traitement de vos données à caractère personnel. Votre cloud personnel vous permet d’exercer ces droits directement dans cet espace sur vos données de compte. S’agissant des données de consommations d’électricité et de gaz, l’utilisateur peut supprimer son consentement à partager ses données en supprimant son connecteur dans la page Consos.\",\"part2-9\":\"Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :\",\"part2-10\":\"Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 ou en ligne, au moyen du formulaire disponible à l'adresse suivante : <a href=\\\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\\\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/.</a>\",\"part2-11\":\"L’exercice de ces droits sur vos données personnelles auprès de la Métropole de Lyon concerne exclusivement les données traitées dans le cadre du service « Ecolyo ».\",\"title3\":\"Dispositions légales\",\"part3-1\":\"Les divers éléments du site web (la forme, la mise en page, le fonds, la structure …) sont protégés par le droit des dessins et modèles, le droit d’auteur, le droit des marques ainsi que le droit à l’image et ils ne peuvent être copiés ou imités en tout ou partie sauf autorisation expresse de la Métropole de Lyon.\",\"part3-2\":\"Toute personne ne respectant pas les dispositions légales applicables se rend coupable du délit de contrefaçon et est passible des sanctions pénales prévues par la loi.\",\"title4\":\"Droits d’auteurs\",\"part4-1\":\"Les photographies, textes, logos, pictogrammes, ainsi que toutes œuvres intégrées dans le site sont la propriété de la \\\"Métropole de Lyon\\\" ou de tiers ayant autorisé la \\\"Métropole de Lyon\\\" à les utiliser.\",\"part4-2\":\"Les reproductions, les transmissions, les modifications, les réutilisations, sur un support papier ou informatique, dudit site et des œuvres qui y sont reproduites ne sont autorisées que pour un usage personnel et privé conforme aux dispositions de l’article L 122-5 du Code de la Propriété Intellectuelle. Ces reproductions devront ainsi notamment indiquer clairement la source et l’auteur du site et/ou de ces œuvres multimédias. En aucun cas ces reproductions ne sauraient porter préjudice aux droits des tiers. Les reproductions, les transmissions, les modifications, les réutilisations à des fins publicitaires, commerciales ou d’information, de tout ou partie du site, sont totalement interdites.\",\"title5\":\"Logo de la Métropole de Lyon et d’Ecolyo\",\"part5\":\"Les logos de la Métropole de Lyon et d’Ecolyo ne peuvent pas être modifiés – proportions, couleurs, éléments, constituants – et ne peuvent pas être sujet à aucune transformation, animation ou tout autre processus. Les logos de la Métropole de Lyon et d’Ecolyo ne peuvent être utilisés et associés qu’aux seules informations vérifiables. Ils ne peuvent être notamment utilisés que pour illustrer des relations avec la Métropole de Lyon ou des actions de sponsorings dûment établies. Quel que soit le cas d’espèce, la Métropole de Lyon se réserve le droit d’approuver ou de désapprouver toute utilisation des logos de la Métropole de Lyon et d’Ecolyo, pour assurer son utilisation correcte, conformément à l’éthique, la morale et aux intérêts de la Métropole de Lyon. Les conditions susmentionnées s’appliquent dans le cadre de pages web, elles ne font pas référence à l’utilisation des logos dans tout autre document. La Métropole de Lyon se réserve le droit de modifier les conditions d’utilisation des logos de la Métropole de Lyon et d’Ecolyo à tout moment et sans préavis.\",\"title6\":\"Droit des bases de données\",\"part6\":\"Les bases de données sont protégées par la loi du 1er juillet 1998 et le régime français du droit d’auteur.\",\"title7\":\"Établissements de liens vers le site Ecolyo\",\"part7-1\":\"La Métropole de Lyon autorise la mise en place d’un lien hypertexte vers son service Ecolyo pour tous les sites internet, à l’exclusion de ceux diffusant des informations à caractère polémique, pornographique, xénophobe ou pouvant, dans une plus large mesure porter atteinte à la sensibilité du plus grand nombre.\",\"part7-2\":\"Le lien doit aboutir à la page d’accueil du service (<a href=\\\"https://ecolyo.com\\\">https://ecolyo.com</a>), cette page devant apparaître dans une nouvelle fenêtre. Les pages du service Ecolyo ne doivent en aucun cas être intégrées à l’intérieur des pages d’un autre site (iframe).\",\"part7-3\":\"Dans tous les cas d’espèce, La Métropole de Lyon se réserve le droit de demander la suppression d’un lien si elle estime que le site cible ne respecte pas les règles ainsi définies.\",\"title8\":\"Liens vers des sites tiers depuis le site Ecolyo\",\"part8\":\"Les liens hypertextes mis en œuvre au sein du site en direction d’autres sites et/ou de pages personnelles et d’une manière générale vers toutes ressources existantes sur internet ne sauraient engager la responsabilité de la Métropole de Lyon quant aux liens qu’ils contiennent ou aux changements ou mises à jour qui leur sont apportés.\",\"title9\":\"Mise en garde générale\",\"part9-1\":\"Nos services mettent tout en œuvre pour offrir aux visiteurs de ce site web des informations fiables et vérifiées. Cependant, malgré tous les soins apportés, le site peut comporter des inexactitudes, des défauts de mise à jour ou des erreurs.\",\"part9-2\":\"Nous remercions les utilisateurs du site de nous faire part d’éventuelles omissions, erreurs ou corrections par mail sur la boite aux lettres du webmestre ou directement via le formulaire proposé dans le service.\",\"accessibility\":{\"button_close\":\"Fermer la fenêtre\"}},\"oauth\":{\"window\":{\"title\":\"OAuth\"}},\"onboarding\":{\"welcomeModal\":{\"title\":\"Vous êtes à mi-chemin !\",\"part1\":\"Votre cloud personnel a bien été créé.\",\"part2\":\"Il vous faut maintenant donner votre accord pour connecter vos compteurs au service.\",\"button_valid\":\"Ok\",\"accessibility\":{\"window_title\":\"Fenêtre de bienvenue\",\"button_valid\":\"Valider\"}}},\"performance_indicator\":{\"bilan\":{\"text1\":\"Par rapport à \",\"text2\":\"soit une différence de : \"},\"error_no_compare\":\"comparaison impossible\",\"error_no_compare_reason\":\"(manque de données)\",\"error_no_compare_no_data\":\"Vos consommations pour cette période sont incomplètes à cause d’un problème technique concernant :\",\"fpi\":{\"no_data\":\"Données non disponibles\",\"no_comparison\":\"Pas de comparaison possible\"}},\"profile\":{\"report\":{\"title_bilan\":\"Inscription à la lettre mensuelle\",\"switch_label_bilan\":\"Recevoir mon bilan de consommation et des conseils\",\"title_alert\":\"Alerte Consommation Excessive d'Eau\",\"switch_label_alert\":\"Être prévenu d’un dépassement anormal de ma consommation d’eau\",\"input_label_alert\":\"Si ma consommation d’eau quotidienne dépasse :\",\"input_label_subtext_alert\":\"Votre consommation quotidienne maximum sur les 6 derniers mois : \"},\"accessibility\":{\"button_toggle_mail_report\":\"Recevoir mon bilan mensuel par mail\",\"button_toggle_consumption_alert\":\"Recevoir des alertes sur mes consommations journalières\",\"input_water_alert_report\":\"Indiquer une limite de consommation d'eau journalière\"}},\"profile_type\":{\"title_profile\":\"Mes données\",\"read_profile\":\"Ajuster mon profil\",\"button_update_profile\":\"J'ajuste mon profil\",\"your_profile\":\"Mon profil\",\"multi_choices\":\"Plusieurs réponses possibles\",\"housing_type\":{\"title\":\"Logement\",\"question\":\"De quel type de logement disposez-vous ?\",\"individual_house\":\"Maison individuelle\",\"apartment\":\"Appartement\"},\"construction_year\":{\"title\":\"Construction\",\"question\":\"Quelle est son année de construction ?\",\"text_before_1948\":\"Construit avant 1948\",\"text_between_1948_and_1974\":\"Construit entre 1948 et 1974\",\"text_between_1975_and_1989\":\"Construit entre 1975 et 1989\",\"text_between_1990_and_1998\":\"Construit entre 1990 et 1998\",\"text_after_1998\":\"Construit après 1998\",\"text_unknown\":\"Construit après 1998\",\"before_1948\":\"Avant 1948\",\"between_1948_and_1974\":\"Entre 1948 et 1974\",\"between_1975_and_1989\":\"Entre 1975 et 1989\",\"between_1990_and_1998\":\"Entre 1990 et 1998\",\"after_1998\":\"Après 1998\",\"unknown\":\"Je ne sais pas\"},\"occupantsNumber\":{\"single\":\" occupant\",\"multi\":\" occupants\"},\"area\":{\"title\":\"Surface\",\"question\":\"Quelle est sa surface en m² ?\",\"name\":\" m²\"},\"occupants_number\":{\"title\":\"Nombre d'occupants\",\"question\":\"Combien il y a-t-il d'occupants ?\"},\"outside_facing_walls\":{\"1\":\"1 façade\",\"2\":\"2 façades\",\"3\":\"3 façades\",\"4\":\"4 façades\",\"title\":\"Murs extérieurs\",\"question\":\"Combien de façades donnent sur l'extérieur ?\",\"text\":{\"single\":\" façade donne sur l'extérieur\",\"multi\":\" façades donnent sur l'extérieur\"}},\"floor\":{\"title\":\"Étage\",\"question\":\"À quel étage est votre appartement ?\",\"ground_floor\":\"Au rez-de-chaussée\",\"intermediate_floor\":\"Étage intermédiaire\",\"last_floor\":\"Dernier étage\",\"not_applicable\":\"Sans objet\"},\"heating\":{\"title\":\"Chauffage\",\"question\":\"Quel est votre type de chauffage ?\",\"individual\":\"Individuel\",\"collective\":\"Collectif\"},\"individual_insulation_work\":{\"title\":\"Travaux de rénovation\",\"question\":\"Quels travaux de rénovation avez-vous réalisés ces 10 dernières années ?\",\"none\":\"Aucun\",\"roof_insulation\":\"Isolation toiture\",\"window_replacement\":\"Remplacement fenêtres\",\"wall_insulation\":\"Isolation des murs\",\"window_replacement_and_wall_insulation\":\"Remplacement fenêtres et isolation des murs\",\"window_replacement_and_roof_insulation\":\"Remplacement fenêtres et isolation toiture\",\"roof_and_wall_insulation\":\"Isolation toiture et murs\",\"window_replacement_and_roof_and_wall_insulation\":\"Remplacement fenêtre et isolation des murs et isolation toiture\",\"built_after_1998\":\"construit après 1998\"},\"facilities_installation\":{\"title\":\"Équipement\"},\"ventilation\":{\"title\":\"Ventilation double flux\",\"question\":\"Êtes-vous équipé d'une ventilation double flux ?\",\"yes\":\"Oui\",\"no\":\"Non\",\"unknown\":\"Je ne sais pas\",\"text\":\"Équipé d'une ventilation double flux\"},\"heater_replacement\":{\"title\":\"Pompe à chaleur ou poêle à bois\",\"question\":\"Au cours de ces 10 dernières années, avez-vous remplacé votre chaudière ou vous êtes-vous équipé d'une pompe à chaleur ou d'un poêle à bois ?\",\"yes\":\"Oui\",\"no\":\"Non\",\"unknown\":\"Je ne sais pas\",\"text\":\"Équipé d'une pompe à chaleur ou poêle à bois\"},\"cold_water\":{\"title\":\"Eau\",\"question\":\"Votre eau est-elle comprise dans vos charges collectives ?\",\"individual\":\"Non\",\"collective\":\"Oui\",\"individual_text\":\"Individuelle\",\"collective_text\":\"Collective\"},\"hot_water\":{\"title\":\"Eau chaude\",\"question\":\"Quel est votre type de production d’eau chaude ?\",\"individual\":\"Individuelle\",\"collective\":\"Collective\"},\"hot_water_equipment\":{\"title\":\"Eau chaude\",\"question\":\"Utilisez-vous l’un de ces équipements pour produire votre eau chaude ?\",\"solar\":\"Chauffe-eau solaire\",\"thermodynamic\":\"Chauffe-eau thermodynamique\",\"other\":\"Aucun des deux\"},\"warming_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Bois\",\"4\":\"Fioul\",\"5\":\"Autre\",\"title\":\"Source chauffage\",\"question\":\"Quelle source d’énergie principale utilisez-vous pour vous chauffer ?\",\"no_fluid_text\":\"Produit ni par de l'électricité, ni par du gaz, ni par du bois ou du fuel\",\"0_text\":\"Produit grâce à de l'électricité\",\"2_text\":\"Produit grâce au gaz\",\"3_text\":\"Produit grâce au bois\",\"4_text\":\"Produit grâce au fioul\",\"5_text\":\"Produit grâce à un autre moyen\"},\"hot_water_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Autre (Fioul, Bois)\",\"title\":\"Source eau chaude\",\"question\":\"Avec quelle source d’énergie votre eau chaude est-elle produite ?\",\"no_fluid_text\":\"Produite ni par de l'électricité, ni par du gaz\",\"0_text\":\"Produite grâce à de l'électricité\",\"2_text\":\"Produite grâce au gaz\",\"3_text\":\"Produite à partir d'un autre moyen que l'électricité ou le gaz\"},\"cooking_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"title\":\"Source cuisson\",\"question\":\"Quel mode de cuisson principal utilisez-vous ?\"},\"update_date\":{\"title\":\"Date de prise d'effet\",\"question\":\"A partir de quelle date souhaitez-vous que ce nouveau profil soit pris en compte dans l'analyse de vos données ?\"},\"fluidType\":{\"0\":\"Électricité\",\"1\":\"Eau\",\"2\":\"Gaz\"},\"form\":{\"button_previous\":\"Précédent\",\"button_next\":\"Suivant\",\"button_end\":\"Terminer\",\"button_loading\":\"Chargement...\"},\"finished\":{\"title\":\"Terminé !\",\"label1\":\"Grâce à ces informations, vous pourrez comparer votre consommation avec celle d'un foyer vous ressemblant davantage !\",\"label2\":\"Nous pourrons aussi vous proposer des astuces pour maîtriser vos consommations adaptées à votre profil.\",\"button_validate\":\"OK\"},\"accessibility\":{\"button_end\":\"Terminer la mise à jour du profil\",\"button_next\":\"Aller à la section suivante\",\"button_previous\":\"Retour à la section précédente\",\"button_update_profile\":\"Ouvrir la page de mise à jour du profil\",\"button_toggle_detail_profile\":\"Afficher ou masquer le détail du profil\",\"button_toggle_export\":\"Afficher ou masquer l'export des données'\",\"button_toggle_average_home\":\"Afficher ou masquer les informations sur le comparatif'\",\"button_validate\":\"Valider\",\"button_export_data\":\"Télécharger les données\"}},\"export\":{\"title_export\":\"Télécharger mes données\",\"text1\":\"Vous allez télécharger l'historique mensuel de vos fluides sélectionnés\",\"fluid_select\":\"Pour quel(s) fluide(s) souhaitez vous exporter vos données ?\",\"no_data\":\"Vous n'avez aucune donnée de fluide...\",\"button_download\":\"Télécharger\",\"month\":\"Mois\",\"year\":\"Année\",\"consumption\":\"Consommation\",\"maxpower\":\"Puissance max (kVA)\",\"button_close\":\"Fermer la fenêtre\",\"modal_start\":{\"accessibility_title\":\"Commencer le téléchargement\",\"text1\":\"Vous allez télécharger des données personnelles, Ecolyo n’est plus responsable de celles-ci une fois téléchargées\",\"text2\":\"Les données seront téléchargées sous forme de document excel (.xls)\",\"text3\":\"Lancer le téléchargement ?\",\"button_cancel\":\"Annuler\"},\"modal_loading\":{\"accessibility_title\":\"Téléchargement en cours\",\"text1\":\"Données en cours de téléchargement\",\"text2\":\"Veuillez ne pas quitter l’application pendant la récupération et le téléchargement de vos données\",\"button_cancel\":\"Annuler le téléchargement\"},\"modal_done\":{\"accessibility_title\":\"Téléchargement terminé\",\"text1\":\"Vos données ont bien été téléchargées !\",\"text2\":\"Vous pouvez maintenant retrouver l’historique de vos données sur votre appareil\",\"error1\":\"Aïe !\",\"error2\":\"Il semblerait qu’une erreur se soit produite lors du téléchargement de vos données.\",\"button_close\":\"Fermer\",\"button_close_error\":\"Revenir plus tard\"}},\"quiz\":{\"explanation\":\"Répondez correctement aux 5 questions et remportez 5 des 15 étoiles nécessaires pour débloquer le duel final\",\"score_final\":\"SCORE FINAL\",\"correct\":\"Bravo !\",\"wrong\":\"Raté !\",\"rightAnswer\":\"Bonne réponse :\",\"earn\":\"Vous remportez\",\"button_go_back\":\"Retour\",\"button_end_quiz\":\"Youpi !\",\"button_try_again\":\"Réessayer\",\"button_validate\":\"Valider\",\"next\":\"Suivant\",\"consumption_question\":\"Question sur votre consommation\",\"accessibility\":{\"window_quit\":\"Quitter la fenêtre\",\"window_title\":\"Fenêtre de résultat\",\"button_end_quiz\":\"Terminer le quiz\",\"button_go_back\":\"Retour\",\"button_go_next\":\"Suivant\",\"button_try_again\":\"Relancer le quiz\",\"button_validate\":\"Valider\"}},\"splashscreen\":{\"error_loading\":\"Une erreur est survenue\",\"button_reload\":\"Réessayer\",\"accessibility\":{\"button_reload\":\"Recharger la page\"},\"migration_error\":\"Mise à jour de l'application\",\"consent_error\":\"Vérification de vos consentements pour partager vos données avec Ecolyo\",\"profile_error\":\"Chargement de votre profil utilisateur\",\"profileType_error\":\"Chargement de votre profil de consommation.\",\"challenges_error\":\"Actualisation de votre progression dans les défis\",\"analysis_error\":\"Chargement de votre analyse mensuelle\",\"index_error\":\"Chargement des index\",\"prices_error\":\"Mise à jour des prix\",\"consos_error\":\"Connexion à vos données de consommation\",\"partners_error\":\"Récupération de l'état des services partenaires\",\"unknown_error\":\"Veuillez vérifier votre connexion internet\",\"network_error\":\"Erreur de réseau\",\"step\":{\"0\":\"Mise à jour de l'application\",\"1\":\"Vérification de vos consentements pour partager vos données avec Ecolyo\",\"2\":\"Chargement de votre profil\",\"3\":\"Actualisation de votre progression dans les défis\",\"4\":\"Mise à jour des prix\",\"5\":\"Connexion à vos données de consommation\"}},\"timestep\":{\"today\":\"Aujourd'hui\",\"year\":{\"period\":\"5 ans\",\"comparelabel\":\"Comparer à l'année précédente\"},\"month\":{\"period\":\"Année\",\"comparelabel\":\"Comparer à l'année précédente\",\"current\":\"année actuelle\",\"last\":\"année précédente\"},\"day\":{\"period\":\"Mois\",\"comparelabel\":\"Comparer au mois précédent\",\"current\":\"mois actuel\",\"last\":\"mois précédent\"},\"week\":{\"period\":\"Semaine\",\"comparelabel\":\"Comparer à la semaine précédente\",\"current\":\"semaine actuelle\",\"last\":\"semaine précédente\"},\"half_an_hour\":{\"period\":\"Jour\",\"comparelabel\":\"Comparer à la journée précédente\",\"gather_data_title\":\"La récupération de vos données demi-horaires prend environ 24h.\",\"current\":\"jour actuel\",\"last\":\"jour précédent\",\"gather_data_subtitle\":\"Votre connexion a bien été prise en compte mais un délai de 24h est en général nécessaire à l’obtention de vos données.\\nÀ demain !\",\"gather_data_failure\":\"Il semblerait que votre compteur ne nous permette pas d'accéder à des données de consommation plus fines.\",\"analysis_waiting_data\":\"Pour bénéficier d'une analyse approfondie de votre consommation électrique, il nous faut récupérer vos données de consommation horaires. La récupération de ces données prend environ 24h. A bientôt !\"},\"accessibility\":{\"button_zoom_in\":\"Sélectionner le pas de temps précédent\",\"button_zoom_out\":\"Sélectionner le pas de temps suivant\"}},\"unsubscribe\":{\"error\":\"Une erreur est survenue lors de votre désinscription, merci de ré-essayer plus tard.\",\"unsubscribed\":\"Vous êtes désormais désabonné de la newsletter Ecolyo\",\"subscribed\":\"Vous êtes désormais à nouveau abonné à la newsletter Ecolyo\",\"content\":\"Vous ne recevrez plus la notification de votre bilan ainsi que les conseils associés au mois en cours.\",\"button_subscribe\":\"Me ré-abonner\",\"button_home\":\"Me connecter à Ecolyo\",\"button_accessibility\":\"Bouton de désinscription\"},\"welcome_modal\":{\"title\":\"Félicitations\",\"perso\":\"Votre espace personnel a bien été créé.\",\"connect\":\"Vous pouvez maintenant connecter vos compteurs d’énergie à Ecolyo en toute sécurité.\",\"button_valid\":\"Ok\",\"accessibility\":{\"title\":\"Fenêtre de félicitations\",\"button_valid\":\"Valider\"}}}"); /***/ }), @@ -11390,7 +11468,7 @@ exports.ENEDIS_DAY_DOCTYPE = ENEDIS_DAY_DOCTYPE; exports = module.exports = __webpack_require__("DjJv")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\nheader {\n display: flex;\n align-items: center;\n flex-direction: column;\n overflow: hidden;\n width: 85%;\n z-index: 18;\n position: fixed;\n top: 48px;\n}\n@media only screen and (max-width : 1023px) {\n header {\n width: 100%;\n }\n}\n@media only screen and (max-width : 768px) {\n header {\n top: 0;\n }\n}\nheader .header-top {\n background: radial-gradient(51.85% 47.89% at 50% 13.32%, #343641 0%, #1b1c22 100%);\n width: 100%;\n}\nheader .header-top .header-text {\n padding: 0 1rem 1rem 1rem;\n color: #e0e0e0;\n}\nheader .header-content {\n display: flex;\n flex-direction: column;\n}\n@media only screen and (max-width : 1023px) {\n header .header-content {\n margin: 0;\n }\n}\n@media only screen and (max-width : 768px) {\n header .header-content {\n margin: 60px 0 0 0;\n }\n}\nheader .header-content .header-content-top {\n display: flex;\n flex-direction: row;\n}\nheader .header-content .header-content-top.header-content-top-right {\n justify-content: flex-end;\n}\nheader .header-content .header-content-top .header-text {\n padding: 2rem 1rem;\n flex: 1;\n}\nheader .header-content .header-content-top .header-text-desktop {\n display: flex;\n flex: 1;\n padding: 2rem 1.25rem;\n color: #e0e0e0;\n}\nheader .header-content .header-content-top .header-back-button {\n padding: 0 0.75rem;\n}\n@media only screen and (max-width : 768px) {\n header .header-content .header-content-top .header-text {\n padding: 0 1rem 1rem 1rem;\n color: #e0e0e0;\n }\n header .header-content .header-content-top .header-text-desktop {\n display: none;\n }\n header .header-content .header-content-top .header-feedbacks-button {\n display: none;\n }\n}\n\n.building-title {\n text-align: center;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\nheader {\n display: flex;\n align-items: center;\n flex-direction: column;\n overflow: hidden;\n width: 85%;\n z-index: 18;\n position: fixed;\n top: 48px;\n}\n@media only screen and (max-width : 1023px) {\n header {\n width: 100%;\n }\n}\n@media only screen and (max-width : 768px) {\n header {\n top: 0;\n }\n}\nheader .header-top {\n background: radial-gradient(51.85% 47.89% at 50% 13.32%, #343641 0%, #1b1c22 100%);\n width: 100%;\n}\nheader .header-top .header-text {\n padding: 0 1rem 1rem 1rem;\n color: #e0e0e0;\n}\nheader .header-content {\n display: flex;\n flex-direction: column;\n}\n@media only screen and (max-width : 1023px) {\n header .header-content {\n margin: 0;\n }\n}\n@media only screen and (max-width : 768px) {\n header .header-content {\n margin: 60px 0 0 0;\n }\n}\nheader .header-content .header-content-top {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n}\nheader .header-content .header-content-top .header-text {\n flex: 1;\n padding: 0 1rem 1rem 1rem;\n color: #e0e0e0;\n text-align: center;\n}\nheader .header-content .header-content-top .header-text-desktop {\n display: flex;\n flex: 1;\n padding: 2rem 1.25rem;\n color: #e0e0e0;\n justify-content: center;\n text-align: center;\n margin-left: 64px;\n}\nheader .header-content .header-content-top .header-text-selection {\n display: flex;\n flex: 1;\n padding: 2rem 1.25rem;\n color: #e0e0e0;\n justify-content: center;\n text-align: center;\n margin-left: 24px;\n}\n@media only screen and (max-width : 768px) {\n header .header-content .header-content-top .header-text-selection {\n display: none;\n }\n}\nheader .header-content .header-content-top .header-back-button,\nheader .header-content .header-content-top .header-feedbacks-button {\n padding: 0 0.75rem;\n}\n@media only screen and (max-width : 768px) {\n header .header-content .header-content-top .header-text-desktop {\n display: none;\n }\n header .header-content .header-content-top .header-feedbacks-button {\n display: none;\n }\n}\n\n.building-title {\n text-align: center;\n}", ""]); @@ -11894,8 +11972,8 @@ var _Button = _interopRequireDefault(__webpack_require__("49+2")); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _challengeWon = _interopRequireDefault(__webpack_require__("LESD")); var _default2 = _interopRequireDefault(__webpack_require__("ru60")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _utils = __webpack_require__("RgLR"); __webpack_require__("F7b+"); @@ -11964,11 +12042,11 @@ var DuelResultModal = function DuelResultModal(_ref) { className: "duel-result-modal-root" }, /*#__PURE__*/_react.default.createElement("div", { className: "imgResultContainer" - }, win && /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, win && /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { className: "challengeWon", icon: _challengeWon.default, size: 300 - }), /*#__PURE__*/_react.default.createElement(_Icon.default, { + }), /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { className: "imgResult", icon: win ? winIcon : lossIcon, size: 180 @@ -13075,7 +13153,6 @@ var ChallengeService = /*#__PURE__*/function () { /** * Retrieve the dataload for a UserChallenge with duel ongoing * @param {UserChallenge} userChallenge - userChallenge to update - * @param {UserChallengeUpdateFlag} flag - update flag */ }, { key: "getUserChallengeDataload", @@ -13098,7 +13175,12 @@ var ChallengeService = /*#__PURE__*/function () { }) }; _context14.next = 5; - return consumptionService.getGraphData(timePeriod, _enums.TimeStep.DAY, userChallenge.duel.fluidTypes, undefined, undefined, true); + return consumptionService.getGraphData({ + timePeriod: timePeriod, + timeStep: _enums.TimeStep.DAY, + fluidTypes: userChallenge.duel.fluidTypes, + isHome: true + }); case 5: dataChart = _context14.sent; if (!dataChart) { @@ -13185,6 +13267,17 @@ var ChallengeService = /*#__PURE__*/function () { }(); exports.default = ChallengeService; +/***/ }), + +/***/ "JBZ6": +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__("DjJv")(false); +// Module +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.eg-init-modal {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n.eg-init-modal .title {\n text-align: center;\n color: #e3b82a;\n}\n.eg-init-modal .buttons-container {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}", ""]); + + + /***/ }), /***/ "JH0I": @@ -14096,63 +14189,6 @@ exports.DUEL_DOCTYPE = DUEL_DOCTYPE; /***/ }), -/***/ "Kltg": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _interopRequireDefault = __webpack_require__("jm00"); -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; -var _core = __webpack_require__("rMFn"); -var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); -var _close = _interopRequireDefault(__webpack_require__("lCJQ")); -var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); -var _react = _interopRequireDefault(__webpack_require__("ivGQ")); -__webpack_require__("hD6F"); -var EcogestureLaunchFormModal = function EcogestureLaunchFormModal(_ref) { - var open = _ref.open, - handleCloseClick = _ref.handleCloseClick; - var _useI18n = (0, _I18n.useI18n)(), - t = _useI18n.t; - return /*#__PURE__*/_react.default.createElement(_Dialog.default, { - open: open, - onClose: handleCloseClick, - "aria-labelledby": "accessibility-title", - classes: { - root: 'modal-root', - paper: 'modal-paper' - } - }, /*#__PURE__*/_react.default.createElement("div", { - id: "accessibility-title" - }, t('feedback.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('feedback.accessibility.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { - icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { - className: "eg-init-modal" - }, /*#__PURE__*/_react.default.createElement("div", { - className: "title text-20-bold" - }, t('ecogesture.initModal.title')), /*#__PURE__*/_react.default.createElement("div", { - className: "text-16-normal" - }, t('ecogesture.initModal.launchForm')), /*#__PURE__*/_react.default.createElement(_core.Button, { - "aria-label": t('ecogesture.initModal.btn2'), - onClick: handleCloseClick, - className: "btnPrimary" - }, t('ecogesture.initModal.btn2')))); -}; -var _default = EcogestureLaunchFormModal; -exports.default = _default; - -/***/ }), - /***/ "Kp3f": /***/ (function(module, exports, __webpack_require__) { @@ -14913,9 +14949,9 @@ var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _GCUContent = _interopRequireDefault(__webpack_require__("Tsab")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); __webpack_require__("3nih"); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var CGUModal = function CGUModal(_ref) { var open = _ref.open, handleCloseClick = _ref.handleCloseClick; @@ -14931,14 +14967,12 @@ var CGUModal = function CGUModal(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, t('feedback.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('feedback.accessibility.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('feedback.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement(_GCUContent.default, null), /*#__PURE__*/_react.default.createElement(_core.Button, { + onClick: handleCloseClick, + "aria-label": t('feedback.accessibility.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement(_GCUContent.default, null), /*#__PURE__*/_react.default.createElement(_core.Button, { "aria-label": t('gcu_modal.accessibility.button_accept'), onClick: handleCloseClick, className: "btnPrimary" @@ -15777,7 +15811,7 @@ var QuizService = /*#__PURE__*/function () { key: "getCustomQuestion", value: function () { var _getCustomQuestion = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(customQuestionEntity, fluidTypes) { - var answers, explanation, finalInterval, useFluidTypes, questionLabel, unit, unitLabel, fluidLabel, intervalAsnwer, consumptionService, maxLoad, averageLoad, finalQuestion; + var answers, explanation, finalInterval, useFluidTypes, questionLabel, unit, unitLabel, fluidLabel, intervalAnswer, consumptionService, maxLoad, averageLoad, finalQuestion; return _regenerator.default.wrap(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { @@ -15814,8 +15848,8 @@ var QuizService = /*#__PURE__*/function () { _context8.next = 9; return this.getMaxLoadOnLastInterval(customQuestionEntity.timeStep, finalInterval, useFluidTypes); case 9: - intervalAsnwer = _context8.sent; - answers = this.getAnswersForInterval(intervalAsnwer.date, customQuestionEntity.timeStep, finalInterval); + intervalAnswer = _context8.sent; + answers = this.getAnswersForInterval(intervalAnswer.date, customQuestionEntity.timeStep, finalInterval); _context8.next = 26; break; case 13: @@ -15826,7 +15860,12 @@ var QuizService = /*#__PURE__*/function () { // Max data consumptionService = new _consumption.default(this._client); _context8.next = 17; - return consumptionService.getMaxLoad(finalInterval, customQuestionEntity.timeStep, useFluidTypes, undefined, !customQuestionEntity.singleFluid); + return consumptionService.getMaxLoad({ + maxTimePeriod: finalInterval, + timeStep: customQuestionEntity.timeStep, + fluidTypes: useFluidTypes, + isHome: !customQuestionEntity.singleFluid + }); case 17: maxLoad = _context8.sent; maxLoad = maxLoad === null ? 0 : maxLoad; @@ -15912,7 +15951,7 @@ var QuizService = /*#__PURE__*/function () { }, { key: "getMaxLoadOnLastInterval", value: function () { - var _getMaxLoadOnLastInterval = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9(timeStep, interval, fluidType) { + var _getMaxLoadOnLastInterval = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9(timeStep, interval, fluidTypes) { var _graphData; var dateMax, max, consumptionService, limit, graphData, _graphData4, newInterval, objectTimeStep, _graphData2, _graphData3, _newInterval; return _regenerator.default.wrap(function _callee9$(_context9) { @@ -15929,7 +15968,11 @@ var QuizService = /*#__PURE__*/function () { reached: false }; _context9.next = 6; - return consumptionService.getGraphData(interval, timeStep, fluidType); + return consumptionService.getGraphData({ + timePeriod: interval, + timeStep: timeStep, + fluidTypes: fluidTypes + }); case 6: graphData = _context9.sent; if (!((_graphData = graphData) !== null && _graphData !== void 0 && _graphData.actualData)) { @@ -15966,7 +16009,11 @@ var QuizService = /*#__PURE__*/function () { newInterval.endDate = newInterval.endDate.minus(objectTimeStep); limit.date = newInterval.startDate; _context9.next = 24; - return consumptionService.getGraphData(newInterval, timeStep, fluidType); + return consumptionService.getGraphData({ + timePeriod: newInterval, + timeStep: timeStep, + fluidTypes: fluidTypes + }); case 24: graphData = _context9.sent; if (limit.date < _luxon.DateTime.now().minus({ @@ -16000,7 +16047,11 @@ var QuizService = /*#__PURE__*/function () { }).startOf('month') }; _context9.next = 32; - return consumptionService.getGraphData(_newInterval, timeStep, fluidType); + return consumptionService.getGraphData({ + timePeriod: _newInterval, + timeStep: timeStep, + fluidTypes: fluidTypes + }); case 32: graphData = _context9.sent; case 33: @@ -16035,16 +16086,21 @@ var QuizService = /*#__PURE__*/function () { }, { key: "getAverageOnGivenPeriod", value: function () { - var _getAverageOnGivenPeriod = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10(timeStep, interval, fluidType, weekday, singleFluid) { + var _getAverageOnGivenPeriod = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10(timeStep, interval, fluidTypes, weekday, singleFluid) { var consumptionService, graphData, average, total, length; return _regenerator.default.wrap(function _callee10$(_context10) { while (1) { switch (_context10.prev = _context10.next) { case 0: consumptionService = new _consumption.default(this._client); - _logger.default.info('GetAverageOnGivenPeriod is about to call getgraphdata'); + _logger.default.info('GetAverageOnGivenPeriod is about to call getGraphData'); _context10.next = 4; - return consumptionService.getGraphData(interval, timeStep, fluidType, undefined, undefined, !singleFluid); + return consumptionService.getGraphData({ + timePeriod: interval, + timeStep: timeStep, + fluidTypes: fluidTypes, + isHome: !singleFluid + }); case 4: graphData = _context10.sent; average = 0; @@ -16206,7 +16262,7 @@ exports.formatListWithAnd = exports.allFluids = void 0; exports.formatNumberValues = formatNumberValues; exports.getChallengeTitleWithLineReturn = exports.formatTwoDigits = exports.formatOffPeakHours = void 0; exports.getFluidName = getFluidName; -exports.getFluidTypeTranslation = void 0; +exports.getFluidUnit = exports.getFluidTypeTranslation = void 0; exports.getKonnectorSlug = getKonnectorSlug; exports.getKonnectorUpdateError = getKonnectorUpdateError; exports.getPartnerKey = exports.getMonthNameWithPrep = exports.getMonthName = exports.getMonthFullName = void 0; @@ -16654,6 +16710,20 @@ var roundOffPeakHours = function roundOffPeakHours(offPeakHours) { }); }; exports.roundOffPeakHours = roundOffPeakHours; +var getFluidUnit = function getFluidUnit(fluidType) { + switch (fluidType) { + case _enums.FluidType.ELECTRICITY: + case _enums.FluidType.GAS: + return 'kWh'; + case _enums.FluidType.WATER: + return 'L'; + case _enums.FluidType.MULTIFLUID: + return '€'; + default: + throw new Error('unknown fluidtype'); + } +}; +exports.getFluidUnit = getFluidUnit; /***/ }), @@ -17392,7 +17462,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.App = void 0; -var _core = __webpack_require__("rMFn"); var _Navbar = _interopRequireDefault(__webpack_require__("9A+l")); var _Routes = _interopRequireDefault(__webpack_require__("ZKTt")); var _SplashRoot = _interopRequireDefault(__webpack_require__("HAm2")); @@ -17403,11 +17472,12 @@ var _Layout = __webpack_require__("mPFK"); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _reactRouterDom = __webpack_require__("Iyno"); var _hooks = __webpack_require__("6FOS"); -var _theme = __webpack_require__("tHDY"); +var _usePageTitle = _interopRequireDefault(__webpack_require__("hmgo")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } var App = function App(_ref) { var tracker = _ref.tracker; + (0, _usePageTitle.default)(); var location = (0, _reactRouterDom.useLocation)(); var _useAppSelector = (0, _hooks.useAppSelector)(function (state) { return state.ecolyo; @@ -17426,15 +17496,13 @@ var App = function App(_ref) { topTheme: 'light' }); }, [webviewIntent]); - return /*#__PURE__*/_react.default.createElement(_Layout.Layout, null, /*#__PURE__*/_react.default.createElement(_core.ThemeProvider, { - theme: _theme.theme - }, /*#__PURE__*/_react.default.createElement(_SplashRoot.default, null, termsStatus.accepted && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_WelcomeModal.default, { + return /*#__PURE__*/_react.default.createElement(_Layout.Layout, null, /*#__PURE__*/_react.default.createElement(_SplashRoot.default, null, termsStatus.accepted && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_WelcomeModal.default, { open: !onboarding.isWelcomeSeen }), /*#__PURE__*/_react.default.createElement(_Navbar.default, null)), /*#__PURE__*/_react.default.createElement("main", { className: "app-content" }, /*#__PURE__*/_react.default.createElement(_Routes.default, { termsStatus: termsStatus - }))), false ? /*#__PURE__*/undefined : null)); + }))), false ? /*#__PURE__*/undefined : null); }; exports.App = App; var _default = App; @@ -17453,13 +17521,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var _core = __webpack_require__("rMFn"); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _star = _interopRequireDefault(__webpack_require__("J51z")); var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); __webpack_require__("Xmo1"); var LastDuelModal = function LastDuelModal(_ref) { @@ -17479,13 +17546,12 @@ var LastDuelModal = function LastDuelModal(_ref) { id: "accessibility-title" }, t('last_duel_modal.title')), /*#__PURE__*/_react.default.createElement("div", { className: "duel-last-modal-root" - }, /*#__PURE__*/_react.default.createElement(_core.IconButton, { - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { - size: 16, - icon: _close.default - })), /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { + icon: _close.default, + onClick: handleCloseClick, + "aria-label": t('last_duel_modal.close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { className: "icon", icon: _star.default, size: 48 @@ -17518,9 +17584,9 @@ exports.default = void 0; var _regenerator = _interopRequireDefault(__webpack_require__("hJxD")); var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("HZZ/")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); __webpack_require__("xY34"); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _utils = __webpack_require__("RgLR"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } @@ -17569,7 +17635,7 @@ var EquipmentIcon = function EquipmentIcon(_ref) { }, [equipment]); return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", { className: "equipment-icon-container ".concat(isChecked ? 'checked' : '') - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: icon, size: 40, className: "equipmentIcon " @@ -17984,7 +18050,7 @@ var ConverterService = /*#__PURE__*/function () { if (fluidType === _enums.FluidType.MULTIFLUID) { convertedLoad = load; } else { - convertedLoad = this.applyPrice(this._fluidConfig[fluidType], load, price); + convertedLoad = this.computePrice(this._fluidConfig[fluidType], load, price); } // Prevent round 0 case when the actual value is not 0 @@ -17995,19 +18061,17 @@ var ConverterService = /*#__PURE__*/function () { } /** - * Return calculated price + * Compute calculated price + * If a price is provided, return the price * @param {FluidConfig} fluidConfig - Fluid configuration * @param {number} load - Load value * @param {number} [price] - Price if exist */ }, { - key: "applyPrice", - value: function applyPrice(fluidConfig, load, price) { - if (price) { - return price; - } else { - return load * fluidConfig.coefficient; - } + key: "computePrice", + value: function computePrice(fluidConfig, load, price) { + if (price) return price; + return load * fluidConfig.coefficient; } }]); return ConverterService; @@ -18357,8 +18421,8 @@ var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); var _Button = _interopRequireDefault(__webpack_require__("49+2")); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _default2 = _interopRequireDefault(__webpack_require__("ru60")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _utils = __webpack_require__("RgLR"); __webpack_require__("xRdB"); @@ -18412,7 +18476,7 @@ var DuelEmptyValueModal = function DuelEmptyValueModal(_ref) { id: "accessibility-title" }, t('duel_empty_value_modal.accessibility.window_title')), /*#__PURE__*/_react.default.createElement("div", { className: "modal-empty-value-root" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { className: "imgResult", icon: emptyIcon, size: 208 @@ -19203,8 +19267,8 @@ var _Button = _interopRequireDefault(__webpack_require__("49+2")); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _correctAnswer = _interopRequireDefault(__webpack_require__("JsSj")); var _wrongAnswer = _interopRequireDefault(__webpack_require__("z1ms")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); __webpack_require__("27bp"); var QuizExplanationModal = function QuizExplanationModal(_ref) { @@ -19230,12 +19294,12 @@ var QuizExplanationModal = function QuizExplanationModal(_ref) { id: "accessibility-title" }, t('quiz.accessibility.window_title')), /*#__PURE__*/_react.default.createElement("div", { className: "quiz-modal-root" - }, question && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, question.answers[answerIndex].isTrue ? /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, question && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, question.answers[answerIndex].isTrue ? /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _correctAnswer.default, size: 100 }), /*#__PURE__*/_react.default.createElement("p", { className: "quiz-modal-answer correct" - }, t('quiz.correct'))) : /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('quiz.correct'))) : /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _wrongAnswer.default, size: 100 }), /*#__PURE__*/_react.default.createElement("p", { @@ -19272,13 +19336,12 @@ var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); var _core = __webpack_require__("rMFn"); var _Button = _interopRequireDefault(__webpack_require__("49+2")); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); -var _IconButton = _interopRequireDefault(__webpack_require__("x0Kp")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _default2 = _interopRequireDefault(__webpack_require__("Suxz")); var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _useExploration3 = _interopRequireDefault(__webpack_require__("CRx8")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _hooks = __webpack_require__("6FOS"); var _picto = __webpack_require__("4NCG"); @@ -19352,14 +19415,12 @@ var EcogestureModal = function EcogestureModal(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, isAction ? t('ecogesture_modal.accessibility.window_title_action') : t('ecogesture_modal.accessibility.window_title_ecogesture')), /*#__PURE__*/_react.default.createElement(_IconButton.default, { - "aria-label": t('ecogesture_modal.accessibility.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, isAction ? t('ecogesture_modal.accessibility.window_title_action') : t('ecogesture_modal.accessibility.window_title_ecogesture')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { + onClick: handleCloseClick, + "aria-label": t('ecogesture_modal.accessibility.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "em-header text-14-normal-uppercase" }, isAction ? t('ecogesture_modal.title_action') : t('ecogesture_modal.title_ecogesture')), /*#__PURE__*/_react.default.createElement("div", { className: "em-root ecogesture-modal" @@ -20499,6 +20560,8 @@ var EcogestureFormEquipment = function EcogestureFormEquipment(_ref) { }, t("ecogesture_profile.".concat(_enums.EcogestureStepForm[_enums.EcogestureStepForm.EQUIPMENTS].toLowerCase(), ".question"))), /*#__PURE__*/_react.default.createElement("div", { className: "equipment-hint text-16-normal" }, t("ecogesture_profile.".concat(_enums.EcogestureStepForm[_enums.EcogestureStepForm.EQUIPMENTS].toLowerCase(), ".hint"))), /*#__PURE__*/_react.default.createElement("div", { + role: "list", + "aria-label": t('ecogesture_profile.equipments.accessible_label'), className: "icons-container" }, Object.values(_enums.EquipmentType).map(function (equipment) { return /*#__PURE__*/_react.default.createElement(_core.IconButton, { @@ -20510,7 +20573,8 @@ var EcogestureFormEquipment = function EcogestureFormEquipment(_ref) { return handleChange(equipment); }, className: "checkbox-equipment", - "aria-label": t('ecogesture_profile.equipments.accessible_label') + role: "listitem", + "aria-label": "".concat(t("ecogesture_profile.equipments.".concat(equipment.toLocaleLowerCase()))) }, /*#__PURE__*/_react.default.createElement(_EquipmentIcon.default, { equipment: equipment, isChecked: answer.includes(equipment) @@ -21101,10 +21165,11 @@ var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("HZZ/")); var _core = __webpack_require__("rMFn"); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _partners_consent = _interopRequireDefault(__webpack_require__("Sdda")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _useUserInstanceSettings = _interopRequireDefault(__webpack_require__("PVlC")); var _cozyClient = __webpack_require__("xEu0"); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _environment = _interopRequireDefault(__webpack_require__("/VA8")); var _mail = _interopRequireDefault(__webpack_require__("9Qps")); @@ -21184,14 +21249,12 @@ var WelcomeModal = function WelcomeModal(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, t('onboarding.welcomeModal.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('onboarding.welcomeModal.accessibility.button_valid'), - className: "modal-paper-close-button", - onClick: setWelcomeModalViewed - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('onboarding.welcomeModal.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { + onClick: setWelcomeModalViewed, + "aria-label": t('onboarding.welcomeModal.accessibility.button_valid'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "info" }, /*#__PURE__*/_react.default.createElement("h1", { className: "info-header text-24-bold" @@ -21199,7 +21262,7 @@ var WelcomeModal = function WelcomeModal(_ref) { className: "info-content text-16-normal" }, /*#__PURE__*/_react.default.createElement("p", null, t('onboarding.welcomeModal.part1')), /*#__PURE__*/_react.default.createElement("p", null, t('onboarding.welcomeModal.part2'))), /*#__PURE__*/_react.default.createElement("div", { className: "info-footer" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _partners_consent.default, size: 191 }), /*#__PURE__*/_react.default.createElement(_core.Button, { @@ -22662,7 +22725,7 @@ exports.default = ExplorationService; exports = module.exports = __webpack_require__("DjJv")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.eg-selection-detail-container {\n display: flex;\n flex-direction: column;\n text-align: center;\n color: #e0e0e0;\n padding: 0 1.5rem;\n flex: 1;\n max-height: calc(100vh - 60px - 72px - 0px);\n}\n.eg-selection-detail-container .content {\n display: flex;\n gap: 0.5rem;\n flex-direction: column;\n flex: 1;\n justify-content: flex-start;\n align-items: center;\n overflow-y: auto;\n}\n.eg-selection-detail-container .content .title {\n color: #a0a0a0;\n font-weight: 700;\n}\n.eg-selection-detail-container .content .iconContainer {\n height: 240px;\n}\n.eg-selection-detail-container .content .showMore {\n text-align: center;\n text-decoration: underline;\n margin-top: 1rem;\n cursor: pointer;\n}\n.eg-selection-detail-container .content .longDescription {\n margin: 1rem 0.5rem;\n text-align: left;\n}\n.eg-selection-detail-container .buttons {\n margin: 1rem 0;\n display: flex;\n gap: 0.5rem;\n flex-direction: row;\n justify-content: center;\n width: 100%;\n}\n.eg-selection-detail-container .buttons button.btnSecondary {\n padding: 0.75rem 0.25rem;\n height: 7.375rem;\n border-radius: 4px;\n}\n.eg-selection-detail-container .buttons button.btnSecondary span {\n flex-direction: column;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.eg-selection-detail-container {\n display: flex;\n flex-direction: column;\n text-align: center;\n color: #e0e0e0;\n padding: 0 1.5rem;\n flex: 1;\n max-height: calc(100vh - 60px - 72px - 0px);\n}\n.eg-selection-detail-container .content {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n justify-content: center;\n align-items: center;\n overflow-y: auto;\n flex: 1;\n}\n.eg-selection-detail-container .content .title {\n color: #a0a0a0;\n font-weight: 700;\n}\n.eg-selection-detail-container .content .iconContainer {\n height: 240px;\n}\n.eg-selection-detail-container .content .showMore {\n text-align: center;\n text-decoration: underline;\n margin-top: 1rem;\n cursor: pointer;\n flex-shrink: 0;\n}\n.eg-selection-detail-container .content .longDescription {\n margin: 1rem 0.5rem;\n text-align: left;\n display: none;\n transition: height 0.3s ease-in-out;\n}\n.eg-selection-detail-container .content .longDescription.expanded {\n display: block;\n}\n.eg-selection-detail-container .buttons {\n margin: 1rem 0;\n display: flex;\n gap: 0.5rem;\n flex-direction: row;\n justify-content: center;\n width: 100%;\n}\n.eg-selection-detail-container .buttons button.btnSecondary {\n padding: 0.75rem 0.25rem;\n height: 7.375rem;\n border-radius: 4px;\n}\n.eg-selection-detail-container .buttons button.btnSecondary span {\n flex-direction: column;\n}", ""]); @@ -24272,13 +24335,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var _core = __webpack_require__("rMFn"); var _Button = _interopRequireDefault(__webpack_require__("49+2")); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _gas_bill = _interopRequireDefault(__webpack_require__("5sc5")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); var GrdfModalHint = function GrdfModalHint(_ref) { var open = _ref.open, @@ -24296,14 +24359,12 @@ var GrdfModalHint = function GrdfModalHint(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, t('challenge_no_fluid_modal.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('feedback.accessibility.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('challenge_no_fluid_modal.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { + onClick: handleCloseClick, + "aria-label": t('feedback.accessibility.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "hintModal" }, /*#__PURE__*/_react.default.createElement("h1", { className: "text-20-bold" @@ -24311,9 +24372,8 @@ var GrdfModalHint = function GrdfModalHint(_ref) { className: "content" }, /*#__PURE__*/_react.default.createElement("div", { className: "bill grdf" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _gas_bill.default, - alt: "Facture", className: "bill", size: 180 })), /*#__PURE__*/_react.default.createElement("p", { @@ -24629,9 +24689,9 @@ var _core = __webpack_require__("rMFn"); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); __webpack_require__("g6YI"); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var EcogestureSelectionModal = function EcogestureSelectionModal(_ref) { var open = _ref.open, handleCloseClick = _ref.handleCloseClick; @@ -24647,14 +24707,12 @@ var EcogestureSelectionModal = function EcogestureSelectionModal(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, t('ecogesture_selection.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('ecogesture_selection.accessibility.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('ecogesture_selection.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { + onClick: handleCloseClick, + "aria-label": t('ecogesture_selection.accessibility.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "eg-selection-modal" }, /*#__PURE__*/_react.default.createElement("div", { className: "title text-20-bold" @@ -24684,32 +24742,6 @@ var insertInto; -var options = {"hmr":true} - -options.transform = transform -options.insertInto = undefined; - -var update = __webpack_require__("HkU0")(content, options); - -if(content.locals) module.exports = content.locals; - -if(false) {} - -/***/ }), - -/***/ "hD6F": -/***/ (function(module, exports, __webpack_require__) { - - -var content = __webpack_require__("mHzE"); - -if(typeof content === 'string') content = [[module.i, content, '']]; - -var transform; -var insertInto; - - - var options = {"hmr":true} options.transform = transform @@ -24981,6 +25013,64 @@ exports.push([module.i, ".profileType-view {\n display: flex;\n flex-direction +/***/ }), + +/***/ "hmgo": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__("jm00"); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); +var _react = __webpack_require__("ivGQ"); +var _reactRouterDom = __webpack_require__("Iyno"); +/** + * Update the page title based on the current location + */ +var usePageTitle = function usePageTitle() { + var _useLocation = (0, _reactRouterDom.useLocation)(), + pathname = _useLocation.pathname; + (0, _react.useEffect)(function () { + var baseTitle = 'Ecolyo'; + var titleMap = { + '/electricity': 'Conso électrique', + '/water': "Conso d'eau", + '/gas': 'Conso de gaz', + '/consumption': 'Conso', + '/ecogesture-selection': 'Sélection des astuces', + '/options/legalnotice': 'Mentions Légales', + '/options/gcu': "Conditions Générales d'Utilisation", + '/options': 'Options', + '/analysis': 'Analyse', + '/profileType': 'Ajuster mon profil', + '/challenges': 'Défis', + '/ecogesture': 'Astuces' + }; + var title = ''; + for (var _i = 0, _Object$entries = Object.entries(titleMap); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = (0, _slicedToArray2.default)(_Object$entries[_i], 2), + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + if (pathname.includes(key)) { + title = value; + break; + } + } + if (title) { + document.title = "".concat(title, " | ").concat(baseTitle); + } else { + document.title = baseTitle; + } + }, [pathname]); +}; +var _default = usePageTitle; +exports.default = _default; + /***/ }), /***/ "i+mC": @@ -26063,14 +26153,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var _core = __webpack_require__("rMFn"); var _Button = _interopRequireDefault(__webpack_require__("49+2")); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _bill = _interopRequireDefault(__webpack_require__("rOfV")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); var _prm = _interopRequireDefault(__webpack_require__("2oPg")); +var _StyledIcon = _interopRequireDefault(__webpack_require__("VP3k")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); var SgeModalHint = function SgeModalHint(_ref) { var open = _ref.open, @@ -26088,14 +26178,12 @@ var SgeModalHint = function SgeModalHint(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, t('auth.enedissgegrandlyon.pdlModal.title_accessibility')), /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('auth.accessibility.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('auth.enedissgegrandlyon.pdlModal.title_accessibility')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { + onClick: handleCloseClick, + "aria-label": t('auth.accessibility.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { className: "hintModal" }, /*#__PURE__*/_react.default.createElement("h1", { className: "text-20-bold" @@ -26103,15 +26191,15 @@ var SgeModalHint = function SgeModalHint(_ref) { className: "content" }, /*#__PURE__*/_react.default.createElement("p", null, t('auth.enedissgegrandlyon.pdlModal.txt1')), /*#__PURE__*/_react.default.createElement("p", null, t('auth.enedissgegrandlyon.pdlModal.txt2')), /*#__PURE__*/_react.default.createElement("div", { className: "bill" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _bill.default, - alt: "", size: 52 }), /*#__PURE__*/_react.default.createElement("p", { className: "text-16-bold" - }, t('auth.enedissgegrandlyon.pdlModal.txt3'))), /*#__PURE__*/_react.default.createElement("p", null, t('auth.enedissgegrandlyon.pdlModal.txt4')), /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('auth.enedissgegrandlyon.pdlModal.txt3'))), /*#__PURE__*/_react.default.createElement("p", null, t('auth.enedissgegrandlyon.pdlModal.txt4')), /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _prm.default, - alt: t('auth.enedissgegrandlyon.pdlModal.prm_accessibility'), + ariaHidden: false, + "aria-label": t('auth.enedissgegrandlyon.pdlModal.prm_accessibility'), className: "prm" }), /*#__PURE__*/_react.default.createElement(_Button.default, { "aria-label": t('auth.enedissgegrandlyon.pdlModal.button_accessibility'), @@ -26554,13 +26642,14 @@ var InitializationService = /*#__PURE__*/function () { switch (_context4.prev = _context4.next) { case 0: startTime = performance.now(); + this._setInitStep(_models.InitSteps.PRICES); (0, _duration.logDuration)('[Initialization] Launching fluidPrices service', startTime); triggerQuery = (0, _cozyClient.Q)(_doctypes.TRIGGERS_DOCTYPE).where({ 'message.name': 'fluidsPrices' }); - _context4.next = 5; + _context4.next = 6; return this._client.query(triggerQuery); - case 5: + case 6: _yield$this$_client$q = _context4.sent; _yield$this$_client$q2 = (0, _slicedToArray2.default)(_yield$this$_client$q.data, 1); trigger = _yield$this$_client$q2[0]; @@ -26570,7 +26659,7 @@ var InitializationService = /*#__PURE__*/function () { } else { (0, _duration.logDuration)('[Initialization] FluidPrices service trigger not found', startTime); } - case 9: + case 10: case "end": return _context4.stop(); } @@ -27660,6 +27749,7 @@ Object.defineProperty(exports, "__esModule", { exports.default = void 0; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__("QGb3")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); +var _I18n = __webpack_require__("nUfk"); var _detectBrowser = __webpack_require__("hY8Y"); var _enums = __webpack_require__("j0hM"); var _luxon = __webpack_require__("1EDv"); @@ -27667,6 +27757,7 @@ var _react = _interopRequireWildcard(__webpack_require__("ivGQ")); var _dateChart = _interopRequireDefault(__webpack_require__("Aj1I")); var _chart = __webpack_require__("dklY"); var _hooks = __webpack_require__("6FOS"); +var _date = __webpack_require__("0bnf"); var _utils = __webpack_require__("RgLR"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } @@ -27687,7 +27778,10 @@ var Bar = function Bar(_ref) { weekdays = _ref.weekdays, _ref$clickable = _ref.clickable, clickable = _ref$clickable === void 0 ? true : _ref$clickable, - average = _ref.average; + average = _ref.average, + focusable = _ref.focusable; + var _useI18n = (0, _I18n.useI18n)(), + t = _useI18n.t; var dispatch = (0, _hooks.useAppDispatch)(); var _useAppSelector = (0, _hooks.useAppSelector)(function (state) { return state.ecolyo; @@ -27891,8 +27985,20 @@ var Bar = function Bar(_ref) { /*#__PURE__*/ // default colored bar _react.default.createElement("g", { - transform: "translate(".concat(xScaleValue, ", ").concat(yScaleValue, ")") - }, /*#__PURE__*/_react.default.createElement("defs", null, /*#__PURE__*/_react.default.createElement("linearGradient", { + className: "barValue", + transform: "translate(".concat(xScaleValue, ", ").concat(yScaleValue, ")"), + tabIndex: focusable ? 0 : -1, + onKeyDown: function onKeyDown(event) { + if (event.key === ' ') { + event.preventDefault(); // prevent from scrolling page + handleClick(); + } + } + }, /*#__PURE__*/_react.default.createElement("title", null, t('consumption.accessibility.bar', { + date: (0, _date.formatDate)(currentTimeStep, dataload.date), + value: Math.round(dataload.value * 100) / 100, + unit: (0, _utils.getFluidUnit)(fluidType) + })), /*#__PURE__*/_react.default.createElement("defs", null, /*#__PURE__*/_react.default.createElement("linearGradient", { id: "gradient", className: getBarClass(), x1: "0", @@ -28155,14 +28261,65 @@ var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WE /***/ }), -/***/ "mHzE": +/***/ "mEyn": /***/ (function(module, exports, __webpack_require__) { -exports = module.exports = __webpack_require__("DjJv")(false); -// Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.eg-init-modal {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n.eg-init-modal .title {\n text-align: center;\n color: #e3b82a;\n}", ""]); +"use strict"; +var _interopRequireDefault = __webpack_require__("jm00"); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _core = __webpack_require__("rMFn"); +var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); +var _close = _interopRequireDefault(__webpack_require__("lCJQ")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); +var _I18n = __webpack_require__("nUfk"); +var _react = _interopRequireDefault(__webpack_require__("ivGQ")); +__webpack_require__("DqCF"); +var EcogestureInitModal = function EcogestureInitModal(_ref) { + var open = _ref.open, + onClose = _ref.onClose, + onAccept = _ref.onAccept; + var _useI18n = (0, _I18n.useI18n)(), + t = _useI18n.t; + return /*#__PURE__*/_react.default.createElement(_Dialog.default, { + open: open, + onClose: onClose, + "aria-labelledby": "accessibility-title", + classes: { + root: 'modal-root', + paper: 'modal-paper' + } + }, /*#__PURE__*/_react.default.createElement("div", { + id: "accessibility-title" + }, t('feedback.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { + icon: _close.default, + onClick: onClose, + "aria-label": t('feedback.accessibility.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement("div", { + className: "eg-init-modal" + }, /*#__PURE__*/_react.default.createElement("div", { + className: "title text-20-bold" + }, t('ecogesture.initModal.title')), /*#__PURE__*/_react.default.createElement("div", { + className: "text-16-normal" + }, t('ecogesture.initModal.text1')), /*#__PURE__*/_react.default.createElement("div", { + className: "text-16-normal" + }, t('ecogesture.initModal.text2')), /*#__PURE__*/_react.default.createElement("div", { + className: "buttons-container" + }, /*#__PURE__*/_react.default.createElement(_core.Button, { + onClick: onAccept, + className: "btnPrimary" + }, t('ecogesture.initModal.btn2')), /*#__PURE__*/_react.default.createElement(_core.Button, { + onClick: onClose, + className: "btnSecondary" + }, t('ecogesture.initModal.btn1'))))); +}; +var _default = EcogestureInitModal; +exports.default = _default; /***/ }), @@ -28210,6 +28367,371 @@ var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WE /***/ }), +/***/ "mY6q": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__("jm00"); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _regenerator = _interopRequireDefault(__webpack_require__("hJxD")); +var _slicedToArray2 = _interopRequireDefault(__webpack_require__("XkwL")); +var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("HZZ/")); +var _classCallCheck2 = _interopRequireDefault(__webpack_require__("GeFe")); +var _createClass2 = _interopRequireDefault(__webpack_require__("Zvb3")); +var _defineProperty2 = _interopRequireDefault(__webpack_require__("J58c")); +var Sentry = _interopRequireWildcard(__webpack_require__("5QCN")); +var _cozyClient = __webpack_require__("xEu0"); +var _cozyLogger = _interopRequireDefault(__webpack_require__("rUPj")); +var _doctypes = __webpack_require__("rVhO"); +var _logger = _interopRequireDefault(__webpack_require__("DPwE")); +var _fluidConfig = _interopRequireDefault(__webpack_require__("i5q2")); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +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; } +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) { (0, _defineProperty2.default)(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; } +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } +var logStack = _cozyLogger.default.namespace('fluidPricesService'); +var FluidPricesService = /*#__PURE__*/function () { + function FluidPricesService(_client) { + (0, _classCallCheck2.default)(this, FluidPricesService); + (0, _defineProperty2.default)(this, "_client", void 0); + this._client = _client; + } + + /** + * Get all prices available in database + */ + (0, _createClass2.default)(FluidPricesService, [{ + key: "getAllPrices", + value: function () { + var _getAllPrices = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() { + var query, _yield$this$_client$q, fluidsPrices; + return _regenerator.default.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + query = (0, _cozyClient.Q)(_doctypes.FLUIDSPRICES_DOCTYPE).limitBy(900); // TODO : handle case of 1000+ entries in doctype + _context.next = 3; + return this._client.query(query); + case 3: + _yield$this$_client$q = _context.sent; + fluidsPrices = _yield$this$_client$q.data; + return _context.abrupt("return", fluidsPrices); + case 6: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + function getAllPrices() { + return _getAllPrices.apply(this, arguments); + } + return getAllPrices; + }() + /** + * Get a price according to a fluidType and a data. This method return the nearest and valid price for the given date. + */ + }, { + key: "getPrices", + value: function () { + var _getPrices = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(fluidType, date) { + var query, _yield$this$_client$q2, fluidsPrices; + return _regenerator.default.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + query = (0, _cozyClient.Q)(_doctypes.FLUIDSPRICES_DOCTYPE).where({ + startDate: { + $lte: date.toISO({ + suppressMilliseconds: true + }).toString() + }, + fluidType: fluidType + }).indexFields(['startDate']).sortBy([{ + startDate: 'desc' + }]).limitBy(1); + _context2.next = 3; + return this._client.query(query); + case 3: + _yield$this$_client$q2 = _context2.sent; + fluidsPrices = _yield$this$_client$q2.data; + return _context2.abrupt("return", fluidsPrices[0]); + case 6: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + function getPrices(_x, _x2) { + return _getPrices.apply(this, arguments); + } + return getPrices; + }() + /** + * Get current prices for all fluidTypes. + */ + }, { + key: "getAllLastPrices", + value: function () { + var _getAllLastPrices = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() { + var query, _yield$this$_client$q3, fluidsPrices, configService, fluidConfig, recoveredFluidsPrices; + return _regenerator.default.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + query = (0, _cozyClient.Q)(_doctypes.FLUIDSPRICES_DOCTYPE).where({ + endDate: { + $eq: '' + } + }).indexFields(['fluidType']).sortBy([{ + fluidType: 'asc' + }]).limitBy(3); + _context3.next = 3; + return this._client.query(query); + case 3: + _yield$this$_client$q3 = _context3.sent; + fluidsPrices = _yield$this$_client$q3.data; + if (!(fluidsPrices.length !== 3)) { + _context3.next = 12; + break; + } + configService = new _fluidConfig.default(); + fluidConfig = configService.getFluidConfig(); + recoveredFluidsPrices = []; // Getting default fluid price + fluidConfig.forEach(function (config) { + recoveredFluidsPrices.push({ + _id: '0', + fluidType: config.fluidTypeId, + price: config.coefficient, + startDate: config.startDate, + endDate: '', + UpdatedAt: '2000-01-01T00:00:00Z' + }); + }); + + // Replacing default prices if available + fluidsPrices.forEach(function (fluidPrice) { + recoveredFluidsPrices[fluidPrice.fluidType] = fluidPrice; + }); + return _context3.abrupt("return", recoveredFluidsPrices); + case 12: + return _context3.abrupt("return", fluidsPrices); + case 13: + case "end": + return _context3.stop(); + } + } + }, _callee3, this); + })); + function getAllLastPrices() { + return _getAllLastPrices.apply(this, arguments); + } + return getAllLastPrices; + }() + /** + * Delete all fluidPrices entities from the db + * @returns {boolean} - true when deleted with success + * @throws {Error} + */ + }, { + key: "deleteAllFluidsPrices", + value: function () { + var _deleteAllFluidsPrices = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4() { + var fluidsPrices, _iterator, _step, price, errorMessage; + return _regenerator.default.wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + _context4.next = 2; + return this.getAllPrices(); + case 2: + fluidsPrices = _context4.sent; + _context4.prev = 3; + _iterator = _createForOfIteratorHelper(fluidsPrices); + _context4.prev = 5; + _iterator.s(); + case 7: + if ((_step = _iterator.n()).done) { + _context4.next = 13; + break; + } + price = _step.value; + _context4.next = 11; + return this._client.destroy(price); + case 11: + _context4.next = 7; + break; + case 13: + _context4.next = 18; + break; + case 15: + _context4.prev = 15; + _context4.t0 = _context4["catch"](5); + _iterator.e(_context4.t0); + case 18: + _context4.prev = 18; + _iterator.f(); + return _context4.finish(18); + case 21: + return _context4.abrupt("return", true); + case 24: + _context4.prev = 24; + _context4.t1 = _context4["catch"](3); + errorMessage = "deleteAllFluidsPrices: ".concat(JSON.stringify(_context4.t1)); + logStack('error', errorMessage); + _logger.default.error(errorMessage); + Sentry.captureException(_context4.t1); + return _context4.abrupt("return", false); + case 31: + case "end": + return _context4.stop(); + } + } + }, _callee4, this, [[3, 24], [5, 15, 18, 21]]); + })); + function deleteAllFluidsPrices() { + return _deleteAllFluidsPrices.apply(this, arguments); + } + return deleteAllFluidsPrices; + }() + /** + * Check if a fluidPrice exists in db + * @returns {Promise<FluidPrice | null>} price or null + */ + }, { + key: "checkIfPriceExists", + value: function () { + var _checkIfPriceExists = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(fluidPrice) { + var query, _yield$this$_client$q4, _yield$this$_client$q5, price; + return _regenerator.default.wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + query = (0, _cozyClient.Q)(_doctypes.FLUIDSPRICES_DOCTYPE).where({ + startDate: { + $eq: fluidPrice.startDate + }, + fluidType: { + $eq: fluidPrice.fluidType + } + }); + _context5.next = 3; + return this._client.query(query); + case 3: + _yield$this$_client$q4 = _context5.sent; + _yield$this$_client$q5 = (0, _slicedToArray2.default)(_yield$this$_client$q4.data, 1); + price = _yield$this$_client$q5[0]; + if (!price) { + _context5.next = 8; + break; + } + return _context5.abrupt("return", price); + case 8: + return _context5.abrupt("return", null); + case 9: + case "end": + return _context5.stop(); + } + } + }, _callee5, this); + })); + function checkIfPriceExists(_x3) { + return _checkIfPriceExists.apply(this, arguments); + } + return checkIfPriceExists; + }() + /** + * Creates a new fluidPrice + * @returns {Promise<FluidPrice | null>} price or null + */ + }, { + key: "createPrice", + value: function () { + var _createPrice = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(newPrice) { + var _yield$this$_client$c, createdPrice, errorMessage; + return _regenerator.default.wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + _context6.prev = 0; + _context6.next = 3; + return this._client.create(_doctypes.FLUIDSPRICES_DOCTYPE, newPrice); + case 3: + _yield$this$_client$c = _context6.sent; + createdPrice = _yield$this$_client$c.data; + return _context6.abrupt("return", createdPrice); + case 8: + _context6.prev = 8; + _context6.t0 = _context6["catch"](0); + errorMessage = "'Error creating new createdPrice: ".concat(JSON.stringify(_context6.t0)); + logStack('error', errorMessage); + _logger.default.error(errorMessage); + Sentry.captureException(_context6.t0); + throw _context6.t0; + case 15: + case "end": + return _context6.stop(); + } + } + }, _callee6, this, [[0, 8]]); + })); + function createPrice(_x4) { + return _createPrice.apply(this, arguments); + } + return createPrice; + }() + /** + * Updates a price in db + */ + }, { + key: "updatePrice", + value: function () { + var _updatePrice = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(doc, attributes) { + var _yield$this$_client$s, fluidPrice; + return _regenerator.default.wrap(function _callee7$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + _context7.next = 2; + return this._client.save(_objectSpread(_objectSpread({}, doc), attributes)); + case 2: + _yield$this$_client$s = _context7.sent; + fluidPrice = _yield$this$_client$s.data; + if (!fluidPrice) { + _context7.next = 6; + break; + } + return _context7.abrupt("return", fluidPrice); + case 6: + return _context7.abrupt("return", null); + case 7: + case "end": + return _context7.stop(); + } + } + }, _callee7, this); + })); + function updatePrice(_x5, _x6) { + return _updatePrice.apply(this, arguments); + } + return updatePrice; + }() + }]); + return FluidPricesService; +}(); +exports.default = FluidPricesService; + +/***/ }), + /***/ "mcBX": /***/ (function(module, exports, __webpack_require__) { @@ -31086,9 +31608,10 @@ var EcogestureSelectionDetail = function EcogestureSelectionDetail(_ref) { } }, t("ecogesture_modal.show_".concat(showDetails ? 'less' : 'more'))), /*#__PURE__*/_react.default.createElement(_core.Collapse, { in: showDetails, - exit: false + exit: false, + timeout: 300 }, /*#__PURE__*/_react.default.createElement("div", { - className: "longDescription text-16-normal-150" + className: "longDescription text-16-normal-150 ".concat(showDetails ? 'expanded' : '') }, ecogesture.longDescription))), /*#__PURE__*/_react.default.createElement("div", { className: "buttons" }, /*#__PURE__*/_react.default.createElement(_core.Button, { @@ -31913,7 +32436,7 @@ var _profile = __webpack_require__("quVB"); var _profileEcogesture2 = __webpack_require__("eumI"); var _EcogestureFormEquipment = _interopRequireDefault(__webpack_require__("ZKcy")); var _EcogestureFormSingleChoice = _interopRequireDefault(__webpack_require__("pmKQ")); -var _EcogestureLaunchFormModal = _interopRequireDefault(__webpack_require__("Kltg")); +var _EcogestureInitModal = _interopRequireDefault(__webpack_require__("mEyn")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } var EcogestureFormView = function EcogestureFormView() { @@ -31996,6 +32519,15 @@ var EcogestureFormView = function EcogestureFormView() { if (isProfileTypeCompleted) { return /*#__PURE__*/_react.default.createElement(_ProfileTypeView.default, null); } + var handleCloseInitModal = function handleCloseInitModal(redirect) { + setOpenLaunchModal(false); + dispatch((0, _profile.updateProfile)({ + haveSeenEcogestureModal: true + })); + if (redirect) { + navigate('/ecogestures'); + } + }; return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_CozyBar.default, { titleKey: "common.title_ecogestures" }), /*#__PURE__*/_react.default.createElement(_Header.default, { @@ -32013,10 +32545,13 @@ var EcogestureFormView = function EcogestureFormView() { answerType: answerType, setNextStep: setNextStep, setPreviousStep: setPreviousStep - }))), /*#__PURE__*/_react.default.createElement(_EcogestureLaunchFormModal.default, { + }))), /*#__PURE__*/_react.default.createElement(_EcogestureInitModal.default, { open: openLaunchModal, - handleCloseClick: function handleCloseClick() { - return setOpenLaunchModal(false); + onClose: function onClose() { + return handleCloseInitModal(true); + }, + onAccept: function onAccept() { + return handleCloseInitModal(false); } })); }; @@ -32376,9 +32911,9 @@ exports.default = void 0; var _core = __webpack_require__("rMFn"); var _Dialog = _interopRequireDefault(__webpack_require__("L/1U")); var _close = _interopRequireDefault(__webpack_require__("lCJQ")); +var _StyledIconButton = _interopRequireDefault(__webpack_require__("90PE")); var _LegalNoticeContent = _interopRequireDefault(__webpack_require__("cm3A")); var _I18n = __webpack_require__("nUfk"); -var _Icon = _interopRequireDefault(__webpack_require__("AHiN")); var _react = _interopRequireDefault(__webpack_require__("ivGQ")); __webpack_require__("3nih"); var LegalNoticeModal = function LegalNoticeModal(_ref) { @@ -32396,14 +32931,12 @@ var LegalNoticeModal = function LegalNoticeModal(_ref) { } }, /*#__PURE__*/_react.default.createElement("div", { id: "accessibility-title" - }, t('legal.title_legal')), /*#__PURE__*/_react.default.createElement(_core.IconButton, { - "aria-label": t('feedback.accessibility.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + }, t('legal.title_legal')), /*#__PURE__*/_react.default.createElement(_StyledIconButton.default, { icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement(_LegalNoticeContent.default, null), /*#__PURE__*/_react.default.createElement(_core.Button, { + onClick: handleCloseClick, + "aria-label": t('feedback.accessibility.button_close'), + className: "modal-paper-close-button" + }), /*#__PURE__*/_react.default.createElement(_LegalNoticeContent.default, null), /*#__PURE__*/_react.default.createElement(_core.Button, { "aria-label": t('gcu_modal.accessibility.button_accept'), onClick: handleCloseClick, className: "btnPrimary" @@ -33495,42 +34028,39 @@ var ConsumptionDataManager = /*#__PURE__*/function () { (0, _defineProperty2.default)(this, "_consumptionValidatorService", void 0); (0, _defineProperty2.default)(this, "fetchAvgTemperature", /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(year, month) { - var bronStationId, avgTemperatureDate, result, errorMessage; + var BronStationId, avgTemperatureDate, result, errorMessage; return _regenerator.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: - bronStationId = '69123002'; + BronStationId = '69123002'; avgTemperatureDate = "".concat(year, "-").concat((0, _utils.formatTwoDigits)(month)); _context.prev = 2; _context.next = 5; - return _this._client.getStackClient().fetchJSON('GET', "".concat(_orgEcolyo.REMOTE_ORG_ECOLYO_AVG_TEMPERATURE, "?identifiant=").concat(bronStationId, "&month=").concat(avgTemperatureDate)); + return _this._client.getStackClient().fetchJSON('GET', "".concat(_orgEcolyo.REMOTE_ORG_ECOLYO_AVG_TEMPERATURE, "?identifiant=").concat(BronStationId, "&month=").concat(avgTemperatureDate)); case 5: result = _context.sent; if (!(result && result.nb_results !== 0)) { - _context.next = 10; + _context.next = 8; break; } return _context.abrupt("return", result.values[0].average_measurement); - case 10: + case 8: throw new Error("No average temperature found for ".concat(avgTemperatureDate)); case 11: - _context.next = 20; - break; - case 13: - _context.prev = 13; + _context.prev = 11; _context.t0 = _context["catch"](2); errorMessage = "fetchAvgTemperature error : ".concat(_context.t0); logStack('error', errorMessage); _logger.default.error(errorMessage); Sentry.captureException(_context.t0); return _context.abrupt("return", null); - case 20: + case 18: case "end": return _context.stop(); } } - }, _callee, null, [[2, 13]]); + }, _callee, null, [[2, 11]]); })); return function (_x, _x2) { return _ref.apply(this, arguments); @@ -33546,82 +34076,82 @@ var ConsumptionDataManager = /*#__PURE__*/function () { (0, _createClass2.default)(ConsumptionDataManager, [{ key: "getGraphData", value: function () { - var _getGraphData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(timePeriod, timeStep, fluidTypes, fluidStatus, compareTimePeriod, isHome, isExport) { - var InputIsValid, fluidType, fetchedData, formattedData, toBeAggregatedData, _iterator, _step, _fluidType, _fetchedData, _formattedData, aggregatedData; + var _getGraphData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(_ref2) { + var timePeriod, timeStep, fluidTypes, fluidStatus, compareTimePeriod, isHome, isExport, isInputValid, fluidType, fetchedData, formattedData, toBeAggregatedData, _iterator, _step, _fluidType, _fetchedData, _formattedData, aggregatedData; return _regenerator.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: - InputIsValid = this._consumptionValidatorService.ValidateGetGraphData(timePeriod, timeStep, fluidTypes, compareTimePeriod, isExport); - if (InputIsValid) { - _context2.next = 3; + timePeriod = _ref2.timePeriod, timeStep = _ref2.timeStep, fluidTypes = _ref2.fluidTypes, fluidStatus = _ref2.fluidStatus, compareTimePeriod = _ref2.compareTimePeriod, isHome = _ref2.isHome, isExport = _ref2.isExport; + isInputValid = this._consumptionValidatorService.ValidateGetGraphData(timePeriod, timeStep, fluidTypes, compareTimePeriod, isExport); + if (isInputValid) { + _context2.next = 4; break; } return _context2.abrupt("return", null); - case 3: + case 4: if (!(fluidTypes.length === 1 && !isHome)) { - _context2.next = 12; + _context2.next = 13; break; } fluidType = fluidTypes[0]; - _context2.next = 7; + _context2.next = 8; return this.fetchSingleFluidGraphData(timePeriod, timeStep, fluidType, compareTimePeriod); - case 7: + case 8: fetchedData = _context2.sent; formattedData = this.formatGraphDataManager(fetchedData, timeStep, timePeriod, compareTimePeriod || null, fluidType, fluidStatus ? fluidStatus[fluidType] : undefined); return _context2.abrupt("return", formattedData); - case 12: + case 13: if (!(fluidTypes.length > 1 || isHome)) { - _context2.next = 38; + _context2.next = 37; break; } toBeAggregatedData = []; _iterator = _createForOfIteratorHelper(fluidTypes); - _context2.prev = 15; + _context2.prev = 16; _iterator.s(); - case 17: + case 18: if ((_step = _iterator.n()).done) { - _context2.next = 26; + _context2.next = 27; break; } _fluidType = _step.value; - _context2.next = 21; + _context2.next = 22; return this.fetchSingleFluidGraphData(timePeriod, timeStep, _fluidType, compareTimePeriod); - case 21: + case 22: _fetchedData = _context2.sent; - // formatting data _formattedData = this.formatGraphDataManager(_fetchedData, timeStep, timePeriod, compareTimePeriod || null, _fluidType, fluidStatus ? fluidStatus[_fluidType] : undefined); // validating output data toBeAggregatedData.push({ chartData: _formattedData, chartFluid: _fluidType }); - case 24: - _context2.next = 17; + case 25: + _context2.next = 18; break; - case 26: - _context2.next = 31; + case 27: + _context2.next = 32; break; - case 28: - _context2.prev = 28; - _context2.t0 = _context2["catch"](15); + case 29: + _context2.prev = 29; + _context2.t0 = _context2["catch"](16); _iterator.e(_context2.t0); - case 31: - _context2.prev = 31; + case 32: + _context2.prev = 32; _iterator.f(); - return _context2.finish(31); - case 34: + return _context2.finish(32); + case 35: aggregatedData = this.aggregateGraphData(toBeAggregatedData); return _context2.abrupt("return", aggregatedData); - case 38: + case 37: return _context2.abrupt("return", null); - case 39: + case 38: case "end": return _context2.stop(); } } - }, _callee2, this, [[15, 28, 31, 34]]); + }, _callee2, this, [[16, 29, 32, 35]]); })); - function getGraphData(_x3, _x4, _x5, _x6, _x7, _x8, _x9) { + function getGraphData(_x3) { return _getGraphData.apply(this, arguments); } return getGraphData; @@ -33629,37 +34159,44 @@ var ConsumptionDataManager = /*#__PURE__*/function () { }, { key: "getMaxLoad", value: function () { - var _getMaxLoad = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(maxTimePeriod, timeStep, fluidTypes, compareMaxTimePeriod, isHome, withDate) { - var allData, _allData, max; + var _getMaxLoad = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(_ref3) { + var maxTimePeriod, timeStep, fluidTypes, compareMaxTimePeriod, isHome, withDate, allData, max; return _regenerator.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: + maxTimePeriod = _ref3.maxTimePeriod, timeStep = _ref3.timeStep, fluidTypes = _ref3.fluidTypes, compareMaxTimePeriod = _ref3.compareMaxTimePeriod, isHome = _ref3.isHome, withDate = _ref3.withDate; if (!isHome) { - _context3.next = 7; + _context3.next = 8; break; } - _context3.next = 3; - return this.getGraphData(maxTimePeriod, timeStep, fluidTypes, undefined, compareMaxTimePeriod, isHome); - case 3: + _context3.next = 4; + return this.getGraphData({ + timePeriod: maxTimePeriod, + timeStep: timeStep, + fluidTypes: fluidTypes, + compareTimePeriod: compareMaxTimePeriod, + isHome: isHome + }); + case 4: allData = _context3.sent; - return _context3.abrupt("return", (_allData = allData) !== null && _allData !== void 0 && _allData.actualData ? Math.max.apply(Math, (0, _toConsumableArray2.default)(allData.actualData.map(function (d) { + return _context3.abrupt("return", allData !== null && allData !== void 0 && allData.actualData ? Math.max.apply(Math, (0, _toConsumableArray2.default)(allData.actualData.map(function (d) { return d.value; }))) : 0); - case 7: - _context3.next = 9; + case 8: + _context3.next = 10; return this._queryRunnerService.fetchFluidMaxData(maxTimePeriod, timeStep, fluidTypes[0], withDate); - case 9: + case 10: max = _context3.sent; return _context3.abrupt("return", max); - case 11: + case 12: case "end": return _context3.stop(); } } }, _callee3, this); })); - function getMaxLoad(_x10, _x11, _x12, _x13, _x14, _x15) { + function getMaxLoad(_x4) { return _getMaxLoad.apply(this, arguments); } return getMaxLoad; @@ -33667,7 +34204,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { }, { key: "getLastDataload", value: function () { - var _getLastDataload = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(fluidTypes) { + var _getLastDataload = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(fluidType) { var timePeriod, data; return _regenerator.default.wrap(function _callee4$(_context4) { while (1) { @@ -33680,7 +34217,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { endDate: _luxon.DateTime.now() }; _context4.next = 3; - return this._queryRunnerService.fetchFluidData(timePeriod, _enums.TimeStep.DAY, fluidTypes); + return this._queryRunnerService.fetchFluidData(timePeriod, _enums.TimeStep.DAY, fluidType); case 3: data = _context4.sent; return _context4.abrupt("return", data); @@ -33691,7 +34228,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } }, _callee4, this); })); - function getLastDataload(_x16) { + function getLastDataload(_x5) { return _getLastDataload.apply(this, arguments); } return getLastDataload; @@ -33716,7 +34253,12 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } fluidType = _step2.value; _context5.next = 8; - return this.getGraphData(timePeriod, timeStep, [fluidType], undefined, compareTimePeriod); + return this.getGraphData({ + timePeriod: timePeriod, + timeStep: timeStep, + fluidTypes: [fluidType], + compareTimePeriod: compareTimePeriod + }); case 8: graphData = _context5.sent; if (graphData) { @@ -33761,7 +34303,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } }, _callee5, this, [[2, 14, 17, 20]]); })); - function getPerformanceIndicators(_x17, _x18, _x19, _x20) { + function getPerformanceIndicators(_x6, _x7, _x8, _x9) { return _getPerformanceIndicators.apply(this, arguments); } return getPerformanceIndicators; @@ -33839,7 +34381,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } }, _callee6, this); })); - function fetchSingleFluidGraphData(_x21, _x22, _x23, _x24) { + function fetchSingleFluidGraphData(_x10, _x11, _x12, _x13) { return _fetchSingleFluidGraphData.apply(this, arguments); } return fetchSingleFluidGraphData; @@ -33912,7 +34454,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } }, _callee7, this, [[2, 14, 17, 20]]); })); - function getFluidsWithData(_x25, _x26) { + function getFluidsWithData(_x14, _x15) { return _getFluidsWithData.apply(this, arguments); } return getFluidsWithData; @@ -33973,7 +34515,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } }, _callee8, this, [[3, 15, 18, 21]]); })); - function getFluidsWithDataForTimePeriod(_x27, _x28) { + function getFluidsWithDataForTimePeriod(_x16, _x17) { return _getFluidsWithDataForTimePeriod.apply(this, arguments); } return getFluidsWithDataForTimePeriod; @@ -34037,7 +34579,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } }, _callee9, this, [[3, 15, 18, 21]]); })); - function getFluidsWithIncompleteData(_x29, _x30) { + function getFluidsWithIncompleteData(_x18, _x19) { return _getFluidsWithIncompleteData.apply(this, arguments); } return getFluidsWithIncompleteData; @@ -34097,7 +34639,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } }, _callee10, this, [[3, 18, 21, 24]]); })); - function fetchAllFirstDateData(_x31, _x32) { + function fetchAllFirstDateData(_x20, _x21) { return _fetchAllFirstDateData.apply(this, arguments); } return fetchAllFirstDateData; @@ -34180,7 +34722,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } }, _callee11, this, [[14, 29, 32, 35]]); })); - function fetchAllLastDateData(_x33, _x34) { + function fetchAllLastDateData(_x22, _x23) { return _fetchAllLastDateData.apply(this, arguments); } return fetchAllLastDateData; @@ -34212,7 +34754,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } }, _callee12, this); })); - function checkDoctypeEntries(_x35, _x36) { + function checkDoctypeEntries(_x24, _x25) { return _checkDoctypeEntries.apply(this, arguments); } return checkDoctypeEntries; @@ -34339,7 +34881,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } }, _callee13); })); - function getLastHourData(_x37, _x38) { + function getLastHourData(_x26, _x27) { return _getLastHourData.apply(this, arguments); } return getLastHourData; @@ -34348,9 +34890,9 @@ var ConsumptionDataManager = /*#__PURE__*/function () { * Get the first entry of a given data doctype (enedis, grdf, egl) */ }, { - key: "getFirsDataDateFromDoctype", + key: "getFirstDataDateFromDoctype", value: function () { - var _getFirsDataDateFromDoctype = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee14(doctype) { + var _getFirstDataDateFromDoctype = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee14(doctype) { var query, data; return _regenerator.default.wrap(function _callee14$(_context14) { while (1) { @@ -34373,10 +34915,10 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } }, _callee14, this); })); - function getFirsDataDateFromDoctype(_x39) { - return _getFirsDataDateFromDoctype.apply(this, arguments); + function getFirstDataDateFromDoctype(_x28) { + return _getFirstDataDateFromDoctype.apply(this, arguments); } - return getFirsDataDateFromDoctype; + return getFirstDataDateFromDoctype; }() }, { key: "getFirstDataDateFromDoctypeWithPrice", @@ -34415,7 +34957,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } }, _callee15, this); })); - function getFirstDataDateFromDoctypeWithPrice(_x40) { + function getFirstDataDateFromDoctypeWithPrice(_x29) { return _getFirstDataDateFromDoctypeWithPrice.apply(this, arguments); } return getFirstDataDateFromDoctypeWithPrice; @@ -34452,7 +34994,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } }, _callee16, this); })); - function saveDoc(_x41) { + function saveDoc(_x30) { return _saveDoc.apply(this, arguments); } return saveDoc; @@ -34484,7 +35026,7 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } }, _callee17, this); })); - function saveDocs(_x42) { + function saveDocs(_x31) { return _saveDocs.apply(this, arguments); } return saveDocs; diff --git a/index.html b/index.html index 6b4aa4b0bb880e7adea2112ca93da509b9e72fdb..c3162ae4266b545f1a2cc61baceaa13f84d7ed3f 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -<!DOCTYPE html><html lang="{{.Locale}}"><head><meta charset="utf-8"><title>Ecolyo</title><link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32"><link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16"><!-- PWA Manifest --><link rel="manifest" href="/manifest.json" crossorigin="use-credentials"><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#297EF2"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,viewport-fit=cover"><!-- PWA Chrome --><link rel="icon" sizes="192x192" href="/android-chrome-192x192.png"><link rel="icon" sizes="512x512" href="/android-chrome-512x512.png"><!-- PWA iOS --><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="apple-touch-startup-image" href="/apple-touch-icon.png"><meta name="apple-mobile-web-app-title" content="Ecolyo"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><!-- PWA Colors --><meta name="theme-color" content="#343641"><meta name="background-color" content="#121212">{{.ThemeCSS}} {{.CozyBar}}<script src="//{{.Domain}}/assets/js/piwik.js"></script></head><body><div role="application" class="application" data-cozy="{{.CozyData}}"><script src="vendors/ecolyo.051ab77aa284511d3340.js"></script><script src="app/ecolyo.5eedcd902009a77ffe0a.js"></script></div></body></html> \ No newline at end of file +<!DOCTYPE html><html lang="{{.Locale}}"><head><meta charset="utf-8"><title>Ecolyo</title><link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32"><link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16"><!-- PWA Manifest --><link rel="manifest" href="/manifest.json" crossorigin="use-credentials"><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#297EF2"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,viewport-fit=cover"><!-- PWA Chrome --><link rel="icon" sizes="192x192" href="/android-chrome-192x192.png"><link rel="icon" sizes="512x512" href="/android-chrome-512x512.png"><!-- PWA iOS --><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="apple-touch-startup-image" href="/apple-touch-icon.png"><meta name="apple-mobile-web-app-title" content="Ecolyo"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><!-- PWA Colors --><meta name="theme-color" content="#343641"><meta name="background-color" content="#121212">{{.ThemeCSS}} {{.CozyBar}}<script src="//{{.Domain}}/assets/js/piwik.js"></script></head><body><div role="application" class="application" data-cozy="{{.CozyData}}"><script src="vendors/ecolyo.051ab77aa284511d3340.js"></script><script src="app/ecolyo.554a8422165fe8f24237.js"></script></div></body></html> \ No newline at end of file diff --git a/public/ecolyo.c5bddfba2d042cc6519f.js b/public/ecolyo.5906ce9ba60639086e03.js similarity index 98% rename from public/ecolyo.c5bddfba2d042cc6519f.js rename to public/ecolyo.5906ce9ba60639086e03.js index 8a93e6ac374f869ffbc07d28700c22127d309c93..28588db507b717d2b19f5cd6f510238460b39d58 100644 --- a/public/ecolyo.c5bddfba2d042cc6519f.js +++ b/public/ecolyo.5906ce9ba60639086e03.js @@ -20257,7 +20257,7 @@ exports.i(__webpack_require__("/O3k"), ""); exports.push([module.i, "@import url(https://fonts.googleapis.com/css2?family=Lato:wght@400;700&display=swap);", ""]); // Module -exports.push([module.i, "/* Cozy UI utilities classes */\n/* Cozy UI React components styles */\n/* App styles */\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\nhtml {\n background: #121212;\n}\n\nbody {\n background: #121212;\n overflow: unset !important;\n color: #e0e0e0;\n}\n\n.column {\n display: flex;\n flex-direction: column;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.cozy-bar {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: 0;\n}\n\n[role=banner] .coz-bar-container {\n background-color: #ffffff;\n}\n@media only screen and (max-width : 768px) {\n [role=banner] .coz-bar-container {\n padding: 0.6rem 0 0 0;\n background-color: unset;\n }\n}\n\n.coz-bar-wrapper {\n box-shadow: unset !important;\n background: unset !important;\n}\n\n.coz-label {\n color: #32363f;\n}\n\n.content-view-loading {\n height: 80vh;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n color: #e0e0e0;\n}\n.content-view-loading .content-view-loading-text {\n padding-top: 1rem;\n margin: 0 2rem;\n text-align: center;\n}\n.content-view-loading .content-view-loading-button {\n max-width: 50vw;\n margin-top: 1rem;\n}\n\n[role=main] {\n /* width */\n /* Track */\n /* Handle */\n}\n[role=main]::-webkit-scrollbar {\n width: 10px;\n}\n[role=main]::-webkit-scrollbar-track {\n background: #3e4045;\n}\n[role=main]::-webkit-scrollbar-thumb {\n background: #6f7074;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n* {\n font-family: Lato, sans-serif;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np {\n color: #a0a0a0;\n font-family: Lato, sans-serif;\n}\n\n.home-title {\n font-size: 1rem;\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 120%;\n text-transform: uppercase;\n}\n\n.app-title {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 21px;\n line-height: 24px;\n text-align: center;\n letter-spacing: 0.15px;\n color: #e0e0e0;\n text-shadow: 0px -1px 0px #060609, 0px 1px 0px rgba(255, 255, 255, 0.07);\n}\n\n.text-10, .text-10-italic, .text-10-bold, .text-10-bold-capitalize, .text-10-bold-uppercase, .text-10-normal, .text-10-normal-150, .text-10-normal-uppercase {\n font-style: normal;\n font-size: 0.625rem;\n line-height: 120%;\n}\n.text-10-normal, .text-10-normal-150, .text-10-normal-uppercase {\n font-weight: normal;\n}\n.text-10-normal-uppercase {\n text-transform: uppercase;\n}\n.text-10-normal-150 {\n line-height: 150%;\n}\n.text-10-bold, .text-10-bold-capitalize, .text-10-bold-uppercase {\n font-weight: 700;\n}\n.text-10-bold-uppercase {\n text-transform: uppercase;\n}\n.text-10-bold-capitalize {\n text-transform: capitalize;\n}\n.text-10-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-12, .text-12-italic, .text-12-bold, .text-12-bold-capitalize, .text-12-bold-uppercase, .text-12-normal, .text-12-normal-150, .text-12-normal-uppercase {\n font-style: normal;\n font-size: 0.75rem;\n line-height: 120%;\n}\n.text-12-normal, .text-12-normal-150, .text-12-normal-uppercase {\n font-weight: normal;\n}\n.text-12-normal-uppercase {\n text-transform: uppercase;\n}\n.text-12-normal-150 {\n line-height: 150%;\n}\n.text-12-bold, .text-12-bold-capitalize, .text-12-bold-uppercase {\n font-weight: 700;\n}\n.text-12-bold-uppercase {\n text-transform: uppercase;\n}\n.text-12-bold-capitalize {\n text-transform: capitalize;\n}\n.text-12-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-13, .text-13-italic, .text-13-bold, .text-13-bold-capitalize, .text-13-bold-uppercase, .text-13-normal, .text-13-normal-150, .text-13-normal-uppercase {\n font-style: normal;\n font-size: 0.8125rem;\n line-height: 120%;\n}\n.text-13-normal, .text-13-normal-150, .text-13-normal-uppercase {\n font-weight: normal;\n}\n.text-13-normal-uppercase {\n text-transform: uppercase;\n}\n.text-13-normal-150 {\n line-height: 150%;\n}\n.text-13-bold, .text-13-bold-capitalize, .text-13-bold-uppercase {\n font-weight: 700;\n}\n.text-13-bold-uppercase {\n text-transform: uppercase;\n}\n.text-13-bold-capitalize {\n text-transform: capitalize;\n}\n.text-13-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-14, .text-14-italic, .text-14-bold, .text-14-bold-capitalize, .text-14-bold-uppercase, .text-14-normal, .text-14-normal-150, .text-14-normal-uppercase {\n font-style: normal;\n font-size: 0.875rem;\n line-height: 120%;\n}\n.text-14-normal, .text-14-normal-150, .text-14-normal-uppercase {\n font-weight: normal;\n}\n.text-14-normal-uppercase {\n text-transform: uppercase;\n}\n.text-14-normal-150 {\n line-height: 150%;\n}\n.text-14-bold, .text-14-bold-capitalize, .text-14-bold-uppercase {\n font-weight: 700;\n}\n.text-14-bold-uppercase {\n text-transform: uppercase;\n}\n.text-14-bold-capitalize {\n text-transform: capitalize;\n}\n.text-14-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-15, .text-15-italic, .text-15-bold, .text-15-bold-capitalize, .text-15-bold-uppercase, .text-15-normal, .text-15-normal-150, .text-15-normal-uppercase {\n font-style: normal;\n font-size: 0.938rem;\n line-height: 120%;\n}\n.text-15-normal, .text-15-normal-150, .text-15-normal-uppercase {\n font-weight: normal;\n}\n.text-15-normal-uppercase {\n text-transform: uppercase;\n}\n.text-15-normal-150 {\n line-height: 150%;\n}\n.text-15-bold, .text-15-bold-capitalize, .text-15-bold-uppercase {\n font-weight: 700;\n}\n.text-15-bold-uppercase {\n text-transform: uppercase;\n}\n.text-15-bold-capitalize {\n text-transform: capitalize;\n}\n.text-15-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-16, .text-16-italic, .text-16-bold, .text-16-bold-capitalize, .text-16-bold-uppercase, .text-16-normal, .text-16-normal-150, .text-16-normal-uppercase {\n font-style: normal;\n font-size: 1rem;\n line-height: 120%;\n}\n.text-16-normal, .text-16-normal-150, .text-16-normal-uppercase {\n font-weight: normal;\n}\n.text-16-normal-uppercase {\n text-transform: uppercase;\n}\n.text-16-normal-150 {\n line-height: 150%;\n}\n.text-16-bold, .text-16-bold-capitalize, .text-16-bold-uppercase {\n font-weight: 700;\n}\n.text-16-bold-uppercase {\n text-transform: uppercase;\n}\n.text-16-bold-capitalize {\n text-transform: capitalize;\n}\n.text-16-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-18, .text-18-italic, .text-18-bold, .text-18-bold-capitalize, .text-18-bold-uppercase, .text-18-normal, .text-18-normal-150, .text-18-normal-uppercase {\n font-style: normal;\n font-size: 1.125rem;\n line-height: 120%;\n}\n.text-18-normal, .text-18-normal-150, .text-18-normal-uppercase {\n font-weight: normal;\n}\n.text-18-normal-uppercase {\n text-transform: uppercase;\n}\n.text-18-normal-150 {\n line-height: 150%;\n}\n.text-18-bold, .text-18-bold-capitalize, .text-18-bold-uppercase {\n font-weight: 700;\n}\n.text-18-bold-uppercase {\n text-transform: uppercase;\n}\n.text-18-bold-capitalize {\n text-transform: capitalize;\n}\n.text-18-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-19, .text-19-italic, .text-19-bold, .text-19-bold-capitalize, .text-19-bold-uppercase, .text-19-normal, .text-19-normal-150, .text-19-normal-uppercase {\n font-style: normal;\n font-size: 1.188rem;\n line-height: 120%;\n}\n.text-19-normal, .text-19-normal-150, .text-19-normal-uppercase {\n font-weight: normal;\n}\n.text-19-normal-uppercase {\n text-transform: uppercase;\n}\n.text-19-normal-150 {\n line-height: 150%;\n}\n.text-19-bold, .text-19-bold-capitalize, .text-19-bold-uppercase {\n font-weight: 700;\n}\n.text-19-bold-uppercase {\n text-transform: uppercase;\n}\n.text-19-bold-capitalize {\n text-transform: capitalize;\n}\n.text-19-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-20, .text-20-italic, .text-20-bold, .text-20-bold-capitalize, .text-20-bold-uppercase, .text-20-normal, .text-20-normal-150, .text-20-normal-uppercase {\n font-style: normal;\n font-size: 1.25rem;\n line-height: 120%;\n}\n.text-20-normal, .text-20-normal-150, .text-20-normal-uppercase {\n font-weight: normal;\n}\n.text-20-normal-uppercase {\n text-transform: uppercase;\n}\n.text-20-normal-150 {\n line-height: 150%;\n}\n.text-20-bold, .text-20-bold-capitalize, .text-20-bold-uppercase {\n font-weight: 700;\n}\n.text-20-bold-uppercase {\n text-transform: uppercase;\n}\n.text-20-bold-capitalize {\n text-transform: capitalize;\n}\n.text-20-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-21, .text-21-italic, .text-21-bold, .text-21-bold-capitalize, .text-21-bold-uppercase, .text-21-normal, .text-21-normal-150, .text-21-normal-uppercase {\n font-style: normal;\n font-size: 1.313rem;\n line-height: 120%;\n}\n.text-21-normal, .text-21-normal-150, .text-21-normal-uppercase {\n font-weight: normal;\n}\n.text-21-normal-uppercase {\n text-transform: uppercase;\n}\n.text-21-normal-150 {\n line-height: 150%;\n}\n.text-21-bold, .text-21-bold-capitalize, .text-21-bold-uppercase {\n font-weight: 700;\n}\n.text-21-bold-uppercase {\n text-transform: uppercase;\n}\n.text-21-bold-capitalize {\n text-transform: capitalize;\n}\n.text-21-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-22, .text-22-italic, .text-22-bold, .text-22-bold-capitalize, .text-22-bold-uppercase, .text-22-normal, .text-22-normal-150, .text-22-normal-uppercase {\n font-style: normal;\n font-size: 1.375rem;\n line-height: 120%;\n}\n.text-22-normal, .text-22-normal-150, .text-22-normal-uppercase {\n font-weight: normal;\n}\n.text-22-normal-uppercase {\n text-transform: uppercase;\n}\n.text-22-normal-150 {\n line-height: 150%;\n}\n.text-22-bold, .text-22-bold-capitalize, .text-22-bold-uppercase {\n font-weight: 700;\n}\n.text-22-bold-uppercase {\n text-transform: uppercase;\n}\n.text-22-bold-capitalize {\n text-transform: capitalize;\n}\n.text-22-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-24, .text-24-italic, .text-24-bold, .text-24-bold-capitalize, .text-24-bold-uppercase, .text-24-normal, .text-24-normal-150, .text-24-normal-uppercase {\n font-style: normal;\n font-size: 1.5rem;\n line-height: 120%;\n}\n.text-24-normal, .text-24-normal-150, .text-24-normal-uppercase {\n font-weight: normal;\n}\n.text-24-normal-uppercase {\n text-transform: uppercase;\n}\n.text-24-normal-150 {\n line-height: 150%;\n}\n.text-24-bold, .text-24-bold-capitalize, .text-24-bold-uppercase {\n font-weight: 700;\n}\n.text-24-bold-uppercase {\n text-transform: uppercase;\n}\n.text-24-bold-capitalize {\n text-transform: capitalize;\n}\n.text-24-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-26, .text-26-italic, .text-26-bold, .text-26-bold-capitalize, .text-26-bold-uppercase, .text-26-normal, .text-26-normal-150, .text-26-normal-uppercase {\n font-style: normal;\n font-size: 1.625rem;\n line-height: 120%;\n}\n.text-26-normal, .text-26-normal-150, .text-26-normal-uppercase {\n font-weight: normal;\n}\n.text-26-normal-uppercase {\n text-transform: uppercase;\n}\n.text-26-normal-150 {\n line-height: 150%;\n}\n.text-26-bold, .text-26-bold-capitalize, .text-26-bold-uppercase {\n font-weight: 700;\n}\n.text-26-bold-uppercase {\n text-transform: uppercase;\n}\n.text-26-bold-capitalize {\n text-transform: capitalize;\n}\n.text-26-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-28, .text-28-italic, .text-28-bold, .text-28-bold-capitalize, .text-28-bold-uppercase, .text-28-normal, .text-28-normal-150, .text-28-normal-uppercase {\n font-style: normal;\n font-size: 1.75rem;\n line-height: 120%;\n}\n.text-28-normal, .text-28-normal-150, .text-28-normal-uppercase {\n font-weight: normal;\n}\n.text-28-normal-uppercase {\n text-transform: uppercase;\n}\n.text-28-normal-150 {\n line-height: 150%;\n}\n.text-28-bold, .text-28-bold-capitalize, .text-28-bold-uppercase {\n font-weight: 700;\n}\n.text-28-bold-uppercase {\n text-transform: uppercase;\n}\n.text-28-bold-capitalize {\n text-transform: capitalize;\n}\n.text-28-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-36, .text-36-italic, .text-36-bold, .text-36-bold-capitalize, .text-36-bold-uppercase, .text-36-normal, .text-36-normal-150, .text-36-normal-uppercase {\n font-style: normal;\n font-size: 2.25rem;\n line-height: 120%;\n}\n.text-36-normal, .text-36-normal-150, .text-36-normal-uppercase {\n font-weight: normal;\n}\n.text-36-normal-uppercase {\n text-transform: uppercase;\n}\n.text-36-normal-150 {\n line-height: 150%;\n}\n.text-36-bold, .text-36-bold-capitalize, .text-36-bold-uppercase {\n font-weight: 700;\n}\n.text-36-bold-uppercase {\n text-transform: uppercase;\n}\n.text-36-bold-capitalize {\n text-transform: capitalize;\n}\n.text-36-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n/* Card */\n.card-title-on {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1.125rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-text-bold {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-indicator {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n/* Chart */\n.chart-ticks-x-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n}\n@media only screen and (max-width : 768px) {\n .chart-ticks-x-text {\n font-size: 0.685rem;\n }\n}\n\n.chart-ticks-y-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 0.9rem;\n line-height: 120%;\n}\n@media only screen and (max-width : 768px) {\n .chart-ticks-y-text {\n font-size: 0.75rem;\n }\n}\n\n/* Cozy bar */\n.cozybar {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 1.3125rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.axis {\n color: #7b7b7b;\n}\n.axis .tick-text {\n fill: #7b7b7b;\n}\n.axis .tick-text.tick-text-selected {\n fill: #e0e0e0;\n}\n.axis .separator {\n text-align: center;\n margin: 0 2px;\n font-size: 1rem !important;\n}\n\n.value-text {\n fill: #7b7b7b;\n}\n.value-text.selected {\n fill: #e0e0e0;\n}\n\n.barContainer.disabled *,\n.barFill.disabled * {\n cursor: default !important;\n}\n.barContainer:hover,\n.barFill:hover {\n cursor: pointer;\n}\n\n.background-true {\n opacity: 0.1;\n}\n.background-true:hover {\n cursor: pointer;\n}\n\n.background-false {\n opacity: 0;\n}\n\n.bar-compare-ELECTRICITY:hover,\n.bar-compare-GAS:hover,\n.bar-compare-WATER:hover,\n.bar-compare-MULTIFLUID:hover,\n.bar-MULTIFLUID:hover,\n.bar-WATER:hover,\n.bar-GAS:hover,\n.bar-ELECTRICITY:hover {\n cursor: pointer;\n}\n.bar-compare-ELECTRICITY:hover.disabled,\n.bar-compare-GAS:hover.disabled,\n.bar-compare-WATER:hover.disabled,\n.bar-compare-MULTIFLUID:hover.disabled,\n.bar-MULTIFLUID:hover.disabled,\n.bar-WATER:hover.disabled,\n.bar-GAS:hover.disabled,\n.bar-ELECTRICITY:hover.disabled {\n cursor: default;\n}\n\n.bar-ELECTRICITY {\n fill: #5d3d2a;\n}\n.bar-ELECTRICITY.selected {\n fill: #d87b39;\n filter: drop-shadow(0 -0.1rem 0.2rem #d87b39);\n}\n\n.bar-compare-ELECTRICITY {\n fill: #795c47;\n}\n.bar-compare-ELECTRICITY.selected {\n fill: #e2bca1;\n filter: drop-shadow(0 -0.1rem 0.2rem #e2bca1);\n}\n\n.bar-WATER {\n fill: #20415e;\n}\n.bar-WATER.selected {\n fill: #3a98ec;\n filter: drop-shadow(0 -0.1rem 0.2rem #3a98ec);\n}\n\n.bar-compare-WATER {\n fill: #4d5c6e;\n}\n.bar-compare-WATER.selected {\n fill: #abd4fa;\n filter: drop-shadow(0 -0.1rem 0.2rem #abd4fa);\n}\n\n.bar-GAS {\n fill: #184940;\n}\n.bar-GAS.selected {\n fill: #45d1b8;\n filter: drop-shadow(0 -0.1rem 0.2rem #45d1b8);\n}\n\n.bar-compare-GAS {\n fill: #597773;\n}\n.bar-compare-GAS.selected {\n fill: #a8f7e9;\n filter: drop-shadow(0 -0.1rem 0.2rem #a8f7e9);\n}\n\n.bar-MULTIFLUID {\n fill: #705d1d;\n}\n.bar-MULTIFLUID.selected {\n fill: #e3b82a;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n.bar-MULTIFLUID.disabled:hover {\n cursor: default;\n}\n\n.bar-duel {\n fill: #61f0f2;\n}\n.bar-duel.selected {\n fill: #61f0f2;\n filter: drop-shadow(0 -0.1rem 0.2rem #61f0f2);\n}\n.bar-duel.disabled:hover {\n cursor: default;\n}\n\n.bar-UPCOMING {\n fill: #7b7b7b;\n opacity: 0.6;\n}\n.bar-UPCOMING.selected {\n fill: #7b7b7b;\n}\n.bar-UPCOMING.disabled:hover {\n cursor: default;\n}\n\n.bar-compare-MULTIFLUID {\n fill: #7d6a4e;\n}\n.bar-compare-MULTIFLUID.selected {\n fill: #ffd597;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n\n.bar-average {\n stroke-width: 2;\n stroke: #e3b82a;\n}\n\n.week {\n fill: #e2bca1;\n}\n.week.selected {\n fill: #e2bca1;\n filter: drop-shadow(0 -0.1rem 0.2rem #e2bca1);\n}\n\n.weekend {\n fill: #ffd597;\n}\n.weekend.selected {\n fill: #ffd597;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n\n/** Animation **/\n.bounce-1 {\n animation-name: bounce-1;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n transform-box: fill-box;\n}\n\n@keyframes bounce-1 {\n 0% {\n transform: scale(0.1, 0.1);\n }\n 28% {\n transform: scale(0.1, 1.1);\n }\n 45% {\n transform: scale(0.8, 0.95);\n }\n 55% {\n transform: scale(1, 1);\n }\n 65% {\n transform: scale(1, 0.98);\n }\n 75% {\n transform: scale(1, 1);\n }\n}\n.bounce-2 {\n animation-name: bounce-2;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n transform-box: fill-box;\n}\n\n@keyframes bounce-2 {\n 0% {\n transform: scale(1, 1);\n }\n 28% {\n transform: scale(1, 1.1);\n }\n 45% {\n transform: scale(0.8, 0.95);\n }\n 55% {\n transform: scale(1, 1);\n }\n 65% {\n transform: scale(1, 0.98);\n }\n 75% {\n transform: scale(1, 1);\n }\n}\n.bounce-3 {\n animation-name: bounce-3;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n}\n\n@keyframes bounce-3 {\n 0% {\n opacity: 0.6;\n transform: scaleY(1);\n }\n 50% {\n transform: scaleY(1.1);\n opacity: 0.8;\n }\n 100% {\n transform: scaleY(1);\n opacity: 1;\n }\n}\n/** Animation delay **/\n.delay {\n animation-duration: 0.4s;\n}\n\n.delay--0 {\n animation-duration: 0.4s;\n}\n\n.delay--1 {\n animation-duration: 0.48s;\n}\n\n.delay--2 {\n animation-duration: 0.56s;\n}\n\n.delay--3 {\n animation-duration: 0.64s;\n}\n\n.delay--4 {\n animation-duration: 0.72s;\n}\n\n.delay--5 {\n animation-duration: 0.8s;\n}\n\n.delay--6 {\n animation-duration: 0.88s;\n}\n\n.delay--7 {\n animation-duration: 0.96s;\n}\n\n.delay--8 {\n animation-duration: 1.04s;\n}\n\n.delay--9 {\n animation-duration: 1.12s;\n}\n\n.delay--10 {\n animation-duration: 1.2s;\n}\n\n.delay--11 {\n animation-duration: 1.28s;\n}\n\n.delay--12 {\n animation-duration: 1.36s;\n}\n\n.delay--13 {\n animation-duration: 1.44s;\n}\n\n.delay--14 {\n animation-duration: 1.52s;\n}\n\n.delay--15 {\n animation-duration: 1.6s;\n}\n\n.delay--16 {\n animation-duration: 1.68s;\n}\n\n.delay--17 {\n animation-duration: 1.76s;\n}\n\n.delay--18 {\n animation-duration: 1.84s;\n}\n\n.delay--19 {\n animation-duration: 1.92s;\n}\n\n.delay--20 {\n animation-duration: 2s;\n}\n\n.delay--21 {\n animation-duration: 2.08s;\n}\n\n.delay--22 {\n animation-duration: 2.16s;\n}\n\n.delay--23 {\n animation-duration: 2.24s;\n}\n\n.delay--24 {\n animation-duration: 2.32s;\n}\n\n.delay--25 {\n animation-duration: 2.4s;\n}\n\n.delay--26 {\n animation-duration: 2.48s;\n}\n\n.delay--27 {\n animation-duration: 2.56s;\n}\n\n.delay--28 {\n animation-duration: 2.64s;\n}\n\n.delay--29 {\n animation-duration: 2.72s;\n}\n\n.delay--30 {\n animation-duration: 2.8s;\n}\n\n.delay--31 {\n animation-duration: 2.88s;\n}\n\n.delay--32 {\n animation-duration: 2.96s;\n}\n\n.delay--33 {\n animation-duration: 3.04s;\n}\n\n.delay--34 {\n animation-duration: 3.12s;\n}\n\n.delay--35 {\n animation-duration: 3.2s;\n}\n\n.delay--36 {\n animation-duration: 3.28s;\n}\n\n.delay--37 {\n animation-duration: 3.36s;\n}\n\n.delay--38 {\n animation-duration: 3.44s;\n}\n\n.delay--39 {\n animation-duration: 3.52s;\n}\n\n.delay--40 {\n animation-duration: 3.6s;\n}\n\n.delay--41 {\n animation-duration: 3.68s;\n}\n\n.delay--42 {\n animation-duration: 3.76s;\n}\n\n.delay--43 {\n animation-duration: 3.84s;\n}\n\n.delay--44 {\n animation-duration: 3.92s;\n}\n\n.delay--45 {\n animation-duration: 4s;\n}\n\n.delay--46 {\n animation-duration: 4.08s;\n}\n\n.delay--47 {\n animation-duration: 4.16s;\n}\n\n.delay--48 {\n animation-duration: 4.24s;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\nbutton span {\n font-size: 1rem;\n font-weight: 700;\n}\nbutton.btnPrimary {\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017;\n border: 1px solid;\n border-color: transparent;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n}\nbutton.btnPrimary span:first-child {\n color: #121212;\n}\nbutton.btnPrimary:hover, button.btnPrimary:focus, button.btnPrimary.active, button.btnPrimary:disabled {\n background-color: #b89318;\n}\nbutton.btnPrimary:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btnSecondary {\n background: transparent;\n border: 1px solid;\n border-color: #e0e0e0;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n}\nbutton.btnSecondary span:first-child {\n color: #e0e0e0;\n}\nbutton.btnSecondary:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btnText {\n text-decoration: underline;\n}\nbutton.btnText span {\n text-transform: none;\n font-weight: 400;\n}\nbutton.btnPrimaryNegative {\n background: linear-gradient(180deg, #61f0f2 0%, #48c2c4 100%);\n border: 1px solid;\n border-color: transparent;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n}\nbutton.btnPrimaryNegative span:first-child {\n color: #121212;\n}\nbutton.btnPrimaryNegative:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btnPrimaryNegative:hover {\n opacity: 0.7;\n}\nbutton.btnIncrement {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n border: 1px solid;\n border-color: transparent;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n min-width: 40px;\n width: 40px;\n height: 40px;\n border-radius: 4px;\n box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.55);\n}\nbutton.btnIncrement span:first-child {\n color: #ffffff;\n}\nbutton.btnIncrement:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ninput.inputText,\ninput.inputNumber {\n box-sizing: border-box;\n border: 1px solid #7b7b7b;\n background: transparent;\n transition: all 300ms ease;\n color: #e0e0e0;\n}\ninput.inputText:focus, input.inputText:focus-visible,\ninput.inputNumber:focus,\ninput.inputNumber:focus-visible {\n border-color: #e3b82a;\n outline: none;\n}\n\ninput.inputText {\n appearance: none;\n border-radius: 4px;\n height: 45px;\n width: 100%;\n max-width: 280px;\n padding: 0 0.5rem;\n}\n\ninput.inputNumber {\n border-radius: 2px;\n height: 40px;\n width: 60px;\n max-width: 5rem;\n text-align: center;\n}\n\ninput.inputCheckbox {\n width: 24px;\n min-width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n border-radius: 4px;\n cursor: pointer;\n appearance: none;\n background: #121212;\n position: relative;\n border: solid 1px #7b7b7b;\n}\ninput.inputCheckbox:checked {\n background: #e3b82a;\n border-color: #e3b82a;\n}\ninput.inputCheckbox:checked:before, input.inputCheckbox:checked:after {\n content: \"\";\n position: absolute;\n display: inline-block;\n background: #121212;\n border-radius: 0.5rem;\n}\ninput.inputCheckbox:checked:before {\n width: 3px;\n height: 12px;\n left: 10px;\n top: 4px;\n transform: rotate(41deg);\n}\ninput.inputCheckbox:checked:after {\n width: 3px;\n height: 6px;\n left: 5px;\n top: 8px;\n transform: rotate(133deg);\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.card {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n box-sizing: border-box;\n box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);\n border-radius: 4px;\n padding: 16px;\n}\n.card:hover {\n background: linear-gradient(180deg, rgba(70, 71, 77, 0.7) 0%, rgba(57, 58, 63, 0.7) 100%);\n}\n.card.rich-card {\n padding: 16px;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ndiv.modal-root .MuiBackdrop-root {\n background-color: hsla(231deg, 11%, 12%, 0.85);\n}\n\ndiv.modal-paper {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n width: 36rem;\n max-width: 100%;\n max-height: 90vh;\n padding: 2rem;\n box-sizing: border-box;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n margin: 0 0 0 13.75rem;\n align-items: center;\n color: #ffffff;\n}\n@media only screen and (max-width : 1023px) {\n div.modal-paper {\n width: 35rem;\n margin: 0;\n }\n}\n@media only screen and (max-width : 768px) {\n div.modal-paper {\n padding: 1rem 1rem 1.5rem;\n width: 85%;\n max-width: 35rem;\n margin: 0;\n }\n}\ndiv.modal-paper.no-padding {\n padding: 0;\n}\ndiv.modal-paper.blue-border {\n border: 1px solid rgba(88, 255, 255, 0.2509803922);\n}\ndiv.modal-paper.blue-light-border {\n border: 1px solid #61f0f2;\n}\ndiv.modal-paper.yellow-border {\n border: 1px solid rgba(227, 184, 42, 0.4);\n}\ndiv.modal-paper .modal-paper-close-button {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n padding: 5px 5px;\n z-index: 10;\n}\n\ndiv.modal-paper-full-screen {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n width: 100%;\n max-width: 100%;\n height: 100%;\n max-height: 100%;\n padding: 0;\n margin: 0;\n box-sizing: border-box;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n color: #ffffff;\n display: flex;\n align-items: center;\n}\ndiv.modal-paper-full-screen.dark-background {\n background: #121212;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ndiv.expansion-panel-root {\n margin: 1.2rem 0;\n color: #e0e0e0;\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n border-radius: 4px;\n box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);\n transition: background-color 0.6s ease;\n box-sizing: border-box;\n}\ndiv.expansion-panel-root.Mui-expanded:first-child {\n margin: 1.2rem 0;\n}\ndiv.expansion-panel-root.Mui-expanded:last-child {\n margin: 1.2rem 0;\n}\ndiv.expansion-panel-root.red-border {\n border: 1px solid #d25959;\n}\n\ndiv.expansion-panel-summary {\n padding: 0.25rem 1.2rem;\n min-height: 4rem;\n}\ndiv.expansion-panel-summary.Mui-focused {\n border-radius: 4px;\n background-color: unset;\n box-shadow: 0 0 0 1px #e0e0e0;\n}\ndiv.expansion-panel-summary.Mui-expanded {\n min-height: 4rem;\n}\ndiv.expansion-panel-summary.Mui-expanded.small {\n min-height: 3rem;\n}\ndiv.expansion-panel-summary.small {\n padding: 0 1.2rem;\n min-height: 3rem;\n}\ndiv.expansion-panel-summary.bold-text {\n font-weight: bold;\n}\n\ndiv.expansion-panel-content {\n display: flex;\n align-items: center;\n}\ndiv.expansion-panel-content.Mui-expanded {\n margin: 0.75rem 0;\n}\n\ndiv.expansion-panel-details {\n padding: 0 1.2rem 1.2rem;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\na {\n color: #deaf0e;\n}\na:visited {\n color: #deaf0e;\n}\n\na:focus {\n outline: none;\n box-shadow: inset 0 0 0 1px #e0e0e0;\n}\na:focus > div:first-child {\n box-shadow: 0 0 0 1px #e0e0e0;\n}\n\na.MuiLink-underlineHover:hover {\n text-decoration: none;\n}\n\na.MuiTypography-colorPrimary {\n color: #e0e0e0;\n}\n\n:root {\n white-space: pre-line;\n --blue: #58ffff;\n --blue40: rgba(88, 255, 255, 0.2509803922);\n --blueBackground: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n --blueRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n --blueRadialGradientTrans: radial-gradient(circle, #58ffff 0%, rgba(255, 255, 255, 0) 100%);\n --elecColor: #d87b39;\n --elecColor40: rgba(216, 123, 57, 0.4);\n --elecCompareColor: #e2bca1;\n --gasColor: #45d1b8;\n --gasColor40: rgba(69, 209, 184, 0.4);\n --gasCompareColor: #a8f7e9;\n --waterColor: #3a98ec;\n --waterColor40: rgba(58, 152, 236, 0.4);\n --waterCompareColor: #abd4fa;\n --multiColor: #e3b82a;\n --multiCompareColor: #ffd597;\n --redPrimary: #d25959;\n --greyBright: #e0e0e0;\n --greyDark: #7b7b7b;\n --textWhite: #ffffff;\n --softGrey: #a0a0a0;\n --darkLight: #25262b;\n --darkLight2: #121212;\n --textFont: Lato, sans-serif;\n --greyLinearGradientBackground: linear-gradient(180deg, #323339 0%, #25262b 100%);\n --multiColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%);\n --elecColorRadialGradientTrans: radial-gradient(circle, #d87b39 0%, rgba(255, 255, 255, 0) 100%);\n --waterColorRadialGradientTrans: radial-gradient(circle, #3a98ec 0%, rgba(255, 255, 255, 0) 100%);\n --gasColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%);\n --multiColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017;\n --elecColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(158, 67, 2, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #d87b39;\n --gasColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(4, 106, 88, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #45d1b8;\n --waterColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(2, 93, 174, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #3a98ec;\n}\n\n.application {\n overflow-x: hidden;\n background-color: #121212;\n}\n\n.accordion-icon {\n color: #ffffff;\n}\n\n.loaderContainer {\n height: 80vh;\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n}\n\n.makeStyles-fab-1 {\n top: 12px;\n left: 3rem !important;\n width: 36px !important;\n height: 36px !important;\n background-color: #323339 !important;\n}\n\ninput:-webkit-autofill,\ninput:-webkit-autofill:hover,\ninput:-webkit-autofill:focus,\ninput:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px #1b1c22 inset !important;\n}", ""]); +exports.push([module.i, "/* Cozy UI utilities classes */\n/* Cozy UI React components styles */\n/* App styles */\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\nhtml {\n background: #121212;\n}\n\nbody {\n background: #121212;\n overflow: unset !important;\n color: #e0e0e0;\n}\n\n.column {\n display: flex;\n flex-direction: column;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.cozy-bar {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: 0;\n}\n\n[role=banner] .coz-bar-container {\n background-color: #ffffff;\n}\n@media only screen and (max-width : 768px) {\n [role=banner] .coz-bar-container {\n padding: 0.6rem 0 0 0;\n background-color: unset;\n }\n}\n\n.coz-bar-wrapper {\n box-shadow: unset !important;\n background: unset !important;\n}\n\n.coz-label {\n color: #32363f;\n}\n\n.content-view-loading {\n height: 80vh;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n color: #e0e0e0;\n}\n.content-view-loading .content-view-loading-text {\n padding-top: 1rem;\n margin: 0 2rem;\n text-align: center;\n}\n.content-view-loading .content-view-loading-button {\n max-width: 50vw;\n margin-top: 1rem;\n}\n\n[role=main] {\n /* width */\n /* Track */\n /* Handle */\n}\n[role=main]::-webkit-scrollbar {\n width: 10px;\n}\n[role=main]::-webkit-scrollbar-track {\n background: #3e4045;\n}\n[role=main]::-webkit-scrollbar-thumb {\n background: #6f7074;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n* {\n font-family: Lato, sans-serif;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np {\n color: #a0a0a0;\n font-family: Lato, sans-serif;\n}\n\n.home-title {\n font-size: 1rem;\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 120%;\n text-transform: uppercase;\n}\n\n.app-title {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 21px;\n line-height: 24px;\n text-align: center;\n letter-spacing: 0.15px;\n color: #e0e0e0;\n text-shadow: 0px -1px 0px #060609, 0px 1px 0px rgba(255, 255, 255, 0.07);\n}\n\n.text-10, .text-10-italic, .text-10-bold, .text-10-bold-capitalize, .text-10-bold-uppercase, .text-10-normal, .text-10-normal-150, .text-10-normal-uppercase {\n font-style: normal;\n font-size: 0.625rem;\n line-height: 120%;\n}\n.text-10-normal, .text-10-normal-150, .text-10-normal-uppercase {\n font-weight: normal;\n}\n.text-10-normal-uppercase {\n text-transform: uppercase;\n}\n.text-10-normal-150 {\n line-height: 150%;\n}\n.text-10-bold, .text-10-bold-capitalize, .text-10-bold-uppercase {\n font-weight: 700;\n}\n.text-10-bold-uppercase {\n text-transform: uppercase;\n}\n.text-10-bold-capitalize {\n text-transform: capitalize;\n}\n.text-10-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-12, .text-12-italic, .text-12-bold, .text-12-bold-capitalize, .text-12-bold-uppercase, .text-12-normal, .text-12-normal-150, .text-12-normal-uppercase {\n font-style: normal;\n font-size: 0.75rem;\n line-height: 120%;\n}\n.text-12-normal, .text-12-normal-150, .text-12-normal-uppercase {\n font-weight: normal;\n}\n.text-12-normal-uppercase {\n text-transform: uppercase;\n}\n.text-12-normal-150 {\n line-height: 150%;\n}\n.text-12-bold, .text-12-bold-capitalize, .text-12-bold-uppercase {\n font-weight: 700;\n}\n.text-12-bold-uppercase {\n text-transform: uppercase;\n}\n.text-12-bold-capitalize {\n text-transform: capitalize;\n}\n.text-12-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-13, .text-13-italic, .text-13-bold, .text-13-bold-capitalize, .text-13-bold-uppercase, .text-13-normal, .text-13-normal-150, .text-13-normal-uppercase {\n font-style: normal;\n font-size: 0.8125rem;\n line-height: 120%;\n}\n.text-13-normal, .text-13-normal-150, .text-13-normal-uppercase {\n font-weight: normal;\n}\n.text-13-normal-uppercase {\n text-transform: uppercase;\n}\n.text-13-normal-150 {\n line-height: 150%;\n}\n.text-13-bold, .text-13-bold-capitalize, .text-13-bold-uppercase {\n font-weight: 700;\n}\n.text-13-bold-uppercase {\n text-transform: uppercase;\n}\n.text-13-bold-capitalize {\n text-transform: capitalize;\n}\n.text-13-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-14, .text-14-italic, .text-14-bold, .text-14-bold-capitalize, .text-14-bold-uppercase, .text-14-normal, .text-14-normal-150, .text-14-normal-uppercase {\n font-style: normal;\n font-size: 0.875rem;\n line-height: 120%;\n}\n.text-14-normal, .text-14-normal-150, .text-14-normal-uppercase {\n font-weight: normal;\n}\n.text-14-normal-uppercase {\n text-transform: uppercase;\n}\n.text-14-normal-150 {\n line-height: 150%;\n}\n.text-14-bold, .text-14-bold-capitalize, .text-14-bold-uppercase {\n font-weight: 700;\n}\n.text-14-bold-uppercase {\n text-transform: uppercase;\n}\n.text-14-bold-capitalize {\n text-transform: capitalize;\n}\n.text-14-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-15, .text-15-italic, .text-15-bold, .text-15-bold-capitalize, .text-15-bold-uppercase, .text-15-normal, .text-15-normal-150, .text-15-normal-uppercase {\n font-style: normal;\n font-size: 0.938rem;\n line-height: 120%;\n}\n.text-15-normal, .text-15-normal-150, .text-15-normal-uppercase {\n font-weight: normal;\n}\n.text-15-normal-uppercase {\n text-transform: uppercase;\n}\n.text-15-normal-150 {\n line-height: 150%;\n}\n.text-15-bold, .text-15-bold-capitalize, .text-15-bold-uppercase {\n font-weight: 700;\n}\n.text-15-bold-uppercase {\n text-transform: uppercase;\n}\n.text-15-bold-capitalize {\n text-transform: capitalize;\n}\n.text-15-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-16, .text-16-italic, .text-16-bold, .text-16-bold-capitalize, .text-16-bold-uppercase, .text-16-normal, .text-16-normal-150, .text-16-normal-uppercase {\n font-style: normal;\n font-size: 1rem;\n line-height: 120%;\n}\n.text-16-normal, .text-16-normal-150, .text-16-normal-uppercase {\n font-weight: normal;\n}\n.text-16-normal-uppercase {\n text-transform: uppercase;\n}\n.text-16-normal-150 {\n line-height: 150%;\n}\n.text-16-bold, .text-16-bold-capitalize, .text-16-bold-uppercase {\n font-weight: 700;\n}\n.text-16-bold-uppercase {\n text-transform: uppercase;\n}\n.text-16-bold-capitalize {\n text-transform: capitalize;\n}\n.text-16-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-18, .text-18-italic, .text-18-bold, .text-18-bold-capitalize, .text-18-bold-uppercase, .text-18-normal, .text-18-normal-150, .text-18-normal-uppercase {\n font-style: normal;\n font-size: 1.125rem;\n line-height: 120%;\n}\n.text-18-normal, .text-18-normal-150, .text-18-normal-uppercase {\n font-weight: normal;\n}\n.text-18-normal-uppercase {\n text-transform: uppercase;\n}\n.text-18-normal-150 {\n line-height: 150%;\n}\n.text-18-bold, .text-18-bold-capitalize, .text-18-bold-uppercase {\n font-weight: 700;\n}\n.text-18-bold-uppercase {\n text-transform: uppercase;\n}\n.text-18-bold-capitalize {\n text-transform: capitalize;\n}\n.text-18-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-19, .text-19-italic, .text-19-bold, .text-19-bold-capitalize, .text-19-bold-uppercase, .text-19-normal, .text-19-normal-150, .text-19-normal-uppercase {\n font-style: normal;\n font-size: 1.188rem;\n line-height: 120%;\n}\n.text-19-normal, .text-19-normal-150, .text-19-normal-uppercase {\n font-weight: normal;\n}\n.text-19-normal-uppercase {\n text-transform: uppercase;\n}\n.text-19-normal-150 {\n line-height: 150%;\n}\n.text-19-bold, .text-19-bold-capitalize, .text-19-bold-uppercase {\n font-weight: 700;\n}\n.text-19-bold-uppercase {\n text-transform: uppercase;\n}\n.text-19-bold-capitalize {\n text-transform: capitalize;\n}\n.text-19-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-20, .text-20-italic, .text-20-bold, .text-20-bold-capitalize, .text-20-bold-uppercase, .text-20-normal, .text-20-normal-150, .text-20-normal-uppercase {\n font-style: normal;\n font-size: 1.25rem;\n line-height: 120%;\n}\n.text-20-normal, .text-20-normal-150, .text-20-normal-uppercase {\n font-weight: normal;\n}\n.text-20-normal-uppercase {\n text-transform: uppercase;\n}\n.text-20-normal-150 {\n line-height: 150%;\n}\n.text-20-bold, .text-20-bold-capitalize, .text-20-bold-uppercase {\n font-weight: 700;\n}\n.text-20-bold-uppercase {\n text-transform: uppercase;\n}\n.text-20-bold-capitalize {\n text-transform: capitalize;\n}\n.text-20-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-21, .text-21-italic, .text-21-bold, .text-21-bold-capitalize, .text-21-bold-uppercase, .text-21-normal, .text-21-normal-150, .text-21-normal-uppercase {\n font-style: normal;\n font-size: 1.313rem;\n line-height: 120%;\n}\n.text-21-normal, .text-21-normal-150, .text-21-normal-uppercase {\n font-weight: normal;\n}\n.text-21-normal-uppercase {\n text-transform: uppercase;\n}\n.text-21-normal-150 {\n line-height: 150%;\n}\n.text-21-bold, .text-21-bold-capitalize, .text-21-bold-uppercase {\n font-weight: 700;\n}\n.text-21-bold-uppercase {\n text-transform: uppercase;\n}\n.text-21-bold-capitalize {\n text-transform: capitalize;\n}\n.text-21-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-22, .text-22-italic, .text-22-bold, .text-22-bold-capitalize, .text-22-bold-uppercase, .text-22-normal, .text-22-normal-150, .text-22-normal-uppercase {\n font-style: normal;\n font-size: 1.375rem;\n line-height: 120%;\n}\n.text-22-normal, .text-22-normal-150, .text-22-normal-uppercase {\n font-weight: normal;\n}\n.text-22-normal-uppercase {\n text-transform: uppercase;\n}\n.text-22-normal-150 {\n line-height: 150%;\n}\n.text-22-bold, .text-22-bold-capitalize, .text-22-bold-uppercase {\n font-weight: 700;\n}\n.text-22-bold-uppercase {\n text-transform: uppercase;\n}\n.text-22-bold-capitalize {\n text-transform: capitalize;\n}\n.text-22-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-24, .text-24-italic, .text-24-bold, .text-24-bold-capitalize, .text-24-bold-uppercase, .text-24-normal, .text-24-normal-150, .text-24-normal-uppercase {\n font-style: normal;\n font-size: 1.5rem;\n line-height: 120%;\n}\n.text-24-normal, .text-24-normal-150, .text-24-normal-uppercase {\n font-weight: normal;\n}\n.text-24-normal-uppercase {\n text-transform: uppercase;\n}\n.text-24-normal-150 {\n line-height: 150%;\n}\n.text-24-bold, .text-24-bold-capitalize, .text-24-bold-uppercase {\n font-weight: 700;\n}\n.text-24-bold-uppercase {\n text-transform: uppercase;\n}\n.text-24-bold-capitalize {\n text-transform: capitalize;\n}\n.text-24-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-26, .text-26-italic, .text-26-bold, .text-26-bold-capitalize, .text-26-bold-uppercase, .text-26-normal, .text-26-normal-150, .text-26-normal-uppercase {\n font-style: normal;\n font-size: 1.625rem;\n line-height: 120%;\n}\n.text-26-normal, .text-26-normal-150, .text-26-normal-uppercase {\n font-weight: normal;\n}\n.text-26-normal-uppercase {\n text-transform: uppercase;\n}\n.text-26-normal-150 {\n line-height: 150%;\n}\n.text-26-bold, .text-26-bold-capitalize, .text-26-bold-uppercase {\n font-weight: 700;\n}\n.text-26-bold-uppercase {\n text-transform: uppercase;\n}\n.text-26-bold-capitalize {\n text-transform: capitalize;\n}\n.text-26-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-28, .text-28-italic, .text-28-bold, .text-28-bold-capitalize, .text-28-bold-uppercase, .text-28-normal, .text-28-normal-150, .text-28-normal-uppercase {\n font-style: normal;\n font-size: 1.75rem;\n line-height: 120%;\n}\n.text-28-normal, .text-28-normal-150, .text-28-normal-uppercase {\n font-weight: normal;\n}\n.text-28-normal-uppercase {\n text-transform: uppercase;\n}\n.text-28-normal-150 {\n line-height: 150%;\n}\n.text-28-bold, .text-28-bold-capitalize, .text-28-bold-uppercase {\n font-weight: 700;\n}\n.text-28-bold-uppercase {\n text-transform: uppercase;\n}\n.text-28-bold-capitalize {\n text-transform: capitalize;\n}\n.text-28-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-36, .text-36-italic, .text-36-bold, .text-36-bold-capitalize, .text-36-bold-uppercase, .text-36-normal, .text-36-normal-150, .text-36-normal-uppercase {\n font-style: normal;\n font-size: 2.25rem;\n line-height: 120%;\n}\n.text-36-normal, .text-36-normal-150, .text-36-normal-uppercase {\n font-weight: normal;\n}\n.text-36-normal-uppercase {\n text-transform: uppercase;\n}\n.text-36-normal-150 {\n line-height: 150%;\n}\n.text-36-bold, .text-36-bold-capitalize, .text-36-bold-uppercase {\n font-weight: 700;\n}\n.text-36-bold-uppercase {\n text-transform: uppercase;\n}\n.text-36-bold-capitalize {\n text-transform: capitalize;\n}\n.text-36-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n/* Card */\n.card-title-on {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1.125rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-text-bold {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-indicator {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n/* Chart */\n.chart-ticks-x-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n}\n@media only screen and (max-width : 768px) {\n .chart-ticks-x-text {\n font-size: 0.685rem;\n }\n}\n\n.chart-ticks-y-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 0.9rem;\n line-height: 120%;\n}\n@media only screen and (max-width : 768px) {\n .chart-ticks-y-text {\n font-size: 0.75rem;\n }\n}\n\n/* Cozy bar */\n.cozybar {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 1.3125rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.axis {\n color: #7b7b7b;\n}\n.axis .tick-text {\n fill: #7b7b7b;\n}\n.axis .tick-text.tick-text-selected {\n fill: #e0e0e0;\n}\n.axis .separator {\n text-align: center;\n margin: 0 2px;\n font-size: 1rem !important;\n}\n\n.value-text {\n fill: #7b7b7b;\n}\n.value-text.selected {\n fill: #e0e0e0;\n}\n\n.barContainer.disabled *,\n.barFill.disabled * {\n cursor: default !important;\n}\n.barContainer:hover,\n.barFill:hover {\n cursor: pointer;\n}\n\n.background-true {\n opacity: 0.1;\n}\n.background-true:hover {\n cursor: pointer;\n}\n\n.background-false {\n opacity: 0;\n}\n\n.bar-compare-ELECTRICITY:hover,\n.bar-compare-GAS:hover,\n.bar-compare-WATER:hover,\n.bar-compare-MULTIFLUID:hover,\n.bar-MULTIFLUID:hover,\n.bar-WATER:hover,\n.bar-GAS:hover,\n.bar-ELECTRICITY:hover {\n cursor: pointer;\n}\n.bar-compare-ELECTRICITY:hover.disabled,\n.bar-compare-GAS:hover.disabled,\n.bar-compare-WATER:hover.disabled,\n.bar-compare-MULTIFLUID:hover.disabled,\n.bar-MULTIFLUID:hover.disabled,\n.bar-WATER:hover.disabled,\n.bar-GAS:hover.disabled,\n.bar-ELECTRICITY:hover.disabled {\n cursor: default;\n}\n\n.bar-ELECTRICITY {\n fill: #5d3d2a;\n}\n.bar-ELECTRICITY.selected {\n fill: #d87b39;\n filter: drop-shadow(0 -0.1rem 0.2rem #d87b39);\n}\n\n.bar-compare-ELECTRICITY {\n fill: #795c47;\n}\n.bar-compare-ELECTRICITY.selected {\n fill: #e2bca1;\n filter: drop-shadow(0 -0.1rem 0.2rem #e2bca1);\n}\n\n.bar-WATER {\n fill: #20415e;\n}\n.bar-WATER.selected {\n fill: #3a98ec;\n filter: drop-shadow(0 -0.1rem 0.2rem #3a98ec);\n}\n\n.bar-compare-WATER {\n fill: #4d5c6e;\n}\n.bar-compare-WATER.selected {\n fill: #abd4fa;\n filter: drop-shadow(0 -0.1rem 0.2rem #abd4fa);\n}\n\n.bar-GAS {\n fill: #184940;\n}\n.bar-GAS.selected {\n fill: #45d1b8;\n filter: drop-shadow(0 -0.1rem 0.2rem #45d1b8);\n}\n\n.bar-compare-GAS {\n fill: #597773;\n}\n.bar-compare-GAS.selected {\n fill: #a8f7e9;\n filter: drop-shadow(0 -0.1rem 0.2rem #a8f7e9);\n}\n\n.bar-MULTIFLUID {\n fill: #705d1d;\n}\n.bar-MULTIFLUID.selected {\n fill: #e3b82a;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n.bar-MULTIFLUID.disabled:hover {\n cursor: default;\n}\n\n.bar-duel {\n fill: #61f0f2;\n}\n.bar-duel.selected {\n fill: #61f0f2;\n filter: drop-shadow(0 -0.1rem 0.2rem #61f0f2);\n}\n.bar-duel.disabled:hover {\n cursor: default;\n}\n\n.bar-UPCOMING {\n fill: #7b7b7b;\n opacity: 0.6;\n}\n.bar-UPCOMING.selected {\n fill: #7b7b7b;\n}\n.bar-UPCOMING.disabled:hover {\n cursor: default;\n}\n\n.bar-compare-MULTIFLUID {\n fill: #7d6a4e;\n}\n.bar-compare-MULTIFLUID.selected {\n fill: #ffd597;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n\n.bar-average {\n stroke-width: 2;\n stroke: #e3b82a;\n}\n\n.week {\n fill: #e2bca1;\n}\n.week.selected {\n fill: #e2bca1;\n filter: drop-shadow(0 -0.1rem 0.2rem #e2bca1);\n}\n\n.weekend {\n fill: #ffd597;\n}\n.weekend.selected {\n fill: #ffd597;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n\n.barValue {\n outline: none;\n}\n.barValue:focus-visible {\n outline: 1px solid;\n}\n\n/** Animation **/\n.bounce-1 {\n animation-name: bounce-1;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n transform-box: fill-box;\n}\n\n@keyframes bounce-1 {\n 0% {\n transform: scale(0.1, 0.1);\n }\n 28% {\n transform: scale(0.1, 1.1);\n }\n 45% {\n transform: scale(0.8, 0.95);\n }\n 55% {\n transform: scale(1, 1);\n }\n 65% {\n transform: scale(1, 0.98);\n }\n 75% {\n transform: scale(1, 1);\n }\n}\n.bounce-2 {\n animation-name: bounce-2;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n transform-box: fill-box;\n}\n\n@keyframes bounce-2 {\n 0% {\n transform: scale(1, 1);\n }\n 28% {\n transform: scale(1, 1.1);\n }\n 45% {\n transform: scale(0.8, 0.95);\n }\n 55% {\n transform: scale(1, 1);\n }\n 65% {\n transform: scale(1, 0.98);\n }\n 75% {\n transform: scale(1, 1);\n }\n}\n.bounce-3 {\n animation-name: bounce-3;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n}\n\n@keyframes bounce-3 {\n 0% {\n opacity: 0.6;\n transform: scaleY(1);\n }\n 50% {\n transform: scaleY(1.1);\n opacity: 0.8;\n }\n 100% {\n transform: scaleY(1);\n opacity: 1;\n }\n}\n/** Animation delay **/\n.delay {\n animation-duration: 0.4s;\n}\n\n.delay--0 {\n animation-duration: 0.4s;\n}\n\n.delay--1 {\n animation-duration: 0.48s;\n}\n\n.delay--2 {\n animation-duration: 0.56s;\n}\n\n.delay--3 {\n animation-duration: 0.64s;\n}\n\n.delay--4 {\n animation-duration: 0.72s;\n}\n\n.delay--5 {\n animation-duration: 0.8s;\n}\n\n.delay--6 {\n animation-duration: 0.88s;\n}\n\n.delay--7 {\n animation-duration: 0.96s;\n}\n\n.delay--8 {\n animation-duration: 1.04s;\n}\n\n.delay--9 {\n animation-duration: 1.12s;\n}\n\n.delay--10 {\n animation-duration: 1.2s;\n}\n\n.delay--11 {\n animation-duration: 1.28s;\n}\n\n.delay--12 {\n animation-duration: 1.36s;\n}\n\n.delay--13 {\n animation-duration: 1.44s;\n}\n\n.delay--14 {\n animation-duration: 1.52s;\n}\n\n.delay--15 {\n animation-duration: 1.6s;\n}\n\n.delay--16 {\n animation-duration: 1.68s;\n}\n\n.delay--17 {\n animation-duration: 1.76s;\n}\n\n.delay--18 {\n animation-duration: 1.84s;\n}\n\n.delay--19 {\n animation-duration: 1.92s;\n}\n\n.delay--20 {\n animation-duration: 2s;\n}\n\n.delay--21 {\n animation-duration: 2.08s;\n}\n\n.delay--22 {\n animation-duration: 2.16s;\n}\n\n.delay--23 {\n animation-duration: 2.24s;\n}\n\n.delay--24 {\n animation-duration: 2.32s;\n}\n\n.delay--25 {\n animation-duration: 2.4s;\n}\n\n.delay--26 {\n animation-duration: 2.48s;\n}\n\n.delay--27 {\n animation-duration: 2.56s;\n}\n\n.delay--28 {\n animation-duration: 2.64s;\n}\n\n.delay--29 {\n animation-duration: 2.72s;\n}\n\n.delay--30 {\n animation-duration: 2.8s;\n}\n\n.delay--31 {\n animation-duration: 2.88s;\n}\n\n.delay--32 {\n animation-duration: 2.96s;\n}\n\n.delay--33 {\n animation-duration: 3.04s;\n}\n\n.delay--34 {\n animation-duration: 3.12s;\n}\n\n.delay--35 {\n animation-duration: 3.2s;\n}\n\n.delay--36 {\n animation-duration: 3.28s;\n}\n\n.delay--37 {\n animation-duration: 3.36s;\n}\n\n.delay--38 {\n animation-duration: 3.44s;\n}\n\n.delay--39 {\n animation-duration: 3.52s;\n}\n\n.delay--40 {\n animation-duration: 3.6s;\n}\n\n.delay--41 {\n animation-duration: 3.68s;\n}\n\n.delay--42 {\n animation-duration: 3.76s;\n}\n\n.delay--43 {\n animation-duration: 3.84s;\n}\n\n.delay--44 {\n animation-duration: 3.92s;\n}\n\n.delay--45 {\n animation-duration: 4s;\n}\n\n.delay--46 {\n animation-duration: 4.08s;\n}\n\n.delay--47 {\n animation-duration: 4.16s;\n}\n\n.delay--48 {\n animation-duration: 4.24s;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\nbutton span {\n font-size: 1rem;\n font-weight: 700;\n}\nbutton.btnPrimary {\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017;\n border: 1px solid;\n border-color: transparent;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n}\nbutton.btnPrimary span:first-child {\n color: #121212;\n}\nbutton.btnPrimary:hover, button.btnPrimary:focus, button.btnPrimary.active, button.btnPrimary:disabled {\n background-color: #b89318;\n}\nbutton.btnPrimary:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btnSecondary {\n background: transparent;\n border: 1px solid;\n border-color: #e0e0e0;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n}\nbutton.btnSecondary span:first-child {\n color: #e0e0e0;\n}\nbutton.btnSecondary:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btnText {\n text-decoration: underline;\n}\nbutton.btnText span {\n text-transform: none;\n font-weight: 400;\n}\nbutton.btnPrimaryNegative {\n background: linear-gradient(180deg, #61f0f2 0%, #48c2c4 100%);\n border: 1px solid;\n border-color: transparent;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n}\nbutton.btnPrimaryNegative span:first-child {\n color: #121212;\n}\nbutton.btnPrimaryNegative:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btnPrimaryNegative:hover {\n opacity: 0.7;\n}\nbutton.btnIncrement {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n border: 1px solid;\n border-color: transparent;\n border-radius: 2px;\n width: 100%;\n text-transform: initial;\n transition: all 150ms ease-in-out;\n min-width: 40px;\n width: 40px;\n height: 40px;\n border-radius: 4px;\n box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.55);\n}\nbutton.btnIncrement span:first-child {\n color: #ffffff;\n}\nbutton.btnIncrement:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ninput.inputText,\ninput.inputNumber {\n box-sizing: border-box;\n border: 1px solid #7b7b7b;\n background: transparent;\n transition: all 300ms ease;\n color: #e0e0e0;\n}\ninput.inputText:focus, input.inputText:focus-visible,\ninput.inputNumber:focus,\ninput.inputNumber:focus-visible {\n border-color: #e3b82a;\n outline: none;\n}\n\ninput.inputText {\n appearance: none;\n border-radius: 4px;\n height: 45px;\n width: 100%;\n max-width: 280px;\n padding: 0 0.5rem;\n}\n\ninput.inputNumber {\n border-radius: 2px;\n height: 40px;\n width: 60px;\n max-width: 5rem;\n text-align: center;\n}\n\ninput.inputCheckbox {\n width: 24px;\n min-width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n border-radius: 4px;\n cursor: pointer;\n appearance: none;\n background: #121212;\n position: relative;\n border: solid 1px #7b7b7b;\n}\ninput.inputCheckbox:checked {\n background: #e3b82a;\n border-color: #e3b82a;\n}\ninput.inputCheckbox:checked:before, input.inputCheckbox:checked:after {\n content: \"\";\n position: absolute;\n display: inline-block;\n background: #121212;\n border-radius: 0.5rem;\n}\ninput.inputCheckbox:checked:before {\n width: 3px;\n height: 12px;\n left: 10px;\n top: 4px;\n transform: rotate(41deg);\n}\ninput.inputCheckbox:checked:after {\n width: 3px;\n height: 6px;\n left: 5px;\n top: 8px;\n transform: rotate(133deg);\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.card {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n box-sizing: border-box;\n box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);\n border-radius: 4px;\n padding: 16px;\n}\n.card:hover {\n background: linear-gradient(180deg, rgba(70, 71, 77, 0.7) 0%, rgba(57, 58, 63, 0.7) 100%);\n}\n.card.rich-card {\n padding: 16px;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ndiv.modal-root .MuiBackdrop-root {\n background-color: hsla(231deg, 11%, 12%, 0.85);\n}\n\ndiv.modal-paper {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n width: 36rem;\n max-width: 100%;\n max-height: 90vh;\n padding: 2rem;\n box-sizing: border-box;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n margin: 0 0 0 13.75rem;\n align-items: center;\n color: #ffffff;\n}\n@media only screen and (max-width : 1023px) {\n div.modal-paper {\n width: 35rem;\n margin: 0;\n }\n}\n@media only screen and (max-width : 768px) {\n div.modal-paper {\n padding: 1rem 1rem 1.5rem;\n width: 85%;\n max-width: 35rem;\n margin: 0;\n }\n}\ndiv.modal-paper.no-padding {\n padding: 0;\n}\ndiv.modal-paper.blue-border {\n border: 1px solid rgba(88, 255, 255, 0.2509803922);\n}\ndiv.modal-paper.blue-light-border {\n border: 1px solid #61f0f2;\n}\ndiv.modal-paper.yellow-border {\n border: 1px solid rgba(227, 184, 42, 0.4);\n}\ndiv.modal-paper .modal-paper-close-button {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n padding: 5px 5px;\n z-index: 10;\n}\n\ndiv.modal-paper-full-screen {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n width: 100%;\n max-width: 100%;\n height: 100%;\n max-height: 100%;\n padding: 0;\n margin: 0;\n box-sizing: border-box;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n color: #ffffff;\n display: flex;\n align-items: center;\n}\ndiv.modal-paper-full-screen.dark-background {\n background: #121212;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ndiv.expansion-panel-root {\n margin: 1.2rem 0;\n color: #e0e0e0;\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n border-radius: 4px;\n box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);\n transition: background-color 0.6s ease;\n box-sizing: border-box;\n}\ndiv.expansion-panel-root.Mui-expanded:first-child {\n margin: 1.2rem 0;\n}\ndiv.expansion-panel-root.Mui-expanded:last-child {\n margin: 1.2rem 0;\n}\ndiv.expansion-panel-root.red-border {\n border: 1px solid #d25959;\n}\n\ndiv.expansion-panel-summary {\n padding: 0.25rem 1.2rem;\n min-height: 4rem;\n}\ndiv.expansion-panel-summary.Mui-focused {\n border-radius: 4px;\n background-color: unset;\n box-shadow: 0 0 0 1px #e0e0e0;\n}\ndiv.expansion-panel-summary.Mui-expanded {\n min-height: 4rem;\n}\ndiv.expansion-panel-summary.Mui-expanded.small {\n min-height: 3rem;\n}\ndiv.expansion-panel-summary.small {\n padding: 0 1.2rem;\n min-height: 3rem;\n}\ndiv.expansion-panel-summary.bold-text {\n font-weight: bold;\n}\n\ndiv.expansion-panel-content {\n display: flex;\n align-items: center;\n}\ndiv.expansion-panel-content.Mui-expanded {\n margin: 0.75rem 0;\n}\n\ndiv.expansion-panel-details {\n padding: 0 1.2rem 1.2rem;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\na {\n color: #deaf0e;\n}\na:visited {\n color: #deaf0e;\n}\n\na:focus {\n outline: none;\n box-shadow: inset 0 0 0 1px #e0e0e0;\n}\na:focus > div:first-child {\n box-shadow: 0 0 0 1px #e0e0e0;\n}\n\na.MuiLink-underlineHover:hover {\n text-decoration: none;\n}\n\na.MuiTypography-colorPrimary {\n color: #e0e0e0;\n}\n\n:root {\n white-space: pre-line;\n --blue: #58ffff;\n --blue40: rgba(88, 255, 255, 0.2509803922);\n --blueBackground: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n --blueRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n --blueRadialGradientTrans: radial-gradient(circle, #58ffff 0%, rgba(255, 255, 255, 0) 100%);\n --elecColor: #d87b39;\n --elecColor40: rgba(216, 123, 57, 0.4);\n --elecCompareColor: #e2bca1;\n --gasColor: #45d1b8;\n --gasColor40: rgba(69, 209, 184, 0.4);\n --gasCompareColor: #a8f7e9;\n --waterColor: #3a98ec;\n --waterColor40: rgba(58, 152, 236, 0.4);\n --waterCompareColor: #abd4fa;\n --multiColor: #e3b82a;\n --multiCompareColor: #ffd597;\n --redPrimary: #d25959;\n --greyBright: #e0e0e0;\n --greyDark: #7b7b7b;\n --textWhite: #ffffff;\n --softGrey: #a0a0a0;\n --darkLight: #25262b;\n --darkLight2: #121212;\n --textFont: Lato, sans-serif;\n --greyLinearGradientBackground: linear-gradient(180deg, #323339 0%, #25262b 100%);\n --multiColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%);\n --elecColorRadialGradientTrans: radial-gradient(circle, #d87b39 0%, rgba(255, 255, 255, 0) 100%);\n --waterColorRadialGradientTrans: radial-gradient(circle, #3a98ec 0%, rgba(255, 255, 255, 0) 100%);\n --gasColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%);\n --multiColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017;\n --elecColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(158, 67, 2, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #d87b39;\n --gasColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(4, 106, 88, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #45d1b8;\n --waterColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(2, 93, 174, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #3a98ec;\n}\n\n.application {\n overflow-x: hidden;\n background-color: #121212;\n}\n\n.accordion-icon {\n color: #ffffff;\n}\n\n.loaderContainer {\n height: 80vh;\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n}\n\n.makeStyles-fab-1 {\n top: 12px;\n left: 3rem !important;\n width: 36px !important;\n height: 36px !important;\n background-color: #323339 !important;\n}\n\ninput:-webkit-autofill,\ninput:-webkit-autofill:hover,\ninput:-webkit-autofill:focus,\ninput:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px #1b1c22 inset !important;\n}", ""]); @@ -63855,7 +63855,7 @@ var shadows = ['none', createShadow(0, 2, 1, -1, 0, 1, 1, 0, 0, 1, 3, 0), create /***/ "Hsuv": /***/ (function(module) { -module.exports = JSON.parse("{\"common\":{\"title_app\":\"Ecolyo\",\"title_consumption\":\"Conso\",\"title_challenge\":\"Défis\",\"title_quiz\":\"Quiz\",\"title_exploration\":\"Exploration\",\"title_action\":\"Action\",\"title_duel\":\"Duel final\",\"title_ecogesture\":\"Astuce\",\"title_ecogestures\":\"Astuces\",\"title_ecogestures_choice\":\"Sélection des astuces\",\"title_options\":\"Options\",\"title_analysis\":\"Analyse\",\"title_profiletype\":\"Ajuster mon profil\",\"title_legal_notice\":\"Mentions légales\",\"title_gcu\":\"Conditions générales d’utilisation\",\"title_accessibility\":\"Accessibilité : non conforme\",\"title_sge_connect\":\"Connexion à l'électricité\",\"title_gas_connect\":\"Connexion au gaz\",\"accessibility\":{\"loading\":\"Chargement\"},\"funders_logo\":\"Logo des financeurs : Métropole de Lyon, Etat via la Banque des Territoires et son programme France 2030, Union Européenne\"},\"navigation\":{\"consumption\":\"Conso\",\"challenges\":\"Défis\",\"ecogestures\":\"Astuces\",\"options\":\"Options\",\"analysis\":\"Analyse\"},\"FLUID\":{\"ELECTRICITY\":{\"NAME\":\"Électricité\",\"LABEL\":\"Électricité\",\"LABEL_PREPOSITION\":\"d'électricité\",\"UNIT\":\"kWh\",\"ADD\":\"Ajouter l'électricité\",\"MEGAUNIT\":\"MWh\",\"provider\":\"Enedis\"},\"WATER\":{\"NAME\":\"Eau\",\"LABEL\":\"Eau\",\"LABEL_PREPOSITION\":\"d'eau\",\"ADD\":\"Ajouter l'eau\",\"UNIT\":\"L\",\"MEGAUNIT\":\"m³\",\"provider\":\"Eau Publique du Grand Lyon\"},\"GAS\":{\"NAME\":\"Gaz\",\"LABEL\":\"Gaz\",\"LABEL_PREPOSITION\":\"de gaz\",\"ADD\":\"Ajouter le gaz\",\"UNIT\":\"kWh\",\"MEGAUNIT\":\"MWh\",\"provider\":\"GRDF\"},\"MULTIFLUID\":{\"NAME\":\"Multi fluide\",\"LABEL\":\"Multi\",\"UNIT\":\"€\"}},\"action\":{\"duration\":\"Durée : %{smartCount} jours\",\"result\":\"Résultat\",\"finished\":\"Défi terminé !\",\"details\":\"Détail de l'astuce\",\"apply\":\"J'applique cette action\",\"other\":\"Je choisis une autre action\",\"resultText1\":\"Cela n'a pas été trop difficile ?\",\"resultText2\":\"Jetez un coup d'œil dans la page conso dans 1 à 3 jours, le temps que vos données arrivent, pour voir l'impact de votre action.\",\"resultText3\":\"Pas de baisse de significative ? Pas de panique, en maintenant cette pratique dans le temps, les économies d'énergies et d'eau seront davantage visibles.\",\"resultText4\":\"Dans tous les cas, bravo, vous remportez...\",\"ok\":\"Ok\"},\"action_modal\":{\"accept\":\"Je relève le défi\",\"refuse\":\"Je me défile\",\"accessibility\":{\"window_title\":\"Fenêtre de confirmation\",\"button_accept\":\"Accepter\",\"button_refuse\":\"Refuser\"}},\"analysis\":{\"viewTitle\":\"Analyse\",\"warning_title\":\"Analyse incomplète\",\"warning_text\":\"Ecolyo n'a pas encore reçu toutes les données %{fluidList} pour ce mois\",\"comparison\":\"Comparatif\",\"analysis_date\":\"Conso totale\",\"challenge\":\"Défis terminés en\",\"user_consumption\":\"Votre conso\",\"average_home\":\"Conso moyenne d'un profil similaire\",\"average_home_description\":\"Le comparatif ici présenté est calculé sur la base d'un profil similaire au vôtre. Il s'agit d'un calcul et non d'une comparaison avec les autres utilisateurs de l'application. Sont pris en compte l'ensemble des informations entrées dans votre profil : mode de chauffage, âge du logement et éventuels travaux de rénovation, etc. Ce modèle a été créé avec l'Agence Locale de l'Energie sur la base de chiffres issues du Schéma Directeur des Energies de la Métropole de Lyon et de Chiffres-clé publiés par l'ADEME (l'Agence de l'Environnement et de la Maîtrise de l'Energie).\",\"approximative_description\":\"Pour comparer votre consommation avec un foyer similaire ou avec une conso idéale, veuillez détailler votre profil\",\"no_data\":\"Pas de données\",\"accessibility\":{\"button_go_to_profil\":\"Détailler mon profil\"},\"max_day\":\"Jour où vous avez le plus consommé\",\"compare\":{\"title\":\"Comparateur\",\"month_tab\":\"Comparer au mois dernier\",\"year_tab\":\"Comparer à l'année dernière\"},\"temperature_comparison\":{\"unit\":\"°C\",\"comparison\":\"par rapport à\",\"info_button\":\"Information sur l'indice météo\",\"modal\":{\"title\":\"Indice météo\",\"month_comparison\":\"Écart de température moyenne entre le mois observé et le mois précédent.\",\"year_comparison\":\"Écart de température moyenne entre le mois observé et le même mois de l'année précédente.\",\"data_info\":\"Données Météo France issues de la station météo Lyon Bron.\",\"close\":\"Fermer la fenêtre\"}}},\"analysis_error_modal\":{\"title\":\"Aucune analyse\",\"message\":\"Pour profiter d’une analyse de vos consommations, connectez au moins un de vos compteurs.\",\"go_to_conso\":\"Je connecte mes compteurs\",\"understood\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_understood\":\"J'ai compris\",\"button_goto_konnector\":\"Aller aux connecteurs\"}},\"analysis_pie\":{\"total\":\"Conso totale\",\"month\":\"Au mois \",\"estimation\":\"Comment sont estimés<br>les prix ?\"},\"special_elec\":{\"title\":\"Spécial Électricité\",\"average\":\"Conso moyenne\",\"weektype\":\"un jour de \",\"week\":\"semaine\",\"weekend\":\"week-end\",\"min\":\"Conso minimum\",\"percentage\":\"Part dans la facture\",\"price\":\"Soit\",\"maxPower\":\"Puissance maximum atteinte\",\"offPeakHour\":\"Consommation en heures creuses\",\"showModal\":\"Plus d'infos\"},\"elec_info_modal\":{\"accessibility\":{\"window_title\":\"electricity-info-modal\",\"button_close\":\"close-modal\"},\"maxPowerTitle\":\"Qu’est-ce que la puissance maximum ?\",\"maxPowerDetails-1\":\"C’est la puissance maximum délivrée par tous les appareils fonctionnant au même moment dans votre logement.\",\"maxPowerDetails-2\":\"Vous avez choisi une puissance maximum dans votre offre d’électricité (3, 6 ou 9 kVA...) que vous ne devez pas dépasser pour ne pas faire sauter votre compteur. \",\"maxPowerDetails-3\":\"Cette puissance varie d'un mois à l'autre, regardez cette valeur sur l'ensemble de l'année pour vérifier si votre puissance souscrite correspond bien à votre usage.\",\"offPeakTitle\":\"Sur quelle base est calculé mon ratio Heures Pleines / Heures Creuses ?\",\"offPeakDetails-1\":\"D'après Enedis, vos plages d'heures creuses sont les suivantes : %{offPeakHours}. Nous avons donc simplement calculé, à l'aide vos consommations à la demi-heure, quelle part de votre consommation est réalisée sur vos heures creuses.\",\"minPowerTitle\":\"Qu’est-ce que la consommation minimum ?\",\"minPowerDetails-1\":\"Elle correspond à votre plus petite consommation du mois sur un créneau d'une demi-heure.\",\"minPowerDetails-2\":\"Nous extrapolons cette consommation sur 1 mois afin vous donner un aperçu de la consommation de vos consommations électriques en veille (box, télé, chargeurs, ...) ou encore de celle, incompressible, de vos appareils de froid (frigo, congélateur).\"},\"auth\":{\"enedissgegrandlyon\":{\"title\":\"Ecolyo doit se connecter à l’électricité\",\"bill\":\"Munissez-vous d’une <span>facture d’électricité</span> pour valider la connexion\",\"connect\":\"Je me connecte à l'électricité\",\"accessibility\":{\"connect\":\"Se connecter\"},\"identityTitle\":\"Nom inscrit sur la facture\",\"firstName\":\"Prénom\",\"lastName\":\"Nom\",\"pdlTitle\":\"Numéro de votre compteur électrique (PDL)\",\"pdlLabel\":\"N° (14 chiffres)\",\"pdlModal\":{\"title\":\"Qu'est-ce qu'un PDL ?\",\"title_accessibility\":\"Modale qu'est ce qu'un PDL ?\",\"txt1\":\"Votre numéro de point de livraison (PDL) peut aussi s’appeler PRM si vous possédez un compteur Linky.\",\"txt2\":\"Ce numéro est composé de 14 chiffres.\",\"txt3\":\"Votre numéro de PDL ou PRM se trouve sur votre facture d’électricité.\",\"txt4\":\"Si vous avez un compteur Linky, appuyez sur le bouton “+” et faites défiler l’affichage jusqu’à obtenir l’affichage suivant :\",\"button\":\"J'ai compris\",\"button_accessibility\":\"Bouton valider\",\"prm_accessibility\":\"Écran d'un compteur Linky présentant le numéro PRM\"},\"addressTitle\":\"Adresse du titulaire\",\"address\":\"Numéro et voie\",\"zipCode\":\"Code postal\",\"city\":\"Ville\",\"headConsent\":\"En acceptant de partager vos données, celles-ci seront directement transférées à Ecolyo à l’intérieur de votre cloud personnel, sans que la Métropole n’y accède ni ne les visualise.\",\"textConsent\":\"Afin de vous offrir des fonctionnalités de visualisation et d'analyse, Ecolyo a besoin des données suivantes : \",\"consentLi1\":\"L'historique et le relevé de vos consommations quotidiennes en kWh\",\"consentLi2\":\"L'historique et le relevé de vos consommations au pas de temps 30 minutes\",\"consentLi3\":\"Les puissances maximales atteintes quotidiennement\",\"consentLi4\":\"Les données contractuelles (début de contrat et puissance souscrite)\",\"consentCheck1\":\"Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un an</span>\",\"consentCheck2\":\"J’atteste être le titulaire du point de livraison (PDL) renseigné à l’étape précédente\"},\"grdfgrandlyon\":{\"title\":\"Ecolyo doit se connecter au gaz\",\"bill\":\"Munissez-vous d’une <span>facture de gaz</span> pour valider la connexion\",\"connect\":\"Je me connecte au gaz\",\"accessibility\":{\"connect\":\"Se connecter\"},\"identityTitle\":\"Nom inscrit sur la facture\",\"firstName\":\"Prénom\",\"lastName\":\"Nom\",\"email\":\"Email\",\"zipCode\":\"Code postal\",\"pceTitle\":\"Numéro de votre compteur de gaz (PCE)\",\"pceLabel\":\"N° (14 chiffres)\",\"pceHint\":\"Où trouver le numéro de PCE ?\",\"pceModal\":{\"title\":\"Où trouver le n° de PCE ?\",\"txt1\":\"Votre numéro de <span>PCE</span> - ou <span>Point de comptage et d'estimation</span> - se trouve sur votre facture au niveau de vos informations contractuelles (parfois en 1ère page... parfois en dernière !)<br/><br/> C'est un identifiant à 14 chiffres.\",\"button\":\"J'ai compris\",\"accessibility\":\"Titre de la modale\",\"button-accessibility\":\"Bouton valider\"},\"headConsent\":\"Vous allez partager vos données à la Métropole de Lyon. Elles seront directement transférées à Ecolyo à l'intérieur de votre cloud personnel, sans que la Métropole n'y accède ni ne les visualise.\",\"textConsent\":\"Afin de vous offrir des fonctionnalités de visualisation et d'analyse, Ecolyo a besoin des données suivantes :\",\"consentLi1\":\"L'historique de vos consommations (jusqu’à 36 mois) et le relevé quotidien de vos consommations\",\"consentLi2\":\"Les données contractuelles (type de compteur, date de début de contrat)\",\"consentCheck1\":\"Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un an</span>\",\"consentCheck2\":\"J’atteste être le titulaire du point de livraison (PCE) renseigné à l’étape précédente\",\"waiting\":{\"mailSent\":\"Un mail vous a été envoyé...\",\"mailDelay\":\"La réception du mail peut prendre 15min, l'envoi des mails se faisant tous les 1/4 d'heure\",\"validate\":\"Merci de valider l'autorisation d'accès à vos données\",\"comeback\":\"Une fois ce clic effectué, revenez ici pour accéder à vos données\",\"button_done\":\"C’est fait !\"}},\"eglgrandlyon\":{\"bill\":\"Munissez-vous d’une <span>facture d'eau</span> pour valider la connexion\",\"connect\":\"Je me connecte à l'eau\",\"accessibility\":{\"connect\":\"Se connecter\"},\"connect_form\":{\"login\":\"Identifiant (7 chiffres)\",\"password\":\"Mot de passe\",\"label\":\"Je connecte Ecolyo à mon compte Eau Publique du Grand Lyon\"},\"no_account\":{\"title\":\"Ecolyo doit se connecter à l'eau\"},\"with_account\":{\"title\":\"Votre compte Eau Publique du Grand Lyon a bien été créé ?\",\"subtitle1\":\"Plus qu’à donner votre accord pour connecter votre compteur d'eau et Ecolyo !\"},\"step1\":{\"info1\":\"La connexion se fait via <span>votre compte Eau Publique du Grand Lyon</span>.\",\"info2\":\"Possédez-vous un <span>compte Eau Publique du Grand Lyon</span> ?\"},\"step2\":{\"info1\":\"Une fois votre compte créé, <span>n'oubliez pas de revenir sur Ecolyo</span> pour finaliser la connexion.\"},\"button_go_to_partner_site\":\"Aller sur EPGL\"},\"connect_oauth\":{\"loading\":\"Chargement...\"},\"accessibility\":{\"button_reveal_password\":\"Afficher le mot de passe\",\"button_connect\":\"Se connecter\",\"button_create_account\":\"Se créer un compte\",\"window_title\":\"Fenêtre d'information sur la création de compte.\",\"button_close\":\"Fermer la fenêtre.\"},\"button_previous\":\"Précédent\",\"button_connect\":\"Se connecter\",\"button_create_account\":\"Se créer un compte\",\"button_has_account\":\"J'ai déjà un compte\",\"button_validate\":\"J'ai compris\",\"button_showOfflineData\":\"Voir mes anciennes données\",\"warningOfflineData\":\"Attention, vous visualisez d’anciennes données. Pour actualiser vos données, connectez votre compteur\"},\"challenge\":{\"card\":{\"ongoing\":{\"quiz\":\"Quiz\",\"exploration\":\"Explorations\",\"action\":\"Actions\",\"duel\":\"Duel Final\",\"result\":\"Résultat\",\"duelDone\":\"du duel final\"},\"locked\":{\"desc\":\"À débloquer en terminant le défi précédent\"}},\"card_done\":{\"saving\":\"Économie de\",\"depense\":\"Dépense de\",\"win\":\"Gagné\",\"lost\":\"Perdu\",\"final_defi\":\"sur le duel final\",\"final_defi_view\":\"Revoir le duel final\",\"reset_defi\":\"Relancer le défi\"},\"card_last\":{\"title\":\"Tous les défis sont terminés\",\"message1\":\"Nous travaillons actuellement à vous proposer de nouveaux défis.\",\"button\":\"Suggérer une idée de défi\"},\"card_unlocked\":{\"button_launch\":\"Lancer le défi\"},\"accessibility\":{\"button_launch\":\"Lancer le défi\",\"button_goto_konnector\":\"Aller aux connecteurs\",\"button_slider_previous\":\"Précédent\",\"button_slider_next\":\"Suivant\"}},\"challenge_no_fluid_modal\":{\"title\":\"Oups !\",\"content\":\"Connectez au moins 1 fluide pour pouvoir jouer\",\"button_validate\":\"Ok\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_validate\":\"Valider\"}},\"consumption\":{\"display_last_data\":\"Voir mes dernières consos\",\"accessibility\":{\"button_previous_period\":\"Afficher la période précédente\",\"button_next_period\":\"Afficher la période suivante\",\"button_previous_value\":\"Sélectionner la valeur précédente\",\"button_next_value\":\"Sélectionner la valeur suivante\",\"checkbox_compare\":\"Afficher ou cacher la comparaison\"},\"partner_issue_modal\":{\"title\":\"Attention !\",\"accessibility_title\":\"Modale de maintenance partenaire\",\"error_connect_gaz\":\"La connexion à vos données de <span class='gaz'>gaz</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='gaz'>GRDF</span> ou dans notre service)\",\"error_connect_elec\":\"La connexion à vos données d'<span class='elec'>électricité</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='elec'>Enedis</span> ou dans notre service)\",\"error_connect_water\":\"La connexion à vos données d'<span class='water'>eau</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='water'>Eau Publique du Grand Lyon</span> ou dans notre service)\",\"additional_text\":\"La visualisation et/ou la connexion à vos données de consommation peut s'en trouver affectée.<br /><br /><i>Merci pour votre patience en attendant un retour à la normale :)</i>\",\"ok\":\"Ok\"},\"compared\":\"Comparé\"},\"consumption_details\":{\"detail\":\"Détail par fluide\",\"connect\":\"Connecter d'autres fluides\",\"mini_cards_label\":\"AUTRES ENERGIES\"},\"consumption_visualizer\":{\"missing_data\":\"Données manquantes\",\"no_data\":\"Pas de données\",\"why_no_data\":\"Pourquoi n'ai-je pas de données ?\",\"last_valid_data\":\"Dernières données valides : %{date}\",\"last_available_data\":\"Dernières données disponibles : %{date}\",\"last_valid_data_multi\":\"Dernières données complètes : %{date}\",\"data_to_come\":\"À venir\",\"aie\":\"Aïe !\",\"data_empty\":\"Vide\",\"estimated\":\"estimés\",\"dataModal\":{\"list_title\":\"3 raisons possibles :\",\"item1\":\"le lien entre Ecolyo et le fournisseur de données est rompu : une mise à jour de ce lien (en bas de la page) peut résoudre ce problème.\",\"item2\":\"un problème technique chez votre gestionnaire : se connecter directement chez ce gestionnaire pour vérifier que cette donnée apparaît.\",\"item3\":\"pour le gaz : vous n'avez pas autorisé Ecolyo à accéder aux données de consommation de cette période.\",\"item4\":\"vous n'aviez tout simplement pas de compteur communicant à l'époque !\"},\"modal\":{\"window_title\":\"info estimation des prix\",\"title\":\"Comment sont estimés les prix ?\",\"close\":\"Fermer la fenêtre\",\"part1\":\"Le prix de votre électricité ou de votre gaz dépend de l'offre choisie auprès de votre fournisseur. N’ayant pas accès à cette information, Ecolyo affiche un prix moyen par fluide. \",\"part2\":\"Tarifs moyens retenus :\",\"list1\":\" : 1 kWh = %{elecPrice} €TTC (il correspond au tarif réglementé d’EDF au %{elecPriceStartDate} pour une puissance souscrite de 3 ou 6 kVA et hors offre heure pleine/heure creuse)\",\"list2\":\" : 1 kWh = %{gasPrice} €TTC (Prix repère de vente de gaz publié par la Commission de Régulation de l'Energie au %{gasPriceStartDate} pour un consommateur \\\"Cuisson/Eau Chaude\\\")\",\"list3\":\" : 1 litre d’eau = %{waterPrice} € TTC (prix constaté au %{waterPriceStartDate} pour un abonnement et une consommation de 120 m3/an sur la Métropole de Lyon)\",\"part3\":\"Le coût de votre abonnement n'est pas pris en compte pour l'électricité.\"},\"release_notes_modal\":{\"title\":\"Du nouveau sur Ecolyo !\",\"message\":\"Les mises à jour suivantes ont été effectuées sur votre application :\",\"go_back\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre de notifications\",\"button_go_back\":\"J'ai compris\"}}},\"ecogestures\":{\"loading\":\"Chargement des astuces\"},\"duel\":{\"global_error\":\"Oups. Une erreur est survenue. Veuillez retourner à l'écran d’accueil des défis\",\"button_go_back\":\"Retour\",\"average_info\":\"%{average} euros étant votre moyenne actuelle, relevez-vous le défi ?\",\"button_start\":\"Allons-y !\",\"goal1\":\"Faites moins que votre moyenne actuelle sur %{durationInDays} jours\",\"goal2\":\"pour gagner le badge %{title}\",\"goal_done\":\"Duel remporté\",\"goal_failed\":\"Duel perdu\",\"caption_average\":\"Votre moyenne à titre indicatif\",\"caption_consumption\":\"Votre consommation\",\"caption_incoming\":\"Données à venir\",\"accessibility\":{\"button_go_back\":\"Retour\",\"button_start_duel\":\"Lancer le duel\",\"button_start_quiz\":\"Lancer le quiz\"}},\"duel_result_modal\":{\"success\":{\"title\":\"Félicitations\",\"message1\":\"Vous avez économisé %{value} €\",\"message2\":\"et gagné le badge %{title} !\",\"button_validate\":\"Youpi\"},\"lost\":{\"title\":\"Presque\",\"message1\":\"Vous avez dépassé de %{value} €\",\"message2\":\"et manqué le badge %{title}\",\"button_validate\":\"Zut alors\"},\"accessibility\":{\"window_title\":\"Fenêtre de résultat\",\"button_validate\":\"Valider\"}},\"last_duel_modal\":{\"title\":\"Félicitations !\",\"subtitle\":\"Vous avez terminé tous les défis !\",\"message1\":\"Nous travaillons actuellement à vous proposer de nouveaux défis.\",\"message2\":\"Vous pouvez donner votre avis sur ce que vous aimeriez en cliquant sur la bulle d'aide.\"},\"duel_empty_value_modal\":{\"title\":\"Oups !\",\"message\":\"Impossible de lancer le duel. Il nous manque en effet certaines de vos données de consommation pour vous proposer un duel à votre hauteur.\",\"button\":\"Je retourne au menu des défis\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_validate\":\"Retourner au menu des défis\"}},\"ecogesture\":{\"title_tab_0\":\"Objectifs\",\"title_tab_1\":\"Je fais déjà\",\"title_tab_2\":\"Toutes\",\"MENU_TITLE\":\"Filtrer\",\"ALL\":\"Tous les usages\",\"HEATING\":\"Chauffage\",\"AIR_CONDITIONING\":\"Climatisation\",\"ECS\":\"Eau chaude\",\"COLD_WATER\":\"Eau froide\",\"ELECTRICITY_SPECIFIC\":\"Électricité courante\",\"COOKING\":\"Cuisson\",\"selection\":\"Sélectionner les astuces les plus adaptées à votre consommation\",\"selection_2\":\"vues sur\",\"button_selection\":\"Continuer ma sélection\",\"no_ecogesture\":\"Aucune astuce ne correspond à votre filtrage\",\"no_ecogesture_filter\":{\"text1\":\"Nous n'avons pas trouvé d'astuces adaptées à votre profil dans cette catégorie.\",\"text2\":\"En effet, de par votre profil et vos modes de chauffage, d'eau ou d'eau chaude sanitaire, nous n'avons pas identifié d’astuces vous permettant de diminuer vos factures à titre individuel. Toutefois, vous pouvez toujours agir pour préserver les ressources en appliquant et diffusant autour de vous les autres bonnes pratiques présentées dans la partie \\\"Toutes les astuces\\\".\"},\"adjust_profil\":{\"description\":\"Pour une sélection d’astuces adaptée à votre consommation, vous pouvez ajuster votre profil.\",\"button_go_to_profil\":\"Ajuster mon profil\"},\"accessibility\":{\"window_title\":\"Fenêtre d'information'\",\"button_close\":\"Fermer la fenêtre\",\"button_selection\":\"Aller à la page de sélection\"},\"doing\":\"Je fais déjà\",\"objective\":\"Objectif\",\"emptyList\":{\"obj1\":\"Les astuces présentées sont des actions qui vous permettent de réduire vos consommations et donc vos factures. On parle parfois d’écogestes.\",\"obj1_done\":\"Aucune astuce n’a été sélectionnée comme objectif actuellement.\",\"obj2\":\"Vous pouvez sélectionner ceux à mettre en objectifs et ceux que vous appliquez déjà.\",\"obj2_done\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous souhaitez garder en objectif dans cette section.\",\"doing1\":\"Aucune astuce n’a été sélectionnée dans la catégorie appliquée actuellement.\",\"doing1_done\":\"Aucune astuce n’est indiquée comme déjà appliquée actuellement.\",\"doing2\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous mettez déjà en pratique dans cette section.\",\"doing2_done\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous mettez déjà en pratique dans cette section.\",\"btn1\":\"Voir toutes les astuces\",\"btn2\":\"Sélectionner\"},\"initModal\":{\"title\":\"Sélectionner mes astuces\",\"text1\":\"Les astuces présentées sont des actions qui vous permettent de réduire vos consommations et donc vos factures. On parle parfois d’écogestes \",\"text2\":\"Vous pouvez sélectionner celles à mettre en objectifs et celles que vous appliquez déjà.\",\"launchForm\":\"Afin de pré-sélectionner les astuces correspondant à votre consommation, merci de répondre à quelques rapides questions.\",\"btn1\":\"Plus tard\",\"btn2\":\"C'est parti !\"},\"reset\":\"Réinitialiser ma sélection\",\"resetModal\":{\"title_part1\":\"Cette action\",\"title_part2\":\"supprimera votre liste d’astuces\",\"title_part3\":\"sélectionnées dans\",\"title_part4\":\"“Objectifs”\",\"title_part5\":\"et\",\"title_part6\":\"“Je fais déjà”\",\"text1\":\"Vous pourrez ensuite faire une nouvelle sélection adaptée à votre consommation.\",\"text2\":\"Souhaitez-vous réinitialiser votre sélection d’astuces ?\",\"btn1\":\"Non\",\"btn2\":\"Réinitialiser\"}},\"ecogesture_modal\":{\"title_ecogesture\":\"Astuce\",\"title_action\":\"Action\",\"efficiency\":\"Efficacité\",\"show_less\":\"Voir moins\",\"show_more\":\"Voir plus\",\"select_action\":\"Je choisis cette action\",\"accessibility\":{\"window_title_ecogesture\":\"Fenêtre astuce\",\"window_title_action\":\"Fenêtre action\",\"button_close\":\"Fermer la fenêtre\",\"button_select_action\":\"Sélectionner cette action\",\"button_see_more_detail\":\"Afficher plus de détails\"}},\"ecogesture_info_modal\":{\"header\":\"Comment sont choisis les astuces adaptées à mon profil ?\",\"text\":\"Les astuces adaptés à votre profil sont aujourd’hui choisies en fonction des compteurs individuels que vous possédez (communicants ou non). Ceux présentés ici vous permettent d'agir sur vos consommations individuelles. Des modes de tri plus personnalisables seront proposés à l'avenir.\",\"button_close\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre d'information\",\"button_close\":\"Fermer la fenêtre\"}},\"ecogesture_form\":{\"heating_type\":{\"title\":\"Chauffage\",\"question\":\"Quel est votre type de chauffage ?\",\"individual\":\"Individuel\",\"collective\":\"Collectif\"},\"warming_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Bois\",\"4\":\"Fioul\",\"5\":\"Autre\",\"title\":\"Source chauffage\",\"question\":\"Quelle source d’énergie principale utilisez-vous pour vous chauffer ?\",\"no_fluid_text\":\"Produit ni par de l'électricité, ni par du gaz, ni par du bois ou du fuel\",\"0_text\":\"Produit grâce à de l'électricité\",\"2_text\":\"Produit grâce au gaz\",\"3_text\":\"Produit grâce au bois\",\"4_text\":\"Produit grâce au fioul\",\"5_text\":\"Produit grâce à un autre moyen\"},\"hot_water\":{\"title\":\"Eau chaude\",\"question\":\"Quel est votre type de production d’eau chaude ?\",\"individual\":\"Individuelle\",\"collective\":\"Collective\"}},\"ecogesture_profile\":{\"equipments\":{\"question\":\"Quels équipements possédez-vous ?\",\"hint\":\"Plusieurs réponses possibles\",\"air_conditioning\":\"Climatisation\",\"computer\":\"Ordinateur\",\"microwave\":\"Micro-ondes\",\"oven\":\"Four\",\"washing_machine\":\"Lave-linge\",\"dishwasher\":\"Lave-vaisselle\",\"cooking_plates\":\"Plaques électriques\",\"outside\":\"Extérieur\",\"dryer\":\"Sèche-linge\",\"refregirator\":\"Réfrigérateur\",\"fan\":\"Ventilateur\",\"water_heater\":\"Chauffe-eau\",\"curtain\":\"Rideaux\",\"internet_box\":\"Box internet\",\"ventilation\":\"VMC\",\"freezer\":\"Congélateur\",\"boiler\":\"Chaudière\",\"hydraulic_heating\":\"Chauffage hydraulique\",\"accessible_label\":\"Sélection d'équipement\"}},\"ecogesture_selection\":{\"header\":\"Sélection des astuces\",\"title\":\"Vous avez parcouru un groupe de %{smartCount} astuces\",\"text\":\"Voulez-vous continuer sur votre lancée ou remettre cette sélection à plus tard ?\",\"title_final\":\"Félicitations !\",\"text_final_1\":\"Vous avez terminé la sélection des astuces adaptées à votre consommation.\",\"text_final_2\":\"Vous pouvez les retrouver dans les sections “Objectifs” et “Je fais déjà” selon que vous les pratiquiez déjà ou non.\",\"button_go_to_ecogesture\":\"Plus tard\",\"button_ok\":\"J'ai compris\",\"button_continue\":\"Poursuivre\",\"button_objective\":\"Objectif\",\"button_doing\":\"Je fais déjà\",\"button_skip\":\"Pas intéressé\",\"accessibility\":{\"window_title\":\"Fenêtre d'information'\",\"button_close\":\"Fermer la fenêtre\",\"button_go_to_ecogesture\":\"Retourner aux astuces\",\"button_continue\":\"Poursuivre\",\"button_ok\":\"Fermer la sélection\"},\"selectionModal\":{\"title\":\"Des astuces correspondant à votre profil ont été trouvées !\",\"text\":\"À vous de choisir celles que vous souhaitez mettre en objectif et celles que vous faites déjà.\",\"button_close\":\"C'est parti !\"}},\"exploration\":{\"global_error\":\"Oups. Une erreur est survenue. Veuillez retourner à l'écran d’accueil des défis\",\"button_go_back\":\"Retour\",\"button_already_done\":\"C’est déjà fait !\",\"button_come_back\":\"Je reviens quand cela sera fait\",\"button_start\":\"C'est parti !\",\"watch_consumption\":\"Je fonce\",\"congratulation\":\"Bravo !\",\"earn\":\"Vous remportez\",\"button_confirm\":\"Ok\",\"interval\":{\"explanation\":\"Vous pouvez vérifier cette informations sur l'écran Conso.\"},\"accessibility\":{\"button_already_done\":\"Marquer l'exploration comme déjà réalisée\",\"button_confirm\":\"Valider\",\"button_come_back\":\"Fermer l'exploration\",\"button_go_back\":\"Retour\",\"button_start\":\"Lancer l'exploration\"}},\"error_page\":{\"main\":\"Erreur\",\"back\":\"Retour\",\"no_ecogesture\":\"Oups ! Nous n'avons pas trouvé l'astuce demandée.\"},\"help\":{\"title_help\":\"une question ? un problème ? une suggestion ?\",\"read_help\":\"Nous écrire via le Service d'Assistance Utilisateur\"},\"feedback\":{\"title\":\"Vous allez contacter le Service Assistance Utilisateur du Grand Lyon.\",\"text1\":\"Vous pourrez nous remonter un problème, chercher de l'aide pour vous connecter plus facilement, ou encore nous partager une bonne idée d'évolution.\",\"text2\":\"N'hésitez pas à nous écrire ! L'équipe Ecolyo vous répondra avec plaisir :)\",\"later\":\"Plus tard\",\"lets_go\":\"J'y vais\",\"accessibility\":{\"window_title\":\"Fenêtre de partage de retours\",\"button_close\":\"Fermer la fenêtre de partage de retours\"}},\"dataShare\":{\"title1\":\"Bienvenue !\",\"title1Update\":\"Ecolyo évolue !\",\"title2Update\":\"Pour continuer à utiliser Ecolyo, merci d’accepter les modalités de traitement des données ci-dessous.\",\"part1\":\"Nous avons besoin de l’adresse email utilisée lors de la création de votre Cozy Métropole de Lyon, ci-après nommé cloud personnel.\",\"part2\":\"Cette donnée de compte est conservée dans Ecolyo le temps de l’utilisation de ce service.\",\"part3\":\"La Métropole de Lyon utilisera cet email afin de vous tenir informé·e :\",\"item1\":\"En réponse à vos demandes, si vous avez pris l’initiative de nous contacter.\",\"item2\":\"En cas de problème majeur avec la gestion de votre compte.\",\"item3\":\"De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.\",\"part4\":\"Vos données privées de consommation d’énergie et d’eau sont récupérées, sauvegardées et stockées dans votre cloud personnel à votre initiative sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part5\":\"Il en est de même pour les données privées de composition du logement et du foyer, fournies par vos soins. Elles restent également sans visibilité de la Métropole de Lyon sur leur contenu.\\nLes données d’identification entrées lors de la connexion aux données de consommations d’électricité sont quant à elles conservées dans un espace sécurisé de la Métropole de Lyon et sont utilisées uniquement à des fins de contrôle du consentement par des organismes extérieurs.\",\"part6\":\"Dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées et pseudonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation, d’évaluer globalement l’usage de l’application via des mesures d’audience ainsi que d’évaluer à terme l’impact global en termes de baisse des consommations énergétiques de notre service.\",\"part7\":\"Au sein de votre cloud personnel, vous pouvez à tout moment exercer vos droits d’accès, de rectification, de portabilité, de limitation et d’opposition en consultant notamment la page Options.\",\"part8\":\"Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :\",\"part9\":\"Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 \",\"part10\":\"ou en ligne, au moyen du formulaire disponible à l'adresse suivante : \",\"link1\":\"<a href=\\\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\\\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/</a>\",\"validDataConsent\":\"Je consens au traitement de mes données tel que décrit ci-dessus.\",\"validCGU\":\"Je valide les \",\"validCGU_button\":\"Conditions Générales d’Utilisation\",\"validLegal\":\" du service et ai pris connaissance des \",\"validLegal_button\":\"Mentions Légales\",\"validLegal2\":\"de celui-ci.\",\"button_accept\":\"C'est parti !\",\"accessibility\":{\"button_accept\":\"Accepter les conditions générales d'utilisation\"}},\"minorUpdate\":{\"title\":\"Ecolyo évolue !\",\"button\":\"J'ai compris\"},\"gcu\":{\"title\":\"Conditions générales d’utilisation du service\",\"version\":\"Version du 12.12.2022\",\"content\":{\"title1\":\"Ecolyo, késako ?\",\"part1_1\":\"Ecolyo est un service proposé par la Métropole de Lyon vous permettant de suivre au même endroit vos consommations d’électricité, de gaz et d’eau, en kWh, en litres, en euros et à différentes échelles de temps. Ce service vous permet également de participer à des défis individuels et vous offre une analyse de vos consommations. Des astuces vous sont aussi proposées afin de vous permettre de réduire vos consommations.\",\"part1_2\":\"C’est un service gratuit qui prend la forme d’un site web dit « responsive », c’est-à-dire qu’il peut être consulté sur ordinateur ou sur mobile. Sur mobile, c’est une application que l’on a souhaitée ergonomique, réactive et esthétique pour votre plaisir de navigation et d’utilisation au quotidien.\",\"part1_3\":\"Tous les termes « techniques » sont définis en bas de page.\",\"title2\":\"Quelles fonctionnalités le service propose-t-il ?\",\"part2_1\":\"La fonctionnalité principale d’Ecolyo est la visualisation, au même endroit, de vos consommations d’électricité, de gaz et d’eau et ce, à différents pas de temps (de la demi-heure – uniquement pour l’électricité, à plusieurs années, en passant par les pas de temps journaliers et mensuels). La visualisation des consommations se fait en kWh pour l’énergie et en L pour l’eau ainsi qu’en euros (euros résultant d’un prix moyenné).\",\"part2_2\":\"Au-delà de la visualisation de vos consommations et parce que nous souhaitons vous aider à diminuer ces consommations vous retrouverez plusieurs autres pages : \",\"part2_2_list1\":\"Défis : Des quiz, et actions à mettre en place vous seront proposés pour vous pousser à réduire vos consommations.\",\"part2_2_list2\":\"Astuces : Une liste d’astuces pour maîtriser ses consommations d’énergie et d’eau à trier par usage, et avec une possibilité de les adapter plus précisément à votre profil.\",\"part2_2_list3\":\"Analyse : Une analyse de vos consommations réelles en comparaison à celle d’un foyer étant proche d’une vôtre.\",\"part2_3\":\"Pour la page Analyse ainsi que pour la partie personnalisation des astuces, des éléments supplémentaires sur votre profil vous seront demandés. L’ensemble de ces informations récoltées à l’aide du formulaire peuvent être modifiées par la suite.\",\"part2_4\":\"Dernière page : la page Options dans laquelle vous pourrez vous abonner à un service d’alerte sur vos consommations d’eau, de quoi ajuster votre profil ou encore vous désabonner de la lettre mensuelle.\",\"title3\":\"Comment ai-je accès à mes données d’électricité, de gaz et d’eau ?\",\"part3_1\":\"Pour visualiser vos consommations réelles et profiter pleinement du potentiel de notre service, il vous faut au minimum un des trois compteurs communicants suivants : Linky (pour l’électricité), Gazpar (pour le gaz), Téléo (pour l’eau).\",\"part3_2\":\"Ces compteurs sont opérés par les gestionnaires de réseaux. Pour Linky, c’est Enedis, le gestionnaire de réseau de distribution d’électricité. Pour Gazpar, GRDF est responsable de cette gestion. Et pour Téléo, c’est Eau Publique du Grand Lyon.\",\"part3_3\":\"Ces acteurs sont responsables de la relève de vos données. Ces données servent notamment à votre fournisseur d’électricité, de gaz ou d’eau pour permettre la facturation de vos consommations d’énergie. Des fournisseurs d’électricité ou de gaz il y en a des dizaines. Les gestionnaires de réseaux (… et de votre compteur) ne sont qu’au nombre de trois. Nous avons donc décidé de travailler avec eux, au plus près de la donnée brute issue de vos compteurs.\",\"part3_4\":\"Il vous faudra donc avoir un compte chez GRDF et Eau Publique du Grand Lyon pour accéder à vos données. Si vous n’en avez pas, il suffira de vous en créer un. Ceci ne sera à faire qu’une fois, au début.\",\"title4\":\"Ecolyo se trouve dans un cloud personnel Métropole de Lyon, qu’est-ce que cela signifie ?\",\"part4_1\":\"Comme vous avez dû le remarquer, lors de votre première connexion à Ecolyo vous avez dû vous créer un compte Cozy Métropole de Lyon. Ce cloud personnel est un espace sécurisé porté par l’ambition de vous apporter visibilité, transparence et maîtrise sur l’usage de vos données personnelles, et dont les fonctionnalités vous permettant de récupérer, synchroniser, stocker et partager vos données avec les destinataires de votre choix. Le service Ecolyo se déploie à l’intérieur de cet espace protégé. Dans ce cloud personnel, vous pourrez accéder également à d’autres services. Toutes les données traitées par Ecolyo, mais aussi les autres services que vous seriez amenés à utiliser dans ce cloud personnel restent dans ce Cloud Personnel Grand Lyon et n’en sortent pas, sauf si vous décidez vous-même de partager vos données avec des tiers.\",\"part4_2\":\"Pour en savoir plus sur ce cloud et son utilisation, ainsi que la durée de conservation de vos données, vous pouvez lire les conditions générales d’utilisation du service <a href=\\\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\\\">ici</a>.\",\"title5\":\"Et donc concrètement pour Ecolyo, quelles données sont collectées et qui y a accès ?\",\"part5_1\":\"Pour qu’Ecolyo ait accès à vos données de consommations, vous devrez activer vos différents connecteurs. À ce moment-là, pour la connexion aux données de gaz et d’eau à travers un parcours qui vous conduira de manière intuitive sur le site de chacun des gestionnaires de réseaux concerné, vous pourrez donner votre consentement à partager ces données avec le Service Ecolyo, et ce pour une durée limitée dans le temps. Pour l’électricité, le don du consentement et la connexion aux données se fait directement dans notre service. Quid de la durée de ce consentement ? Pour les données électriques, elle est par défaut d'un an. Pour les données gaz, cela sera à vous de la définir (nous vous recommandons 1 an pour une expérience optimale). Les données utilisées pour vérifier la bonne connexion de vos données d’électricité sont stockées du côté de la Métropole de Lyon sur des serveurs sécurisés.\",\"part5_2\":\"Vos connecteurs, une fois configurés, permettent le transfert de vos données de consommations au service Ecolyo. Le transfert de ces données de consommation se fait sans que personne n’accède à leur contenu, pas même la Métropole de Lyon. En effet, ces données sont stockées et traitées directement dans votre cloud personnel qui en assure la protection. Tous les calculs, analyses et traitements sur ces données sont faites DANS votre espace personnel sans visibilité sur le contenu des données par la Métropole de Lyon.\",\"part5_3\":\"Vous pouvez bien sûr mettre fin à la récupération/ au transfert de vos données de consommation sur votre espace cloud personnel à tout moment et à plusieurs niveaux : \",\"part5_3_list1\":\"Vous pouvez supprimer le transfert quotidien de vos données en supprimant tout simplement le connecteur dans la page Consos (en bas).\",\"part5_3_list2\":\"Pour supprimer l’ensemble de vos données ainsi que votre cloud personnel Métropole de Lyon, vous devez demander la suppression de votre cloud. Pour faire cela, rendez-vous dans les paramètres de votre cloud personnel via la barre blanche en haut d’Ecolyo et appuyez sur le bouton « Supprimer mon compte » dans la partie paramètres.\",\"part5_4\":\"Des données sur le profil de votre foyer peuvent être également remplies au sein de l’application. Ces données s’enrichiront au fur et à mesure de votre utilisation du service avec d’autres informations : défis réalisés, étoiles gagnées, etc. L’ensemble de ces données restent à l’intérieur de votre cloud personnel, sans que personne n’y ait accès.\",\"part5_5\":\"Enfin, afin de permettre une mise à jour quotidienne de vos données de consommations, vos identifiants Eau Publique du Grand Lyon, un jeton d’identification GRDF ainsi que vos numéros de compteurs sont stockés.\",\"title6\":\"Personne n’a donc accès à mes données, pas même la Métropole de Lyon, vraiment ?\",\"part6_1\":\"Conformément aux indications du paragraphe précédent, la Métropole de Lyon n’accède ni à vos données de consommations ni aux données utilisées via certaines fonctionnalités du service comme le formulaire (celui-là même qui permet l’analyse de vos consommations personnalisée ainsi qu’une sélection d’éco-gestes personnalisés). Toutes ces informations sont bien gardées au chaud dans votre cloud personnel Métropole de Lyon\",\"part6_2\":\"Seul vous pouvez accepter de partager vos données, documents ou fichiers privés avec la Métropole de Lyon, ses partenaires ou d’autres utilisateurs ou acteurs (publics ou privés) après recueil de votre consentement éclairé et par une action expresse de votre part.\",\"part6_3\":\"La Métropole de Lyon n'a cependant accès qu’à l’adresse email utilisée lors la création de votre cloud personnel Métropole de Lyon. Elle utilise cet email afin de vous tenir informé·e :\",\"part6_3_list1\":\"En réponse à vos demandes, si vous avez pris l’initiative de nous contacter. \",\"part6_3_list2\":\"En cas de problème majeur avec la gestion de votre compte.\",\"part6_3_list3\":\"De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.\",\"part6_4\":\"Elle stocke également les informations transmises lors de la connexion à l’électricité (nom, adresse postale). Ces informations doivent être stockées car la Métropole de Lyon est régulièrement contrôlée par Enedis et doit prouver détenir le consentement des personnes pour lesquelles elle va chercher la donnée.\",\"part6_5\":\"Par ailleurs, et dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques anonymisées nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation ainsi que d’évaluer l’impact global en termes de baisse des consommations énergétiques de notre service. Parmi ces statistiques, des mesures d’audience de la fréquentation des différentes pages du service sont réalisées. Vous pouvez, via la page Options, à tout instant, décider de vous opposer à la récupération de ces données d’utilisation.\",\"title8\":\"Encore des questions ?\",\"part8_1\":\"N’hésitez pas à consulter la FAQ ou à nous contacter via le formulaire de contact présente sur l’ensemble des pages.\",\"part8_2\":\"Dernière option, contactez-nous directement à <a href=\\\"mailto:ecolyo@grandlyon.com\\\">ecolyo(at)grandlyon.com</a>.\",\"title9\":\"LEXIQUE\",\"part9_1_title\":\"Cloud personnel Métropole de Lyon : \",\"part9_1_content\":\"Cloud personnel : appelé aussi le « domicile numérique », le cloud personnel est souvent réduit à un simple espace de stockage de documents mais il est bien plus que ça. C'est un espace individuel et sécurisé où vous pouvez accéder à des services sans exposer aucune donnée à l’extérieur. Vous seul pouvez y accéder, personne d'autre.\",\"part9_2_title\":\"Connecteur : \",\"part9_2_content\":\"Un connecteur est un service, installé dans votre cloud personnel également, qui a pour but uniquement d’aller récupérer les données auprès de différents partenaires/sources de données. Dans le cadre d’Ecolyo, trois connecteurs sont pré-installés dans votre cloud personnel : celui d’Enedis, celui de GRDF et celui d’Eau Publique du Grand Lyon.\",\"part9_3_title\":\"Compteur communicant : \",\"part9_3_content\":\"Un compteur communicant est un compteur qui mesure de manière précise et détaillée vos consommations et peut transmettre ces données au gestionnaire de réseau via une technologie radio (c'est le cas pour Gazpar et Téléo par exemple) ou via les réseaux électriques (via Courant Porteur en ligne, c'est le cas pour Linky par exemple).\",\"part9_4_title\":\"Fournisseur : \",\"part9_4_content\":\"Votre fournisseur d’électricité, de gaz ou d’eau est l’entreprise qui vous facture votre électricité, gaz ou eau. Côté électricité il en existe <a href=\\\"https://www.enedis.fr/liste-des-fournisseurs-delectricite\\\">aujourd’hui plus de 50</a>, chacun proposant des tarifs différents.\",\"part9_5_title\":\"Gestionnaire de réseau de distribution : \",\"part9_5_content\":\"Appelé aussi parfois distributeur, il est en charge de la livraison de votre électricité, gaz ou eau jusqu’à votre domicile. Il est aussi en charge du compteur qui relève vos consommations. Il transmet vos données de consommations à votre fournisseur afin qu’il effectue la facturation de vos consommations d’énergie. Il peut également les transmettre à tout acteur avec qui vous avez décidé de partager ces données.\"}},\"gcu_modal\":{\"button_accept\":\"J'accepte\",\"accessibility\":{\"window_title\":\"Conditions générales d’utilisation\",\"button_accept\":\"Accepter les conditions générales d'utilisation\"}},\"matomo\":{\"matomo_title\":\"Suivi statistiques d'usage Matomo\"},\"header\":{\"accessibility\":{\"button_back\":\"Retour à la page précédente\",\"button_open_feedbacks\":\"Ouvrir le partage de retours\"}},\"konnector_form\":{\"label_updated_at\":\"Dernière mise-à-jour le\",\"button_update\":\"Mettre à jour\",\"loading\":\"Chargement...\",\"wait_end_issue\":\"Attendre la fin de la maintenance avant de mettre à jour.\",\"button_disconnect\":\"Déconnecter\",\"issue\":\"Le problème semble venir de \",\"resolve\":\"Une mise à jour peut résoudre ce problème.\",\"login_failed\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"not_installed\":\"Le connecteur n'est pas installé. Veuillez l'installer en cliquant sur le bouton ci-dessous.\",\"button_install\":\"Installer\",\"error_account_creation\":\"Une erreur est survenue, veuillez essayer de nouveau.\",\"error_no_login_password\":\"Identifiant et mot de passe requis\",\"error_login_failed\":\"Identifiants invalides\",\"error_update\":\"Un problème est survenu lors du rapatriement de vos données.\",\"error_update_oauth\":\"Votre autorisation pour afficher vos données %{fluid} a expiré.\",\"button_oauth_reload\":\"Redonner mon consentement\",\"OK\":\"Ok\",\"konnector_delta\":{\"ELECTRICITY\":\"La donnée de consommation électrique arrive normalement à J+1. Un retard d'un ou deux jours est parfois constaté.\",\"GAS\":\"La donnée de consommation de gaz arrive normalement à J+3. Un retard d'un ou deux jours est parfois constaté.\",\"WATER\":\"La donnée de consommation d'eau arrive normalement à J+3. Un retard d'un ou deux jours est parfois constaté.\"},\"accessibility\":{\"button_install\":\"Installer le connecteur\",\"button_update\":\"Mettre à jour votre connexion\",\"button_disconnect\":\"Déconnecter votre connecteur\"}},\"konnector_options\":{\"label_connect_to_electricity\":\"Se connecter à l'électricité\",\"label_connect_to_water\":\"Se connecter à l'eau\",\"label_connect_to_gas\":\"Se connecter au gaz\",\"label_offline_electricity\":\"Électricité déconnectée\",\"label_offline_water\":\"Eau déconnectée\",\"label_offline_gas\":\"Gaz déconnecté\",\"partner_issue\":\"En maintenance\",\"outdated\":\"Données manquantes depuis %{isOutdatedData} jours\",\"accessibility\":{\"label_ko_status\":\"Connecteur en erreur\",\"button_toggle_detail_electricity\":\"Afficher ou masquer le détail de la connexion à l'électricité\",\"button_toggle_detail_water\":\"Afficher ou masquer le détail de la connexion à l'eau\",\"button_toggle_detail_gas\":\"Afficher ou masquer le détail de la connexion au gaz\"}},\"konnector_modal\":{\"loading_data\":\"Veuillez patienter, vos données sont en cours de chargement.\",\"loading_data_update\":\"Veuillez patienter, vos données sont en cours de mise à jour.\",\"logging_txt\":\"Nous vérifions vos informations d'identité\",\"success_txt\":\"Félicitations !\",\"success_data_electricity\":\"Vos données de consommation d'électricité sont maintenant connectées à Ecolyo.\",\"success_data_water\":\"Vos données de consommation d'eau sont maintenant connectées à Ecolyo.\",\"success_data_gas\":\"Vos données de consommation de gaz sont maintenant connectées à Ecolyo.\",\"success_data_additional_electricity\":\"Les données de consommations mettent entre un et deux jours pour arriver.\",\"success_data_additional_water\":\"Les données de consommations mettent entre trois et cinq jours pour arriver.\",\"success_data_additional_gas\":\"Les données de consommations mettent entre trois et cinq jours pour arriver.\",\"success_update_txt\":\"Connexion réussie !\",\"success_data_update_electricity\":\"Ecolyo est bien connecté à votre compteur d'électricité.\",\"success_data_update_water\":\"Ecolyo est bien connecté à votre compteur d'eau.\",\"success_data_update_gas\":\"Ecolyo est bien connecté à votre compteur de gaz.\",\"success_data_additional_update_electricity\":\"Sachez que la donnée de consommation d'électricité arrive entre J+1 et J+2.<br /><br />S'il vous manque encore des données, c'est qu'elles n'ont pas encore été mises à disposition par le gestionnaire de votre compteur. Merci pour votre patience !\",\"success_data_additional_update_water\":\"Sachez que la donnée de consommation d'eau arrive entre J+3 et J+5.<br /><br />S'il vous manque encore des données, c'est qu'elles n'ont pas encore été mises à disposition par le gestionnaire de votre compteur. Merci pour votre patience !\",\"success_data_additional_update_gas\":\"Sachez que la donnée de consommation de gaz arrive entre J+3 et J+5.<br /><br />S'il vous manque encore des données, c'est qu'elles n'ont pas encore été mises à disposition par le gestionnaire de votre compteur. Merci pour votre patience !\",\"error_txt\":\"Aïe !\",\"mismatch\":{\"title\":\"Vos données n'ont pas pu être récupérées.\",\"text1\":\"Vos nom et numéro de compteur ne correspondent plus. Merci de reconfigurer votre connecteur.\",\"text2\":\"Reconfigurer mon connecteur ?\",\"text3\":\"La reconfiguration de votre connecteur passe par sa suppression et sa nouvelle installation. Vos données seront conservées.\"},\"error_credentials_water\":\"Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter. L'identifiant est un numéro à 7 chiffres (différent de votre numéro de contrat).\",\"error_credentials_electricity\":\"Il semblerait que les nom(s) et adresse ne concordent pas avec le numéro de votre compteur.\",\"error_credentials_electricity_2\":\"Nous ne pouvons vous donner accès aux données de consommation.\",\"error_credentials_update_water\":\"Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter.\",\"error_credentials_update_electricity\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"error_credentials_update_gas\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"error_consent_form_gas_title\":\"L'accès à vos données a été bloqué par GRDF suite à un consentement précédemment supprimé par vos soins.\",\"error_consent_form_gas_report\":\"Merci de nous signaler le problème.\",\"error_data_electricity\":\"Un problème est survenu. Vos données de consommation d’électricité ne seront pas chargées.\",\"error_data_water\":\"Un problème est survenu. Vos données de consommation d’eau ne seront pas chargées.\",\"error_data_gas\":\"Il semblerait que le service de connexion à vos données de gaz soit momentanément en panne.\",\"error_data_update_electricity\":\"Un problème est survenu. Vos données de consommation d’électricité n’ont pas été mises à jour.\",\"error_data_update_water\":\"Un problème est survenu. Vos données de consommation d’eau n’ont pas été mises à jour.\",\"error_data_update_gas\":\"Un problème est survenu. Vos données de consommation de gaz n’ont pas été mises à jour.\",\"error_data_2\":\"Merci de réessayer plus tard.\",\"button_validate\":\"Ok\",\"button_understood\":\"J'ai compris\",\"button_try_again\":\"Réessayer\",\"button_contact\":\"Nous contacter\",\"button_check_info\":\"Vérifier les infos\",\"button_go\":\"J'y vais\",\"button_later\":\"Plus tard\",\"show_common_error\":\"Voir les erreurs récurrentes\",\"show_common_error_list\":\"<span>Le problème peut provenir des cas suivants :</span><ul><li>Vous avez un co-titulaire sur votre contrat. Veillez à bien entrer le nom du <span class=\\\"gold\\\">titulaire du contrat</span> et non le co-titulaire.</li><li> Votre nom comporte un tiret ? Tentez sans le tiret.</li><li>Entrez bien le nom de votre commune de résidence en entier (tirets et accents inclus)</li><li>Avez-vous bien entré le <span class=\\\"gold\\\">numéro de votre compteur</span> (PDL) ? Tout autre numéro (de contrat, de client) ne fonctionne pas.</li></ul><p>Si vous rencontrez toujours des difficultés, contactez notre service d'aide </p><div class=\\\"center\\\">Avez-vous pensez à vérifier ces informations ?</div>\",\"accessibility\":{\"window_title\":\"Fenêtre d'attente de connexion\",\"button_close\":\"Fermer la fenêtre\"}},\"consent_outdated\":{\"title\":{\"0\":\"Votre autorisation pour afficher vos données d’électricité a expiré\",\"2\":\"Aïe !\"},\"text1\":{\"0\":\"Veuillez re-donner votre consentement pour la transmission et la reconnexion de vos données ENEDIS à Ecolyo.\",\"2\":\"L'accès à vos données de consommation de gaz a expiré.\"},\"text2\":{\"0\":\"Souhaitez-vous renouveler votre accord dès maintenant pour un an ?\",\"2\":\"Merci de redonner votre consentement pour y accéder.\"},\"later\":\"Plus tard\",\"go\":\"J'y vais\",\"no\":\"Non\",\"yes\":\"Oui\"},\"legal\":{\"read_legal\":\"Lire les mentions légales\",\"title_legal\":\"Mentions légales & CGU\",\"version\":\"Version du 12.12.2022\",\"site\":\"Site du service Ecolyo : <a href=\\\"https://ecolyo.com/\\\"> https://ecolyo.com/</a>\",\"adress\":\"Métropole de Lyon - 20, rue du Lac – CS 33569 - 69505 Lyon cedex 03\",\"phone\":\"Tél : (33) 4 78 63 40 40\",\"mail\":\"<a href=\\\"mailto:ecolyo@grandlyon.com\\\"> ecolyo(at)grandlyon.com</a>\",\"p1b\":\"Directrice de publication : \",\"p1\":\"Blandine MELAY, Responsable du Service Transition Énergétique\",\"p2b\":\"Animation éditoriale, gestion et mise à jour : \",\"p2\":\"Marion BERTHOLON, Chargée de services numériques pour la transition énergétique\",\"p3b\":\"Photographies : \",\"p3\":\"sauf mention contraire, les photos sont la propriété de la Métropole de Lyon\",\"p4b\":\"Conception et Charte graphique : \",\"p4\":\"Florent Dufier\",\"p5b\":\"Réalisation technique : \",\"p5\":\"Métropole de Lyon, Sopra Steria\",\"p6b\":\"Maintenance technique : \",\"p6\":\"Délégation Développement économique, emploi & savoirs - Innovation numérique & systèmes d’information - Usages et services numériques - Développement des services numériques\",\"title1\":\"Crédits\",\"part1\":\"Ce site est le résultat de développements spécifiques réalisés dans les langages Go, TypeScript, HTML et Sass. Les développements s’appuient sur plusieurs bibliothèques et frameworks libres : axios, cozy-bar, cozy-client, cozy-harvest-lib, cozy-scripts, cozy-ui, d3, detect-browser, global, lodash, luxon, moment, moment-timezone, node-sass, object-hash, react, react-dom, react-redux, react-router-dom, react-swipeable-views, redux-devtools-extension, sass-loader. Les tests de l’application s’appuient sur les bibliothèques et frameworks libres suivants: jest-junit, react-test-renderer, redux-mock-store. La pile technique intègre également les applications Cozy stack, Yarn, Docker, ACH. Les déploiements sont réalisés sur le registre hébergé chez Cozy. L’équipe de réalisation utilise au quotidien les applications GitLab, IceScrum, RocketChat, SonarQube.\",\"title2\":\"Traitement des données personnelles et droit d’accès, de modification et de suppression\",\"part2\":\"Conformément à la réglementation en vigueur en matière de protection des données personnelles, le service Ecolyo a fait l’objet d’une inscription au registre des traitements de la Métropole de Lyon. Ecolyo fait partie de l’écosystème de services orientés « self data » déployés par la Métropole de Lyon avec l’ambition d’offrir aux usagers métropolitains les outils et les services leur permettant d’exercer directement leur droit à la portabilité, dans un cadre apte à garantir aussi bien la transparence et le contrôle sur l’usage de leurs données personnelles que l’exploitation directe du contenu de ces données selon leurs libres choix. Le self data est en effet selon la Fondation Internet Nouvelle Génération (FING) « la production, l’exploitation et le partage de données personnelles par les individus, sous leur contrôle et à leurs propres fins ». Au sein de cet environnement self data, la gestion des données s’appuie sur l’organisation suivante des rôles et responsabilités associées : \",\"part2-1\":\"Les partenaires du service GRDF et Eau Publique du Grand Lyon sont responsables exclusivement des seuls traitements de Données Personnelles relatifs à la collecte des données de consommation de gaz et d’eau de l’utilisateur et à leur transmission sur la plateforme de cloud personnel, après consentement de l’utilisateur.\",\"part2-2\":\"Enedis est responsable de la collecte des données de consommation d’électricité et de leur mise à disposition à la Métropole de Lyon qui, elle en gère la transmission sur la plateforme du cloud personnel de l’utilisateur, après avoir récupéré le consentement de l’utilisateur.\",\"part2-3\":\"La Métropole de Lyon est responsable de traitement sur le périmètre du service Ecolyo qu’elle propose à l’usager, ainsi que des traitements nécessaires à la fourniture de la plateforme de cloud personnel qu’elle met à disposition de l’usager pour accéder au service Ecolyo. En sa qualité de responsable de ces traitements, elle collecte et traite : \",\"part2-3-1\":\"Les données de compte de l’usager renseignées par l’usager au sein de son espace de cloud personnel Grand Lyon à des fins de gestion du compte et de communication avec l’usager ;\",\"part2-3-2\":\"Les données de compte de l’utilisateur lui permettant de connecter ses données d’électricité à Ecolyo ;\",\"part2-3-3\":\"Les données privées de consommation d’énergie et d’eau dont la récupération, la sauvegarde, le stockage, la synchronisation et le partage sur la plateforme de cloud personnel sont initiés par l’usager sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part2-3-4\":\"Les données privées sur la composition du logement et du foyer de l’utilisateur, fournies par l’utilisateur lui-même au sein du service, sont traitées par le service sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part2-3-5\":\"Des métriques d’usage du service anonymisées et remontées périodiquement afin d’améliorer la qualité du service et d’évaluer son impact (Plus d’informations sur la manière dont votre anonymat est bien préservé dans ce processus <a href=\\\"https://ecolyo.com/cloud_statistiques.html\\\">ici</a>).\",\"part2-4\":\"La Métropole réalise également des mesures d’audience à l’aide de la solution Matomo. Afin de vous fournir un meilleur service et d’améliorer votre expérience d'utilisateur, nous utilisons des solutions de mesure d’audience qui utilisent la technologie des « cookies », des fichiers texte qui sont enregistrés sur votre ordinateur et qui permettent de générer des informations envoyées aux serveurs de mesure d’audience. Sur ces serveurs, l’adresse IP est anonymisée. Les données recueillies ont uniquement pour finalité de permettre d'analyser la fréquentation de nos pages afin d'en améliorer le contenu. Il s'agit de statistiques agrégées permettant de connaître le nombre de visites et de visiteurs différents, les pages les plus populaires, les chemins préférés, les niveaux d'activité par jour de la semaine et par heure de la journée, les principales erreurs etc. Vous avez cependant le droit de vous opposer à l’utilisation de ces cookies, et donc au traitement de vos données personnelles de navigation, en vous rendant dans la page Options de notre service.\",\"part2-5\":\"L’usager est seul décisionnaire des finalités d’utilisation qu’il souhaite définir pour le traitement de ses données personnelles de consommation, à la suite de leur transmission par les partenaires du service Ecolyo sur son cloud personnel. Ainsi, dans le cadre de l’utilisation d’Ecolyo, l’usager ne recevra les données des partenaires du service : Enedis, GRDF et Eau Publique du Grand Lyon seulement qu’à sa demande expresse après la saisie de ses identifiants.\",\"part2-6\":\"L’utilisateur est donc le seul à accéder :\",\"part2-6-1\":\"À ses données de consommation d’électricité horaires, journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-6-2\":\"À ses données de consommation de gaz journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-6-3\":\"À ses données de consommation eau journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-7\":\"Les engagements et responsabilités de la Métropole de Lyon concernant la protection des données et la confidentialité des données Ecolyo sont précisés dans les Mentions légales et les conditions d’utilisation du cloud personnel Grand Lyon qui accueille aujourd’hui le service Ecolyo et sans lequel le service ne peut pas fonctionner. Pour plus d’informations sur les engagements et responsabilités de la Métropole de Lyon concernant la protection et la confidentialité dans le cloud personnel, nous vous invitons à vous référer <a href=\\\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\\\">aux mentions légales et CGU du cloud personnel métropolitain.</a> \",\"part2-8\":\"Conformément à la loi 78-17 du 6 janvier 1978 modifiée relative à l’information, aux fichiers et aux libertés, vous disposez d’un droit d’accès, de rectification et d’opposition au traitement de vos données à caractère personnel. Votre cloud personnel vous permet d’exercer ces droits directement dans cet espace sur vos données de compte. S’agissant des données de consommations d’électricité et de gaz, l’utilisateur peut supprimer son consentement à partager ses données en supprimant son connecteur dans la page Consos.\",\"part2-9\":\"Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :\",\"part2-10\":\"Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 ou en ligne, au moyen du formulaire disponible à l'adresse suivante : <a href=\\\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\\\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/.</a>\",\"part2-11\":\"L’exercice de ces droits sur vos données personnelles auprès de la Métropole de Lyon concerne exclusivement les données traitées dans le cadre du service « Ecolyo ».\",\"title3\":\"Dispositions légales\",\"part3-1\":\"Les divers éléments du site web (la forme, la mise en page, le fonds, la structure …) sont protégés par le droit des dessins et modèles, le droit d’auteur, le droit des marques ainsi que le droit à l’image et ils ne peuvent être copiés ou imités en tout ou partie sauf autorisation expresse de la Métropole de Lyon.\",\"part3-2\":\"Toute personne ne respectant pas les dispositions légales applicables se rend coupable du délit de contrefaçon et est passible des sanctions pénales prévues par la loi.\",\"title4\":\"Droits d’auteurs\",\"part4-1\":\"Les photographies, textes, logos, pictogrammes, ainsi que toutes œuvres intégrées dans le site sont la propriété de la \\\"Métropole de Lyon\\\" ou de tiers ayant autorisé la \\\"Métropole de Lyon\\\" à les utiliser.\",\"part4-2\":\"Les reproductions, les transmissions, les modifications, les réutilisations, sur un support papier ou informatique, dudit site et des œuvres qui y sont reproduites ne sont autorisées que pour un usage personnel et privé conforme aux dispositions de l’article L 122-5 du Code de la Propriété Intellectuelle. Ces reproductions devront ainsi notamment indiquer clairement la source et l’auteur du site et/ou de ces œuvres multimédias. En aucun cas ces reproductions ne sauraient porter préjudice aux droits des tiers. Les reproductions, les transmissions, les modifications, les réutilisations à des fins publicitaires, commerciales ou d’information, de tout ou partie du site, sont totalement interdites.\",\"title5\":\"Logo de la Métropole de Lyon et d’Ecolyo\",\"part5\":\"Les logos de la Métropole de Lyon et d’Ecolyo ne peuvent pas être modifiés – proportions, couleurs, éléments, constituants – et ne peuvent pas être sujet à aucune transformation, animation ou tout autre processus. Les logos de la Métropole de Lyon et d’Ecolyo ne peuvent être utilisés et associés qu’aux seules informations vérifiables. Ils ne peuvent être notamment utilisés que pour illustrer des relations avec la Métropole de Lyon ou des actions de sponsorings dûment établies. Quel que soit le cas d’espèce, la Métropole de Lyon se réserve le droit d’approuver ou de désapprouver toute utilisation des logos de la Métropole de Lyon et d’Ecolyo, pour assurer son utilisation correcte, conformément à l’éthique, la morale et aux intérêts de la Métropole de Lyon. Les conditions susmentionnées s’appliquent dans le cadre de pages web, elles ne font pas référence à l’utilisation des logos dans tout autre document. La Métropole de Lyon se réserve le droit de modifier les conditions d’utilisation des logos de la Métropole de Lyon et d’Ecolyo à tout moment et sans préavis.\",\"title6\":\"Droit des bases de données\",\"part6\":\"Les bases de données sont protégées par la loi du 1er juillet 1998 et le régime français du droit d’auteur.\",\"title7\":\"Établissements de liens vers le site Ecolyo\",\"part7-1\":\"La Métropole de Lyon autorise la mise en place d’un lien hypertexte vers son service Ecolyo pour tous les sites internet, à l’exclusion de ceux diffusant des informations à caractère polémique, pornographique, xénophobe ou pouvant, dans une plus large mesure porter atteinte à la sensibilité du plus grand nombre.\",\"part7-2\":\"Le lien doit aboutir à la page d’accueil du service (<a href=\\\"https://ecolyo.com\\\">https://ecolyo.com</a>), cette page devant apparaître dans une nouvelle fenêtre. Les pages du service Ecolyo ne doivent en aucun cas être intégrées à l’intérieur des pages d’un autre site (iframe).\",\"part7-3\":\"Dans tous les cas d’espèce, La Métropole de Lyon se réserve le droit de demander la suppression d’un lien si elle estime que le site cible ne respecte pas les règles ainsi définies.\",\"title8\":\"Liens vers des sites tiers depuis le site Ecolyo\",\"part8\":\"Les liens hypertextes mis en œuvre au sein du site en direction d’autres sites et/ou de pages personnelles et d’une manière générale vers toutes ressources existantes sur internet ne sauraient engager la responsabilité de la Métropole de Lyon quant aux liens qu’ils contiennent ou aux changements ou mises à jour qui leur sont apportés.\",\"title9\":\"Mise en garde générale\",\"part9-1\":\"Nos services mettent tout en œuvre pour offrir aux visiteurs de ce site web des informations fiables et vérifiées. Cependant, malgré tous les soins apportés, le site peut comporter des inexactitudes, des défauts de mise à jour ou des erreurs.\",\"part9-2\":\"Nous remercions les utilisateurs du site de nous faire part d’éventuelles omissions, erreurs ou corrections par mail sur la boite aux lettres du webmestre ou directement via le formulaire proposé dans le service.\",\"accessibility\":{\"button_close\":\"Fermer la fenêtre\"}},\"oauth\":{\"window\":{\"title\":\"OAuth\"}},\"onboarding\":{\"welcomeModal\":{\"title\":\"Vous êtes à mi-chemin !\",\"part1\":\"Votre cloud personnel a bien été créé.\",\"part2\":\"Il vous faut maintenant donner votre accord pour connecter vos compteurs au service.\",\"button_valid\":\"Ok\",\"accessibility\":{\"window_title\":\"Fenêtre de bienvenue\",\"button_valid\":\"Valider\"}}},\"performance_indicator\":{\"bilan\":{\"text1\":\"Par rapport à \",\"text2\":\"soit une différence de : \"},\"error_no_compare\":\"comparaison impossible\",\"error_no_compare_reason\":\"(manque de données)\",\"error_no_compare_no_data\":\"Vos consommations pour cette période sont incomplètes à cause d’un problème technique concernant :\",\"fpi\":{\"no_data\":\"Données non disponibles\",\"no_comparison\":\"Pas de comparaison possible\"}},\"profile\":{\"report\":{\"title_bilan\":\"Inscription à la lettre mensuelle\",\"switch_label_bilan\":\"Recevoir mon bilan de consommation et des conseils\",\"title_alert\":\"Alerte Consommation Excessive d'Eau\",\"switch_label_alert\":\"Être prévenu d’un dépassement anormal de ma consommation d’eau\",\"input_label_alert\":\"Si ma consommation d’eau quotidienne dépasse :\",\"input_label_subtext_alert\":\"Votre consommation quotidienne maximum sur les 6 derniers mois : \"},\"accessibility\":{\"button_toggle_mail_report\":\"Recevoir mon bilan mensuel par mail\",\"button_toggle_consumption_alert\":\"Recevoir des alertes sur mes consommations journalières\",\"input_water_alert_report\":\"Indiquer une limite de consommation d'eau journalière\"}},\"profile_type\":{\"title_profile\":\"Mes données\",\"read_profile\":\"Ajuster mon profil\",\"button_update_profile\":\"J'ajuste mon profil\",\"your_profile\":\"Mon profil\",\"multi_choices\":\"Plusieurs réponses possibles\",\"housing_type\":{\"title\":\"Logement\",\"question\":\"De quel type de logement disposez-vous ?\",\"individual_house\":\"Maison individuelle\",\"apartment\":\"Appartement\"},\"construction_year\":{\"title\":\"Construction\",\"question\":\"Quelle est son année de construction ?\",\"text_before_1948\":\"Construit avant 1948\",\"text_between_1948_and_1974\":\"Construit entre 1948 et 1974\",\"text_between_1975_and_1989\":\"Construit entre 1975 et 1989\",\"text_between_1990_and_1998\":\"Construit entre 1990 et 1998\",\"text_after_1998\":\"Construit après 1998\",\"text_unknown\":\"Construit après 1998\",\"before_1948\":\"Avant 1948\",\"between_1948_and_1974\":\"Entre 1948 et 1974\",\"between_1975_and_1989\":\"Entre 1975 et 1989\",\"between_1990_and_1998\":\"Entre 1990 et 1998\",\"after_1998\":\"Après 1998\",\"unknown\":\"Je ne sais pas\"},\"occupantsNumber\":{\"single\":\" occupant\",\"multi\":\" occupants\"},\"area\":{\"title\":\"Surface\",\"question\":\"Quelle est sa surface en m² ?\",\"name\":\" m²\"},\"occupants_number\":{\"title\":\"Nombre d'occupants\",\"question\":\"Combien il y a-t-il d'occupants ?\"},\"outside_facing_walls\":{\"1\":\"1 façade\",\"2\":\"2 façades\",\"3\":\"3 façades\",\"4\":\"4 façades\",\"title\":\"Murs extérieurs\",\"question\":\"Combien de façades donnent sur l'extérieur ?\",\"text\":{\"single\":\" façade donne sur l'extérieur\",\"multi\":\" façades donnent sur l'extérieur\"}},\"floor\":{\"title\":\"Étage\",\"question\":\"À quel étage est votre appartement ?\",\"ground_floor\":\"Au rez-de-chaussée\",\"intermediate_floor\":\"Étage intermédiaire\",\"last_floor\":\"Dernier étage\",\"not_applicable\":\"Sans objet\"},\"heating\":{\"title\":\"Chauffage\",\"question\":\"Quel est votre type de chauffage ?\",\"individual\":\"Individuel\",\"collective\":\"Collectif\"},\"individual_insulation_work\":{\"title\":\"Travaux de rénovation\",\"question\":\"Quels travaux de rénovation avez-vous réalisés ces 10 dernières années ?\",\"none\":\"Aucun\",\"roof_insulation\":\"Isolation toiture\",\"window_replacement\":\"Remplacement fenêtres\",\"wall_insulation\":\"Isolation des murs\",\"window_replacement_and_wall_insulation\":\"Remplacement fenêtres et isolation des murs\",\"window_replacement_and_roof_insulation\":\"Remplacement fenêtres et isolation toiture\",\"roof_and_wall_insulation\":\"Isolation toiture et murs\",\"window_replacement_and_roof_and_wall_insulation\":\"Remplacement fenêtre et isolation des murs et isolation toiture\",\"built_after_1998\":\"construit après 1998\"},\"facilities_installation\":{\"title\":\"Équipement\"},\"ventilation\":{\"title\":\"Ventilation double flux\",\"question\":\"Êtes-vous équipé d'une ventilation double flux ?\",\"yes\":\"Oui\",\"no\":\"Non\",\"unknown\":\"Je ne sais pas\",\"text\":\"Équipé d'une ventilation double flux\"},\"heater_replacement\":{\"title\":\"Pompe à chaleur ou poêle à bois\",\"question\":\"Au cours de ces 10 dernières années, avez-vous remplacé votre chaudière ou vous êtes-vous équipé d'une pompe à chaleur ou d'un poêle à bois ?\",\"yes\":\"Oui\",\"no\":\"Non\",\"unknown\":\"Je ne sais pas\",\"text\":\"Équipé d'une pompe à chaleur ou poêle à bois\"},\"cold_water\":{\"title\":\"Eau\",\"question\":\"Votre eau est-elle comprise dans vos charges collectives ?\",\"individual\":\"Non\",\"collective\":\"Oui\",\"individual_text\":\"Individuelle\",\"collective_text\":\"Collective\"},\"hot_water\":{\"title\":\"Eau chaude\",\"question\":\"Quel est votre type de production d’eau chaude ?\",\"individual\":\"Individuelle\",\"collective\":\"Collective\"},\"hot_water_equipment\":{\"title\":\"Eau chaude\",\"question\":\"Utilisez-vous l’un de ces équipements pour produire votre eau chaude ?\",\"solar\":\"Chauffe-eau solaire\",\"thermodynamic\":\"Chauffe-eau thermodynamique\",\"other\":\"Aucun des deux\"},\"warming_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Bois\",\"4\":\"Fioul\",\"5\":\"Autre\",\"title\":\"Source chauffage\",\"question\":\"Quelle source d’énergie principale utilisez-vous pour vous chauffer ?\",\"no_fluid_text\":\"Produit ni par de l'électricité, ni par du gaz, ni par du bois ou du fuel\",\"0_text\":\"Produit grâce à de l'électricité\",\"2_text\":\"Produit grâce au gaz\",\"3_text\":\"Produit grâce au bois\",\"4_text\":\"Produit grâce au fioul\",\"5_text\":\"Produit grâce à un autre moyen\"},\"hot_water_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Autre (Fioul, Bois)\",\"title\":\"Source eau chaude\",\"question\":\"Avec quelle source d’énergie votre eau chaude est-elle produite ?\",\"no_fluid_text\":\"Produite ni par de l'électricité, ni par du gaz\",\"0_text\":\"Produite grâce à de l'électricité\",\"2_text\":\"Produite grâce au gaz\",\"3_text\":\"Produite à partir d'un autre moyen que l'électricité ou le gaz\"},\"cooking_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"title\":\"Source cuisson\",\"question\":\"Quel mode de cuisson principal utilisez-vous ?\"},\"update_date\":{\"title\":\"Date de prise d'effet\",\"question\":\"A partir de quelle date souhaitez-vous que ce nouveau profil soit pris en compte dans l'analyse de vos données ?\"},\"fluidType\":{\"0\":\"Électricité\",\"1\":\"Eau\",\"2\":\"Gaz\"},\"form\":{\"button_previous\":\"Précédent\",\"button_next\":\"Suivant\",\"button_end\":\"Terminer\",\"button_loading\":\"Chargement...\"},\"finished\":{\"title\":\"Terminé !\",\"label1\":\"Grâce à ces informations, vous pourrez comparer votre consommation avec celle d'un foyer vous ressemblant davantage !\",\"label2\":\"Nous pourrons aussi vous proposer des astuces pour maîtriser vos consommations adaptées à votre profil.\",\"button_validate\":\"OK\"},\"accessibility\":{\"button_end\":\"Terminer la mise à jour du profil\",\"button_next\":\"Aller à la section suivante\",\"button_previous\":\"Retour à la section précédente\",\"button_update_profile\":\"Ouvrir la page de mise à jour du profil\",\"button_toggle_detail_profile\":\"Afficher ou masquer le détail du profil\",\"button_toggle_export\":\"Afficher ou masquer l'export des données'\",\"button_toggle_average_home\":\"Afficher ou masquer les informations sur le comparatif'\",\"button_validate\":\"Valider\"}},\"export\":{\"title_export\":\"Télécharger mes données\",\"text1\":\"Vous allez télécharger l'historique mensuel de vos fluides sélectionnés\",\"fluid_select\":\"Pour quel(s) fluide(s) souhaitez vous exporter vos données ?\",\"no_data\":\"Vous n'avez aucune donnée de fluide...\",\"button_download\":\"Télécharger\",\"month\":\"Mois\",\"year\":\"Année\",\"consumption\":\"Consommation\",\"maxpower\":\"Puissance max (kVA)\",\"button_close\":\"Fermer la fenêtre\",\"modal_start\":{\"accessibility_title\":\"Commencer le téléchargement\",\"text1\":\"Vous allez télécharger des données personnelles, Ecolyo n’est plus responsable de celles-ci une fois téléchargées\",\"text2\":\"Les données seront téléchargées sous forme de document excel (.xls)\",\"text3\":\"Lancer le téléchargement ?\",\"button_cancel\":\"Annuler\"},\"modal_loading\":{\"accessibility_title\":\"Téléchargement en cours\",\"text1\":\"Données en cours de téléchargement\",\"text2\":\"Veuillez ne pas quitter l’application pendant la récupération et le téléchargement de vos données\",\"button_cancel\":\"Annuler le téléchargement\"},\"modal_done\":{\"accessibility_title\":\"Téléchargement terminé\",\"text1\":\"Vos données ont bien été téléchargées !\",\"text2\":\"Vous pouvez maintenant retrouver l’historique de vos données sur votre appareil\",\"error1\":\"Aïe !\",\"error2\":\"Il semblerait qu’une erreur se soit produite lors du téléchargement de vos données.\",\"button_close\":\"Fermer\",\"button_close_error\":\"Revenir plus tard\"}},\"quiz\":{\"explanation\":\"Répondez correctement aux 5 questions et remportez 5 des 15 étoiles nécessaires pour débloquer le duel final\",\"score_final\":\"SCORE FINAL\",\"correct\":\"Bravo !\",\"wrong\":\"Raté !\",\"rightAnswer\":\"Bonne réponse :\",\"earn\":\"Vous remportez\",\"button_go_back\":\"Retour\",\"button_end_quiz\":\"Youpi !\",\"button_try_again\":\"Réessayer\",\"button_validate\":\"Valider\",\"next\":\"Suivant\",\"consumption_question\":\"Question sur votre consommation\",\"accessibility\":{\"window_title\":\"Fenêtre de résultat\",\"button_end_quiz\":\"Terminer le quiz\",\"button_go_back\":\"Retour\",\"button_go_next\":\"Suivant\",\"button_try_again\":\"Relancer le quiz\",\"button_validate\":\"Valider\"}},\"splashscreen\":{\"error_loading\":\"Une erreur est survenue\",\"button_reload\":\"Réessayer\",\"accessibility\":{\"button_reload\":\"Recharger la page\"},\"migration_error\":\"Mise à jour de l'application\",\"consent_error\":\"Vérification de vos consentements pour partager vos données avec Ecolyo\",\"profile_error\":\"Chargement de votre profil utilisateur\",\"profileType_error\":\"Chargement de votre profil de consommation.\",\"challenges_error\":\"Actualisation de votre progression dans les défis\",\"analysis_error\":\"Chargement de votre analyse mensuelle\",\"index_error\":\"Chargement des index\",\"prices_error\":\"Mise à jour des prix\",\"consos_error\":\"Connexion à vos données de consommation\",\"partners_error\":\"Récupération de l'état des services partenaires\",\"unknown_error\":\"Veuillez vérifier votre connexion internet\",\"network_error\":\"Erreur de réseau\",\"step\":{\"0\":\"Mise à jour de l'application\",\"1\":\"Vérification de vos consentements pour partager vos données avec Ecolyo\",\"2\":\"Chargement de votre profil\",\"3\":\"Actualisation de votre progression dans les défis\",\"4\":\"Mise à jour des prix\",\"5\":\"Connexion à vos données de consommation\"}},\"timestep\":{\"today\":\"Aujourd'hui\",\"year\":{\"period\":\"5 ans\",\"comparelabel\":\"Comparer à l'année précédente\"},\"month\":{\"period\":\"Année\",\"comparelabel\":\"Comparer à l'année précédente\",\"current\":\"année actuelle\",\"last\":\"année précédente\"},\"day\":{\"period\":\"Mois\",\"comparelabel\":\"Comparer au mois précédent\",\"current\":\"mois actuel\",\"last\":\"mois précédent\"},\"week\":{\"period\":\"Semaine\",\"comparelabel\":\"Comparer à la semaine précédente\",\"current\":\"semaine actuelle\",\"last\":\"semaine précédente\"},\"half_an_hour\":{\"period\":\"Jour\",\"comparelabel\":\"Comparer à la journée précédente\",\"gather_data_title\":\"La récupération de vos données demi-horaires prend environ 24h.\",\"current\":\"jour actuel\",\"last\":\"jour précédent\",\"gather_data_subtitle\":\"Votre connexion a bien été prise en compte mais un délai de 24h est en général nécessaire à l’obtention de vos données.\\nÀ demain !\",\"gather_data_failure\":\"Il semblerait que votre compteur ne nous permette pas d'accéder à des données de consommation plus fines.\",\"analysis_waiting_data\":\"Pour bénéficier d'une analyse approfondie de votre consommation électrique, il nous faut récupérer vos données de consommation horaires. La récupération de ces données prend environ 24h. A bientôt !\"},\"accessibility\":{\"button_zoom_in\":\"Sélectionner le pas de temps précédent\",\"button_zoom_out\":\"Sélectionner le pas de temps suivant\"}},\"unsubscribe\":{\"error\":\"Une erreur est survenue lors de votre désinscription, merci de ré-essayer plus tard.\",\"unsubscribed\":\"Vous êtes désormais désabonné de la newsletter Ecolyo\",\"subscribed\":\"Vous êtes désormais à nouveau abonné à la newsletter Ecolyo\",\"content\":\"Vous ne recevrez plus la notification de votre bilan ainsi que les conseils associés au mois en cours.\",\"button_subscribe\":\"Me ré-abonner\",\"button_home\":\"Me connecter à Ecolyo\",\"button_accessibility\":\"Bouton de désinscription\"},\"welcome_modal\":{\"title\":\"Félicitations\",\"perso\":\"Votre espace personnel a bien été créé.\",\"connect\":\"Vous pouvez maintenant connecter vos compteurs d’énergie à Ecolyo en toute sécurité.\",\"button_valid\":\"Ok\",\"accessibility\":{\"title\":\"Fenêtre de félicitations\",\"button_valid\":\"Valider\"}}}"); +module.exports = JSON.parse("{\"common\":{\"title_app\":\"Ecolyo\",\"title_consumption\":\"Conso\",\"title_consumption_electricity\":\"Conso électrique\",\"title_consumption_gas\":\"Conso de gaz\",\"title_consumption_water\":\"Conso d'eau\",\"title_challenge\":\"Défis\",\"title_quiz\":\"Quiz\",\"title_exploration\":\"Exploration\",\"title_action\":\"Action\",\"title_duel\":\"Duel final\",\"title_ecogesture\":\"Astuce\",\"title_ecogestures\":\"Astuces\",\"title_ecogestures_choice\":\"Sélection des astuces\",\"title_options\":\"Options\",\"title_analysis\":\"Analyse\",\"title_profiletype\":\"Ajuster mon profil\",\"title_legal_notice\":\"Mentions légales\",\"title_gcu\":\"Conditions générales d’utilisation\",\"title_accessibility\":\"Accessibilité : non conforme\",\"title_sge_connect\":\"Connexion à l'électricité\",\"title_gas_connect\":\"Connexion au gaz\",\"accessibility\":{\"loading\":\"Chargement\"},\"funders_logo\":\"Logo des financeurs : Métropole de Lyon, Etat via la Banque des Territoires et son programme France 2030, Union Européenne\"},\"navigation\":{\"consumption\":\"Conso\",\"challenges\":\"Défis\",\"ecogestures\":\"Astuces\",\"options\":\"Options\",\"analysis\":\"Analyse\"},\"FLUID\":{\"ELECTRICITY\":{\"NAME\":\"Électricité\",\"LABEL\":\"Électricité\",\"LABEL_PREPOSITION\":\"d'électricité\",\"UNIT\":\"kWh\",\"ADD\":\"Ajouter l'électricité\",\"MEGAUNIT\":\"MWh\",\"provider\":\"Enedis\"},\"WATER\":{\"NAME\":\"Eau\",\"LABEL\":\"Eau\",\"LABEL_PREPOSITION\":\"d'eau\",\"ADD\":\"Ajouter l'eau\",\"UNIT\":\"L\",\"MEGAUNIT\":\"m³\",\"provider\":\"Eau Publique du Grand Lyon\"},\"GAS\":{\"NAME\":\"Gaz\",\"LABEL\":\"Gaz\",\"LABEL_PREPOSITION\":\"de gaz\",\"ADD\":\"Ajouter le gaz\",\"UNIT\":\"kWh\",\"MEGAUNIT\":\"MWh\",\"provider\":\"GRDF\"},\"MULTIFLUID\":{\"NAME\":\"Multi fluide\",\"LABEL\":\"Multi\",\"UNIT\":\"€\"}},\"action\":{\"duration\":\"Durée : %{smartCount} jours\",\"result\":\"Résultat\",\"finished\":\"Défi terminé !\",\"details\":\"Détail de l'astuce\",\"apply\":\"J'applique cette action\",\"other\":\"Je choisis une autre action\",\"resultText1\":\"Cela n'a pas été trop difficile ?\",\"resultText2\":\"Jetez un coup d'œil dans la page conso dans 1 à 3 jours, le temps que vos données arrivent, pour voir l'impact de votre action.\",\"resultText3\":\"Pas de baisse de significative ? Pas de panique, en maintenant cette pratique dans le temps, les économies d'énergies et d'eau seront davantage visibles.\",\"resultText4\":\"Dans tous les cas, bravo, vous remportez...\",\"ok\":\"Ok\"},\"action_modal\":{\"accept\":\"Je relève le défi\",\"refuse\":\"Je me défile\",\"accessibility\":{\"window_title\":\"Fenêtre de confirmation\",\"button_accept\":\"Accepter\",\"button_refuse\":\"Refuser\"}},\"analysis\":{\"viewTitle\":\"Analyse\",\"warning_title\":\"Analyse incomplète\",\"warning_text\":\"Ecolyo n'a pas encore reçu toutes les données %{fluidList} pour ce mois\",\"comparison\":\"Comparatif\",\"analysis_date\":\"Conso totale\",\"challenge\":\"Défis terminés en\",\"user_consumption\":\"Votre conso\",\"average_home\":\"Conso moyenne d'un profil similaire\",\"average_home_description\":\"Le comparatif ici présenté est calculé sur la base d'un profil similaire au vôtre. Il s'agit d'un calcul et non d'une comparaison avec les autres utilisateurs de l'application. Sont pris en compte l'ensemble des informations entrées dans votre profil : mode de chauffage, âge du logement et éventuels travaux de rénovation, etc. Ce modèle a été créé avec l'Agence Locale de l'Energie sur la base de chiffres issues du Schéma Directeur des Energies de la Métropole de Lyon et de Chiffres-clé publiés par l'ADEME (l'Agence de l'Environnement et de la Maîtrise de l'Energie).\",\"approximative_description\":\"Pour comparer votre consommation avec un foyer similaire ou avec une conso idéale, veuillez détailler votre profil\",\"no_data\":\"Pas de données\",\"accessibility\":{\"button_go_to_profil\":\"Détailler mon profil\",\"comparison_multifluid\":\"Vos dépenses (tous fluides confondus) vs Dépenses moyennes\",\"comparison_electricity\":\"Votre consommation d'électricité vs Consommation moyenne\",\"comparison_water\":\"Votre consommation d'eau vs Consommation moyenne\",\"comparison_gas\":\"Votre consommation de gaz vs Consommation moyenne\"},\"max_day\":\"Jour où vous avez le plus consommé\",\"compare\":{\"title\":\"Comparateur\",\"month_tab\":\"Comparer au mois dernier\",\"year_tab\":\"Comparer à l'année dernière\"},\"temperature_comparison\":{\"unit\":\"°C\",\"comparison\":\"par rapport à\",\"info_button\":\"Information sur l'indice météo\",\"modal\":{\"title\":\"Indice météo\",\"month_comparison\":\"Écart de température moyenne entre le mois observé et le mois précédent.\",\"year_comparison\":\"Écart de température moyenne entre le mois observé et le même mois de l'année précédente.\",\"data_info\":\"Données Météo France issues de la station météo Lyon Bron.\",\"close\":\"Fermer la fenêtre\"}}},\"analysis_error_modal\":{\"title\":\"Aucune analyse\",\"message\":\"Pour profiter d’une analyse de vos consommations, connectez au moins un de vos compteurs.\",\"go_to_conso\":\"Je connecte mes compteurs\",\"understood\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_understood\":\"J'ai compris\",\"button_goto_konnector\":\"Aller aux connecteurs\"}},\"analysis_pie\":{\"total\":\"Conso totale\",\"details\":\"Détail par fluide\",\"month\":\"Au mois \",\"estimation\":\"Comment sont estimés<br>les prix ?\"},\"special_elec\":{\"title\":\"Spécial Électricité\",\"average\":\"Conso moyenne\",\"weektype\":\"un jour de \",\"week\":\"semaine\",\"weekend\":\"week-end\",\"min\":\"Conso minimum\",\"percentage\":\"Part dans la facture\",\"price\":\"Soit\",\"maxPower\":\"Puissance maximum atteinte\",\"offPeakHour\":\"Consommation en heures creuses\",\"showModal\":\"Plus d'infos\"},\"elec_info_modal\":{\"accessibility\":{\"window_title\":\"Information sur les statistiques Enedis\",\"button_close\":\"Fermer la fenêtre d'information\"},\"maxPowerTitle\":\"Qu’est-ce que la puissance maximum ?\",\"maxPowerDetails-1\":\"C’est la puissance maximum délivrée par tous les appareils fonctionnant au même moment dans votre logement.\",\"maxPowerDetails-2\":\"Vous avez choisi une puissance maximum dans votre offre d’électricité (3, 6 ou 9 kVA...) que vous ne devez pas dépasser pour ne pas faire sauter votre compteur. \",\"maxPowerDetails-3\":\"Cette puissance varie d'un mois à l'autre, regardez cette valeur sur l'ensemble de l'année pour vérifier si votre puissance souscrite correspond bien à votre usage.\",\"offPeakTitle\":\"Sur quelle base est calculé mon ratio Heures Pleines / Heures Creuses ?\",\"offPeakDetails-1\":\"D'après Enedis, vos plages d'heures creuses sont les suivantes : %{offPeakHours}. Nous avons donc simplement calculé, à l'aide vos consommations à la demi-heure, quelle part de votre consommation est réalisée sur vos heures creuses.\",\"minPowerTitle\":\"Qu’est-ce que la consommation minimum ?\",\"minPowerDetails-1\":\"Elle correspond à votre plus petite consommation du mois sur un créneau d'une demi-heure.\",\"minPowerDetails-2\":\"Nous extrapolons cette consommation sur 1 mois afin vous donner un aperçu de la consommation de vos consommations électriques en veille (box, télé, chargeurs, ...) ou encore de celle, incompressible, de vos appareils de froid (frigo, congélateur).\"},\"auth\":{\"enedissgegrandlyon\":{\"title\":\"Ecolyo doit se connecter à l’électricité\",\"bill\":\"Munissez-vous d’une <span>facture d’électricité</span> pour valider la connexion\",\"connect\":\"Je me connecte à l'électricité\",\"accessibility\":{\"connect\":\"Se connecter\"},\"identityTitle\":\"Nom inscrit sur la facture\",\"firstName\":\"Prénom\",\"lastName\":\"Nom\",\"pdlTitle\":\"Numéro de votre compteur électrique (PDL)\",\"pdlLabel\":\"N° (14 chiffres)\",\"pdlModal\":{\"title\":\"Qu'est-ce qu'un PDL ?\",\"title_accessibility\":\"Modale qu'est ce qu'un PDL ?\",\"txt1\":\"Votre numéro de point de livraison (PDL) peut aussi s’appeler PRM si vous possédez un compteur Linky.\",\"txt2\":\"Ce numéro est composé de 14 chiffres.\",\"txt3\":\"Votre numéro de PDL ou PRM se trouve sur votre facture d’électricité.\",\"txt4\":\"Si vous avez un compteur Linky, appuyez sur le bouton “+” et faites défiler l’affichage jusqu’à obtenir l’affichage suivant :\",\"button\":\"J'ai compris\",\"button_accessibility\":\"Bouton valider\",\"prm_accessibility\":\"Écran d'un compteur Linky présentant le numéro PRM\"},\"addressTitle\":\"Adresse du titulaire\",\"address\":\"Numéro et voie\",\"zipCode\":\"Code postal\",\"city\":\"Ville\",\"headConsent\":\"En acceptant de partager vos données, celles-ci seront directement transférées à Ecolyo à l’intérieur de votre cloud personnel, sans que la Métropole n’y accède ni ne les visualise.\",\"textConsent\":\"Afin de vous offrir des fonctionnalités de visualisation et d'analyse, Ecolyo a besoin des données suivantes : \",\"consentLi1\":\"L'historique et le relevé de vos consommations quotidiennes en kWh\",\"consentLi2\":\"L'historique et le relevé de vos consommations au pas de temps 30 minutes\",\"consentLi3\":\"Les puissances maximales atteintes quotidiennement\",\"consentLi4\":\"Les données contractuelles (début de contrat et puissance souscrite)\",\"consentCheck1\":\"Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un an</span>\",\"consentCheck2\":\"J’atteste être le titulaire du point de livraison (PDL) renseigné à l’étape précédente\"},\"grdfgrandlyon\":{\"title\":\"Ecolyo doit se connecter au gaz\",\"bill\":\"Munissez-vous d’une <span>facture de gaz</span> pour valider la connexion\",\"connect\":\"Je me connecte au gaz\",\"accessibility\":{\"connect\":\"Se connecter\"},\"identityTitle\":\"Nom inscrit sur la facture\",\"firstName\":\"Prénom\",\"lastName\":\"Nom\",\"email\":\"Email\",\"zipCode\":\"Code postal\",\"pceTitle\":\"Numéro de votre compteur de gaz (PCE)\",\"pceLabel\":\"N° (14 chiffres)\",\"pceHint\":\"Où trouver le numéro de PCE ?\",\"pceModal\":{\"title\":\"Où trouver le n° de PCE ?\",\"txt1\":\"Votre numéro de <span>PCE</span> - ou <span>Point de comptage et d'estimation</span> - se trouve sur votre facture au niveau de vos informations contractuelles (parfois en 1ère page... parfois en dernière !)<br/><br/> C'est un identifiant à 14 chiffres.\",\"button\":\"J'ai compris\",\"accessibility\":\"Titre de la modale\",\"button-accessibility\":\"Bouton valider\"},\"headConsent\":\"Vous allez partager vos données à la Métropole de Lyon. Elles seront directement transférées à Ecolyo à l'intérieur de votre cloud personnel, sans que la Métropole n'y accède ni ne les visualise.\",\"textConsent\":\"Afin de vous offrir des fonctionnalités de visualisation et d'analyse, Ecolyo a besoin des données suivantes :\",\"consentLi1\":\"L'historique de vos consommations (jusqu’à 36 mois) et le relevé quotidien de vos consommations\",\"consentLi2\":\"Les données contractuelles (type de compteur, date de début de contrat)\",\"consentCheck1\":\"Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un an</span>\",\"consentCheck2\":\"J’atteste être le titulaire du point de livraison (PCE) renseigné à l’étape précédente\",\"waiting\":{\"mailSent\":\"Un mail vous a été envoyé...\",\"mailDelay\":\"La réception du mail peut prendre 15min, l'envoi des mails se faisant tous les 1/4 d'heure\",\"validate\":\"Merci de valider l'autorisation d'accès à vos données\",\"comeback\":\"Une fois ce clic effectué, revenez ici pour accéder à vos données\",\"button_done\":\"C’est fait !\"}},\"eglgrandlyon\":{\"bill\":\"Munissez-vous d’une <span>facture d'eau</span> pour valider la connexion\",\"connect\":\"Je me connecte à l'eau\",\"accessibility\":{\"connect\":\"Se connecter\"},\"connect_form\":{\"login\":\"Identifiant (7 chiffres)\",\"password\":\"Mot de passe\",\"label\":\"Je connecte Ecolyo à mon compte Eau Publique du Grand Lyon\"},\"no_account\":{\"title\":\"Ecolyo doit se connecter à l'eau\"},\"with_account\":{\"title\":\"Votre compte Eau Publique du Grand Lyon a bien été créé ?\",\"subtitle1\":\"Plus qu’à donner votre accord pour connecter votre compteur d'eau et Ecolyo !\"},\"step1\":{\"info1\":\"La connexion se fait via <span>votre compte Eau Publique du Grand Lyon</span>.\",\"info2\":\"Possédez-vous un <span>compte Eau Publique du Grand Lyon</span> ?\"},\"step2\":{\"info1\":\"Une fois votre compte créé, <span>n'oubliez pas de revenir sur Ecolyo</span> pour finaliser la connexion.\"},\"button_go_to_partner_site\":\"Aller sur EPGL\"},\"connect_oauth\":{\"loading\":\"Chargement...\"},\"accessibility\":{\"button_reveal_password\":\"Afficher le mot de passe\",\"button_connect\":\"Se connecter\",\"button_create_account\":\"Se créer un compte\",\"window_title\":\"Fenêtre d'information sur la création de compte.\",\"button_close\":\"Fermer la fenêtre.\"},\"button_previous\":\"Précédent\",\"button_connect\":\"Se connecter\",\"button_create_account\":\"Se créer un compte\",\"button_has_account\":\"J'ai déjà un compte\",\"button_validate\":\"J'ai compris\",\"button_showOfflineData\":\"Voir mes anciennes données\",\"warningOfflineData\":\"Attention, vous visualisez d’anciennes données. Pour actualiser vos données, connectez votre compteur\"},\"challenge\":{\"card\":{\"ongoing\":{\"quiz\":\"Quiz\",\"exploration\":\"Explorations\",\"action\":\"Actions\",\"duel\":\"Duel Final\",\"result\":\"Résultat\",\"duelDone\":\"du duel final\"},\"locked\":{\"desc\":\"À débloquer en terminant le défi précédent\"}},\"card_done\":{\"saving\":\"Économie de\",\"depense\":\"Dépense de\",\"win\":\"Gagné\",\"lost\":\"Perdu\",\"final_defi\":\"sur le duel final\",\"final_defi_view\":\"Revoir le duel final\",\"reset_defi\":\"Relancer le défi\"},\"card_last\":{\"title\":\"Tous les défis sont terminés\",\"message1\":\"Nous travaillons actuellement à vous proposer de nouveaux défis.\",\"button\":\"Suggérer une idée de défi\"},\"card_unlocked\":{\"button_launch\":\"Lancer le défi\"},\"accessibility\":{\"button_launch\":\"Lancer le défi\",\"button_goto_konnector\":\"Aller aux connecteurs\",\"button_slider_previous\":\"Précédent\",\"button_slider_next\":\"Suivant\"}},\"challenge_no_fluid_modal\":{\"title\":\"Oups !\",\"content\":\"Connectez au moins 1 fluide pour pouvoir jouer\",\"button_validate\":\"Ok\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_validate\":\"Valider\"}},\"consumption\":{\"display_last_data\":\"Voir mes dernières consos\",\"accessibility\":{\"navigation_group\":\"Choix de la période\",\"fluid_menu\":\"Choix du fluide\",\"button_previous_period\":\"Afficher la période précédente\",\"button_next_period\":\"Afficher la période suivante\",\"button_previous_value\":\"Sélectionner la valeur précédente\",\"button_next_value\":\"Sélectionner la valeur suivante\",\"checkbox_compare\":\"Afficher ou cacher la comparaison\",\"bar\":\"Consommation du %{date} : %{value} %{unit}\"},\"partner_issue_modal\":{\"title\":\"Attention !\",\"accessibility_title\":\"Modale de maintenance partenaire\",\"error_connect_gaz\":\"La connexion à vos données de <span class='gaz'>gaz</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='gaz'>GRDF</span> ou dans notre service)\",\"error_connect_elec\":\"La connexion à vos données d'<span class='elec'>électricité</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='elec'>Enedis</span> ou dans notre service)\",\"error_connect_water\":\"La connexion à vos données d'<span class='water'>eau</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='water'>Eau Publique du Grand Lyon</span> ou dans notre service)\",\"additional_text\":\"La visualisation et/ou la connexion à vos données de consommation peut s'en trouver affectée.<br /><br /><i>Merci pour votre patience en attendant un retour à la normale :)</i>\",\"ok\":\"Ok\"},\"compared\":\"Comparé\"},\"consumption_details\":{\"detail\":\"Détail par fluide\",\"connect\":\"Connecter d'autres fluides\",\"mini_cards_label\":\"AUTRES ENERGIES\"},\"consumption_visualizer\":{\"missing_data\":\"Données manquantes\",\"no_data\":\"Pas de données\",\"why_no_data\":\"Pourquoi n'ai-je pas de données ?\",\"last_valid_data\":\"Dernières données valides : %{date}\",\"last_available_data\":\"Dernières données disponibles : %{date}\",\"last_valid_data_multi\":\"Dernières données complètes : %{date}\",\"data_to_come\":\"À venir\",\"aie\":\"Aïe !\",\"data_empty\":\"Vide\",\"estimated\":\"estimés\",\"cost_per_fluid\":{\"electricity\":\"Part de l'électricité\",\"water\":\"Part de l'eau\",\"gas\":\"Part du gaz\"},\"dataModal\":{\"list_title\":\"3 raisons possibles :\",\"item1\":\"le lien entre Ecolyo et le fournisseur de données est rompu : une mise à jour de ce lien (en bas de la page) peut résoudre ce problème.\",\"item2\":\"un problème technique chez votre gestionnaire : se connecter directement chez ce gestionnaire pour vérifier que cette donnée apparaît.\",\"item3\":\"pour le gaz : vous n'avez pas autorisé Ecolyo à accéder aux données de consommation de cette période.\",\"item4\":\"vous n'aviez tout simplement pas de compteur communicant à l'époque !\"},\"modal\":{\"window_title\":\"info estimation des prix\",\"title\":\"Comment sont estimés les prix ?\",\"close\":\"Fermer la fenêtre\",\"part1\":\"Le prix de votre électricité ou de votre gaz dépend de l'offre choisie auprès de votre fournisseur. N’ayant pas accès à cette information, Ecolyo affiche un prix moyen par fluide. \",\"part2\":\"Tarifs moyens retenus :\",\"list1\":\" : 1 kWh = %{elecPrice} €TTC (il correspond au tarif réglementé d’EDF au %{elecPriceStartDate} pour une puissance souscrite de 3 ou 6 kVA et hors offre heure pleine/heure creuse)\",\"list2\":\" : 1 kWh = %{gasPrice} €TTC (Prix repère de vente de gaz publié par la Commission de Régulation de l'Energie au %{gasPriceStartDate} pour un consommateur \\\"Cuisson/Eau Chaude\\\")\",\"list3\":\" : 1 litre d’eau = %{waterPrice} € TTC (prix constaté au %{waterPriceStartDate} pour un abonnement et une consommation de 120 m3/an sur la Métropole de Lyon)\",\"part3\":\"Le coût de votre abonnement n'est pas pris en compte pour l'électricité.\"},\"release_notes_modal\":{\"title\":\"Du nouveau sur Ecolyo !\",\"message\":\"Les mises à jour suivantes ont été effectuées sur votre application :\",\"go_back\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre de notifications\",\"button_go_back\":\"J'ai compris\"}}},\"ecogestures\":{\"loading\":\"Chargement des astuces\"},\"duel\":{\"global_error\":\"Oups. Une erreur est survenue. Veuillez retourner à l'écran d’accueil des défis\",\"button_go_back\":\"Retour\",\"average_info\":\"%{average} euros étant votre moyenne actuelle, relevez-vous le défi ?\",\"button_start\":\"Allons-y !\",\"goal1\":\"Faites moins que votre moyenne actuelle sur %{durationInDays} jours\",\"goal2\":\"pour gagner le badge %{title}\",\"goal_done\":\"Duel remporté\",\"goal_failed\":\"Duel perdu\",\"caption_average\":\"Votre moyenne à titre indicatif\",\"caption_consumption\":\"Votre consommation\",\"caption_incoming\":\"Données à venir\",\"accessibility\":{\"button_go_back\":\"Retour\",\"button_start_duel\":\"Lancer le duel\",\"button_start_quiz\":\"Lancer le quiz\"}},\"duel_result_modal\":{\"success\":{\"title\":\"Félicitations\",\"message1\":\"Vous avez économisé %{value} €\",\"message2\":\"et gagné le badge %{title} !\",\"button_validate\":\"Youpi\"},\"lost\":{\"title\":\"Presque\",\"message1\":\"Vous avez dépassé de %{value} €\",\"message2\":\"et manqué le badge %{title}\",\"button_validate\":\"Zut alors\"},\"accessibility\":{\"window_title\":\"Fenêtre de résultat\",\"button_validate\":\"Valider\"}},\"last_duel_modal\":{\"title\":\"Félicitations !\",\"subtitle\":\"Vous avez terminé tous les défis !\",\"message1\":\"Nous travaillons actuellement à vous proposer de nouveaux défis.\",\"message2\":\"Vous pouvez donner votre avis sur ce que vous aimeriez en cliquant sur la bulle d'aide.\",\"close\":\"Fermer la fenêtre\"},\"duel_empty_value_modal\":{\"title\":\"Oups !\",\"message\":\"Impossible de lancer le duel. Il nous manque en effet certaines de vos données de consommation pour vous proposer un duel à votre hauteur.\",\"button\":\"Je retourne au menu des défis\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_validate\":\"Retourner au menu des défis\"}},\"ecogesture\":{\"title_tab_0\":\"Objectifs\",\"title_tab_1\":\"Je fais déjà\",\"title_tab_2\":\"Toutes\",\"MENU_TITLE\":\"Filtrer\",\"ALL\":\"Tous les usages\",\"HEATING\":\"Chauffage\",\"AIR_CONDITIONING\":\"Climatisation\",\"ECS\":\"Eau chaude\",\"COLD_WATER\":\"Eau froide\",\"ELECTRICITY_SPECIFIC\":\"Électricité courante\",\"COOKING\":\"Cuisson\",\"selection\":\"Sélectionner les astuces les plus adaptées à votre consommation\",\"selection_2\":\"vues sur\",\"button_selection\":\"Continuer ma sélection\",\"no_ecogesture\":\"Aucune astuce ne correspond à votre filtrage\",\"no_ecogesture_filter\":{\"text1\":\"Nous n'avons pas trouvé d'astuces adaptées à votre profil dans cette catégorie.\",\"text2\":\"En effet, de par votre profil et vos modes de chauffage, d'eau ou d'eau chaude sanitaire, nous n'avons pas identifié d’astuces vous permettant de diminuer vos factures à titre individuel. Toutefois, vous pouvez toujours agir pour préserver les ressources en appliquant et diffusant autour de vous les autres bonnes pratiques présentées dans la partie \\\"Toutes les astuces\\\".\"},\"adjust_profil\":{\"description\":\"Pour une sélection d’astuces adaptée à votre consommation, vous pouvez ajuster votre profil.\",\"button_go_to_profil\":\"Ajuster mon profil\"},\"accessibility\":{\"window_title\":\"Fenêtre d'information'\",\"button_close\":\"Fermer la fenêtre\",\"button_selection\":\"Aller à la page de sélection\"},\"doing\":\"Je fais déjà\",\"objective\":\"Objectif\",\"emptyList\":{\"obj1\":\"Les astuces présentées sont des actions qui vous permettent de réduire vos consommations et donc vos factures. On parle parfois d’écogestes.\",\"obj1_done\":\"Aucune astuce n’a été sélectionnée comme objectif actuellement.\",\"obj2\":\"Vous pouvez sélectionner ceux à mettre en objectifs et ceux que vous appliquez déjà.\",\"obj2_done\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous souhaitez garder en objectif dans cette section.\",\"doing1\":\"Aucune astuce n’a été sélectionnée dans la catégorie appliquée actuellement.\",\"doing1_done\":\"Aucune astuce n’est indiquée comme déjà appliquée actuellement.\",\"doing2\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous mettez déjà en pratique dans cette section.\",\"doing2_done\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous mettez déjà en pratique dans cette section.\",\"btn1\":\"Voir toutes les astuces\",\"btn2\":\"Sélectionner\"},\"initModal\":{\"title\":\"Sélectionner mes astuces\",\"text1\":\"Les astuces présentées dans cette page sont des actions qui vous permettent de réduire vos consommations. Elles sont appelées parfois aussi écogestes.\",\"text2\":\"Répondez à un court questionnaire pour générer une liste d'astuces adaptée à votre profil puis sélectionnez celles que vous suivez déjà et celles que vous voulez vous mettre en objectif !\",\"btn1\":\"Plus tard\",\"btn2\":\"C'est parti !\"},\"reset\":\"Réinitialiser ma sélection\",\"resetModal\":{\"title_part1\":\"Cette action\",\"title_part2\":\"supprimera votre liste d’astuces\",\"title_part3\":\"sélectionnées dans\",\"title_part4\":\"“Objectifs”\",\"title_part5\":\"et\",\"title_part6\":\"“Je fais déjà”\",\"text1\":\"Vous pourrez ensuite faire une nouvelle sélection adaptée à votre consommation.\",\"text2\":\"Souhaitez-vous réinitialiser votre sélection d’astuces ?\",\"btn1\":\"Non\",\"btn2\":\"Réinitialiser\"}},\"ecogesture_modal\":{\"title_ecogesture\":\"Astuce\",\"title_action\":\"Action\",\"efficiency\":\"Efficacité\",\"show_less\":\"Voir moins\",\"show_more\":\"Voir plus\",\"select_action\":\"Je choisis cette action\",\"accessibility\":{\"window_title_ecogesture\":\"Fenêtre astuce\",\"window_title_action\":\"Fenêtre action\",\"button_close\":\"Fermer la fenêtre\",\"button_select_action\":\"Sélectionner cette action\",\"button_see_more_detail\":\"Afficher plus de détails\"}},\"ecogesture_info_modal\":{\"header\":\"Comment sont choisis les astuces adaptées à mon profil ?\",\"text\":\"Les astuces adaptés à votre profil sont aujourd’hui choisies en fonction des compteurs individuels que vous possédez (communicants ou non). Ceux présentés ici vous permettent d'agir sur vos consommations individuelles. Des modes de tri plus personnalisables seront proposés à l'avenir.\",\"button_close\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre d'information\",\"button_close\":\"Fermer la fenêtre\"}},\"ecogesture_form\":{\"heating_type\":{\"title\":\"Chauffage\",\"question\":\"Quel est votre type de chauffage ?\",\"individual\":\"Individuel\",\"collective\":\"Collectif\"},\"warming_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Bois\",\"4\":\"Fioul\",\"5\":\"Autre\",\"title\":\"Source chauffage\",\"question\":\"Quelle source d’énergie principale utilisez-vous pour vous chauffer ?\",\"no_fluid_text\":\"Produit ni par de l'électricité, ni par du gaz, ni par du bois ou du fuel\",\"0_text\":\"Produit grâce à de l'électricité\",\"2_text\":\"Produit grâce au gaz\",\"3_text\":\"Produit grâce au bois\",\"4_text\":\"Produit grâce au fioul\",\"5_text\":\"Produit grâce à un autre moyen\"},\"hot_water\":{\"title\":\"Eau chaude\",\"question\":\"Quel est votre type de production d’eau chaude ?\",\"individual\":\"Individuelle\",\"collective\":\"Collective\"}},\"ecogesture_profile\":{\"equipments\":{\"question\":\"Quels équipements possédez-vous ?\",\"hint\":\"Plusieurs réponses possibles\",\"air_conditioning\":\"Climatisation\",\"computer\":\"Ordinateur\",\"microwave\":\"Micro-ondes\",\"oven\":\"Four\",\"washing_machine\":\"Lave-linge\",\"dishwasher\":\"Lave-vaisselle\",\"cooking_plates\":\"Plaques électriques\",\"outside\":\"Extérieur\",\"dryer\":\"Sèche-linge\",\"refregirator\":\"Réfrigérateur\",\"fan\":\"Ventilateur\",\"water_heater\":\"Chauffe-eau\",\"curtain\":\"Rideaux\",\"internet_box\":\"Box internet\",\"ventilation\":\"VMC\",\"freezer\":\"Congélateur\",\"boiler\":\"Chaudière\",\"hydraulic_heating\":\"Chauffage hydraulique\",\"accessible_label\":\"Liste des équipements\"}},\"ecogesture_selection\":{\"header\":\"Sélection des astuces\",\"title\":\"Vous avez parcouru un groupe de %{smartCount} astuces\",\"text\":\"Voulez-vous continuer sur votre lancée ou remettre cette sélection à plus tard ?\",\"title_final\":\"Félicitations !\",\"text_final_1\":\"Vous avez terminé la sélection des astuces adaptées à votre consommation.\",\"text_final_2\":\"Vous pouvez les retrouver dans les sections “Objectifs” et “Je fais déjà” selon que vous les pratiquiez déjà ou non.\",\"button_go_to_ecogesture\":\"Plus tard\",\"button_ok\":\"J'ai compris\",\"button_continue\":\"Poursuivre\",\"button_objective\":\"Objectif\",\"button_doing\":\"Je fais déjà\",\"button_skip\":\"Pas intéressé\",\"accessibility\":{\"window_title\":\"Fenêtre d'information'\",\"button_close\":\"Fermer la fenêtre\",\"button_go_to_ecogesture\":\"Retourner aux astuces\",\"button_continue\":\"Poursuivre\",\"button_ok\":\"Fermer la sélection\"},\"selectionModal\":{\"title\":\"Des astuces correspondant à votre profil ont été trouvées !\",\"text\":\"À vous de choisir celles que vous souhaitez mettre en objectif et celles que vous faites déjà.\",\"button_close\":\"C'est parti !\"}},\"exploration\":{\"global_error\":\"Oups. Une erreur est survenue. Veuillez retourner à l'écran d’accueil des défis\",\"button_go_back\":\"Retour\",\"button_already_done\":\"C’est déjà fait !\",\"button_come_back\":\"Je reviens quand cela sera fait\",\"button_start\":\"C'est parti !\",\"watch_consumption\":\"Je fonce\",\"congratulation\":\"Bravo !\",\"earn\":\"Vous remportez\",\"button_confirm\":\"Ok\",\"interval\":{\"explanation\":\"Vous pouvez vérifier cette informations sur l'écran Conso.\"},\"accessibility\":{\"button_already_done\":\"Marquer l'exploration comme déjà réalisée\",\"button_confirm\":\"Valider\",\"button_come_back\":\"Fermer l'exploration\",\"button_go_back\":\"Retour\",\"button_start\":\"Lancer l'exploration\"}},\"error_page\":{\"main\":\"Erreur\",\"back\":\"Retour\",\"no_ecogesture\":\"Oups ! Nous n'avons pas trouvé l'astuce demandée.\"},\"help\":{\"title_help\":\"une question ? un problème ? une suggestion ?\",\"read_help\":\"Nous écrire via le Service d'Assistance Utilisateur\"},\"feedback\":{\"title\":\"Vous allez contacter le Service Assistance Utilisateur du Grand Lyon.\",\"text1\":\"Vous pourrez nous remonter un problème, chercher de l'aide pour vous connecter plus facilement, ou encore nous partager une bonne idée d'évolution.\",\"text2\":\"N'hésitez pas à nous écrire ! L'équipe Ecolyo vous répondra avec plaisir :)\",\"later\":\"Plus tard\",\"lets_go\":\"J'y vais\",\"accessibility\":{\"window_title\":\"Fenêtre de partage de retours\",\"button_close\":\"Fermer la fenêtre de partage de retours\"}},\"dataShare\":{\"title1\":\"Bienvenue !\",\"title1Update\":\"Ecolyo évolue !\",\"title2Update\":\"Pour continuer à utiliser Ecolyo, merci d’accepter les modalités de traitement des données ci-dessous.\",\"part1\":\"Nous avons besoin de l’adresse email utilisée lors de la création de votre Cozy Métropole de Lyon, ci-après nommé cloud personnel.\",\"part2\":\"Cette donnée de compte est conservée dans Ecolyo le temps de l’utilisation de ce service.\",\"part3\":\"La Métropole de Lyon utilisera cet email afin de vous tenir informé·e :\",\"item1\":\"En réponse à vos demandes, si vous avez pris l’initiative de nous contacter.\",\"item2\":\"En cas de problème majeur avec la gestion de votre compte.\",\"item3\":\"De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.\",\"part4\":\"Vos données privées de consommation d’énergie et d’eau sont récupérées, sauvegardées et stockées dans votre cloud personnel à votre initiative sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part5\":\"Il en est de même pour les données privées de composition du logement et du foyer, fournies par vos soins. Elles restent également sans visibilité de la Métropole de Lyon sur leur contenu.\\nLes données d’identification entrées lors de la connexion aux données de consommations d’électricité sont quant à elles conservées dans un espace sécurisé de la Métropole de Lyon et sont utilisées uniquement à des fins de contrôle du consentement par des organismes extérieurs.\",\"part6\":\"Dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées et pseudonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation, d’évaluer globalement l’usage de l’application via des mesures d’audience ainsi que d’évaluer à terme l’impact global en termes de baisse des consommations énergétiques de notre service.\",\"part7\":\"Au sein de votre cloud personnel, vous pouvez à tout moment exercer vos droits d’accès, de rectification, de portabilité, de limitation et d’opposition en consultant notamment la page Options.\",\"part8\":\"Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :\",\"part9\":\"Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 \",\"part10\":\"ou en ligne, au moyen du formulaire disponible à l'adresse suivante : \",\"link1\":\"<a href=\\\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\\\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/</a>\",\"validDataConsent\":\"Je consens au traitement de mes données tel que décrit ci-dessus.\",\"validCGU\":\"Je valide les \",\"validCGU_button\":\"Conditions Générales d’Utilisation\",\"validLegal\":\" du service et ai pris connaissance des \",\"validLegal_button\":\"Mentions Légales\",\"validLegal2\":\"de celui-ci.\",\"button_accept\":\"C'est parti !\",\"accessibility\":{\"button_accept\":\"Accepter les conditions générales d'utilisation\"}},\"minorUpdate\":{\"title\":\"Ecolyo évolue !\",\"button\":\"J'ai compris\"},\"gcu\":{\"title\":\"Conditions générales d’utilisation du service\",\"version\":\"Version du 12.12.2022\",\"content\":{\"title1\":\"Ecolyo, késako ?\",\"part1_1\":\"Ecolyo est un service proposé par la Métropole de Lyon vous permettant de suivre au même endroit vos consommations d’électricité, de gaz et d’eau, en kWh, en litres, en euros et à différentes échelles de temps. Ce service vous permet également de participer à des défis individuels et vous offre une analyse de vos consommations. Des astuces vous sont aussi proposées afin de vous permettre de réduire vos consommations.\",\"part1_2\":\"C’est un service gratuit qui prend la forme d’un site web dit « responsive », c’est-à-dire qu’il peut être consulté sur ordinateur ou sur mobile. Sur mobile, c’est une application que l’on a souhaitée ergonomique, réactive et esthétique pour votre plaisir de navigation et d’utilisation au quotidien.\",\"part1_3\":\"Tous les termes « techniques » sont définis en bas de page.\",\"title2\":\"Quelles fonctionnalités le service propose-t-il ?\",\"part2_1\":\"La fonctionnalité principale d’Ecolyo est la visualisation, au même endroit, de vos consommations d’électricité, de gaz et d’eau et ce, à différents pas de temps (de la demi-heure – uniquement pour l’électricité, à plusieurs années, en passant par les pas de temps journaliers et mensuels). La visualisation des consommations se fait en kWh pour l’énergie et en L pour l’eau ainsi qu’en euros (euros résultant d’un prix moyenné).\",\"part2_2\":\"Au-delà de la visualisation de vos consommations et parce que nous souhaitons vous aider à diminuer ces consommations vous retrouverez plusieurs autres pages : \",\"part2_2_list1\":\"Défis : Des quiz, et actions à mettre en place vous seront proposés pour vous pousser à réduire vos consommations.\",\"part2_2_list2\":\"Astuces : Une liste d’astuces pour maîtriser ses consommations d’énergie et d’eau à trier par usage, et avec une possibilité de les adapter plus précisément à votre profil.\",\"part2_2_list3\":\"Analyse : Une analyse de vos consommations réelles en comparaison à celle d’un foyer étant proche d’une vôtre.\",\"part2_3\":\"Pour la page Analyse ainsi que pour la partie personnalisation des astuces, des éléments supplémentaires sur votre profil vous seront demandés. L’ensemble de ces informations récoltées à l’aide du formulaire peuvent être modifiées par la suite.\",\"part2_4\":\"Dernière page : la page Options dans laquelle vous pourrez vous abonner à un service d’alerte sur vos consommations d’eau, de quoi ajuster votre profil ou encore vous désabonner de la lettre mensuelle.\",\"title3\":\"Comment ai-je accès à mes données d’électricité, de gaz et d’eau ?\",\"part3_1\":\"Pour visualiser vos consommations réelles et profiter pleinement du potentiel de notre service, il vous faut au minimum un des trois compteurs communicants suivants : Linky (pour l’électricité), Gazpar (pour le gaz), Téléo (pour l’eau).\",\"part3_2\":\"Ces compteurs sont opérés par les gestionnaires de réseaux. Pour Linky, c’est Enedis, le gestionnaire de réseau de distribution d’électricité. Pour Gazpar, GRDF est responsable de cette gestion. Et pour Téléo, c’est Eau Publique du Grand Lyon.\",\"part3_3\":\"Ces acteurs sont responsables de la relève de vos données. Ces données servent notamment à votre fournisseur d’électricité, de gaz ou d’eau pour permettre la facturation de vos consommations d’énergie. Des fournisseurs d’électricité ou de gaz il y en a des dizaines. Les gestionnaires de réseaux (… et de votre compteur) ne sont qu’au nombre de trois. Nous avons donc décidé de travailler avec eux, au plus près de la donnée brute issue de vos compteurs.\",\"part3_4\":\"Il vous faudra donc avoir un compte chez GRDF et Eau Publique du Grand Lyon pour accéder à vos données. Si vous n’en avez pas, il suffira de vous en créer un. Ceci ne sera à faire qu’une fois, au début.\",\"title4\":\"Ecolyo se trouve dans un cloud personnel Métropole de Lyon, qu’est-ce que cela signifie ?\",\"part4_1\":\"Comme vous avez dû le remarquer, lors de votre première connexion à Ecolyo vous avez dû vous créer un compte Cozy Métropole de Lyon. Ce cloud personnel est un espace sécurisé porté par l’ambition de vous apporter visibilité, transparence et maîtrise sur l’usage de vos données personnelles, et dont les fonctionnalités vous permettant de récupérer, synchroniser, stocker et partager vos données avec les destinataires de votre choix. Le service Ecolyo se déploie à l’intérieur de cet espace protégé. Dans ce cloud personnel, vous pourrez accéder également à d’autres services. Toutes les données traitées par Ecolyo, mais aussi les autres services que vous seriez amenés à utiliser dans ce cloud personnel restent dans ce Cloud Personnel Grand Lyon et n’en sortent pas, sauf si vous décidez vous-même de partager vos données avec des tiers.\",\"part4_2\":\"Pour en savoir plus sur ce cloud et son utilisation, ainsi que la durée de conservation de vos données, vous pouvez lire les conditions générales d’utilisation du service <a href=\\\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\\\">ici</a>.\",\"title5\":\"Et donc concrètement pour Ecolyo, quelles données sont collectées et qui y a accès ?\",\"part5_1\":\"Pour qu’Ecolyo ait accès à vos données de consommations, vous devrez activer vos différents connecteurs. À ce moment-là, pour la connexion aux données de gaz et d’eau à travers un parcours qui vous conduira de manière intuitive sur le site de chacun des gestionnaires de réseaux concerné, vous pourrez donner votre consentement à partager ces données avec le Service Ecolyo, et ce pour une durée limitée dans le temps. Pour l’électricité, le don du consentement et la connexion aux données se fait directement dans notre service. Quid de la durée de ce consentement ? Pour les données électriques, elle est par défaut d'un an. Pour les données gaz, cela sera à vous de la définir (nous vous recommandons 1 an pour une expérience optimale). Les données utilisées pour vérifier la bonne connexion de vos données d’électricité sont stockées du côté de la Métropole de Lyon sur des serveurs sécurisés.\",\"part5_2\":\"Vos connecteurs, une fois configurés, permettent le transfert de vos données de consommations au service Ecolyo. Le transfert de ces données de consommation se fait sans que personne n’accède à leur contenu, pas même la Métropole de Lyon. En effet, ces données sont stockées et traitées directement dans votre cloud personnel qui en assure la protection. Tous les calculs, analyses et traitements sur ces données sont faites DANS votre espace personnel sans visibilité sur le contenu des données par la Métropole de Lyon.\",\"part5_3\":\"Vous pouvez bien sûr mettre fin à la récupération/ au transfert de vos données de consommation sur votre espace cloud personnel à tout moment et à plusieurs niveaux : \",\"part5_3_list1\":\"Vous pouvez supprimer le transfert quotidien de vos données en supprimant tout simplement le connecteur dans la page Consos (en bas).\",\"part5_3_list2\":\"Pour supprimer l’ensemble de vos données ainsi que votre cloud personnel Métropole de Lyon, vous devez demander la suppression de votre cloud. Pour faire cela, rendez-vous dans les paramètres de votre cloud personnel via la barre blanche en haut d’Ecolyo et appuyez sur le bouton « Supprimer mon compte » dans la partie paramètres.\",\"part5_4\":\"Des données sur le profil de votre foyer peuvent être également remplies au sein de l’application. Ces données s’enrichiront au fur et à mesure de votre utilisation du service avec d’autres informations : défis réalisés, étoiles gagnées, etc. L’ensemble de ces données restent à l’intérieur de votre cloud personnel, sans que personne n’y ait accès.\",\"part5_5\":\"Enfin, afin de permettre une mise à jour quotidienne de vos données de consommations, vos identifiants Eau Publique du Grand Lyon, un jeton d’identification GRDF ainsi que vos numéros de compteurs sont stockés.\",\"title6\":\"Personne n’a donc accès à mes données, pas même la Métropole de Lyon, vraiment ?\",\"part6_1\":\"Conformément aux indications du paragraphe précédent, la Métropole de Lyon n’accède ni à vos données de consommations ni aux données utilisées via certaines fonctionnalités du service comme le formulaire (celui-là même qui permet l’analyse de vos consommations personnalisée ainsi qu’une sélection d’éco-gestes personnalisés). Toutes ces informations sont bien gardées au chaud dans votre cloud personnel Métropole de Lyon\",\"part6_2\":\"Seul vous pouvez accepter de partager vos données, documents ou fichiers privés avec la Métropole de Lyon, ses partenaires ou d’autres utilisateurs ou acteurs (publics ou privés) après recueil de votre consentement éclairé et par une action expresse de votre part.\",\"part6_3\":\"La Métropole de Lyon n'a cependant accès qu’à l’adresse email utilisée lors la création de votre cloud personnel Métropole de Lyon. Elle utilise cet email afin de vous tenir informé·e :\",\"part6_3_list1\":\"En réponse à vos demandes, si vous avez pris l’initiative de nous contacter. \",\"part6_3_list2\":\"En cas de problème majeur avec la gestion de votre compte.\",\"part6_3_list3\":\"De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.\",\"part6_4\":\"Elle stocke également les informations transmises lors de la connexion à l’électricité (nom, adresse postale). Ces informations doivent être stockées car la Métropole de Lyon est régulièrement contrôlée par Enedis et doit prouver détenir le consentement des personnes pour lesquelles elle va chercher la donnée.\",\"part6_5\":\"Par ailleurs, et dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques anonymisées nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation ainsi que d’évaluer l’impact global en termes de baisse des consommations énergétiques de notre service. Parmi ces statistiques, des mesures d’audience de la fréquentation des différentes pages du service sont réalisées. Vous pouvez, via la page Options, à tout instant, décider de vous opposer à la récupération de ces données d’utilisation.\",\"title8\":\"Encore des questions ?\",\"part8_1\":\"N’hésitez pas à consulter la FAQ ou à nous contacter via le formulaire de contact présente sur l’ensemble des pages.\",\"part8_2\":\"Dernière option, contactez-nous directement à <a href=\\\"mailto:ecolyo@grandlyon.com\\\">ecolyo(at)grandlyon.com</a>.\",\"title9\":\"LEXIQUE\",\"part9_1_title\":\"Cloud personnel Métropole de Lyon : \",\"part9_1_content\":\"Cloud personnel : appelé aussi le « domicile numérique », le cloud personnel est souvent réduit à un simple espace de stockage de documents mais il est bien plus que ça. C'est un espace individuel et sécurisé où vous pouvez accéder à des services sans exposer aucune donnée à l’extérieur. Vous seul pouvez y accéder, personne d'autre.\",\"part9_2_title\":\"Connecteur : \",\"part9_2_content\":\"Un connecteur est un service, installé dans votre cloud personnel également, qui a pour but uniquement d’aller récupérer les données auprès de différents partenaires/sources de données. Dans le cadre d’Ecolyo, trois connecteurs sont pré-installés dans votre cloud personnel : celui d’Enedis, celui de GRDF et celui d’Eau Publique du Grand Lyon.\",\"part9_3_title\":\"Compteur communicant : \",\"part9_3_content\":\"Un compteur communicant est un compteur qui mesure de manière précise et détaillée vos consommations et peut transmettre ces données au gestionnaire de réseau via une technologie radio (c'est le cas pour Gazpar et Téléo par exemple) ou via les réseaux électriques (via Courant Porteur en ligne, c'est le cas pour Linky par exemple).\",\"part9_4_title\":\"Fournisseur : \",\"part9_4_content\":\"Votre fournisseur d’électricité, de gaz ou d’eau est l’entreprise qui vous facture votre électricité, gaz ou eau. Côté électricité il en existe <a href=\\\"https://www.enedis.fr/liste-des-fournisseurs-delectricite\\\">aujourd’hui plus de 50</a>, chacun proposant des tarifs différents.\",\"part9_5_title\":\"Gestionnaire de réseau de distribution : \",\"part9_5_content\":\"Appelé aussi parfois distributeur, il est en charge de la livraison de votre électricité, gaz ou eau jusqu’à votre domicile. Il est aussi en charge du compteur qui relève vos consommations. Il transmet vos données de consommations à votre fournisseur afin qu’il effectue la facturation de vos consommations d’énergie. Il peut également les transmettre à tout acteur avec qui vous avez décidé de partager ces données.\"}},\"gcu_modal\":{\"button_accept\":\"J'accepte\",\"accessibility\":{\"window_title\":\"Conditions générales d’utilisation\",\"button_accept\":\"Accepter les conditions générales d'utilisation\"}},\"matomo\":{\"matomo_title\":\"Suivi statistiques d'usage Matomo\"},\"header\":{\"accessibility\":{\"button_back\":\"Retour à la page précédente\",\"button_open_feedbacks\":\"Ouvrir le partage de retours\"}},\"konnector_form\":{\"label_updated_at\":\"Dernière mise-à-jour le\",\"button_update\":\"Mettre à jour\",\"loading\":\"Chargement...\",\"wait_end_issue\":\"Attendre la fin de la maintenance avant de mettre à jour.\",\"button_disconnect\":\"Déconnecter\",\"issue\":\"Le problème semble venir de \",\"resolve\":\"Une mise à jour peut résoudre ce problème.\",\"login_failed\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"not_installed\":\"Le connecteur n'est pas installé. Veuillez l'installer en cliquant sur le bouton ci-dessous.\",\"button_install\":\"Installer\",\"error_account_creation\":\"Une erreur est survenue, veuillez essayer de nouveau.\",\"error_no_login_password\":\"Identifiant et mot de passe requis\",\"error_login_failed\":\"Identifiants invalides\",\"error_update\":\"Un problème est survenu lors du rapatriement de vos données.\",\"error_update_oauth\":\"Votre autorisation pour afficher vos données %{fluid} a expiré.\",\"button_oauth_reload\":\"Redonner mon consentement\",\"OK\":\"Ok\",\"konnector_delta\":{\"ELECTRICITY\":\"La donnée de consommation électrique arrive normalement à J+1. Un retard d'un ou deux jours est parfois constaté.\",\"GAS\":\"La donnée de consommation de gaz arrive normalement à J+3. Un retard d'un ou deux jours est parfois constaté.\",\"WATER\":\"La donnée de consommation d'eau arrive normalement à J+3. Un retard d'un ou deux jours est parfois constaté.\"},\"accessibility\":{\"button_install\":\"Installer le connecteur\",\"button_update\":\"Mettre à jour votre connexion\",\"button_disconnect\":\"Déconnecter votre connecteur\"}},\"konnector_options\":{\"label_connect_to_electricity\":\"Se connecter à l'électricité\",\"label_connect_to_water\":\"Se connecter à l'eau\",\"label_connect_to_gas\":\"Se connecter au gaz\",\"label_offline_electricity\":\"Électricité déconnectée\",\"label_offline_water\":\"Eau déconnectée\",\"label_offline_gas\":\"Gaz déconnecté\",\"partner_issue\":\"En maintenance\",\"outdated\":\"Données manquantes depuis %{isOutdatedData} jours\",\"accessibility\":{\"label_ko_status\":\"Connecteur en erreur\",\"button_toggle_detail_electricity\":\"Afficher ou masquer le détail de la connexion à l'électricité\",\"button_toggle_detail_water\":\"Afficher ou masquer le détail de la connexion à l'eau\",\"button_toggle_detail_gas\":\"Afficher ou masquer le détail de la connexion au gaz\"}},\"konnector_modal\":{\"loading_data\":\"Veuillez patienter, vos données sont en cours de chargement.\",\"loading_data_update\":\"Veuillez patienter, vos données sont en cours de mise à jour.\",\"logging_txt\":\"Nous vérifions vos informations d'identité\",\"success_txt\":\"Félicitations !\",\"success_data_electricity\":\"Vos données de consommation d'électricité sont maintenant connectées à Ecolyo.\",\"success_data_water\":\"Vos données de consommation d'eau sont maintenant connectées à Ecolyo.\",\"success_data_gas\":\"Vos données de consommation de gaz sont maintenant connectées à Ecolyo.\",\"success_data_additional_electricity\":\"Les données de consommations mettent entre un et deux jours pour arriver.\",\"success_data_additional_water\":\"Les données de consommations mettent entre trois et cinq jours pour arriver.\",\"success_data_additional_gas\":\"Les données de consommations mettent entre trois et cinq jours pour arriver.\",\"success_update_txt\":\"Connexion réussie !\",\"success_data_update_electricity\":\"Ecolyo est bien connecté à votre compteur d'électricité.\",\"success_data_update_water\":\"Ecolyo est bien connecté à votre compteur d'eau.\",\"success_data_update_gas\":\"Ecolyo est bien connecté à votre compteur de gaz.\",\"success_data_additional_update_electricity\":\"Sachez que la donnée de consommation d'électricité arrive entre J+1 et J+2.<br /><br />S'il vous manque encore des données, c'est qu'elles n'ont pas encore été mises à disposition par le gestionnaire de votre compteur. Merci pour votre patience !\",\"success_data_additional_update_water\":\"Sachez que la donnée de consommation d'eau arrive entre J+3 et J+5.<br /><br />S'il vous manque encore des données, c'est qu'elles n'ont pas encore été mises à disposition par le gestionnaire de votre compteur. Merci pour votre patience !\",\"success_data_additional_update_gas\":\"Sachez que la donnée de consommation de gaz arrive entre J+3 et J+5.<br /><br />S'il vous manque encore des données, c'est qu'elles n'ont pas encore été mises à disposition par le gestionnaire de votre compteur. Merci pour votre patience !\",\"error_txt\":\"Aïe !\",\"mismatch\":{\"title\":\"Vos données n'ont pas pu être récupérées.\",\"text1\":\"Vos nom et numéro de compteur ne correspondent plus. Merci de reconfigurer votre connecteur.\",\"text2\":\"Reconfigurer mon connecteur ?\",\"text3\":\"La reconfiguration de votre connecteur passe par sa suppression et sa nouvelle installation. Vos données seront conservées.\"},\"error_credentials_water\":\"Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter. L'identifiant est un numéro à 7 chiffres (différent de votre numéro de contrat).\",\"error_credentials_electricity\":\"Il semblerait que les nom(s) et adresse ne concordent pas avec le numéro de votre compteur.\",\"error_credentials_electricity_2\":\"Nous ne pouvons vous donner accès aux données de consommation.\",\"error_credentials_update_water\":\"Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter.\",\"error_credentials_update_electricity\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"error_credentials_update_gas\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"error_consent_form_gas_title\":\"L'accès à vos données a été bloqué par GRDF suite à un consentement précédemment supprimé par vos soins.\",\"error_consent_form_gas_report\":\"Merci de nous signaler le problème.\",\"error_data_electricity\":\"Un problème est survenu. Vos données de consommation d’électricité ne seront pas chargées.\",\"error_data_water\":\"Un problème est survenu. Vos données de consommation d’eau ne seront pas chargées.\",\"error_data_gas\":\"Il semblerait que le service de connexion à vos données de gaz soit momentanément en panne.\",\"error_data_update_electricity\":\"Un problème est survenu. Vos données de consommation d’électricité n’ont pas été mises à jour.\",\"error_data_update_water\":\"Un problème est survenu. Vos données de consommation d’eau n’ont pas été mises à jour.\",\"error_data_update_gas\":\"Un problème est survenu. Vos données de consommation de gaz n’ont pas été mises à jour.\",\"error_data_2\":\"Merci de réessayer plus tard.\",\"button_validate\":\"Ok\",\"button_understood\":\"J'ai compris\",\"button_try_again\":\"Réessayer\",\"button_contact\":\"Nous contacter\",\"button_check_info\":\"Vérifier les infos\",\"button_go\":\"J'y vais\",\"button_later\":\"Plus tard\",\"show_common_error\":\"Voir les erreurs récurrentes\",\"show_common_error_list\":\"<span>Le problème peut provenir des cas suivants :</span><ul><li>Vous avez un co-titulaire sur votre contrat. Veillez à bien entrer le nom du <span class=\\\"gold\\\">titulaire du contrat</span> et non le co-titulaire.</li><li> Votre nom comporte un tiret ? Tentez sans le tiret.</li><li>Entrez bien le nom de votre commune de résidence en entier (tirets et accents inclus)</li><li>Avez-vous bien entré le <span class=\\\"gold\\\">numéro de votre compteur</span> (PDL) ? Tout autre numéro (de contrat, de client) ne fonctionne pas.</li></ul><p>Si vous rencontrez toujours des difficultés, contactez notre service d'aide </p><div class=\\\"center\\\">Avez-vous pensez à vérifier ces informations ?</div>\",\"accessibility\":{\"window_title\":\"Fenêtre d'attente de connexion\",\"button_close\":\"Fermer la fenêtre\"}},\"consent_outdated\":{\"title\":{\"0\":\"Votre autorisation pour afficher vos données d’électricité a expiré\",\"2\":\"Aïe !\"},\"text1\":{\"0\":\"Veuillez re-donner votre consentement pour la transmission et la reconnexion de vos données ENEDIS à Ecolyo.\",\"2\":\"L'accès à vos données de consommation de gaz a expiré.\"},\"text2\":{\"0\":\"Souhaitez-vous renouveler votre accord dès maintenant pour un an ?\",\"2\":\"Merci de redonner votre consentement pour y accéder.\"},\"later\":\"Plus tard\",\"go\":\"J'y vais\",\"no\":\"Non\",\"yes\":\"Oui\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur, consentement expiré\",\"button_close\":\"Fermer la fenêtre\"}},\"legal\":{\"read_legal\":\"Lire les mentions légales\",\"title_legal\":\"Mentions légales & CGU\",\"version\":\"Version du 12.12.2022\",\"site\":\"Site du service Ecolyo : <a href=\\\"https://ecolyo.com/\\\"> https://ecolyo.com/</a>\",\"adress\":\"Métropole de Lyon - 20, rue du Lac – CS 33569 - 69505 Lyon cedex 03\",\"phone\":\"Tél : (33) 4 78 63 40 40\",\"mail\":\"<a href=\\\"mailto:ecolyo@grandlyon.com\\\"> ecolyo(at)grandlyon.com</a>\",\"p1b\":\"Directrice de publication : \",\"p1\":\"Blandine MELAY, Responsable du Service Transition Énergétique\",\"p2b\":\"Animation éditoriale, gestion et mise à jour : \",\"p2\":\"Marion BERTHOLON, Chargée de services numériques pour la transition énergétique\",\"p3b\":\"Photographies : \",\"p3\":\"sauf mention contraire, les photos sont la propriété de la Métropole de Lyon\",\"p4b\":\"Conception et Charte graphique : \",\"p4\":\"Florent Dufier\",\"p5b\":\"Réalisation technique : \",\"p5\":\"Métropole de Lyon, Sopra Steria\",\"p6b\":\"Maintenance technique : \",\"p6\":\"Délégation Développement économique, emploi & savoirs - Innovation numérique & systèmes d’information - Usages et services numériques - Développement des services numériques\",\"title1\":\"Crédits\",\"part1\":\"Ce site est le résultat de développements spécifiques réalisés dans les langages Go, TypeScript, HTML et Sass. Les développements s’appuient sur plusieurs bibliothèques et frameworks libres : axios, cozy-bar, cozy-client, cozy-harvest-lib, cozy-scripts, cozy-ui, d3, detect-browser, global, lodash, luxon, moment, moment-timezone, node-sass, object-hash, react, react-dom, react-redux, react-router-dom, react-swipeable-views, redux-devtools-extension, sass-loader. Les tests de l’application s’appuient sur les bibliothèques et frameworks libres suivants: jest-junit, react-test-renderer, redux-mock-store. La pile technique intègre également les applications Cozy stack, Yarn, Docker, ACH. Les déploiements sont réalisés sur le registre hébergé chez Cozy. L’équipe de réalisation utilise au quotidien les applications GitLab, IceScrum, RocketChat, SonarQube.\",\"title2\":\"Traitement des données personnelles et droit d’accès, de modification et de suppression\",\"part2\":\"Conformément à la réglementation en vigueur en matière de protection des données personnelles, le service Ecolyo a fait l’objet d’une inscription au registre des traitements de la Métropole de Lyon. Ecolyo fait partie de l’écosystème de services orientés « self data » déployés par la Métropole de Lyon avec l’ambition d’offrir aux usagers métropolitains les outils et les services leur permettant d’exercer directement leur droit à la portabilité, dans un cadre apte à garantir aussi bien la transparence et le contrôle sur l’usage de leurs données personnelles que l’exploitation directe du contenu de ces données selon leurs libres choix. Le self data est en effet selon la Fondation Internet Nouvelle Génération (FING) « la production, l’exploitation et le partage de données personnelles par les individus, sous leur contrôle et à leurs propres fins ». Au sein de cet environnement self data, la gestion des données s’appuie sur l’organisation suivante des rôles et responsabilités associées : \",\"part2-1\":\"Les partenaires du service GRDF et Eau Publique du Grand Lyon sont responsables exclusivement des seuls traitements de Données Personnelles relatifs à la collecte des données de consommation de gaz et d’eau de l’utilisateur et à leur transmission sur la plateforme de cloud personnel, après consentement de l’utilisateur.\",\"part2-2\":\"Enedis est responsable de la collecte des données de consommation d’électricité et de leur mise à disposition à la Métropole de Lyon qui, elle en gère la transmission sur la plateforme du cloud personnel de l’utilisateur, après avoir récupéré le consentement de l’utilisateur.\",\"part2-3\":\"La Métropole de Lyon est responsable de traitement sur le périmètre du service Ecolyo qu’elle propose à l’usager, ainsi que des traitements nécessaires à la fourniture de la plateforme de cloud personnel qu’elle met à disposition de l’usager pour accéder au service Ecolyo. En sa qualité de responsable de ces traitements, elle collecte et traite : \",\"part2-3-1\":\"Les données de compte de l’usager renseignées par l’usager au sein de son espace de cloud personnel Grand Lyon à des fins de gestion du compte et de communication avec l’usager ;\",\"part2-3-2\":\"Les données de compte de l’utilisateur lui permettant de connecter ses données d’électricité à Ecolyo ;\",\"part2-3-3\":\"Les données privées de consommation d’énergie et d’eau dont la récupération, la sauvegarde, le stockage, la synchronisation et le partage sur la plateforme de cloud personnel sont initiés par l’usager sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part2-3-4\":\"Les données privées sur la composition du logement et du foyer de l’utilisateur, fournies par l’utilisateur lui-même au sein du service, sont traitées par le service sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part2-3-5\":\"Des métriques d’usage du service anonymisées et remontées périodiquement afin d’améliorer la qualité du service et d’évaluer son impact (Plus d’informations sur la manière dont votre anonymat est bien préservé dans ce processus <a href=\\\"https://ecolyo.com/cloud_statistiques.html\\\">ici</a>).\",\"part2-4\":\"La Métropole réalise également des mesures d’audience à l’aide de la solution Matomo. Afin de vous fournir un meilleur service et d’améliorer votre expérience d'utilisateur, nous utilisons des solutions de mesure d’audience qui utilisent la technologie des « cookies », des fichiers texte qui sont enregistrés sur votre ordinateur et qui permettent de générer des informations envoyées aux serveurs de mesure d’audience. Sur ces serveurs, l’adresse IP est anonymisée. Les données recueillies ont uniquement pour finalité de permettre d'analyser la fréquentation de nos pages afin d'en améliorer le contenu. Il s'agit de statistiques agrégées permettant de connaître le nombre de visites et de visiteurs différents, les pages les plus populaires, les chemins préférés, les niveaux d'activité par jour de la semaine et par heure de la journée, les principales erreurs etc. Vous avez cependant le droit de vous opposer à l’utilisation de ces cookies, et donc au traitement de vos données personnelles de navigation, en vous rendant dans la page Options de notre service.\",\"part2-5\":\"L’usager est seul décisionnaire des finalités d’utilisation qu’il souhaite définir pour le traitement de ses données personnelles de consommation, à la suite de leur transmission par les partenaires du service Ecolyo sur son cloud personnel. Ainsi, dans le cadre de l’utilisation d’Ecolyo, l’usager ne recevra les données des partenaires du service : Enedis, GRDF et Eau Publique du Grand Lyon seulement qu’à sa demande expresse après la saisie de ses identifiants.\",\"part2-6\":\"L’utilisateur est donc le seul à accéder :\",\"part2-6-1\":\"À ses données de consommation d’électricité horaires, journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-6-2\":\"À ses données de consommation de gaz journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-6-3\":\"À ses données de consommation eau journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-7\":\"Les engagements et responsabilités de la Métropole de Lyon concernant la protection des données et la confidentialité des données Ecolyo sont précisés dans les Mentions légales et les conditions d’utilisation du cloud personnel Grand Lyon qui accueille aujourd’hui le service Ecolyo et sans lequel le service ne peut pas fonctionner. Pour plus d’informations sur les engagements et responsabilités de la Métropole de Lyon concernant la protection et la confidentialité dans le cloud personnel, nous vous invitons à vous référer <a href=\\\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\\\">aux mentions légales et CGU du cloud personnel métropolitain.</a> \",\"part2-8\":\"Conformément à la loi 78-17 du 6 janvier 1978 modifiée relative à l’information, aux fichiers et aux libertés, vous disposez d’un droit d’accès, de rectification et d’opposition au traitement de vos données à caractère personnel. Votre cloud personnel vous permet d’exercer ces droits directement dans cet espace sur vos données de compte. S’agissant des données de consommations d’électricité et de gaz, l’utilisateur peut supprimer son consentement à partager ses données en supprimant son connecteur dans la page Consos.\",\"part2-9\":\"Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :\",\"part2-10\":\"Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 ou en ligne, au moyen du formulaire disponible à l'adresse suivante : <a href=\\\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\\\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/.</a>\",\"part2-11\":\"L’exercice de ces droits sur vos données personnelles auprès de la Métropole de Lyon concerne exclusivement les données traitées dans le cadre du service « Ecolyo ».\",\"title3\":\"Dispositions légales\",\"part3-1\":\"Les divers éléments du site web (la forme, la mise en page, le fonds, la structure …) sont protégés par le droit des dessins et modèles, le droit d’auteur, le droit des marques ainsi que le droit à l’image et ils ne peuvent être copiés ou imités en tout ou partie sauf autorisation expresse de la Métropole de Lyon.\",\"part3-2\":\"Toute personne ne respectant pas les dispositions légales applicables se rend coupable du délit de contrefaçon et est passible des sanctions pénales prévues par la loi.\",\"title4\":\"Droits d’auteurs\",\"part4-1\":\"Les photographies, textes, logos, pictogrammes, ainsi que toutes œuvres intégrées dans le site sont la propriété de la \\\"Métropole de Lyon\\\" ou de tiers ayant autorisé la \\\"Métropole de Lyon\\\" à les utiliser.\",\"part4-2\":\"Les reproductions, les transmissions, les modifications, les réutilisations, sur un support papier ou informatique, dudit site et des œuvres qui y sont reproduites ne sont autorisées que pour un usage personnel et privé conforme aux dispositions de l’article L 122-5 du Code de la Propriété Intellectuelle. Ces reproductions devront ainsi notamment indiquer clairement la source et l’auteur du site et/ou de ces œuvres multimédias. En aucun cas ces reproductions ne sauraient porter préjudice aux droits des tiers. Les reproductions, les transmissions, les modifications, les réutilisations à des fins publicitaires, commerciales ou d’information, de tout ou partie du site, sont totalement interdites.\",\"title5\":\"Logo de la Métropole de Lyon et d’Ecolyo\",\"part5\":\"Les logos de la Métropole de Lyon et d’Ecolyo ne peuvent pas être modifiés – proportions, couleurs, éléments, constituants – et ne peuvent pas être sujet à aucune transformation, animation ou tout autre processus. Les logos de la Métropole de Lyon et d’Ecolyo ne peuvent être utilisés et associés qu’aux seules informations vérifiables. Ils ne peuvent être notamment utilisés que pour illustrer des relations avec la Métropole de Lyon ou des actions de sponsorings dûment établies. Quel que soit le cas d’espèce, la Métropole de Lyon se réserve le droit d’approuver ou de désapprouver toute utilisation des logos de la Métropole de Lyon et d’Ecolyo, pour assurer son utilisation correcte, conformément à l’éthique, la morale et aux intérêts de la Métropole de Lyon. Les conditions susmentionnées s’appliquent dans le cadre de pages web, elles ne font pas référence à l’utilisation des logos dans tout autre document. La Métropole de Lyon se réserve le droit de modifier les conditions d’utilisation des logos de la Métropole de Lyon et d’Ecolyo à tout moment et sans préavis.\",\"title6\":\"Droit des bases de données\",\"part6\":\"Les bases de données sont protégées par la loi du 1er juillet 1998 et le régime français du droit d’auteur.\",\"title7\":\"Établissements de liens vers le site Ecolyo\",\"part7-1\":\"La Métropole de Lyon autorise la mise en place d’un lien hypertexte vers son service Ecolyo pour tous les sites internet, à l’exclusion de ceux diffusant des informations à caractère polémique, pornographique, xénophobe ou pouvant, dans une plus large mesure porter atteinte à la sensibilité du plus grand nombre.\",\"part7-2\":\"Le lien doit aboutir à la page d’accueil du service (<a href=\\\"https://ecolyo.com\\\">https://ecolyo.com</a>), cette page devant apparaître dans une nouvelle fenêtre. Les pages du service Ecolyo ne doivent en aucun cas être intégrées à l’intérieur des pages d’un autre site (iframe).\",\"part7-3\":\"Dans tous les cas d’espèce, La Métropole de Lyon se réserve le droit de demander la suppression d’un lien si elle estime que le site cible ne respecte pas les règles ainsi définies.\",\"title8\":\"Liens vers des sites tiers depuis le site Ecolyo\",\"part8\":\"Les liens hypertextes mis en œuvre au sein du site en direction d’autres sites et/ou de pages personnelles et d’une manière générale vers toutes ressources existantes sur internet ne sauraient engager la responsabilité de la Métropole de Lyon quant aux liens qu’ils contiennent ou aux changements ou mises à jour qui leur sont apportés.\",\"title9\":\"Mise en garde générale\",\"part9-1\":\"Nos services mettent tout en œuvre pour offrir aux visiteurs de ce site web des informations fiables et vérifiées. Cependant, malgré tous les soins apportés, le site peut comporter des inexactitudes, des défauts de mise à jour ou des erreurs.\",\"part9-2\":\"Nous remercions les utilisateurs du site de nous faire part d’éventuelles omissions, erreurs ou corrections par mail sur la boite aux lettres du webmestre ou directement via le formulaire proposé dans le service.\",\"accessibility\":{\"button_close\":\"Fermer la fenêtre\"}},\"oauth\":{\"window\":{\"title\":\"OAuth\"}},\"onboarding\":{\"welcomeModal\":{\"title\":\"Vous êtes à mi-chemin !\",\"part1\":\"Votre cloud personnel a bien été créé.\",\"part2\":\"Il vous faut maintenant donner votre accord pour connecter vos compteurs au service.\",\"button_valid\":\"Ok\",\"accessibility\":{\"window_title\":\"Fenêtre de bienvenue\",\"button_valid\":\"Valider\"}}},\"performance_indicator\":{\"bilan\":{\"text1\":\"Par rapport à \",\"text2\":\"soit une différence de : \"},\"error_no_compare\":\"comparaison impossible\",\"error_no_compare_reason\":\"(manque de données)\",\"error_no_compare_no_data\":\"Vos consommations pour cette période sont incomplètes à cause d’un problème technique concernant :\",\"fpi\":{\"no_data\":\"Données non disponibles\",\"no_comparison\":\"Pas de comparaison possible\"}},\"profile\":{\"report\":{\"title_bilan\":\"Inscription à la lettre mensuelle\",\"switch_label_bilan\":\"Recevoir mon bilan de consommation et des conseils\",\"title_alert\":\"Alerte Consommation Excessive d'Eau\",\"switch_label_alert\":\"Être prévenu d’un dépassement anormal de ma consommation d’eau\",\"input_label_alert\":\"Si ma consommation d’eau quotidienne dépasse :\",\"input_label_subtext_alert\":\"Votre consommation quotidienne maximum sur les 6 derniers mois : \"},\"accessibility\":{\"button_toggle_mail_report\":\"Recevoir mon bilan mensuel par mail\",\"button_toggle_consumption_alert\":\"Recevoir des alertes sur mes consommations journalières\",\"input_water_alert_report\":\"Indiquer une limite de consommation d'eau journalière\"}},\"profile_type\":{\"title_profile\":\"Mes données\",\"read_profile\":\"Ajuster mon profil\",\"button_update_profile\":\"J'ajuste mon profil\",\"your_profile\":\"Mon profil\",\"multi_choices\":\"Plusieurs réponses possibles\",\"housing_type\":{\"title\":\"Logement\",\"question\":\"De quel type de logement disposez-vous ?\",\"individual_house\":\"Maison individuelle\",\"apartment\":\"Appartement\"},\"construction_year\":{\"title\":\"Construction\",\"question\":\"Quelle est son année de construction ?\",\"text_before_1948\":\"Construit avant 1948\",\"text_between_1948_and_1974\":\"Construit entre 1948 et 1974\",\"text_between_1975_and_1989\":\"Construit entre 1975 et 1989\",\"text_between_1990_and_1998\":\"Construit entre 1990 et 1998\",\"text_after_1998\":\"Construit après 1998\",\"text_unknown\":\"Construit après 1998\",\"before_1948\":\"Avant 1948\",\"between_1948_and_1974\":\"Entre 1948 et 1974\",\"between_1975_and_1989\":\"Entre 1975 et 1989\",\"between_1990_and_1998\":\"Entre 1990 et 1998\",\"after_1998\":\"Après 1998\",\"unknown\":\"Je ne sais pas\"},\"occupantsNumber\":{\"single\":\" occupant\",\"multi\":\" occupants\"},\"area\":{\"title\":\"Surface\",\"question\":\"Quelle est sa surface en m² ?\",\"name\":\" m²\"},\"occupants_number\":{\"title\":\"Nombre d'occupants\",\"question\":\"Combien il y a-t-il d'occupants ?\"},\"outside_facing_walls\":{\"1\":\"1 façade\",\"2\":\"2 façades\",\"3\":\"3 façades\",\"4\":\"4 façades\",\"title\":\"Murs extérieurs\",\"question\":\"Combien de façades donnent sur l'extérieur ?\",\"text\":{\"single\":\" façade donne sur l'extérieur\",\"multi\":\" façades donnent sur l'extérieur\"}},\"floor\":{\"title\":\"Étage\",\"question\":\"À quel étage est votre appartement ?\",\"ground_floor\":\"Au rez-de-chaussée\",\"intermediate_floor\":\"Étage intermédiaire\",\"last_floor\":\"Dernier étage\",\"not_applicable\":\"Sans objet\"},\"heating\":{\"title\":\"Chauffage\",\"question\":\"Quel est votre type de chauffage ?\",\"individual\":\"Individuel\",\"collective\":\"Collectif\"},\"individual_insulation_work\":{\"title\":\"Travaux de rénovation\",\"question\":\"Quels travaux de rénovation avez-vous réalisés ces 10 dernières années ?\",\"none\":\"Aucun\",\"roof_insulation\":\"Isolation toiture\",\"window_replacement\":\"Remplacement fenêtres\",\"wall_insulation\":\"Isolation des murs\",\"window_replacement_and_wall_insulation\":\"Remplacement fenêtres et isolation des murs\",\"window_replacement_and_roof_insulation\":\"Remplacement fenêtres et isolation toiture\",\"roof_and_wall_insulation\":\"Isolation toiture et murs\",\"window_replacement_and_roof_and_wall_insulation\":\"Remplacement fenêtre et isolation des murs et isolation toiture\",\"built_after_1998\":\"construit après 1998\"},\"facilities_installation\":{\"title\":\"Équipement\"},\"ventilation\":{\"title\":\"Ventilation double flux\",\"question\":\"Êtes-vous équipé d'une ventilation double flux ?\",\"yes\":\"Oui\",\"no\":\"Non\",\"unknown\":\"Je ne sais pas\",\"text\":\"Équipé d'une ventilation double flux\"},\"heater_replacement\":{\"title\":\"Pompe à chaleur ou poêle à bois\",\"question\":\"Au cours de ces 10 dernières années, avez-vous remplacé votre chaudière ou vous êtes-vous équipé d'une pompe à chaleur ou d'un poêle à bois ?\",\"yes\":\"Oui\",\"no\":\"Non\",\"unknown\":\"Je ne sais pas\",\"text\":\"Équipé d'une pompe à chaleur ou poêle à bois\"},\"cold_water\":{\"title\":\"Eau\",\"question\":\"Votre eau est-elle comprise dans vos charges collectives ?\",\"individual\":\"Non\",\"collective\":\"Oui\",\"individual_text\":\"Individuelle\",\"collective_text\":\"Collective\"},\"hot_water\":{\"title\":\"Eau chaude\",\"question\":\"Quel est votre type de production d’eau chaude ?\",\"individual\":\"Individuelle\",\"collective\":\"Collective\"},\"hot_water_equipment\":{\"title\":\"Eau chaude\",\"question\":\"Utilisez-vous l’un de ces équipements pour produire votre eau chaude ?\",\"solar\":\"Chauffe-eau solaire\",\"thermodynamic\":\"Chauffe-eau thermodynamique\",\"other\":\"Aucun des deux\"},\"warming_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Bois\",\"4\":\"Fioul\",\"5\":\"Autre\",\"title\":\"Source chauffage\",\"question\":\"Quelle source d’énergie principale utilisez-vous pour vous chauffer ?\",\"no_fluid_text\":\"Produit ni par de l'électricité, ni par du gaz, ni par du bois ou du fuel\",\"0_text\":\"Produit grâce à de l'électricité\",\"2_text\":\"Produit grâce au gaz\",\"3_text\":\"Produit grâce au bois\",\"4_text\":\"Produit grâce au fioul\",\"5_text\":\"Produit grâce à un autre moyen\"},\"hot_water_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Autre (Fioul, Bois)\",\"title\":\"Source eau chaude\",\"question\":\"Avec quelle source d’énergie votre eau chaude est-elle produite ?\",\"no_fluid_text\":\"Produite ni par de l'électricité, ni par du gaz\",\"0_text\":\"Produite grâce à de l'électricité\",\"2_text\":\"Produite grâce au gaz\",\"3_text\":\"Produite à partir d'un autre moyen que l'électricité ou le gaz\"},\"cooking_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"title\":\"Source cuisson\",\"question\":\"Quel mode de cuisson principal utilisez-vous ?\"},\"update_date\":{\"title\":\"Date de prise d'effet\",\"question\":\"A partir de quelle date souhaitez-vous que ce nouveau profil soit pris en compte dans l'analyse de vos données ?\"},\"fluidType\":{\"0\":\"Électricité\",\"1\":\"Eau\",\"2\":\"Gaz\"},\"form\":{\"button_previous\":\"Précédent\",\"button_next\":\"Suivant\",\"button_end\":\"Terminer\",\"button_loading\":\"Chargement...\"},\"finished\":{\"title\":\"Terminé !\",\"label1\":\"Grâce à ces informations, vous pourrez comparer votre consommation avec celle d'un foyer vous ressemblant davantage !\",\"label2\":\"Nous pourrons aussi vous proposer des astuces pour maîtriser vos consommations adaptées à votre profil.\",\"button_validate\":\"OK\"},\"accessibility\":{\"button_end\":\"Terminer la mise à jour du profil\",\"button_next\":\"Aller à la section suivante\",\"button_previous\":\"Retour à la section précédente\",\"button_update_profile\":\"Ouvrir la page de mise à jour du profil\",\"button_toggle_detail_profile\":\"Afficher ou masquer le détail du profil\",\"button_toggle_export\":\"Afficher ou masquer l'export des données'\",\"button_toggle_average_home\":\"Afficher ou masquer les informations sur le comparatif'\",\"button_validate\":\"Valider\",\"button_export_data\":\"Télécharger les données\"}},\"export\":{\"title_export\":\"Télécharger mes données\",\"text1\":\"Vous allez télécharger l'historique mensuel de vos fluides sélectionnés\",\"fluid_select\":\"Pour quel(s) fluide(s) souhaitez vous exporter vos données ?\",\"no_data\":\"Vous n'avez aucune donnée de fluide...\",\"button_download\":\"Télécharger\",\"month\":\"Mois\",\"year\":\"Année\",\"consumption\":\"Consommation\",\"maxpower\":\"Puissance max (kVA)\",\"button_close\":\"Fermer la fenêtre\",\"modal_start\":{\"accessibility_title\":\"Commencer le téléchargement\",\"text1\":\"Vous allez télécharger des données personnelles, Ecolyo n’est plus responsable de celles-ci une fois téléchargées\",\"text2\":\"Les données seront téléchargées sous forme de document excel (.xls)\",\"text3\":\"Lancer le téléchargement ?\",\"button_cancel\":\"Annuler\"},\"modal_loading\":{\"accessibility_title\":\"Téléchargement en cours\",\"text1\":\"Données en cours de téléchargement\",\"text2\":\"Veuillez ne pas quitter l’application pendant la récupération et le téléchargement de vos données\",\"button_cancel\":\"Annuler le téléchargement\"},\"modal_done\":{\"accessibility_title\":\"Téléchargement terminé\",\"text1\":\"Vos données ont bien été téléchargées !\",\"text2\":\"Vous pouvez maintenant retrouver l’historique de vos données sur votre appareil\",\"error1\":\"Aïe !\",\"error2\":\"Il semblerait qu’une erreur se soit produite lors du téléchargement de vos données.\",\"button_close\":\"Fermer\",\"button_close_error\":\"Revenir plus tard\"}},\"quiz\":{\"explanation\":\"Répondez correctement aux 5 questions et remportez 5 des 15 étoiles nécessaires pour débloquer le duel final\",\"score_final\":\"SCORE FINAL\",\"correct\":\"Bravo !\",\"wrong\":\"Raté !\",\"rightAnswer\":\"Bonne réponse :\",\"earn\":\"Vous remportez\",\"button_go_back\":\"Retour\",\"button_end_quiz\":\"Youpi !\",\"button_try_again\":\"Réessayer\",\"button_validate\":\"Valider\",\"next\":\"Suivant\",\"consumption_question\":\"Question sur votre consommation\",\"accessibility\":{\"window_quit\":\"Quitter la fenêtre\",\"window_title\":\"Fenêtre de résultat\",\"button_end_quiz\":\"Terminer le quiz\",\"button_go_back\":\"Retour\",\"button_go_next\":\"Suivant\",\"button_try_again\":\"Relancer le quiz\",\"button_validate\":\"Valider\"}},\"splashscreen\":{\"error_loading\":\"Une erreur est survenue\",\"button_reload\":\"Réessayer\",\"accessibility\":{\"button_reload\":\"Recharger la page\"},\"migration_error\":\"Mise à jour de l'application\",\"consent_error\":\"Vérification de vos consentements pour partager vos données avec Ecolyo\",\"profile_error\":\"Chargement de votre profil utilisateur\",\"profileType_error\":\"Chargement de votre profil de consommation.\",\"challenges_error\":\"Actualisation de votre progression dans les défis\",\"analysis_error\":\"Chargement de votre analyse mensuelle\",\"index_error\":\"Chargement des index\",\"prices_error\":\"Mise à jour des prix\",\"consos_error\":\"Connexion à vos données de consommation\",\"partners_error\":\"Récupération de l'état des services partenaires\",\"unknown_error\":\"Veuillez vérifier votre connexion internet\",\"network_error\":\"Erreur de réseau\",\"step\":{\"0\":\"Mise à jour de l'application\",\"1\":\"Vérification de vos consentements pour partager vos données avec Ecolyo\",\"2\":\"Chargement de votre profil\",\"3\":\"Actualisation de votre progression dans les défis\",\"4\":\"Mise à jour des prix\",\"5\":\"Connexion à vos données de consommation\"}},\"timestep\":{\"today\":\"Aujourd'hui\",\"year\":{\"period\":\"5 ans\",\"comparelabel\":\"Comparer à l'année précédente\"},\"month\":{\"period\":\"Année\",\"comparelabel\":\"Comparer à l'année précédente\",\"current\":\"année actuelle\",\"last\":\"année précédente\"},\"day\":{\"period\":\"Mois\",\"comparelabel\":\"Comparer au mois précédent\",\"current\":\"mois actuel\",\"last\":\"mois précédent\"},\"week\":{\"period\":\"Semaine\",\"comparelabel\":\"Comparer à la semaine précédente\",\"current\":\"semaine actuelle\",\"last\":\"semaine précédente\"},\"half_an_hour\":{\"period\":\"Jour\",\"comparelabel\":\"Comparer à la journée précédente\",\"gather_data_title\":\"La récupération de vos données demi-horaires prend environ 24h.\",\"current\":\"jour actuel\",\"last\":\"jour précédent\",\"gather_data_subtitle\":\"Votre connexion a bien été prise en compte mais un délai de 24h est en général nécessaire à l’obtention de vos données.\\nÀ demain !\",\"gather_data_failure\":\"Il semblerait que votre compteur ne nous permette pas d'accéder à des données de consommation plus fines.\",\"analysis_waiting_data\":\"Pour bénéficier d'une analyse approfondie de votre consommation électrique, il nous faut récupérer vos données de consommation horaires. La récupération de ces données prend environ 24h. A bientôt !\"},\"accessibility\":{\"button_zoom_in\":\"Sélectionner le pas de temps précédent\",\"button_zoom_out\":\"Sélectionner le pas de temps suivant\"}},\"unsubscribe\":{\"error\":\"Une erreur est survenue lors de votre désinscription, merci de ré-essayer plus tard.\",\"unsubscribed\":\"Vous êtes désormais désabonné de la newsletter Ecolyo\",\"subscribed\":\"Vous êtes désormais à nouveau abonné à la newsletter Ecolyo\",\"content\":\"Vous ne recevrez plus la notification de votre bilan ainsi que les conseils associés au mois en cours.\",\"button_subscribe\":\"Me ré-abonner\",\"button_home\":\"Me connecter à Ecolyo\",\"button_accessibility\":\"Bouton de désinscription\"},\"welcome_modal\":{\"title\":\"Félicitations\",\"perso\":\"Votre espace personnel a bien été créé.\",\"connect\":\"Vous pouvez maintenant connecter vos compteurs d’énergie à Ecolyo en toute sécurité.\",\"button_valid\":\"Ok\",\"accessibility\":{\"title\":\"Fenêtre de félicitations\",\"button_valid\":\"Valider\"}}}"); /***/ }), diff --git a/public/index.html b/public/index.html index 2e1c3234698666f700f358f7828df9b15efbf05f..0404d9cc98d9a8a18d32b8846964571f2a4c0706 100644 --- a/public/index.html +++ b/public/index.html @@ -1 +1 @@ -<!DOCTYPE html><html lang="{{.Locale}}"><head><meta charset="utf-8"><title>Ecolyo | Désabonnement</title><link rel="icon" type="image/png" href="public/favicon-32x32.png" sizes="32x32"><link rel="icon" type="image/png" href="public/favicon-16x16.png" sizes="16x16"><!-- PWA Manifest --><link rel="mask-icon" href="public/safari-pinned-tab.svg" color="#297EF2"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,viewport-fit=cover"><!-- PWA iOS --><link rel="apple-touch-icon" sizes="180x180" href="public/apple-touch-icon.png"><link rel="apple-touch-startup-image" href="public/apple-touch-icon.png"><meta name="apple-mobile-web-app-title" content="Ecolyo"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><!-- PWA Colors --><meta name="theme-color" content="#343641"><meta name="background-color" content="#121212">{{.ThemeCSS}} {{.CozyBar}}<script src="//{{.Domain}}/assets/js/piwik.js"></script></head><body><div role="application" class="application" data-cozy="{{.CozyData}}"><script src="../public/ecolyo.c5bddfba2d042cc6519f.js"></script></div></body></html> \ No newline at end of file +<!DOCTYPE html><html lang="{{.Locale}}"><head><meta charset="utf-8"><title>Ecolyo | Désabonnement</title><link rel="icon" type="image/png" href="public/favicon-32x32.png" sizes="32x32"><link rel="icon" type="image/png" href="public/favicon-16x16.png" sizes="16x16"><!-- PWA Manifest --><link rel="mask-icon" href="public/safari-pinned-tab.svg" color="#297EF2"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,viewport-fit=cover"><!-- PWA iOS --><link rel="apple-touch-icon" sizes="180x180" href="public/apple-touch-icon.png"><link rel="apple-touch-startup-image" href="public/apple-touch-icon.png"><meta name="apple-mobile-web-app-title" content="Ecolyo"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><!-- PWA Colors --><meta name="theme-color" content="#343641"><meta name="background-color" content="#121212">{{.ThemeCSS}} {{.CozyBar}}<script src="//{{.Domain}}/assets/js/piwik.js"></script></head><body><div role="application" class="application" data-cozy="{{.CozyData}}"><script src="../public/ecolyo.5906ce9ba60639086e03.js"></script></div></body></html> \ No newline at end of file diff --git a/services/aggregatorUsageEvents/ecolyo.js b/services/aggregatorUsageEvents/ecolyo.js index 28c6f32726ba54f1b39a9078817f9e805f3ee8bd..4a96db728528932a2a676fd6634ec2e523333c92 100644 --- a/services/aggregatorUsageEvents/ecolyo.js +++ b/services/aggregatorUsageEvents/ecolyo.js @@ -264,7 +264,7 @@ const buildProfileWithFluidType = async (client, fluidType) => { } return formattedProfile; }; -const getConsumptionValue = async (client, fluidType) => { +const getConsumptionValue = async (client, fluidTypes) => { const consumptionService = new _consumption.default(client); const analysisDate = _luxon.DateTime.local().setZone('utc', { keepLocalTime: true @@ -287,7 +287,7 @@ const getConsumptionValue = async (client, fluidType) => { }).endOf('month') } }; - const fetchedPerformanceIndicators = await consumptionService.getPerformanceIndicators(periods.timePeriod, _enums.TimeStep.MONTH, fluidType, periods.comparisonTimePeriod); + const fetchedPerformanceIndicators = await consumptionService.getPerformanceIndicators(periods.timePeriod, _enums.TimeStep.MONTH, fluidTypes, periods.comparisonTimePeriod); return fetchedPerformanceIndicators; }; @@ -44254,15 +44254,14 @@ class ConsumptionDataManager { (0, _defineProperty2.default)(this, "_queryRunnerService", void 0); (0, _defineProperty2.default)(this, "_consumptionValidatorService", void 0); (0, _defineProperty2.default)(this, "fetchAvgTemperature", async (year, month) => { - const bronStationId = '69123002'; + const BronStationId = '69123002'; const avgTemperatureDate = `${year}-${(0, _utils.formatTwoDigits)(month)}`; try { - const result = await this._client.getStackClient().fetchJSON('GET', `${_orgEcolyo.REMOTE_ORG_ECOLYO_AVG_TEMPERATURE}?identifiant=${bronStationId}&month=${avgTemperatureDate}`); + const result = await this._client.getStackClient().fetchJSON('GET', `${_orgEcolyo.REMOTE_ORG_ECOLYO_AVG_TEMPERATURE}?identifiant=${BronStationId}&month=${avgTemperatureDate}`); if (result && result.nb_results !== 0) { return result.values[0].average_measurement; - } else { - throw new Error(`No average temperature found for ${avgTemperatureDate}`); } + throw new Error(`No average temperature found for ${avgTemperatureDate}`); } catch (error) { const errorMessage = `fetchAvgTemperature error : ${error}`; logStack('error', errorMessage); @@ -44278,9 +44277,17 @@ class ConsumptionDataManager { } /** Get graph data according on timeStep and fluidType */ - async getGraphData(timePeriod, timeStep, fluidTypes, fluidStatus, compareTimePeriod, isHome, isExport) { - const InputIsValid = this._consumptionValidatorService.ValidateGetGraphData(timePeriod, timeStep, fluidTypes, compareTimePeriod, isExport); - if (!InputIsValid) return null; + async getGraphData({ + timePeriod, + timeStep, + fluidTypes, + fluidStatus, + compareTimePeriod, + isHome, + isExport + }) { + const isInputValid = this._consumptionValidatorService.ValidateGetGraphData(timePeriod, timeStep, fluidTypes, compareTimePeriod, isExport); + if (!isInputValid) return null; if (fluidTypes.length === 1 && !isHome) { const fluidType = fluidTypes[0]; const fetchedData = await this.fetchSingleFluidGraphData(timePeriod, timeStep, fluidType, compareTimePeriod); @@ -44290,7 +44297,6 @@ class ConsumptionDataManager { const toBeAggregatedData = []; for (const fluidType of fluidTypes) { const fetchedData = await this.fetchSingleFluidGraphData(timePeriod, timeStep, fluidType, compareTimePeriod); - // formatting data const formattedData = this.formatGraphDataManager(fetchedData, timeStep, timePeriod, compareTimePeriod || null, fluidType, fluidStatus ? fluidStatus[fluidType] : undefined); // validating output data toBeAggregatedData.push({ @@ -44300,14 +44306,26 @@ class ConsumptionDataManager { } const aggregatedData = this.aggregateGraphData(toBeAggregatedData); return aggregatedData; - } else return null; + } + return null; } - async getMaxLoad(maxTimePeriod, timeStep, fluidTypes, compareMaxTimePeriod, isHome, withDate) { - let allData; + async getMaxLoad({ + maxTimePeriod, + timeStep, + fluidTypes, + compareMaxTimePeriod, + isHome, + withDate + }) { if (isHome) { - var _allData; - allData = await this.getGraphData(maxTimePeriod, timeStep, fluidTypes, undefined, compareMaxTimePeriod, isHome); - return (_allData = allData) !== null && _allData !== void 0 && _allData.actualData ? Math.max(...allData.actualData.map(d => d.value)) : 0; + const allData = await this.getGraphData({ + timePeriod: maxTimePeriod, + timeStep, + fluidTypes, + compareTimePeriod: compareMaxTimePeriod, + isHome + }); + return allData !== null && allData !== void 0 && allData.actualData ? Math.max(...allData.actualData.map(d => d.value)) : 0; } else { const max = await this._queryRunnerService.fetchFluidMaxData(maxTimePeriod, timeStep, fluidTypes[0], withDate); return max; @@ -44315,20 +44333,25 @@ class ConsumptionDataManager { } /** get last dataload available for a given fluid - return the daily data */ - async getLastDataload(fluidTypes) { + async getLastDataload(fluidType) { const timePeriod = { startDate: _luxon.DateTime.now().plus({ days: -3 }).startOf('day'), endDate: _luxon.DateTime.now() }; - const data = await this._queryRunnerService.fetchFluidData(timePeriod, _enums.TimeStep.DAY, fluidTypes); + const data = await this._queryRunnerService.fetchFluidData(timePeriod, _enums.TimeStep.DAY, fluidType); return data; } async getPerformanceIndicators(timePeriod, timeStep, fluidTypes, compareTimePeriod) { const performanceIndicators = []; for (const fluidType of fluidTypes) { - const graphData = await this.getGraphData(timePeriod, timeStep, [fluidType], undefined, compareTimePeriod); + const graphData = await this.getGraphData({ + timePeriod, + timeStep, + fluidTypes: [fluidType], + compareTimePeriod + }); if (graphData) { const performanceIndicator = { value: null, @@ -44569,7 +44592,7 @@ class ConsumptionDataManager { /** * Get the first entry of a given data doctype (enedis, grdf, egl) */ - async getFirsDataDateFromDoctype(doctype) { + async getFirstDataDateFromDoctype(doctype) { const query = (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month']).sortBy([{ year: 'asc' }, { @@ -98197,7 +98220,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.SUMMER_WEEK_DATES = void 0; exports.compareDates = compareDates; -exports.getActualAnalysisDate = exports.convertDateToShortDateString = exports.convertDateToMonthYearString = void 0; +exports.getActualAnalysisDate = exports.formatDate = exports.convertDateToShortDateString = exports.convertDateToMonthYearString = void 0; exports.getCurrentSeason = getCurrentSeason; exports.getLagDays = void 0; exports.getOppositeSeason = getOppositeSeason; @@ -98371,6 +98394,54 @@ function getOppositeSeason(currentSeason) { } } +/** + * Returns an array of the formatted date. It returns an array for display purposes. + */ +const formatDate = (timeStep, date) => { + switch (timeStep) { + case _enums.TimeStep.YEAR: + return [date.toLocaleString({ + year: 'numeric' + }), '']; + case _enums.TimeStep.MONTH: + return [date.toLocaleString({ + month: 'long' + }), date.toLocaleString({ + year: 'numeric' + })]; + case _enums.TimeStep.DAY: + case _enums.TimeStep.WEEK: + return [date.toLocaleString({ + weekday: 'long', + day: '2-digit' + }), date.toLocaleString({ + month: 'long' + })]; + case _enums.TimeStep.HALF_AN_HOUR: + /** + * Format date to range: + * 9:00 - 9:30 + * Day 0X Month + */ + return [`${date.toLocaleString({ + hour: 'numeric', + minute: 'numeric' + })} - ${date.plus({ + minutes: 30 + }).toLocaleString({ + hour: 'numeric', + minute: 'numeric' + })}`, date.toLocaleString({ + weekday: 'long', + day: '2-digit', + month: 'long' + })]; + default: + return [date.toLocaleString(_luxon.DateTime.DATETIME_SHORT), '']; + } +}; +exports.formatDate = formatDate; + /***/ }), /* 762 */ /***/ (function(module, exports, __webpack_require__) { @@ -98386,7 +98457,7 @@ exports.formatListWithAnd = exports.allFluids = void 0; exports.formatNumberValues = formatNumberValues; exports.getChallengeTitleWithLineReturn = exports.formatTwoDigits = exports.formatOffPeakHours = void 0; exports.getFluidName = getFluidName; -exports.getFluidTypeTranslation = void 0; +exports.getFluidUnit = exports.getFluidTypeTranslation = void 0; exports.getKonnectorSlug = getKonnectorSlug; exports.getKonnectorUpdateError = getKonnectorUpdateError; exports.getPartnerKey = exports.getMonthNameWithPrep = exports.getMonthName = exports.getMonthFullName = void 0; @@ -98777,6 +98848,20 @@ const roundOffPeakHours = offPeakHours => { })); }; exports.roundOffPeakHours = roundOffPeakHours; +const getFluidUnit = fluidType => { + switch (fluidType) { + case _enums.FluidType.ELECTRICITY: + case _enums.FluidType.GAS: + return 'kWh'; + case _enums.FluidType.WATER: + return 'L'; + case _enums.FluidType.MULTIFLUID: + return '€'; + default: + throw new Error('unknown fluidtype'); + } +}; +exports.getFluidUnit = getFluidUnit; /***/ }), /* 763 */ @@ -100109,7 +100194,7 @@ class ConverterService { if (fluidType === _enums.FluidType.MULTIFLUID) { convertedLoad = load; } else { - convertedLoad = this.applyPrice(this._fluidConfig[fluidType], load, price); + convertedLoad = this.computePrice(this._fluidConfig[fluidType], load, price); } // Prevent round 0 case when the actual value is not 0 @@ -100120,17 +100205,15 @@ class ConverterService { } /** - * Return calculated price + * Compute calculated price + * If a price is provided, return the price * @param {FluidConfig} fluidConfig - Fluid configuration * @param {number} load - Load value * @param {number} [price] - Price if exist */ - applyPrice(fluidConfig, load, price) { - if (price) { - return price; - } else { - return load * fluidConfig.coefficient; - } + computePrice(fluidConfig, load, price) { + if (price) return price; + return load * fluidConfig.coefficient; } } exports.default = ConverterService; diff --git a/services/consumptionAlert/ecolyo.js b/services/consumptionAlert/ecolyo.js index 948c6e20c8860f7b0aa5d510722ccab424531d7d..5a979b30c87c6e28bd7d4ab3bd7ff10af7f447a6 100644 --- a/services/consumptionAlert/ecolyo.js +++ b/services/consumptionAlert/ecolyo.js @@ -43851,15 +43851,14 @@ class ConsumptionDataManager { (0, _defineProperty2.default)(this, "_queryRunnerService", void 0); (0, _defineProperty2.default)(this, "_consumptionValidatorService", void 0); (0, _defineProperty2.default)(this, "fetchAvgTemperature", async (year, month) => { - const bronStationId = '69123002'; + const BronStationId = '69123002'; const avgTemperatureDate = `${year}-${(0, _utils.formatTwoDigits)(month)}`; try { - const result = await this._client.getStackClient().fetchJSON('GET', `${_orgEcolyo.REMOTE_ORG_ECOLYO_AVG_TEMPERATURE}?identifiant=${bronStationId}&month=${avgTemperatureDate}`); + const result = await this._client.getStackClient().fetchJSON('GET', `${_orgEcolyo.REMOTE_ORG_ECOLYO_AVG_TEMPERATURE}?identifiant=${BronStationId}&month=${avgTemperatureDate}`); if (result && result.nb_results !== 0) { return result.values[0].average_measurement; - } else { - throw new Error(`No average temperature found for ${avgTemperatureDate}`); } + throw new Error(`No average temperature found for ${avgTemperatureDate}`); } catch (error) { const errorMessage = `fetchAvgTemperature error : ${error}`; logStack('error', errorMessage); @@ -43875,9 +43874,17 @@ class ConsumptionDataManager { } /** Get graph data according on timeStep and fluidType */ - async getGraphData(timePeriod, timeStep, fluidTypes, fluidStatus, compareTimePeriod, isHome, isExport) { - const InputIsValid = this._consumptionValidatorService.ValidateGetGraphData(timePeriod, timeStep, fluidTypes, compareTimePeriod, isExport); - if (!InputIsValid) return null; + async getGraphData({ + timePeriod, + timeStep, + fluidTypes, + fluidStatus, + compareTimePeriod, + isHome, + isExport + }) { + const isInputValid = this._consumptionValidatorService.ValidateGetGraphData(timePeriod, timeStep, fluidTypes, compareTimePeriod, isExport); + if (!isInputValid) return null; if (fluidTypes.length === 1 && !isHome) { const fluidType = fluidTypes[0]; const fetchedData = await this.fetchSingleFluidGraphData(timePeriod, timeStep, fluidType, compareTimePeriod); @@ -43887,7 +43894,6 @@ class ConsumptionDataManager { const toBeAggregatedData = []; for (const fluidType of fluidTypes) { const fetchedData = await this.fetchSingleFluidGraphData(timePeriod, timeStep, fluidType, compareTimePeriod); - // formatting data const formattedData = this.formatGraphDataManager(fetchedData, timeStep, timePeriod, compareTimePeriod || null, fluidType, fluidStatus ? fluidStatus[fluidType] : undefined); // validating output data toBeAggregatedData.push({ @@ -43897,14 +43903,26 @@ class ConsumptionDataManager { } const aggregatedData = this.aggregateGraphData(toBeAggregatedData); return aggregatedData; - } else return null; + } + return null; } - async getMaxLoad(maxTimePeriod, timeStep, fluidTypes, compareMaxTimePeriod, isHome, withDate) { - let allData; + async getMaxLoad({ + maxTimePeriod, + timeStep, + fluidTypes, + compareMaxTimePeriod, + isHome, + withDate + }) { if (isHome) { - var _allData; - allData = await this.getGraphData(maxTimePeriod, timeStep, fluidTypes, undefined, compareMaxTimePeriod, isHome); - return (_allData = allData) !== null && _allData !== void 0 && _allData.actualData ? Math.max(...allData.actualData.map(d => d.value)) : 0; + const allData = await this.getGraphData({ + timePeriod: maxTimePeriod, + timeStep, + fluidTypes, + compareTimePeriod: compareMaxTimePeriod, + isHome + }); + return allData !== null && allData !== void 0 && allData.actualData ? Math.max(...allData.actualData.map(d => d.value)) : 0; } else { const max = await this._queryRunnerService.fetchFluidMaxData(maxTimePeriod, timeStep, fluidTypes[0], withDate); return max; @@ -43912,20 +43930,25 @@ class ConsumptionDataManager { } /** get last dataload available for a given fluid - return the daily data */ - async getLastDataload(fluidTypes) { + async getLastDataload(fluidType) { const timePeriod = { startDate: _luxon.DateTime.now().plus({ days: -3 }).startOf('day'), endDate: _luxon.DateTime.now() }; - const data = await this._queryRunnerService.fetchFluidData(timePeriod, _enums.TimeStep.DAY, fluidTypes); + const data = await this._queryRunnerService.fetchFluidData(timePeriod, _enums.TimeStep.DAY, fluidType); return data; } async getPerformanceIndicators(timePeriod, timeStep, fluidTypes, compareTimePeriod) { const performanceIndicators = []; for (const fluidType of fluidTypes) { - const graphData = await this.getGraphData(timePeriod, timeStep, [fluidType], undefined, compareTimePeriod); + const graphData = await this.getGraphData({ + timePeriod, + timeStep, + fluidTypes: [fluidType], + compareTimePeriod + }); if (graphData) { const performanceIndicator = { value: null, @@ -44166,7 +44189,7 @@ class ConsumptionDataManager { /** * Get the first entry of a given data doctype (enedis, grdf, egl) */ - async getFirsDataDateFromDoctype(doctype) { + async getFirstDataDateFromDoctype(doctype) { const query = (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month']).sortBy([{ year: 'asc' }, { @@ -97794,7 +97817,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.SUMMER_WEEK_DATES = void 0; exports.compareDates = compareDates; -exports.getActualAnalysisDate = exports.convertDateToShortDateString = exports.convertDateToMonthYearString = void 0; +exports.getActualAnalysisDate = exports.formatDate = exports.convertDateToShortDateString = exports.convertDateToMonthYearString = void 0; exports.getCurrentSeason = getCurrentSeason; exports.getLagDays = void 0; exports.getOppositeSeason = getOppositeSeason; @@ -97968,6 +97991,54 @@ function getOppositeSeason(currentSeason) { } } +/** + * Returns an array of the formatted date. It returns an array for display purposes. + */ +const formatDate = (timeStep, date) => { + switch (timeStep) { + case _enums.TimeStep.YEAR: + return [date.toLocaleString({ + year: 'numeric' + }), '']; + case _enums.TimeStep.MONTH: + return [date.toLocaleString({ + month: 'long' + }), date.toLocaleString({ + year: 'numeric' + })]; + case _enums.TimeStep.DAY: + case _enums.TimeStep.WEEK: + return [date.toLocaleString({ + weekday: 'long', + day: '2-digit' + }), date.toLocaleString({ + month: 'long' + })]; + case _enums.TimeStep.HALF_AN_HOUR: + /** + * Format date to range: + * 9:00 - 9:30 + * Day 0X Month + */ + return [`${date.toLocaleString({ + hour: 'numeric', + minute: 'numeric' + })} - ${date.plus({ + minutes: 30 + }).toLocaleString({ + hour: 'numeric', + minute: 'numeric' + })}`, date.toLocaleString({ + weekday: 'long', + day: '2-digit', + month: 'long' + })]; + default: + return [date.toLocaleString(_luxon.DateTime.DATETIME_SHORT), '']; + } +}; +exports.formatDate = formatDate; + /***/ }), /* 762 */ /***/ (function(module, exports, __webpack_require__) { @@ -97983,7 +98054,7 @@ exports.formatListWithAnd = exports.allFluids = void 0; exports.formatNumberValues = formatNumberValues; exports.getChallengeTitleWithLineReturn = exports.formatTwoDigits = exports.formatOffPeakHours = void 0; exports.getFluidName = getFluidName; -exports.getFluidTypeTranslation = void 0; +exports.getFluidUnit = exports.getFluidTypeTranslation = void 0; exports.getKonnectorSlug = getKonnectorSlug; exports.getKonnectorUpdateError = getKonnectorUpdateError; exports.getPartnerKey = exports.getMonthNameWithPrep = exports.getMonthName = exports.getMonthFullName = void 0; @@ -98374,6 +98445,20 @@ const roundOffPeakHours = offPeakHours => { })); }; exports.roundOffPeakHours = roundOffPeakHours; +const getFluidUnit = fluidType => { + switch (fluidType) { + case _enums.FluidType.ELECTRICITY: + case _enums.FluidType.GAS: + return 'kWh'; + case _enums.FluidType.WATER: + return 'L'; + case _enums.FluidType.MULTIFLUID: + return '€'; + default: + throw new Error('unknown fluidtype'); + } +}; +exports.getFluidUnit = getFluidUnit; /***/ }), /* 763 */ @@ -99706,7 +99791,7 @@ class ConverterService { if (fluidType === _enums.FluidType.MULTIFLUID) { convertedLoad = load; } else { - convertedLoad = this.applyPrice(this._fluidConfig[fluidType], load, price); + convertedLoad = this.computePrice(this._fluidConfig[fluidType], load, price); } // Prevent round 0 case when the actual value is not 0 @@ -99717,17 +99802,15 @@ class ConverterService { } /** - * Return calculated price + * Compute calculated price + * If a price is provided, return the price * @param {FluidConfig} fluidConfig - Fluid configuration * @param {number} load - Load value * @param {number} [price] - Price if exist */ - applyPrice(fluidConfig, load, price) { - if (price) { - return price; - } else { - return load * fluidConfig.coefficient; - } + computePrice(fluidConfig, load, price) { + if (price) return price; + return load * fluidConfig.coefficient; } } exports.default = ConverterService; diff --git a/services/enedisHalfHourMonthlyAnalysis/ecolyo.js b/services/enedisHalfHourMonthlyAnalysis/ecolyo.js index 9d00bc44314ca33f0b128aa6f413b5a236b255a1..f585b65ff2991a508b82df75b281d44299fe0ec7 100644 --- a/services/enedisHalfHourMonthlyAnalysis/ecolyo.js +++ b/services/enedisHalfHourMonthlyAnalysis/ecolyo.js @@ -43851,15 +43851,14 @@ class ConsumptionDataManager { (0, _defineProperty2.default)(this, "_queryRunnerService", void 0); (0, _defineProperty2.default)(this, "_consumptionValidatorService", void 0); (0, _defineProperty2.default)(this, "fetchAvgTemperature", async (year, month) => { - const bronStationId = '69123002'; + const BronStationId = '69123002'; const avgTemperatureDate = `${year}-${(0, _utils.formatTwoDigits)(month)}`; try { - const result = await this._client.getStackClient().fetchJSON('GET', `${_orgEcolyo.REMOTE_ORG_ECOLYO_AVG_TEMPERATURE}?identifiant=${bronStationId}&month=${avgTemperatureDate}`); + const result = await this._client.getStackClient().fetchJSON('GET', `${_orgEcolyo.REMOTE_ORG_ECOLYO_AVG_TEMPERATURE}?identifiant=${BronStationId}&month=${avgTemperatureDate}`); if (result && result.nb_results !== 0) { return result.values[0].average_measurement; - } else { - throw new Error(`No average temperature found for ${avgTemperatureDate}`); } + throw new Error(`No average temperature found for ${avgTemperatureDate}`); } catch (error) { const errorMessage = `fetchAvgTemperature error : ${error}`; logStack('error', errorMessage); @@ -43875,9 +43874,17 @@ class ConsumptionDataManager { } /** Get graph data according on timeStep and fluidType */ - async getGraphData(timePeriod, timeStep, fluidTypes, fluidStatus, compareTimePeriod, isHome, isExport) { - const InputIsValid = this._consumptionValidatorService.ValidateGetGraphData(timePeriod, timeStep, fluidTypes, compareTimePeriod, isExport); - if (!InputIsValid) return null; + async getGraphData({ + timePeriod, + timeStep, + fluidTypes, + fluidStatus, + compareTimePeriod, + isHome, + isExport + }) { + const isInputValid = this._consumptionValidatorService.ValidateGetGraphData(timePeriod, timeStep, fluidTypes, compareTimePeriod, isExport); + if (!isInputValid) return null; if (fluidTypes.length === 1 && !isHome) { const fluidType = fluidTypes[0]; const fetchedData = await this.fetchSingleFluidGraphData(timePeriod, timeStep, fluidType, compareTimePeriod); @@ -43887,7 +43894,6 @@ class ConsumptionDataManager { const toBeAggregatedData = []; for (const fluidType of fluidTypes) { const fetchedData = await this.fetchSingleFluidGraphData(timePeriod, timeStep, fluidType, compareTimePeriod); - // formatting data const formattedData = this.formatGraphDataManager(fetchedData, timeStep, timePeriod, compareTimePeriod || null, fluidType, fluidStatus ? fluidStatus[fluidType] : undefined); // validating output data toBeAggregatedData.push({ @@ -43897,14 +43903,26 @@ class ConsumptionDataManager { } const aggregatedData = this.aggregateGraphData(toBeAggregatedData); return aggregatedData; - } else return null; + } + return null; } - async getMaxLoad(maxTimePeriod, timeStep, fluidTypes, compareMaxTimePeriod, isHome, withDate) { - let allData; + async getMaxLoad({ + maxTimePeriod, + timeStep, + fluidTypes, + compareMaxTimePeriod, + isHome, + withDate + }) { if (isHome) { - var _allData; - allData = await this.getGraphData(maxTimePeriod, timeStep, fluidTypes, undefined, compareMaxTimePeriod, isHome); - return (_allData = allData) !== null && _allData !== void 0 && _allData.actualData ? Math.max(...allData.actualData.map(d => d.value)) : 0; + const allData = await this.getGraphData({ + timePeriod: maxTimePeriod, + timeStep, + fluidTypes, + compareTimePeriod: compareMaxTimePeriod, + isHome + }); + return allData !== null && allData !== void 0 && allData.actualData ? Math.max(...allData.actualData.map(d => d.value)) : 0; } else { const max = await this._queryRunnerService.fetchFluidMaxData(maxTimePeriod, timeStep, fluidTypes[0], withDate); return max; @@ -43912,20 +43930,25 @@ class ConsumptionDataManager { } /** get last dataload available for a given fluid - return the daily data */ - async getLastDataload(fluidTypes) { + async getLastDataload(fluidType) { const timePeriod = { startDate: _luxon.DateTime.now().plus({ days: -3 }).startOf('day'), endDate: _luxon.DateTime.now() }; - const data = await this._queryRunnerService.fetchFluidData(timePeriod, _enums.TimeStep.DAY, fluidTypes); + const data = await this._queryRunnerService.fetchFluidData(timePeriod, _enums.TimeStep.DAY, fluidType); return data; } async getPerformanceIndicators(timePeriod, timeStep, fluidTypes, compareTimePeriod) { const performanceIndicators = []; for (const fluidType of fluidTypes) { - const graphData = await this.getGraphData(timePeriod, timeStep, [fluidType], undefined, compareTimePeriod); + const graphData = await this.getGraphData({ + timePeriod, + timeStep, + fluidTypes: [fluidType], + compareTimePeriod + }); if (graphData) { const performanceIndicator = { value: null, @@ -44166,7 +44189,7 @@ class ConsumptionDataManager { /** * Get the first entry of a given data doctype (enedis, grdf, egl) */ - async getFirsDataDateFromDoctype(doctype) { + async getFirstDataDateFromDoctype(doctype) { const query = (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month']).sortBy([{ year: 'asc' }, { @@ -97794,7 +97817,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.SUMMER_WEEK_DATES = void 0; exports.compareDates = compareDates; -exports.getActualAnalysisDate = exports.convertDateToShortDateString = exports.convertDateToMonthYearString = void 0; +exports.getActualAnalysisDate = exports.formatDate = exports.convertDateToShortDateString = exports.convertDateToMonthYearString = void 0; exports.getCurrentSeason = getCurrentSeason; exports.getLagDays = void 0; exports.getOppositeSeason = getOppositeSeason; @@ -97968,6 +97991,54 @@ function getOppositeSeason(currentSeason) { } } +/** + * Returns an array of the formatted date. It returns an array for display purposes. + */ +const formatDate = (timeStep, date) => { + switch (timeStep) { + case _enums.TimeStep.YEAR: + return [date.toLocaleString({ + year: 'numeric' + }), '']; + case _enums.TimeStep.MONTH: + return [date.toLocaleString({ + month: 'long' + }), date.toLocaleString({ + year: 'numeric' + })]; + case _enums.TimeStep.DAY: + case _enums.TimeStep.WEEK: + return [date.toLocaleString({ + weekday: 'long', + day: '2-digit' + }), date.toLocaleString({ + month: 'long' + })]; + case _enums.TimeStep.HALF_AN_HOUR: + /** + * Format date to range: + * 9:00 - 9:30 + * Day 0X Month + */ + return [`${date.toLocaleString({ + hour: 'numeric', + minute: 'numeric' + })} - ${date.plus({ + minutes: 30 + }).toLocaleString({ + hour: 'numeric', + minute: 'numeric' + })}`, date.toLocaleString({ + weekday: 'long', + day: '2-digit', + month: 'long' + })]; + default: + return [date.toLocaleString(_luxon.DateTime.DATETIME_SHORT), '']; + } +}; +exports.formatDate = formatDate; + /***/ }), /* 762 */ /***/ (function(module, exports, __webpack_require__) { @@ -97983,7 +98054,7 @@ exports.formatListWithAnd = exports.allFluids = void 0; exports.formatNumberValues = formatNumberValues; exports.getChallengeTitleWithLineReturn = exports.formatTwoDigits = exports.formatOffPeakHours = void 0; exports.getFluidName = getFluidName; -exports.getFluidTypeTranslation = void 0; +exports.getFluidUnit = exports.getFluidTypeTranslation = void 0; exports.getKonnectorSlug = getKonnectorSlug; exports.getKonnectorUpdateError = getKonnectorUpdateError; exports.getPartnerKey = exports.getMonthNameWithPrep = exports.getMonthName = exports.getMonthFullName = void 0; @@ -98374,6 +98445,20 @@ const roundOffPeakHours = offPeakHours => { })); }; exports.roundOffPeakHours = roundOffPeakHours; +const getFluidUnit = fluidType => { + switch (fluidType) { + case _enums.FluidType.ELECTRICITY: + case _enums.FluidType.GAS: + return 'kWh'; + case _enums.FluidType.WATER: + return 'L'; + case _enums.FluidType.MULTIFLUID: + return '€'; + default: + throw new Error('unknown fluidtype'); + } +}; +exports.getFluidUnit = getFluidUnit; /***/ }), /* 763 */ @@ -99706,7 +99791,7 @@ class ConverterService { if (fluidType === _enums.FluidType.MULTIFLUID) { convertedLoad = load; } else { - convertedLoad = this.applyPrice(this._fluidConfig[fluidType], load, price); + convertedLoad = this.computePrice(this._fluidConfig[fluidType], load, price); } // Prevent round 0 case when the actual value is not 0 @@ -99717,17 +99802,15 @@ class ConverterService { } /** - * Return calculated price + * Compute calculated price + * If a price is provided, return the price * @param {FluidConfig} fluidConfig - Fluid configuration * @param {number} load - Load value * @param {number} [price] - Price if exist */ - applyPrice(fluidConfig, load, price) { - if (price) { - return price; - } else { - return load * fluidConfig.coefficient; - } + computePrice(fluidConfig, load, price) { + if (price) return price; + return load * fluidConfig.coefficient; } } exports.default = ConverterService; @@ -117033,7 +117116,11 @@ const getEnedisMonthAnalysisData = async (client, month, year) => { }).endOf('month') }; const cs = new _consumption.default(client); - const data = await cs.getGraphData(timePeriod, _enums.TimeStep.DAY, [_enums.FluidType.ELECTRICITY]); + const data = await cs.getGraphData({ + timePeriod, + timeStep: _enums.TimeStep.DAY, + fluidTypes: [_enums.FluidType.ELECTRICITY] + }); const monthlyAveragesLoads = { weekDaysHalfHourAverageValues: [], weekEndDaysHalfHourAverageValues: [], @@ -117054,7 +117141,11 @@ const getEnedisMonthAnalysisData = async (client, month, year) => { }; // for each day, we get its halfHour DataChart // so we get 48 entries per day - const halfHourDayData = await cs.getGraphData(timePeriod, _enums.TimeStep.HALF_AN_HOUR, [_enums.FluidType.ELECTRICITY]); + const halfHourDayData = await cs.getGraphData({ + timePeriod, + timeStep: _enums.TimeStep.HALF_AN_HOUR, + fluidTypes: [_enums.FluidType.ELECTRICITY] + }); if (halfHourDayData) { populateArrayWithTotalData(weekEndValuesArray, halfHourDayData, true); populateArrayWithTotalData(weekValuesArray, halfHourDayData, false); @@ -117088,7 +117179,7 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({ }) => { const enedisMonthlyAnalysisDataService = new _enedisMonthlyAnalysisData.default(client); const consumptionService = new _consumption.default(client); - const firstMinuteData = await consumptionService.getFirsDataDateFromDoctype(_doctypes.ENEDIS_MINUTE_DOCTYPE); + const firstMinuteData = await consumptionService.getFirstDataDateFromDoctype(_doctypes.ENEDIS_MINUTE_DOCTYPE); const lastEnedisMonthlyAnalysis = await enedisMonthlyAnalysisDataService.getLastEnedisMonthlyAnalysis(); // SERVICE RUNS ONLY IF ENEDIS MINUTE IS ACTIVATED if (!(firstMinuteData !== null && firstMinuteData !== void 0 && firstMinuteData[0])) { @@ -117123,7 +117214,7 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({ if (lastEnedisMonthlyAnalysis.length > 0) { var _firstEnedisMonthlyAn, _firstEnedisMonthlyAn2; // If user has more than one entry (already synced), fetch the full history - const firstEnedisMonthlyAnalysis = await consumptionService.getFirsDataDateFromDoctype(_doctypes.ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE); + const firstEnedisMonthlyAnalysis = await consumptionService.getFirstDataDateFromDoctype(_doctypes.ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE); if (((_firstEnedisMonthlyAn = firstEnedisMonthlyAnalysis[0]) === null || _firstEnedisMonthlyAn === void 0 ? void 0 : _firstEnedisMonthlyAn.month) === firstMinuteData[0].month && ((_firstEnedisMonthlyAn2 = firstEnedisMonthlyAnalysis[0]) === null || _firstEnedisMonthlyAn2 === void 0 ? void 0 : _firstEnedisMonthlyAn2.year) === firstMinuteData[0].year) { logStack('info', 'Every Enedis Analysis already synchronized'); return; diff --git a/services/fluidsPrices/ecolyo.js b/services/fluidsPrices/ecolyo.js index 192d76501bebaef86e0eb8811e21084e15319788..1c432b79c975f4afe07a4ce86eec427a5abcb402 100644 --- a/services/fluidsPrices/ecolyo.js +++ b/services/fluidsPrices/ecolyo.js @@ -43851,15 +43851,14 @@ class ConsumptionDataManager { (0, _defineProperty2.default)(this, "_queryRunnerService", void 0); (0, _defineProperty2.default)(this, "_consumptionValidatorService", void 0); (0, _defineProperty2.default)(this, "fetchAvgTemperature", async (year, month) => { - const bronStationId = '69123002'; + const BronStationId = '69123002'; const avgTemperatureDate = `${year}-${(0, _utils.formatTwoDigits)(month)}`; try { - const result = await this._client.getStackClient().fetchJSON('GET', `${_orgEcolyo.REMOTE_ORG_ECOLYO_AVG_TEMPERATURE}?identifiant=${bronStationId}&month=${avgTemperatureDate}`); + const result = await this._client.getStackClient().fetchJSON('GET', `${_orgEcolyo.REMOTE_ORG_ECOLYO_AVG_TEMPERATURE}?identifiant=${BronStationId}&month=${avgTemperatureDate}`); if (result && result.nb_results !== 0) { return result.values[0].average_measurement; - } else { - throw new Error(`No average temperature found for ${avgTemperatureDate}`); } + throw new Error(`No average temperature found for ${avgTemperatureDate}`); } catch (error) { const errorMessage = `fetchAvgTemperature error : ${error}`; logStack('error', errorMessage); @@ -43875,9 +43874,17 @@ class ConsumptionDataManager { } /** Get graph data according on timeStep and fluidType */ - async getGraphData(timePeriod, timeStep, fluidTypes, fluidStatus, compareTimePeriod, isHome, isExport) { - const InputIsValid = this._consumptionValidatorService.ValidateGetGraphData(timePeriod, timeStep, fluidTypes, compareTimePeriod, isExport); - if (!InputIsValid) return null; + async getGraphData({ + timePeriod, + timeStep, + fluidTypes, + fluidStatus, + compareTimePeriod, + isHome, + isExport + }) { + const isInputValid = this._consumptionValidatorService.ValidateGetGraphData(timePeriod, timeStep, fluidTypes, compareTimePeriod, isExport); + if (!isInputValid) return null; if (fluidTypes.length === 1 && !isHome) { const fluidType = fluidTypes[0]; const fetchedData = await this.fetchSingleFluidGraphData(timePeriod, timeStep, fluidType, compareTimePeriod); @@ -43887,7 +43894,6 @@ class ConsumptionDataManager { const toBeAggregatedData = []; for (const fluidType of fluidTypes) { const fetchedData = await this.fetchSingleFluidGraphData(timePeriod, timeStep, fluidType, compareTimePeriod); - // formatting data const formattedData = this.formatGraphDataManager(fetchedData, timeStep, timePeriod, compareTimePeriod || null, fluidType, fluidStatus ? fluidStatus[fluidType] : undefined); // validating output data toBeAggregatedData.push({ @@ -43897,14 +43903,26 @@ class ConsumptionDataManager { } const aggregatedData = this.aggregateGraphData(toBeAggregatedData); return aggregatedData; - } else return null; + } + return null; } - async getMaxLoad(maxTimePeriod, timeStep, fluidTypes, compareMaxTimePeriod, isHome, withDate) { - let allData; + async getMaxLoad({ + maxTimePeriod, + timeStep, + fluidTypes, + compareMaxTimePeriod, + isHome, + withDate + }) { if (isHome) { - var _allData; - allData = await this.getGraphData(maxTimePeriod, timeStep, fluidTypes, undefined, compareMaxTimePeriod, isHome); - return (_allData = allData) !== null && _allData !== void 0 && _allData.actualData ? Math.max(...allData.actualData.map(d => d.value)) : 0; + const allData = await this.getGraphData({ + timePeriod: maxTimePeriod, + timeStep, + fluidTypes, + compareTimePeriod: compareMaxTimePeriod, + isHome + }); + return allData !== null && allData !== void 0 && allData.actualData ? Math.max(...allData.actualData.map(d => d.value)) : 0; } else { const max = await this._queryRunnerService.fetchFluidMaxData(maxTimePeriod, timeStep, fluidTypes[0], withDate); return max; @@ -43912,20 +43930,25 @@ class ConsumptionDataManager { } /** get last dataload available for a given fluid - return the daily data */ - async getLastDataload(fluidTypes) { + async getLastDataload(fluidType) { const timePeriod = { startDate: _luxon.DateTime.now().plus({ days: -3 }).startOf('day'), endDate: _luxon.DateTime.now() }; - const data = await this._queryRunnerService.fetchFluidData(timePeriod, _enums.TimeStep.DAY, fluidTypes); + const data = await this._queryRunnerService.fetchFluidData(timePeriod, _enums.TimeStep.DAY, fluidType); return data; } async getPerformanceIndicators(timePeriod, timeStep, fluidTypes, compareTimePeriod) { const performanceIndicators = []; for (const fluidType of fluidTypes) { - const graphData = await this.getGraphData(timePeriod, timeStep, [fluidType], undefined, compareTimePeriod); + const graphData = await this.getGraphData({ + timePeriod, + timeStep, + fluidTypes: [fluidType], + compareTimePeriod + }); if (graphData) { const performanceIndicator = { value: null, @@ -44166,7 +44189,7 @@ class ConsumptionDataManager { /** * Get the first entry of a given data doctype (enedis, grdf, egl) */ - async getFirsDataDateFromDoctype(doctype) { + async getFirstDataDateFromDoctype(doctype) { const query = (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month']).sortBy([{ year: 'asc' }, { @@ -97794,7 +97817,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.SUMMER_WEEK_DATES = void 0; exports.compareDates = compareDates; -exports.getActualAnalysisDate = exports.convertDateToShortDateString = exports.convertDateToMonthYearString = void 0; +exports.getActualAnalysisDate = exports.formatDate = exports.convertDateToShortDateString = exports.convertDateToMonthYearString = void 0; exports.getCurrentSeason = getCurrentSeason; exports.getLagDays = void 0; exports.getOppositeSeason = getOppositeSeason; @@ -97968,6 +97991,54 @@ function getOppositeSeason(currentSeason) { } } +/** + * Returns an array of the formatted date. It returns an array for display purposes. + */ +const formatDate = (timeStep, date) => { + switch (timeStep) { + case _enums.TimeStep.YEAR: + return [date.toLocaleString({ + year: 'numeric' + }), '']; + case _enums.TimeStep.MONTH: + return [date.toLocaleString({ + month: 'long' + }), date.toLocaleString({ + year: 'numeric' + })]; + case _enums.TimeStep.DAY: + case _enums.TimeStep.WEEK: + return [date.toLocaleString({ + weekday: 'long', + day: '2-digit' + }), date.toLocaleString({ + month: 'long' + })]; + case _enums.TimeStep.HALF_AN_HOUR: + /** + * Format date to range: + * 9:00 - 9:30 + * Day 0X Month + */ + return [`${date.toLocaleString({ + hour: 'numeric', + minute: 'numeric' + })} - ${date.plus({ + minutes: 30 + }).toLocaleString({ + hour: 'numeric', + minute: 'numeric' + })}`, date.toLocaleString({ + weekday: 'long', + day: '2-digit', + month: 'long' + })]; + default: + return [date.toLocaleString(_luxon.DateTime.DATETIME_SHORT), '']; + } +}; +exports.formatDate = formatDate; + /***/ }), /* 762 */ /***/ (function(module, exports, __webpack_require__) { @@ -97983,7 +98054,7 @@ exports.formatListWithAnd = exports.allFluids = void 0; exports.formatNumberValues = formatNumberValues; exports.getChallengeTitleWithLineReturn = exports.formatTwoDigits = exports.formatOffPeakHours = void 0; exports.getFluidName = getFluidName; -exports.getFluidTypeTranslation = void 0; +exports.getFluidUnit = exports.getFluidTypeTranslation = void 0; exports.getKonnectorSlug = getKonnectorSlug; exports.getKonnectorUpdateError = getKonnectorUpdateError; exports.getPartnerKey = exports.getMonthNameWithPrep = exports.getMonthName = exports.getMonthFullName = void 0; @@ -98374,6 +98445,20 @@ const roundOffPeakHours = offPeakHours => { })); }; exports.roundOffPeakHours = roundOffPeakHours; +const getFluidUnit = fluidType => { + switch (fluidType) { + case _enums.FluidType.ELECTRICITY: + case _enums.FluidType.GAS: + return 'kWh'; + case _enums.FluidType.WATER: + return 'L'; + case _enums.FluidType.MULTIFLUID: + return '€'; + default: + throw new Error('unknown fluidtype'); + } +}; +exports.getFluidUnit = getFluidUnit; /***/ }), /* 763 */ @@ -99706,7 +99791,7 @@ class ConverterService { if (fluidType === _enums.FluidType.MULTIFLUID) { convertedLoad = load; } else { - convertedLoad = this.applyPrice(this._fluidConfig[fluidType], load, price); + convertedLoad = this.computePrice(this._fluidConfig[fluidType], load, price); } // Prevent round 0 case when the actual value is not 0 @@ -99717,17 +99802,15 @@ class ConverterService { } /** - * Return calculated price + * Compute calculated price + * If a price is provided, return the price * @param {FluidConfig} fluidConfig - Fluid configuration * @param {number} load - Load value * @param {number} [price] - Price if exist */ - applyPrice(fluidConfig, load, price) { - if (price) { - return price; - } else { - return load * fluidConfig.coefficient; - } + computePrice(fluidConfig, load, price) { + if (price) return price; + return load * fluidConfig.coefficient; } } exports.default = ConverterService; @@ -100901,12 +100984,6 @@ const synchroPricesToUpdate = async (client, fluidType) => { return null; } }; -const price = item => { - return item.price ? item.price : 0; -}; -const sum = (prev, next) => { - return prev + next; -}; const getTimePeriod = async (timeStep, date) => { switch (timeStep) { case _enums.TimeStep.HALF_AN_HOUR: @@ -100951,7 +101028,7 @@ const aggregatePrices = async (qr, cdm, firstDate, today, fluidType) => { const dayDocuments = await qr.fetchFluidRawDoctype(timePeriod, _enums.TimeStep.DAY, fluidType); const docToUpdate = await qr.fetchFluidRawDoctype(timePeriod, timeStep, fluidType); if (docToUpdate !== null && docToUpdate !== void 0 && docToUpdate.data && dayDocuments !== null && dayDocuments !== void 0 && dayDocuments.data) { - docToUpdate.data[0].price = dayDocuments.data.map(price).reduce(sum); + docToUpdate.data[0].price = dayDocuments.data.map(item => item.price || 0).reduce((a, b) => a + b); } await cdm.saveDocs(docToUpdate === null || docToUpdate === void 0 ? void 0 : docToUpdate.data); // Update date according to timestep @@ -101237,7 +101314,7 @@ class FluidPricesService { } /** - * Check if a fluidprice exists in db + * Check if a fluidPrice exists in db * @returns {Promise<FluidPrice | null>} price or null */ async checkIfPriceExists(fluidPrice) { @@ -101252,7 +101329,8 @@ class FluidPricesService { const { data: [price] } = await this._client.query(query); - if (price) return price;else return null; + if (price) return price; + return null; } /** @@ -101281,9 +101359,7 @@ class FluidPricesService { const { data: fluidPrice } = await this._client.save(_objectSpread(_objectSpread({}, doc), attributes)); - if (fluidPrice) { - return fluidPrice; - } + if (fluidPrice) return fluidPrice; return null; } } diff --git a/services/monthlyReportNotification/ecolyo.js b/services/monthlyReportNotification/ecolyo.js index 1748767bacba6687e16ec52b2390f4a41e5c071a..e2ad8a5247f29c7eba756655cbb0aafc94690ae7 100644 --- a/services/monthlyReportNotification/ecolyo.js +++ b/services/monthlyReportNotification/ecolyo.js @@ -43851,15 +43851,14 @@ class ConsumptionDataManager { (0, _defineProperty2.default)(this, "_queryRunnerService", void 0); (0, _defineProperty2.default)(this, "_consumptionValidatorService", void 0); (0, _defineProperty2.default)(this, "fetchAvgTemperature", async (year, month) => { - const bronStationId = '69123002'; + const BronStationId = '69123002'; const avgTemperatureDate = `${year}-${(0, _utils.formatTwoDigits)(month)}`; try { - const result = await this._client.getStackClient().fetchJSON('GET', `${_orgEcolyo.REMOTE_ORG_ECOLYO_AVG_TEMPERATURE}?identifiant=${bronStationId}&month=${avgTemperatureDate}`); + const result = await this._client.getStackClient().fetchJSON('GET', `${_orgEcolyo.REMOTE_ORG_ECOLYO_AVG_TEMPERATURE}?identifiant=${BronStationId}&month=${avgTemperatureDate}`); if (result && result.nb_results !== 0) { return result.values[0].average_measurement; - } else { - throw new Error(`No average temperature found for ${avgTemperatureDate}`); } + throw new Error(`No average temperature found for ${avgTemperatureDate}`); } catch (error) { const errorMessage = `fetchAvgTemperature error : ${error}`; logStack('error', errorMessage); @@ -43875,9 +43874,17 @@ class ConsumptionDataManager { } /** Get graph data according on timeStep and fluidType */ - async getGraphData(timePeriod, timeStep, fluidTypes, fluidStatus, compareTimePeriod, isHome, isExport) { - const InputIsValid = this._consumptionValidatorService.ValidateGetGraphData(timePeriod, timeStep, fluidTypes, compareTimePeriod, isExport); - if (!InputIsValid) return null; + async getGraphData({ + timePeriod, + timeStep, + fluidTypes, + fluidStatus, + compareTimePeriod, + isHome, + isExport + }) { + const isInputValid = this._consumptionValidatorService.ValidateGetGraphData(timePeriod, timeStep, fluidTypes, compareTimePeriod, isExport); + if (!isInputValid) return null; if (fluidTypes.length === 1 && !isHome) { const fluidType = fluidTypes[0]; const fetchedData = await this.fetchSingleFluidGraphData(timePeriod, timeStep, fluidType, compareTimePeriod); @@ -43887,7 +43894,6 @@ class ConsumptionDataManager { const toBeAggregatedData = []; for (const fluidType of fluidTypes) { const fetchedData = await this.fetchSingleFluidGraphData(timePeriod, timeStep, fluidType, compareTimePeriod); - // formatting data const formattedData = this.formatGraphDataManager(fetchedData, timeStep, timePeriod, compareTimePeriod || null, fluidType, fluidStatus ? fluidStatus[fluidType] : undefined); // validating output data toBeAggregatedData.push({ @@ -43897,14 +43903,26 @@ class ConsumptionDataManager { } const aggregatedData = this.aggregateGraphData(toBeAggregatedData); return aggregatedData; - } else return null; + } + return null; } - async getMaxLoad(maxTimePeriod, timeStep, fluidTypes, compareMaxTimePeriod, isHome, withDate) { - let allData; + async getMaxLoad({ + maxTimePeriod, + timeStep, + fluidTypes, + compareMaxTimePeriod, + isHome, + withDate + }) { if (isHome) { - var _allData; - allData = await this.getGraphData(maxTimePeriod, timeStep, fluidTypes, undefined, compareMaxTimePeriod, isHome); - return (_allData = allData) !== null && _allData !== void 0 && _allData.actualData ? Math.max(...allData.actualData.map(d => d.value)) : 0; + const allData = await this.getGraphData({ + timePeriod: maxTimePeriod, + timeStep, + fluidTypes, + compareTimePeriod: compareMaxTimePeriod, + isHome + }); + return allData !== null && allData !== void 0 && allData.actualData ? Math.max(...allData.actualData.map(d => d.value)) : 0; } else { const max = await this._queryRunnerService.fetchFluidMaxData(maxTimePeriod, timeStep, fluidTypes[0], withDate); return max; @@ -43912,20 +43930,25 @@ class ConsumptionDataManager { } /** get last dataload available for a given fluid - return the daily data */ - async getLastDataload(fluidTypes) { + async getLastDataload(fluidType) { const timePeriod = { startDate: _luxon.DateTime.now().plus({ days: -3 }).startOf('day'), endDate: _luxon.DateTime.now() }; - const data = await this._queryRunnerService.fetchFluidData(timePeriod, _enums.TimeStep.DAY, fluidTypes); + const data = await this._queryRunnerService.fetchFluidData(timePeriod, _enums.TimeStep.DAY, fluidType); return data; } async getPerformanceIndicators(timePeriod, timeStep, fluidTypes, compareTimePeriod) { const performanceIndicators = []; for (const fluidType of fluidTypes) { - const graphData = await this.getGraphData(timePeriod, timeStep, [fluidType], undefined, compareTimePeriod); + const graphData = await this.getGraphData({ + timePeriod, + timeStep, + fluidTypes: [fluidType], + compareTimePeriod + }); if (graphData) { const performanceIndicator = { value: null, @@ -44166,7 +44189,7 @@ class ConsumptionDataManager { /** * Get the first entry of a given data doctype (enedis, grdf, egl) */ - async getFirsDataDateFromDoctype(doctype) { + async getFirstDataDateFromDoctype(doctype) { const query = (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month']).sortBy([{ year: 'asc' }, { @@ -97794,7 +97817,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.SUMMER_WEEK_DATES = void 0; exports.compareDates = compareDates; -exports.getActualAnalysisDate = exports.convertDateToShortDateString = exports.convertDateToMonthYearString = void 0; +exports.getActualAnalysisDate = exports.formatDate = exports.convertDateToShortDateString = exports.convertDateToMonthYearString = void 0; exports.getCurrentSeason = getCurrentSeason; exports.getLagDays = void 0; exports.getOppositeSeason = getOppositeSeason; @@ -97968,6 +97991,54 @@ function getOppositeSeason(currentSeason) { } } +/** + * Returns an array of the formatted date. It returns an array for display purposes. + */ +const formatDate = (timeStep, date) => { + switch (timeStep) { + case _enums.TimeStep.YEAR: + return [date.toLocaleString({ + year: 'numeric' + }), '']; + case _enums.TimeStep.MONTH: + return [date.toLocaleString({ + month: 'long' + }), date.toLocaleString({ + year: 'numeric' + })]; + case _enums.TimeStep.DAY: + case _enums.TimeStep.WEEK: + return [date.toLocaleString({ + weekday: 'long', + day: '2-digit' + }), date.toLocaleString({ + month: 'long' + })]; + case _enums.TimeStep.HALF_AN_HOUR: + /** + * Format date to range: + * 9:00 - 9:30 + * Day 0X Month + */ + return [`${date.toLocaleString({ + hour: 'numeric', + minute: 'numeric' + })} - ${date.plus({ + minutes: 30 + }).toLocaleString({ + hour: 'numeric', + minute: 'numeric' + })}`, date.toLocaleString({ + weekday: 'long', + day: '2-digit', + month: 'long' + })]; + default: + return [date.toLocaleString(_luxon.DateTime.DATETIME_SHORT), '']; + } +}; +exports.formatDate = formatDate; + /***/ }), /* 762 */ /***/ (function(module, exports, __webpack_require__) { @@ -97983,7 +98054,7 @@ exports.formatListWithAnd = exports.allFluids = void 0; exports.formatNumberValues = formatNumberValues; exports.getChallengeTitleWithLineReturn = exports.formatTwoDigits = exports.formatOffPeakHours = void 0; exports.getFluidName = getFluidName; -exports.getFluidTypeTranslation = void 0; +exports.getFluidUnit = exports.getFluidTypeTranslation = void 0; exports.getKonnectorSlug = getKonnectorSlug; exports.getKonnectorUpdateError = getKonnectorUpdateError; exports.getPartnerKey = exports.getMonthNameWithPrep = exports.getMonthName = exports.getMonthFullName = void 0; @@ -98374,6 +98445,20 @@ const roundOffPeakHours = offPeakHours => { })); }; exports.roundOffPeakHours = roundOffPeakHours; +const getFluidUnit = fluidType => { + switch (fluidType) { + case _enums.FluidType.ELECTRICITY: + case _enums.FluidType.GAS: + return 'kWh'; + case _enums.FluidType.WATER: + return 'L'; + case _enums.FluidType.MULTIFLUID: + return '€'; + default: + throw new Error('unknown fluidtype'); + } +}; +exports.getFluidUnit = getFluidUnit; /***/ }), /* 763 */ @@ -99706,7 +99791,7 @@ class ConverterService { if (fluidType === _enums.FluidType.MULTIFLUID) { convertedLoad = load; } else { - convertedLoad = this.applyPrice(this._fluidConfig[fluidType], load, price); + convertedLoad = this.computePrice(this._fluidConfig[fluidType], load, price); } // Prevent round 0 case when the actual value is not 0 @@ -99717,17 +99802,15 @@ class ConverterService { } /** - * Return calculated price + * Compute calculated price + * If a price is provided, return the price * @param {FluidConfig} fluidConfig - Fluid configuration * @param {number} load - Load value * @param {number} [price] - Price if exist */ - applyPrice(fluidConfig, load, price) { - if (price) { - return price; - } else { - return load * fluidConfig.coefficient; - } + computePrice(fluidConfig, load, price) { + if (price) return price; + return load * fluidConfig.coefficient; } } exports.default = ConverterService; @@ -166023,9 +166106,9 @@ const monthlyReportTemplate = __webpack_require__(1635); const logStack = _cozyLogger.default.namespace('report'); /** * Get consumption value for all fluid if exist - * @param fluidType - FluidType + * @param fluidTypes - FluidType */ -const getConsumptionValue = async (client, fluidType, period) => { +const getConsumptionValue = async (client, fluidTypes, period) => { const consumptionService = new _consumption.default(client); const analysisDate = _luxon.DateTime.local().setZone('utc', { keepLocalTime: true @@ -166048,7 +166131,7 @@ const getConsumptionValue = async (client, fluidType, period) => { startDate: analysisDate.minus(minusPeriod).startOf('month'), endDate: analysisDate.minus(minusPeriod).endOf('month') }; - return consumptionService.getPerformanceIndicators(timePeriod, _enums.TimeStep.MONTH, fluidType, comparisonTimePeriod); + return consumptionService.getPerformanceIndicators(timePeriod, _enums.TimeStep.MONTH, fluidTypes, comparisonTimePeriod); }; /**