@defra/interactive-map 0.0.16-alpha → 0.0.18-alpha

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 (224) hide show
  1. package/assets/images/slot-map.svg +264 -0
  2. package/dist/css/index.css +1 -1
  3. package/dist/esm/im-core.js +1 -1
  4. package/dist/esm/im-shell.js +1 -1
  5. package/dist/umd/im-core.js +1 -1
  6. package/dist/umd/index.js +1 -1
  7. package/docs/api/context.md +53 -7
  8. package/docs/api/map-style-config.md +41 -2
  9. package/docs/api/marker-config.md +53 -11
  10. package/docs/api/slots.md +16 -15
  11. package/docs/api/symbol-config.md +160 -0
  12. package/docs/api/symbol-registry.md +115 -0
  13. package/docs/api.md +25 -22
  14. package/docs/getting-started.md +4 -1
  15. package/docs/plugins/datasets.md +657 -0
  16. package/docs/plugins/interact.md +68 -43
  17. package/docs/plugins/search.md +15 -3
  18. package/docs/plugins.md +1 -1
  19. package/package.json +2 -2
  20. package/plugins/beta/datasets/dist/css/index.css +103 -15
  21. package/plugins/beta/datasets/dist/esm/im-datasets-plugin.js +1 -1
  22. package/plugins/beta/datasets/dist/esm/index.js +1 -1
  23. package/plugins/beta/datasets/dist/umd/im-datasets-plugin.js +1 -1
  24. package/plugins/beta/datasets/dist/umd/index.js +1 -1
  25. package/plugins/beta/datasets/src/DatasetsInit.jsx +29 -9
  26. package/plugins/beta/datasets/src/adapters/maplibre/index.js +18 -0
  27. package/plugins/beta/datasets/src/adapters/maplibre/layerBuilders.js +159 -0
  28. package/plugins/beta/datasets/src/adapters/maplibre/layerIds.js +75 -0
  29. package/plugins/beta/datasets/src/adapters/maplibre/maplibreLayerAdapter.js +440 -0
  30. package/plugins/beta/datasets/src/adapters/maplibre/patternImages.js +27 -0
  31. package/plugins/beta/datasets/src/adapters/maplibre/symbolImages.js +31 -0
  32. package/plugins/beta/datasets/src/api/addDataset.js +2 -8
  33. package/plugins/beta/datasets/src/api/getOpacity.js +17 -0
  34. package/plugins/beta/datasets/src/api/getStyle.js +13 -0
  35. package/plugins/beta/datasets/src/api/removeDataset.js +2 -44
  36. package/plugins/beta/datasets/src/api/setData.js +10 -0
  37. package/plugins/beta/datasets/src/api/setDatasetVisibility.js +37 -0
  38. package/plugins/beta/datasets/src/api/setFeatureVisibility.js +22 -0
  39. package/plugins/beta/datasets/src/api/setOpacity.js +29 -0
  40. package/plugins/beta/datasets/src/api/setStyle.js +22 -0
  41. package/plugins/beta/datasets/src/components/EmptyKey.jsx +7 -0
  42. package/plugins/beta/datasets/src/components/EmptyKey.test.jsx +21 -0
  43. package/plugins/beta/datasets/src/components/KeySvg.jsx +24 -0
  44. package/plugins/beta/datasets/src/components/KeySvgLine.jsx +19 -0
  45. package/plugins/beta/datasets/src/components/KeySvgPattern.jsx +15 -0
  46. package/plugins/beta/datasets/src/components/KeySvgRect.jsx +22 -0
  47. package/plugins/beta/datasets/src/components/KeySvgSymbol.jsx +16 -0
  48. package/plugins/beta/datasets/src/components/svgProperties.js +20 -0
  49. package/plugins/beta/datasets/src/datasets.js +39 -56
  50. package/plugins/beta/datasets/src/defaults.js +44 -8
  51. package/plugins/beta/datasets/src/fetch/createDynamicSource.js +34 -25
  52. package/plugins/beta/datasets/src/fetch/fetchGeoJSON.js +2 -2
  53. package/plugins/beta/datasets/src/index.js +2 -1
  54. package/plugins/beta/datasets/src/manifest.js +25 -17
  55. package/plugins/beta/datasets/src/panels/Key.jsx +51 -51
  56. package/plugins/beta/datasets/src/panels/Key.module.scss +59 -9
  57. package/plugins/beta/datasets/src/panels/Layers.jsx +132 -29
  58. package/plugins/beta/datasets/src/panels/Layers.module.scss +56 -8
  59. package/plugins/beta/datasets/src/reducer.js +134 -9
  60. package/plugins/beta/datasets/src/reducers/keyReducer.js +34 -0
  61. package/plugins/beta/datasets/src/utils/bbox.js +7 -5
  62. package/plugins/beta/datasets/src/utils/filters.js +5 -2
  63. package/plugins/beta/datasets/src/utils/mergeSublayer.js +86 -0
  64. package/plugins/beta/draw-es/dist/esm/im-draw-es-plugin.js +1 -1
  65. package/plugins/beta/draw-es/src/DrawInit.jsx +3 -2
  66. package/plugins/beta/draw-ml/dist/css/index.css +21 -1
  67. package/plugins/beta/draw-ml/dist/esm/im-draw-ml-plugin.js +1 -1
  68. package/plugins/beta/draw-ml/dist/umd/im-draw-ml-plugin.js +1 -1
  69. package/plugins/beta/draw-ml/dist/umd/index.js +1 -1
  70. package/plugins/beta/draw-ml/src/DrawInit.jsx +4 -3
  71. package/plugins/beta/draw-ml/src/draw.scss +0 -7
  72. package/plugins/beta/draw-ml/src/manifest.js +16 -16
  73. package/plugins/beta/frame/dist/esm/im-frame-plugin.js +1 -1
  74. package/plugins/beta/frame/dist/umd/im-frame-plugin.js +1 -1
  75. package/plugins/beta/frame/src/Frame.jsx +5 -5
  76. package/plugins/beta/map-styles/dist/esm/im-map-styles-plugin.js +1 -1
  77. package/plugins/beta/map-styles/dist/umd/im-map-styles-plugin.js +1 -1
  78. package/plugins/beta/map-styles/dist/umd/index.js +1 -1
  79. package/plugins/beta/map-styles/src/MapStyles.jsx +5 -4
  80. package/plugins/beta/map-styles/src/MapStylesInit.jsx +5 -4
  81. package/plugins/beta/map-styles/src/manifest.js +1 -1
  82. package/plugins/beta/scale-bar/dist/css/index.css +1 -1
  83. package/plugins/beta/scale-bar/dist/esm/im-scale-bar-plugin.js +1 -1
  84. package/plugins/beta/scale-bar/dist/umd/im-scale-bar-plugin.js +1 -1
  85. package/plugins/beta/scale-bar/src/index.test.js +3 -3
  86. package/plugins/beta/scale-bar/src/manifest.js +3 -3
  87. package/plugins/beta/scale-bar/src/scaleBar.scss +2 -1
  88. package/plugins/interact/dist/css/index.css +1 -1
  89. package/plugins/interact/dist/esm/im-interact-plugin.js +1 -1
  90. package/plugins/interact/dist/umd/im-interact-plugin.js +1 -1
  91. package/plugins/interact/dist/umd/index.js +1 -1
  92. package/plugins/interact/src/InteractInit.jsx +14 -5
  93. package/plugins/interact/src/InteractInit.test.js +26 -6
  94. package/plugins/interact/src/api/enable.test.js +7 -7
  95. package/plugins/interact/src/defaults.js +4 -6
  96. package/plugins/interact/src/events.js +9 -6
  97. package/plugins/interact/src/events.test.js +28 -4
  98. package/plugins/interact/src/hooks/useHighlightSync.js +3 -3
  99. package/plugins/interact/src/hooks/useHighlightSync.test.js +6 -6
  100. package/plugins/interact/src/hooks/useHoverCursor.js +10 -0
  101. package/plugins/interact/src/hooks/useHoverCursor.test.js +44 -0
  102. package/plugins/interact/src/hooks/useInteractionHandlers.js +111 -69
  103. package/plugins/interact/src/hooks/useInteractionHandlers.test.js +147 -32
  104. package/plugins/interact/src/interact.scss +0 -7
  105. package/plugins/interact/src/manifest.js +14 -18
  106. package/plugins/interact/src/manifest.test.js +3 -1
  107. package/plugins/interact/src/reducer.js +23 -4
  108. package/plugins/interact/src/reducer.test.js +60 -11
  109. package/plugins/interact/src/utils/buildStylesMap.js +17 -4
  110. package/plugins/interact/src/utils/buildStylesMap.test.js +16 -2
  111. package/plugins/interact/src/utils/featureQueries.js +11 -6
  112. package/plugins/interact/src/utils/featureQueries.test.js +8 -1
  113. package/plugins/search/dist/css/index.css +1 -1
  114. package/plugins/search/dist/esm/im-search-plugin.js +1 -1
  115. package/plugins/search/dist/umd/im-search-plugin.js +1 -1
  116. package/plugins/search/src/Search.jsx +3 -1
  117. package/plugins/search/src/components/Form/Form.module.scss +2 -1
  118. package/plugins/search/src/events/fetchSuggestions.js +6 -4
  119. package/plugins/search/src/events/fetchSuggestions.test.js +26 -4
  120. package/plugins/search/src/events/formHandlers.js +3 -3
  121. package/plugins/search/src/events/formHandlers.test.js +1 -1
  122. package/plugins/search/src/events/suggestionHandlers.js +2 -2
  123. package/plugins/search/src/events/suggestionHandlers.test.js +1 -1
  124. package/plugins/search/src/utils/updateMap.js +3 -3
  125. package/plugins/search/src/utils/updateMap.test.js +3 -3
  126. package/providers/maplibre/dist/esm/im-maplibre-provider.js +1 -1
  127. package/providers/maplibre/dist/umd/im-maplibre-framework.js +1 -1
  128. package/providers/maplibre/dist/umd/im-maplibre-framework.js.LICENSE.txt +1 -1
  129. package/providers/maplibre/dist/umd/im-maplibre-provider.js +1 -1
  130. package/providers/maplibre/dist/umd/index.js +1 -1
  131. package/providers/maplibre/src/appEvents.js +7 -0
  132. package/providers/maplibre/src/appEvents.test.js +18 -4
  133. package/providers/maplibre/src/maplibreProvider.js +52 -0
  134. package/providers/maplibre/src/maplibreProvider.test.js +105 -1
  135. package/providers/maplibre/src/utils/highlightFeatures.js +37 -7
  136. package/providers/maplibre/src/utils/highlightFeatures.test.js +153 -95
  137. package/providers/maplibre/src/utils/hoverCursor.js +61 -0
  138. package/providers/maplibre/src/utils/hoverCursor.test.js +130 -0
  139. package/providers/maplibre/src/utils/patternImages.js +70 -0
  140. package/providers/maplibre/src/utils/patternImages.test.js +180 -0
  141. package/providers/maplibre/src/utils/queryFeatures.js +38 -16
  142. package/providers/maplibre/src/utils/queryFeatures.test.js +20 -3
  143. package/providers/maplibre/src/utils/rasteriseToImageData.js +30 -0
  144. package/providers/maplibre/src/utils/rasteriseToImageData.test.js +69 -0
  145. package/providers/maplibre/src/utils/symbolImages.js +147 -0
  146. package/providers/maplibre/src/utils/symbolImages.test.js +248 -0
  147. package/src/App/components/Actions/Actions.jsx +2 -2
  148. package/src/App/components/Actions/Actions.module.scss +0 -7
  149. package/src/App/components/Actions/Actions.test.jsx +1 -1
  150. package/src/App/components/Icon/Icon.jsx +3 -2
  151. package/src/App/components/Icon/Icon.module.scss +4 -0
  152. package/src/App/components/Icon/Icon.test.jsx +43 -4
  153. package/src/App/components/MapButton/MapButton.jsx +42 -17
  154. package/src/App/components/MapButton/MapButton.module.scss +4 -13
  155. package/src/App/components/MapButton/MapButton.test.jsx +27 -3
  156. package/src/App/components/Markers/Markers.jsx +122 -27
  157. package/src/App/components/Markers/Markers.module.scss +0 -10
  158. package/src/App/components/Markers/Markers.test.jsx +246 -0
  159. package/src/App/components/PopupMenu/PopupMenu.jsx +51 -274
  160. package/src/App/components/PopupMenu/PopupMenu.module.scss +14 -7
  161. package/src/App/components/PopupMenu/PopupMenu.test.jsx +70 -1
  162. package/src/App/components/PopupMenu/usePopupMenu.js +258 -0
  163. package/src/App/hooks/useButtonStateEvaluator.js +12 -2
  164. package/src/App/hooks/useButtonStateEvaluator.test.js +38 -4
  165. package/src/App/hooks/useInterfaceAPI.js +6 -0
  166. package/src/App/hooks/useInterfaceAPI.test.js +156 -0
  167. package/src/App/hooks/useLayoutMeasurements.js +84 -18
  168. package/src/App/hooks/useLayoutMeasurements.test.js +124 -17
  169. package/src/App/hooks/useMarkersAPI.js +2 -5
  170. package/src/App/hooks/useMarkersAPI.test.js +4 -4
  171. package/src/App/layout/Layout.jsx +14 -9
  172. package/src/App/layout/Layout.test.jsx +6 -4
  173. package/src/App/layout/layout.module.scss +67 -29
  174. package/src/App/registry/pluginRegistry.js +1 -1
  175. package/src/App/renderer/HtmlElementHost.jsx +2 -1
  176. package/src/App/renderer/HtmlElementHost.test.jsx +7 -7
  177. package/src/App/renderer/mapButtons.js +1 -1
  178. package/src/App/renderer/mapPanels.test.js +2 -2
  179. package/src/App/renderer/slotHelpers.js +2 -2
  180. package/src/App/renderer/slotHelpers.test.js +5 -5
  181. package/src/App/renderer/slots.js +9 -5
  182. package/src/App/store/AppProvider.jsx +3 -1
  183. package/src/App/store/AppProvider.test.jsx +1 -1
  184. package/src/App/store/ServiceProvider.jsx +8 -4
  185. package/src/App/store/appActionsMap.js +16 -0
  186. package/src/App/store/appActionsMap.test.js +27 -0
  187. package/src/App/store/appDispatchMiddleware.js +1 -1
  188. package/src/App/store/appDispatchMiddleware.test.js +2 -2
  189. package/src/App/store/appReducer.js +2 -0
  190. package/src/App/store/mapActionsMap.js +4 -6
  191. package/src/App/store/mapActionsMap.test.js +3 -2
  192. package/src/App/store/mapReducer.js +2 -1
  193. package/src/InteractiveMap/InteractiveMap.js +4 -0
  194. package/src/config/appConfig.js +5 -8
  195. package/src/config/appConfig.test.js +1 -2
  196. package/src/config/defaults.js +0 -2
  197. package/src/config/events.js +28 -0
  198. package/src/config/mapTheme.js +56 -0
  199. package/src/config/patternConfig.js +16 -0
  200. package/src/config/symbolConfig.js +80 -0
  201. package/src/scss/main.scss +1 -0
  202. package/src/scss/settings/_colors.scss +0 -9
  203. package/src/scss/settings/_dimensions.scss +0 -1
  204. package/src/services/patternRegistry.js +40 -0
  205. package/src/services/patternRegistry.test.js +48 -0
  206. package/src/services/symbolRegistry.js +113 -0
  207. package/src/services/symbolRegistry.test.js +262 -0
  208. package/src/types.js +93 -11
  209. package/src/utils/getSafeZoneInset.js +9 -7
  210. package/src/utils/getSafeZoneInset.test.js +10 -10
  211. package/src/utils/patternUtils.js +94 -0
  212. package/src/utils/patternUtils.test.js +160 -0
  213. package/src/utils/symbolUtils.js +85 -0
  214. package/src/utils/symbolUtils.test.js +156 -0
  215. package/webpack.dev.mjs +1 -1
  216. package/docs/api/slot-map.svg +0 -1
  217. package/plugins/beta/datasets/src/api/hideDataset.js +0 -14
  218. package/plugins/beta/datasets/src/api/hideFeatures.js +0 -41
  219. package/plugins/beta/datasets/src/api/showDataset.js +0 -14
  220. package/plugins/beta/datasets/src/api/showFeatures.js +0 -44
  221. package/plugins/beta/datasets/src/handleSetMapStyle.js +0 -54
  222. package/plugins/beta/datasets/src/mapLayers.js +0 -164
  223. /package/src/{utils → services}/logger.js +0 -0
  224. /package/src/{utils → services}/logger.test.js +0 -0
@@ -1,16 +1,32 @@
1
+ import { applyDatasetDefaults } from './defaults.js'
2
+ import { keyReducer } from './reducers/keyReducer.js'
3
+
1
4
  const initialState = {
2
5
  datasets: null,
3
- hiddenFeatures: {} // { [layerId]: { idProperty: string, ids: string[] } }
6
+ key: {
7
+ items: [],
8
+ hasGroups: false
9
+ },
10
+ hiddenFeatures: {}, // { [layerId]: { idProperty: string, ids: string[] } }
11
+ layerAdapter: null
12
+ }
13
+
14
+ const initSublayerVisibility = (dataset) => {
15
+ if (!dataset.sublayers?.length) {
16
+ return dataset
17
+ }
18
+ const sublayerVisibility = {}
19
+ dataset.sublayers.forEach(sublayer => {
20
+ sublayerVisibility[sublayer.id] = 'visible'
21
+ })
22
+ return { ...dataset, sublayerVisibility }
4
23
  }
5
24
 
6
25
  const setDatasets = (state, payload) => {
7
26
  const { datasets, datasetDefaults } = payload
8
27
  return {
9
28
  ...state,
10
- datasets: datasets.map(dataset => ({
11
- ...datasetDefaults,
12
- ...dataset
13
- }))
29
+ datasets: datasets.map(dataset => initSublayerVisibility(applyDatasetDefaults(dataset, datasetDefaults)))
14
30
  }
15
31
  }
16
32
 
@@ -20,7 +36,7 @@ const addDataset = (state, payload) => {
20
36
  ...state,
21
37
  datasets: [
22
38
  ...(state.datasets || []),
23
- { ...datasetDefaults, ...dataset }
39
+ initSublayerVisibility(applyDatasetDefaults(dataset, datasetDefaults))
24
40
  ]
25
41
  }
26
42
  }
@@ -43,6 +59,14 @@ const setDatasetVisibility = (state, payload) => {
43
59
  }
44
60
  }
45
61
 
62
+ const setGlobalVisibility = (state, payload) => {
63
+ const { visibility } = payload
64
+ return {
65
+ ...state,
66
+ datasets: state.datasets?.map(dataset => ({ ...dataset, visibility }))
67
+ }
68
+ }
69
+
46
70
  const hideFeatures = (state, payload) => {
47
71
  const { layerId, idProperty, featureIds } = payload
48
72
  const existing = state.hiddenFeatures[layerId]
@@ -61,12 +85,15 @@ const hideFeatures = (state, payload) => {
61
85
  const showFeatures = (state, payload) => {
62
86
  const { layerId, featureIds } = payload
63
87
  const existing = state.hiddenFeatures[layerId]
64
- if (!existing) return state
88
+ if (!existing) {
89
+ return state
90
+ }
65
91
 
66
92
  const newIds = existing.ids.filter(id => !featureIds.includes(id))
67
93
 
68
94
  if (newIds.length === 0) {
69
- const { [layerId]: _, ...rest } = state.hiddenFeatures
95
+ const rest = { ...state.hiddenFeatures }
96
+ delete rest[layerId]
70
97
  return { ...state, hiddenFeatures: rest }
71
98
  }
72
99
 
@@ -79,13 +106,111 @@ const showFeatures = (state, payload) => {
79
106
  }
80
107
  }
81
108
 
109
+ const setSublayerVisibility = (state, payload) => {
110
+ const { datasetId, sublayerId, visibility } = payload
111
+ return {
112
+ ...state,
113
+ datasets: state.datasets?.map(dataset => {
114
+ if (dataset.id !== datasetId) {
115
+ return dataset
116
+ }
117
+ return {
118
+ ...dataset,
119
+ sublayerVisibility: {
120
+ ...dataset.sublayerVisibility,
121
+ [sublayerId]: visibility
122
+ }
123
+ }
124
+ })
125
+ }
126
+ }
127
+
128
+ const setDatasetStyle = (state, payload) => {
129
+ const { datasetId, styleChanges } = payload
130
+ return {
131
+ ...state,
132
+ datasets: state.datasets?.map(dataset =>
133
+ dataset.id === datasetId ? { ...dataset, ...styleChanges } : dataset
134
+ )
135
+ }
136
+ }
137
+
138
+ const setSublayerStyle = (state, payload) => {
139
+ const { datasetId, sublayerId, styleChanges } = payload
140
+ return {
141
+ ...state,
142
+ datasets: state.datasets?.map(dataset => {
143
+ if (dataset.id !== datasetId) {
144
+ return dataset
145
+ }
146
+ return {
147
+ ...dataset,
148
+ sublayers: dataset.sublayers?.map(sublayer =>
149
+ sublayer.id === sublayerId
150
+ ? { ...sublayer, style: { ...sublayer.style, ...styleChanges } }
151
+ : sublayer
152
+ )
153
+ }
154
+ })
155
+ }
156
+ }
157
+
158
+ const setOpacity = (state, payload) => {
159
+ const { datasetId, opacity } = payload
160
+ return {
161
+ ...state,
162
+ datasets: state.datasets?.map(dataset =>
163
+ dataset.id === datasetId ? { ...dataset, opacity } : dataset
164
+ )
165
+ }
166
+ }
167
+
168
+ const setGlobalOpacity = (state, payload) => {
169
+ const { opacity } = payload
170
+ return {
171
+ ...state,
172
+ datasets: state.datasets?.map(dataset => ({ ...dataset, opacity }))
173
+ }
174
+ }
175
+
176
+ const setSublayerOpacity = (state, payload) => {
177
+ const { datasetId, sublayerId, opacity } = payload
178
+ return {
179
+ ...state,
180
+ datasets: state.datasets?.map(dataset => {
181
+ if (dataset.id !== datasetId) {
182
+ return dataset
183
+ }
184
+ return {
185
+ ...dataset,
186
+ sublayers: dataset.sublayers?.map(sublayer =>
187
+ sublayer.id === sublayerId
188
+ ? { ...sublayer, style: { ...sublayer.style, opacity } }
189
+ : sublayer
190
+ )
191
+ }
192
+ })
193
+ }
194
+ }
195
+
196
+ const setLayerAdapter = (state, payload) => ({ ...state, layerAdapter: payload })
197
+
82
198
  const actions = {
199
+ BUILD_KEY_GROUPS: keyReducer,
83
200
  SET_DATASETS: setDatasets,
84
201
  ADD_DATASET: addDataset,
85
202
  REMOVE_DATASET: removeDataset,
86
203
  SET_DATASET_VISIBILITY: setDatasetVisibility,
204
+ SET_GLOBAL_VISIBILITY: setGlobalVisibility,
205
+ SET_SUBLAYER_VISIBILITY: setSublayerVisibility,
206
+ SET_DATASET_STYLE: setDatasetStyle,
207
+ SET_SUBLAYER_STYLE: setSublayerStyle,
208
+ SET_OPACITY: setOpacity,
209
+ SET_GLOBAL_OPACITY: setGlobalOpacity,
210
+ SET_SUBLAYER_OPACITY: setSublayerOpacity,
87
211
  HIDE_FEATURES: hideFeatures,
88
- SHOW_FEATURES: showFeatures
212
+ SHOW_FEATURES: showFeatures,
213
+ SET_LAYER_ADAPTER: setLayerAdapter
89
214
  }
90
215
 
91
216
  export {
@@ -0,0 +1,34 @@
1
+ export const keyReducer = (state) => {
2
+ const datasets = state.datasets || []
3
+ const seenGroups = new Set()
4
+ const items = []
5
+ let hasGroups = false
6
+ datasets.forEach(dataset => {
7
+ if (!dataset.showInKey || dataset.visibility === 'hidden') {
8
+ return
9
+ }
10
+ if (dataset.sublayers?.length) {
11
+ const { sublayerVisibility = [] } = dataset
12
+ if (Object.values(sublayerVisibility).some((value) => value !== 'hidden')) {
13
+ hasGroups = true
14
+ items.push({ type: 'sublayers', dataset })
15
+ }
16
+ return
17
+ }
18
+ if (dataset.groupLabel) {
19
+ if (seenGroups.has(dataset.groupLabel)) {
20
+ return
21
+ }
22
+ seenGroups.add(dataset.groupLabel)
23
+ hasGroups = true
24
+ items.push({
25
+ type: 'group',
26
+ groupLabel: dataset.groupLabel,
27
+ datasets: datasets.filter(d => !d.sublayers?.length && d.groupLabel === dataset.groupLabel)
28
+ })
29
+ return
30
+ }
31
+ items.push({ type: 'flat', dataset })
32
+ })
33
+ return { ...state, key: { items, hasGroups } }
34
+ }
@@ -22,7 +22,7 @@ export const bboxContains = (outer, inner) => {
22
22
  inner[0] >= outer[0] && // west
23
23
  inner[1] >= outer[1] && // south
24
24
  inner[2] <= outer[2] && // east
25
- inner[3] <= outer[3] // north
25
+ inner[3] <= outer[3] // NOSONAR, north
26
26
  )
27
27
  }
28
28
 
@@ -40,7 +40,7 @@ export const expandBbox = (existing, addition) => {
40
40
  Math.min(existing[0], addition[0]), // west
41
41
  Math.min(existing[1], addition[1]), // south
42
42
  Math.max(existing[2], addition[2]), // east
43
- Math.max(existing[3], addition[3]) // north
43
+ Math.max(existing[3], addition[3]) // NOSONAR, north
44
44
  ]
45
45
  }
46
46
 
@@ -57,8 +57,8 @@ export const bboxIntersects = (a, b) => {
57
57
  return !(
58
58
  a[2] < b[0] || // a is left of b
59
59
  a[0] > b[2] || // a is right of b
60
- a[3] < b[1] || // a is below b
61
- a[1] > b[3] // a is above b
60
+ a[3] < b[1] || // NOSONAR a is below b
61
+ a[1] > b[3] // NOSONAR a is above b
62
62
  )
63
63
  }
64
64
 
@@ -98,7 +98,7 @@ export const getGeometryBbox = (geometry) => {
98
98
  processCoords(geometry.coordinates, 2)
99
99
  break
100
100
  case 'MultiPolygon':
101
- processCoords(geometry.coordinates, 3)
101
+ processCoords(geometry.coordinates, 3) // NOSONAR: 3 = coordinate nesting depth for MultiPolygon ([polygons][rings][points])
102
102
  break
103
103
  case 'GeometryCollection':
104
104
  geometry.geometries.forEach(g => {
@@ -109,6 +109,8 @@ export const getGeometryBbox = (geometry) => {
109
109
  maxY = Math.max(maxY, b[3])
110
110
  })
111
111
  break
112
+ default:
113
+ throw new Error(`Unsupported geometry type: ${geometry.type}`)
112
114
  }
113
115
 
114
116
  return [minX, minY, maxX, maxY]
@@ -8,8 +8,11 @@ export const buildExclusionFilter = (originalFilter, idProperty, excludeIds) =>
8
8
  }
9
9
 
10
10
  // Coerce both sides to strings to handle number/string type mismatches
11
- const stringIds = excludeIds.map(id => String(id))
12
- const exclusionFilter = ['!', ['in', ['to-string', ['get', idProperty]], ['literal', stringIds]]]
11
+ // When no idProperty, use feature-level id via ['id'] (GeoJSON feature.id)
12
+ const idExpr = idProperty ? ['to-string', ['get', idProperty]] : ['to-string', ['id']]
13
+ // Convert all IDs to strings; map passes each element as the first argument to String
14
+ const stringIds = excludeIds.map(String)
15
+ const exclusionFilter = ['!', ['in', idExpr, ['literal', stringIds]]]
13
16
 
14
17
  if (!originalFilter) {
15
18
  return exclusionFilter
@@ -0,0 +1,86 @@
1
+ import { hasCustomVisualStyle } from '../defaults.js'
2
+
3
+ const getFillProps = (dataset, sublayerStyle) => {
4
+ if (sublayerStyle.fillPattern || sublayerStyle.fillPatternSvgContent) {
5
+ return {
6
+ fillPattern: sublayerStyle.fillPattern,
7
+ fillPatternSvgContent: sublayerStyle.fillPatternSvgContent,
8
+ fillPatternForegroundColor: sublayerStyle.fillPatternForegroundColor ?? dataset.fillPatternForegroundColor,
9
+ fillPatternBackgroundColor: sublayerStyle.fillPatternBackgroundColor ?? dataset.fillPatternBackgroundColor
10
+ }
11
+ }
12
+ if ('fill' in sublayerStyle) {
13
+ // Sublayer explicitly sets a plain fill — do not inherit any parent pattern
14
+ return { fill: sublayerStyle.fill }
15
+ }
16
+ return {
17
+ fill: dataset.fill,
18
+ fillPattern: dataset.fillPattern,
19
+ fillPatternSvgContent: dataset.fillPatternSvgContent,
20
+ fillPatternForegroundColor: dataset.fillPatternForegroundColor,
21
+ fillPatternBackgroundColor: dataset.fillPatternBackgroundColor
22
+ }
23
+ }
24
+
25
+ const getCombinedFilter = (datasetFilter, sublayerFilter) => {
26
+ if (datasetFilter && sublayerFilter) {
27
+ return ['all', datasetFilter, sublayerFilter]
28
+ }
29
+ return sublayerFilter || datasetFilter || null
30
+ }
31
+
32
+ const getSymbolDescription = (dataset, sublayerStyle) => {
33
+ if ('symbolDescription' in sublayerStyle) {
34
+ return sublayerStyle.symbolDescription
35
+ }
36
+ if (hasCustomVisualStyle(sublayerStyle)) {
37
+ return undefined
38
+ }
39
+ return dataset.symbolDescription
40
+ }
41
+
42
+ /**
43
+ * Merge a sublayer with its parent dataset, producing a flat style
44
+ * object suitable for layer creation and key symbol rendering.
45
+ *
46
+ * The sublayer's nested `style` object is flattened before merging.
47
+ *
48
+ * Fill precedence (highest to lowest):
49
+ * 1. Sublayer's own fillPattern
50
+ * 2. Sublayer's own fill (explicit, even if transparent — clears any parent pattern)
51
+ * 3. Parent's fillPattern
52
+ * 4. Parent's fill
53
+ *
54
+ * symbolDescription is only inherited from the parent when the sublayer has no
55
+ * custom visual styles of its own. If the sublayer overrides stroke/fill/pattern
56
+ * without setting symbolDescription explicitly, no description is shown.
57
+ */
58
+ export const mergeSublayer = (dataset, sublayer) => {
59
+ const sublayerStyle = sublayer.style || {}
60
+ const combinedFilter = getCombinedFilter(dataset.filter, sublayer.filter)
61
+
62
+ return {
63
+ id: sublayer.id,
64
+ label: sublayer.label,
65
+ stroke: sublayerStyle.stroke ?? dataset.stroke,
66
+ strokeWidth: sublayerStyle.strokeWidth ?? dataset.strokeWidth,
67
+ strokeDashArray: sublayerStyle.strokeDashArray ?? dataset.strokeDashArray,
68
+ opacity: sublayerStyle.opacity ?? dataset.opacity,
69
+ keySymbolShape: sublayerStyle.keySymbolShape ?? dataset.keySymbolShape,
70
+ symbolDescription: getSymbolDescription(dataset, sublayerStyle),
71
+ showInKey: sublayer.showInKey ?? dataset.showInKey,
72
+ toggleVisibility: sublayer.toggleVisibility ?? false,
73
+ filter: combinedFilter,
74
+ minZoom: dataset.minZoom,
75
+ maxZoom: dataset.maxZoom,
76
+ symbol: sublayerStyle.symbol ?? dataset.symbol,
77
+ symbolSvgContent: sublayerStyle.symbolSvgContent ?? dataset.symbolSvgContent,
78
+ symbolViewBox: sublayerStyle.symbolViewBox ?? dataset.symbolViewBox,
79
+ symbolAnchor: sublayerStyle.symbolAnchor ?? dataset.symbolAnchor,
80
+ symbolBackgroundColor: sublayerStyle.symbolBackgroundColor ?? dataset.symbolBackgroundColor,
81
+ symbolForegroundColor: sublayerStyle.symbolForegroundColor ?? dataset.symbolForegroundColor,
82
+ symbolHaloWidth: sublayerStyle.symbolHaloWidth ?? dataset.symbolHaloWidth,
83
+ symbolGraphic: sublayerStyle.symbolGraphic ?? dataset.symbolGraphic,
84
+ ...getFillProps(dataset, sublayerStyle)
85
+ }
86
+ }
@@ -1 +1 @@
1
- import e from"@babel/runtime/helpers/defineProperty";import{useEffect as t}from"preact/compat";import r from"@arcgis/core/widgets/Sketch/SketchViewModel.js";import o from"@arcgis/core/layers/GraphicsLayer.js";import a from"@babel/runtime/helpers/asyncToGenerator";import*as n from"@arcgis/core/geometry/operators/simplifyOperator.js";import i from"@arcgis/core/Graphic.js";function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,o)}return r}function p(t){for(var r=1;r<arguments.length;r++){var o=null!=arguments[r]?arguments[r]:{};r%2?l(Object(o),!0).forEach(function(r){e(t,r,o[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(o)):l(Object(o)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(o,e))})}return t}function c(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,o)}return r}function u(t){for(var r=1;r<arguments.length;r++){var o=null!=arguments[r]?arguments[r]:{};r%2?c(Object(o),!0).forEach(function(r){e(t,r,o[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(o)):c(Object(o)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(o,e))})}return t}function s(e){return{type:"simple-fill",color:[0,120,255,.2],outline:{color:"dark"===e?"#ffffff":"#d4351c",width:2}}}function d(e,t,r){return new i({geometry:{type:"polygon",rings:t,spatialReference:27700},attributes:{id:e},symbol:s(r)})}function y(e){if(null==e||!e.geometry)throw new Error("Invalid graphic");var{geometry:t,attributes:r={}}=e;switch(t.type){case"point":return{type:"Feature",geometry:{type:"Point",coordinates:[t.x,t.y]},properties:u({},r)};case"polyline":return{type:"Feature",geometry:{type:"LineString",coordinates:t.paths[0]},properties:u({},r)};case"polygon":return{type:"Feature",geometry:{type:"Polygon",coordinates:t.rings},properties:u({},r)};default:throw new Error("Unsupported geometry type: ".concat(t.type))}}function m(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,o)}return r}function v(t){for(var r=1;r<arguments.length;r++){var o=null!=arguments[r]?arguments[r]:{};r%2?m(Object(o),!0).forEach(function(r){e(t,r,o[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(o)):m(Object(o)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(o,e))})}return t}var f={mobile:{slot:"actions",showLabel:!0},tablet:{slot:"actions",showLabel:!0},desktop:{slot:"actions",showLabel:!0}},h={reducer:{initialState:{mode:null,feature:null,tempFeature:null},actions:{SET_MODE:(e,t)=>p(p({},e),{},{mode:t}),SET_FEATURE:(e,t)=>p(p({},e),{},{feature:void 0===t.feature?e.feature:t.feature,tempFeature:void 0===t.tempFeature?e.tempFeature:t.tempFeature})}},InitComponent:e=>{var i,l,p,c,{appState:u,mapState:m,pluginConfig:v,pluginState:f,services:h,mapProvider:g,buttonConfig:b}=e,{events:O,eventBus:w}=h,{mapColorScheme:S}=m.mapStyle||{},E=null===(i=null===(l=v.includeModes)||void 0===l?void 0:l.includes(u.mode))||void 0===i||i,k=null!==(p=null===(c=v.excludeModes)||void 0===c?void 0:c.includes(u.mode))&&void 0!==p&&p,P=m.isMapReady&&E&&!k;t(()=>{if(P&&!g.sketchViewModel){var{sketchViewModel:e,sketchLayer:t,emptySketchLayer:a}=(e=>{var{mapProvider:t}=e,{view:a}=t,n=new o({id:"sketchLayer"});a.map.add(n);var i=new o({id:"emptySketchLayer"});return a.map.add(i),{sketchViewModel:new r({view:a,layer:i,defaultUpdateOptions:{tool:"reshape",updateOnGraphicClick:!1,multipleSelectionEnabled:!1,toggleToolOnClick:!1,highlightOptions:{enabled:!1}}}),emptySketchLayer:i,sketchLayer:n}})({mapProvider:g});return g.sketchViewModel=e,g.sketchLayer=t,g.emptySketchLayer=a,w.emit("draw:ready"),()=>{g.sketchViewModel=null,g.sketchLayer=null,g.emptySketchLayer=null}}},[m.isMapReady,u.mode]),t(()=>{if(P&&g.sketchViewModel){var e=function(e){var{pluginState:t,mapProvider:r,events:o,eventBus:i,buttonConfig:l,mapColorScheme:p}=e,{view:c,sketchViewModel:u,sketchLayer:m,emptySketchLayer:v}=r;if(!u)return null;var{drawDone:f,drawCancel:h}=l,{dispatch:g,mode:b,feature:O}=t,w=function(){var e=a(function*(){var e,r=null===(e=t.feature)||void 0===e||null===(e=e.properties)||void 0===e?void 0:e.id,o=null,a="active"===u.state&&!r;if("active"===u.state&&r&&(u.cancel(),yield new Promise(e=>setTimeout(e,50))),u.polygonSymbol=s(p),null==m||m.graphics.items.forEach(e=>{var t=d(e.attributes.id,e.geometry.rings,p);e.symbol=t.symbol,r===e.attributes.id&&(o=e)}),o&&!a&&u.layer===m)try{yield u.update(o,{tool:"reshape",toggleToolOnClick:!1})}catch(e){"AbortError"!==e.name&&console.error("Error updating sketch:",e)}});return function(){return e.apply(this,arguments)}}(),S=()=>{var e,t,r=null!==(e=null===(t=m.graphics)||void 0===t||null===(t=t.items)||void 0===t?void 0:t[0])&&void 0!==e?e:null;r&&setTimeout(()=>u.update(r),0)},E=()=>w(),k=e=>{if(e){var t=y(e);i.emit("draw:updated",t),g({type:"SET_FEATURE",payload:{tempFeature:t}})}},P=function(){var e=a(function*(){b&&((u.updateGraphics||[]).length||S())});return function(){return e.apply(this,arguments)}}(),j=function(){var e=a(function*(e){var{toolEventInfo:t}=e,r=null==e?void 0:e.graphic;if(r&&"vertex-add"===(null==t?void 0:t.type)){var o,a,n=null===(o=r.geometry)||void 0===o?void 0:o.rings;(null==n?void 0:n.length)>1?setTimeout(()=>u.undo(),0):(null==n||null===(a=n[0])||void 0===a?void 0:a.length)>3&&k(r)}});return function(t){return e.apply(this,arguments)}}(),T=function(){var e=a(function*(e){var t,r=null==e||null===(t=e.graphics)||void 0===t?void 0:t[0];k(r)});return function(t){return e.apply(this,arguments)}}();i.on(o.MAP_STYLE_CHANGE,E);var C=u.on("update",e=>{var t,r=null===(t=e.toolEventInfo)||void 0===t?void 0:t.type,o=e.graphics[0];"move-start"===r&&(u.cancel(),S()),"reshape"===r&&(n.isSimple(o.geometry)||u.undo()),"reshape-stop"!==r&&"vertex-remove"!==r||k(o)}),F=c.on("click",P),L=u.on("create",j),M=u.on("undo",T),D=f.onClick,_=h.onClick;return f.onClick=()=>{u.cancel(),u.layer=v,g({type:"SET_MODE",payload:null}),g({type:"SET_FEATURE",payload:{feature:null,tempFeature:null}}),i.emit("draw:done",{newFeature:t.tempFeature})},h.onClick=()=>{if(u.cancel(),m.removeAll(),O){var e=d(O.id||O.properties.id,O.geometry.coordinates,p);m.add(e)}u.layer=v,g({type:"SET_MODE",payload:null}),i.emit("draw:cancelled")},()=>{i.off(o.MAP_STYLE_CHANGE,E),C.remove(),F.remove(),L.remove(),M.remove(),f.onClick=D,h.onClick=_}}({pluginState:f,mapProvider:g,events:O,eventBus:w,buttonConfig:b,mapColorScheme:S});return()=>{e()}}},[P,S,f])},buttons:[v({id:"drawDone",label:"Done",variant:"primary",hiddenWhen:e=>{var{pluginState:t}=e;return!t.mode},enableWhen:e=>{var{pluginState:t}=e;return!!t.tempFeature}},f),v({id:"drawCancel",label:"Cancel",variant:"tertiary",hiddenWhen:e=>{var{pluginState:t}=e;return!t.mode}},f)],api:{newPolygon:(e,t)=>{var{mapState:r,pluginState:o,mapProvider:a,services:n}=e,{dispatch:i}=o,{sketchViewModel:l,sketchLayer:p}=a,{eventBus:c}=n;l.layer=p;var u=l.on("create",e=>{if("complete"===e.state){e.graphic.attributes={id:t},requestAnimationFrame(()=>{l.update(e.graphic,{tool:"reshape",toggleToolOnClick:!1})});var r=y(e.graphic);c.emit("draw:created",r),i({type:"SET_FEATURE",payload:{tempFeature:r}}),u.remove()}});l.polygonSymbol=s(r.mapStyle.mapColorScheme),l.create("polygon"),i({type:"SET_MODE",payload:"new-polygon"})},editFeature:(e,t)=>{var{pluginState:r,mapProvider:o}=e,{dispatch:a}=r,{sketchViewModel:n,sketchLayer:i}=o,l=i.graphics.items.find(e=>e.attributes.id===t),p=l.geometry.extent,c=[p.xmin,p.ymin,p.xmax,p.ymax];o.fitToBounds(c),n.layer=i,n.update(l,{tool:"reshape",toggleToolOnClick:!1,enableRotation:!1,enableScaling:!1}),a({type:"SET_FEATURE",payload:{feature:y(l)}}),a({type:"SET_MODE",payload:"edit-feature"})},addFeature:(e,t)=>{var{pluginState:r,mapState:o,mapProvider:a,services:n}=e,{dispatch:i}=r,{mapStyle:l}=o,{sketchViewModel:p,sketchLayer:c,emptySketchLayer:u}=a,{eventBus:s}=n,y=d(t.id,t.geometry.coordinates,l.mapColorScheme);c.add(y),p.layer=u,i({type:"SET_FEATURE",payload:{feature:t}}),s.emit("draw:add",t)},deleteFeature:(e,t)=>{var{pluginState:r,mapProvider:o,services:a}=e,{dispatch:n}=r,{sketchViewModel:i,sketchLayer:l,emptySketchLayer:p}=o,{eventBus:c}=a,u=l.graphics.items.find(e=>e.attributes.id===t);i.cancel(),l.remove(u),i.layer=p,n({type:"SET_FEATURE",payload:{feature:null,tempFeature:null}}),c.emit("draw:delete",{featureId:t}),n({type:"SET_MODE",payload:null})}}};export{h as manifest};
1
+ import e from"@babel/runtime/helpers/defineProperty";import{useEffect as t}from"preact/compat";import r from"@arcgis/core/widgets/Sketch/SketchViewModel.js";import a from"@arcgis/core/layers/GraphicsLayer.js";import o from"@babel/runtime/helpers/asyncToGenerator";import*as n from"@arcgis/core/geometry/operators/simplifyOperator.js";import i from"@arcgis/core/Graphic.js";function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,a)}return r}function l(t){for(var r=1;r<arguments.length;r++){var a=null!=arguments[r]?arguments[r]:{};r%2?p(Object(a),!0).forEach(function(r){e(t,r,a[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):p(Object(a)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))})}return t}var c={APP_ADD_MARKER:"app:addmarker",APP_REMOVE_MARKER:"app:removemarker",APP_SET_MODE:"app:setmode",APP_REVERT_MODE:"app:revertmode",APP_ADD_BUTTON:"app:addbutton",APP_TOGGLE_BUTTON_STATE:"app:togglebuttonstate",APP_ADD_PANEL:"app:addpanel",APP_REMOVE_PANEL:"app:removepanel",APP_SHOW_PANEL:"app:showpanel",APP_HIDE_PANEL:"app:hidepanel",APP_ADD_CONTROL:"app:addcontrol",APP_READY:"app:ready",APP_VISIBLE:"app:visible",APP_HIDDEN:"app:hidden",APP_PANEL_OPENED:"app:panelopened",APP_PANEL_CLOSED:"app:panelclosed",MAP_SET_STYLE:"map:setstyle",MAP_SET_SIZE:"map:setsize",MAP_SET_PIXEL_RATIO:"map:setpixelratio",MAP_FIT_TO_BOUNDS:"map:fittobounds",MAP_SET_VIEW:"map:setview",MAP_INIT_MAP_STYLES:"map:initmapstyles",MAP_STYLE_CHANGE:"map:stylechange",MAP_LOADED:"map:loaded",MAP_READY:"map:ready",MAP_SIZE_CHANGE:"map:sizechange",MAP_FIRST_IDLE:"map:firstidle",MAP_MOVE_START:"map:movestart",MAP_MOVE:"map:move",MAP_MOVE_END:"map:moveend",MAP_STATE_UPDATED:"map:stateupdated",MAP_DATA_CHANGE:"map:datachange",MAP_RENDER:"map:render",MAP_CLICK:"map:click",MAP_EXIT:"map:exit",MAP_DESTROY:"map:destroy"};function d(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,a)}return r}function s(t){for(var r=1;r<arguments.length;r++){var a=null!=arguments[r]?arguments[r]:{};r%2?d(Object(a),!0).forEach(function(r){e(t,r,a[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):d(Object(a)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))})}return t}function u(e){return{type:"simple-fill",color:[0,120,255,.2],outline:{color:"dark"===e?"#ffffff":"#d4351c",width:2}}}function m(e,t,r){return new i({geometry:{type:"polygon",rings:t,spatialReference:27700},attributes:{id:e},symbol:u(r)})}function y(e){if(null==e||!e.geometry)throw new Error("Invalid graphic");var{geometry:t,attributes:r={}}=e;switch(t.type){case"point":return{type:"Feature",geometry:{type:"Point",coordinates:[t.x,t.y]},properties:s({},r)};case"polyline":return{type:"Feature",geometry:{type:"LineString",coordinates:t.paths[0]},properties:s({},r)};case"polygon":return{type:"Feature",geometry:{type:"Polygon",coordinates:t.rings},properties:s({},r)};default:throw new Error("Unsupported geometry type: ".concat(t.type))}}function v(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,a)}return r}function h(t){for(var r=1;r<arguments.length;r++){var a=null!=arguments[r]?arguments[r]:{};r%2?v(Object(a),!0).forEach(function(r){e(t,r,a[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):v(Object(a)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))})}return t}var f={mobile:{slot:"actions",showLabel:!0},tablet:{slot:"actions",showLabel:!0},desktop:{slot:"actions",showLabel:!0}},E={reducer:{initialState:{mode:null,feature:null,tempFeature:null},actions:{SET_MODE:(e,t)=>l(l({},e),{},{mode:t}),SET_FEATURE:(e,t)=>l(l({},e),{},{feature:void 0===t.feature?e.feature:t.feature,tempFeature:void 0===t.tempFeature?e.tempFeature:t.tempFeature})}},InitComponent:e=>{var i,p,l,d,{appState:s,mapState:v,pluginConfig:h,pluginState:f,services:E,mapProvider:P,buttonConfig:g}=e,{eventBus:O}=E,{mapColorScheme:_}=v.mapStyle||{},S=null===(i=null===(p=h.includeModes)||void 0===p?void 0:p.includes(s.mode))||void 0===i||i,b=null!==(l=null===(d=h.excludeModes)||void 0===d?void 0:d.includes(s.mode))&&void 0!==l&&l,A=v.isMapReady&&S&&!b;t(()=>{if(A&&!P.sketchViewModel){var{sketchViewModel:e,sketchLayer:t,emptySketchLayer:o}=(e=>{var{mapProvider:t}=e,{view:o}=t,n=new a({id:"sketchLayer"});o.map.add(n);var i=new a({id:"emptySketchLayer"});return o.map.add(i),{sketchViewModel:new r({view:o,layer:i,defaultUpdateOptions:{tool:"reshape",updateOnGraphicClick:!1,multipleSelectionEnabled:!1,toggleToolOnClick:!1,highlightOptions:{enabled:!1}}}),emptySketchLayer:i,sketchLayer:n}})({mapProvider:P});return P.sketchViewModel=e,P.sketchLayer=t,P.emptySketchLayer=o,O.emit("draw:ready"),()=>{P.sketchViewModel=null,P.sketchLayer=null,P.emptySketchLayer=null}}},[v.isMapReady,s.mode]),t(()=>{if(A&&P.sketchViewModel){var e=function(e){var{pluginState:t,mapProvider:r,events:a,eventBus:i,buttonConfig:p,mapColorScheme:l}=e,{view:c,sketchViewModel:d,sketchLayer:s,emptySketchLayer:v}=r;if(!d)return null;var{drawDone:h,drawCancel:f}=p,{dispatch:E,mode:P,feature:g}=t,O=function(){var e=o(function*(){var e,r=null===(e=t.feature)||void 0===e||null===(e=e.properties)||void 0===e?void 0:e.id,a=null,o="active"===d.state&&!r;if("active"===d.state&&r&&(d.cancel(),yield new Promise(e=>setTimeout(e,50))),d.polygonSymbol=u(l),null==s||s.graphics.items.forEach(e=>{var t=m(e.attributes.id,e.geometry.rings,l);e.symbol=t.symbol,r===e.attributes.id&&(a=e)}),a&&!o&&d.layer===s)try{yield d.update(a,{tool:"reshape",toggleToolOnClick:!1})}catch(e){"AbortError"!==e.name&&console.error("Error updating sketch:",e)}});return function(){return e.apply(this,arguments)}}(),_=()=>{var e,t,r=null!==(e=null===(t=s.graphics)||void 0===t||null===(t=t.items)||void 0===t?void 0:t[0])&&void 0!==e?e:null;r&&setTimeout(()=>d.update(r),0)},S=()=>O(),b=e=>{if(e){var t=y(e);i.emit("draw:updated",t),E({type:"SET_FEATURE",payload:{tempFeature:t}})}},A=function(){var e=o(function*(){P&&((d.updateGraphics||[]).length||_())});return function(){return e.apply(this,arguments)}}(),w=function(){var e=o(function*(e){var{toolEventInfo:t}=e,r=null==e?void 0:e.graphic;if(r&&"vertex-add"===(null==t?void 0:t.type)){var a,o,n=null===(a=r.geometry)||void 0===a?void 0:a.rings;(null==n?void 0:n.length)>1?setTimeout(()=>d.undo(),0):(null==n||null===(o=n[0])||void 0===o?void 0:o.length)>3&&b(r)}});return function(t){return e.apply(this,arguments)}}(),T=function(){var e=o(function*(e){var t,r=null==e||null===(t=e.graphics)||void 0===t?void 0:t[0];b(r)});return function(t){return e.apply(this,arguments)}}();i.on(a.MAP_STYLE_CHANGE,S);var M=d.on("update",e=>{var t,r=null===(t=e.toolEventInfo)||void 0===t?void 0:t.type,a=e.graphics[0];"move-start"===r&&(d.cancel(),_()),"reshape"===r&&(n.isSimple(a.geometry)||d.undo()),"reshape-stop"!==r&&"vertex-remove"!==r||b(a)}),k=c.on("click",A),D=d.on("create",w),L=d.on("undo",T),j=h.onClick,C=f.onClick;return h.onClick=()=>{d.cancel(),d.layer=v,E({type:"SET_MODE",payload:null}),E({type:"SET_FEATURE",payload:{feature:null,tempFeature:null}}),i.emit("draw:done",{newFeature:t.tempFeature})},f.onClick=()=>{if(d.cancel(),s.removeAll(),g){var e=m(g.id||g.properties.id,g.geometry.coordinates,l);s.add(e)}d.layer=v,E({type:"SET_MODE",payload:null}),i.emit("draw:cancelled")},()=>{i.off(a.MAP_STYLE_CHANGE,S),M.remove(),k.remove(),D.remove(),L.remove(),h.onClick=j,f.onClick=C}}({pluginState:f,mapProvider:P,events:c,eventBus:O,buttonConfig:g,mapColorScheme:_});return()=>{e()}}},[A,_,f])},buttons:[h({id:"drawDone",label:"Done",variant:"primary",hiddenWhen:e=>{var{pluginState:t}=e;return!t.mode},enableWhen:e=>{var{pluginState:t}=e;return!!t.tempFeature}},f),h({id:"drawCancel",label:"Cancel",variant:"tertiary",hiddenWhen:e=>{var{pluginState:t}=e;return!t.mode}},f)],api:{newPolygon:(e,t)=>{var{mapState:r,pluginState:a,mapProvider:o,services:n}=e,{dispatch:i}=a,{sketchViewModel:p,sketchLayer:l}=o,{eventBus:c}=n;p.layer=l;var d=p.on("create",e=>{if("complete"===e.state){e.graphic.attributes={id:t},requestAnimationFrame(()=>{p.update(e.graphic,{tool:"reshape",toggleToolOnClick:!1})});var r=y(e.graphic);c.emit("draw:created",r),i({type:"SET_FEATURE",payload:{tempFeature:r}}),d.remove()}});p.polygonSymbol=u(r.mapStyle.mapColorScheme),p.create("polygon"),i({type:"SET_MODE",payload:"new-polygon"})},editFeature:(e,t)=>{var{pluginState:r,mapProvider:a}=e,{dispatch:o}=r,{sketchViewModel:n,sketchLayer:i}=a,p=i.graphics.items.find(e=>e.attributes.id===t),l=p.geometry.extent,c=[l.xmin,l.ymin,l.xmax,l.ymax];a.fitToBounds(c),n.layer=i,n.update(p,{tool:"reshape",toggleToolOnClick:!1,enableRotation:!1,enableScaling:!1}),o({type:"SET_FEATURE",payload:{feature:y(p)}}),o({type:"SET_MODE",payload:"edit-feature"})},addFeature:(e,t)=>{var{pluginState:r,mapState:a,mapProvider:o,services:n}=e,{dispatch:i}=r,{mapStyle:p}=a,{sketchViewModel:l,sketchLayer:c,emptySketchLayer:d}=o,{eventBus:s}=n,u=m(t.id,t.geometry.coordinates,p.mapColorScheme);c.add(u),l.layer=d,i({type:"SET_FEATURE",payload:{feature:t}}),s.emit("draw:add",t)},deleteFeature:(e,t)=>{var{pluginState:r,mapProvider:a,services:o}=e,{dispatch:n}=r,{sketchViewModel:i,sketchLayer:p,emptySketchLayer:l}=a,{eventBus:c}=o,d=p.graphics.items.find(e=>e.attributes.id===t);i.cancel(),p.remove(d),i.layer=l,n({type:"SET_FEATURE",payload:{feature:null,tempFeature:null}}),c.emit("draw:delete",{featureId:t}),n({type:"SET_MODE",payload:null})}}};export{E as manifest};
@@ -1,4 +1,5 @@
1
1
  import { useEffect } from 'react'
2
+ import { EVENTS } from '../../../../src/config/events.js'
2
3
  import { createSketchViewModel } from './sketchViewModel.js'
3
4
  import { attachEvents } from './events.js'
4
5
 
@@ -11,7 +12,7 @@ export const DrawInit = ({
11
12
  mapProvider,
12
13
  buttonConfig
13
14
  }) => {
14
- const { events, eventBus } = services
15
+ const { eventBus } = services
15
16
  const { mapColorScheme } = mapState.mapStyle || {}
16
17
 
17
18
  // Check if plugin should be active
@@ -52,7 +53,7 @@ export const DrawInit = ({
52
53
  const cleanup = attachEvents({
53
54
  pluginState,
54
55
  mapProvider,
55
- events,
56
+ events: EVENTS,
56
57
  eventBus,
57
58
  buttonConfig,
58
59
  mapColorScheme
@@ -1 +1,21 @@
1
- .touch-vertex-target circle{fill:var(--map-overlay-foreground-color)}.touch-vertex-target path{fill:var(--map-overlay-halo-color)}.im-c-actions .im-c-button-wrapper--draw-done,.im-c-actions .im-c-button-wrapper--draw-menu,.im-c-actions .im-c-button-wrapper--draw-cancel{width:33.33%}.im-o-app--tablet .im-c-actions .im-c-button-wrapper--draw-done,.im-o-app--tablet .im-c-actions .im-c-button-wrapper--draw-menu,.im-o-app--tablet .im-c-actions .im-c-button-wrapper--draw-cancel,.im-o-app--desktop .im-c-actions .im-c-button-wrapper--draw-done,.im-o-app--desktop .im-c-actions .im-c-button-wrapper--draw-menu,.im-o-app--desktop .im-c-actions .im-c-button-wrapper--draw-cancel{width:100px}.im-c-button-wrapper--draw-add-point{position:absolute;bottom:calc(100% + var(--primary-gap));z-index:0}
1
+ .touch-vertex-target circle {
2
+ fill: var(--map-overlay-foreground-color);
3
+ }
4
+ .touch-vertex-target path {
5
+ fill: var(--map-overlay-halo-color);
6
+ }
7
+
8
+ .im-c-actions .im-c-button-wrapper--draw-done,
9
+ .im-c-actions .im-c-button-wrapper--draw-menu,
10
+ .im-c-actions .im-c-button-wrapper--draw-cancel {
11
+ width: 33.33%;
12
+ }
13
+
14
+ .im-o-app--tablet .im-c-actions .im-c-button-wrapper--draw-done,
15
+ .im-o-app--tablet .im-c-actions .im-c-button-wrapper--draw-menu,
16
+ .im-o-app--tablet .im-c-actions .im-c-button-wrapper--draw-cancel,
17
+ .im-o-app--desktop .im-c-actions .im-c-button-wrapper--draw-done,
18
+ .im-o-app--desktop .im-c-actions .im-c-button-wrapper--draw-menu,
19
+ .im-o-app--desktop .im-c-actions .im-c-button-wrapper--draw-cancel {
20
+ width: 100px;
21
+ }