blue-chestnut-solar-expert 0.0.67 → 0.0.69
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/eraser-icon_19.cjs.entry.js +1 -1
- package/dist/cjs/{lerc-v64rYVDy.js → lerc-Bdx5y-yw.js} +3 -3
- package/dist/cjs/{lerc-v64rYVDy.js.map → lerc-Bdx5y-yw.js.map} +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/loading-widget.cjs.entry.js +1 -1
- package/dist/cjs/stencil-library.cjs.js +1 -1
- package/dist/collection/components/map-draw/map-draw.js +54 -25
- package/dist/collection/components/map-draw/map-draw.js.map +1 -1
- package/dist/collection/components/map-draw/map-selector.js +3 -3
- package/dist/collection/components/map-draw/polygon-buttons.js +1 -1
- package/dist/collection/components/map-draw/polygon-information.js +2 -2
- package/dist/collection/components/map-draw/tool-box.js +3 -3
- package/dist/collection/components/map-draw/tutorial-component.js +72 -4
- package/dist/collection/components/map-draw/tutorial-component.js.map +1 -1
- package/dist/collection/components/settings/settings.js +8 -8
- package/dist/collection/components/solar-expert/solar-expert.js +1 -1
- package/dist/collection/components/solar-system-form/solar-system-form.js +57 -36
- package/dist/collection/components/solar-system-form/solar-system-form.js.map +1 -1
- package/dist/collection/components/widgets/loading-widget.js +1 -1
- package/dist/collection/types/lang.js.map +1 -1
- package/dist/collection/utils/api.js +3 -2
- package/dist/collection/utils/api.js.map +1 -1
- package/dist/collection/utils/lang/english.js +7 -0
- package/dist/collection/utils/lang/english.js.map +1 -1
- package/dist/collection/utils/lang/german.js +7 -0
- package/dist/collection/utils/lang/german.js.map +1 -1
- package/dist/collection/utils/lang/spanish.js +7 -0
- package/dist/collection/utils/lang/spanish.js.map +1 -1
- package/dist/collection/utils/solar.js +0 -1
- package/dist/collection/utils/solar.js.map +1 -1
- package/dist/components/loading-widget.js +1 -1
- package/dist/components/map-draw.js +1 -1
- package/dist/components/map-selector.js +1 -1
- package/dist/components/{p-i1uLweD0.js → p-26DHwbCE.js} +4 -4
- package/dist/components/{p-i1uLweD0.js.map → p-26DHwbCE.js.map} +1 -1
- package/dist/components/{p-DlNHVTGB.js → p-BOe-Z8rz.js} +1462 -1088
- package/dist/components/p-BOe-Z8rz.js.map +1 -0
- package/dist/components/{p-Bopprtc7.js → p-Bduzzygj.js} +6 -6
- package/dist/components/{p-Bopprtc7.js.map → p-Bduzzygj.js.map} +1 -1
- package/dist/components/p-C3ZXE525.js +855 -0
- package/dist/components/p-C3ZXE525.js.map +1 -0
- package/dist/components/{p-DWirjxpO.js → p-Cx7fffWb.js} +6 -6
- package/dist/components/{p-DWirjxpO.js.map → p-Cx7fffWb.js.map} +1 -1
- package/dist/components/{p-Dzl6kfPI.js → p-D2AHNjbG.js} +39 -7
- package/dist/components/p-D2AHNjbG.js.map +1 -0
- package/dist/components/{p-BcVa4_YP.js → p-DLWzgdrw.js} +3 -3
- package/dist/components/{p-BcVa4_YP.js.map → p-DLWzgdrw.js.map} +1 -1
- package/dist/components/{p-B4X-RCW0.js → p-Ddk3b30j.js} +11 -11
- package/dist/components/{p-B4X-RCW0.js.map → p-Ddk3b30j.js.map} +1 -1
- package/dist/components/{p-eDwaXClX.js → p-DfzSejIb.js} +23 -2
- package/dist/components/p-DfzSejIb.js.map +1 -0
- package/dist/components/{p-BFJHTJPM.js → p-OxUYjaAL.js} +6 -6
- package/dist/components/{p-BFJHTJPM.js.map → p-OxUYjaAL.js.map} +1 -1
- package/dist/components/polygon-buttons.js +1 -1
- package/dist/components/polygon-information.js +1 -1
- package/dist/components/settings-modal.js +1 -1
- package/dist/components/solar-expert.js +10 -10
- package/dist/components/solar-system-form.js +1 -1
- package/dist/components/tool-box.js +1 -1
- package/dist/components/tutorial-component.js +1 -1
- package/dist/esm/eraser-icon_19.entry.js +1 -1
- package/dist/esm/{lerc-CAiDQjTu.js → lerc-DF5Lrv5A.js} +3 -3
- package/dist/esm/{lerc-CAiDQjTu.js.map → lerc-DF5Lrv5A.js.map} +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/loading-widget.entry.js +1 -1
- package/dist/esm/stencil-library.js +1 -1
- package/dist/stencil-library/assets/tutorial4.mp4 +0 -0
- package/dist/stencil-library/{p-ab0f2031.entry.js → p-9b4e52c3.entry.js} +2 -2
- package/dist/stencil-library/p-CymYGBJH.js +2 -0
- package/dist/stencil-library/p-CymYGBJH.js.map +1 -0
- package/dist/stencil-library/{p-cAuhy_jT.js → p-DHgjDQwz.js} +4 -4
- package/dist/stencil-library/{p-cAuhy_jT.js.map → p-DHgjDQwz.js.map} +1 -1
- package/dist/stencil-library/{p-e7b94dbb.entry.js → p-ba64c5e4.entry.js} +2 -2
- package/dist/stencil-library/stencil-library.esm.js +1 -1
- package/dist/types/components/map-draw/map-draw.d.ts +5 -0
- package/dist/types/components/map-draw/tutorial-component.d.ts +7 -0
- package/dist/types/components/solar-system-form/solar-system-form.d.ts +1 -0
- package/dist/types/components.d.ts +6 -0
- package/dist/types/types/lang.d.ts +7 -0
- package/dist/types/utils/api.d.ts +1 -0
- package/package.json +1 -1
- package/dist/components/p-DlNHVTGB.js.map +0 -1
- package/dist/components/p-Dzl6kfPI.js.map +0 -1
- package/dist/components/p-PkMjF2if.js +0 -1985
- package/dist/components/p-PkMjF2if.js.map +0 -1
- package/dist/components/p-eDwaXClX.js.map +0 -1
- package/dist/stencil-library/p-BBtmpSUK.js +0 -2
- package/dist/stencil-library/p-BBtmpSUK.js.map +0 -1
- /package/dist/stencil-library/{p-ab0f2031.entry.js.map → p-9b4e52c3.entry.js.map} +0 -0
- /package/dist/stencil-library/{p-e7b94dbb.entry.js.map → p-ba64c5e4.entry.js.map} +0 -0
package/dist/cjs/loader.cjs.js
CHANGED
|
@@ -8,7 +8,7 @@ var appGlobals = require('./app-globals-I24yU8do.js');
|
|
|
8
8
|
const defineCustomElements = async (win, options) => {
|
|
9
9
|
if (typeof window === 'undefined') return undefined;
|
|
10
10
|
await appGlobals.globalScripts();
|
|
11
|
-
return index.bootstrapLazy([["loading-widget.cjs",[[0,"loading-widget"]]],["eraser-icon_19.cjs",[[0,"solar-expert",{"apiKey":[1,"api-key"],"language":[1],"colorScheme":[16,"color-scheme"],"latitude":[32],"longitude":[32],"isLoaded":[32],"autocomplete":[32],"place":[32],"showMapSelector":[32]},null,{"colorScheme":["colorSchemeChanged"]}],[0,"map-draw",{"apiKey":[1,"api-key"],"config":[16],"solarPanel":[16,"solar-panel"],"enableSettings":[4,"enable-settings"],"showInstructions":[32],"showSettings":[32],"showTutorial":[32],"showMarkEdgeTutorial":[32],"showAdditionalToolsTutorial":[32],"additionalToolsTutorialShown":[32],"firstPolygonClosed":[32],"zoom":[32],"loadingState":[32],"rgbTiff":[32],"currentTool":[32],"buildingInsights":[32],"pixelInMeters":[32],"interaction":[32],"currentPolygon":[32],"solarSystem":[32],"showToast":[32],"toastMessage":[32],"toastType":[32]},null,{"rgbTiff":["setupCanvasManager","drawMap"],"canvasElement":["drawMap"]}],[0,"map-selector",{"apiKey":[1,"api-key"],"language":[1],"isLoaded":[32],"autocomplete":[32],"map":[32],"marker":[32],"circle":[32],"radius":[32],"latitude":[32],"longitude":[32],"isSatelliteMode":[32],"showAddressError":[32]}],[0,"tool-box",{"currentTool":[16,"current-tool"],"undoCallback":[16,"undo-callback"],"onToolSelect":[16,"on-tool-select"]}],[0,"polygon-information",{"currentPolygon":[16,"current-polygon"],"numberOfPanels":[2,"number-of-panels"],"handleAzimuthChange":[16,"handle-azimuth-change"],"handlePitchChange":[16,"handle-pitch-change"],"calculateSolarPanels":[16,"calculate-solar-panels"],"markAsFlatRoof":[16,"mark-as-flat-roof"],"currentTool":[1,"current-tool"]}],[0,"settings-modal",{"settings":[16],"tempSettings":[32]}],[0,"solar-system-form",{"systemConfigs":[16,"system-configs"],"polygons":[16],"roofCanvas":[16,"roof-canvas"],"polygonCanvas":[16,"polygon-canvas"],"householdConsumption":[32],"consumptionProfile":[32],"electricityPrice":[32],"compensationRate":[32],"annualPriceIncrease":[32],"autonomy":[32],"costSavings":[32],"numberOfPanels":[32],"panelPeakPower":[32],"name":[32],"email":[32],"phone":[32],"nameError":[32],"emailError":[32],"phoneError":[32],"electricCar":[32],"electricCarChargingTime":[32],"heatPump":[32],"battery":[32],"batteryEnabled":[32],"compensation20Years":[32],"savedCosts20Years":[32],"maxPanels":[32],"kmDrivenPerYear":[32],"totalEnergyConsumption":[32],"totalEnergyProduction":[32],"isSubmitting":[32],"submitMessage":[32],"submitSuccess":[32]},null,{"systemConfigs":["updateSystemConfigs"]}],[0,"toast-notification",{"message":[1],"type":[1],"duration":[2],"isVisible":[32],"isExiting":[32]}],[0,"tutorial-component",{"onClose":[16,"on-close"],"title":[1],"description":[1],"videoSource":[1,"video-source"],"isLoading":[32],"dotCount":[32]}],[0,"icon-selector",{"name":[1],"inline":[4],"size":[2]}],[0,"polygon-buttons",{"calculateSolarPanels":[16,"calculate-solar-panels"],"markAsFlatRoof":[16,"mark-as-flat-roof"],"currentTool":[1,"current-tool"]}],[0,"eraser-icon",{"inline":[4],"size":[2]}],[0,"house-icon",{"inline":[4],"size":[2]}],[0,"marker-icon",{"inline":[4],"size":[2]}],[0,"move-icon",{"inline":[4],"size":[2]}],[0,"octagon-minus-icon",{"inline":[4],"size":[2]}],[0,"settings-icon",{"inline":[4],"size":[2]}],[0,"undo-icon",{"inline":[4],"size":[2]}],[0,"search-icon",{"inline":[4],"size":[2]}]]]], options);
|
|
11
|
+
return index.bootstrapLazy([["loading-widget.cjs",[[0,"loading-widget"]]],["eraser-icon_19.cjs",[[0,"solar-expert",{"apiKey":[1,"api-key"],"language":[1],"colorScheme":[16,"color-scheme"],"latitude":[32],"longitude":[32],"isLoaded":[32],"autocomplete":[32],"place":[32],"showMapSelector":[32]},null,{"colorScheme":["colorSchemeChanged"]}],[0,"map-draw",{"apiKey":[1,"api-key"],"config":[16],"solarPanel":[16,"solar-panel"],"enableSettings":[4,"enable-settings"],"showInstructions":[32],"showSettings":[32],"showTutorial":[32],"showMarkEdgeTutorial":[32],"showAdditionalToolsTutorial":[32],"additionalToolsTutorialShown":[32],"showObstacleTutorial":[32],"obstacleTutorialShown":[32],"firstPolygonClosed":[32],"zoom":[32],"loadingState":[32],"rgbTiff":[32],"currentTool":[32],"buildingInsights":[32],"pixelInMeters":[32],"interaction":[32],"currentPolygon":[32],"solarSystem":[32],"showToast":[32],"toastMessage":[32],"toastType":[32]},null,{"rgbTiff":["setupCanvasManager","drawMap"],"canvasElement":["drawMap"]}],[0,"map-selector",{"apiKey":[1,"api-key"],"language":[1],"isLoaded":[32],"autocomplete":[32],"map":[32],"marker":[32],"circle":[32],"radius":[32],"latitude":[32],"longitude":[32],"isSatelliteMode":[32],"showAddressError":[32]}],[0,"tool-box",{"currentTool":[16,"current-tool"],"undoCallback":[16,"undo-callback"],"onToolSelect":[16,"on-tool-select"]}],[0,"polygon-information",{"currentPolygon":[16,"current-polygon"],"numberOfPanels":[2,"number-of-panels"],"handleAzimuthChange":[16,"handle-azimuth-change"],"handlePitchChange":[16,"handle-pitch-change"],"calculateSolarPanels":[16,"calculate-solar-panels"],"markAsFlatRoof":[16,"mark-as-flat-roof"],"currentTool":[1,"current-tool"]}],[0,"settings-modal",{"settings":[16],"tempSettings":[32]}],[0,"solar-system-form",{"systemConfigs":[16,"system-configs"],"polygons":[16],"roofCanvas":[16,"roof-canvas"],"polygonCanvas":[16,"polygon-canvas"],"pixelInMeters":[2,"pixel-in-meters"],"householdConsumption":[32],"consumptionProfile":[32],"electricityPrice":[32],"compensationRate":[32],"annualPriceIncrease":[32],"autonomy":[32],"costSavings":[32],"numberOfPanels":[32],"panelPeakPower":[32],"name":[32],"email":[32],"phone":[32],"nameError":[32],"emailError":[32],"phoneError":[32],"electricCar":[32],"electricCarChargingTime":[32],"heatPump":[32],"battery":[32],"batteryEnabled":[32],"compensation20Years":[32],"savedCosts20Years":[32],"maxPanels":[32],"kmDrivenPerYear":[32],"totalEnergyConsumption":[32],"totalEnergyProduction":[32],"isSubmitting":[32],"submitMessage":[32],"submitSuccess":[32]},null,{"systemConfigs":["updateSystemConfigs"]}],[0,"toast-notification",{"message":[1],"type":[1],"duration":[2],"isVisible":[32],"isExiting":[32]}],[0,"tutorial-component",{"onClose":[16,"on-close"],"onSkip":[16,"on-skip"],"showSkipButton":[4,"show-skip-button"],"title":[1],"description":[1],"videoSource":[1,"video-source"],"isLoading":[32],"dotCount":[32],"isVideoPlaying":[32]}],[0,"icon-selector",{"name":[1],"inline":[4],"size":[2]}],[0,"polygon-buttons",{"calculateSolarPanels":[16,"calculate-solar-panels"],"markAsFlatRoof":[16,"mark-as-flat-roof"],"currentTool":[1,"current-tool"]}],[0,"eraser-icon",{"inline":[4],"size":[2]}],[0,"house-icon",{"inline":[4],"size":[2]}],[0,"marker-icon",{"inline":[4],"size":[2]}],[0,"move-icon",{"inline":[4],"size":[2]}],[0,"octagon-minus-icon",{"inline":[4],"size":[2]}],[0,"settings-icon",{"inline":[4],"size":[2]}],[0,"undo-icon",{"inline":[4],"size":[2]}],[0,"search-icon",{"inline":[4],"size":[2]}]]]], options);
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
exports.setNonce = index.setNonce;
|
|
@@ -11,7 +11,7 @@ const LoadingWidget = class {
|
|
|
11
11
|
index.registerInstance(this, hostRef);
|
|
12
12
|
}
|
|
13
13
|
render() {
|
|
14
|
-
return (index.h("div", { key: '
|
|
14
|
+
return (index.h("div", { key: '109fccb95eecc3f9eae344cd2393dba6f89592ff', class: "absolute flex items-center justify-center bg-muted bg-opacity-75 z-20 pt-7 rounded-4xl" }, index.h("div", { key: '5f2ad1dd8255ba48be3881d1db99267bb022e68d', class: "animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-secondary" })));
|
|
15
15
|
}
|
|
16
16
|
};
|
|
17
17
|
LoadingWidget.style = outputCss;
|
|
@@ -21,7 +21,7 @@ var patchBrowser = () => {
|
|
|
21
21
|
|
|
22
22
|
patchBrowser().then(async (options) => {
|
|
23
23
|
await appGlobals.globalScripts();
|
|
24
|
-
return index.bootstrapLazy([["loading-widget.cjs",[[0,"loading-widget"]]],["eraser-icon_19.cjs",[[0,"solar-expert",{"apiKey":[1,"api-key"],"language":[1],"colorScheme":[16,"color-scheme"],"latitude":[32],"longitude":[32],"isLoaded":[32],"autocomplete":[32],"place":[32],"showMapSelector":[32]},null,{"colorScheme":["colorSchemeChanged"]}],[0,"map-draw",{"apiKey":[1,"api-key"],"config":[16],"solarPanel":[16,"solar-panel"],"enableSettings":[4,"enable-settings"],"showInstructions":[32],"showSettings":[32],"showTutorial":[32],"showMarkEdgeTutorial":[32],"showAdditionalToolsTutorial":[32],"additionalToolsTutorialShown":[32],"firstPolygonClosed":[32],"zoom":[32],"loadingState":[32],"rgbTiff":[32],"currentTool":[32],"buildingInsights":[32],"pixelInMeters":[32],"interaction":[32],"currentPolygon":[32],"solarSystem":[32],"showToast":[32],"toastMessage":[32],"toastType":[32]},null,{"rgbTiff":["setupCanvasManager","drawMap"],"canvasElement":["drawMap"]}],[0,"map-selector",{"apiKey":[1,"api-key"],"language":[1],"isLoaded":[32],"autocomplete":[32],"map":[32],"marker":[32],"circle":[32],"radius":[32],"latitude":[32],"longitude":[32],"isSatelliteMode":[32],"showAddressError":[32]}],[0,"tool-box",{"currentTool":[16,"current-tool"],"undoCallback":[16,"undo-callback"],"onToolSelect":[16,"on-tool-select"]}],[0,"polygon-information",{"currentPolygon":[16,"current-polygon"],"numberOfPanels":[2,"number-of-panels"],"handleAzimuthChange":[16,"handle-azimuth-change"],"handlePitchChange":[16,"handle-pitch-change"],"calculateSolarPanels":[16,"calculate-solar-panels"],"markAsFlatRoof":[16,"mark-as-flat-roof"],"currentTool":[1,"current-tool"]}],[0,"settings-modal",{"settings":[16],"tempSettings":[32]}],[0,"solar-system-form",{"systemConfigs":[16,"system-configs"],"polygons":[16],"roofCanvas":[16,"roof-canvas"],"polygonCanvas":[16,"polygon-canvas"],"householdConsumption":[32],"consumptionProfile":[32],"electricityPrice":[32],"compensationRate":[32],"annualPriceIncrease":[32],"autonomy":[32],"costSavings":[32],"numberOfPanels":[32],"panelPeakPower":[32],"name":[32],"email":[32],"phone":[32],"nameError":[32],"emailError":[32],"phoneError":[32],"electricCar":[32],"electricCarChargingTime":[32],"heatPump":[32],"battery":[32],"batteryEnabled":[32],"compensation20Years":[32],"savedCosts20Years":[32],"maxPanels":[32],"kmDrivenPerYear":[32],"totalEnergyConsumption":[32],"totalEnergyProduction":[32],"isSubmitting":[32],"submitMessage":[32],"submitSuccess":[32]},null,{"systemConfigs":["updateSystemConfigs"]}],[0,"toast-notification",{"message":[1],"type":[1],"duration":[2],"isVisible":[32],"isExiting":[32]}],[0,"tutorial-component",{"onClose":[16,"on-close"],"title":[1],"description":[1],"videoSource":[1,"video-source"],"isLoading":[32],"dotCount":[32]}],[0,"icon-selector",{"name":[1],"inline":[4],"size":[2]}],[0,"polygon-buttons",{"calculateSolarPanels":[16,"calculate-solar-panels"],"markAsFlatRoof":[16,"mark-as-flat-roof"],"currentTool":[1,"current-tool"]}],[0,"eraser-icon",{"inline":[4],"size":[2]}],[0,"house-icon",{"inline":[4],"size":[2]}],[0,"marker-icon",{"inline":[4],"size":[2]}],[0,"move-icon",{"inline":[4],"size":[2]}],[0,"octagon-minus-icon",{"inline":[4],"size":[2]}],[0,"settings-icon",{"inline":[4],"size":[2]}],[0,"undo-icon",{"inline":[4],"size":[2]}],[0,"search-icon",{"inline":[4],"size":[2]}]]]], options);
|
|
24
|
+
return index.bootstrapLazy([["loading-widget.cjs",[[0,"loading-widget"]]],["eraser-icon_19.cjs",[[0,"solar-expert",{"apiKey":[1,"api-key"],"language":[1],"colorScheme":[16,"color-scheme"],"latitude":[32],"longitude":[32],"isLoaded":[32],"autocomplete":[32],"place":[32],"showMapSelector":[32]},null,{"colorScheme":["colorSchemeChanged"]}],[0,"map-draw",{"apiKey":[1,"api-key"],"config":[16],"solarPanel":[16,"solar-panel"],"enableSettings":[4,"enable-settings"],"showInstructions":[32],"showSettings":[32],"showTutorial":[32],"showMarkEdgeTutorial":[32],"showAdditionalToolsTutorial":[32],"additionalToolsTutorialShown":[32],"showObstacleTutorial":[32],"obstacleTutorialShown":[32],"firstPolygonClosed":[32],"zoom":[32],"loadingState":[32],"rgbTiff":[32],"currentTool":[32],"buildingInsights":[32],"pixelInMeters":[32],"interaction":[32],"currentPolygon":[32],"solarSystem":[32],"showToast":[32],"toastMessage":[32],"toastType":[32]},null,{"rgbTiff":["setupCanvasManager","drawMap"],"canvasElement":["drawMap"]}],[0,"map-selector",{"apiKey":[1,"api-key"],"language":[1],"isLoaded":[32],"autocomplete":[32],"map":[32],"marker":[32],"circle":[32],"radius":[32],"latitude":[32],"longitude":[32],"isSatelliteMode":[32],"showAddressError":[32]}],[0,"tool-box",{"currentTool":[16,"current-tool"],"undoCallback":[16,"undo-callback"],"onToolSelect":[16,"on-tool-select"]}],[0,"polygon-information",{"currentPolygon":[16,"current-polygon"],"numberOfPanels":[2,"number-of-panels"],"handleAzimuthChange":[16,"handle-azimuth-change"],"handlePitchChange":[16,"handle-pitch-change"],"calculateSolarPanels":[16,"calculate-solar-panels"],"markAsFlatRoof":[16,"mark-as-flat-roof"],"currentTool":[1,"current-tool"]}],[0,"settings-modal",{"settings":[16],"tempSettings":[32]}],[0,"solar-system-form",{"systemConfigs":[16,"system-configs"],"polygons":[16],"roofCanvas":[16,"roof-canvas"],"polygonCanvas":[16,"polygon-canvas"],"pixelInMeters":[2,"pixel-in-meters"],"householdConsumption":[32],"consumptionProfile":[32],"electricityPrice":[32],"compensationRate":[32],"annualPriceIncrease":[32],"autonomy":[32],"costSavings":[32],"numberOfPanels":[32],"panelPeakPower":[32],"name":[32],"email":[32],"phone":[32],"nameError":[32],"emailError":[32],"phoneError":[32],"electricCar":[32],"electricCarChargingTime":[32],"heatPump":[32],"battery":[32],"batteryEnabled":[32],"compensation20Years":[32],"savedCosts20Years":[32],"maxPanels":[32],"kmDrivenPerYear":[32],"totalEnergyConsumption":[32],"totalEnergyProduction":[32],"isSubmitting":[32],"submitMessage":[32],"submitSuccess":[32]},null,{"systemConfigs":["updateSystemConfigs"]}],[0,"toast-notification",{"message":[1],"type":[1],"duration":[2],"isVisible":[32],"isExiting":[32]}],[0,"tutorial-component",{"onClose":[16,"on-close"],"onSkip":[16,"on-skip"],"showSkipButton":[4,"show-skip-button"],"title":[1],"description":[1],"videoSource":[1,"video-source"],"isLoading":[32],"dotCount":[32],"isVideoPlaying":[32]}],[0,"icon-selector",{"name":[1],"inline":[4],"size":[2]}],[0,"polygon-buttons",{"calculateSolarPanels":[16,"calculate-solar-panels"],"markAsFlatRoof":[16,"mark-as-flat-roof"],"currentTool":[1,"current-tool"]}],[0,"eraser-icon",{"inline":[4],"size":[2]}],[0,"house-icon",{"inline":[4],"size":[2]}],[0,"marker-icon",{"inline":[4],"size":[2]}],[0,"move-icon",{"inline":[4],"size":[2]}],[0,"octagon-minus-icon",{"inline":[4],"size":[2]}],[0,"settings-icon",{"inline":[4],"size":[2]}],[0,"undo-icon",{"inline":[4],"size":[2]}],[0,"search-icon",{"inline":[4],"size":[2]}]]]], options);
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
exports.setNonce = index.setNonce;
|
|
@@ -19,6 +19,8 @@ export class MapDraw {
|
|
|
19
19
|
showMarkEdgeTutorial = false;
|
|
20
20
|
showAdditionalToolsTutorial = false;
|
|
21
21
|
additionalToolsTutorialShown = false;
|
|
22
|
+
showObstacleTutorial = false;
|
|
23
|
+
obstacleTutorialShown = false;
|
|
22
24
|
firstPolygonClosed = false;
|
|
23
25
|
zoom = 1;
|
|
24
26
|
loadingState = "empty";
|
|
@@ -55,11 +57,7 @@ export class MapDraw {
|
|
|
55
57
|
this.getBuildingImages();
|
|
56
58
|
this.getBuildingInsights();
|
|
57
59
|
// Reset tutorial states for new location
|
|
58
|
-
this.
|
|
59
|
-
this.showMarkEdgeTutorial = false;
|
|
60
|
-
this.showAdditionalToolsTutorial = false;
|
|
61
|
-
this.additionalToolsTutorialShown = false;
|
|
62
|
-
this.firstPolygonClosed = false;
|
|
60
|
+
this.resetTutorials();
|
|
63
61
|
// Show tutorial when coordinates are first set
|
|
64
62
|
this.showTutorial = true;
|
|
65
63
|
}
|
|
@@ -70,11 +68,7 @@ export class MapDraw {
|
|
|
70
68
|
this.getBuildingImages();
|
|
71
69
|
this.getBuildingInsights();
|
|
72
70
|
// Reset tutorial states for new location
|
|
73
|
-
this.
|
|
74
|
-
this.showMarkEdgeTutorial = false;
|
|
75
|
-
this.showAdditionalToolsTutorial = false;
|
|
76
|
-
this.additionalToolsTutorialShown = false;
|
|
77
|
-
this.firstPolygonClosed = false;
|
|
71
|
+
this.resetTutorials();
|
|
78
72
|
// Show tutorial when coordinates are first set
|
|
79
73
|
this.showTutorial = true;
|
|
80
74
|
}
|
|
@@ -127,6 +121,13 @@ export class MapDraw {
|
|
|
127
121
|
if (!this.rgbTiff)
|
|
128
122
|
return;
|
|
129
123
|
// if (this.canvasManager) return;
|
|
124
|
+
let managerConfig = {};
|
|
125
|
+
if (state.isMobile) {
|
|
126
|
+
managerConfig = {
|
|
127
|
+
...managerConfig,
|
|
128
|
+
closeDistance: 20,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
130
131
|
this.canvasManager = new CanvasManager({
|
|
131
132
|
coordinateSystem: {
|
|
132
133
|
width: this.rgbTiff.width,
|
|
@@ -151,12 +152,13 @@ export class MapDraw {
|
|
|
151
152
|
onPolygonChange: (polygon) => this.handlePolygonsChange(polygon),
|
|
152
153
|
onLowerRoofEdgeMarked: () => {
|
|
153
154
|
this.calculateSolarPanels(false);
|
|
155
|
+
// Show additional tools tutorial after mark edge tutorial is completed
|
|
154
156
|
if (!this.additionalToolsTutorialShown) {
|
|
155
157
|
this.showAdditionalToolsTutorial = true;
|
|
156
158
|
this.additionalToolsTutorialShown = true;
|
|
157
159
|
}
|
|
158
160
|
},
|
|
159
|
-
});
|
|
161
|
+
}, managerConfig);
|
|
160
162
|
console.log("debug", this.canvasManager?.getDebugString());
|
|
161
163
|
// Add event listeners after canvas is initialized
|
|
162
164
|
this.setupEventListeners();
|
|
@@ -249,6 +251,15 @@ export class MapDraw {
|
|
|
249
251
|
if (polygon.closed && !this.firstPolygonClosed &&
|
|
250
252
|
polygon.type === "roof") {
|
|
251
253
|
this.firstPolygonClosed = true;
|
|
254
|
+
// Show obstacle tutorial first instead of mark edge tutorial
|
|
255
|
+
this.showObstacleTutorial = true;
|
|
256
|
+
}
|
|
257
|
+
// Show mark edge tutorial when an obstacle polygon is closed (if obstacle tutorial was shown)
|
|
258
|
+
if (polygon.closed &&
|
|
259
|
+
polygon.type === "obstruction" &&
|
|
260
|
+
this.obstacleTutorialShown &&
|
|
261
|
+
!this.showMarkEdgeTutorial &&
|
|
262
|
+
!this.showObstacleTutorial) {
|
|
252
263
|
this.showMarkEdgeTutorial = true;
|
|
253
264
|
}
|
|
254
265
|
if (polygon.closed || this.currentTool !== moveTool) {
|
|
@@ -390,11 +401,7 @@ export class MapDraw {
|
|
|
390
401
|
this.rgbTiff = null;
|
|
391
402
|
this.canvasManager?.clearPolygons();
|
|
392
403
|
// Reset tutorial states for new location
|
|
393
|
-
this.
|
|
394
|
-
this.showMarkEdgeTutorial = false;
|
|
395
|
-
this.showAdditionalToolsTutorial = false;
|
|
396
|
-
this.additionalToolsTutorialShown = false;
|
|
397
|
-
this.firstPolygonClosed = false;
|
|
404
|
+
this.resetTutorials();
|
|
398
405
|
}
|
|
399
406
|
try {
|
|
400
407
|
this.buildingInsights = await fetchSolarData(state.latitude, state.longitude, this.apiKey);
|
|
@@ -619,6 +626,17 @@ export class MapDraw {
|
|
|
619
626
|
};
|
|
620
627
|
handleAdditionalToolsTutorialClose = () => {
|
|
621
628
|
this.showAdditionalToolsTutorial = false;
|
|
629
|
+
this.additionalToolsTutorialShown = true;
|
|
630
|
+
};
|
|
631
|
+
handleObstacleTutorialClose = () => {
|
|
632
|
+
this.showObstacleTutorial = false;
|
|
633
|
+
this.obstacleTutorialShown = true;
|
|
634
|
+
this.handleToolSelect(obstructionTool);
|
|
635
|
+
};
|
|
636
|
+
handleObstacleTutorialSkip = () => {
|
|
637
|
+
this.showObstacleTutorial = false;
|
|
638
|
+
this.obstacleTutorialShown = true;
|
|
639
|
+
this.showMarkEdgeTutorial = true;
|
|
622
640
|
};
|
|
623
641
|
showToastMessage(message, type = "success") {
|
|
624
642
|
this.toastMessage = message;
|
|
@@ -629,26 +647,35 @@ export class MapDraw {
|
|
|
629
647
|
this.showToast = false;
|
|
630
648
|
}, 3000);
|
|
631
649
|
}
|
|
650
|
+
resetTutorials() {
|
|
651
|
+
this.showTutorial = false;
|
|
652
|
+
this.showMarkEdgeTutorial = false;
|
|
653
|
+
this.showAdditionalToolsTutorial = false;
|
|
654
|
+
this.showObstacleTutorial = false;
|
|
655
|
+
this.additionalToolsTutorialShown = false;
|
|
656
|
+
this.obstacleTutorialShown = false;
|
|
657
|
+
this.firstPolygonClosed = false;
|
|
658
|
+
}
|
|
632
659
|
render() {
|
|
633
660
|
const t = getLanguageStrings(state.settings.language);
|
|
634
|
-
return (h("div", { key: '
|
|
635
|
-
.description, videoSource: getAssetPath("./assets/tutorial2.mp4") })), this.showAdditionalToolsTutorial && (h("tutorial-component", { key: '
|
|
661
|
+
return (h("div", { key: 'bb9de30bfdc8c301648b4e555ee91dd10790cfe1', class: "flex flex-col justify-center items-center w-full h-full gap-4", id: "map-draw" }, this.showTutorial && (h("tutorial-component", { key: '55fb0534409ded5116ef5d0848ef4e18429125dc', onClose: this.handleTutorialClose, title: t.mapDraw.tutorial.title, description: t.mapDraw.tutorial.description, videoSource: getAssetPath("./assets/tutorial1.mp4") })), this.showMarkEdgeTutorial && (h("tutorial-component", { key: '106bb6504bd30cc9fbaa45ea81bce7bc8e35ad89', onClose: this.handleMarkEdgeTutorialClose, title: t.mapDraw.tutorial.markEdge.title, description: t.mapDraw.tutorial.markEdge
|
|
662
|
+
.description, videoSource: getAssetPath("./assets/tutorial2.mp4") })), this.showAdditionalToolsTutorial && (h("tutorial-component", { key: '60e9697dc04c89ce174265021ec2f725fc894887', onClose: this
|
|
636
663
|
.handleAdditionalToolsTutorialClose, title: t.mapDraw.tutorial.additionalTools.title, description: t.mapDraw.tutorial.additionalTools
|
|
637
|
-
.description, videoSource: getAssetPath("./assets/tutorial3.mp4") })), (state.latitude && state.longitude &&
|
|
638
|
-
this.loadingState === "loading") && (h("div", { key: '
|
|
639
|
-
this.loadingState === "error") && (h("div", { key: '
|
|
664
|
+
.description, videoSource: getAssetPath("./assets/tutorial3.mp4") })), this.showObstacleTutorial && (h("tutorial-component", { key: 'b8ee4d273be4405f0e75433f3c3bfaf8fd38f6ea', onClose: this.handleObstacleTutorialClose, onSkip: this.handleObstacleTutorialSkip, showSkipButton: true, title: t.mapDraw.tutorial.obstacle.title, description: t.mapDraw.tutorial.obstacle.description, videoSource: getAssetPath("./assets/tutorial4.mp4") })), (state.latitude && state.longitude &&
|
|
665
|
+
this.loadingState === "loading") && (h("div", { key: '1d9795783a5a4001e8942214f9291ff17e5c9e81', class: "flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl" }, h("div", { key: '4fe8c9ed7e0f951047ade565c7c7d7c284880af7', class: "animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-secondary" }))), (state.latitude && state.longitude &&
|
|
666
|
+
this.loadingState === "error") && (h("div", { key: 'b573fea2e40fe903464df2f9c87418e10645bdbe', class: "flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl" }, h("div", { key: '8ca895577317ed846e88a74f460bacac13ba1102', class: "text-red-500 text-center text-lg font-semibold" }, t.mapDraw.imageLoadError))), h("div", { key: '5727a6899c7ef16fd65b328f879f382200cd0099', class: "flex items-start justify-center w-full bg-primary rounded-4xl" }, h("div", { key: '8d0cb90847e01380e795426f4eb0d82ee4472fc3', class: "relative flex items-center justify-center w-full rounded-4xl bg-secondary", style: {
|
|
640
667
|
aspectRatio: this.rgbTiff
|
|
641
668
|
? `${this.rgbTiff.width}/${this.rgbTiff.height}`
|
|
642
669
|
: "",
|
|
643
|
-
} }, h("canvas", { key: '
|
|
670
|
+
} }, h("canvas", { key: 'e5dace6eed7f881f26c453ec4a37786940618cea', ref: (el) => this.canvasElement = el, class: "absolute top-0 left-0 w-full h-full rounded-4xl", id: "map-draw-canvas", style: {
|
|
644
671
|
cursor: this.currentTool.cursor,
|
|
645
|
-
} }), h("canvas", { key: '
|
|
672
|
+
} }), h("canvas", { key: '1e4bbef400cd1d95cd0c2bbfbe5c75de77687744', ref: (el) => this.polygonCanvas = el, class: "absolute top-0 left-0 w-full h-full rounded-4xl", style: {
|
|
646
673
|
cursor: this.currentTool.cursor,
|
|
647
|
-
} }))), this.rgbTiff && (h("div", { key: '
|
|
674
|
+
} }))), this.rgbTiff && (h("div", { key: '19e7119b1f12ea5a4380a6b1b1bd5aa70ce9be77', class: "w-full" }, h("div", { key: '3e192ed5048aaeeb3a251ef11b30eda3a5b78668', class: "w-full pb-4" }, h("tool-box", { key: '5d3ee6c1e561b836dfe3566fb95573f669d6e692', currentTool: this.currentTool, onToolSelect: (tool) => this.handleToolSelect(tool), undoCallback: () => this.undo() })), h("div", { key: 'e7a98bcf23ea1653547d7b3eeabd3f784ac7114e', class: "w-full" }, h("polygon-information", { key: 'ca3092abaea53001bf5d008e9e9128e91e07cf01', currentPolygon: this.currentPolygon, numberOfPanels: this.currentPolygon
|
|
648
675
|
? this
|
|
649
676
|
.solarSystem[this.currentPolygon.id]
|
|
650
677
|
?.numberOfPanels
|
|
651
|
-
: undefined, handleAzimuthChange: (event) => this.handleAzimuthChange(event), handlePitchChange: (event) => this.handlePitchChange(event), calculateSolarPanels: () => this.calculateSolarPanels(true), markAsFlatRoof: () => this.markAsFlatRoof(), currentTool: this.currentTool.name })), h("div", { key: '
|
|
678
|
+
: undefined, handleAzimuthChange: (event) => this.handleAzimuthChange(event), handlePitchChange: (event) => this.handlePitchChange(event), calculateSolarPanels: () => this.calculateSolarPanels(true), markAsFlatRoof: () => this.markAsFlatRoof(), currentTool: this.currentTool.name })), h("div", { key: '004d65f46355bb244a1e7ddfa6c6df28ad3f31ad', class: "w-full" }, h("solar-system-form", { key: 'b9c095e76b308a5ab5de11de436eef7401516318', systemConfigs: this.solarSystem, polygons: this.canvasManager?.getPolygons(), roofCanvas: this.canvasElement, polygonCanvas: this.polygonCanvas, pixelInMeters: this.pixelInMeters })))), this.showSettings && (h("settings-modal", { key: 'adfa4fe395cb1a3a275cb1012b05ee7dce24ec45', settings: state.settings, onClose: this.handleSettingsClose, onSave: this.handleSettingsSave })), this.showToast && (h("toast-notification", { key: '5413c46de3d34e9910d011f49e9e39f778f40a69', message: this.toastMessage, type: this.toastType, duration: 3000 }))));
|
|
652
679
|
}
|
|
653
680
|
static get is() { return "map-draw"; }
|
|
654
681
|
static get originalStyleUrls() {
|
|
@@ -763,6 +790,8 @@ export class MapDraw {
|
|
|
763
790
|
"showMarkEdgeTutorial": {},
|
|
764
791
|
"showAdditionalToolsTutorial": {},
|
|
765
792
|
"additionalToolsTutorialShown": {},
|
|
793
|
+
"showObstacleTutorial": {},
|
|
794
|
+
"obstacleTutorialShown": {},
|
|
766
795
|
"firstPolygonClosed": {},
|
|
767
796
|
"zoom": {},
|
|
768
797
|
"loadingState": {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-draw.js","sourceRoot":"","sources":["../../../src/components/map-draw/map-draw.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\r\n Component,\r\n Element,\r\n getAssetPath,\r\n h,\r\n Prop,\r\n State,\r\n Watch,\r\n} from \"@stencil/core\";\r\n\r\nimport {\r\n BuildingInsightsResponse,\r\n GeoTiff,\r\n Polygon,\r\n SolarPanelType,\r\n} from \"harmonia-types\";\r\nimport {\r\n fetchSolarData,\r\n getBestFittingRoofSegment,\r\n getOptimalSolarPositionFully,\r\n SolarSystem,\r\n} from \"harmonia-sim\";\r\nimport { getBuildingImages } from \"../../utils/solar\";\r\nimport {\r\n CanvasInteraction,\r\n CanvasManager,\r\n CanvasUtils,\r\n renderRGB,\r\n Tool,\r\n} from \"harmonia-draw\";\r\nimport {\r\n markRoofEdgeTool,\r\n moveTool,\r\n obstructionTool,\r\n roofTool,\r\n Tool as LegacyTool,\r\n} from \"../../utils/render/tools\";\r\nimport {\r\n DEFAULT_SOLAR_EXPERT_CONFIG,\r\n DEFAULT_SOLAR_PANEL_TYPE,\r\n SolarExpertConfig,\r\n} from \"../../config\";\r\nimport { getPixelInMeters } from \"../../utils/utils\";\r\nimport { BORDER_INSET } from \"../../constants\";\r\nimport { getLanguageStrings } from \"../../utils/lang/general\";\r\nimport { onChange, Settings, state } from \"../../store\";\r\n\r\n@Component({\r\n tag: \"map-draw\",\r\n styleUrl: \"../../output.css\",\r\n shadow: false,\r\n})\r\nexport class MapDraw {\r\n @Prop()\r\n apiKey: string = \"\";\r\n @Prop()\r\n config: SolarExpertConfig = DEFAULT_SOLAR_EXPERT_CONFIG;\r\n @Prop()\r\n solarPanel: SolarPanelType = DEFAULT_SOLAR_PANEL_TYPE;\r\n @Prop()\r\n enableSettings: boolean = false;\r\n\r\n @State()\r\n showInstructions: boolean = true;\r\n @State()\r\n showSettings: boolean = false;\r\n @State()\r\n showTutorial: boolean = false;\r\n @State()\r\n showMarkEdgeTutorial: boolean = false;\r\n @State()\r\n showAdditionalToolsTutorial: boolean = false;\r\n @State()\r\n additionalToolsTutorialShown: boolean = false;\r\n @State()\r\n firstPolygonClosed: boolean = false;\r\n @State()\r\n zoom: number = 1;\r\n @State()\r\n loadingState: \"empty\" | \"loading\" | \"loaded\" | \"error\" = \"empty\";\r\n @State()\r\n rgbTiff: GeoTiff | null = null;\r\n @State()\r\n currentTool: LegacyTool = roofTool;\r\n @State()\r\n buildingInsights: BuildingInsightsResponse | null = null;\r\n @State()\r\n pixelInMeters: number = 0.2;\r\n @State()\r\n interaction: CanvasInteraction = {\r\n isDrawing: false,\r\n isDragging: false,\r\n lastTouchTime: 0,\r\n };\r\n @State()\r\n currentPolygon: Polygon | null = null;\r\n @State()\r\n solarSystem: { [id: string]: SolarSystem } = {};\r\n @State()\r\n showToast: boolean = false;\r\n @State()\r\n toastMessage: string = \"\";\r\n @State()\r\n toastType: \"success\" | \"info\" | \"warning\" | \"error\" = \"success\";\r\n\r\n @Element()\r\n el: HTMLElement;\r\n private canvasElement?: HTMLCanvasElement;\r\n private polygonCanvas?: HTMLCanvasElement;\r\n private polygonCtx?: CanvasRenderingContext2D;\r\n private canvasManager?: CanvasManager;\r\n private preventDefaultTouch?: (e: TouchEvent) => void;\r\n private gestureStartHandler?: (e: Event) => void;\r\n private gestureChangeHandler?: (e: Event) => void;\r\n private gestureEndHandler?: (e: Event) => void;\r\n private latitudeChangeListener?: () => void;\r\n private longitudeChangeListener?: () => void;\r\n\r\n componentDidLoad() {\r\n // Set up change listeners for latitude and longitude\r\n this.latitudeChangeListener = () => {\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n\r\n // Show tutorial when coordinates are first set\r\n this.showTutorial = true;\r\n }\r\n };\r\n this.longitudeChangeListener = () => {\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n\r\n // Show tutorial when coordinates are first set\r\n this.showTutorial = true;\r\n }\r\n };\r\n\r\n onChange(\"latitude\", this.latitudeChangeListener);\r\n onChange(\"longitude\", this.longitudeChangeListener);\r\n\r\n // Load data if coordinates already exist\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingInsights();\r\n this.getBuildingImages();\r\n\r\n // Show tutorial if coordinates already exist\r\n this.showTutorial = true;\r\n }\r\n\r\n // Wait for the next frame to ensure DOM is ready\r\n requestAnimationFrame(() => {\r\n this.initializeCanvas();\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n this.sizeCanvas(rect.width, rect.height);\r\n });\r\n }\r\n\r\n private initializeCanvas() {\r\n if (this.canvasElement && this.polygonCanvas) {\r\n // Set initial canvas sizes based on container\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n if (rect.width > 0 && rect.height > 0) {\r\n this.canvasElement.width = rect.width;\r\n this.canvasElement.height = rect.height;\r\n this.polygonCanvas.width = rect.width;\r\n this.polygonCanvas.height = rect.height;\r\n this.polygonCtx = this.polygonCanvas.getContext(\"2d\");\r\n }\r\n }\r\n\r\n // Add resize listener\r\n window.addEventListener(\"resize\", this.handleResize);\r\n }\r\n\r\n private handleResize = () => {\r\n if (this.rgbTiff) {\r\n this.drawMap();\r\n }\r\n };\r\n\r\n disconnectedCallback() {\r\n this.removeEventListeners();\r\n window.removeEventListener(\"resize\", this.handleResize);\r\n window.removeEventListener(\"resize\", this.handleResize);\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n setupCanvasManager() {\r\n if (!this.rgbTiff) return;\r\n if (!this.rgbTiff) return;\r\n // if (this.canvasManager) return;\r\n this.canvasManager = new CanvasManager({\r\n coordinateSystem: {\r\n width: this.rgbTiff.width,\r\n height: this.rgbTiff.height,\r\n },\r\n onStateChange: () => {\r\n const currentPolygon = this.canvasManager\r\n ?.getCurrentPolygon();\r\n // Calculate area and create a copy to trigger Stencil re-render\r\n this.currentPolygon = currentPolygon\r\n ? {\r\n ...currentPolygon,\r\n points: [...currentPolygon.points],\r\n area: currentPolygon.area,\r\n }\r\n : null;\r\n CanvasUtils.drawState(\r\n this.polygonCtx,\r\n this.canvasManager.getState(),\r\n this.solarPanel,\r\n {\r\n showGrid: false,\r\n showPreview: !state.isMobile,\r\n },\r\n );\r\n },\r\n onPolygonChange: (polygon) => this.handlePolygonsChange(polygon),\r\n onLowerRoofEdgeMarked: () => {\r\n this.calculateSolarPanels(false);\r\n if (!this.additionalToolsTutorialShown) {\r\n this.showAdditionalToolsTutorial = true;\r\n this.additionalToolsTutorialShown = true;\r\n }\r\n },\r\n });\r\n\r\n console.log(\"debug\", this.canvasManager?.getDebugString());\r\n\r\n // Add event listeners after canvas is initialized\r\n this.setupEventListeners();\r\n\r\n // Draw map after canvas manager is set up\r\n requestAnimationFrame(() => {\r\n this.drawMap();\r\n });\r\n\r\n // Draw map after canvas manager is set up\r\n requestAnimationFrame(() => {\r\n this.drawMap();\r\n });\r\n }\r\n\r\n private setupEventListeners() {\r\n if (!this.polygonCanvas) return;\r\n\r\n this.polygonCanvas.addEventListener(\"mousedown\", this.handleMouseDown, {\r\n passive: false,\r\n });\r\n this.polygonCanvas.addEventListener(\r\n \"touchstart\",\r\n this.handleTouchStart,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\"mousemove\", this.handleMouseMove, {\r\n passive: true,\r\n });\r\n this.polygonCanvas.addEventListener(\r\n \"mouseleave\",\r\n this.handleMouseLeave,\r\n {\r\n passive: true,\r\n },\r\n );\r\n\r\n // Document-level event listeners for drag operations\r\n document.addEventListener(\"mousemove\", this.handleMouseMove, {\r\n passive: true,\r\n });\r\n document.addEventListener(\"touchmove\", this.handleTouchMove, {\r\n passive: false,\r\n });\r\n\r\n document.addEventListener(\"mouseup\", this.handleMouseUp, {\r\n passive: true,\r\n });\r\n document.addEventListener(\"touchend\", this.handleTouchEnd, {\r\n passive: false,\r\n });\r\n\r\n // Additional touch event prevention\r\n this.preventDefaultTouch = (e: TouchEvent) => {\r\n if (e.touches.length > 1) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n this.gestureStartHandler = (e: Event) => e.preventDefault();\r\n this.gestureChangeHandler = (e: Event) => e.preventDefault();\r\n this.gestureEndHandler = (e: Event) => e.preventDefault();\r\n\r\n this.polygonCanvas.addEventListener(\r\n \"touchmove\",\r\n this.preventDefaultTouch,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gesturestart\",\r\n this.gestureStartHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gesturechange\",\r\n this.gestureChangeHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gestureend\",\r\n this.gestureEndHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n }\r\n\r\n private removeEventListeners() {\r\n if (!this.polygonCanvas) return;\r\n\r\n this.polygonCanvas.removeEventListener(\r\n \"mousedown\",\r\n this.handleMouseDown,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"touchstart\",\r\n this.handleTouchStart,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"mousemove\",\r\n this.handleMouseMove,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"mouseleave\",\r\n this.handleMouseLeave,\r\n );\r\n\r\n document.removeEventListener(\"mousemove\", this.handleMouseMove);\r\n document.removeEventListener(\"touchmove\", this.handleTouchMove);\r\n document.removeEventListener(\"mouseup\", this.handleMouseUp);\r\n document.removeEventListener(\"touchend\", this.handleTouchEnd);\r\n\r\n if (this.preventDefaultTouch) {\r\n this.polygonCanvas.removeEventListener(\r\n \"touchmove\",\r\n this.preventDefaultTouch,\r\n );\r\n }\r\n\r\n if (this.gestureStartHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gesturestart\",\r\n this.gestureStartHandler,\r\n );\r\n }\r\n\r\n if (this.gestureChangeHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gesturechange\",\r\n this.gestureChangeHandler,\r\n );\r\n }\r\n\r\n if (this.gestureEndHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gestureend\",\r\n this.gestureEndHandler,\r\n );\r\n }\r\n }\r\n\r\n private handlePolygonsChange(polygon: Polygon) {\r\n this.currentPolygon = polygon;\r\n\r\n // Check if this is the first polygon being closed\r\n if (\r\n polygon.closed && !this.firstPolygonClosed &&\r\n polygon.type === \"roof\"\r\n ) {\r\n this.firstPolygonClosed = true;\r\n this.showMarkEdgeTutorial = true;\r\n }\r\n\r\n if (polygon.closed || this.currentTool !== moveTool) {\r\n this.handleToolSelect(moveTool);\r\n if (polygon.azimuth && polygon.pitch) {\r\n if (this.canvasManager?.getPositionedSolarPanels(polygon.id)) {\r\n this.calculateSolarPanels(false);\r\n }\r\n return;\r\n }\r\n\r\n const bestMatch = getBestFittingRoofSegment(\r\n polygon,\r\n this.buildingInsights?.solarPotential.roofSegmentStats ?? [],\r\n this.rgbTiff.bounds,\r\n this.canvasElement,\r\n );\r\n if (!bestMatch) {\r\n const newPolygon = {\r\n ...polygon,\r\n azimuth: 180,\r\n pitch: 35,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n return;\r\n }\r\n const newPolygon = {\r\n ...polygon,\r\n azimuth: polygon.azimuth || bestMatch.azimuthDegrees,\r\n pitch: polygon.pitch || bestMatch.pitchDegrees,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n }\r\n\r\n if (\r\n polygon.closed &&\r\n this.canvasManager?.getPositionedSolarPanels(polygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n }\r\n }\r\n\r\n private handleMouseUp = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n this.canvasManager.handleMouseUp(event);\r\n };\r\n\r\n private handleTouchEnd = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (this.isTargetCanvas(target)) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n this.canvasManager.handleTouchEnd(event);\r\n };\r\n\r\n private handleTouchMove = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (this.isTargetCanvas(target)) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n this.canvasManager.handleTouchMove(event, rect);\r\n };\r\n\r\n private handleMouseMove = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n const rect = this.polygonCanvas?.getBoundingClientRect();\r\n this.canvasManager.handleMouseMove(event, rect);\r\n };\r\n\r\n private handleMouseLeave = () => {\r\n if (!this.canvasManager) return;\r\n this.canvasManager.handleMouseLeave();\r\n };\r\n\r\n private handleMouseDown = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n const rect = this.polygonCanvas?.getBoundingClientRect();\r\n this.canvasManager.handleMouseDown(event, rect);\r\n };\r\n\r\n private handleTouchStart = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (!this.isTargetCanvas(target)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const now = Date.now();\r\n\r\n // Prevent double tap zoom with a longer timeout\r\n if (now - this.interaction.lastTouchTime < 500) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n this.interaction = {\r\n ...this.interaction,\r\n lastTouchTime: now,\r\n };\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n this.canvasManager.handleTouchStart(event, rect);\r\n };\r\n\r\n private isTargetCanvas(target: Element): boolean {\r\n if (!this.polygonCanvas || !this.canvasElement) return false;\r\n\r\n return target === this.polygonCanvas ||\r\n target === this.canvasElement ||\r\n this.polygonCanvas.contains(target) ||\r\n this.canvasElement.contains(target);\r\n }\r\n\r\n private sizeCanvas(width: number, height: number) {\r\n if (this.canvasElement) {\r\n this.canvasElement.width = width;\r\n this.canvasElement.height = height;\r\n }\r\n\r\n if (this.polygonCanvas) {\r\n this.polygonCanvas.width = width;\r\n this.polygonCanvas.height = height;\r\n this.polygonCtx = this.polygonCanvas.getContext(\"2d\");\r\n\r\n if (this.canvasManager) {\r\n this.canvasManager.updateCanvasSize({\r\n width: width,\r\n height: height,\r\n });\r\n }\r\n }\r\n }\r\n\r\n async getBuildingInsights() {\r\n if (!state.latitude || !state.longitude) {\r\n return;\r\n }\r\n\r\n if (this.buildingInsights) {\r\n const sameLocation =\r\n this.buildingInsights.center.latitude === state.latitude &&\r\n this.buildingInsights.center.longitude === state.longitude;\r\n if (sameLocation) {\r\n return;\r\n }\r\n this.solarSystem = {};\r\n this.canvasElement?.getContext(\"2d\")?.clearRect(\r\n 0,\r\n 0,\r\n this.canvasElement.width,\r\n this.canvasElement.height,\r\n );\r\n this.polygonCtx?.clearRect(\r\n 0,\r\n 0,\r\n this.polygonCanvas.width,\r\n this.polygonCanvas.height,\r\n );\r\n this.rgbTiff = null;\r\n this.canvasManager?.clearPolygons();\r\n\r\n // Reset tutorial states for new location\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n }\r\n try {\r\n this.buildingInsights = await fetchSolarData(\r\n state.latitude,\r\n state.longitude,\r\n this.apiKey,\r\n );\r\n if (!this.buildingInsights) {\r\n console.error(\r\n \"No building insights found. Please enter them manually.\",\r\n );\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to get building insights:\", error);\r\n }\r\n }\r\n\r\n async getBuildingImages() {\r\n if (!state.latitude || !state.longitude) {\r\n return;\r\n }\r\n\r\n // Check if we already have building insights for the same location\r\n if (this.buildingInsights) {\r\n const sameLocation =\r\n this.buildingInsights.center.latitude === state.latitude &&\r\n this.buildingInsights.center.longitude === state.longitude;\r\n if (sameLocation) {\r\n return;\r\n }\r\n }\r\n\r\n try {\r\n this.rgbTiff = await getBuildingImages(\r\n state.latitude,\r\n state.longitude,\r\n this.apiKey,\r\n state.radiusMeters,\r\n );\r\n if (this.rgbTiff) {\r\n this.pixelInMeters = getPixelInMeters(this.rgbTiff);\r\n if (this.canvasManager) {\r\n this.canvasManager.setMeterToPixelRatio(this.pixelInMeters);\r\n }\r\n // this.loadingState = \"loaded\";\r\n } else {\r\n this.loadingState = \"error\";\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to get building images:\", error);\r\n this.loadingState = \"error\";\r\n }\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n @Watch(\"canvasElement\")\r\n async drawMap() {\r\n if (!this.canvasElement || !this.rgbTiff) {\r\n return;\r\n }\r\n\r\n // Ensure canvas is properly sized\r\n if (!this.canvasElement || !this.rgbTiff) {\r\n return;\r\n }\r\n\r\n // Ensure canvas is properly sized\r\n this.sizeCanvas(this.rgbTiff.width, this.rgbTiff.height);\r\n // Add a small delay to ensure canvas sizing is complete\r\n await new Promise((resolve) => setTimeout(resolve, 0));\r\n // Add a small delay to ensure canvas sizing is complete\r\n await new Promise((resolve) => setTimeout(resolve, 0));\r\n\r\n try {\r\n renderRGB(this.rgbTiff, undefined, this.canvasElement);\r\n this.loadingState = \"loaded\";\r\n } catch (error) {\r\n console.error(\"Failed to render RGB image:\", error);\r\n }\r\n }\r\n\r\n private undo() {\r\n if (this.canvasManager?.canUndo()) {\r\n this.canvasManager.undo();\r\n\r\n // Map harmonia-draw Tool enum back to local Tool\r\n const harmoniaTool = this.canvasManager.getState().selectedTool;\r\n switch (harmoniaTool) {\r\n case Tool.ROOF_POLYGON:\r\n this.currentTool = roofTool;\r\n break;\r\n case Tool.OBSTRUCTION_POLYGON:\r\n this.currentTool = obstructionTool;\r\n break;\r\n case Tool.MOVE:\r\n this.currentTool = moveTool;\r\n break;\r\n case Tool.MARK_ROOF_EDGE:\r\n this.currentTool = markRoofEdgeTool;\r\n break;\r\n default:\r\n this.currentTool = moveTool;\r\n break;\r\n }\r\n\r\n // Show toast message\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(t.mapDraw.toast.undoSuccess, \"success\");\r\n\r\n // if (!this.currentPolygon?.closed) {\r\n // this.handleToolSelect(roofTool);\r\n // }\r\n }\r\n }\r\n\r\n private calculateSolarPanels(showToast: boolean = false) {\r\n if (this.currentPolygon) {\r\n this.calculateSolarPanelsForPolygon(this.currentPolygon, false);\r\n\r\n // Show toast message only when explicitly requested\r\n if (showToast) {\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(\r\n t.mapDraw.toast.calculateSolarPanelsSuccess,\r\n \"success\",\r\n );\r\n }\r\n }\r\n }\r\n\r\n private markAsFlatRoof() {\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n pitch: 15,\r\n azimuth: 180, // East orientation\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n this.calculateSolarPanelsForPolygon(newPolygon, true);\r\n\r\n // Show toast message\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(\r\n t.mapDraw.toast.markAsFlatRoofSuccess,\r\n \"info\",\r\n );\r\n\r\n // Auto-select the mark roof edge tool\r\n this.handleToolSelect(markRoofEdgeTool);\r\n }\r\n }\r\n\r\n private calculateSolarPanelsForPolygon(\r\n polygon: Polygon,\r\n isFlatRoof: boolean,\r\n ) {\r\n const convertedSolarPanel: SolarPanelType = {\r\n ...this.solarPanel,\r\n widthMeters: this.solarPanel.widthMeters / this.pixelInMeters,\r\n heightMeters: this.solarPanel.heightMeters / this.pixelInMeters,\r\n };\r\n const inset = BORDER_INSET / this.pixelInMeters;\r\n const solarPanels = getOptimalSolarPositionFully(\r\n polygon,\r\n this.canvasManager.getObstacles(),\r\n convertedSolarPanel,\r\n polygon.azimuth,\r\n inset,\r\n polygon.pitch,\r\n state.settings.columnSpacing,\r\n state.settings.rowSpacing,\r\n );\r\n\r\n this.canvasManager.setPositionedSolarPanel(polygon.id, solarPanels);\r\n\r\n // Convert PositionedSolarPanel[] to SolarPanelSystemPart format\r\n const allPositionedPanels = this.canvasManager\r\n .getAllPositionedSolarPanels();\r\n this.solarSystem = Object.keys(allPositionedPanels).reduce(\r\n (acc, polygonId) => {\r\n acc[polygonId] = {\r\n numberOfPanels: allPositionedPanels[polygonId].length,\r\n panelType: this.solarPanel,\r\n pitch: polygon.pitch,\r\n azimuth: polygon.azimuth,\r\n roofArea: polygon.area,\r\n isFlatRoof: isFlatRoof,\r\n inverterType: \"central\",\r\n };\r\n return acc;\r\n },\r\n {} as { [id: string]: SolarSystem },\r\n );\r\n }\r\n\r\n private handlePitchChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n const pitch = parseFloat(target.value);\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n pitch: pitch,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n }\r\n if (\r\n this.currentPolygon?.type === \"roof\" &&\r\n this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n return;\r\n }\r\n }\r\n\r\n private handleAzimuthChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n const displayAzimuth = parseFloat(target.value);\r\n const azimuth = (displayAzimuth + 270) % 360;\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n azimuth: azimuth,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n }\r\n if (\r\n this.currentPolygon?.type === \"roof\" &&\r\n this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n return;\r\n }\r\n }\r\n\r\n private handleToolSelect(tool: LegacyTool) {\r\n if (\r\n this.currentPolygon && !this.currentPolygon.closed &&\r\n this.currentPolygon.points.length > 0\r\n ) {\r\n alert(\"Please close the polygon before selecting a tool\");\r\n return;\r\n }\r\n\r\n this.currentTool = tool;\r\n\r\n // Map legacy tools to harmonia-draw tools\r\n if (this.canvasManager) {\r\n switch (tool.name) {\r\n case \"roof\":\r\n this.canvasManager.setSelectedTool(Tool.ROOF_POLYGON);\r\n break;\r\n case \"obstruction\":\r\n this.canvasManager.setSelectedTool(\r\n Tool.OBSTRUCTION_POLYGON,\r\n );\r\n break;\r\n case \"move\":\r\n this.canvasManager.setSelectedTool(Tool.MOVE);\r\n break;\r\n case \"markRoofEdge\":\r\n this.canvasManager.setSelectedTool(Tool.MARK_ROOF_EDGE);\r\n break;\r\n default:\r\n // For other tools like delete, etc., we handle them manually\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private handleSettingsClose = () => {\r\n this.showSettings = false;\r\n };\r\n\r\n private handleSettingsSave = (event: CustomEvent<Settings>) => {\r\n state.settings = event.detail;\r\n state.settingsVersion++;\r\n };\r\n\r\n private handleTutorialClose = () => {\r\n this.showTutorial = false;\r\n };\r\n\r\n private handleMarkEdgeTutorialClose = () => {\r\n this.showMarkEdgeTutorial = false;\r\n this.handleToolSelect(markRoofEdgeTool);\r\n };\r\n\r\n private handleAdditionalToolsTutorialClose = () => {\r\n this.showAdditionalToolsTutorial = false;\r\n };\r\n\r\n private showToastMessage(\r\n message: string,\r\n type: \"success\" | \"info\" | \"warning\" | \"error\" = \"success\",\r\n ) {\r\n this.toastMessage = message;\r\n this.toastType = type;\r\n this.showToast = true;\r\n\r\n // Hide toast after 3 seconds\r\n setTimeout(() => {\r\n this.showToast = false;\r\n }, 3000);\r\n }\r\n\r\n render() {\r\n const t = getLanguageStrings(state.settings.language);\r\n return (\r\n <div\r\n class=\"flex flex-col justify-center items-center w-full h-full gap-4\"\r\n id=\"map-draw\"\r\n >\r\n {this.showTutorial && (\r\n <tutorial-component\r\n onClose={this.handleTutorialClose}\r\n title={t.mapDraw.tutorial.title}\r\n description={t.mapDraw.tutorial.description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial1.mp4\",\r\n )}\r\n />\r\n )}\r\n {this.showMarkEdgeTutorial && (\r\n <tutorial-component\r\n onClose={this.handleMarkEdgeTutorialClose}\r\n title={t.mapDraw.tutorial.markEdge.title}\r\n description={t.mapDraw.tutorial.markEdge\r\n .description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial2.mp4\",\r\n )}\r\n />\r\n )}\r\n {this.showAdditionalToolsTutorial && (\r\n <tutorial-component\r\n onClose={this\r\n .handleAdditionalToolsTutorialClose}\r\n title={t.mapDraw.tutorial.additionalTools.title}\r\n description={t.mapDraw.tutorial.additionalTools\r\n .description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial3.mp4\",\r\n )}\r\n />\r\n )}\r\n {(state.latitude && state.longitude &&\r\n this.loadingState === \"loading\") && (\r\n <div class=\"flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl\">\r\n <div class=\"animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-secondary\">\r\n </div>\r\n </div>\r\n )}\r\n {(state.latitude && state.longitude &&\r\n this.loadingState === \"error\") && (\r\n <div class=\"flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl\">\r\n <div class=\"text-red-500 text-center text-lg font-semibold\">\r\n {t.mapDraw.imageLoadError}\r\n </div>\r\n </div>\r\n )}\r\n <div class=\"flex items-start justify-center w-full bg-primary rounded-4xl\">\r\n <div\r\n class=\"relative flex items-center justify-center w-full rounded-4xl bg-secondary\"\r\n style={{\r\n aspectRatio: this.rgbTiff\r\n ? `${this.rgbTiff.width}/${this.rgbTiff.height}`\r\n : \"\",\r\n }}\r\n >\r\n <canvas\r\n ref={(el) => this.canvasElement = el}\r\n class=\"absolute top-0 left-0 w-full h-full rounded-4xl\"\r\n id=\"map-draw-canvas\"\r\n style={{\r\n cursor: this.currentTool.cursor,\r\n }}\r\n >\r\n </canvas>\r\n <canvas\r\n ref={(el) => this.polygonCanvas = el}\r\n class=\"absolute top-0 left-0 w-full h-full rounded-4xl\"\r\n style={{\r\n cursor: this.currentTool.cursor,\r\n }}\r\n >\r\n </canvas>\r\n </div>\r\n </div>\r\n\r\n {this.rgbTiff && (\r\n <div class=\"w-full\">\r\n <div class=\"w-full pb-4\">\r\n <tool-box\r\n currentTool={this.currentTool}\r\n onToolSelect={(tool) =>\r\n this.handleToolSelect(tool)}\r\n undoCallback={() => this.undo()}\r\n />\r\n </div>\r\n\r\n <div class=\"w-full\">\r\n <polygon-information\r\n currentPolygon={this.currentPolygon}\r\n numberOfPanels={this.currentPolygon\r\n ? this\r\n .solarSystem[this.currentPolygon.id]\r\n ?.numberOfPanels\r\n : undefined}\r\n handleAzimuthChange={(event) =>\r\n this.handleAzimuthChange(event)}\r\n handlePitchChange={(event) =>\r\n this.handlePitchChange(event)}\r\n calculateSolarPanels={() =>\r\n this.calculateSolarPanels(true)}\r\n markAsFlatRoof={() => this.markAsFlatRoof()}\r\n currentTool={this.currentTool.name}\r\n />\r\n </div>\r\n <div class=\"w-full\">\r\n <solar-system-form\r\n systemConfigs={this.solarSystem}\r\n polygons={this.canvasManager?.getPolygons()}\r\n roofCanvas={this.canvasElement}\r\n polygonCanvas={this.polygonCanvas}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n {this.showSettings && (\r\n <settings-modal\r\n settings={state.settings}\r\n onClose={this.handleSettingsClose}\r\n onSave={this.handleSettingsSave}\r\n />\r\n )}\r\n {this.showToast && (\r\n <toast-notification\r\n message={this.toastMessage}\r\n type={this.toastType}\r\n duration={3000}\r\n />\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"map-draw.js","sourceRoot":"","sources":["../../../src/components/map-draw/map-draw.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\r\n Component,\r\n Element,\r\n getAssetPath,\r\n h,\r\n Prop,\r\n State,\r\n Watch,\r\n} from \"@stencil/core\";\r\n\r\nimport {\r\n BuildingInsightsResponse,\r\n GeoTiff,\r\n Polygon,\r\n SolarPanelType,\r\n} from \"harmonia-types\";\r\nimport {\r\n fetchSolarData,\r\n getBestFittingRoofSegment,\r\n getOptimalSolarPositionFully,\r\n SolarSystem,\r\n} from \"harmonia-sim\";\r\nimport { getBuildingImages } from \"../../utils/solar\";\r\nimport {\r\n CanvasInteraction,\r\n CanvasManager,\r\n CanvasUtils,\r\n ManagerConfigInput,\r\n renderRGB,\r\n Tool,\r\n} from \"harmonia-draw\";\r\nimport {\r\n markRoofEdgeTool,\r\n moveTool,\r\n obstructionTool,\r\n roofTool,\r\n Tool as LegacyTool,\r\n} from \"../../utils/render/tools\";\r\nimport {\r\n DEFAULT_SOLAR_EXPERT_CONFIG,\r\n DEFAULT_SOLAR_PANEL_TYPE,\r\n SolarExpertConfig,\r\n} from \"../../config\";\r\nimport { getPixelInMeters } from \"../../utils/utils\";\r\nimport { BORDER_INSET } from \"../../constants\";\r\nimport { getLanguageStrings } from \"../../utils/lang/general\";\r\nimport { onChange, Settings, state } from \"../../store\";\r\n\r\n@Component({\r\n tag: \"map-draw\",\r\n styleUrl: \"../../output.css\",\r\n shadow: false,\r\n})\r\nexport class MapDraw {\r\n @Prop()\r\n apiKey: string = \"\";\r\n @Prop()\r\n config: SolarExpertConfig = DEFAULT_SOLAR_EXPERT_CONFIG;\r\n @Prop()\r\n solarPanel: SolarPanelType = DEFAULT_SOLAR_PANEL_TYPE;\r\n @Prop()\r\n enableSettings: boolean = false;\r\n\r\n @State()\r\n showInstructions: boolean = true;\r\n @State()\r\n showSettings: boolean = false;\r\n @State()\r\n showTutorial: boolean = false;\r\n @State()\r\n showMarkEdgeTutorial: boolean = false;\r\n @State()\r\n showAdditionalToolsTutorial: boolean = false;\r\n @State()\r\n additionalToolsTutorialShown: boolean = false;\r\n @State()\r\n showObstacleTutorial: boolean = false;\r\n @State()\r\n obstacleTutorialShown: boolean = false;\r\n @State()\r\n firstPolygonClosed: boolean = false;\r\n @State()\r\n zoom: number = 1;\r\n @State()\r\n loadingState: \"empty\" | \"loading\" | \"loaded\" | \"error\" = \"empty\";\r\n @State()\r\n rgbTiff: GeoTiff | null = null;\r\n @State()\r\n currentTool: LegacyTool = roofTool;\r\n @State()\r\n buildingInsights: BuildingInsightsResponse | null = null;\r\n @State()\r\n pixelInMeters: number = 0.2;\r\n @State()\r\n interaction: CanvasInteraction = {\r\n isDrawing: false,\r\n isDragging: false,\r\n lastTouchTime: 0,\r\n };\r\n @State()\r\n currentPolygon: Polygon | null = null;\r\n @State()\r\n solarSystem: { [id: string]: SolarSystem } = {};\r\n @State()\r\n showToast: boolean = false;\r\n @State()\r\n toastMessage: string = \"\";\r\n @State()\r\n toastType: \"success\" | \"info\" | \"warning\" | \"error\" = \"success\";\r\n\r\n @Element()\r\n el: HTMLElement;\r\n private canvasElement?: HTMLCanvasElement;\r\n private polygonCanvas?: HTMLCanvasElement;\r\n private polygonCtx?: CanvasRenderingContext2D;\r\n private canvasManager?: CanvasManager;\r\n private preventDefaultTouch?: (e: TouchEvent) => void;\r\n private gestureStartHandler?: (e: Event) => void;\r\n private gestureChangeHandler?: (e: Event) => void;\r\n private gestureEndHandler?: (e: Event) => void;\r\n private latitudeChangeListener?: () => void;\r\n private longitudeChangeListener?: () => void;\r\n\r\n componentDidLoad() {\r\n // Set up change listeners for latitude and longitude\r\n this.latitudeChangeListener = () => {\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n\r\n // Reset tutorial states for new location\r\n this.resetTutorials();\r\n\r\n // Show tutorial when coordinates are first set\r\n this.showTutorial = true;\r\n }\r\n };\r\n this.longitudeChangeListener = () => {\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n\r\n // Reset tutorial states for new location\r\n this.resetTutorials();\r\n\r\n // Show tutorial when coordinates are first set\r\n this.showTutorial = true;\r\n }\r\n };\r\n\r\n onChange(\"latitude\", this.latitudeChangeListener);\r\n onChange(\"longitude\", this.longitudeChangeListener);\r\n\r\n // Load data if coordinates already exist\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingInsights();\r\n this.getBuildingImages();\r\n\r\n // Show tutorial if coordinates already exist\r\n this.showTutorial = true;\r\n }\r\n\r\n // Wait for the next frame to ensure DOM is ready\r\n requestAnimationFrame(() => {\r\n this.initializeCanvas();\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n this.sizeCanvas(rect.width, rect.height);\r\n });\r\n }\r\n\r\n private initializeCanvas() {\r\n if (this.canvasElement && this.polygonCanvas) {\r\n // Set initial canvas sizes based on container\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n if (rect.width > 0 && rect.height > 0) {\r\n this.canvasElement.width = rect.width;\r\n this.canvasElement.height = rect.height;\r\n this.polygonCanvas.width = rect.width;\r\n this.polygonCanvas.height = rect.height;\r\n this.polygonCtx = this.polygonCanvas.getContext(\"2d\");\r\n }\r\n }\r\n\r\n // Add resize listener\r\n window.addEventListener(\"resize\", this.handleResize);\r\n }\r\n\r\n private handleResize = () => {\r\n if (this.rgbTiff) {\r\n this.drawMap();\r\n }\r\n };\r\n\r\n disconnectedCallback() {\r\n this.removeEventListeners();\r\n window.removeEventListener(\"resize\", this.handleResize);\r\n window.removeEventListener(\"resize\", this.handleResize);\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n setupCanvasManager() {\r\n if (!this.rgbTiff) return;\r\n if (!this.rgbTiff) return;\r\n // if (this.canvasManager) return;\r\n let managerConfig: ManagerConfigInput = {};\r\n if (state.isMobile) {\r\n managerConfig = {\r\n ...managerConfig,\r\n closeDistance: 20,\r\n };\r\n }\r\n this.canvasManager = new CanvasManager({\r\n coordinateSystem: {\r\n width: this.rgbTiff.width,\r\n height: this.rgbTiff.height,\r\n },\r\n onStateChange: () => {\r\n const currentPolygon = this.canvasManager\r\n ?.getCurrentPolygon();\r\n // Calculate area and create a copy to trigger Stencil re-render\r\n this.currentPolygon = currentPolygon\r\n ? {\r\n ...currentPolygon,\r\n points: [...currentPolygon.points],\r\n area: currentPolygon.area,\r\n }\r\n : null;\r\n CanvasUtils.drawState(\r\n this.polygonCtx,\r\n this.canvasManager.getState(),\r\n this.solarPanel,\r\n {\r\n showGrid: false,\r\n showPreview: !state.isMobile,\r\n },\r\n );\r\n },\r\n onPolygonChange: (polygon) => this.handlePolygonsChange(polygon),\r\n onLowerRoofEdgeMarked: () => {\r\n this.calculateSolarPanels(false);\r\n // Show additional tools tutorial after mark edge tutorial is completed\r\n if (!this.additionalToolsTutorialShown) {\r\n this.showAdditionalToolsTutorial = true;\r\n this.additionalToolsTutorialShown = true;\r\n }\r\n },\r\n }, managerConfig);\r\n\r\n console.log(\"debug\", this.canvasManager?.getDebugString());\r\n\r\n // Add event listeners after canvas is initialized\r\n this.setupEventListeners();\r\n\r\n // Draw map after canvas manager is set up\r\n requestAnimationFrame(() => {\r\n this.drawMap();\r\n });\r\n\r\n // Draw map after canvas manager is set up\r\n requestAnimationFrame(() => {\r\n this.drawMap();\r\n });\r\n }\r\n\r\n private setupEventListeners() {\r\n if (!this.polygonCanvas) return;\r\n\r\n this.polygonCanvas.addEventListener(\"mousedown\", this.handleMouseDown, {\r\n passive: false,\r\n });\r\n this.polygonCanvas.addEventListener(\r\n \"touchstart\",\r\n this.handleTouchStart,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\"mousemove\", this.handleMouseMove, {\r\n passive: true,\r\n });\r\n this.polygonCanvas.addEventListener(\r\n \"mouseleave\",\r\n this.handleMouseLeave,\r\n {\r\n passive: true,\r\n },\r\n );\r\n\r\n // Document-level event listeners for drag operations\r\n document.addEventListener(\"mousemove\", this.handleMouseMove, {\r\n passive: true,\r\n });\r\n document.addEventListener(\"touchmove\", this.handleTouchMove, {\r\n passive: false,\r\n });\r\n\r\n document.addEventListener(\"mouseup\", this.handleMouseUp, {\r\n passive: true,\r\n });\r\n document.addEventListener(\"touchend\", this.handleTouchEnd, {\r\n passive: false,\r\n });\r\n\r\n // Additional touch event prevention\r\n this.preventDefaultTouch = (e: TouchEvent) => {\r\n if (e.touches.length > 1) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n this.gestureStartHandler = (e: Event) => e.preventDefault();\r\n this.gestureChangeHandler = (e: Event) => e.preventDefault();\r\n this.gestureEndHandler = (e: Event) => e.preventDefault();\r\n\r\n this.polygonCanvas.addEventListener(\r\n \"touchmove\",\r\n this.preventDefaultTouch,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gesturestart\",\r\n this.gestureStartHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gesturechange\",\r\n this.gestureChangeHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n this.polygonCanvas.addEventListener(\r\n \"gestureend\",\r\n this.gestureEndHandler,\r\n {\r\n passive: false,\r\n },\r\n );\r\n }\r\n\r\n private removeEventListeners() {\r\n if (!this.polygonCanvas) return;\r\n\r\n this.polygonCanvas.removeEventListener(\r\n \"mousedown\",\r\n this.handleMouseDown,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"touchstart\",\r\n this.handleTouchStart,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"mousemove\",\r\n this.handleMouseMove,\r\n );\r\n this.polygonCanvas.removeEventListener(\r\n \"mouseleave\",\r\n this.handleMouseLeave,\r\n );\r\n\r\n document.removeEventListener(\"mousemove\", this.handleMouseMove);\r\n document.removeEventListener(\"touchmove\", this.handleTouchMove);\r\n document.removeEventListener(\"mouseup\", this.handleMouseUp);\r\n document.removeEventListener(\"touchend\", this.handleTouchEnd);\r\n\r\n if (this.preventDefaultTouch) {\r\n this.polygonCanvas.removeEventListener(\r\n \"touchmove\",\r\n this.preventDefaultTouch,\r\n );\r\n }\r\n\r\n if (this.gestureStartHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gesturestart\",\r\n this.gestureStartHandler,\r\n );\r\n }\r\n\r\n if (this.gestureChangeHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gesturechange\",\r\n this.gestureChangeHandler,\r\n );\r\n }\r\n\r\n if (this.gestureEndHandler) {\r\n this.polygonCanvas.removeEventListener(\r\n \"gestureend\",\r\n this.gestureEndHandler,\r\n );\r\n }\r\n }\r\n\r\n private handlePolygonsChange(polygon: Polygon) {\r\n this.currentPolygon = polygon;\r\n // Check if this is the first polygon being closed\r\n if (\r\n polygon.closed && !this.firstPolygonClosed &&\r\n polygon.type === \"roof\"\r\n ) {\r\n this.firstPolygonClosed = true;\r\n // Show obstacle tutorial first instead of mark edge tutorial\r\n this.showObstacleTutorial = true;\r\n }\r\n\r\n // Show mark edge tutorial when an obstacle polygon is closed (if obstacle tutorial was shown)\r\n if (\r\n polygon.closed &&\r\n polygon.type === \"obstruction\" &&\r\n this.obstacleTutorialShown &&\r\n !this.showMarkEdgeTutorial &&\r\n !this.showObstacleTutorial\r\n ) {\r\n this.showMarkEdgeTutorial = true;\r\n }\r\n\r\n if (polygon.closed || this.currentTool !== moveTool) {\r\n this.handleToolSelect(moveTool);\r\n if (polygon.azimuth && polygon.pitch) {\r\n if (this.canvasManager?.getPositionedSolarPanels(polygon.id)) {\r\n this.calculateSolarPanels(false);\r\n }\r\n return;\r\n }\r\n\r\n const bestMatch = getBestFittingRoofSegment(\r\n polygon,\r\n this.buildingInsights?.solarPotential.roofSegmentStats ?? [],\r\n this.rgbTiff.bounds,\r\n this.canvasElement,\r\n );\r\n if (!bestMatch) {\r\n const newPolygon = {\r\n ...polygon,\r\n azimuth: 180,\r\n pitch: 35,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n return;\r\n }\r\n const newPolygon = {\r\n ...polygon,\r\n azimuth: polygon.azimuth || bestMatch.azimuthDegrees,\r\n pitch: polygon.pitch || bestMatch.pitchDegrees,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n }\r\n\r\n if (\r\n polygon.closed &&\r\n this.canvasManager?.getPositionedSolarPanels(polygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n }\r\n }\r\n\r\n private handleMouseUp = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n this.canvasManager.handleMouseUp(event);\r\n };\r\n\r\n private handleTouchEnd = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (this.isTargetCanvas(target)) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n this.canvasManager.handleTouchEnd(event);\r\n };\r\n\r\n private handleTouchMove = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (this.isTargetCanvas(target)) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n this.canvasManager.handleTouchMove(event, rect);\r\n };\r\n\r\n private handleMouseMove = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n const rect = this.polygonCanvas?.getBoundingClientRect();\r\n this.canvasManager.handleMouseMove(event, rect);\r\n };\r\n\r\n private handleMouseLeave = () => {\r\n if (!this.canvasManager) return;\r\n this.canvasManager.handleMouseLeave();\r\n };\r\n\r\n private handleMouseDown = (event: MouseEvent) => {\r\n if (!this.canvasManager) return;\r\n const rect = this.polygonCanvas?.getBoundingClientRect();\r\n this.canvasManager.handleMouseDown(event, rect);\r\n };\r\n\r\n private handleTouchStart = (event: TouchEvent) => {\r\n if (!this.polygonCanvas || !this.canvasManager) return;\r\n\r\n // Only prevent default if the touch is on the canvas\r\n const target = event.target as Element;\r\n if (!this.isTargetCanvas(target)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const now = Date.now();\r\n\r\n // Prevent double tap zoom with a longer timeout\r\n if (now - this.interaction.lastTouchTime < 500) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n this.interaction = {\r\n ...this.interaction,\r\n lastTouchTime: now,\r\n };\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n this.canvasManager.handleTouchStart(event, rect);\r\n };\r\n\r\n private isTargetCanvas(target: Element): boolean {\r\n if (!this.polygonCanvas || !this.canvasElement) return false;\r\n\r\n return target === this.polygonCanvas ||\r\n target === this.canvasElement ||\r\n this.polygonCanvas.contains(target) ||\r\n this.canvasElement.contains(target);\r\n }\r\n\r\n private sizeCanvas(width: number, height: number) {\r\n if (this.canvasElement) {\r\n this.canvasElement.width = width;\r\n this.canvasElement.height = height;\r\n }\r\n\r\n if (this.polygonCanvas) {\r\n this.polygonCanvas.width = width;\r\n this.polygonCanvas.height = height;\r\n this.polygonCtx = this.polygonCanvas.getContext(\"2d\");\r\n\r\n if (this.canvasManager) {\r\n this.canvasManager.updateCanvasSize({\r\n width: width,\r\n height: height,\r\n });\r\n }\r\n }\r\n }\r\n\r\n async getBuildingInsights() {\r\n if (!state.latitude || !state.longitude) {\r\n return;\r\n }\r\n\r\n if (this.buildingInsights) {\r\n const sameLocation =\r\n this.buildingInsights.center.latitude === state.latitude &&\r\n this.buildingInsights.center.longitude === state.longitude;\r\n if (sameLocation) {\r\n return;\r\n }\r\n this.solarSystem = {};\r\n this.canvasElement?.getContext(\"2d\")?.clearRect(\r\n 0,\r\n 0,\r\n this.canvasElement.width,\r\n this.canvasElement.height,\r\n );\r\n this.polygonCtx?.clearRect(\r\n 0,\r\n 0,\r\n this.polygonCanvas.width,\r\n this.polygonCanvas.height,\r\n );\r\n this.rgbTiff = null;\r\n this.canvasManager?.clearPolygons();\r\n\r\n // Reset tutorial states for new location\r\n this.resetTutorials();\r\n }\r\n try {\r\n this.buildingInsights = await fetchSolarData(\r\n state.latitude,\r\n state.longitude,\r\n this.apiKey,\r\n );\r\n if (!this.buildingInsights) {\r\n console.error(\r\n \"No building insights found. Please enter them manually.\",\r\n );\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to get building insights:\", error);\r\n }\r\n }\r\n\r\n async getBuildingImages() {\r\n if (!state.latitude || !state.longitude) {\r\n return;\r\n }\r\n\r\n // Check if we already have building insights for the same location\r\n if (this.buildingInsights) {\r\n const sameLocation =\r\n this.buildingInsights.center.latitude === state.latitude &&\r\n this.buildingInsights.center.longitude === state.longitude;\r\n if (sameLocation) {\r\n return;\r\n }\r\n }\r\n\r\n try {\r\n this.rgbTiff = await getBuildingImages(\r\n state.latitude,\r\n state.longitude,\r\n this.apiKey,\r\n state.radiusMeters,\r\n );\r\n if (this.rgbTiff) {\r\n this.pixelInMeters = getPixelInMeters(this.rgbTiff);\r\n if (this.canvasManager) {\r\n this.canvasManager.setMeterToPixelRatio(this.pixelInMeters);\r\n }\r\n // this.loadingState = \"loaded\";\r\n } else {\r\n this.loadingState = \"error\";\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to get building images:\", error);\r\n this.loadingState = \"error\";\r\n }\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n @Watch(\"canvasElement\")\r\n async drawMap() {\r\n if (!this.canvasElement || !this.rgbTiff) {\r\n return;\r\n }\r\n\r\n // Ensure canvas is properly sized\r\n if (!this.canvasElement || !this.rgbTiff) {\r\n return;\r\n }\r\n\r\n // Ensure canvas is properly sized\r\n this.sizeCanvas(this.rgbTiff.width, this.rgbTiff.height);\r\n // Add a small delay to ensure canvas sizing is complete\r\n await new Promise((resolve) => setTimeout(resolve, 0));\r\n // Add a small delay to ensure canvas sizing is complete\r\n await new Promise((resolve) => setTimeout(resolve, 0));\r\n\r\n try {\r\n renderRGB(this.rgbTiff, undefined, this.canvasElement);\r\n this.loadingState = \"loaded\";\r\n } catch (error) {\r\n console.error(\"Failed to render RGB image:\", error);\r\n }\r\n }\r\n\r\n private undo() {\r\n if (this.canvasManager?.canUndo()) {\r\n this.canvasManager.undo();\r\n\r\n // Map harmonia-draw Tool enum back to local Tool\r\n const harmoniaTool = this.canvasManager.getState().selectedTool;\r\n switch (harmoniaTool) {\r\n case Tool.ROOF_POLYGON:\r\n this.currentTool = roofTool;\r\n break;\r\n case Tool.OBSTRUCTION_POLYGON:\r\n this.currentTool = obstructionTool;\r\n break;\r\n case Tool.MOVE:\r\n this.currentTool = moveTool;\r\n break;\r\n case Tool.MARK_ROOF_EDGE:\r\n this.currentTool = markRoofEdgeTool;\r\n break;\r\n default:\r\n this.currentTool = moveTool;\r\n break;\r\n }\r\n\r\n // Show toast message\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(t.mapDraw.toast.undoSuccess, \"success\");\r\n\r\n // if (!this.currentPolygon?.closed) {\r\n // this.handleToolSelect(roofTool);\r\n // }\r\n }\r\n }\r\n\r\n private calculateSolarPanels(showToast: boolean = false) {\r\n if (this.currentPolygon) {\r\n this.calculateSolarPanelsForPolygon(this.currentPolygon, false);\r\n\r\n // Show toast message only when explicitly requested\r\n if (showToast) {\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(\r\n t.mapDraw.toast.calculateSolarPanelsSuccess,\r\n \"success\",\r\n );\r\n }\r\n }\r\n }\r\n\r\n private markAsFlatRoof() {\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n pitch: 15,\r\n azimuth: 180, // East orientation\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n this.calculateSolarPanelsForPolygon(newPolygon, true);\r\n\r\n // Show toast message\r\n const t = getLanguageStrings(state.settings.language);\r\n this.showToastMessage(\r\n t.mapDraw.toast.markAsFlatRoofSuccess,\r\n \"info\",\r\n );\r\n\r\n // Auto-select the mark roof edge tool\r\n this.handleToolSelect(markRoofEdgeTool);\r\n }\r\n }\r\n\r\n private calculateSolarPanelsForPolygon(\r\n polygon: Polygon,\r\n isFlatRoof: boolean,\r\n ) {\r\n const convertedSolarPanel: SolarPanelType = {\r\n ...this.solarPanel,\r\n widthMeters: this.solarPanel.widthMeters / this.pixelInMeters,\r\n heightMeters: this.solarPanel.heightMeters / this.pixelInMeters,\r\n };\r\n const inset = BORDER_INSET / this.pixelInMeters;\r\n const solarPanels = getOptimalSolarPositionFully(\r\n polygon,\r\n this.canvasManager.getObstacles(),\r\n convertedSolarPanel,\r\n polygon.azimuth,\r\n inset,\r\n polygon.pitch,\r\n state.settings.columnSpacing,\r\n state.settings.rowSpacing,\r\n );\r\n\r\n this.canvasManager.setPositionedSolarPanel(polygon.id, solarPanels);\r\n\r\n // Convert PositionedSolarPanel[] to SolarPanelSystemPart format\r\n const allPositionedPanels = this.canvasManager\r\n .getAllPositionedSolarPanels();\r\n this.solarSystem = Object.keys(allPositionedPanels).reduce(\r\n (acc, polygonId) => {\r\n acc[polygonId] = {\r\n numberOfPanels: allPositionedPanels[polygonId].length,\r\n panelType: this.solarPanel,\r\n pitch: polygon.pitch,\r\n azimuth: polygon.azimuth,\r\n roofArea: polygon.area,\r\n isFlatRoof: isFlatRoof,\r\n inverterType: \"central\",\r\n };\r\n return acc;\r\n },\r\n {} as { [id: string]: SolarSystem },\r\n );\r\n }\r\n\r\n private handlePitchChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n const pitch = parseFloat(target.value);\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n pitch: pitch,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n }\r\n if (\r\n this.currentPolygon?.type === \"roof\" &&\r\n this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n return;\r\n }\r\n }\r\n\r\n private handleAzimuthChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n const displayAzimuth = parseFloat(target.value);\r\n const azimuth = (displayAzimuth + 270) % 360;\r\n if (this.currentPolygon) {\r\n const newPolygon = {\r\n ...this.currentPolygon,\r\n azimuth: azimuth,\r\n };\r\n this.canvasManager?.updatePolygon(newPolygon);\r\n this.currentPolygon = newPolygon;\r\n }\r\n if (\r\n this.currentPolygon?.type === \"roof\" &&\r\n this.canvasManager?.getPositionedSolarPanels(this.currentPolygon.id)\r\n ) {\r\n this.calculateSolarPanels(false);\r\n return;\r\n }\r\n }\r\n\r\n private handleToolSelect(tool: LegacyTool) {\r\n if (\r\n this.currentPolygon && !this.currentPolygon.closed &&\r\n this.currentPolygon.points.length > 0\r\n ) {\r\n alert(\"Please close the polygon before selecting a tool\");\r\n return;\r\n }\r\n\r\n this.currentTool = tool;\r\n\r\n // Map legacy tools to harmonia-draw tools\r\n if (this.canvasManager) {\r\n switch (tool.name) {\r\n case \"roof\":\r\n this.canvasManager.setSelectedTool(Tool.ROOF_POLYGON);\r\n break;\r\n case \"obstruction\":\r\n this.canvasManager.setSelectedTool(\r\n Tool.OBSTRUCTION_POLYGON,\r\n );\r\n break;\r\n case \"move\":\r\n this.canvasManager.setSelectedTool(Tool.MOVE);\r\n break;\r\n case \"markRoofEdge\":\r\n this.canvasManager.setSelectedTool(Tool.MARK_ROOF_EDGE);\r\n break;\r\n default:\r\n // For other tools like delete, etc., we handle them manually\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private handleSettingsClose = () => {\r\n this.showSettings = false;\r\n };\r\n\r\n private handleSettingsSave = (event: CustomEvent<Settings>) => {\r\n state.settings = event.detail;\r\n state.settingsVersion++;\r\n };\r\n\r\n private handleTutorialClose = () => {\r\n this.showTutorial = false;\r\n };\r\n\r\n private handleMarkEdgeTutorialClose = () => {\r\n this.showMarkEdgeTutorial = false;\r\n this.handleToolSelect(markRoofEdgeTool);\r\n };\r\n\r\n private handleAdditionalToolsTutorialClose = () => {\r\n this.showAdditionalToolsTutorial = false;\r\n this.additionalToolsTutorialShown = true;\r\n };\r\n\r\n private handleObstacleTutorialClose = () => {\r\n this.showObstacleTutorial = false;\r\n this.obstacleTutorialShown = true;\r\n this.handleToolSelect(obstructionTool);\r\n };\r\n\r\n private handleObstacleTutorialSkip = () => {\r\n this.showObstacleTutorial = false;\r\n this.obstacleTutorialShown = true;\r\n this.showMarkEdgeTutorial = true;\r\n };\r\n\r\n private showToastMessage(\r\n message: string,\r\n type: \"success\" | \"info\" | \"warning\" | \"error\" = \"success\",\r\n ) {\r\n this.toastMessage = message;\r\n this.toastType = type;\r\n this.showToast = true;\r\n\r\n // Hide toast after 3 seconds\r\n setTimeout(() => {\r\n this.showToast = false;\r\n }, 3000);\r\n }\r\n\r\n private resetTutorials() {\r\n this.showTutorial = false;\r\n this.showMarkEdgeTutorial = false;\r\n this.showAdditionalToolsTutorial = false;\r\n this.showObstacleTutorial = false;\r\n this.additionalToolsTutorialShown = false;\r\n this.obstacleTutorialShown = false;\r\n this.firstPolygonClosed = false;\r\n }\r\n\r\n render() {\r\n const t = getLanguageStrings(state.settings.language);\r\n return (\r\n <div\r\n class=\"flex flex-col justify-center items-center w-full h-full gap-4\"\r\n id=\"map-draw\"\r\n >\r\n {this.showTutorial && (\r\n <tutorial-component\r\n onClose={this.handleTutorialClose}\r\n title={t.mapDraw.tutorial.title}\r\n description={t.mapDraw.tutorial.description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial1.mp4\",\r\n )}\r\n />\r\n )}\r\n {this.showMarkEdgeTutorial && (\r\n <tutorial-component\r\n onClose={this.handleMarkEdgeTutorialClose}\r\n title={t.mapDraw.tutorial.markEdge.title}\r\n description={t.mapDraw.tutorial.markEdge\r\n .description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial2.mp4\",\r\n )}\r\n />\r\n )}\r\n {this.showAdditionalToolsTutorial && (\r\n <tutorial-component\r\n onClose={this\r\n .handleAdditionalToolsTutorialClose}\r\n title={t.mapDraw.tutorial.additionalTools.title}\r\n description={t.mapDraw.tutorial.additionalTools\r\n .description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial3.mp4\",\r\n )}\r\n />\r\n )}\r\n {this.showObstacleTutorial && (\r\n <tutorial-component\r\n onClose={this.handleObstacleTutorialClose}\r\n onSkip={this.handleObstacleTutorialSkip}\r\n showSkipButton={true}\r\n title={t.mapDraw.tutorial.obstacle.title}\r\n description={t.mapDraw.tutorial.obstacle.description}\r\n videoSource={getAssetPath(\r\n \"./assets/tutorial4.mp4\",\r\n )}\r\n />\r\n )}\r\n {(state.latitude && state.longitude &&\r\n this.loadingState === \"loading\") && (\r\n <div class=\"flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl\">\r\n <div class=\"animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-secondary\">\r\n </div>\r\n </div>\r\n )}\r\n {(state.latitude && state.longitude &&\r\n this.loadingState === \"error\") && (\r\n <div class=\"flex items-center justify-center w-full bg-opacity-75 z-20 pt-7 rounded-4xl\">\r\n <div class=\"text-red-500 text-center text-lg font-semibold\">\r\n {t.mapDraw.imageLoadError}\r\n </div>\r\n </div>\r\n )}\r\n <div class=\"flex items-start justify-center w-full bg-primary rounded-4xl\">\r\n <div\r\n class=\"relative flex items-center justify-center w-full rounded-4xl bg-secondary\"\r\n style={{\r\n aspectRatio: this.rgbTiff\r\n ? `${this.rgbTiff.width}/${this.rgbTiff.height}`\r\n : \"\",\r\n }}\r\n >\r\n <canvas\r\n ref={(el) => this.canvasElement = el}\r\n class=\"absolute top-0 left-0 w-full h-full rounded-4xl\"\r\n id=\"map-draw-canvas\"\r\n style={{\r\n cursor: this.currentTool.cursor,\r\n }}\r\n >\r\n </canvas>\r\n <canvas\r\n ref={(el) => this.polygonCanvas = el}\r\n class=\"absolute top-0 left-0 w-full h-full rounded-4xl\"\r\n style={{\r\n cursor: this.currentTool.cursor,\r\n }}\r\n >\r\n </canvas>\r\n </div>\r\n </div>\r\n\r\n {this.rgbTiff && (\r\n <div class=\"w-full\">\r\n <div class=\"w-full pb-4\">\r\n <tool-box\r\n currentTool={this.currentTool}\r\n onToolSelect={(tool) =>\r\n this.handleToolSelect(tool)}\r\n undoCallback={() => this.undo()}\r\n />\r\n </div>\r\n\r\n <div class=\"w-full\">\r\n <polygon-information\r\n currentPolygon={this.currentPolygon}\r\n numberOfPanels={this.currentPolygon\r\n ? this\r\n .solarSystem[this.currentPolygon.id]\r\n ?.numberOfPanels\r\n : undefined}\r\n handleAzimuthChange={(event) =>\r\n this.handleAzimuthChange(event)}\r\n handlePitchChange={(event) =>\r\n this.handlePitchChange(event)}\r\n calculateSolarPanels={() =>\r\n this.calculateSolarPanels(true)}\r\n markAsFlatRoof={() => this.markAsFlatRoof()}\r\n currentTool={this.currentTool.name}\r\n />\r\n </div>\r\n <div class=\"w-full\">\r\n <solar-system-form\r\n systemConfigs={this.solarSystem}\r\n polygons={this.canvasManager?.getPolygons()}\r\n roofCanvas={this.canvasElement}\r\n polygonCanvas={this.polygonCanvas}\r\n pixelInMeters={this.pixelInMeters}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n {this.showSettings && (\r\n <settings-modal\r\n settings={state.settings}\r\n onClose={this.handleSettingsClose}\r\n onSave={this.handleSettingsSave}\r\n />\r\n )}\r\n {this.showToast && (\r\n <toast-notification\r\n message={this.toastMessage}\r\n type={this.toastType}\r\n duration={3000}\r\n />\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|
|
@@ -145,7 +145,7 @@ export class MapSelector {
|
|
|
145
145
|
}
|
|
146
146
|
render() {
|
|
147
147
|
const t = getLanguageStrings(this.language);
|
|
148
|
-
return (h("div", { key: '
|
|
148
|
+
return (h("div", { key: 'b43e7d1d3a150903f2416deb7e18ecb2bff0fb0d', class: "map-selector flex flex-col gap-4 pb-4" }, h("div", { key: '38939c632a7c34d7c6309ce733789751e00ff91c', class: "relative" }, h("div", { key: '259a2feeaa70bfeb8bfc9cc1995487dcadced6b9', class: "absolute left-3 top-0 h-full flex items-center pointer-events-none" }, h("search-icon", { key: '3192d47a9399386623bf42ac3acc755c08303279' })), h("input", { key: 'a1e09b20382e0989641dd9a5599f5966e05c7e89', ref: (el) => this.inputElement = el, type: "text", placeholder: t.solarExpert.searchPlaceholder, class: "w-full pl-10 pr-4 py-2 border border-border rounded-4xl focus:ring-secondary bg-muted" })), h("div", { key: '13af9ba1964284bfbe25d133468280bc9c9522e7', class: "w-full rounded-4xl p-4 bg-overlay" }, t.mapSelector.explanation), h("div", { key: '2b408b3c608a79443d2f68125be9ed7fe62e2a18', class: "flex items-center gap-4" }, h("label", { key: 'a7d1d5915049478989a9556e8248a3284a07770f', class: "text-sm font-medium text-text-muted" }, t.mapSelector.radius), this.isIOS()
|
|
149
149
|
? (h("div", { class: "flex items-center gap-2" }, h("input", { type: "number", min: "5", max: "100", step: "5", class: "flex-1 px-4 py-2 rounded-4xl border border-border focus:ring-2 focus:ring-tertiary focus:border-transparent bg-muted", value: this.radius, onInput: (e) => {
|
|
150
150
|
const value = parseInt(e.target
|
|
151
151
|
.value);
|
|
@@ -158,11 +158,11 @@ export class MapSelector {
|
|
|
158
158
|
}, style: {
|
|
159
159
|
border: "1px solid var(--color-border)",
|
|
160
160
|
} }), h("span", { class: "text-sm text-text-muted" }, "m")))
|
|
161
|
-
: (h("input", { type: "range", min: "5", max: "100", value: this.radius, onInput: (e) => this.handleRadiusChange(e), class: "input-slider w-full custom-range appearance-none rounded-full bg-transparent [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-black/25 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:h-[10px] [&::-webkit-slider-thumb]:w-[10px] [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-muted" })), !this.isIOS() && (h("span", { key: '
|
|
161
|
+
: (h("input", { type: "range", min: "5", max: "100", value: this.radius, onInput: (e) => this.handleRadiusChange(e), class: "input-slider w-full custom-range appearance-none rounded-full bg-transparent [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-black/25 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:h-[10px] [&::-webkit-slider-thumb]:w-[10px] [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-muted" })), !this.isIOS() && (h("span", { key: 'd3dcf31b6a64cae5ecc9dc5c2ca1a1b1033514f1', class: "text-sm text-text-muted" }, this.radius, "m"))), h("button", { key: 'e63c0b5f66ffa42f3d84dff5ea4844fab3b1dc1c', onClick: () => this.handleToggleMapMode(), class: "w-full py-2 px-4 bg-secondary text-muted rounded-4xl hover:bg-overlay transition-colors", style: {
|
|
162
162
|
color: "#ffffff",
|
|
163
163
|
} }, this.isSatelliteMode
|
|
164
164
|
? t.mapSelector.switchToStandard
|
|
165
|
-
: t.mapSelector.switchToSatellite), h("div", { key: '
|
|
165
|
+
: t.mapSelector.switchToSatellite), h("div", { key: 'e7f5340b20ddf519995d518c0066934e612a1ba2', ref: (el) => this.mapElement = el, class: "w-full h-[400px] rounded-4xl border border-border" }), this.showAddressError && (h("div", { key: '1e802e4b460437dadeee0df9c78d4fbe41d63716', class: "w-full p-3 bg-red-100 border border-red-300 rounded-4xl text-red-700 text-sm" }, t.mapSelector.noAddressSelected)), h("button", { key: 'edb59d30e943a765c07aa7a04d4a2d55d92b37de', onClick: () => this.handleAcceptPosition(), class: "w-full py-2 px-4 bg-secondary text-muted rounded-4xl hover:bg-overlay transition-colors", style: {
|
|
166
166
|
color: "#ffffff",
|
|
167
167
|
} }, t.mapSelector.accept)));
|
|
168
168
|
}
|
|
@@ -10,7 +10,7 @@ export class PolygonButtons {
|
|
|
10
10
|
const buttonStyles = {
|
|
11
11
|
border: "1px solid #ccc",
|
|
12
12
|
};
|
|
13
|
-
return (h("div", { key: '
|
|
13
|
+
return (h("div", { key: '9b750e03993ffe090f3012a4e64df71eb1b66a80', class: "flex w-full gap-2 justify-center pb-3" }, h("button", { key: '53c1da0648b2093341e5e13d77d57dbc91642672', class: "px-4 py-2 rounded-4xl hover:bg-muted text-secondary transition-colors duration-200 text-xs", style: buttonStyles, onClick: () => this.markAsFlatRoof() }, t.mapDraw.markAsFlatRoof), h("button", { key: '1dc788893a340b5d05f68d222ac1d3ba29a06865', class: "px-4 py-2 rounded-4xl hover:bg-muted text-secondary transition-colors duration-200 text-xs", style: buttonStyles, onClick: () => this.calculateSolarPanels() }, t.mapDraw.calculateSolarPanels)));
|
|
14
14
|
}
|
|
15
15
|
static get is() { return "polygon-buttons"; }
|
|
16
16
|
static get originalStyleUrls() {
|