@tak-ps/cloudtak 12.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. package/README.md +34 -0
  2. package/dist/types/plugin.d.ts +99 -0
  3. package/dist/types/src/App.vue.d.ts +5 -0
  4. package/dist/types/src/base/chatroom-chats.d.ts +17 -0
  5. package/dist/types/src/base/chatroom.d.ts +47 -0
  6. package/dist/types/src/base/cot.d.ts +94 -0
  7. package/dist/types/src/base/database.d.ts +115 -0
  8. package/dist/types/src/base/events.d.ts +30 -0
  9. package/dist/types/src/base/filter.d.ts +41 -0
  10. package/dist/types/src/base/handler.d.ts +11 -0
  11. package/dist/types/src/base/icon.d.ts +4 -0
  12. package/dist/types/src/base/notification.d.ts +37 -0
  13. package/dist/types/src/base/overlay.d.ts +94 -0
  14. package/dist/types/src/base/subscription-feature.d.ts +49 -0
  15. package/dist/types/src/base/subscription-log.d.ts +32 -0
  16. package/dist/types/src/base/subscription.d.ts +115 -0
  17. package/dist/types/src/base/utils/styles.d.ts +11 -0
  18. package/dist/types/src/base/validators.d.ts +9 -0
  19. package/dist/types/src/components/Admin/AdminImports.vue.d.ts +3 -0
  20. package/dist/types/src/components/Admin/AdminLayers.vue.d.ts +3 -0
  21. package/dist/types/src/components/Admin/AdminMissionTemplate.vue.d.ts +3 -0
  22. package/dist/types/src/components/Admin/AdminMissionTemplateLog.vue.d.ts +3 -0
  23. package/dist/types/src/components/Admin/AdminMissionTemplates.vue.d.ts +3 -0
  24. package/dist/types/src/components/Admin/AdminOverlays.vue.d.ts +3 -0
  25. package/dist/types/src/components/Admin/AdminPalette.vue.d.ts +3 -0
  26. package/dist/types/src/components/Admin/AdminPaletteFeature.vue.d.ts +3 -0
  27. package/dist/types/src/components/Admin/AdminPalettes.vue.d.ts +3 -0
  28. package/dist/types/src/components/Admin/AdminServer.vue.d.ts +3 -0
  29. package/dist/types/src/components/Admin/AdminTasks.vue.d.ts +3 -0
  30. package/dist/types/src/components/Admin/AdminUser.vue.d.ts +3 -0
  31. package/dist/types/src/components/Admin/AdminUsers.vue.d.ts +3 -0
  32. package/dist/types/src/components/Admin/AdminVideos.vue.d.ts +3 -0
  33. package/dist/types/src/components/Admin/Server/ServerConnection.vue.d.ts +3 -0
  34. package/dist/types/src/components/Admin/Server/ServerInjectorModal.vue.d.ts +11 -0
  35. package/dist/types/src/components/Admin/Server/ServerInjectors.vue.d.ts +3 -0
  36. package/dist/types/src/components/Admin/Server/ServerPackages.vue.d.ts +3 -0
  37. package/dist/types/src/components/Admin/Server/ServerRepeaters.vue.d.ts +3 -0
  38. package/dist/types/src/components/Admin/Server/ServerVideos.vue.d.ts +3 -0
  39. package/dist/types/src/components/Admin/Tasks/AdminRawTasks.vue.d.ts +3 -0
  40. package/dist/types/src/components/Admin/Videos/AdminVideoLeases.vue.d.ts +3 -0
  41. package/dist/types/src/components/Admin/Videos/AdminVideoService.vue.d.ts +3 -0
  42. package/dist/types/src/components/Admin/Videos/VideoConfig.vue.d.ts +7 -0
  43. package/dist/types/src/components/Admin/Videos/VideoConfigPort.vue.d.ts +8 -0
  44. package/dist/types/src/components/CloudTAK/CoTView.vue.d.ts +3 -0
  45. package/dist/types/src/components/CloudTAK/CoordInput.vue.d.ts +7 -0
  46. package/dist/types/src/components/CloudTAK/DrawTools.vue.d.ts +3 -0
  47. package/dist/types/src/components/CloudTAK/FeatView.vue.d.ts +8 -0
  48. package/dist/types/src/components/CloudTAK/GeoJSONInput.vue.d.ts +24 -0
  49. package/dist/types/src/components/CloudTAK/MainMenu.vue.d.ts +9 -0
  50. package/dist/types/src/components/CloudTAK/MainMenuContents.vue.d.ts +16 -0
  51. package/dist/types/src/components/CloudTAK/Map.vue.d.ts +8 -0
  52. package/dist/types/src/components/CloudTAK/MapLoading.vue.d.ts +3 -0
  53. package/dist/types/src/components/CloudTAK/Menu/Debugger.vue.d.ts +3 -0
  54. package/dist/types/src/components/CloudTAK/Menu/MenuBasemaps.vue.d.ts +3 -0
  55. package/dist/types/src/components/CloudTAK/Menu/MenuChannels.vue.d.ts +3 -0
  56. package/dist/types/src/components/CloudTAK/Menu/MenuChats.vue.d.ts +3 -0
  57. package/dist/types/src/components/CloudTAK/Menu/MenuConnections.vue.d.ts +3 -0
  58. package/dist/types/src/components/CloudTAK/Menu/MenuContacts.vue.d.ts +3 -0
  59. package/dist/types/src/components/CloudTAK/Menu/MenuFeatures.vue.d.ts +3 -0
  60. package/dist/types/src/components/CloudTAK/Menu/MenuFeaturesDeleted.vue.d.ts +3 -0
  61. package/dist/types/src/components/CloudTAK/Menu/MenuFiles.vue.d.ts +3 -0
  62. package/dist/types/src/components/CloudTAK/Menu/MenuImport.vue.d.ts +3 -0
  63. package/dist/types/src/components/CloudTAK/Menu/MenuImports.vue.d.ts +3 -0
  64. package/dist/types/src/components/CloudTAK/Menu/MenuItemCard.vue.d.ts +101 -0
  65. package/dist/types/src/components/CloudTAK/Menu/MenuMission.vue.d.ts +3 -0
  66. package/dist/types/src/components/CloudTAK/Menu/MenuMissions.vue.d.ts +3 -0
  67. package/dist/types/src/components/CloudTAK/Menu/MenuOverlayExplorer.vue.d.ts +3 -0
  68. package/dist/types/src/components/CloudTAK/Menu/MenuOverlays.vue.d.ts +3 -0
  69. package/dist/types/src/components/CloudTAK/Menu/MenuPackage.vue.d.ts +3 -0
  70. package/dist/types/src/components/CloudTAK/Menu/MenuPackages.vue.d.ts +3 -0
  71. package/dist/types/src/components/CloudTAK/Menu/MenuRoutes.vue.d.ts +3 -0
  72. package/dist/types/src/components/CloudTAK/Menu/MenuRoutesNew.vue.d.ts +3 -0
  73. package/dist/types/src/components/CloudTAK/Menu/MenuSettings.vue.d.ts +3 -0
  74. package/dist/types/src/components/CloudTAK/Menu/MenuSettingsCallsign.vue.d.ts +3 -0
  75. package/dist/types/src/components/CloudTAK/Menu/MenuSettingsDisplay.vue.d.ts +3 -0
  76. package/dist/types/src/components/CloudTAK/Menu/MenuVideos.vue.d.ts +3 -0
  77. package/dist/types/src/components/CloudTAK/Menu/MenuVideosRemote.vue.d.ts +3 -0
  78. package/dist/types/src/components/CloudTAK/Menu/Mission/MissionContents.vue.d.ts +11 -0
  79. package/dist/types/src/components/CloudTAK/Menu/Mission/MissionCreate.vue.d.ts +7 -0
  80. package/dist/types/src/components/CloudTAK/Menu/Mission/MissionInfo.vue.d.ts +11 -0
  81. package/dist/types/src/components/CloudTAK/Menu/Mission/MissionInviteModal.vue.d.ts +17 -0
  82. package/dist/types/src/components/CloudTAK/Menu/Mission/MissionLayerCreate.vue.d.ts +13 -0
  83. package/dist/types/src/components/CloudTAK/Menu/Mission/MissionLayerEdit.vue.d.ts +15 -0
  84. package/dist/types/src/components/CloudTAK/Menu/Mission/MissionLayerTree.vue.d.ts +15 -0
  85. package/dist/types/src/components/CloudTAK/Menu/Mission/MissionLayers.vue.d.ts +8 -0
  86. package/dist/types/src/components/CloudTAK/Menu/Mission/MissionLog.vue.d.ts +9 -0
  87. package/dist/types/src/components/CloudTAK/Menu/Mission/MissionLogs.vue.d.ts +7 -0
  88. package/dist/types/src/components/CloudTAK/Menu/Mission/MissionTimeline.vue.d.ts +7 -0
  89. package/dist/types/src/components/CloudTAK/Menu/Mission/MissionUsers.vue.d.ts +7 -0
  90. package/dist/types/src/components/CloudTAK/Menu/Mission/PendingInvites.vue.d.ts +11 -0
  91. package/dist/types/src/components/CloudTAK/Menu/Overlays/TreeMission.vue.d.ts +7 -0
  92. package/dist/types/src/components/CloudTAK/Menu/Overlays/TreeVector.vue.d.ts +13 -0
  93. package/dist/types/src/components/CloudTAK/Menu/Videos/VideoLeaseModal.vue.d.ts +16 -0
  94. package/dist/types/src/components/CloudTAK/Menu/Videos/VideosRemoteFeed.vue.d.ts +13 -0
  95. package/dist/types/src/components/CloudTAK/Notifications.vue.d.ts +3 -0
  96. package/dist/types/src/components/CloudTAK/Query/Magnetic.vue.d.ts +7 -0
  97. package/dist/types/src/components/CloudTAK/Query/Reverse.vue.d.ts +8 -0
  98. package/dist/types/src/components/CloudTAK/Query/Sun.vue.d.ts +7 -0
  99. package/dist/types/src/components/CloudTAK/Query/Weather.vue.d.ts +7 -0
  100. package/dist/types/src/components/CloudTAK/QueryView.vue.d.ts +3 -0
  101. package/dist/types/src/components/CloudTAK/RangeInput.vue.d.ts +7 -0
  102. package/dist/types/src/components/CloudTAK/RangeRingsInput.vue.d.ts +7 -0
  103. package/dist/types/src/components/CloudTAK/util/Breadcrumb.vue.d.ts +6 -0
  104. package/dist/types/src/components/CloudTAK/util/ChannelInfo.vue.d.ts +15 -0
  105. package/dist/types/src/components/CloudTAK/util/ContactPuck.vue.d.ts +7 -0
  106. package/dist/types/src/components/CloudTAK/util/Coordinate.vue.d.ts +67 -0
  107. package/dist/types/src/components/CloudTAK/util/CoordinateType.vue.d.ts +27 -0
  108. package/dist/types/src/components/CloudTAK/util/CopyButton.vue.d.ts +32 -0
  109. package/dist/types/src/components/CloudTAK/util/CopyField.vue.d.ts +122 -0
  110. package/dist/types/src/components/CloudTAK/util/DrawOverlay.vue.d.ts +3 -0
  111. package/dist/types/src/components/CloudTAK/util/EmptyInfo.vue.d.ts +24 -0
  112. package/dist/types/src/components/CloudTAK/util/FeatureIcon.vue.d.ts +23 -0
  113. package/dist/types/src/components/CloudTAK/util/FeatureRow.vue.d.ts +81 -0
  114. package/dist/types/src/components/CloudTAK/util/FloatingAttachment.vue.d.ts +17 -0
  115. package/dist/types/src/components/CloudTAK/util/FloatingVideo.vue.d.ts +27 -0
  116. package/dist/types/src/components/CloudTAK/util/GroupSelect.vue.d.ts +14 -0
  117. package/dist/types/src/components/CloudTAK/util/JSONModal.vue.d.ts +27 -0
  118. package/dist/types/src/components/CloudTAK/util/Keywords.vue.d.ts +6 -0
  119. package/dist/types/src/components/CloudTAK/util/LineLength.vue.d.ts +24 -0
  120. package/dist/types/src/components/CloudTAK/util/MenuTemplate.vue.d.ts +71 -0
  121. package/dist/types/src/components/CloudTAK/util/MultipleSelect.vue.d.ts +7 -0
  122. package/dist/types/src/components/CloudTAK/util/NotificationIcon.vue.d.ts +10 -0
  123. package/dist/types/src/components/CloudTAK/util/NotificationToast.vue.d.ts +13 -0
  124. package/dist/types/src/components/CloudTAK/util/PolygonArea.vue.d.ts +24 -0
  125. package/dist/types/src/components/CloudTAK/util/PropertyBattery.vue.d.ts +13 -0
  126. package/dist/types/src/components/CloudTAK/util/PropertyBearing.vue.d.ts +58 -0
  127. package/dist/types/src/components/CloudTAK/util/PropertyCreator.vue.d.ts +7 -0
  128. package/dist/types/src/components/CloudTAK/util/PropertyDistance.vue.d.ts +54 -0
  129. package/dist/types/src/components/CloudTAK/util/PropertyElevation.vue.d.ts +32 -0
  130. package/dist/types/src/components/CloudTAK/util/PropertyEmail.vue.d.ts +13 -0
  131. package/dist/types/src/components/CloudTAK/util/PropertyLinks.vue.d.ts +14 -0
  132. package/dist/types/src/components/CloudTAK/util/PropertyMetadata.vue.d.ts +7 -0
  133. package/dist/types/src/components/CloudTAK/util/PropertyMilSym.vue.d.ts +25 -0
  134. package/dist/types/src/components/CloudTAK/util/PropertyPhone.vue.d.ts +13 -0
  135. package/dist/types/src/components/CloudTAK/util/PropertySpeed.vue.d.ts +23 -0
  136. package/dist/types/src/components/CloudTAK/util/PropertyStyle.vue.d.ts +7 -0
  137. package/dist/types/src/components/CloudTAK/util/PropertyTimes.vue.d.ts +7 -0
  138. package/dist/types/src/components/CloudTAK/util/PropertyType.vue.d.ts +27 -0
  139. package/dist/types/src/components/CloudTAK/util/SearchBox.vue.d.ts +37 -0
  140. package/dist/types/src/components/CloudTAK/util/SelectFeats.vue.d.ts +7 -0
  141. package/dist/types/src/components/CloudTAK/util/SettingsCallsign.vue.d.ts +28 -0
  142. package/dist/types/src/components/CloudTAK/util/Share.vue.d.ts +14 -0
  143. package/dist/types/src/components/CloudTAK/util/ShareToMission.vue.d.ts +53 -0
  144. package/dist/types/src/components/CloudTAK/util/ShareToPackage.vue.d.ts +62 -0
  145. package/dist/types/src/components/CloudTAK/util/SlideDownHeader.vue.d.ts +41 -0
  146. package/dist/types/src/components/CloudTAK/util/StandardItem.vue.d.ts +18 -0
  147. package/dist/types/src/components/CloudTAK/util/Subscriptions.vue.d.ts +7 -0
  148. package/dist/types/src/components/CloudTAK/util/VideoLeaseSourceType.vue.d.ts +6 -0
  149. package/dist/types/src/components/CloudTAK/util/WarnChannels.vue.d.ts +7 -0
  150. package/dist/types/src/components/CloudTAK/util/WarnConfiguration.vue.d.ts +7 -0
  151. package/dist/types/src/components/Configure.vue.d.ts +3 -0
  152. package/dist/types/src/components/ETL/Connection/AgencyBadge.vue.d.ts +8 -0
  153. package/dist/types/src/components/ETL/Connection/ConnectionFiles.vue.d.ts +3 -0
  154. package/dist/types/src/components/ETL/Connection/ConnectionTokens.vue.d.ts +3 -0
  155. package/dist/types/src/components/ETL/Connection/ConnectionVideos.vue.d.ts +3 -0
  156. package/dist/types/src/components/ETL/Connection/StatusDot.vue.d.ts +13 -0
  157. package/dist/types/src/components/ETL/Connection/TokenModal.vue.d.ts +16 -0
  158. package/dist/types/src/components/ETL/Connection.vue.d.ts +3 -0
  159. package/dist/types/src/components/ETL/ConnectionCard.vue.d.ts +16 -0
  160. package/dist/types/src/components/ETL/Connections.vue.d.ts +3 -0
  161. package/dist/types/src/components/ETL/Data.vue.d.ts +3 -0
  162. package/dist/types/src/components/ETL/Layer/LayerIncomingConfig.vue.d.ts +27 -0
  163. package/dist/types/src/components/ETL/Layer/LayerOutgoingConfig.vue.d.ts +27 -0
  164. package/dist/types/src/components/ETL/Layer/utils/QueryInput.vue.d.ts +56 -0
  165. package/dist/types/src/components/ETL/Layer/utils/StatusDot.vue.d.ts +7 -0
  166. package/dist/types/src/components/ETL/Layer.vue.d.ts +3 -0
  167. package/dist/types/src/components/Home.vue.d.ts +13 -0
  168. package/dist/types/src/components/Loading.vue.d.ts +3 -0
  169. package/dist/types/src/components/Login.vue.d.ts +7 -0
  170. package/dist/types/src/components/LostUser.vue.d.ts +3 -0
  171. package/dist/types/src/components/PageFooter.vue.d.ts +3 -0
  172. package/dist/types/src/components/ServerAdmin.vue.d.ts +3 -0
  173. package/dist/types/src/components/VideoWall/Main.vue.d.ts +3 -0
  174. package/dist/types/src/components/VideoWall.vue.d.ts +13 -0
  175. package/dist/types/src/components/util/GroupSelect.vue.d.ts +14 -0
  176. package/dist/types/src/components/util/InitialAuthor.vue.d.ts +6 -0
  177. package/dist/types/src/components/util/StatusDot.vue.d.ts +8 -0
  178. package/dist/types/src/components/util/Upload.vue.d.ts +46 -0
  179. package/dist/types/src/components/util/UploadLogo.vue.d.ts +14 -0
  180. package/dist/types/src/main.d.ts +1 -0
  181. package/dist/types/src/pages/admin/main.d.ts +1 -0
  182. package/dist/types/src/pages/connection/main.d.ts +1 -0
  183. package/dist/types/src/pages/docs/App.vue.d.ts +4 -0
  184. package/dist/types/src/pages/docs/main.d.ts +1 -0
  185. package/dist/types/src/pages/video/main.d.ts +1 -0
  186. package/dist/types/src/std.d.ts +19 -0
  187. package/dist/types/src/stores/brand.d.ts +7 -0
  188. package/dist/types/src/stores/float.d.ts +42 -0
  189. package/dist/types/src/stores/map.d.ts +115 -0
  190. package/dist/types/src/stores/modules/draw.d.ts +35 -0
  191. package/dist/types/src/stores/modules/icons.d.ts +38 -0
  192. package/dist/types/src/stores/modules/menu.d.ts +34 -0
  193. package/dist/types/src/test/setup.d.ts +1 -0
  194. package/dist/types/src/timediff.d.ts +1 -0
  195. package/dist/types/src/types.d.ts +158 -0
  196. package/dist/types/src/video.d.ts +1 -0
  197. package/dist/types/src/workers/atlas-connection.d.ts +12 -0
  198. package/dist/types/src/workers/atlas-database.d.ts +134 -0
  199. package/dist/types/src/workers/atlas-profile.d.ts +39 -0
  200. package/dist/types/src/workers/atlas-team.d.ts +13 -0
  201. package/dist/types/src/workers/atlas.d.ts +19 -0
  202. package/package.json +97 -0
  203. package/src/App.vue +341 -0
  204. package/src/base/chatroom-chats.ts +124 -0
  205. package/src/base/chatroom.ts +202 -0
  206. package/src/base/cot.ts +625 -0
  207. package/src/base/database.ts +150 -0
  208. package/src/base/events.ts +43 -0
  209. package/src/base/filter.ts +163 -0
  210. package/src/base/handler.ts +67 -0
  211. package/src/base/icon.ts +16 -0
  212. package/src/base/notification.ts +163 -0
  213. package/src/base/overlay.ts +558 -0
  214. package/src/base/subscription-feature.ts +224 -0
  215. package/src/base/subscription-log.ts +174 -0
  216. package/src/base/subscription.ts +489 -0
  217. package/src/base/utils/styles.ts +430 -0
  218. package/src/base/validators.ts +66 -0
  219. package/src/components/Admin/AdminConfig.vue +487 -0
  220. package/src/components/Admin/AdminConnections.vue +195 -0
  221. package/src/components/Admin/AdminDatas.vue +165 -0
  222. package/src/components/Admin/AdminExport.vue +121 -0
  223. package/src/components/Admin/AdminImports.vue +222 -0
  224. package/src/components/Admin/AdminLayerTemplate.vue +91 -0
  225. package/src/components/Admin/AdminLayers.vue +301 -0
  226. package/src/components/Admin/AdminMissionTemplate.vue +259 -0
  227. package/src/components/Admin/AdminMissionTemplateLog.vue +273 -0
  228. package/src/components/Admin/AdminMissionTemplates.vue +189 -0
  229. package/src/components/Admin/AdminOverlays.vue +232 -0
  230. package/src/components/Admin/AdminOverlaysEdit.vue +355 -0
  231. package/src/components/Admin/AdminPalette.vue +214 -0
  232. package/src/components/Admin/AdminPaletteFeature.vue +208 -0
  233. package/src/components/Admin/AdminPalettes.vue +189 -0
  234. package/src/components/Admin/AdminServer.vue +143 -0
  235. package/src/components/Admin/AdminTasks.vue +60 -0
  236. package/src/components/Admin/AdminUser.vue +263 -0
  237. package/src/components/Admin/AdminUsers.vue +183 -0
  238. package/src/components/Admin/AdminVideos.vue +60 -0
  239. package/src/components/Admin/Server/ServerConnection.vue +322 -0
  240. package/src/components/Admin/Server/ServerInjectorModal.vue +125 -0
  241. package/src/components/Admin/Server/ServerInjectors.vue +104 -0
  242. package/src/components/Admin/Server/ServerPackages.vue +159 -0
  243. package/src/components/Admin/Server/ServerRepeaters.vue +105 -0
  244. package/src/components/Admin/Server/ServerVideos.vue +83 -0
  245. package/src/components/Admin/Tasks/AdminRawTasks.vue +148 -0
  246. package/src/components/Admin/Tasks/AdminTasks.vue +286 -0
  247. package/src/components/Admin/Videos/AdminVideoLeases.vue +198 -0
  248. package/src/components/Admin/Videos/AdminVideoService.vue +67 -0
  249. package/src/components/Admin/Videos/VideoConfig.vue +132 -0
  250. package/src/components/Admin/Videos/VideoConfigPath.vue +58 -0
  251. package/src/components/Admin/Videos/VideoConfigPort.vue +40 -0
  252. package/src/components/CloudTAK/CoTView.vue +915 -0
  253. package/src/components/CloudTAK/CoordInput.vue +110 -0
  254. package/src/components/CloudTAK/DrawTools.vue +200 -0
  255. package/src/components/CloudTAK/FeatView.vue +242 -0
  256. package/src/components/CloudTAK/GeoJSONInput.vue +226 -0
  257. package/src/components/CloudTAK/MainMenu.vue +190 -0
  258. package/src/components/CloudTAK/MainMenuContents.vue +360 -0
  259. package/src/components/CloudTAK/Map.vue +972 -0
  260. package/src/components/CloudTAK/MapLoading.vue +31 -0
  261. package/src/components/CloudTAK/Menu/Basemaps/EditModal.vue +427 -0
  262. package/src/components/CloudTAK/Menu/Debugger.vue +118 -0
  263. package/src/components/CloudTAK/Menu/Iconset/EditModal.vue +118 -0
  264. package/src/components/CloudTAK/Menu/MenuBasemaps.vue +410 -0
  265. package/src/components/CloudTAK/Menu/MenuChannels.vue +206 -0
  266. package/src/components/CloudTAK/Menu/MenuChat.vue +222 -0
  267. package/src/components/CloudTAK/Menu/MenuChats.vue +167 -0
  268. package/src/components/CloudTAK/Menu/MenuConnections.vue +166 -0
  269. package/src/components/CloudTAK/Menu/MenuContacts.vue +245 -0
  270. package/src/components/CloudTAK/Menu/MenuFeatures.vue +718 -0
  271. package/src/components/CloudTAK/Menu/MenuFeaturesDeleted.vue +217 -0
  272. package/src/components/CloudTAK/Menu/MenuFiles.vue +433 -0
  273. package/src/components/CloudTAK/Menu/MenuIcon.vue +236 -0
  274. package/src/components/CloudTAK/Menu/MenuIconset.vue +128 -0
  275. package/src/components/CloudTAK/Menu/MenuIconsets.vue +266 -0
  276. package/src/components/CloudTAK/Menu/MenuImport.vue +198 -0
  277. package/src/components/CloudTAK/Menu/MenuImports.vue +199 -0
  278. package/src/components/CloudTAK/Menu/MenuItemCard.vue +240 -0
  279. package/src/components/CloudTAK/Menu/MenuMission.vue +324 -0
  280. package/src/components/CloudTAK/Menu/MenuMissions.vue +334 -0
  281. package/src/components/CloudTAK/Menu/MenuOverlayExplorer.vue +434 -0
  282. package/src/components/CloudTAK/Menu/MenuOverlays.vue +560 -0
  283. package/src/components/CloudTAK/Menu/MenuPackage.vue +340 -0
  284. package/src/components/CloudTAK/Menu/MenuPackages.vue +193 -0
  285. package/src/components/CloudTAK/Menu/MenuRoutes.vue +186 -0
  286. package/src/components/CloudTAK/Menu/MenuRoutesNew.vue +193 -0
  287. package/src/components/CloudTAK/Menu/MenuSettings.vue +95 -0
  288. package/src/components/CloudTAK/Menu/MenuSettingsCallsign.vue +12 -0
  289. package/src/components/CloudTAK/Menu/MenuSettingsDisplay.vue +144 -0
  290. package/src/components/CloudTAK/Menu/MenuSettingsTokens.vue +83 -0
  291. package/src/components/CloudTAK/Menu/MenuVideos.vue +436 -0
  292. package/src/components/CloudTAK/Menu/MenuVideosRemote.vue +203 -0
  293. package/src/components/CloudTAK/Menu/Mission/MissionContents.vue +211 -0
  294. package/src/components/CloudTAK/Menu/Mission/MissionCreate.vue +372 -0
  295. package/src/components/CloudTAK/Menu/Mission/MissionInfo.vue +331 -0
  296. package/src/components/CloudTAK/Menu/Mission/MissionInviteModal.vue +107 -0
  297. package/src/components/CloudTAK/Menu/Mission/MissionLayerCreate.vue +77 -0
  298. package/src/components/CloudTAK/Menu/Mission/MissionLayerEdit.vue +77 -0
  299. package/src/components/CloudTAK/Menu/Mission/MissionLayerTree.vue +194 -0
  300. package/src/components/CloudTAK/Menu/Mission/MissionLayers.vue +157 -0
  301. package/src/components/CloudTAK/Menu/Mission/MissionLog.vue +170 -0
  302. package/src/components/CloudTAK/Menu/Mission/MissionLogs.vue +194 -0
  303. package/src/components/CloudTAK/Menu/Mission/MissionTimeline.vue +142 -0
  304. package/src/components/CloudTAK/Menu/Mission/MissionUsers.vue +74 -0
  305. package/src/components/CloudTAK/Menu/Mission/PendingInvites.vue +130 -0
  306. package/src/components/CloudTAK/Menu/Overlays/DeleteModal.vue +57 -0
  307. package/src/components/CloudTAK/Menu/Overlays/TreeCots.vue +497 -0
  308. package/src/components/CloudTAK/Menu/Overlays/TreeMission.vue +32 -0
  309. package/src/components/CloudTAK/Menu/Overlays/TreeVector.vue +113 -0
  310. package/src/components/CloudTAK/Menu/Settings/TokenModal.vue +110 -0
  311. package/src/components/CloudTAK/Menu/Videos/VideoLeaseModal.vue +753 -0
  312. package/src/components/CloudTAK/Menu/Videos/VideosRemoteFeed.vue +75 -0
  313. package/src/components/CloudTAK/Notifications.vue +195 -0
  314. package/src/components/CloudTAK/Query/Magnetic.vue +80 -0
  315. package/src/components/CloudTAK/Query/Reverse.vue +65 -0
  316. package/src/components/CloudTAK/Query/Sun.vue +178 -0
  317. package/src/components/CloudTAK/Query/Weather.vue +195 -0
  318. package/src/components/CloudTAK/QueryView.vue +134 -0
  319. package/src/components/CloudTAK/RadialMenu/LICENSE +21 -0
  320. package/src/components/CloudTAK/RadialMenu/README.md +63 -0
  321. package/src/components/CloudTAK/RadialMenu/RadialMenu.css +85 -0
  322. package/src/components/CloudTAK/RadialMenu/RadialMenu.js +534 -0
  323. package/src/components/CloudTAK/RadialMenu/RadialMenu.vue +257 -0
  324. package/src/components/CloudTAK/RangeInput.vue +155 -0
  325. package/src/components/CloudTAK/RangeRingsInput.vue +269 -0
  326. package/src/components/CloudTAK/util/Breadcrumb.vue +85 -0
  327. package/src/components/CloudTAK/util/ChannelInfo.vue +25 -0
  328. package/src/components/CloudTAK/util/Contact.vue +131 -0
  329. package/src/components/CloudTAK/util/ContactPuck.vue +40 -0
  330. package/src/components/CloudTAK/util/Coordinate.vue +313 -0
  331. package/src/components/CloudTAK/util/CoordinateType.vue +134 -0
  332. package/src/components/CloudTAK/util/CopyButton.vue +67 -0
  333. package/src/components/CloudTAK/util/CopyField.vue +286 -0
  334. package/src/components/CloudTAK/util/DrawOverlay.vue +254 -0
  335. package/src/components/CloudTAK/util/EmptyInfo.vue +71 -0
  336. package/src/components/CloudTAK/util/FeatureIcon.vue +134 -0
  337. package/src/components/CloudTAK/util/FeatureRow.vue +206 -0
  338. package/src/components/CloudTAK/util/FloatingAttachment.vue +191 -0
  339. package/src/components/CloudTAK/util/FloatingVideo.vue +654 -0
  340. package/src/components/CloudTAK/util/GenericSelect.vue +125 -0
  341. package/src/components/CloudTAK/util/GroupSelect.vue +129 -0
  342. package/src/components/CloudTAK/util/Icons.vue +146 -0
  343. package/src/components/CloudTAK/util/JSONModal.vue +57 -0
  344. package/src/components/CloudTAK/util/Keywords.vue +31 -0
  345. package/src/components/CloudTAK/util/LineLength.vue +121 -0
  346. package/src/components/CloudTAK/util/MenuItem.vue +21 -0
  347. package/src/components/CloudTAK/util/MenuTemplate.vue +137 -0
  348. package/src/components/CloudTAK/util/MultipleSelect.vue +103 -0
  349. package/src/components/CloudTAK/util/NotificationIcon.vue +50 -0
  350. package/src/components/CloudTAK/util/NotificationToast.vue +125 -0
  351. package/src/components/CloudTAK/util/PolygonArea.vue +109 -0
  352. package/src/components/CloudTAK/util/PropertyAttachments.vue +224 -0
  353. package/src/components/CloudTAK/util/PropertyBattery.vue +44 -0
  354. package/src/components/CloudTAK/util/PropertyBearing.vue +148 -0
  355. package/src/components/CloudTAK/util/PropertyCreator.vue +61 -0
  356. package/src/components/CloudTAK/util/PropertyDistance.vue +182 -0
  357. package/src/components/CloudTAK/util/PropertyElevation.vue +84 -0
  358. package/src/components/CloudTAK/util/PropertyEmail.vue +44 -0
  359. package/src/components/CloudTAK/util/PropertyLinks.vue +148 -0
  360. package/src/components/CloudTAK/util/PropertyMetadata.vue +53 -0
  361. package/src/components/CloudTAK/util/PropertyMilSym.vue +62 -0
  362. package/src/components/CloudTAK/util/PropertyPhone.vue +61 -0
  363. package/src/components/CloudTAK/util/PropertySensor.vue +129 -0
  364. package/src/components/CloudTAK/util/PropertySpeed.vue +91 -0
  365. package/src/components/CloudTAK/util/PropertyStyle.vue +202 -0
  366. package/src/components/CloudTAK/util/PropertyTimes.vue +95 -0
  367. package/src/components/CloudTAK/util/PropertyType.vue +274 -0
  368. package/src/components/CloudTAK/util/SearchBox.vue +314 -0
  369. package/src/components/CloudTAK/util/SelectFeats.vue +190 -0
  370. package/src/components/CloudTAK/util/SettingsCallsign.vue +151 -0
  371. package/src/components/CloudTAK/util/Share.vue +496 -0
  372. package/src/components/CloudTAK/util/ShareToMission.vue +223 -0
  373. package/src/components/CloudTAK/util/ShareToPackage.vue +250 -0
  374. package/src/components/CloudTAK/util/SlideDownHeader.vue +92 -0
  375. package/src/components/CloudTAK/util/StandardItem.vue +42 -0
  376. package/src/components/CloudTAK/util/Subscriptions.vue +151 -0
  377. package/src/components/CloudTAK/util/TagEntry.vue +301 -0
  378. package/src/components/CloudTAK/util/UploadImport.vue +195 -0
  379. package/src/components/CloudTAK/util/VideoLeaseSourceType.vue +66 -0
  380. package/src/components/CloudTAK/util/WarnChannels.vue +56 -0
  381. package/src/components/CloudTAK/util/WarnConfiguration.vue +34 -0
  382. package/src/components/Configure.vue +259 -0
  383. package/src/components/ETL/Connection/AgencyBadge.vue +102 -0
  384. package/src/components/ETL/Connection/AgencySelect.vue +185 -0
  385. package/src/components/ETL/Connection/CertificateLogin.vue +75 -0
  386. package/src/components/ETL/Connection/CertificateMachineUser.vue +228 -0
  387. package/src/components/ETL/Connection/CertificateP12.vue +104 -0
  388. package/src/components/ETL/Connection/CertificateRaw.vue +50 -0
  389. package/src/components/ETL/Connection/ConnectionData.vue +174 -0
  390. package/src/components/ETL/Connection/ConnectionFiles.vue +182 -0
  391. package/src/components/ETL/Connection/ConnectionGroups.vue +181 -0
  392. package/src/components/ETL/Connection/ConnectionLayer.vue +180 -0
  393. package/src/components/ETL/Connection/ConnectionTokens.vue +147 -0
  394. package/src/components/ETL/Connection/ConnectionVideos.vue +151 -0
  395. package/src/components/ETL/Connection/Events.vue +88 -0
  396. package/src/components/ETL/Connection/StatusDot.vue +48 -0
  397. package/src/components/ETL/Connection/TokenModal.vue +136 -0
  398. package/src/components/ETL/Connection.vue +194 -0
  399. package/src/components/ETL/ConnectionCard.vue +265 -0
  400. package/src/components/ETL/ConnectionEdit.vue +448 -0
  401. package/src/components/ETL/Connections.vue +148 -0
  402. package/src/components/ETL/Data/DataFiles.vue +245 -0
  403. package/src/components/ETL/Data/DataGroups.vue +45 -0
  404. package/src/components/ETL/Data/DataLayer.vue +144 -0
  405. package/src/components/ETL/Data/Location.vue +238 -0
  406. package/src/components/ETL/Data.vue +259 -0
  407. package/src/components/ETL/DataEdit.vue +212 -0
  408. package/src/components/ETL/Layer/LayerAlarm.vue +307 -0
  409. package/src/components/ETL/Layer/LayerDeployment.vue +388 -0
  410. package/src/components/ETL/Layer/LayerEnvironment.vue +259 -0
  411. package/src/components/ETL/Layer/LayerIncomingConfig.vue +401 -0
  412. package/src/components/ETL/Layer/LayerIncomingEnvironmentArcGIS.vue +354 -0
  413. package/src/components/ETL/Layer/LayerIncomingSchema.vue +138 -0
  414. package/src/components/ETL/Layer/LayerIncomingStyles.vue +349 -0
  415. package/src/components/ETL/Layer/LayerOutgoingConfig.vue +204 -0
  416. package/src/components/ETL/Layer/LayerOutgoingEnvironmentArcGIS.vue +279 -0
  417. package/src/components/ETL/Layer/utils/QueryInput.vue +52 -0
  418. package/src/components/ETL/Layer/utils/Schema.vue +322 -0
  419. package/src/components/ETL/Layer/utils/SchemaModal.vue +77 -0
  420. package/src/components/ETL/Layer/utils/StatusDot.vue +38 -0
  421. package/src/components/ETL/Layer/utils/StyleLinkModal.vue +83 -0
  422. package/src/components/ETL/Layer/utils/StyleLinks.vue +139 -0
  423. package/src/components/ETL/Layer/utils/StyleSingle.vue +885 -0
  424. package/src/components/ETL/Layer/utils/StyleTemplate.vue +97 -0
  425. package/src/components/ETL/Layer/utils/TaskModal.vue +217 -0
  426. package/src/components/ETL/Layer.vue +560 -0
  427. package/src/components/ETL/LayerEdit.vue +276 -0
  428. package/src/components/ETL/Styling/Layer.vue +311 -0
  429. package/src/components/ETL/Styling/ObjectInput.vue +46 -0
  430. package/src/components/ETL/Styling/Style.vue +233 -0
  431. package/src/components/Home.vue +17 -0
  432. package/src/components/Loading.vue +42 -0
  433. package/src/components/Login.vue +198 -0
  434. package/src/components/LostUser.vue +31 -0
  435. package/src/components/PageFooter.vue +41 -0
  436. package/src/components/ServerAdmin.vue +408 -0
  437. package/src/components/VideoWall/Main.vue +79 -0
  438. package/src/components/VideoWall.vue +17 -0
  439. package/src/components/util/DataSelect.vue +148 -0
  440. package/src/components/util/EsriFilter.vue +140 -0
  441. package/src/components/util/EsriPortal.vue +422 -0
  442. package/src/components/util/EsriPortalCreate.vue +72 -0
  443. package/src/components/util/EsriServer.vue +368 -0
  444. package/src/components/util/GroupSelect.vue +166 -0
  445. package/src/components/util/IconSelect.vue +302 -0
  446. package/src/components/util/InitialAuthor.vue +28 -0
  447. package/src/components/util/LayerSelect.vue +162 -0
  448. package/src/components/util/LayerTaskSelect.vue +311 -0
  449. package/src/components/util/LayerTemplateSelect.vue +173 -0
  450. package/src/components/util/LoginModal.vue +110 -0
  451. package/src/components/util/PublicTilesSelect.vue +171 -0
  452. package/src/components/util/StatusDot.vue +31 -0
  453. package/src/components/util/TableFooter.vue +64 -0
  454. package/src/components/util/TableHeader.vue +127 -0
  455. package/src/components/util/Upload.vue +220 -0
  456. package/src/components/util/UploadCSV.vue +46 -0
  457. package/src/components/util/UploadLogo.vue +83 -0
  458. package/src/components/util/UploadP12.vue +93 -0
  459. package/src/components/util/UserSelect.vue +151 -0
  460. package/src/derived-types.d.ts +35243 -0
  461. package/src/main.ts +264 -0
  462. package/src/pages/admin/main.ts +208 -0
  463. package/src/pages/connection/main.ts +158 -0
  464. package/src/pages/docs/App.vue +19 -0
  465. package/src/pages/docs/main.ts +6 -0
  466. package/src/pages/video/main.ts +27 -0
  467. package/src/std.ts +152 -0
  468. package/src/stores/brand.ts +28 -0
  469. package/src/stores/float.ts +113 -0
  470. package/src/stores/map.ts +931 -0
  471. package/src/stores/modules/draw.ts +413 -0
  472. package/src/stores/modules/icons.ts +185 -0
  473. package/src/stores/modules/menu.ts +281 -0
  474. package/src/test/setup.ts +43 -0
  475. package/src/timediff.ts +33 -0
  476. package/src/types.ts +226 -0
  477. package/src/video.ts +27 -0
  478. package/src/vite-env.d.ts +9 -0
  479. package/src/workers/atlas-connection.ts +236 -0
  480. package/src/workers/atlas-database.ts +764 -0
  481. package/src/workers/atlas-profile.ts +374 -0
  482. package/src/workers/atlas-team.ts +90 -0
  483. package/src/workers/atlas.ts +81 -0
@@ -0,0 +1,413 @@
1
+ import * as terraDraw from 'terra-draw';
2
+ import { v4 as randomUUID } from 'uuid';
3
+ import mapgl from 'maplibre-gl'
4
+ import pointOnFeature from '@turf/point-on-feature';
5
+ import { coordEach } from '@turf/meta';
6
+ import { TerraDrawMapLibreGLAdapter } from 'terra-draw-maplibre-gl-adapter';
7
+ import { distance } from '@turf/distance';
8
+ import type { GeoJSONFeatureId } from 'maplibre-gl'
9
+ import type COT from '../../base/cot.ts';
10
+ import Filter from '../../base/filter.ts';
11
+ import { OriginMode } from '../../base/cot.ts';
12
+ import { std, stdurl } from '../../std.ts';
13
+ import type { Feature, FeatureCollection } from '../../types.ts';
14
+ import type { Polygon, Position } from 'geojson';
15
+ import type { useMapStore } from '../map.ts';
16
+
17
+ export enum DrawToolMode {
18
+ STATIC = 'static',
19
+ FREEHAND = 'freehand',
20
+ SELECT = 'select',
21
+
22
+ POINT = 'point',
23
+ LINESTRING = 'linestring',
24
+ POLYGON = 'polygon',
25
+ RECTANGLE = 'angled-rectangle',
26
+ CIRCLE = 'circle',
27
+ SECTOR = 'sector',
28
+ }
29
+
30
+ export default class DrawTool {
31
+ private draw: terraDraw.TerraDraw;
32
+ public editing: COT | null;
33
+
34
+ public mode: DrawToolMode;
35
+
36
+ private mapStore: ReturnType<typeof useMapStore>;
37
+
38
+ // Contains coordinates to allow snapping to
39
+ public snapping: Set<[number, number]>;
40
+
41
+ public point: {
42
+ type: string,
43
+ };
44
+
45
+ public lasso: {
46
+ loading: boolean;
47
+ overlay: string;
48
+ }
49
+
50
+ constructor(mapStore: ReturnType<typeof useMapStore>) {
51
+ this.mapStore = mapStore;
52
+
53
+ const toCustom = (event: terraDraw.TerraDrawMouseEvent): Position | undefined => {
54
+ let closest: {
55
+ dist: number
56
+ coord: Position
57
+ } | undefined = undefined;
58
+
59
+ for (const coord of this.snapping.values()) {
60
+ const dist = distance([event.lng, event.lat], coord);
61
+
62
+ if (!closest || (dist < closest.dist)) {
63
+ closest = { dist, coord }
64
+ }
65
+ }
66
+
67
+ if (closest) {
68
+ // Base Threshold / Math.pow(decayFactor, zoomLevel)
69
+ const threshold = 1000 / Math.pow(2, this.mapStore.map.getZoom());
70
+
71
+ if (closest.dist < threshold) {
72
+ return closest.coord;
73
+ }
74
+
75
+ return;
76
+ } else {
77
+ return;
78
+ }
79
+ }
80
+
81
+ this.draw = new terraDraw.TerraDraw({
82
+ adapter: new TerraDrawMapLibreGLAdapter({
83
+ map: this.mapStore.map,
84
+ // @ts-expect-error TS is complaining
85
+ lib: mapgl
86
+ }),
87
+ idStrategy: {
88
+ isValidId: (id: string | number): boolean => {
89
+ return typeof id === "string"
90
+ },
91
+ getId: (function () {
92
+ return function () {
93
+ return randomUUID()
94
+ };
95
+ })()
96
+ },
97
+ modes: [
98
+ new terraDraw.TerraDrawPointMode({
99
+ editable: true
100
+ }),
101
+ new terraDraw.TerraDrawLineStringMode({
102
+ editable: true,
103
+ snapping: { toCustom }
104
+ }),
105
+ new terraDraw.TerraDrawPolygonMode({
106
+ editable: true,
107
+ showCoordinatePoints: true,
108
+ snapping: { toCustom }
109
+ }),
110
+ new terraDraw.TerraDrawAngledRectangleMode(),
111
+ new terraDraw.TerraDrawFreehandMode(),
112
+ new terraDraw.TerraDrawSectorMode(),
113
+ new terraDraw.TerraDrawCircleMode(),
114
+ new terraDraw.TerraDrawSelectMode({
115
+ flags: {
116
+ polygon: {
117
+ feature: {
118
+ draggable: true,
119
+ coordinates: {
120
+ snappable: true,
121
+ deletable: true,
122
+ midpoints: {
123
+ draggable: true
124
+ },
125
+ draggable: true,
126
+ }
127
+ }
128
+ },
129
+ linestring: {
130
+ feature: {
131
+ draggable: true,
132
+ coordinates: {
133
+ snappable: true,
134
+ deletable: true,
135
+ midpoints: {
136
+ draggable: true
137
+ },
138
+ draggable: true,
139
+ }
140
+ }
141
+ },
142
+ point: {
143
+ feature: {
144
+ draggable: true,
145
+ }
146
+ }
147
+ }
148
+ })
149
+ ]
150
+ });
151
+
152
+ this.draw.on('finish', async (id, context) => {
153
+ if (context.action === "draw") {
154
+ if (this.draw.getMode() === DrawToolMode.STATIC || this.editing) {
155
+ return;
156
+ } else if (this.mode === DrawToolMode.FREEHAND) {
157
+ const feat = this.draw.getSnapshotFeature(id);
158
+ if (!feat) throw new Error('Could not find underlying marker');
159
+ this.removeFeature(id);
160
+ this.stop();
161
+
162
+ if (!this.lasso.overlay || this.lasso.overlay === "CoT Icons") {
163
+ const touching = await this.mapStore.worker.db.touching(feat.geometry as Polygon);
164
+
165
+ for (const cot of touching.values()) {
166
+ this.mapStore.selected.set(cot.id, cot);
167
+ }
168
+ } else {
169
+ const ov = this.mapStore.getOverlayByName(this.lasso.overlay);
170
+ if (!ov) throw new Error('Could not find overlay');
171
+
172
+ this.lasso.loading = true;
173
+
174
+ try {
175
+ const url = stdurl(`/api/basemap/${ov.mode_id}/feature`);
176
+
177
+ const fc = await std(url, {
178
+ method: 'POST',
179
+ body: {
180
+ polygon: feat.geometry
181
+ }
182
+ }) as FeatureCollection;
183
+
184
+ mapStore.toImport = fc.features.map((f) => {
185
+ const id = randomUUID();
186
+
187
+ return {
188
+ id,
189
+ type: 'Feature',
190
+ path: '/',
191
+ properties: {
192
+ id,
193
+ type: 'u-d-p',
194
+ how: 'h-g-i-g-o',
195
+ color: '#00FF00',
196
+ archived: true,
197
+ time: new Date().toISOString(),
198
+ start: new Date().toISOString(),
199
+ stale: new Date().toISOString(),
200
+ center: pointOnFeature(f).geometry.coordinates,
201
+ callsign: 'New Feature'
202
+ },
203
+ geometry: f.geometry
204
+ }
205
+ });
206
+
207
+ this.lasso.loading = false;
208
+ } catch (err) {
209
+ this.lasso.loading = false;
210
+ console.error(err);
211
+ throw new Error('Error fetching lasso features');
212
+ }
213
+ }
214
+ } else {
215
+ const storeFeat = this.draw.getSnapshotFeature(id);
216
+ if (!storeFeat) throw new Error('Could not find underlying marker');
217
+
218
+ const now = new Date();
219
+ const feat: Feature = {
220
+ id: String(id),
221
+ type: 'Feature',
222
+ path: '/',
223
+ properties: {
224
+ id: String(id),
225
+ type: 'u-d-p',
226
+ how: 'h-g-i-g-o',
227
+ archived: true,
228
+ callsign: 'New Feature',
229
+ time: now.toISOString(),
230
+ start: now.toISOString(),
231
+ stale: new Date(now.getTime() + 3600).toISOString(),
232
+ center: [0,0]
233
+ },
234
+ geometry: JSON.parse(JSON.stringify(storeFeat.geometry))
235
+ };
236
+
237
+ if (
238
+ this.mode === DrawToolMode.POLYGON
239
+ || this.mode === DrawToolMode.RECTANGLE
240
+ || this.mode === DrawToolMode.SECTOR
241
+ ) {
242
+ feat.properties.type = 'u-d-f';
243
+ } else if (this.mode === DrawToolMode.LINESTRING) {
244
+ feat.properties.type = 'u-d-f';
245
+ } else if (this.mode === DrawToolMode.CIRCLE) {
246
+ feat.properties.type = 'u-d-c-c';
247
+ } else if (this.mode === DrawToolMode.POINT) {
248
+ feat.properties.type = this.point.type
249
+ feat.properties["marker-opacity"] = 1;
250
+
251
+ if (this.point.type === 'u-d-p') {
252
+ feat.properties["marker-color"] = '#00FF00';
253
+ } else {
254
+ feat.properties["marker-color"] = '#FFFFFF';
255
+ }
256
+ }
257
+
258
+ this.removeFeature(id);
259
+
260
+ await this.stop();
261
+
262
+ await this.mapStore.worker.db.add(feat, {
263
+ authored: true
264
+ });
265
+
266
+ await this.mapStore.refresh();
267
+ }
268
+ }
269
+ })
270
+
271
+ // Deselect event is for editing existing features
272
+ this.draw.on('deselect', async () => {
273
+ if (!this.editing) return;
274
+
275
+ const feat = this.draw.getSnapshotFeature(this.editing.id);
276
+
277
+ if (!feat) throw new Error('Could not find underlying marker');
278
+
279
+ delete feat.properties.center;
280
+
281
+ const editing = this.editing;
282
+
283
+ await this.stop();
284
+
285
+ await this.mapStore.worker.db.add(feat as Feature, {
286
+ authored: true
287
+ });
288
+
289
+ await this.mapStore.refresh();
290
+
291
+ if (editing && editing.origin.mode === OriginMode.MISSION && editing.origin.mode_id) {
292
+ await this.mapStore.loadMission(editing.origin.mode_id);
293
+ } else {
294
+ await this.mapStore.worker.db.unhide(editing.id);
295
+ await this.mapStore.refresh();
296
+ }
297
+ });
298
+
299
+ this.mode = DrawToolMode.STATIC;
300
+ this.snapping = new Set();
301
+ this.editing = null;
302
+
303
+ this.point = {
304
+ type: 'u-d-p'
305
+ }
306
+
307
+ this.lasso = {
308
+ loading: false,
309
+ overlay: 'CoT Icons'
310
+ }
311
+ }
312
+
313
+ async start(mode: DrawToolMode): Promise<void> {
314
+ this.mode = mode;
315
+ this.draw.start();
316
+ this.draw.setMode(mode)
317
+
318
+ this.snapping = await this.mapStore.worker.db.snapping(
319
+ this.mapStore.map.getBounds().toArray()
320
+ );
321
+ }
322
+
323
+ async stop(refresh = true): Promise<void> {
324
+ this.mode = DrawToolMode.STATIC;
325
+
326
+ // Reset cursor to default BEFORE stopping draw operations
327
+ this.mapStore.map.getCanvas().style.cursor = '';
328
+
329
+ this.draw.stop();
330
+ this.snapping.clear()
331
+
332
+ if (!this.editing) return;
333
+
334
+ await Filter.delete({ external: `hidden-${this.editing.id}` });
335
+
336
+ if (refresh) {
337
+ if (this.editing && this.editing.origin.mode === OriginMode.MISSION && this.editing.origin.mode_id) {
338
+ await this.mapStore.loadMission(this.editing.origin.mode_id);
339
+ this.editing = null;
340
+ } else {
341
+ await this.mapStore.worker.db.unhide(this.editing.id);
342
+ this.editing = null;
343
+
344
+ await this.mapStore.refresh();
345
+ }
346
+ }
347
+ }
348
+
349
+ async edit(cot: COT) {
350
+ this.editing = cot;
351
+
352
+ this.start(DrawToolMode.SELECT);
353
+
354
+ try {
355
+ const feat = cot.as_feature({ clone: true });
356
+ if (feat.geometry.type === 'Polygon') {
357
+ feat.properties.mode = 'polygon';
358
+ } else if (feat.geometry.type === 'LineString') {
359
+ feat.properties.mode = 'linestring';
360
+ } else if (feat.geometry.type === 'Point') {
361
+ feat.properties.mode = 'point';
362
+ }
363
+
364
+ coordEach(feat, (coord) => {
365
+ if (coord.length > 2) {
366
+ coord.splice(2, coord.length - 2);
367
+ }
368
+
369
+ // Ensure precision is within bounds
370
+ for (let i = 0; i < coord.length; i++) {
371
+ coord[i] = Math.round(coord[i] * Math.pow(10, 9)) / Math.pow(10, 9);
372
+ }
373
+ });
374
+
375
+ await Filter.create(
376
+ cot.properties.callsign + ' Hidden',
377
+ `hidden-${cot.id}`,
378
+ 'AtlasDatabase',
379
+ true,
380
+ `id = "${cot.id}"`
381
+ )
382
+
383
+ if (cot.origin.mode === OriginMode.MISSION && cot.origin.mode_id) {
384
+ await this.mapStore.loadMission(cot.origin.mode_id);
385
+ } else {
386
+ await this.mapStore.worker.db.hide(cot.id);
387
+ await this.mapStore.refresh();
388
+ }
389
+
390
+ const errorStatus = this.draw.addFeatures([feat as terraDraw.GeoJSONStoreFeatures]).filter((status) => {
391
+ return !status.valid;
392
+ });
393
+
394
+ if (errorStatus.length) {
395
+ throw new Error('Error editing this feature: ' + errorStatus[0].reason)
396
+ }
397
+
398
+ this.draw.selectFeature(cot.id);
399
+ } catch (err) {
400
+ await this.stop();
401
+
402
+ throw err;
403
+ }
404
+ }
405
+
406
+ getFeature(id: GeoJSONFeatureId) {
407
+ return this.draw.getSnapshotFeature(id);
408
+ }
409
+
410
+ removeFeature(id: GeoJSONFeatureId): void {
411
+ return this.draw.removeFeatures([id]);
412
+ }
413
+ }
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Icon Color Manager for runtime icon recoloring
3
+ */
4
+ import ms from 'milsymbol'
5
+ import Icon from '../../base/icon.ts'
6
+ import type { Map as MapLibreMap } from 'maplibre-gl';
7
+ import type { IconsetList, Iconset } from '../../types.ts';
8
+ import { std, stdurl } from '../../std.ts';
9
+ import { db, type DBIconset } from '../../base/database.ts';
10
+
11
+ export default class IconManager {
12
+ private cache = new Map<string, HTMLCanvasElement>();
13
+ private map: MapLibreMap;
14
+
15
+ constructor(map: MapLibreMap) {
16
+ this.map = map;
17
+ }
18
+
19
+ static async from(uid: string): Promise<DBIconset | undefined> {
20
+ return await db.iconset.get(uid);
21
+ }
22
+
23
+ async addIconset(uid: string): Promise<void> {
24
+ const iconset = await std(`/api/iconset/${uid}`) as Iconset;
25
+
26
+ await db.iconset.put(iconset);
27
+
28
+ this.map.addSprite(
29
+ iconset.uid,
30
+ String(stdurl(`/api/iconset/${iconset.uid}/sprite?token=${localStorage.token}`))
31
+ );
32
+ }
33
+
34
+ async removeIconset(uid: string): Promise<void> {
35
+ this.map.removeSprite(uid);
36
+ await db.iconset.delete(uid);
37
+ }
38
+
39
+ static async sprites(): Promise<Array<{
40
+ id: string,
41
+ url: string
42
+ }>> {
43
+ const sprites = [{
44
+ id: 'default',
45
+ url: String(stdurl(`/api/iconset/default/sprite?token=${localStorage.token}`))
46
+ }]
47
+
48
+ // Eventually make a sprite URL part of the overlay so KMLs can load a sprite package & add paging support
49
+ const iconsets = await std('/api/iconset?limit=100') as IconsetList;
50
+
51
+ await db.iconset.bulkPut(iconsets.items);
52
+
53
+ for (const iconset of iconsets.items) {
54
+ sprites.push({
55
+ id: iconset.uid,
56
+ url: String(stdurl(`/api/iconset/${iconset.uid}/sprites?token=${localStorage.token}`))
57
+ });
58
+ }
59
+
60
+ return sprites;
61
+ }
62
+
63
+ public async updateImages(): Promise<void> {
64
+ const images = this.map.listImages();
65
+
66
+ await Icon.populate(images);
67
+ }
68
+
69
+ public async onStyleImageMissing(e: { id: string }): Promise<void> {
70
+ if (e.id.startsWith('2525D:')) {
71
+ const sidc = e.id.replace('2525D:', '');
72
+ const size = 24;
73
+ const data = new ms.Symbol(sidc, { size }).asCanvas();
74
+
75
+ this.map.addImage(e.id, await createImageBitmap(data));
76
+ } else if (e.id.includes('-colored-')) {
77
+ // This is a colored icon, we need to load it from the icon manager
78
+ const parts = e.id.split('-colored-');
79
+ const originalIconId = parts[0];
80
+ const color = '#' + parts[1];
81
+
82
+ this.getColoredIcon(originalIconId, color);
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Get or create a colored version of an icon
88
+ */
89
+ public getColoredIcon(iconId: string, color: string): string {
90
+ const coloredIconId = `${iconId}-colored-${color.slice(1)}`;
91
+
92
+ if (!this.cache.has(coloredIconId)) {
93
+ this.createColoredIcon(iconId, color, coloredIconId);
94
+ }
95
+
96
+ return coloredIconId;
97
+ }
98
+
99
+ /**
100
+ * Create a colored version of an icon and add it to the map
101
+ */
102
+ private createColoredIcon(iconId: string, color: string, coloredIconId: string): void {
103
+ // Get the original icon from the map
104
+ const originalImage = this.map.getImage(iconId);
105
+ if (!originalImage) {
106
+ console.warn(`Icon ${iconId} not found in map`);
107
+ return;
108
+ }
109
+
110
+ // Create canvas for recoloring
111
+ const canvas = document.createElement('canvas');
112
+ const ctx = canvas.getContext('2d');
113
+ if (!ctx) return;
114
+
115
+ canvas.width = originalImage.data.width;
116
+ canvas.height = originalImage.data.height;
117
+
118
+ // Create ImageData from the original image
119
+ const imageData = new ImageData(
120
+ new Uint8ClampedArray(originalImage.data.data),
121
+ originalImage.data.width,
122
+ originalImage.data.height
123
+ );
124
+
125
+ // Recolor white pixels
126
+ this.recolorWhitePixels(imageData, color);
127
+
128
+ // Draw to canvas
129
+ ctx.putImageData(imageData, 0, 0);
130
+
131
+ // Cache and add to map
132
+ this.cache.set(coloredIconId, canvas);
133
+
134
+ // Convert canvas to ImageData for map
135
+ const canvasImageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
136
+ this.map.addImage(coloredIconId, {
137
+ width: canvas.width,
138
+ height: canvas.height,
139
+ data: canvasImageData.data
140
+ });
141
+ }
142
+
143
+ /**
144
+ * Replace white/light pixels with the target color
145
+ */
146
+ private recolorWhitePixels(imageData: ImageData, color: string): void {
147
+ const data = imageData.data;
148
+ const [r, g, b] = this.hexToRgb(color);
149
+
150
+ for (let i = 0; i < data.length; i += 4) {
151
+ const alpha = data[i + 3];
152
+
153
+ // Skip transparent pixels
154
+ if (alpha === 0) continue;
155
+
156
+ // Check if pixel is white or light colored
157
+ if (this.isWhitePixel(data[i], data[i + 1], data[i + 2])) {
158
+ data[i] = r; // Red
159
+ data[i + 1] = g; // Green
160
+ data[i + 2] = b; // Blue
161
+ // Keep original alpha
162
+ }
163
+ }
164
+ }
165
+
166
+ /**
167
+ * Check if a pixel is considered "white" (should be recolored)
168
+ */
169
+ private isWhitePixel(r: number, g: number, b: number): boolean {
170
+ // Consider pixels white if they are very light (above 200 in all channels)
171
+ return r > 200 && g > 200 && b > 200;
172
+ }
173
+
174
+ /**
175
+ * Convert hex color to RGB values
176
+ */
177
+ private hexToRgb(hex: string): [number, number, number] {
178
+ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
179
+ return result ? [
180
+ parseInt(result[1], 16),
181
+ parseInt(result[2], 16),
182
+ parseInt(result[3], 16)
183
+ ] : [0, 255, 0]; // Default to green if parsing fails
184
+ }
185
+ }