blue-chestnut-solar-expert 0.0.18 → 0.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/dist/cjs/eraser-icon.house-icon.icon-selector.map-draw.map-selector.move-icon.octagon-minus-icon.polygon-buttons.polygon-information.search-icon.settings-icon.settings-modal.solar-expert.solar-system-form.tool-box.undo-icon.entry.cjs.js.map +1 -0
  2. package/dist/cjs/eraser-icon_16.cjs.entry.js +3124 -0
  3. package/dist/cjs/eraser-icon_16.cjs.entry.js.map +1 -0
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/loading-widget.cjs.entry.js +2 -2
  6. package/dist/cjs/loading-widget.cjs.entry.js.map +1 -1
  7. package/dist/cjs/loading-widget.entry.cjs.js.map +1 -1
  8. package/dist/cjs/solar-calculator.cjs.entry.js +2 -2
  9. package/dist/cjs/solar-calculator.cjs.entry.js.map +1 -1
  10. package/dist/cjs/solar-calculator.entry.cjs.js.map +1 -1
  11. package/dist/cjs/stencil-library.cjs.js +1 -1
  12. package/dist/collection/collection-manifest.json +1 -0
  13. package/dist/collection/components/icons/icon.js +3 -0
  14. package/dist/collection/components/icons/icon.js.map +1 -1
  15. package/dist/collection/components/icons/undo.js +64 -0
  16. package/dist/collection/components/icons/undo.js.map +1 -0
  17. package/dist/collection/components/map-draw/map-draw.js +65 -22
  18. package/dist/collection/components/map-draw/map-draw.js.map +1 -1
  19. package/dist/collection/components/map-draw/map-selector.js +2 -2
  20. package/dist/collection/components/map-draw/map-selector.js.map +1 -1
  21. package/dist/collection/components/map-draw/polygon-buttons.js +26 -1
  22. package/dist/collection/components/map-draw/polygon-buttons.js.map +1 -1
  23. package/dist/collection/components/map-draw/polygon-information.js +3 -3
  24. package/dist/collection/components/map-draw/polygon-information.js.map +1 -1
  25. package/dist/collection/components/map-draw/tool-box.js +27 -3
  26. package/dist/collection/components/map-draw/tool-box.js.map +1 -1
  27. package/dist/collection/components/settings/settings.js +8 -8
  28. package/dist/collection/components/solar-calculator/solar-calculator.js +1 -1
  29. package/dist/collection/components/solar-expert/solar-expert.js +16 -1
  30. package/dist/collection/components/solar-expert/solar-expert.js.map +1 -1
  31. package/dist/collection/components/solar-system-form/solar-system-form.js +85 -185
  32. package/dist/collection/components/solar-system-form/solar-system-form.js.map +1 -1
  33. package/dist/collection/components/widgets/loading-widget.js +1 -1
  34. package/dist/collection/constants.js +2 -1
  35. package/dist/collection/constants.js.map +1 -1
  36. package/dist/collection/output.css +20 -9
  37. package/dist/collection/store.js +1 -1
  38. package/dist/collection/store.js.map +1 -1
  39. package/dist/collection/types/lang.js.map +1 -1
  40. package/dist/collection/utils/lang/english.js +5 -0
  41. package/dist/collection/utils/lang/english.js.map +1 -1
  42. package/dist/collection/utils/lang/german.js +7 -2
  43. package/dist/collection/utils/lang/german.js.map +1 -1
  44. package/dist/collection/utils/lang/spanish.js +5 -0
  45. package/dist/collection/utils/lang/spanish.js.map +1 -1
  46. package/dist/collection/utils/render/tools.js +7 -0
  47. package/dist/collection/utils/render/tools.js.map +1 -1
  48. package/dist/collection/utils/simulation/simulation.js +109 -0
  49. package/dist/collection/utils/simulation/simulation.js.map +1 -0
  50. package/dist/collection/utils/simulation/solarCurves.js +31 -0
  51. package/dist/collection/utils/simulation/solarCurves.js.map +1 -0
  52. package/dist/collection/utils/simulation/types.js +4 -0
  53. package/dist/collection/utils/simulation/types.js.map +1 -0
  54. package/dist/components/eraser-icon.js +1 -1
  55. package/dist/components/house-icon.js +1 -1
  56. package/dist/components/icon-selector.js +1 -1
  57. package/dist/components/loading-widget.js +2 -2
  58. package/dist/components/loading-widget.js.map +1 -1
  59. package/dist/components/map-draw.js +1 -1
  60. package/dist/components/map-selector.js +1 -1
  61. package/dist/components/move-icon.js +1 -1
  62. package/dist/components/octagon-minus-icon.js +1 -1
  63. package/dist/components/p-BDBrVfn4.js +38 -0
  64. package/dist/components/p-BDBrVfn4.js.map +1 -0
  65. package/dist/components/p-BDrs1Te9.js +38 -0
  66. package/dist/components/p-BDrs1Te9.js.map +1 -0
  67. package/dist/components/p-BbXgEBG5.js +38 -0
  68. package/dist/components/p-BbXgEBG5.js.map +1 -0
  69. package/dist/components/p-Bq1PVegq.js +174 -0
  70. package/dist/components/p-Bq1PVegq.js.map +1 -0
  71. package/dist/components/p-BrVkygdn.js +38 -0
  72. package/dist/components/p-BrVkygdn.js.map +1 -0
  73. package/dist/components/p-BxEeUA4s.js +149 -0
  74. package/dist/components/p-BxEeUA4s.js.map +1 -0
  75. package/dist/components/p-C-_6TJs5.js +164 -0
  76. package/dist/components/p-C-_6TJs5.js.map +1 -0
  77. package/dist/components/{p-BSx-VRl1.js → p-CPLDlLfb.js} +99 -50
  78. package/dist/components/p-CPLDlLfb.js.map +1 -0
  79. package/dist/components/p-CRnyqUKc.js +47 -0
  80. package/dist/components/p-CRnyqUKc.js.map +1 -0
  81. package/dist/components/p-CabEU06O.js +103 -0
  82. package/dist/components/p-CabEU06O.js.map +1 -0
  83. package/dist/components/p-CmFUQbz_.js +507 -0
  84. package/dist/components/p-CmFUQbz_.js.map +1 -0
  85. package/dist/components/p-CumvV0_M.js +38 -0
  86. package/dist/components/p-CumvV0_M.js.map +1 -0
  87. package/dist/components/{p-C5Qpifsm.js → p-CwVUc6Hq.js} +20 -5
  88. package/dist/components/p-CwVUc6Hq.js.map +1 -0
  89. package/dist/components/p-DI6_jwLe.js +38 -0
  90. package/dist/components/p-DI6_jwLe.js.map +1 -0
  91. package/dist/components/p-DPfpDV5e.js +74 -0
  92. package/dist/components/p-DPfpDV5e.js.map +1 -0
  93. package/dist/components/p-DYiK8eDp.js +38 -0
  94. package/dist/components/p-DYiK8eDp.js.map +1 -0
  95. package/dist/components/polygon-buttons.js +1 -1
  96. package/dist/components/polygon-information.js +1 -1
  97. package/dist/components/search-icon.js +1 -1
  98. package/dist/components/settings-icon.js +1 -1
  99. package/dist/components/settings-modal.js +1 -1
  100. package/dist/components/solar-calculator.js +2 -2
  101. package/dist/components/solar-calculator.js.map +1 -1
  102. package/dist/components/solar-expert.js +52 -31
  103. package/dist/components/solar-expert.js.map +1 -1
  104. package/dist/components/solar-system-form.js +1 -1
  105. package/dist/components/tool-box.js +1 -1
  106. package/dist/components/undo-icon.d.ts +11 -0
  107. package/dist/components/undo-icon.js +9 -0
  108. package/dist/components/undo-icon.js.map +1 -0
  109. package/dist/esm/eraser-icon.house-icon.icon-selector.map-draw.map-selector.move-icon.octagon-minus-icon.polygon-buttons.polygon-information.search-icon.settings-icon.settings-modal.solar-expert.solar-system-form.tool-box.undo-icon.entry.js.map +1 -0
  110. package/dist/esm/eraser-icon_16.entry.js +3107 -0
  111. package/dist/esm/eraser-icon_16.entry.js.map +1 -0
  112. package/dist/esm/loader.js +1 -1
  113. package/dist/esm/loading-widget.entry.js +2 -2
  114. package/dist/esm/loading-widget.entry.js.map +1 -1
  115. package/dist/esm/solar-calculator.entry.js +2 -2
  116. package/dist/esm/solar-calculator.entry.js.map +1 -1
  117. package/dist/esm/stencil-library.js +1 -1
  118. package/dist/stencil-library/eraser-icon.house-icon.icon-selector.map-draw.map-selector.move-icon.octagon-minus-icon.polygon-buttons.polygon-information.search-icon.settings-icon.settings-modal.solar-expert.solar-system-form.tool-box.undo-icon.entry.esm.js.map +1 -0
  119. package/dist/stencil-library/loading-widget.entry.esm.js.map +1 -1
  120. package/dist/stencil-library/p-1acfe8c0.entry.js +32 -0
  121. package/dist/stencil-library/{p-04893dc6.entry.js.map → p-1acfe8c0.entry.js.map} +1 -1
  122. package/dist/stencil-library/p-1e2ddc82.entry.js +2 -0
  123. package/dist/stencil-library/p-1e2ddc82.entry.js.map +1 -0
  124. package/dist/stencil-library/p-56f8bd65.entry.js +2 -0
  125. package/dist/stencil-library/p-56f8bd65.entry.js.map +1 -0
  126. package/dist/stencil-library/solar-calculator.entry.esm.js.map +1 -1
  127. package/dist/stencil-library/stencil-library.esm.js +1 -1
  128. package/dist/types/components/icons/undo.d.ts +5 -0
  129. package/dist/types/components/map-draw/map-draw.d.ts +1 -0
  130. package/dist/types/components/map-draw/polygon-buttons.d.ts +1 -0
  131. package/dist/types/components/map-draw/tool-box.d.ts +1 -0
  132. package/dist/types/components/solar-expert/solar-expert.d.ts +1 -0
  133. package/dist/types/components/solar-system-form/solar-system-form.d.ts +3 -2
  134. package/dist/types/components.d.ts +21 -0
  135. package/dist/types/constants.d.ts +2 -1
  136. package/dist/types/types/lang.d.ts +5 -0
  137. package/dist/types/utils/render/tools.d.ts +2 -1
  138. package/dist/types/utils/simulation/simulation.d.ts +8 -0
  139. package/dist/types/utils/simulation/solarCurves.d.ts +3 -0
  140. package/dist/types/utils/simulation/types.d.ts +49 -0
  141. package/package.json +2 -2
  142. package/dist/cjs/eraser-icon.house-icon.icon-selector.map-draw.map-selector.move-icon.octagon-minus-icon.polygon-buttons.polygon-information.search-icon.settings-icon.settings-modal.solar-expert.solar-system-form.tool-box.entry.cjs.js.map +0 -1
  143. package/dist/cjs/eraser-icon_15.cjs.entry.js +0 -3007
  144. package/dist/cjs/eraser-icon_15.cjs.entry.js.map +0 -1
  145. package/dist/components/p-BJFgUvs3.js +0 -38
  146. package/dist/components/p-BJFgUvs3.js.map +0 -1
  147. package/dist/components/p-BP2JkbOB.js +0 -149
  148. package/dist/components/p-BP2JkbOB.js.map +0 -1
  149. package/dist/components/p-BSx-VRl1.js.map +0 -1
  150. package/dist/components/p-BfAeCWO4.js +0 -38
  151. package/dist/components/p-BfAeCWO4.js.map +0 -1
  152. package/dist/components/p-BilSpdUG.js +0 -94
  153. package/dist/components/p-BilSpdUG.js.map +0 -1
  154. package/dist/components/p-Bn39cXBR.js +0 -38
  155. package/dist/components/p-Bn39cXBR.js.map +0 -1
  156. package/dist/components/p-BzuGyPz5.js +0 -493
  157. package/dist/components/p-BzuGyPz5.js.map +0 -1
  158. package/dist/components/p-C4UfrfLc.js +0 -40
  159. package/dist/components/p-C4UfrfLc.js.map +0 -1
  160. package/dist/components/p-C5Qpifsm.js.map +0 -1
  161. package/dist/components/p-CesxKYgJ.js +0 -38
  162. package/dist/components/p-CesxKYgJ.js.map +0 -1
  163. package/dist/components/p-Cm-6HU5f.js +0 -38
  164. package/dist/components/p-Cm-6HU5f.js.map +0 -1
  165. package/dist/components/p-D93MrNOs.js +0 -174
  166. package/dist/components/p-D93MrNOs.js.map +0 -1
  167. package/dist/components/p-DSWRVBhO.js +0 -74
  168. package/dist/components/p-DSWRVBhO.js.map +0 -1
  169. package/dist/components/p-klKuBKKU.js +0 -149
  170. package/dist/components/p-klKuBKKU.js.map +0 -1
  171. package/dist/components/p-metMBa33.js +0 -38
  172. package/dist/components/p-metMBa33.js.map +0 -1
  173. package/dist/esm/eraser-icon.house-icon.icon-selector.map-draw.map-selector.move-icon.octagon-minus-icon.polygon-buttons.polygon-information.search-icon.settings-icon.settings-modal.solar-expert.solar-system-form.tool-box.entry.js.map +0 -1
  174. package/dist/esm/eraser-icon_15.entry.js +0 -2991
  175. package/dist/esm/eraser-icon_15.entry.js.map +0 -1
  176. package/dist/stencil-library/eraser-icon.house-icon.icon-selector.map-draw.map-selector.move-icon.octagon-minus-icon.polygon-buttons.polygon-information.search-icon.settings-icon.settings-modal.solar-expert.solar-system-form.tool-box.entry.esm.js.map +0 -1
  177. package/dist/stencil-library/p-02607fda.entry.js +0 -2
  178. package/dist/stencil-library/p-02607fda.entry.js.map +0 -1
  179. package/dist/stencil-library/p-04893dc6.entry.js +0 -32
  180. package/dist/stencil-library/p-3af1ea82.entry.js +0 -2
  181. package/dist/stencil-library/p-3af1ea82.entry.js.map +0 -1
@@ -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 h,\r\n Listen,\r\n Prop,\r\n State,\r\n Watch,\r\n} from \"@stencil/core\";\r\n\r\nimport {\r\n renderCombinedWithZoom,\r\n renderSolarPanel,\r\n} from \"../../utils/visualize\";\r\nimport {\r\n BuildingInsightsResponse,\r\n GeoTiff,\r\n SolarPanelType,\r\n} from \"../../utils/solar\";\r\nimport { fetchSolarData, getBuildingImages } from \"../../utils/api\";\r\nimport { drawPolygon, isPointInPolygon } from \"../../utils/render/polygon\";\r\nimport { projectPointPerpendicularToLine } from \"../../utils/render/projection\";\r\nimport { Point, Polygon, SelectedPolygon } from \"../../types/shapes\";\r\nimport {\r\n deleteTool,\r\n markRoofEdgeTool,\r\n moveTool,\r\n obstructionTool,\r\n roofTool,\r\n Tool,\r\n tools,\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 { getFillColor } from \"../../utils/render/color\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { calculatePolygonArea, getPixelInMeters } from \"../../utils/utils\";\r\nimport {\r\n getBestFittingRoofSegment,\r\n SolarPanelSystemPart,\r\n} from \"../../utils/geometry/fitting\";\r\nimport { getOptimalSolarPositionFully } from \"../../utils/geometry/gridMatch\";\r\nimport { BORDER_INSET, DEFAULT_SUNNINESS } 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\r\n @State()\r\n showInstructions: boolean = true;\r\n @State()\r\n showSettings: boolean = false;\r\n @State()\r\n zoom: number = 1;\r\n @State()\r\n loadingState: \"empty\" | \"loading\" | \"loaded\" = \"empty\";\r\n @State()\r\n rgbTiff: GeoTiff | null = null;\r\n @State()\r\n draggedPointIndex: number | null = null;\r\n @State()\r\n hoveredPointIndex: number | null = null;\r\n @State()\r\n hoveredPolygon: SelectedPolygon | null = null;\r\n @State()\r\n shiftKeyPressed: boolean = false;\r\n @State()\r\n altKeyPressed: boolean = false;\r\n @State()\r\n mousePoint: Point | null = null;\r\n @State()\r\n currentTool: Tool = roofTool;\r\n @State()\r\n roofPolygons: { [id: string]: Polygon } = {};\r\n @State()\r\n roofPolygonsSolarPanels: { [id: string]: SolarPanelSystemPart } = {};\r\n @State()\r\n obstructionPolygons: { [id: string]: Polygon } = {};\r\n @State()\r\n selectedPolygon: SelectedPolygon | null = null;\r\n @State()\r\n buildingInsights: BuildingInsightsResponse | null = null;\r\n @State()\r\n pixelInMeters: number = 0.2;\r\n @State()\r\n isMobile: boolean = false;\r\n @State()\r\n highlightedEdge: { pointA: Point; pointB: Point } | null = null;\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\r\n private getCurrentPolygon(): Polygon | null {\r\n if (!this.selectedPolygon) {\r\n return null;\r\n }\r\n const { _id, type } = this.selectedPolygon;\r\n return type === \"roof\"\r\n ? this.roofPolygons[_id]\r\n : this.obstructionPolygons[_id];\r\n }\r\n\r\n componentWillLoad() {\r\n onChange(\"latitude\", () => {\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n });\r\n onChange(\"longitude\", () => {\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n });\r\n }\r\n\r\n componentDidLoad() {\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingInsights();\r\n this.getBuildingImages();\r\n }\r\n\r\n requestAnimationFrame(() => {\r\n if (this.canvasElement) {\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n this.canvasElement.width = rect.width;\r\n this.canvasElement.height = rect.height;\r\n this.drawMap();\r\n }\r\n });\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 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 }\r\n\r\n async getBuildingInsights() {\r\n if (!state.latitude || !state.longitude) {\r\n return;\r\n }\r\n this.loadingState = \"loading\";\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.obstructionPolygons = {};\r\n this.roofPolygons = {};\r\n this.selectedPolygon = null;\r\n this.hoveredPolygon = null;\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 }\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 alert(\"No building insights found. Please enter them manually.\");\r\n }\r\n\r\n // If on mobile, automatically calculate panels using Google API data\r\n if (state.isMobile && this.buildingInsights) {\r\n const maxPanels =\r\n this.buildingInsights.solarPotential.maxArrayPanelsCount;\r\n const approximatedPanels = Math.floor(maxPanels / 3); // Use one third of max panels\r\n\r\n const positionedPanels = Array(approximatedPanels).fill(null)\r\n .map((_, __) => ({\r\n panel: this.solarPanel,\r\n pixelPosition: {\r\n x: -1,\r\n y: -1,\r\n },\r\n horizontal: true,\r\n rotation: 0,\r\n }));\r\n\r\n this.roofPolygonsSolarPanels = {\r\n ...this.roofPolygonsSolarPanels,\r\n [\"mobile-panels\"]: {\r\n positionedPanels,\r\n sunniness:\r\n this.buildingInsights.solarPotential.buildingStats\r\n .sunshineQuantiles[5] ?? DEFAULT_SUNNINESS,\r\n },\r\n };\r\n }\r\n }\r\n\r\n async getBuildingImages() {\r\n if (!state.latitude || !state.longitude) {\r\n return;\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 }\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 this.pixelInMeters = getPixelInMeters(this.rgbTiff);\r\n this.loadingState = \"loaded\";\r\n }\r\n\r\n private convertToCanvasCoordinates(event: MouseEvent): Point {\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n const siteX = event.clientX - rect.left;\r\n const siteY = event.clientY - rect.top;\r\n return {\r\n x: siteX / (rect.right - rect.left) * this.canvasElement.width,\r\n y: siteY / (rect.bottom - rect.top) * this.canvasElement.height,\r\n };\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n @Watch(\"buildingInsights\")\r\n @Watch(\"canvasElement\")\r\n async drawMap() {\r\n if (\r\n !this.canvasElement || !this.rgbTiff || !this.buildingInsights\r\n ) return;\r\n\r\n this.sizeCanvas(this.rgbTiff.width, this.rgbTiff.height);\r\n\r\n renderCombinedWithZoom({\r\n rgb: this.rgbTiff,\r\n zoom: this.zoom,\r\n canvas: this.canvasElement,\r\n });\r\n }\r\n\r\n @Listen(\"mousemove\", { target: \"document\" })\r\n handleMouseMove(event: MouseEvent) {\r\n if (state.isMobile) return; // Prevent interactions on mobile\r\n if (!this.polygonCanvas || !this.polygonCtx) return;\r\n\r\n // translate the website pixel coordinates to the canvas coordinates\r\n const { x, y } = this.convertToCanvasCoordinates(event);\r\n this.mousePoint = { x, y };\r\n\r\n const currentPolygon = this.getCurrentPolygon();\r\n\r\n if (this.currentTool.name === \"markRoofEdge\") {\r\n let distances = [];\r\n for (let i = 0; i < currentPolygon?.points.length; i++) {\r\n const pointA = currentPolygon?.points[i];\r\n const pointB = currentPolygon\r\n ?.points[(i + 1) % currentPolygon?.points.length];\r\n const distanceA = Math.sqrt(\r\n Math.pow(x - pointA.x, 2) + Math.pow(y - pointA.y, 2),\r\n );\r\n const distanceB = Math.sqrt(\r\n Math.pow(x - pointB.x, 2) + Math.pow(y - pointB.y, 2),\r\n );\r\n const edgeLength = Math.sqrt(\r\n Math.pow(pointA.x - pointB.x, 2) +\r\n Math.pow(pointA.y - pointB.y, 2),\r\n );\r\n distances.push({\r\n dist: distanceA + distanceB - edgeLength,\r\n edge: { pointA, pointB },\r\n });\r\n }\r\n const closestEdge = distances.sort((a, b) => a.dist - b.dist)[0];\r\n if (closestEdge && (closestEdge.dist < 10)) {\r\n this.highlightedEdge = closestEdge.edge;\r\n }\r\n }\r\n\r\n // Check for point hover\r\n const newHoveredPointIndex = currentPolygon?.points.findIndex(\r\n (point) => {\r\n const distance = Math.sqrt(\r\n Math.pow(x - point.x, 2) + Math.pow(y - point.y, 2),\r\n );\r\n return distance < 10;\r\n },\r\n );\r\n\r\n // Check for polygon hover\r\n let newHoveredPolygon = null;\r\n for (const polygon of Object.values(this.obstructionPolygons)) {\r\n if (isPointInPolygon({ x, y }, polygon)) {\r\n newHoveredPolygon = { _id: polygon._id, type: \"obstruction\" };\r\n break;\r\n }\r\n }\r\n // obstruction polygons get priority\r\n if (!newHoveredPolygon) {\r\n for (const polygon of Object.values(this.roofPolygons)) {\r\n if (isPointInPolygon({ x, y }, polygon)) {\r\n newHoveredPolygon = { _id: polygon._id, type: \"roof\" };\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Only redraw if hover state changed\r\n if (\r\n this.hoveredPolygon ||\r\n newHoveredPointIndex !== this.hoveredPointIndex ||\r\n JSON.stringify(newHoveredPolygon) !==\r\n JSON.stringify(this.hoveredPolygon)\r\n ) {\r\n this.hoveredPointIndex = newHoveredPointIndex;\r\n this.hoveredPolygon = newHoveredPolygon;\r\n this.drawPolygons();\r\n }\r\n\r\n // Handle dragging\r\n if (\r\n this.draggedPointIndex !== null && currentPolygon &&\r\n this.currentTool.name === \"move\"\r\n ) {\r\n currentPolygon.points[this.draggedPointIndex] = { x, y };\r\n // Recalculate area if this is a roof polygon\r\n if (currentPolygon.type === \"roof\" && currentPolygon.closed) {\r\n const metersInPixels = 1 / this.pixelInMeters;\r\n const area = calculatePolygonArea(currentPolygon.points) /\r\n (metersInPixels * metersInPixels);\r\n currentPolygon.details.area = area;\r\n }\r\n this.drawPolygons();\r\n }\r\n\r\n if (this.shiftKeyPressed) {\r\n this.drawPolygons();\r\n }\r\n }\r\n\r\n private drawPolygons() {\r\n if (!this.polygonCanvas || !this.polygonCtx) return;\r\n\r\n // Clear the canvas and redraw the map\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\r\n // draw roof polygons\r\n for (const polygon of Object.values(this.roofPolygons)) {\r\n const fillColor = getFillColor(\r\n this.selectedPolygon,\r\n this.hoveredPolygon,\r\n polygon._id,\r\n polygon,\r\n this.config,\r\n );\r\n\r\n drawPolygon({\r\n polygonCtx: this.polygonCtx,\r\n polygonCanvas: this.polygonCanvas,\r\n polygon,\r\n strokeColor: polygon.closed\r\n ? this.config.closedRoofColor\r\n : this.config.openRoofColor,\r\n fillColor,\r\n pixelInMeters: this.pixelInMeters,\r\n shiftKeyPressed: this.shiftKeyPressed,\r\n mousePoint: this.mousePoint,\r\n highlightColor: this.config.highlightColor,\r\n highlightedEdge: this.highlightedEdge,\r\n });\r\n\r\n const solarPanels = this.roofPolygonsSolarPanels[polygon._id];\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 if (solarPanels) {\r\n for (const panel of solarPanels.positionedPanels) {\r\n renderSolarPanel(\r\n panel,\r\n this.polygonCtx,\r\n convertedSolarPanel.widthMeters,\r\n convertedSolarPanel.heightMeters,\r\n polygon.details?.azimuth,\r\n polygon.details?.pitch,\r\n );\r\n }\r\n }\r\n }\r\n\r\n // draw obstruction polygons\r\n for (const polygon of Object.values(this.obstructionPolygons)) {\r\n const fillColor = getFillColor(\r\n this.selectedPolygon,\r\n this.hoveredPolygon,\r\n polygon._id,\r\n polygon,\r\n this.config,\r\n );\r\n\r\n drawPolygon({\r\n polygonCtx: this.polygonCtx,\r\n polygonCanvas: this.polygonCanvas,\r\n polygon,\r\n pixelInMeters: this.pixelInMeters,\r\n shiftKeyPressed: this.shiftKeyPressed,\r\n mousePoint: this.mousePoint,\r\n strokeColor: polygon.closed\r\n ? this.config.closedObstructionColor\r\n : this.config.openObstructionColor,\r\n fillColor,\r\n highlightColor: this.config.highlightColor,\r\n });\r\n }\r\n }\r\n\r\n private deletePolygon(_id: string) {\r\n if (this.selectedPolygon?._id === _id) {\r\n this.selectedPolygon = null;\r\n }\r\n if (this.roofPolygons[_id]) {\r\n delete this.roofPolygons[_id];\r\n delete this.roofPolygonsSolarPanels[_id];\r\n }\r\n if (this.obstructionPolygons[_id]) {\r\n delete this.obstructionPolygons[_id];\r\n }\r\n }\r\n\r\n @Listen(\"keydown\", { target: \"document\" })\r\n handleKeyDown(event: KeyboardEvent) {\r\n if (event.target instanceof HTMLInputElement) {\r\n return;\r\n }\r\n // Handle shift key for perpendicular points\r\n if (event.shiftKey && !this.shiftKeyPressed) {\r\n this.shiftKeyPressed = true;\r\n this.drawPolygons();\r\n return;\r\n }\r\n if (event.altKey && !this.altKeyPressed) {\r\n this.altKeyPressed = true;\r\n return;\r\n }\r\n if (\r\n (event.key === \"Delete\" || event.key === \"Backspace\") &&\r\n this.selectedPolygon\r\n ) {\r\n const currentPolygon = this.getCurrentPolygon();\r\n if (currentPolygon.closed) {\r\n this.deletePolygon(currentPolygon._id);\r\n this.drawPolygons();\r\n return;\r\n }\r\n currentPolygon.points.pop();\r\n this.drawPolygons();\r\n return;\r\n }\r\n\r\n // Handle tool selection shortcuts\r\n const pressedKey = event.key.toLowerCase();\r\n const tool = tools.find((t) =>\r\n t.keyboardShortcut?.toLowerCase() === pressedKey\r\n );\r\n if (tool) {\r\n this.currentTool = tool;\r\n }\r\n }\r\n\r\n @Listen(\"keyup\", { target: \"document\" })\r\n handleKeyUp(event: KeyboardEvent) {\r\n if (!event.shiftKey && this.shiftKeyPressed) {\r\n this.shiftKeyPressed = false;\r\n this.drawPolygons();\r\n }\r\n if (!event.altKey && this.altKeyPressed) {\r\n this.altKeyPressed = false;\r\n }\r\n }\r\n\r\n @Listen(\"mousedown\", { target: \"document\" })\r\n handleMouseDown(event: MouseEvent) {\r\n if (state.isMobile) return; // Prevent interactions on mobile\r\n if (!this.polygonCanvas || !this.polygonCtx) return;\r\n if (!this.polygonCanvas.contains(event.target as Node)) return;\r\n\r\n let { x, y } = this.convertToCanvasCoordinates(event);\r\n\r\n if (this.currentTool.name === \"markRoofEdge\") {\r\n const x = this.highlightedEdge?.pointA.x -\r\n this.highlightedEdge?.pointB.x;\r\n const y = this.highlightedEdge?.pointA.y -\r\n this.highlightedEdge?.pointB.y;\r\n const azimuth = Math.atan2(-x, y) * (180 / Math.PI);\r\n this.handleAzimuthChange({\r\n target: {\r\n value: azimuth,\r\n },\r\n } as unknown as Event);\r\n return;\r\n }\r\n if (this.currentTool.name === \"delete\") {\r\n if (!this.hoveredPolygon) {\r\n return;\r\n }\r\n const { _id, type } = this.hoveredPolygon;\r\n if (type === \"roof\") {\r\n delete this.roofPolygons[_id];\r\n delete this.roofPolygonsSolarPanels[_id];\r\n } else if (type === \"obstruction\") {\r\n delete this.obstructionPolygons[_id];\r\n }\r\n this.hoveredPolygon = null;\r\n if (this.selectedPolygon?._id === _id) {\r\n this.selectedPolygon = null;\r\n }\r\n this.drawPolygons();\r\n return;\r\n }\r\n if (this.currentTool.name === \"move\") {\r\n // Check if we're clicking on a point of the selected polygon\r\n if (this.selectedPolygon) {\r\n const currentPolygon = this.getCurrentPolygon();\r\n const pointIndex = currentPolygon?.points.findIndex((point) => {\r\n const distance = Math.sqrt(\r\n Math.pow(x - point.x, 2) + Math.pow(y - point.y, 2),\r\n );\r\n return distance < 10;\r\n });\r\n if (pointIndex !== undefined && pointIndex !== -1) {\r\n this.draggedPointIndex = pointIndex;\r\n return;\r\n }\r\n\r\n if (this.hoveredPolygon) {\r\n this.selectedPolygon = this.hoveredPolygon;\r\n return;\r\n }\r\n }\r\n this.selectedPolygon = null;\r\n this.drawPolygons();\r\n return;\r\n }\r\n\r\n if (!this.selectedPolygon || this.getCurrentPolygon()?.closed) {\r\n // no polygon is active, create a new one\r\n const newPolygon: Polygon = {\r\n _id: uuidv4(),\r\n points: [{ x, y }],\r\n type: this.currentTool.name,\r\n closed: false,\r\n };\r\n let _id;\r\n if (this.currentTool.name === \"roof\") {\r\n this.roofPolygons = {\r\n ...this.roofPolygons,\r\n [newPolygon._id]: newPolygon,\r\n };\r\n _id = newPolygon._id;\r\n } else if (this.currentTool.name === \"obstruction\") {\r\n this.obstructionPolygons = {\r\n ...this.obstructionPolygons,\r\n [newPolygon._id]: newPolygon,\r\n };\r\n _id = newPolygon._id;\r\n }\r\n this.selectedPolygon = { _id, type: this.currentTool.name };\r\n this.drawPolygons();\r\n return;\r\n }\r\n\r\n const { _id, type } = this.selectedPolygon;\r\n const currentPolygon = type === \"roof\"\r\n ? this.roofPolygons[_id]\r\n : this.obstructionPolygons[_id];\r\n\r\n if (currentPolygon.closed) {\r\n return;\r\n }\r\n\r\n // If we have at least one point, check if we're clicking near the first point\r\n if (currentPolygon.points.length > 2) {\r\n const firstPoint = currentPolygon.points[0];\r\n const distance = Math.sqrt(\r\n Math.pow(x - firstPoint.x, 2) + Math.pow(y - firstPoint.y, 2),\r\n );\r\n\r\n if (distance < 10) {\r\n this.closePolygon();\r\n return;\r\n }\r\n }\r\n\r\n // Handle shift key for perpendicular points\r\n if (event.shiftKey && currentPolygon?.points.length >= 2) {\r\n const projectedPoint = projectPointPerpendicularToLine({\r\n x,\r\n y,\r\n lastPoint:\r\n currentPolygon.points[currentPolygon.points.length - 1],\r\n secondLastPoint:\r\n currentPolygon.points[currentPolygon.points.length - 2],\r\n });\r\n x = projectedPoint.x;\r\n y = projectedPoint.y;\r\n }\r\n\r\n currentPolygon.points = [...currentPolygon.points, { x, y }];\r\n this.drawPolygons();\r\n }\r\n\r\n @Listen(\"mouseup\", { target: \"document\" })\r\n handleMouseUp() {\r\n this.draggedPointIndex = null;\r\n }\r\n\r\n private closePolygon() {\r\n const currentPolygon = this.getCurrentPolygon();\r\n if (\r\n currentPolygon.points.length >= 3 &&\r\n (this.currentTool.name === \"roof\" ||\r\n this.currentTool.name === \"obstruction\")\r\n ) {\r\n currentPolygon.closed = true;\r\n }\r\n\r\n if (currentPolygon.type === \"roof\") {\r\n // Calculate basic polygon details\r\n const metersInPixels = 1 / this.pixelInMeters;\r\n const area = calculatePolygonArea(currentPolygon.points) /\r\n (metersInPixels * metersInPixels);\r\n const bestMatch = getBestFittingRoofSegment(\r\n currentPolygon,\r\n this.buildingInsights?.solarPotential.roofSegmentStats,\r\n this.rgbTiff.bounds,\r\n this.canvasElement,\r\n );\r\n\r\n if (bestMatch) {\r\n currentPolygon.details = {\r\n area,\r\n azimuth: bestMatch.azimuthDegrees,\r\n pitch: bestMatch.pitchDegrees,\r\n };\r\n } else {\r\n currentPolygon.details = {\r\n area,\r\n azimuth: 0,\r\n pitch: 0,\r\n };\r\n }\r\n\r\n this.scrollToCanvas();\r\n }\r\n\r\n this.drawPolygons();\r\n this.currentTool = moveTool;\r\n }\r\n\r\n private calculateSolarPanels() {\r\n const currentPolygon = this.getCurrentPolygon();\r\n\r\n if (!currentPolygon.details) {\r\n return;\r\n }\r\n\r\n if (this.roofPolygonsSolarPanels[currentPolygon._id]) {\r\n delete this.roofPolygonsSolarPanels[currentPolygon._id];\r\n }\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 currentPolygon,\r\n Object.values(this.obstructionPolygons),\r\n convertedSolarPanel,\r\n currentPolygon.details?.azimuth,\r\n inset,\r\n currentPolygon.details?.pitch,\r\n );\r\n this.roofPolygonsSolarPanels = {\r\n ...this.roofPolygonsSolarPanels,\r\n [currentPolygon._id]: {\r\n positionedPanels: solarPanels,\r\n sunniness: currentPolygon.details?.assignedRoofStats?.stats\r\n .sunshineQuantiles[5] ??\r\n this.buildingInsights.solarPotential.buildingStats\r\n .sunshineQuantiles[5] ??\r\n DEFAULT_SUNNINESS,\r\n },\r\n };\r\n this.drawPolygons();\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 const currentPolygon = this.getCurrentPolygon();\r\n if (currentPolygon) {\r\n this.roofPolygons[currentPolygon._id].details.pitch = pitch;\r\n }\r\n if (\r\n currentPolygon.type === \"roof\" &&\r\n this.roofPolygonsSolarPanels[currentPolygon._id]\r\n ) {\r\n this.calculateSolarPanels();\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 azimuth = parseFloat(target.value);\r\n const currentPolygon = this.getCurrentPolygon();\r\n if (currentPolygon) {\r\n this.roofPolygons[currentPolygon._id].details.azimuth = azimuth;\r\n }\r\n if (\r\n currentPolygon.type === \"roof\" &&\r\n this.roofPolygonsSolarPanels[currentPolygon._id]\r\n ) {\r\n this.calculateSolarPanels();\r\n return;\r\n }\r\n }\r\n\r\n private handleToolSelect(tool: Tool) {\r\n this.currentTool = tool;\r\n }\r\n\r\n private scrollToCanvas() {\r\n const canvasElement = this.el.querySelector(\"#map-draw-canvas\");\r\n if (canvasElement) {\r\n canvasElement.scrollIntoView({ behavior: \"smooth\" });\r\n }\r\n }\r\n\r\n private handleSettingsClick = () => {\r\n this.showSettings = true;\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 render() {\r\n const t = getLanguageStrings(state.settings.language);\r\n const currentPolygon = this.getCurrentPolygon();\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.showInstructions && !state.isMobile && (\r\n <div class=\"w-full rounded-4xl p-4 bg-white\">\r\n {t.mapDraw.instructions.parts.roof}{\" \"}\r\n <button\r\n class=\"inline-flex items-center justify-center p-1 rounded-full hover:bg-gray-300 transition-colors\"\r\n onClick={() => this.handleToolSelect(roofTool)}\r\n >\r\n <icon-selector name=\"house\" inline={true} />\r\n </button>{\" \"}\r\n {t.mapDraw.instructions.parts.obstruction}{\" \"}\r\n <button\r\n class=\"inline-flex items-center justify-center p-1 rounded-full hover:bg-gray-300 transition-colors\"\r\n onClick={() =>\r\n this.handleToolSelect(obstructionTool)}\r\n >\r\n <icon-selector name=\"octagon-minus\" inline={true} />\r\n </button>{\" \"}\r\n {t.mapDraw.instructions.parts.delete}{\" \"}\r\n <button\r\n class=\"inline-flex items-center justify-center p-1 rounded-full hover:bg-gray-300 transition-colors\"\r\n onClick={() => this.handleToolSelect(deleteTool)}\r\n >\r\n <icon-selector name=\"eraser\" inline={true} />\r\n </button>{\" \"}\r\n {t.mapDraw.instructions.parts.move}{\" \"}\r\n <button\r\n class=\"inline-flex items-center justify-center p-1 rounded-full hover:bg-gray-300 transition-colors\"\r\n onClick={() => this.handleToolSelect(moveTool)}\r\n >\r\n <icon-selector name=\"move\" inline={true} />\r\n </button>{\" \"}\r\n {t.mapDraw.instructions.parts.end}\r\n </div>\r\n )}\r\n <div class=\"w-full flex flex-row justify-between items-center\">\r\n {!state.isMobile && (this.showInstructions\r\n ? (\r\n <button\r\n class=\"px-4 py-2 rounded-4xl hover:bg-gray-300 transition-colors duration-200 bg-white p-4\"\r\n onClick={() => this.showInstructions = false}\r\n >\r\n {t.mapDraw.instructions.hide}\r\n </button>\r\n )\r\n : (\r\n <button\r\n class=\"px-4 py-2 rounded-4xl hover:bg-gray-300 transition-colors duration-200 bg-white p-4\"\r\n onClick={() => this.showInstructions = true}\r\n >\r\n {t.mapDraw.instructions.show}\r\n </button>\r\n ))}\r\n <button\r\n class=\"flex items-center gap-2 bg-white p-2 rounded-4xl hover:bg-gray-300\"\r\n onClick={this.handleSettingsClick}\r\n >\r\n <settings-icon />\r\n </button>\r\n </div>\r\n <div class=\"w-full\">\r\n {!state.isMobile && (\r\n <tool-box\r\n currentTool={this.currentTool}\r\n onToolSelect={(tool) => this.handleToolSelect(tool)}\r\n />\r\n )}\r\n </div>\r\n {this.loadingState === \"empty\" && (\r\n <div class=\"w-full\">\r\n <p\r\n class=\"text-white text-center flex items-center justify-center rounded-4xl p-4 w-full\"\r\n style={{\r\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\r\n }}\r\n >\r\n {t.mapDraw.noAddressSelected}\r\n </p>\r\n </div>\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-[#271200]\">\r\n </div>\r\n </div>\r\n )}\r\n <div class=\"flex items-start justify-center h-full w-full bg-[#f3ebda] rounded-4xl\">\r\n <div\r\n class=\"relative h-full flex items-center justify-center w-full rounded-4xl bg-[#271200]\"\r\n style={{\r\n aspectRatio: this.rgbTiff\r\n ? `${this.rgbTiff.width}/${this.rgbTiff.height}`\r\n : \"1/1\",\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 {currentPolygon?.details && (\r\n <button\r\n class=\"absolute bottom-4 right-4 px-4 py-2 bg-[#f3ebda] rounded-4xl hover:bg-[#ffffff] text-[#271200] transition-colors duration-200 z-10 text-xs\"\r\n onClick={() => this.calculateSolarPanels()}\r\n >\r\n {t.mapDraw.calculateSolarPanels}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n {/* {currentPolygon?.closed && ( */}\r\n <div class=\"w-full\">\r\n <polygon-buttons\r\n calculateSolarPanels={() => this.calculateSolarPanels()}\r\n selectEdgeTool={() =>\r\n this.handleToolSelect(markRoofEdgeTool)}\r\n />\r\n </div>\r\n {/* )} */}\r\n {!state.isMobile && (\r\n <div class=\"w-full\">\r\n <polygon-information\r\n currentPolygon={currentPolygon}\r\n positionedPanels={currentPolygon\r\n ? this\r\n .roofPolygonsSolarPanels[currentPolygon._id]\r\n ?.positionedPanels\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()}\r\n />\r\n </div>\r\n )}\r\n <div class=\"w-full\">\r\n <solar-system-form\r\n systemConfigs={this.roofPolygonsSolarPanels}\r\n roofPolygons={this.roofPolygons}\r\n obstructionPolygons={this.obstructionPolygons}\r\n />\r\n </div>\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 </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 h,\r\n Listen,\r\n Prop,\r\n State,\r\n Watch,\r\n} from \"@stencil/core\";\r\n\r\nimport {\r\n renderCombinedWithZoom,\r\n renderSolarPanel,\r\n} from \"../../utils/visualize\";\r\nimport {\r\n BuildingInsightsResponse,\r\n GeoTiff,\r\n SolarPanelType,\r\n} from \"../../utils/solar\";\r\nimport { fetchSolarData, getBuildingImages } from \"../../utils/api\";\r\nimport { drawPolygon, isPointInPolygon } from \"../../utils/render/polygon\";\r\nimport { projectPointPerpendicularToLine } from \"../../utils/render/projection\";\r\nimport { Point, Polygon, SelectedPolygon } from \"../../types/shapes\";\r\nimport {\r\n deleteTool,\r\n markRoofEdgeTool,\r\n moveTool,\r\n obstructionTool,\r\n roofTool,\r\n Tool,\r\n tools,\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 { getFillColor } from \"../../utils/render/color\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { calculatePolygonArea, getPixelInMeters } from \"../../utils/utils\";\r\nimport {\r\n getBestFittingRoofSegment,\r\n SolarPanelSystemPart,\r\n} from \"../../utils/geometry/fitting\";\r\nimport { getOptimalSolarPositionFully } from \"../../utils/geometry/gridMatch\";\r\nimport { BORDER_INSET, DEFAULT_SUNNINESS } 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\r\n @State()\r\n showInstructions: boolean = true;\r\n @State()\r\n showSettings: boolean = false;\r\n @State()\r\n zoom: number = 1;\r\n @State()\r\n loadingState: \"empty\" | \"loading\" | \"loaded\" = \"empty\";\r\n @State()\r\n rgbTiff: GeoTiff | null = null;\r\n @State()\r\n draggedPointIndex: number | null = null;\r\n @State()\r\n hoveredPointIndex: number | null = null;\r\n @State()\r\n hoveredPolygon: SelectedPolygon | null = null;\r\n @State()\r\n shiftKeyPressed: boolean = false;\r\n @State()\r\n altKeyPressed: boolean = false;\r\n @State()\r\n mousePoint: Point | null = null;\r\n @State()\r\n currentTool: Tool = roofTool;\r\n @State()\r\n roofPolygons: { [id: string]: Polygon } = {};\r\n @State()\r\n roofPolygonsSolarPanels: { [id: string]: SolarPanelSystemPart } = {};\r\n @State()\r\n obstructionPolygons: { [id: string]: Polygon } = {};\r\n @State()\r\n selectedPolygon: SelectedPolygon | null = null;\r\n @State()\r\n buildingInsights: BuildingInsightsResponse | null = null;\r\n @State()\r\n pixelInMeters: number = 0.2;\r\n @State()\r\n isMobile: boolean = false;\r\n @State()\r\n highlightedEdge: { pointA: Point; pointB: Point } | null = null;\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\r\n private getCurrentPolygon(): Polygon | null {\r\n if (!this.selectedPolygon) {\r\n return null;\r\n }\r\n const { _id, type } = this.selectedPolygon;\r\n return type === \"roof\"\r\n ? this.roofPolygons[_id]\r\n : this.obstructionPolygons[_id];\r\n }\r\n\r\n componentWillLoad() {\r\n onChange(\"latitude\", () => {\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n });\r\n onChange(\"longitude\", () => {\r\n this.getBuildingImages();\r\n this.getBuildingInsights();\r\n });\r\n }\r\n\r\n componentDidLoad() {\r\n if (state.latitude && state.longitude) {\r\n this.loadingState = \"loading\";\r\n this.getBuildingInsights();\r\n this.getBuildingImages();\r\n }\r\n\r\n requestAnimationFrame(() => {\r\n if (this.canvasElement) {\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n this.canvasElement.width = rect.width;\r\n this.canvasElement.height = rect.height;\r\n this.drawMap();\r\n }\r\n });\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 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 }\r\n\r\n async getBuildingInsights() {\r\n if (!state.latitude || !state.longitude) {\r\n return;\r\n }\r\n this.loadingState = \"loading\";\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.obstructionPolygons = {};\r\n this.roofPolygons = {};\r\n this.selectedPolygon = null;\r\n this.hoveredPolygon = null;\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 }\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 alert(\"No building insights found. Please enter them manually.\");\r\n }\r\n\r\n // If on mobile, automatically calculate panels using Google API data\r\n if (state.isMobile && this.buildingInsights) {\r\n const maxPanels =\r\n this.buildingInsights.solarPotential.maxArrayPanelsCount;\r\n const approximatedPanels = Math.floor(maxPanels * 3 / 4); // Use two thirds of max panels\r\n\r\n const positionedPanels = Array(approximatedPanels).fill(null)\r\n .map((_, __) => ({\r\n panel: this.solarPanel,\r\n pixelPosition: {\r\n x: -1,\r\n y: -1,\r\n },\r\n horizontal: true,\r\n rotation: 0,\r\n }));\r\n\r\n this.roofPolygonsSolarPanels = {\r\n ...this.roofPolygonsSolarPanels,\r\n [\"mobile-panels\"]: {\r\n positionedPanels,\r\n sunniness:\r\n this.buildingInsights.solarPotential.buildingStats\r\n .sunshineQuantiles[5] ?? DEFAULT_SUNNINESS,\r\n },\r\n };\r\n }\r\n }\r\n\r\n async getBuildingImages() {\r\n if (!state.latitude || !state.longitude) {\r\n return;\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 }\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 this.pixelInMeters = getPixelInMeters(this.rgbTiff);\r\n this.loadingState = \"loaded\";\r\n }\r\n\r\n private convertToCanvasCoordinates(event: MouseEvent): Point {\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n const siteX = event.clientX - rect.left;\r\n const siteY = event.clientY - rect.top;\r\n return {\r\n x: siteX / (rect.right - rect.left) * this.canvasElement.width,\r\n y: siteY / (rect.bottom - rect.top) * this.canvasElement.height,\r\n };\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n @Watch(\"buildingInsights\")\r\n @Watch(\"canvasElement\")\r\n async drawMap() {\r\n if (\r\n !this.canvasElement || !this.rgbTiff || !this.buildingInsights\r\n ) return;\r\n\r\n this.sizeCanvas(this.rgbTiff.width, this.rgbTiff.height);\r\n\r\n renderCombinedWithZoom({\r\n rgb: this.rgbTiff,\r\n zoom: this.zoom,\r\n canvas: this.canvasElement,\r\n });\r\n }\r\n\r\n @Listen(\"mousemove\", { target: \"document\" })\r\n handleMouseMove(event: MouseEvent) {\r\n if (state.isMobile) return; // Prevent interactions on mobile\r\n if (!this.polygonCanvas || !this.polygonCtx) return;\r\n\r\n // translate the website pixel coordinates to the canvas coordinates\r\n const { x, y } = this.convertToCanvasCoordinates(event);\r\n this.mousePoint = { x, y };\r\n\r\n const currentPolygon = this.getCurrentPolygon();\r\n let redraw = false;\r\n\r\n if (this.currentTool.name === \"markRoofEdge\") {\r\n let distances = [];\r\n for (let i = 0; i < currentPolygon?.points.length; i++) {\r\n const pointA = currentPolygon?.points[i];\r\n const pointB = currentPolygon\r\n ?.points[(i + 1) % currentPolygon?.points.length];\r\n const distanceA = Math.sqrt(\r\n Math.pow(x - pointA.x, 2) + Math.pow(y - pointA.y, 2),\r\n );\r\n const distanceB = Math.sqrt(\r\n Math.pow(x - pointB.x, 2) + Math.pow(y - pointB.y, 2),\r\n );\r\n const edgeLength = Math.sqrt(\r\n Math.pow(pointA.x - pointB.x, 2) +\r\n Math.pow(pointA.y - pointB.y, 2),\r\n );\r\n distances.push({\r\n dist: distanceA + distanceB - edgeLength,\r\n edge: { pointA, pointB },\r\n });\r\n }\r\n const closestEdge = distances.sort((a, b) => a.dist - b.dist)[0];\r\n if (closestEdge && (closestEdge.dist < 10)) {\r\n this.highlightedEdge = closestEdge.edge;\r\n redraw = true;\r\n } else if (this.highlightedEdge) {\r\n this.highlightedEdge = null;\r\n redraw = true;\r\n }\r\n }\r\n\r\n // Check for point hover\r\n const newHoveredPointIndex = currentPolygon?.points.findIndex(\r\n (point) => {\r\n const distance = Math.sqrt(\r\n Math.pow(x - point.x, 2) + Math.pow(y - point.y, 2),\r\n );\r\n return distance < 10;\r\n },\r\n );\r\n\r\n // Check for polygon hover\r\n let newHoveredPolygon = null;\r\n for (const polygon of Object.values(this.obstructionPolygons)) {\r\n if (isPointInPolygon({ x, y }, polygon)) {\r\n newHoveredPolygon = { _id: polygon._id, type: \"obstruction\" };\r\n break;\r\n }\r\n }\r\n // obstruction polygons get priority\r\n if (!newHoveredPolygon) {\r\n for (const polygon of Object.values(this.roofPolygons)) {\r\n if (isPointInPolygon({ x, y }, polygon)) {\r\n newHoveredPolygon = { _id: polygon._id, type: \"roof\" };\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Only redraw if hover state changed\r\n if (\r\n this.hoveredPolygon ||\r\n newHoveredPointIndex !== this.hoveredPointIndex ||\r\n JSON.stringify(newHoveredPolygon) !==\r\n JSON.stringify(this.hoveredPolygon)\r\n ) {\r\n this.hoveredPointIndex = newHoveredPointIndex;\r\n this.hoveredPolygon = newHoveredPolygon;\r\n redraw = true;\r\n }\r\n\r\n // Handle dragging\r\n if (\r\n this.draggedPointIndex !== null && currentPolygon &&\r\n this.currentTool.name === \"move\"\r\n ) {\r\n currentPolygon.points[this.draggedPointIndex] = { x, y };\r\n // Recalculate area if this is a roof polygon\r\n if (currentPolygon.type === \"roof\" && currentPolygon.closed) {\r\n const metersInPixels = 1 / this.pixelInMeters;\r\n const area = calculatePolygonArea(currentPolygon.points) /\r\n (metersInPixels * metersInPixels);\r\n currentPolygon.details.area = area;\r\n }\r\n redraw = true;\r\n }\r\n\r\n if (this.shiftKeyPressed) {\r\n redraw = true;\r\n }\r\n\r\n if (redraw) {\r\n this.drawPolygons();\r\n }\r\n }\r\n\r\n private drawPolygons() {\r\n if (!this.polygonCanvas || !this.polygonCtx) return;\r\n\r\n // Clear the canvas and redraw the map\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\r\n // draw roof polygons\r\n for (const polygon of Object.values(this.roofPolygons)) {\r\n const fillColor = getFillColor(\r\n this.selectedPolygon,\r\n this.hoveredPolygon,\r\n polygon._id,\r\n polygon,\r\n this.config,\r\n );\r\n\r\n drawPolygon({\r\n polygonCtx: this.polygonCtx,\r\n polygonCanvas: this.polygonCanvas,\r\n polygon,\r\n strokeColor: polygon.closed\r\n ? this.config.closedRoofColor\r\n : this.config.openRoofColor,\r\n fillColor,\r\n pixelInMeters: this.pixelInMeters,\r\n shiftKeyPressed: this.shiftKeyPressed,\r\n mousePoint: this.mousePoint,\r\n highlightColor: this.config.highlightColor,\r\n highlightedEdge: this.highlightedEdge,\r\n });\r\n\r\n const solarPanels = this.roofPolygonsSolarPanels[polygon._id];\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 if (solarPanels) {\r\n for (const panel of solarPanels.positionedPanels) {\r\n renderSolarPanel(\r\n panel,\r\n this.polygonCtx,\r\n convertedSolarPanel.widthMeters,\r\n convertedSolarPanel.heightMeters,\r\n polygon.details?.azimuth,\r\n polygon.details?.pitch,\r\n );\r\n }\r\n }\r\n }\r\n\r\n // draw obstruction polygons\r\n for (const polygon of Object.values(this.obstructionPolygons)) {\r\n const fillColor = getFillColor(\r\n this.selectedPolygon,\r\n this.hoveredPolygon,\r\n polygon._id,\r\n polygon,\r\n this.config,\r\n );\r\n\r\n drawPolygon({\r\n polygonCtx: this.polygonCtx,\r\n polygonCanvas: this.polygonCanvas,\r\n polygon,\r\n pixelInMeters: this.pixelInMeters,\r\n shiftKeyPressed: this.shiftKeyPressed,\r\n mousePoint: this.mousePoint,\r\n strokeColor: polygon.closed\r\n ? this.config.closedObstructionColor\r\n : this.config.openObstructionColor,\r\n fillColor,\r\n highlightColor: this.config.highlightColor,\r\n });\r\n }\r\n }\r\n\r\n private deletePolygon(_id: string) {\r\n if (this.selectedPolygon?._id === _id) {\r\n this.selectedPolygon = null;\r\n }\r\n if (this.roofPolygons[_id]) {\r\n delete this.roofPolygons[_id];\r\n delete this.roofPolygonsSolarPanels[_id];\r\n }\r\n if (this.obstructionPolygons[_id]) {\r\n delete this.obstructionPolygons[_id];\r\n }\r\n }\r\n\r\n @Listen(\"keydown\", { target: \"document\" })\r\n handleKeyDown(event: KeyboardEvent) {\r\n if (event.target instanceof HTMLInputElement) {\r\n return;\r\n }\r\n // Handle shift key for perpendicular points\r\n if (event.shiftKey && !this.shiftKeyPressed) {\r\n this.shiftKeyPressed = true;\r\n this.drawPolygons();\r\n return;\r\n }\r\n if (event.altKey && !this.altKeyPressed) {\r\n this.altKeyPressed = true;\r\n return;\r\n }\r\n if (\r\n (event.key === \"Delete\" || event.key === \"Backspace\") &&\r\n this.selectedPolygon\r\n ) {\r\n const currentPolygon = this.getCurrentPolygon();\r\n if (currentPolygon.closed) {\r\n this.deletePolygon(currentPolygon._id);\r\n this.drawPolygons();\r\n return;\r\n }\r\n currentPolygon.points.pop();\r\n this.drawPolygons();\r\n return;\r\n }\r\n\r\n // Handle tool selection shortcuts\r\n const pressedKey = event.key.toLowerCase();\r\n const tool = tools.find((t) =>\r\n t.keyboardShortcut?.toLowerCase() === pressedKey\r\n );\r\n if (tool) {\r\n this.currentTool = tool;\r\n }\r\n }\r\n\r\n @Listen(\"keyup\", { target: \"document\" })\r\n handleKeyUp(event: KeyboardEvent) {\r\n if (!event.shiftKey && this.shiftKeyPressed) {\r\n this.shiftKeyPressed = false;\r\n this.drawPolygons();\r\n }\r\n if (!event.altKey && this.altKeyPressed) {\r\n this.altKeyPressed = false;\r\n }\r\n }\r\n\r\n private undo() {\r\n const currentPolygon = this.getCurrentPolygon();\r\n if (!currentPolygon) {\r\n return;\r\n }\r\n if (currentPolygon.closed) {\r\n currentPolygon.closed = false;\r\n if (currentPolygon.type === \"roof\") {\r\n delete this.roofPolygonsSolarPanels[currentPolygon._id];\r\n this.currentTool = roofTool;\r\n this.highlightedEdge = null;\r\n } else if (currentPolygon.type === \"obstruction\") {\r\n this.currentTool = obstructionTool;\r\n }\r\n } else {\r\n currentPolygon.points.pop();\r\n }\r\n this.drawPolygons();\r\n }\r\n\r\n @Listen(\"mousedown\", { target: \"document\" })\r\n handleMouseDown(event: MouseEvent) {\r\n if (this.currentTool.name === \"undo\") {\r\n return;\r\n }\r\n if (state.isMobile) return; // Prevent interactions on mobile\r\n if (!this.polygonCanvas || !this.polygonCtx) return;\r\n if (!this.polygonCanvas.contains(event.target as Node)) return;\r\n\r\n let { x, y } = this.convertToCanvasCoordinates(event);\r\n\r\n if (this.currentTool.name === \"markRoofEdge\") {\r\n if (!this.highlightedEdge) {\r\n return;\r\n }\r\n const x = this.highlightedEdge.pointA.x -\r\n this.highlightedEdge.pointB.x;\r\n const y = this.highlightedEdge.pointA.y -\r\n this.highlightedEdge.pointB.y;\r\n const azimuth = Math.atan2(-x, y) * (180 / Math.PI);\r\n this.calculateSolarPanels();\r\n this.handleAzimuthChange({\r\n target: {\r\n value: azimuth,\r\n },\r\n } as unknown as Event);\r\n return;\r\n }\r\n if (this.currentTool.name === \"delete\") {\r\n if (!this.hoveredPolygon) {\r\n return;\r\n }\r\n const { _id, type } = this.hoveredPolygon;\r\n if (type === \"roof\") {\r\n delete this.roofPolygons[_id];\r\n delete this.roofPolygonsSolarPanels[_id];\r\n } else if (type === \"obstruction\") {\r\n delete this.obstructionPolygons[_id];\r\n }\r\n this.hoveredPolygon = null;\r\n if (this.selectedPolygon?._id === _id) {\r\n this.selectedPolygon = null;\r\n }\r\n this.drawPolygons();\r\n return;\r\n }\r\n const currentPolygon = this.getCurrentPolygon();\r\n if (this.currentTool.name === \"move\") {\r\n // Check if we're clicking on a point of the selected polygon\r\n if (this.selectedPolygon) {\r\n const pointIndex = currentPolygon?.points.findIndex((point) => {\r\n const distance = Math.sqrt(\r\n Math.pow(x - point.x, 2) + Math.pow(y - point.y, 2),\r\n );\r\n return distance < 10;\r\n });\r\n if (pointIndex !== undefined && pointIndex !== -1) {\r\n this.draggedPointIndex = pointIndex;\r\n return;\r\n }\r\n\r\n if (this.hoveredPolygon) {\r\n this.selectedPolygon = this.hoveredPolygon;\r\n return;\r\n }\r\n }\r\n this.selectedPolygon = null;\r\n this.drawPolygons();\r\n return;\r\n }\r\n if (\r\n !this.selectedPolygon || currentPolygon?.closed ||\r\n this.currentTool.name !== this.selectedPolygon?.type\r\n ) {\r\n // no polygon is active, create a new one\r\n const newPolygon: Polygon = {\r\n _id: uuidv4(),\r\n points: [{ x, y }],\r\n type: this.currentTool.name,\r\n closed: false,\r\n };\r\n let _id;\r\n if (this.currentTool.name === \"roof\") {\r\n this.roofPolygons = {\r\n ...this.roofPolygons,\r\n [newPolygon._id]: newPolygon,\r\n };\r\n _id = newPolygon._id;\r\n } else if (this.currentTool.name === \"obstruction\") {\r\n this.obstructionPolygons = {\r\n ...this.obstructionPolygons,\r\n [newPolygon._id]: newPolygon,\r\n };\r\n _id = newPolygon._id;\r\n }\r\n this.selectedPolygon = { _id, type: this.currentTool.name };\r\n this.drawPolygons();\r\n return;\r\n }\r\n\r\n if (currentPolygon.closed) {\r\n return;\r\n }\r\n\r\n // If we have at least one point, check if we're clicking near the first point\r\n if (currentPolygon.points.length > 2) {\r\n const firstPoint = currentPolygon.points[0];\r\n const distance = Math.sqrt(\r\n Math.pow(x - firstPoint.x, 2) + Math.pow(y - firstPoint.y, 2),\r\n );\r\n\r\n if (distance < 10) {\r\n this.closePolygon();\r\n return;\r\n }\r\n }\r\n\r\n // Handle shift key for perpendicular points\r\n if (event.shiftKey && currentPolygon?.points.length >= 2) {\r\n const projectedPoint = projectPointPerpendicularToLine({\r\n x,\r\n y,\r\n lastPoint:\r\n currentPolygon.points[currentPolygon.points.length - 1],\r\n secondLastPoint:\r\n currentPolygon.points[currentPolygon.points.length - 2],\r\n });\r\n x = projectedPoint.x;\r\n y = projectedPoint.y;\r\n }\r\n\r\n currentPolygon.points = [...currentPolygon.points, { x, y }];\r\n this.drawPolygons();\r\n }\r\n\r\n @Listen(\"mouseup\", { target: \"document\" })\r\n handleMouseUp() {\r\n this.draggedPointIndex = null;\r\n }\r\n\r\n private closePolygon() {\r\n const currentPolygon = this.getCurrentPolygon();\r\n if (\r\n currentPolygon.points.length >= 3 &&\r\n (this.currentTool.name === \"roof\" ||\r\n this.currentTool.name === \"obstruction\")\r\n ) {\r\n currentPolygon.closed = true;\r\n }\r\n\r\n if (currentPolygon.type === \"roof\") {\r\n // Calculate basic polygon details\r\n const metersInPixels = 1 / this.pixelInMeters;\r\n const area = calculatePolygonArea(currentPolygon.points) /\r\n (metersInPixels * metersInPixels);\r\n const bestMatch = getBestFittingRoofSegment(\r\n currentPolygon,\r\n this.buildingInsights?.solarPotential.roofSegmentStats,\r\n this.rgbTiff.bounds,\r\n this.canvasElement,\r\n );\r\n\r\n if (bestMatch) {\r\n currentPolygon.details = {\r\n area,\r\n azimuth: bestMatch.azimuthDegrees,\r\n pitch: bestMatch.pitchDegrees,\r\n };\r\n } else {\r\n currentPolygon.details = {\r\n area,\r\n azimuth: 0,\r\n pitch: 0,\r\n };\r\n }\r\n\r\n this.scrollToCanvas();\r\n }\r\n\r\n this.drawPolygons();\r\n this.currentTool = moveTool;\r\n }\r\n\r\n private calculateSolarPanels({ redraw = true }: { redraw?: boolean } = {}) {\r\n const currentPolygon = this.getCurrentPolygon();\r\n\r\n if (!currentPolygon.details) {\r\n return;\r\n }\r\n\r\n if (this.roofPolygonsSolarPanels[currentPolygon._id]) {\r\n delete this.roofPolygonsSolarPanels[currentPolygon._id];\r\n }\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 currentPolygon,\r\n Object.values(this.obstructionPolygons),\r\n convertedSolarPanel,\r\n currentPolygon.details?.azimuth,\r\n inset,\r\n currentPolygon.details?.pitch,\r\n );\r\n this.roofPolygonsSolarPanels = {\r\n ...this.roofPolygonsSolarPanels,\r\n [currentPolygon._id]: {\r\n positionedPanels: solarPanels,\r\n sunniness: currentPolygon.details?.assignedRoofStats?.stats\r\n .sunshineQuantiles[5] ??\r\n this.buildingInsights.solarPotential.buildingStats\r\n .sunshineQuantiles[5] ??\r\n DEFAULT_SUNNINESS,\r\n },\r\n };\r\n if (redraw) {\r\n this.drawPolygons();\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 const currentPolygon = this.getCurrentPolygon();\r\n if (currentPolygon) {\r\n this.roofPolygons[currentPolygon._id].details.pitch = pitch;\r\n }\r\n if (\r\n currentPolygon.type === \"roof\" &&\r\n this.roofPolygonsSolarPanels[currentPolygon._id]\r\n ) {\r\n this.calculateSolarPanels();\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 azimuth = parseFloat(target.value);\r\n const currentPolygon = this.getCurrentPolygon();\r\n if (currentPolygon) {\r\n this.roofPolygons[currentPolygon._id].details.azimuth = azimuth;\r\n }\r\n if (\r\n currentPolygon.type === \"roof\" &&\r\n this.roofPolygonsSolarPanels[currentPolygon._id]\r\n ) {\r\n this.calculateSolarPanels();\r\n return;\r\n }\r\n }\r\n\r\n private handleToolSelect(tool: Tool) {\r\n const currentPolygon = this.getCurrentPolygon();\r\n if (\r\n currentPolygon && !currentPolygon.closed &&\r\n currentPolygon.points.length > 0\r\n ) {\r\n alert(\"Please close the polygon before selecting a tool\");\r\n // TODO translate\r\n return;\r\n }\r\n this.currentTool = tool;\r\n }\r\n\r\n private scrollToCanvas() {\r\n const canvasElement = this.el.querySelector(\"#map-draw-canvas\");\r\n if (canvasElement) {\r\n canvasElement.scrollIntoView({ behavior: \"smooth\" });\r\n }\r\n }\r\n\r\n private handleSettingsClick = () => {\r\n this.showSettings = true;\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 render() {\r\n const t = getLanguageStrings(state.settings.language);\r\n const currentPolygon = this.getCurrentPolygon();\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.showInstructions && !state.isMobile && (\r\n <div class=\"w-full rounded-4xl p-4 bg-white\">\r\n {t.mapDraw.instructions.parts.roof}{\" \"}\r\n <button\r\n class=\"inline-flex items-center justify-center p-1 rounded-full hover:bg-gray-300 transition-colors\"\r\n onClick={() => this.handleToolSelect(roofTool)}\r\n >\r\n <icon-selector name=\"house\" inline={true} />\r\n </button>{\" \"}\r\n {t.mapDraw.instructions.parts.obstruction}{\" \"}\r\n <button\r\n class=\"inline-flex items-center justify-center p-1 rounded-full hover:bg-gray-300 transition-colors\"\r\n onClick={() =>\r\n this.handleToolSelect(obstructionTool)}\r\n >\r\n <icon-selector name=\"octagon-minus\" inline={true} />\r\n </button>{\" \"}\r\n {t.mapDraw.instructions.parts.delete}{\" \"}\r\n <button\r\n class=\"inline-flex items-center justify-center p-1 rounded-full hover:bg-gray-300 transition-colors\"\r\n onClick={() => this.handleToolSelect(deleteTool)}\r\n >\r\n <icon-selector name=\"eraser\" inline={true} />\r\n </button>{\" \"}\r\n {t.mapDraw.instructions.parts.move}{\" \"}\r\n <button\r\n class=\"inline-flex items-center justify-center p-1 rounded-full hover:bg-gray-300 transition-colors\"\r\n onClick={() => this.handleToolSelect(moveTool)}\r\n >\r\n <icon-selector name=\"move\" inline={true} />\r\n </button>{\" \"}\r\n {t.mapDraw.instructions.parts.end}\r\n </div>\r\n )}\r\n <div class=\"w-full flex flex-row justify-between items-center\">\r\n {!state.isMobile && (this.showInstructions\r\n ? (\r\n <button\r\n class=\"px-4 py-2 rounded-4xl hover:bg-gray-300 transition-colors duration-200 bg-white p-4\"\r\n onClick={() => this.showInstructions = false}\r\n >\r\n {t.mapDraw.instructions.hide}\r\n </button>\r\n )\r\n : (\r\n <button\r\n class=\"px-4 py-2 rounded-4xl hover:bg-gray-300 transition-colors duration-200 bg-white p-4\"\r\n onClick={() => this.showInstructions = true}\r\n >\r\n {t.mapDraw.instructions.show}\r\n </button>\r\n ))}\r\n <button\r\n class=\"flex items-center gap-2 bg-white p-2 rounded-4xl hover:bg-gray-300\"\r\n onClick={this.handleSettingsClick}\r\n >\r\n <settings-icon />\r\n </button>\r\n </div>\r\n <div class=\"w-full\">\r\n {!state.isMobile && (\r\n <tool-box\r\n currentTool={this.currentTool}\r\n onToolSelect={(tool) => this.handleToolSelect(tool)}\r\n undoCallback={() => this.undo()}\r\n />\r\n )}\r\n </div>\r\n {this.loadingState === \"empty\" && (\r\n <div class=\"w-full\">\r\n <p\r\n class=\"text-white text-center flex items-center justify-center rounded-4xl p-4 w-full\"\r\n style={{\r\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\r\n }}\r\n >\r\n {t.mapDraw.noAddressSelected}\r\n </p>\r\n </div>\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-[#271200]\">\r\n </div>\r\n </div>\r\n )}\r\n <div class=\"flex items-start justify-center h-full w-full bg-[#f3ebda] rounded-4xl\">\r\n <div\r\n class=\"relative h-full flex items-center justify-center w-full rounded-4xl bg-[#271200]\"\r\n style={{\r\n aspectRatio: this.rgbTiff\r\n ? `${this.rgbTiff.width}/${this.rgbTiff.height}`\r\n : \"1/1\",\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 {currentPolygon?.closed && (\r\n <div class=\"w-full\">\r\n <polygon-buttons\r\n currentTool={this.currentTool.name}\r\n calculateSolarPanels={() =>\r\n this.calculateSolarPanels()}\r\n selectEdgeTool={() =>\r\n this.handleToolSelect(markRoofEdgeTool)}\r\n />\r\n </div>\r\n )}\r\n {!state.isMobile && (\r\n <div class=\"w-full\">\r\n <polygon-information\r\n currentPolygon={currentPolygon}\r\n positionedPanels={currentPolygon\r\n ? this\r\n .roofPolygonsSolarPanels[currentPolygon._id]\r\n ?.positionedPanels\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()}\r\n />\r\n </div>\r\n )}\r\n <div class=\"w-full\">\r\n <solar-system-form\r\n systemConfigs={this.roofPolygonsSolarPanels}\r\n roofPolygons={this.roofPolygons}\r\n obstructionPolygons={this.obstructionPolygons}\r\n />\r\n </div>\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 </div>\r\n );\r\n }\r\n}\r\n"]}
@@ -123,9 +123,9 @@ export class MapSelector {
123
123
  }
124
124
  render() {
125
125
  const t = getLanguageStrings(this.language);
126
- return (h("div", { key: '8148cfe00f7a163fc4b4802caeeb2fc178cd34c9', class: "map-selector flex flex-col gap-4 pb-4" }, h("div", { key: '0149294492525dc0aa33e1d5603df1938131b244', class: "relative" }, h("div", { key: '66d35a1a8436661cdfacba7bc9f0556dc932631c', class: "absolute left-3 top-1/2 transform -translate-y-1/2" }, h("search-icon", { key: '98e3913f8ecd37d969a6c33b9f1264440189d143' })), h("input", { key: 'a70b22ba6673b47a9c074c582ecdb28f98a48aa2', ref: (el) => this.inputElement = el, type: "text", placeholder: t.solarExpert.searchPlaceholder, class: "w-full pl-10 pr-4 py-2 border border-gray-300 rounded-4xl focus:ring-[#271200] bg-white" })), h("div", { key: '742ff4c7c7ba43c0444f4428f61e09b4ae7eadaf', class: "w-full rounded-4xl p-4", style: {
126
+ return (h("div", { key: '790ad62209c0bb8e7c09c8c4a7b4cd84a45b8c43', class: "map-selector flex flex-col gap-4 pb-4" }, h("div", { key: '7c6a2c793d57a33599a335cca50b8ed51f31a66d', class: "relative" }, h("div", { key: 'a2cb0fe67c538fe6982f4a330e87bfc4d652725d', class: "absolute left-3 top-1/2 transform -translate-y-1/2" }, h("search-icon", { key: 'e74360d3988c5eaf26d9cb3f3d5008ca12ba754c' })), h("input", { key: 'ff9d73296820c913aa139e349655fbd8d522ec00', ref: (el) => this.inputElement = el, type: "text", placeholder: t.solarExpert.searchPlaceholder, class: "w-full pl-10 pr-4 py-2 border border-gray-300 rounded-4xl focus:ring-[#271200] bg-white" })), h("div", { key: '1312a88873b3cb212d26d121ec6db26928582329', class: "w-full rounded-4xl p-4", style: {
127
127
  backgroundColor: "rgba(0, 0, 0, 0.1)",
128
- } }, t.mapSelector.explanation), h("div", { key: '36aa373f3fa7127a8d125e9f16de409aff1e4a3c', class: "flex items-center gap-4" }, h("label", { key: '7bfe3b8e33ad145c44677416990d1430f84e8add', class: "text-sm font-medium text-gray-700" }, t.mapSelector.radius), h("input", { key: '7e07e00003bfc8440e43d6f30f53d2abde2d8610', type: "range", min: "5", max: "100", value: this.radius, onInput: (e) => this.handleRadiusChange(e), class: "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-white" }), h("span", { key: '7605ac8ea43cad92d0f779887b86fff1b229c17c', class: "text-sm text-gray-600" }, this.radius, "m")), h("div", { key: 'b89698229dece7dd61a23a291e546a06bdc5544b', ref: (el) => this.mapElement = el, class: "w-full h-[400px] rounded-4xl border border-gray-300" }), h("button", { key: '186c1141537334e9265601109e27228ca3b3414b', onClick: () => this.handleAcceptPosition(), class: "w-full py-2 px-4 bg-[#271200] text-white rounded-4xl hover:bg-[#3a1b00] transition-colors" }, t.mapSelector.accept)));
128
+ } }, t.mapSelector.explanation), h("div", { key: '6a8be5059d73e8acff3afb3908ec1cc9eb874c0f', class: "flex items-center gap-4" }, h("label", { key: '1a48daacec1b2eac9bdae92fc7f1514b8cbc0999', class: "text-sm font-medium text-gray-700" }, t.mapSelector.radius), h("input", { key: 'caa5293f7930bac990afdec8ea387103ee0c1544', 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-white" }), h("span", { key: 'df77a7831acc4c53ab4f2579abd1c510ef09c866', class: "text-sm text-gray-600" }, this.radius, "m")), h("div", { key: 'e6c10f536b970753d02acfd487e57d2bd2bef8b3', ref: (el) => this.mapElement = el, class: "w-full h-[400px] rounded-4xl border border-gray-300" }), h("button", { key: 'a190ee5443eba06f1b1f95981af08202b890a04f', onClick: () => this.handleAcceptPosition(), class: "w-full py-2 px-4 bg-[#271200] text-white rounded-4xl hover:bg-[#3a1b00] transition-colors" }, t.mapSelector.accept)));
129
129
  }
130
130
  static get is() { return "map-selector"; }
131
131
  static get encapsulation() { return "shadow"; }
@@ -1 +1 @@
1
- {"version":3,"file":"map-selector.js","sourceRoot":"","sources":["../../../src/components/map-draw/map-selector.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Element, h, Prop, State } from \"@stencil/core\";\r\nimport { Loader } from \"@googlemaps/js-api-loader\";\r\nimport { state } from \"../../store\";\r\nimport { Language } from \"../../types/lang\";\r\nimport { getLanguageStrings } from \"../../utils/lang/general\";\r\n\r\n@Component({\r\n tag: \"map-selector\",\r\n styleUrl: \"../../output.css\",\r\n shadow: true,\r\n})\r\nexport class MapSelector {\r\n @Element()\r\n el!: HTMLElement;\r\n\r\n @Prop()\r\n apiKey: string = \"\";\r\n @Prop()\r\n language: Language = \"en\";\r\n\r\n @State()\r\n isLoaded: boolean = false;\r\n @State()\r\n autocomplete: google.maps.places.Autocomplete | null = null;\r\n @State()\r\n map: google.maps.Map | null = null;\r\n @State()\r\n marker: google.maps.marker.AdvancedMarkerElement | null = null;\r\n @State()\r\n circle: google.maps.Circle | null = null;\r\n @State()\r\n radius: number = 20;\r\n @State()\r\n latitude: number | null = null;\r\n @State()\r\n longitude: number | null = null;\r\n\r\n private inputElement?: HTMLInputElement;\r\n private mapElement?: HTMLDivElement;\r\n\r\n componentWillLoad() {\r\n this.loadGoogleMapsScript();\r\n }\r\n\r\n private async loadGoogleMapsScript() {\r\n try {\r\n const loader = new Loader({\r\n apiKey: this.apiKey,\r\n libraries: [\"places\", \"maps\", \"marker\"],\r\n });\r\n\r\n const [places, maps, _] = await Promise.all([\r\n loader.importLibrary(\"places\"),\r\n loader.importLibrary(\"maps\"),\r\n loader.importLibrary(\"marker\"),\r\n ]);\r\n\r\n this.isLoaded = true;\r\n this.initializeAutocomplete(places);\r\n this.initializeMap(maps);\r\n } catch (error) {\r\n console.error(\"Error loading Google Maps: \", error);\r\n }\r\n }\r\n\r\n private initializeAutocomplete(places: google.maps.PlacesLibrary) {\r\n if (!this.inputElement || !this.isLoaded) return;\r\n this.autocomplete = new places.Autocomplete(this.inputElement);\r\n\r\n this.autocomplete.addListener(\"place_changed\", () => {\r\n const place = this.autocomplete?.getPlace();\r\n if (place?.geometry?.location) {\r\n const lat = place.geometry.location.lat();\r\n const lng = place.geometry.location.lng();\r\n\r\n this.latitude = lat;\r\n this.longitude = lng;\r\n\r\n this.map?.setCenter({ lat, lng });\r\n this.map?.setZoom(40);\r\n }\r\n });\r\n }\r\n\r\n private initializeMap(\r\n maps: google.maps.MapsLibrary,\r\n ) {\r\n if (!this.mapElement || !this.isLoaded) return;\r\n\r\n this.map = new maps.Map(this.mapElement, {\r\n center: {\r\n lat: state.latitude || 49.398531832926025,\r\n lng: state.longitude || 8.671214102081551,\r\n },\r\n zoom: 15,\r\n mapTypeControl: false,\r\n streetViewControl: false,\r\n mapTypeId: \"satellite\",\r\n mapId: \"map\",\r\n tilt: 0,\r\n });\r\n // this.updateMapLocation(state.latitude, state.longitude);\r\n\r\n // Add click listener to map\r\n this.map.addListener(\"click\", (e: google.maps.MapMouseEvent) => {\r\n if (e.latLng) {\r\n const lat = e.latLng.lat();\r\n const lng = e.latLng.lng();\r\n\r\n this.latitude = lat;\r\n this.longitude = lng;\r\n\r\n this.updateMapLocation(lat, lng);\r\n }\r\n });\r\n\r\n // Initialize marker and circle if we have coordinates\r\n if (state.latitude && state.longitude) {\r\n this.updateMapLocation(state.latitude, state.longitude);\r\n }\r\n }\r\n\r\n private updateMapLocation(lat: number, lng: number) {\r\n if (!this.map) return;\r\n\r\n // Update or create circle\r\n if (this.circle) {\r\n this.circle.setCenter({ lat, lng });\r\n } else {\r\n const circle = new google.maps.Circle({\r\n strokeColor: \"#ffffff\",\r\n strokeOpacity: 0.8,\r\n strokeWeight: 2,\r\n fillColor: \"rgba(255, 255, 255, 0.8)\",\r\n fillOpacity: 0.35,\r\n map: this.map,\r\n center: { lat, lng },\r\n radius: this.radius,\r\n });\r\n this.circle = circle;\r\n }\r\n }\r\n\r\n private handleRadiusChange(e: Event) {\r\n const value = parseFloat((e.target as HTMLInputElement).value);\r\n this.radius = value;\r\n if (this.circle) {\r\n this.circle.setRadius(value);\r\n }\r\n }\r\n\r\n private handleAcceptPosition() {\r\n console.log(\r\n \"Accepting position \",\r\n this.latitude,\r\n this.longitude,\r\n this.radius,\r\n );\r\n if (this.latitude !== null && this.longitude !== null) {\r\n state.latitude = this.latitude;\r\n state.longitude = this.longitude;\r\n state.radiusMeters = this.radius;\r\n }\r\n }\r\n\r\n render() {\r\n const t = getLanguageStrings(this.language);\r\n return (\r\n <div class=\"map-selector flex flex-col gap-4 pb-4\">\r\n <div class=\"relative\">\r\n <div class=\"absolute left-3 top-1/2 transform -translate-y-1/2\">\r\n <search-icon />\r\n </div>\r\n <input\r\n ref={(el) => this.inputElement = el}\r\n type=\"text\"\r\n placeholder={t.solarExpert.searchPlaceholder}\r\n class=\"w-full pl-10 pr-4 py-2 border border-gray-300 rounded-4xl focus:ring-[#271200] bg-white\"\r\n />\r\n </div>\r\n <div\r\n class=\"w-full rounded-4xl p-4\"\r\n style={{\r\n backgroundColor: \"rgba(0, 0, 0, 0.1)\",\r\n }}\r\n >\r\n {t.mapSelector.explanation}\r\n </div>\r\n <div class=\"flex items-center gap-4\">\r\n <label class=\"text-sm font-medium text-gray-700\">\r\n {t.mapSelector.radius}\r\n </label>\r\n <input\r\n type=\"range\"\r\n min=\"5\"\r\n max=\"100\"\r\n value={this.radius}\r\n onInput={(e) => this.handleRadiusChange(e)}\r\n class=\"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-white\"\r\n />\r\n <span class=\"text-sm text-gray-600\">{this.radius}m</span>\r\n </div>\r\n\r\n <div\r\n ref={(el) => this.mapElement = el}\r\n class=\"w-full h-[400px] rounded-4xl border border-gray-300\"\r\n />\r\n\r\n <button\r\n onClick={() => this.handleAcceptPosition()}\r\n class=\"w-full py-2 px-4 bg-[#271200] text-white rounded-4xl hover:bg-[#3a1b00] transition-colors\"\r\n >\r\n {t.mapSelector.accept}\r\n </button>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"map-selector.js","sourceRoot":"","sources":["../../../src/components/map-draw/map-selector.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Element, h, Prop, State } from \"@stencil/core\";\r\nimport { Loader } from \"@googlemaps/js-api-loader\";\r\nimport { state } from \"../../store\";\r\nimport { Language } from \"../../types/lang\";\r\nimport { getLanguageStrings } from \"../../utils/lang/general\";\r\n\r\n@Component({\r\n tag: \"map-selector\",\r\n styleUrl: \"../../output.css\",\r\n shadow: true,\r\n})\r\nexport class MapSelector {\r\n @Element()\r\n el!: HTMLElement;\r\n\r\n @Prop()\r\n apiKey: string = \"\";\r\n @Prop()\r\n language: Language = \"en\";\r\n\r\n @State()\r\n isLoaded: boolean = false;\r\n @State()\r\n autocomplete: google.maps.places.Autocomplete | null = null;\r\n @State()\r\n map: google.maps.Map | null = null;\r\n @State()\r\n marker: google.maps.marker.AdvancedMarkerElement | null = null;\r\n @State()\r\n circle: google.maps.Circle | null = null;\r\n @State()\r\n radius: number = 20;\r\n @State()\r\n latitude: number | null = null;\r\n @State()\r\n longitude: number | null = null;\r\n\r\n private inputElement?: HTMLInputElement;\r\n private mapElement?: HTMLDivElement;\r\n\r\n componentWillLoad() {\r\n this.loadGoogleMapsScript();\r\n }\r\n\r\n private async loadGoogleMapsScript() {\r\n try {\r\n const loader = new Loader({\r\n apiKey: this.apiKey,\r\n libraries: [\"places\", \"maps\", \"marker\"],\r\n });\r\n\r\n const [places, maps, _] = await Promise.all([\r\n loader.importLibrary(\"places\"),\r\n loader.importLibrary(\"maps\"),\r\n loader.importLibrary(\"marker\"),\r\n ]);\r\n\r\n this.isLoaded = true;\r\n this.initializeAutocomplete(places);\r\n this.initializeMap(maps);\r\n } catch (error) {\r\n console.error(\"Error loading Google Maps: \", error);\r\n }\r\n }\r\n\r\n private initializeAutocomplete(places: google.maps.PlacesLibrary) {\r\n if (!this.inputElement || !this.isLoaded) return;\r\n this.autocomplete = new places.Autocomplete(this.inputElement);\r\n\r\n this.autocomplete.addListener(\"place_changed\", () => {\r\n const place = this.autocomplete?.getPlace();\r\n if (place?.geometry?.location) {\r\n const lat = place.geometry.location.lat();\r\n const lng = place.geometry.location.lng();\r\n\r\n this.latitude = lat;\r\n this.longitude = lng;\r\n\r\n this.map?.setCenter({ lat, lng });\r\n this.map?.setZoom(40);\r\n }\r\n });\r\n }\r\n\r\n private initializeMap(\r\n maps: google.maps.MapsLibrary,\r\n ) {\r\n if (!this.mapElement || !this.isLoaded) return;\r\n\r\n this.map = new maps.Map(this.mapElement, {\r\n center: {\r\n lat: state.latitude || 49.398531832926025,\r\n lng: state.longitude || 8.671214102081551,\r\n },\r\n zoom: 15,\r\n mapTypeControl: false,\r\n streetViewControl: false,\r\n mapTypeId: \"satellite\",\r\n mapId: \"map\",\r\n tilt: 0,\r\n });\r\n // this.updateMapLocation(state.latitude, state.longitude);\r\n\r\n // Add click listener to map\r\n this.map.addListener(\"click\", (e: google.maps.MapMouseEvent) => {\r\n if (e.latLng) {\r\n const lat = e.latLng.lat();\r\n const lng = e.latLng.lng();\r\n\r\n this.latitude = lat;\r\n this.longitude = lng;\r\n\r\n this.updateMapLocation(lat, lng);\r\n }\r\n });\r\n\r\n // Initialize marker and circle if we have coordinates\r\n if (state.latitude && state.longitude) {\r\n this.updateMapLocation(state.latitude, state.longitude);\r\n }\r\n }\r\n\r\n private updateMapLocation(lat: number, lng: number) {\r\n if (!this.map) return;\r\n\r\n // Update or create circle\r\n if (this.circle) {\r\n this.circle.setCenter({ lat, lng });\r\n } else {\r\n const circle = new google.maps.Circle({\r\n strokeColor: \"#ffffff\",\r\n strokeOpacity: 0.8,\r\n strokeWeight: 2,\r\n fillColor: \"rgba(255, 255, 255, 0.8)\",\r\n fillOpacity: 0.35,\r\n map: this.map,\r\n center: { lat, lng },\r\n radius: this.radius,\r\n });\r\n this.circle = circle;\r\n }\r\n }\r\n\r\n private handleRadiusChange(e: Event) {\r\n const value = parseFloat((e.target as HTMLInputElement).value);\r\n this.radius = value;\r\n if (this.circle) {\r\n this.circle.setRadius(value);\r\n }\r\n }\r\n\r\n private handleAcceptPosition() {\r\n console.log(\r\n \"Accepting position \",\r\n this.latitude,\r\n this.longitude,\r\n this.radius,\r\n );\r\n if (this.latitude !== null && this.longitude !== null) {\r\n state.latitude = this.latitude;\r\n state.longitude = this.longitude;\r\n state.radiusMeters = this.radius;\r\n }\r\n }\r\n\r\n render() {\r\n const t = getLanguageStrings(this.language);\r\n return (\r\n <div class=\"map-selector flex flex-col gap-4 pb-4\">\r\n <div class=\"relative\">\r\n <div class=\"absolute left-3 top-1/2 transform -translate-y-1/2\">\r\n <search-icon />\r\n </div>\r\n <input\r\n ref={(el) => this.inputElement = el}\r\n type=\"text\"\r\n placeholder={t.solarExpert.searchPlaceholder}\r\n class=\"w-full pl-10 pr-4 py-2 border border-gray-300 rounded-4xl focus:ring-[#271200] bg-white\"\r\n />\r\n </div>\r\n <div\r\n class=\"w-full rounded-4xl p-4\"\r\n style={{\r\n backgroundColor: \"rgba(0, 0, 0, 0.1)\",\r\n }}\r\n >\r\n {t.mapSelector.explanation}\r\n </div>\r\n <div class=\"flex items-center gap-4\">\r\n <label class=\"text-sm font-medium text-gray-700\">\r\n {t.mapSelector.radius}\r\n </label>\r\n <input\r\n type=\"range\"\r\n min=\"5\"\r\n max=\"100\"\r\n value={this.radius}\r\n onInput={(e) => this.handleRadiusChange(e)}\r\n 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-white\"\r\n />\r\n <span class=\"text-sm text-gray-600\">{this.radius}m</span>\r\n </div>\r\n\r\n <div\r\n ref={(el) => this.mapElement = el}\r\n class=\"w-full h-[400px] rounded-4xl border border-gray-300\"\r\n />\r\n\r\n <button\r\n onClick={() => this.handleAcceptPosition()}\r\n class=\"w-full py-2 px-4 bg-[#271200] text-white rounded-4xl hover:bg-[#3a1b00] transition-colors\"\r\n >\r\n {t.mapSelector.accept}\r\n </button>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
@@ -4,9 +4,15 @@ import { getLanguageStrings } from "../../utils/lang/general";
4
4
  export class PolygonButtons {
5
5
  calculateSolarPanels;
6
6
  selectEdgeTool;
7
+ currentTool;
7
8
  render() {
8
9
  const t = getLanguageStrings(state.settings.language);
9
- return (h("div", { key: '6fb30831a78a81d9d072120b570726c11823527e', class: "flex w-full gap-2 justify-end" }, h("button", { key: 'bd1222815828ed96e8c8203753bb792a779a0fc8', class: "px-4 py-2 rounded-4xl hover:bg-[#0000003c] text-[#271200] transition-colors duration-200 text-xs bg-white", onClick: () => this.selectEdgeTool() }, t.mapDraw.markRoofEdge), h("button", { key: '98f7479a5d39a24b34b4cfa5b92320bd962eebba', class: "px-4 py-2 rounded-4xl hover:bg-[#0000003c] text-[#271200] transition-colors duration-200 text-xs bg-[#ffffff] ", onClick: () => this.calculateSolarPanels() }, t.mapDraw.calculateSolarPanels)));
10
+ console.log("currentTool", this.currentTool);
11
+ return (h("div", { key: '0395148df27fa4749435da350c48b48f48631b9e', class: "flex w-full gap-2 justify-end" }, h("button", { key: '8e1c15c7ebfca7970c240c02f1280834100fea59', class: `px-4 py-2 rounded-4xl hover:bg-[#0000003c] text-[#271200] transition-colors duration-200 text-xs ${this.currentTool === "markRoofEdge"
12
+ ? "bg-[#00000056]"
13
+ : "bg-white"}`,
14
+ // style={edgeSelectedStyle}
15
+ onClick: () => this.selectEdgeTool() }, t.mapDraw.markRoofEdge), h("button", { key: '0d5cf42d7af65b4e17fefc466d8925051db45f6f', class: "px-4 py-2 rounded-4xl hover:bg-[#0000003c] text-[#271200] transition-colors duration-200 text-xs bg-[#ffffff]", onClick: () => this.calculateSolarPanels() }, t.mapDraw.calculateSolarPanels)));
10
16
  }
11
17
  static get is() { return "polygon-buttons"; }
12
18
  static get originalStyleUrls() {
@@ -56,6 +62,25 @@ export class PolygonButtons {
56
62
  },
57
63
  "getter": false,
58
64
  "setter": false
65
+ },
66
+ "currentTool": {
67
+ "type": "string",
68
+ "attribute": "current-tool",
69
+ "mutable": false,
70
+ "complexType": {
71
+ "original": "string",
72
+ "resolved": "string",
73
+ "references": {}
74
+ },
75
+ "required": false,
76
+ "optional": false,
77
+ "docs": {
78
+ "tags": [],
79
+ "text": ""
80
+ },
81
+ "getter": false,
82
+ "setter": false,
83
+ "reflect": false
59
84
  }
60
85
  };
61
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"polygon-buttons.js","sourceRoot":"","sources":["../../../src/components/map-draw/polygon-buttons.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAO9D,MAAM,OAAO,cAAc;IAEvB,oBAAoB,CAAa;IAEjC,cAAc,CAAa;IAE3B,MAAM;QACF,MAAM,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtD,OAAO,CACH,4DAAK,KAAK,EAAC,+BAA+B;YACtC,+DACI,KAAK,EAAC,2GAA2G,EACjH,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,IAEnC,CAAC,CAAC,OAAO,CAAC,YAAY,CAClB;YACT,+DACI,KAAK,EAAC,gHAAgH,EACtH,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAEzC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAC1B,CACP,CACT,CAAC;IACN,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACJ","sourcesContent":["import { Component, h, Prop } from \"@stencil/core\";\r\nimport { state } from \"../../store\";\r\nimport { getLanguageStrings } from \"../../utils/lang/general\";\r\n\r\n@Component({\r\n tag: \"polygon-buttons\",\r\n styleUrl: \"../../output.css\",\r\n shadow: false,\r\n})\r\nexport class PolygonButtons {\r\n @Prop()\r\n calculateSolarPanels: () => void;\r\n @Prop()\r\n selectEdgeTool: () => void;\r\n\r\n render() {\r\n const t = getLanguageStrings(state.settings.language);\r\n return (\r\n <div class=\"flex w-full gap-2 justify-end\">\r\n <button\r\n class=\"px-4 py-2 rounded-4xl hover:bg-[#0000003c] text-[#271200] transition-colors duration-200 text-xs bg-white\"\r\n onClick={() => this.selectEdgeTool()}\r\n >\r\n {t.mapDraw.markRoofEdge}\r\n </button>\r\n <button\r\n class=\"px-4 py-2 rounded-4xl hover:bg-[#0000003c] text-[#271200] transition-colors duration-200 text-xs bg-[#ffffff] \"\r\n onClick={() => this.calculateSolarPanels()}\r\n >\r\n {t.mapDraw.calculateSolarPanels}\r\n </button>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"polygon-buttons.js","sourceRoot":"","sources":["../../../src/components/map-draw/polygon-buttons.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAO9D,MAAM,OAAO,cAAc;IAEvB,oBAAoB,CAAa;IAEjC,cAAc,CAAa;IAE3B,WAAW,CAAS;IAEpB,MAAM;QACF,MAAM,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAE7C,OAAO,CACH,4DAAK,KAAK,EAAC,+BAA+B;YACtC,+DACI,KAAK,EAAE,oGACH,IAAI,CAAC,WAAW,KAAK,cAAc;oBAC/B,CAAC,CAAC,gBAAgB;oBAClB,CAAC,CAAC,UACV,EAAE;gBACF,4BAA4B;gBAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,IAEnC,CAAC,CAAC,OAAO,CAAC,YAAY,CAClB;YACT,+DACI,KAAK,EAAC,+GAA+G,EACrH,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAEzC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAC1B,CACP,CACT,CAAC;IACN,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACJ","sourcesContent":["import { Component, h, Prop } from \"@stencil/core\";\r\nimport { state } from \"../../store\";\r\nimport { getLanguageStrings } from \"../../utils/lang/general\";\r\n\r\n@Component({\r\n tag: \"polygon-buttons\",\r\n styleUrl: \"../../output.css\",\r\n shadow: false,\r\n})\r\nexport class PolygonButtons {\r\n @Prop()\r\n calculateSolarPanels: () => void;\r\n @Prop()\r\n selectEdgeTool: () => void;\r\n @Prop()\r\n currentTool: string;\r\n\r\n render() {\r\n const t = getLanguageStrings(state.settings.language);\r\n console.log(\"currentTool\", this.currentTool);\r\n\r\n return (\r\n <div class=\"flex w-full gap-2 justify-end\">\r\n <button\r\n class={`px-4 py-2 rounded-4xl hover:bg-[#0000003c] text-[#271200] transition-colors duration-200 text-xs ${\r\n this.currentTool === \"markRoofEdge\"\r\n ? \"bg-[#00000056]\"\r\n : \"bg-white\"\r\n }`}\r\n // style={edgeSelectedStyle}\r\n onClick={() => this.selectEdgeTool()}\r\n >\r\n {t.mapDraw.markRoofEdge}\r\n </button>\r\n <button\r\n class=\"px-4 py-2 rounded-4xl hover:bg-[#0000003c] text-[#271200] transition-colors duration-200 text-xs bg-[#ffffff]\"\r\n onClick={() => this.calculateSolarPanels()}\r\n >\r\n {t.mapDraw.calculateSolarPanels}\r\n </button>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
@@ -10,7 +10,7 @@ export class PolygonInformation {
10
10
  calculateSolarPanels;
11
11
  render() {
12
12
  const t = getLanguageStrings(state.settings.language);
13
- return (h("div", { key: '69de16ee2e05517aa126a604242f8135016d02d2', class: "flex gap-4 flex-row justify-center items-center w-full" }, h("div", { key: '9f17efd19627f7e085e3c634f125070a48ae71a3', class: "w-full bg-[#f3ebda] rounded-4xl p-4" }, h("h3", { key: '4ccb4b645401aa76b9f1abb0579b0cb882dba156', class: "text-lg font-semibold mb-4 text-center" }, t.mapDraw.information), this.currentPolygon?.details
13
+ return (h("div", { key: 'd6ab424241a7a68ed6e9c8732d7142b2097d0491', class: "flex gap-4 flex-row justify-center items-center w-full" }, h("div", { key: '1e5870aa04b0d26668a28663779e3f4248eb5791', class: "w-full bg-[#f3ebda] rounded-4xl p-4" }, h("h3", { key: 'db95c0cb87f0c922f4c03ee3b6bd4c5f5b0131df', class: "text-lg font-semibold mb-4 text-center" }, t.mapDraw.information), this.currentPolygon?.details
14
14
  ? (h("div", { class: "space-y-4" }, h("div", null, h("div", { class: "grid grid-cols-2 gap-2" }, h("div", null, h("h4", { class: "text-sm font-medium text-gray-600" }, t.mapDraw.area), h("p", { class: "text-lg" }, this.currentPolygon.details
15
15
  ?.area
16
16
  .toFixed(2), " m\u00B2")), h("div", null, h("div", null, h("h4", { class: "text-sm font-medium text-gray-600" }, t.mapDraw.panels), h("p", { class: "text-lg" }, this.positionedPanels
@@ -23,7 +23,7 @@ export class PolygonInformation {
23
23
  }, value: this.currentPolygon
24
24
  .details
25
25
  ?.azimuth }), "(", azimuthToCardinal(this.currentPolygon.details
26
- ?.azimuth), ")"), h("input", { type: "range", min: "0", max: "360", class: "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-white", value: this.currentPolygon
26
+ ?.azimuth), ")"), h("input", { type: "range", min: "0", max: "360", 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-white", value: this.currentPolygon
27
27
  .details?.azimuth, onInput: (e) => {
28
28
  const target = e
29
29
  .target;
@@ -44,7 +44,7 @@ export class PolygonInformation {
44
44
  }
45
45
  }, value: this.currentPolygon
46
46
  .details
47
- ?.pitch }), "\u00B0"), h("input", { type: "range", min: "0", max: "90", class: "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-white", value: this.currentPolygon
47
+ ?.pitch }), "\u00B0"), h("input", { type: "range", min: "0", max: "90", 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-white", value: this.currentPolygon
48
48
  .details?.pitch, onInput: (e) => {
49
49
  const target = e
50
50
  .target;
@@ -1 +1 @@
1
- {"version":3,"file":"polygon-information.js","sourceRoot":"","sources":["../../../src/components/map-draw/polygon-information.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, h, Prop } from \"@stencil/core\";\r\nimport { Polygon, SolarPanelSystemPart } from \"../../components\";\r\nimport { getLanguageStrings } from \"../../utils/lang/general\";\r\nimport { state } from \"../../store\";\r\nimport { azimuthToCardinal } from \"../../utils/utils\";\r\n\r\n@Component({\r\n tag: \"polygon-information\",\r\n styleUrl: \"../../output.css\",\r\n shadow: true,\r\n})\r\nexport class PolygonInformation {\r\n @Prop()\r\n currentPolygon: Polygon;\r\n @Prop()\r\n positionedPanels: SolarPanelSystemPart[] | undefined;\r\n @Prop()\r\n handleAzimuthChange: (event: Event) => void;\r\n @Prop()\r\n handlePitchChange: (event: Event) => void;\r\n @Prop()\r\n calculateSolarPanels: () => void;\r\n\r\n render() {\r\n const t = getLanguageStrings(state.settings.language);\r\n\r\n return (\r\n <div class=\"flex gap-4 flex-row justify-center items-center w-full\">\r\n <div class=\"w-full bg-[#f3ebda] rounded-4xl p-4\">\r\n <h3 class=\"text-lg font-semibold mb-4 text-center\">\r\n {t.mapDraw.information}\r\n </h3>\r\n {this.currentPolygon?.details\r\n ? (\r\n <div class=\"space-y-4\">\r\n <div>\r\n <div class=\"grid grid-cols-2 gap-2\">\r\n <div>\r\n <h4 class=\"text-sm font-medium text-gray-600\">\r\n {t.mapDraw.area}\r\n </h4>\r\n <p class=\"text-lg\">\r\n {this.currentPolygon.details\r\n ?.area\r\n .toFixed(2)} m²\r\n </p>\r\n </div>\r\n <div>\r\n <div>\r\n <h4 class=\"text-sm font-medium text-gray-600\">\r\n {t.mapDraw.panels}\r\n </h4>\r\n <p class=\"text-lg\">\r\n {this.positionedPanels\r\n ?.length ?? 0}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div>\r\n <h4 class=\"text-sm font-medium text-gray-600\">\r\n {t.mapDraw.azimuth}\r\n </h4>\r\n <div class=\"flex gap-2 flex-row justify-start bg-white rounded-4xl p-2\">\r\n <input\r\n class=\"text-lg w-full\"\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.handleAzimuthChange(\r\n e,\r\n );\r\n (e.target as HTMLInputElement)\r\n .blur();\r\n }\r\n }}\r\n value={this.currentPolygon\r\n .details\r\n ?.azimuth}\r\n />\r\n ({azimuthToCardinal(\r\n this.currentPolygon.details\r\n ?.azimuth,\r\n )})\r\n </div>\r\n <input\r\n type=\"range\"\r\n min=\"0\"\r\n max=\"360\"\r\n class=\"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-white\"\r\n value={this.currentPolygon\r\n .details?.azimuth}\r\n onInput={(e) => {\r\n const target = e\r\n .target as HTMLInputElement;\r\n const azimuth = parseFloat(\r\n target.value,\r\n );\r\n this.currentPolygon.details\r\n .azimuth = azimuth;\r\n if (\r\n this.currentPolygon\r\n .type ===\r\n \"roof\" &&\r\n this.positionedPanels\r\n ) {\r\n this.calculateSolarPanels();\r\n }\r\n }}\r\n />\r\n </div>\r\n <div>\r\n <h4 class=\"text-sm font-medium text-gray-600 pl-2\">\r\n {t.mapDraw.pitch}\r\n </h4>\r\n <div class=\"flex gap-2 flex-row justify-start bg-white rounded-4xl p-2\">\r\n <input\r\n class=\"text-lg w-full\"\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.handlePitchChange(\r\n e,\r\n );\r\n (e.target as HTMLInputElement)\r\n .blur();\r\n }\r\n }}\r\n value={this.currentPolygon\r\n .details\r\n ?.pitch}\r\n />\r\n °\r\n </div>\r\n <input\r\n type=\"range\"\r\n min=\"0\"\r\n max=\"90\"\r\n class=\"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-white\"\r\n value={this.currentPolygon\r\n .details?.pitch}\r\n onInput={(e) => {\r\n const target = e\r\n .target as HTMLInputElement;\r\n const pitch = parseFloat(\r\n target.value,\r\n );\r\n this.currentPolygon.details\r\n .pitch = pitch;\r\n if (\r\n this.currentPolygon\r\n .type ===\r\n \"roof\" &&\r\n this.positionedPanels\r\n ) {\r\n this.calculateSolarPanels();\r\n }\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )\r\n : (\r\n <p class=\"text-gray-500 text-center\">\r\n {t.mapDraw.noPolygonSelected}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"polygon-information.js","sourceRoot":"","sources":["../../../src/components/map-draw/polygon-information.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, h, Prop } from \"@stencil/core\";\r\nimport { Polygon, SolarPanelSystemPart } from \"../../components\";\r\nimport { getLanguageStrings } from \"../../utils/lang/general\";\r\nimport { state } from \"../../store\";\r\nimport { azimuthToCardinal } from \"../../utils/utils\";\r\n\r\n@Component({\r\n tag: \"polygon-information\",\r\n styleUrl: \"../../output.css\",\r\n shadow: true,\r\n})\r\nexport class PolygonInformation {\r\n @Prop()\r\n currentPolygon: Polygon;\r\n @Prop()\r\n positionedPanels: SolarPanelSystemPart[] | undefined;\r\n @Prop()\r\n handleAzimuthChange: (event: Event) => void;\r\n @Prop()\r\n handlePitchChange: (event: Event) => void;\r\n @Prop()\r\n calculateSolarPanels: () => void;\r\n\r\n render() {\r\n const t = getLanguageStrings(state.settings.language);\r\n\r\n return (\r\n <div class=\"flex gap-4 flex-row justify-center items-center w-full\">\r\n <div class=\"w-full bg-[#f3ebda] rounded-4xl p-4\">\r\n <h3 class=\"text-lg font-semibold mb-4 text-center\">\r\n {t.mapDraw.information}\r\n </h3>\r\n {this.currentPolygon?.details\r\n ? (\r\n <div class=\"space-y-4\">\r\n <div>\r\n <div class=\"grid grid-cols-2 gap-2\">\r\n <div>\r\n <h4 class=\"text-sm font-medium text-gray-600\">\r\n {t.mapDraw.area}\r\n </h4>\r\n <p class=\"text-lg\">\r\n {this.currentPolygon.details\r\n ?.area\r\n .toFixed(2)} m²\r\n </p>\r\n </div>\r\n <div>\r\n <div>\r\n <h4 class=\"text-sm font-medium text-gray-600\">\r\n {t.mapDraw.panels}\r\n </h4>\r\n <p class=\"text-lg\">\r\n {this.positionedPanels\r\n ?.length ?? 0}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div>\r\n <h4 class=\"text-sm font-medium text-gray-600\">\r\n {t.mapDraw.azimuth}\r\n </h4>\r\n <div class=\"flex gap-2 flex-row justify-start bg-white rounded-4xl p-2\">\r\n <input\r\n class=\"text-lg w-full\"\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.handleAzimuthChange(\r\n e,\r\n );\r\n (e.target as HTMLInputElement)\r\n .blur();\r\n }\r\n }}\r\n value={this.currentPolygon\r\n .details\r\n ?.azimuth}\r\n />\r\n ({azimuthToCardinal(\r\n this.currentPolygon.details\r\n ?.azimuth,\r\n )})\r\n </div>\r\n <input\r\n type=\"range\"\r\n min=\"0\"\r\n max=\"360\"\r\n 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-white\"\r\n value={this.currentPolygon\r\n .details?.azimuth}\r\n onInput={(e) => {\r\n const target = e\r\n .target as HTMLInputElement;\r\n const azimuth = parseFloat(\r\n target.value,\r\n );\r\n this.currentPolygon.details\r\n .azimuth = azimuth;\r\n if (\r\n this.currentPolygon\r\n .type ===\r\n \"roof\" &&\r\n this.positionedPanels\r\n ) {\r\n this.calculateSolarPanels();\r\n }\r\n }}\r\n />\r\n </div>\r\n <div>\r\n <h4 class=\"text-sm font-medium text-gray-600 pl-2\">\r\n {t.mapDraw.pitch}\r\n </h4>\r\n <div class=\"flex gap-2 flex-row justify-start bg-white rounded-4xl p-2\">\r\n <input\r\n class=\"text-lg w-full\"\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.handlePitchChange(\r\n e,\r\n );\r\n (e.target as HTMLInputElement)\r\n .blur();\r\n }\r\n }}\r\n value={this.currentPolygon\r\n .details\r\n ?.pitch}\r\n />\r\n °\r\n </div>\r\n <input\r\n type=\"range\"\r\n min=\"0\"\r\n max=\"90\"\r\n 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-white\"\r\n value={this.currentPolygon\r\n .details?.pitch}\r\n onInput={(e) => {\r\n const target = e\r\n .target as HTMLInputElement;\r\n const pitch = parseFloat(\r\n target.value,\r\n );\r\n this.currentPolygon.details\r\n .pitch = pitch;\r\n if (\r\n this.currentPolygon\r\n .type ===\r\n \"roof\" &&\r\n this.positionedPanels\r\n ) {\r\n this.calculateSolarPanels();\r\n }\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )\r\n : (\r\n <p class=\"text-gray-500 text-center\">\r\n {t.mapDraw.noPolygonSelected}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}