@esri/solutions-components 0.6.8 → 0.6.10

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 (789) hide show
  1. package/dist/assets/t9n/crowdsource-manager/resources.json +2 -1
  2. package/dist/assets/t9n/crowdsource-manager/resources_en.json +2 -1
  3. package/dist/assets/t9n/info-card/resources.json +5 -2
  4. package/dist/assets/t9n/info-card/resources_en.json +5 -2
  5. package/dist/assets/t9n/layer-table/resources.json +2 -1
  6. package/dist/assets/t9n/layer-table/resources_en.json +2 -1
  7. package/dist/assets/t9n/map-tools/resources.json +1 -4
  8. package/dist/assets/t9n/map-tools/resources_en.json +1 -4
  9. package/dist/cjs/{ExpandToggle-e6a0d66e.js → ExpandToggle-c5690e14.js} +5 -5
  10. package/dist/cjs/{FloatingArrow-0119ec6e.js → FloatingArrow-675171a6.js} +1 -1
  11. package/dist/cjs/{Heading-521f39ac.js → Heading-3712677d.js} +1 -1
  12. package/dist/cjs/{app-globals-72576a1c.js → app-globals-a62ad1ad.js} +3 -3
  13. package/dist/cjs/{ar-1718ae57.js → ar-1dc23c0a.js} +14 -14
  14. package/dist/cjs/{array-46bb7df1.js → array-2db3fd4a.js} +1 -1
  15. package/dist/cjs/{basemap-gallery_4.cjs.entry.js → basemap-gallery_5.cjs.entry.js} +120 -66
  16. package/dist/cjs/{bg-190a176c.js → bg-4024b354.js} +14 -14
  17. package/dist/cjs/{bs-919e0de8.js → bs-3134d711.js} +14 -14
  18. package/dist/cjs/buffer-tools_4.cjs.entry.js +15 -15
  19. package/dist/cjs/{ca-94918e06.js → ca-8d6647d3.js} +14 -14
  20. package/dist/cjs/calcite-accordion-item.cjs.entry.js +7 -12
  21. package/dist/cjs/calcite-accordion.cjs.entry.js +1 -6
  22. package/dist/cjs/calcite-action-bar.cjs.entry.js +31 -26
  23. package/dist/cjs/calcite-action-group_2.cjs.entry.js +18 -20
  24. package/dist/cjs/calcite-action-pad.cjs.entry.js +20 -16
  25. package/dist/cjs/calcite-action_2.cjs.entry.js +17 -22
  26. package/dist/cjs/calcite-alert.cjs.entry.js +11 -11
  27. package/dist/cjs/calcite-avatar.cjs.entry.js +6 -6
  28. package/dist/cjs/calcite-block-section.cjs.entry.js +9 -9
  29. package/dist/cjs/calcite-block.cjs.entry.js +12 -12
  30. package/dist/cjs/calcite-button.cjs.entry.js +12 -12
  31. package/dist/cjs/calcite-card.cjs.entry.js +9 -9
  32. package/dist/cjs/calcite-checkbox.cjs.entry.js +8 -13
  33. package/dist/cjs/calcite-chip-group.cjs.entry.js +6 -11
  34. package/dist/cjs/calcite-chip.cjs.entry.js +11 -11
  35. package/dist/cjs/calcite-color-picker-hex-input_2.cjs.entry.js +8 -8
  36. package/dist/cjs/calcite-color-picker.cjs.entry.js +12 -12
  37. package/dist/cjs/calcite-combobox-item-group.cjs.entry.js +5 -5
  38. package/dist/cjs/calcite-combobox_6.cjs.entry.js +21 -26
  39. package/dist/cjs/calcite-date-picker-day_3.cjs.entry.js +10 -10
  40. package/dist/cjs/calcite-date-picker.cjs.entry.js +11 -11
  41. package/dist/cjs/calcite-fab.cjs.entry.js +6 -6
  42. package/dist/cjs/calcite-filter_5.cjs.entry.js +16 -16
  43. package/dist/cjs/calcite-flow-item.cjs.entry.js +11 -11
  44. package/dist/cjs/calcite-flow.cjs.entry.js +3 -3
  45. package/dist/cjs/calcite-graph.cjs.entry.js +5 -10
  46. package/dist/cjs/calcite-icon.cjs.entry.js +6 -6
  47. package/dist/cjs/calcite-inline-editable.cjs.entry.js +11 -11
  48. package/dist/cjs/calcite-input-date-picker.cjs.entry.js +17 -17
  49. package/dist/cjs/calcite-input-number_2.cjs.entry.js +13 -13
  50. package/dist/cjs/{calcite-input-time-picker-b99baf7b.js → calcite-input-time-picker-4efcd55d.js} +60 -60
  51. package/dist/cjs/calcite-input-time-picker.cjs.entry.js +14 -14
  52. package/dist/cjs/calcite-input-time-zone.cjs.entry.js +12 -12
  53. package/dist/cjs/calcite-input_2.cjs.entry.js +12 -12
  54. package/dist/cjs/calcite-label.cjs.entry.js +5 -5
  55. package/dist/cjs/calcite-link.cjs.entry.js +5 -5
  56. package/dist/cjs/calcite-list-item-group.cjs.entry.js +3 -3
  57. package/dist/cjs/calcite-loader.cjs.entry.js +1 -1
  58. package/dist/cjs/calcite-menu-item.cjs.entry.js +9 -9
  59. package/dist/cjs/calcite-menu.cjs.entry.js +9 -9
  60. package/dist/cjs/calcite-modal.cjs.entry.js +12 -12
  61. package/dist/cjs/calcite-navigation-logo.cjs.entry.js +2 -2
  62. package/dist/cjs/calcite-navigation-user.cjs.entry.js +2 -2
  63. package/dist/cjs/calcite-navigation.cjs.entry.js +5 -5
  64. package/dist/cjs/calcite-notice.cjs.entry.js +11 -11
  65. package/dist/cjs/calcite-option_2.cjs.entry.js +9 -9
  66. package/dist/cjs/calcite-pagination.cjs.entry.js +9 -9
  67. package/dist/cjs/calcite-panel_2.cjs.entry.js +14 -14
  68. package/dist/cjs/calcite-pick-list-group.cjs.entry.js +7 -7
  69. package/dist/cjs/calcite-pick-list-item.cjs.entry.js +12 -12
  70. package/dist/cjs/calcite-pick-list.cjs.entry.js +10 -10
  71. package/dist/cjs/calcite-radio-button-group.cjs.entry.js +2 -7
  72. package/dist/cjs/calcite-radio-button.cjs.entry.js +9 -9
  73. package/dist/cjs/calcite-rating.cjs.entry.js +12 -12
  74. package/dist/cjs/calcite-scrim.cjs.entry.js +8 -8
  75. package/dist/cjs/calcite-segmented-control_2.cjs.entry.js +8 -8
  76. package/dist/cjs/calcite-shell-center-row.cjs.entry.js +6 -6
  77. package/dist/cjs/calcite-shell-panel_14.cjs.entry.js +29 -32
  78. package/dist/cjs/calcite-sortable-list.cjs.entry.js +7 -7
  79. package/dist/cjs/calcite-split-button.cjs.entry.js +3 -3
  80. package/dist/cjs/calcite-stepper-item.cjs.entry.js +8 -8
  81. package/dist/cjs/calcite-stepper.cjs.entry.js +3 -8
  82. package/dist/cjs/calcite-switch.cjs.entry.js +8 -8
  83. package/dist/cjs/calcite-text-area.cjs.entry.js +15 -15
  84. package/dist/cjs/calcite-tile-select-group.cjs.entry.js +1 -1
  85. package/dist/cjs/calcite-tile-select.cjs.entry.js +4 -4
  86. package/dist/cjs/calcite-tile.cjs.entry.js +7 -7
  87. package/dist/cjs/calcite-time-picker.cjs.entry.js +10 -10
  88. package/dist/cjs/calcite-tip-manager.cjs.entry.js +9 -9
  89. package/dist/cjs/calcite-tip.cjs.entry.js +10 -10
  90. package/dist/cjs/calcite-tooltip.cjs.entry.js +9 -9
  91. package/dist/cjs/calcite-tree_3.cjs.entry.js +8 -8
  92. package/dist/cjs/{card-manager_4.cjs.entry.js → card-manager_3.cjs.entry.js} +65 -101
  93. package/dist/cjs/{conditionalSlot-85b3a6b3.js → conditionalSlot-126d557f.js} +2 -2
  94. package/dist/cjs/crowdsource-manager.cjs.entry.js +50 -16
  95. package/dist/cjs/{cs-fe27e732.js → cs-b24cd994.js} +14 -14
  96. package/dist/cjs/{da-1b7f3440.js → da-9dee3a1f.js} +14 -14
  97. package/dist/cjs/{date-cec32b0e.js → date-0fec6f6b.js} +2 -2
  98. package/dist/cjs/{de-0dc1effa.js → de-1a98b964.js} +14 -14
  99. package/dist/cjs/{de-at-acdc4d01.js → de-at-782e6c7f.js} +14 -14
  100. package/dist/cjs/{de-ch-778a0d99.js → de-ch-d5c95469.js} +14 -14
  101. package/dist/cjs/{dom-c1807fc1.js → dom-456f9f13.js} +3 -3
  102. package/dist/cjs/{downloadUtils-a8c530f7.js → downloadUtils-471a6a2d.js} +258 -265
  103. package/dist/cjs/edit-card_2.cjs.entry.js +38 -5
  104. package/dist/cjs/{el-fdbc9bc1.js → el-af28cafa.js} +14 -14
  105. package/dist/cjs/{en-au-0ff50cdf.js → en-au-109f3119.js} +14 -14
  106. package/dist/cjs/{en-ca-284e9368.js → en-ca-22890a25.js} +14 -14
  107. package/dist/cjs/{en-gb-0fcae8ae.js → en-gb-dc23c9dd.js} +14 -14
  108. package/dist/cjs/{es-cd54acba.js → es-3f353355.js} +14 -14
  109. package/dist/cjs/{es-mx-2078d50f.js → es-mx-ccb57857.js} +14 -14
  110. package/dist/cjs/{et-17f323f6.js → et-119c047b.js} +14 -14
  111. package/dist/cjs/{fi-82f27397.js → fi-13096d81.js} +14 -14
  112. package/dist/cjs/{filter-bda212b4.js → filter-8d8c453e.js} +1 -1
  113. package/dist/cjs/{floating-ui-8d10af88.js → floating-ui-2b0fbba0.js} +2 -2
  114. package/dist/cjs/{focusTrapComponent-a22fc6a8.js → focusTrapComponent-d8412ddc.js} +4 -4
  115. package/dist/cjs/{form-9d8ebf06.js → form-7c6054c3.js} +2 -2
  116. package/dist/cjs/{fr-af7e1192.js → fr-563dfcd5.js} +14 -14
  117. package/dist/cjs/{fr-ch-5e1f2c28.js → fr-ch-f66cfd49.js} +14 -14
  118. package/dist/cjs/{guid-3abe3cc6.js → guid-d1123d5e.js} +1 -1
  119. package/dist/cjs/{he-ea851800.js → he-d8253a1a.js} +14 -14
  120. package/dist/cjs/{hi-5212a21d.js → hi-58c7c3b5.js} +14 -14
  121. package/dist/cjs/{hr-4eecb2ed.js → hr-5aba114a.js} +14 -14
  122. package/dist/cjs/{hu-6b527d8e.js → hu-38c15915.js} +14 -14
  123. package/dist/cjs/{id-d78f12ec.js → id-3a94c080.js} +14 -14
  124. package/dist/cjs/{index.es-4542630e.js → index.es-33154f03.js} +3 -3
  125. package/dist/cjs/{interactive-2fe0f43a.js → interactive-48299817.js} +2 -2
  126. package/dist/cjs/{it-15242935.js → it-88834555.js} +14 -14
  127. package/dist/cjs/{it-ch-9dc21944.js → it-ch-970563cd.js} +14 -14
  128. package/dist/cjs/{ja-f702cfc2.js → ja-13d4b1ae.js} +14 -14
  129. package/dist/cjs/{key-b8b55ea3.js → key-8de93212.js} +1 -1
  130. package/dist/cjs/{ko-aa9bde2c.js → ko-10cbdd98.js} +14 -14
  131. package/dist/cjs/{label-6e33e971.js → label-166e2d81.js} +3 -3
  132. package/dist/cjs/layout-manager.cjs.entry.js +93 -0
  133. package/dist/cjs/{loadModules-31cab7ac.js → loadModules-c5490589.js} +1 -1
  134. package/dist/cjs/{loadable-bac9cdd6.js → loadable-6925d840.js} +1 -1
  135. package/dist/cjs/loader.cjs.js +3 -3
  136. package/dist/cjs/{locale-c63a1b57.js → locale-79c3d30e.js} +5 -5
  137. package/dist/cjs/{locale-d15cd743.js → locale-88c21da2.js} +15 -15
  138. package/dist/cjs/{lt-e741ff2f.js → lt-3fc5017a.js} +14 -14
  139. package/dist/cjs/{lv-92d6768e.js → lv-9d9cf999.js} +14 -14
  140. package/dist/cjs/map-select-tools_3.cjs.entry.js +3 -3
  141. package/dist/cjs/{math-5132d9bd.js → math-f28069f3.js} +1 -1
  142. package/dist/cjs/{mk-b209ac0d.js → mk-9f79812b.js} +14 -14
  143. package/dist/cjs/{nb-db13e666.js → nb-673fe3fd.js} +14 -14
  144. package/dist/cjs/{nl-fcd9e0c5.js → nl-4dc0504f.js} +14 -14
  145. package/dist/cjs/{observers-f5fa975b.js → observers-9912f013.js} +1 -1
  146. package/dist/cjs/{openCloseComponent-5d70fcd8.js → openCloseComponent-05cb01ff.js} +9 -4
  147. package/dist/cjs/{pl-87c83322.js → pl-d809a6c3.js} +14 -14
  148. package/dist/cjs/{pt-b0b5f472.js → pt-78eefbc7.js} +14 -14
  149. package/dist/cjs/{pt-br-03333e90.js → pt-br-55f1893a.js} +14 -14
  150. package/dist/cjs/public-notification.cjs.entry.js +3 -3
  151. package/dist/cjs/{resources-60c27547.js → resources-030a27ed.js} +1 -1
  152. package/dist/cjs/{resources-91409a5d.js → resources-10d29626.js} +1 -1
  153. package/dist/cjs/{resources-9f2b33ee.js → resources-24b6eee0.js} +1 -1
  154. package/dist/cjs/{resources-4da89742.js → resources-2b51cf4c.js} +1 -1
  155. package/dist/cjs/{resources-e1258e8a.js → resources-8f4e8ba8.js} +1 -1
  156. package/dist/cjs/{resources-77713c2e.js → resources-993f6faf.js} +1 -1
  157. package/dist/cjs/{resources-2901b608.js → resources-a2e2a544.js} +1 -1
  158. package/dist/cjs/{resources-c913200c.js → resources-acf9a7ea.js} +1 -1
  159. package/dist/cjs/{resources-8233a151.js → resources-caca31c2.js} +1 -1
  160. package/dist/cjs/{ro-c3661b73.js → ro-f0cff196.js} +14 -14
  161. package/dist/cjs/{ru-8dd3fd58.js → ru-5e9b37f9.js} +14 -14
  162. package/dist/cjs/{shared-list-render-c0adb192.js → shared-list-render-9bbcb306.js} +6 -6
  163. package/dist/cjs/{sk-151d9acf.js → sk-322cd349.js} +14 -14
  164. package/dist/cjs/{sl-9b45a152.js → sl-fd948e50.js} +14 -14
  165. package/dist/cjs/solution-configuration.cjs.entry.js +1 -1
  166. package/dist/cjs/solution-contents_3.cjs.entry.js +1 -1
  167. package/dist/cjs/solutions-components.cjs.js +3 -3
  168. package/dist/cjs/{sortableComponent-58679f07.js → sortableComponent-70bf79de.js} +2 -2
  169. package/dist/cjs/{sr-186bf15c.js → sr-f0058b24.js} +14 -14
  170. package/dist/cjs/{sv-a93fee0c.js → sv-8a8378bf.js} +14 -14
  171. package/dist/cjs/{t9n-1d032c30.js → t9n-62d807df.js} +2 -2
  172. package/dist/cjs/{th-41680352.js → th-f219fad6.js} +14 -14
  173. package/dist/cjs/{time-5e450ec8.js → time-24d40c60.js} +2 -2
  174. package/dist/cjs/{tr-0bd886d6.js → tr-03109641.js} +14 -14
  175. package/dist/cjs/{uk-4fade133.js → uk-dde46112.js} +14 -14
  176. package/dist/cjs/{utils-cd14113f.js → utils-09191c93.js} +2 -2
  177. package/dist/cjs/{utils-acfeed9d.js → utils-651e6663.js} +3 -3
  178. package/dist/cjs/{utils-ae9bdd59.js → utils-852fe124.js} +3 -3
  179. package/dist/cjs/{utils-bae432a9.js → utils-a194dc3d.js} +5 -2
  180. package/dist/cjs/{vi-1c9fe343.js → vi-60ed6e30.js} +14 -14
  181. package/dist/cjs/{zh-cn-28fa1fe1.js → zh-cn-a2f6f51d.js} +14 -14
  182. package/dist/cjs/{zh-hk-5abf8eb5.js → zh-hk-e14e2fc0.js} +14 -14
  183. package/dist/cjs/{zh-tw-07500357.js → zh-tw-7ea0d7e4.js} +14 -14
  184. package/dist/collection/collection-manifest.json +1 -0
  185. package/dist/collection/components/card-manager/card-manager.js +1 -1
  186. package/dist/collection/components/crowdsource-manager/crowdsource-manager.css +23 -2
  187. package/dist/collection/components/crowdsource-manager/crowdsource-manager.js +49 -32
  188. package/dist/collection/components/info-card/info-card.css +27 -0
  189. package/dist/collection/components/info-card/info-card.js +36 -2
  190. package/dist/collection/components/layer-table/layer-table.css +20 -0
  191. package/dist/collection/components/layer-table/layer-table.js +65 -10
  192. package/dist/collection/components/map-card/map-card.css +0 -7
  193. package/dist/collection/components/map-card/map-card.js +20 -10
  194. package/dist/collection/components/map-legend/map-legend.css +3 -0
  195. package/dist/collection/components/map-legend/map-legend.js +166 -0
  196. package/dist/collection/components/map-legend/test/map-legend.e2e.js +14 -0
  197. package/dist/collection/components/map-legend/test/map-legend.spec.js +22 -0
  198. package/dist/collection/components/map-picker/map-picker.css +5 -1
  199. package/dist/collection/components/map-picker/map-picker.js +2 -2
  200. package/dist/collection/components/map-tools/map-tools.css +14 -0
  201. package/dist/collection/components/map-tools/map-tools.js +26 -62
  202. package/dist/collection/demos/crowdsource-manager.html +26 -1
  203. package/dist/collection/utils/downloadUtils.js +258 -232
  204. package/dist/collection/utils/downloadUtils.ts +358 -326
  205. package/dist/collection/utils/interfaces.ts +11 -0
  206. package/dist/collection/utils/test/downloadUtils.spec.js +503 -57
  207. package/dist/collection/utils/test/downloadUtils.spec.tsx +587 -61
  208. package/dist/components/ExpandToggle.js +2 -2
  209. package/dist/components/FloatingArrow.js +1 -1
  210. package/dist/components/Heading.js +1 -1
  211. package/dist/components/action-bar.js +23 -15
  212. package/dist/components/action-group.js +9 -10
  213. package/dist/components/action-menu.js +1 -1
  214. package/dist/components/action.js +1 -1
  215. package/dist/components/alert.js +2 -2
  216. package/dist/components/array.js +1 -1
  217. package/dist/components/avatar.js +2 -2
  218. package/dist/components/button.js +1 -1
  219. package/dist/components/calcite-accordion-item.js +2 -7
  220. package/dist/components/calcite-accordion.js +0 -5
  221. package/dist/components/calcite-action-pad.js +10 -5
  222. package/dist/components/calcite-block-section.js +2 -2
  223. package/dist/components/calcite-block.js +2 -2
  224. package/dist/components/calcite-card.js +1 -1
  225. package/dist/components/calcite-chip-group.js +0 -5
  226. package/dist/components/calcite-combobox-item-group.js +1 -1
  227. package/dist/components/calcite-fab.js +1 -1
  228. package/dist/components/calcite-flow-item.js +1 -1
  229. package/dist/components/calcite-flow.js +1 -1
  230. package/dist/components/calcite-inline-editable.js +1 -1
  231. package/dist/components/calcite-input-date-picker.js +1 -1
  232. package/dist/components/calcite-input-time-picker.js +1 -1
  233. package/dist/components/calcite-input-time-zone.js +1 -1
  234. package/dist/components/calcite-list-item-group.js +1 -1
  235. package/dist/components/calcite-menu-item.js +1 -1
  236. package/dist/components/calcite-modal.js +2 -2
  237. package/dist/components/calcite-navigation-logo.js +1 -1
  238. package/dist/components/calcite-navigation-user.js +1 -1
  239. package/dist/components/calcite-navigation.js +2 -2
  240. package/dist/components/calcite-pagination.js +1 -1
  241. package/dist/components/calcite-radio-button-group.js +0 -5
  242. package/dist/components/calcite-radio-button.js +1 -1
  243. package/dist/components/calcite-rating.js +1 -1
  244. package/dist/components/calcite-shell-center-row.js +1 -1
  245. package/dist/components/calcite-sortable-list.js +1 -1
  246. package/dist/components/calcite-split-button.js +1 -1
  247. package/dist/components/calcite-stepper.js +0 -5
  248. package/dist/components/calcite-text-area.js +5 -5
  249. package/dist/components/calcite-tile-select.js +1 -1
  250. package/dist/components/calcite-tip-manager.js +1 -1
  251. package/dist/components/calcite-tip.js +1 -1
  252. package/dist/components/card-manager2.js +1 -1
  253. package/dist/components/checkbox.js +0 -5
  254. package/dist/components/chip.js +2 -2
  255. package/dist/components/color-picker-hex-input.js +2 -2
  256. package/dist/components/color-picker-swatch.js +1 -1
  257. package/dist/components/combobox-item.js +1 -1
  258. package/dist/components/combobox.js +1 -6
  259. package/dist/components/conditionalSlot.js +1 -1
  260. package/dist/components/crowdsource-manager.js +57 -23
  261. package/dist/components/date-picker-month-header.js +1 -1
  262. package/dist/components/date-picker.js +2 -2
  263. package/dist/components/date.js +1 -1
  264. package/dist/components/dom.js +2 -2
  265. package/dist/components/downloadUtils.js +256 -263
  266. package/dist/components/dropdown-group.js +1 -1
  267. package/dist/components/dropdown-item.js +1 -1
  268. package/dist/components/dropdown.js +1 -1
  269. package/dist/components/esri-loader.js +15 -15
  270. package/dist/components/filter.js +1 -1
  271. package/dist/components/filter2.js +1 -1
  272. package/dist/components/floating-ui.js +1 -1
  273. package/dist/components/focusTrapComponent.js +4 -4
  274. package/dist/components/form.js +1 -1
  275. package/dist/components/graph.js +3 -8
  276. package/dist/components/guid.js +1 -1
  277. package/dist/components/handle.js +1 -1
  278. package/dist/components/icon.js +2 -2
  279. package/dist/components/index.js +2 -2
  280. package/dist/components/info-card2.js +37 -3
  281. package/dist/components/input-message.js +1 -1
  282. package/dist/components/input-number.js +1 -1
  283. package/dist/components/input-text.js +1 -1
  284. package/dist/components/input.js +1 -1
  285. package/dist/components/interactive.js +2 -2
  286. package/dist/components/key.js +1 -1
  287. package/dist/components/label.js +2 -2
  288. package/dist/components/label2.js +1 -1
  289. package/dist/components/layer-table2.js +46 -11
  290. package/dist/components/layout-manager.js +129 -1
  291. package/dist/components/list-item2.js +1 -1
  292. package/dist/components/list.js +2 -2
  293. package/dist/components/loadable.js +1 -1
  294. package/dist/components/locale2.js +2 -2
  295. package/dist/components/map-card2.js +57 -42
  296. package/dist/components/map-legend.d.ts +11 -0
  297. package/dist/components/map-legend.js +11 -0
  298. package/dist/components/map-legend2.js +118 -0
  299. package/dist/components/map-picker2.js +3 -3
  300. package/dist/components/map-tools2.js +49 -79
  301. package/dist/components/math.js +1 -1
  302. package/dist/components/menu.js +1 -1
  303. package/dist/components/notice.js +1 -1
  304. package/dist/components/observers.js +1 -1
  305. package/dist/components/openCloseComponent.js +9 -4
  306. package/dist/components/panel.js +2 -2
  307. package/dist/components/pick-list-item.js +1 -1
  308. package/dist/components/popover.js +3 -8
  309. package/dist/components/resources.js +1 -1
  310. package/dist/components/resources2.js +1 -1
  311. package/dist/components/resources3.js +1 -1
  312. package/dist/components/resources4.js +1 -1
  313. package/dist/components/scrim.js +1 -1
  314. package/dist/components/segmented-control-item.js +1 -1
  315. package/dist/components/select.js +1 -1
  316. package/dist/components/shared-list-render.js +2 -2
  317. package/dist/components/shell-panel.js +9 -6
  318. package/dist/components/shell.js +2 -2
  319. package/dist/components/slider.js +1 -1
  320. package/dist/components/sortableComponent.js +1 -1
  321. package/dist/components/stack.js +2 -2
  322. package/dist/components/t9n.js +1 -1
  323. package/dist/components/tab-title.js +1 -6
  324. package/dist/components/tabs.js +1 -1
  325. package/dist/components/tile.js +1 -1
  326. package/dist/components/time-picker.js +2 -2
  327. package/dist/components/tooltip.js +3 -3
  328. package/dist/components/tree-item.js +2 -2
  329. package/dist/components/tree.js +1 -1
  330. package/dist/components/utils.js +5 -2
  331. package/dist/components/utils2.js +2 -2
  332. package/dist/components/utils3.js +2 -2
  333. package/dist/components/value-list-item.js +1 -1
  334. package/dist/components/value-list.js +2 -2
  335. package/dist/esm/{ExpandToggle-3d10bd1e.js → ExpandToggle-3bfcb842.js} +5 -5
  336. package/dist/esm/{FloatingArrow-29db6da6.js → FloatingArrow-cf140d6b.js} +1 -1
  337. package/dist/esm/{Heading-cb79e5b2.js → Heading-140d10ff.js} +1 -1
  338. package/dist/esm/{app-globals-5cbac6b0.js → app-globals-fffe4e27.js} +3 -3
  339. package/dist/esm/{ar-4b751ba8.js → ar-45abeb31.js} +14 -14
  340. package/dist/esm/{array-751a2b87.js → array-d95985ad.js} +1 -1
  341. package/dist/esm/{basemap-gallery_4.entry.js → basemap-gallery_5.entry.js} +120 -67
  342. package/dist/esm/{bg-5d8bf5ea.js → bg-af759e86.js} +14 -14
  343. package/dist/esm/{bs-ff510e71.js → bs-20d012de.js} +14 -14
  344. package/dist/esm/buffer-tools_4.entry.js +15 -15
  345. package/dist/esm/{ca-b9a5e51a.js → ca-1498df65.js} +14 -14
  346. package/dist/esm/calcite-accordion-item.entry.js +7 -12
  347. package/dist/esm/calcite-accordion.entry.js +1 -6
  348. package/dist/esm/calcite-action-bar.entry.js +31 -26
  349. package/dist/esm/calcite-action-group_2.entry.js +18 -20
  350. package/dist/esm/calcite-action-pad.entry.js +20 -16
  351. package/dist/esm/calcite-action_2.entry.js +17 -22
  352. package/dist/esm/calcite-alert.entry.js +11 -11
  353. package/dist/esm/calcite-avatar.entry.js +6 -6
  354. package/dist/esm/calcite-block-section.entry.js +9 -9
  355. package/dist/esm/calcite-block.entry.js +12 -12
  356. package/dist/esm/calcite-button.entry.js +12 -12
  357. package/dist/esm/calcite-card.entry.js +9 -9
  358. package/dist/esm/calcite-checkbox.entry.js +8 -13
  359. package/dist/esm/calcite-chip-group.entry.js +6 -11
  360. package/dist/esm/calcite-chip.entry.js +11 -11
  361. package/dist/esm/calcite-color-picker-hex-input_2.entry.js +8 -8
  362. package/dist/esm/calcite-color-picker.entry.js +12 -12
  363. package/dist/esm/calcite-combobox-item-group.entry.js +5 -5
  364. package/dist/esm/calcite-combobox_6.entry.js +21 -26
  365. package/dist/esm/calcite-date-picker-day_3.entry.js +10 -10
  366. package/dist/esm/calcite-date-picker.entry.js +11 -11
  367. package/dist/esm/calcite-fab.entry.js +6 -6
  368. package/dist/esm/calcite-filter_5.entry.js +16 -16
  369. package/dist/esm/calcite-flow-item.entry.js +11 -11
  370. package/dist/esm/calcite-flow.entry.js +3 -3
  371. package/dist/esm/calcite-graph.entry.js +5 -10
  372. package/dist/esm/calcite-icon.entry.js +6 -6
  373. package/dist/esm/calcite-inline-editable.entry.js +11 -11
  374. package/dist/esm/calcite-input-date-picker.entry.js +17 -17
  375. package/dist/esm/calcite-input-number_2.entry.js +13 -13
  376. package/dist/esm/{calcite-input-time-picker-13448515.js → calcite-input-time-picker-227e60c3.js} +60 -60
  377. package/dist/esm/calcite-input-time-picker.entry.js +14 -14
  378. package/dist/esm/calcite-input-time-zone.entry.js +12 -12
  379. package/dist/esm/calcite-input_2.entry.js +12 -12
  380. package/dist/esm/calcite-label.entry.js +5 -5
  381. package/dist/esm/calcite-link.entry.js +5 -5
  382. package/dist/esm/calcite-list-item-group.entry.js +3 -3
  383. package/dist/esm/calcite-loader.entry.js +1 -1
  384. package/dist/esm/calcite-menu-item.entry.js +9 -9
  385. package/dist/esm/calcite-menu.entry.js +9 -9
  386. package/dist/esm/calcite-modal.entry.js +12 -12
  387. package/dist/esm/calcite-navigation-logo.entry.js +2 -2
  388. package/dist/esm/calcite-navigation-user.entry.js +2 -2
  389. package/dist/esm/calcite-navigation.entry.js +5 -5
  390. package/dist/esm/calcite-notice.entry.js +11 -11
  391. package/dist/esm/calcite-option_2.entry.js +9 -9
  392. package/dist/esm/calcite-pagination.entry.js +9 -9
  393. package/dist/esm/calcite-panel_2.entry.js +14 -14
  394. package/dist/esm/calcite-pick-list-group.entry.js +7 -7
  395. package/dist/esm/calcite-pick-list-item.entry.js +12 -12
  396. package/dist/esm/calcite-pick-list.entry.js +10 -10
  397. package/dist/esm/calcite-radio-button-group.entry.js +2 -7
  398. package/dist/esm/calcite-radio-button.entry.js +9 -9
  399. package/dist/esm/calcite-rating.entry.js +12 -12
  400. package/dist/esm/calcite-scrim.entry.js +8 -8
  401. package/dist/esm/calcite-segmented-control_2.entry.js +8 -8
  402. package/dist/esm/calcite-shell-center-row.entry.js +6 -6
  403. package/dist/esm/calcite-shell-panel_14.entry.js +29 -32
  404. package/dist/esm/calcite-sortable-list.entry.js +7 -7
  405. package/dist/esm/calcite-split-button.entry.js +3 -3
  406. package/dist/esm/calcite-stepper-item.entry.js +8 -8
  407. package/dist/esm/calcite-stepper.entry.js +3 -8
  408. package/dist/esm/calcite-switch.entry.js +8 -8
  409. package/dist/esm/calcite-text-area.entry.js +15 -15
  410. package/dist/esm/calcite-tile-select-group.entry.js +1 -1
  411. package/dist/esm/calcite-tile-select.entry.js +4 -4
  412. package/dist/esm/calcite-tile.entry.js +7 -7
  413. package/dist/esm/calcite-time-picker.entry.js +10 -10
  414. package/dist/esm/calcite-tip-manager.entry.js +9 -9
  415. package/dist/esm/calcite-tip.entry.js +10 -10
  416. package/dist/esm/calcite-tooltip.entry.js +9 -9
  417. package/dist/esm/calcite-tree_3.entry.js +8 -8
  418. package/dist/esm/{card-manager_4.entry.js → card-manager_3.entry.js} +66 -101
  419. package/dist/esm/{conditionalSlot-27a0fce0.js → conditionalSlot-55a14abd.js} +2 -2
  420. package/dist/esm/crowdsource-manager.entry.js +50 -16
  421. package/dist/esm/{cs-f21a0628.js → cs-3bd67855.js} +14 -14
  422. package/dist/esm/{da-dc48fc4c.js → da-7a76e131.js} +14 -14
  423. package/dist/esm/{date-0ed48e97.js → date-bd5b879c.js} +2 -2
  424. package/dist/esm/{de-59290071.js → de-0808a43e.js} +14 -14
  425. package/dist/esm/{de-at-cd6e6ab7.js → de-at-0b6874cb.js} +14 -14
  426. package/dist/esm/{de-ch-27c44e34.js → de-ch-c9d429dd.js} +14 -14
  427. package/dist/esm/{dom-843e3afd.js → dom-37f2dec9.js} +3 -3
  428. package/dist/esm/{downloadUtils-63661805.js → downloadUtils-8d4c13bb.js} +258 -265
  429. package/dist/esm/edit-card_2.entry.js +38 -5
  430. package/dist/esm/{el-f09fdec6.js → el-66001281.js} +14 -14
  431. package/dist/esm/{en-au-90087aa5.js → en-au-6424fec0.js} +14 -14
  432. package/dist/esm/{en-ca-10751695.js → en-ca-f5f1659d.js} +14 -14
  433. package/dist/esm/{en-gb-0f8547bd.js → en-gb-796beadd.js} +14 -14
  434. package/dist/esm/{es-b0997cf1.js → es-cd139926.js} +14 -14
  435. package/dist/esm/{es-mx-226f5028.js → es-mx-854dc3e4.js} +14 -14
  436. package/dist/esm/{et-dc96c453.js → et-2aa6782d.js} +14 -14
  437. package/dist/esm/{fi-0941704d.js → fi-965727bd.js} +14 -14
  438. package/dist/esm/{filter-1cac3edf.js → filter-60517290.js} +1 -1
  439. package/dist/esm/{floating-ui-d28d0fd6.js → floating-ui-7cde67cf.js} +2 -2
  440. package/dist/esm/{focusTrapComponent-ff3a9f28.js → focusTrapComponent-ec344399.js} +4 -4
  441. package/dist/esm/{form-11c6a015.js → form-04d47b0b.js} +2 -2
  442. package/dist/esm/{fr-8da3458d.js → fr-c1884e89.js} +14 -14
  443. package/dist/esm/{fr-ch-739ceddf.js → fr-ch-1fd8dd3a.js} +14 -14
  444. package/dist/esm/{guid-2bbb8cd1.js → guid-70cda807.js} +1 -1
  445. package/dist/esm/{he-8b662dfa.js → he-0d7b78b4.js} +14 -14
  446. package/dist/esm/{hi-10996f89.js → hi-0376c82d.js} +14 -14
  447. package/dist/esm/{hr-42c2024d.js → hr-28a64903.js} +14 -14
  448. package/dist/esm/{hu-4768b3ff.js → hu-44a02ff7.js} +14 -14
  449. package/dist/esm/{id-24a08170.js → id-034fc4a5.js} +14 -14
  450. package/dist/esm/{index.es-3a3aa8e3.js → index.es-065c3035.js} +3 -3
  451. package/dist/esm/{interactive-eaf4be29.js → interactive-bd6837bc.js} +2 -2
  452. package/dist/esm/{it-ad09649f.js → it-56e52026.js} +14 -14
  453. package/dist/esm/{it-ch-b05fc10d.js → it-ch-a4a0e136.js} +14 -14
  454. package/dist/esm/{ja-ab839b73.js → ja-f2365272.js} +14 -14
  455. package/dist/esm/{key-7a525416.js → key-02fa06ae.js} +1 -1
  456. package/dist/esm/{ko-c778539e.js → ko-e7650b4c.js} +14 -14
  457. package/dist/esm/{label-6a1caf64.js → label-b6dfb4d5.js} +3 -3
  458. package/dist/{components/layout-manager2.js → esm/layout-manager.entry.js} +11 -58
  459. package/dist/esm/{loadModules-2ecd1e44.js → loadModules-f5f910b6.js} +1 -1
  460. package/dist/esm/{loadable-6bca96ad.js → loadable-47170cb6.js} +1 -1
  461. package/dist/esm/loader.js +3 -3
  462. package/dist/esm/{locale-d8561d54.js → locale-146251f7.js} +5 -5
  463. package/dist/esm/{locale-aa3de591.js → locale-efad8f83.js} +15 -15
  464. package/dist/esm/{lt-447d9aa9.js → lt-1577a952.js} +14 -14
  465. package/dist/esm/{lv-4d715e11.js → lv-9ef7e4f6.js} +14 -14
  466. package/dist/esm/map-select-tools_3.entry.js +3 -3
  467. package/dist/esm/{math-5f92f517.js → math-0d6817c3.js} +1 -1
  468. package/dist/esm/{mk-b3d7401a.js → mk-94264e08.js} +14 -14
  469. package/dist/esm/{nb-2b4a8366.js → nb-fa24d5b2.js} +14 -14
  470. package/dist/esm/{nl-c0db1da2.js → nl-33f10900.js} +14 -14
  471. package/dist/esm/{observers-9d66685a.js → observers-95c50046.js} +1 -1
  472. package/dist/esm/{openCloseComponent-2b5c6bed.js → openCloseComponent-10efeff3.js} +9 -4
  473. package/dist/esm/{pl-0d322bb4.js → pl-9ed16565.js} +14 -14
  474. package/dist/esm/{pt-5997598c.js → pt-52731ddf.js} +14 -14
  475. package/dist/esm/{pt-br-6b77e7db.js → pt-br-8de51ff4.js} +14 -14
  476. package/dist/esm/public-notification.entry.js +3 -3
  477. package/dist/esm/{resources-5bce3953.js → resources-0151b0c0.js} +1 -1
  478. package/dist/esm/{resources-94c47e64.js → resources-1e6d76df.js} +1 -1
  479. package/dist/esm/{resources-40d8e06f.js → resources-24255b05.js} +1 -1
  480. package/dist/esm/{resources-dca3d475.js → resources-2e5aa562.js} +1 -1
  481. package/dist/esm/{resources-c253772f.js → resources-2edfa0af.js} +1 -1
  482. package/dist/esm/{resources-a9b2d33c.js → resources-41416583.js} +1 -1
  483. package/dist/esm/{resources-d6a4d343.js → resources-b392187d.js} +1 -1
  484. package/dist/esm/{resources-58d30a0f.js → resources-c676d5de.js} +1 -1
  485. package/dist/esm/{resources-c65f5654.js → resources-efae7280.js} +1 -1
  486. package/dist/esm/{ro-ac3724e0.js → ro-99f009ad.js} +14 -14
  487. package/dist/esm/{ru-4e75151f.js → ru-592ffaf0.js} +14 -14
  488. package/dist/esm/{shared-list-render-abd19c8d.js → shared-list-render-4f0f6af8.js} +6 -6
  489. package/dist/esm/{sk-bbfa22a3.js → sk-44f7bd19.js} +14 -14
  490. package/dist/esm/{sl-867cecfc.js → sl-08cad9bd.js} +14 -14
  491. package/dist/esm/solution-configuration.entry.js +1 -1
  492. package/dist/esm/solution-contents_3.entry.js +1 -1
  493. package/dist/esm/solutions-components.js +3 -3
  494. package/dist/esm/{sortableComponent-db502e97.js → sortableComponent-8a84709a.js} +2 -2
  495. package/dist/esm/{sr-198b5c00.js → sr-84f261fc.js} +14 -14
  496. package/dist/esm/{sv-02d64370.js → sv-d0d7bc1e.js} +14 -14
  497. package/dist/esm/{t9n-76168237.js → t9n-5f748619.js} +2 -2
  498. package/dist/esm/{th-1616e303.js → th-a5149d44.js} +14 -14
  499. package/dist/esm/{time-6721a4c2.js → time-fa1151aa.js} +2 -2
  500. package/dist/esm/{tr-f4619f64.js → tr-feb0cad4.js} +14 -14
  501. package/dist/esm/{uk-df7df34a.js → uk-c9ba62a0.js} +14 -14
  502. package/dist/esm/{utils-f54411df.js → utils-0a5c1a07.js} +3 -3
  503. package/dist/esm/{utils-ccfd94a7.js → utils-667cc396.js} +3 -3
  504. package/dist/esm/{utils-18db6b1d.js → utils-7af1efcc.js} +2 -2
  505. package/dist/esm/{utils-2c91c963.js → utils-7cf107ec.js} +5 -2
  506. package/dist/esm/{vi-176ca9f7.js → vi-788dcb99.js} +14 -14
  507. package/dist/esm/{zh-cn-e13d83d1.js → zh-cn-3ccfb820.js} +14 -14
  508. package/dist/esm/{zh-hk-d97365d8.js → zh-hk-b29b61e8.js} +14 -14
  509. package/dist/esm/{zh-tw-a2b6f0b7.js → zh-tw-2bdbc6eb.js} +14 -14
  510. package/dist/solutions-components/assets/icon/applySelectionToExistingView16.json +1 -0
  511. package/dist/solutions-components/assets/icon/applySelectionToExistingView24.json +1 -0
  512. package/dist/solutions-components/assets/icon/applySelectionToExistingView32.json +1 -0
  513. package/dist/solutions-components/assets/icon/channels16.json +1 -0
  514. package/dist/solutions-components/assets/icon/channels24.json +1 -0
  515. package/dist/solutions-components/assets/icon/channels32.json +1 -0
  516. package/dist/solutions-components/assets/icon/chevronDownLeft16.json +1 -0
  517. package/dist/solutions-components/assets/icon/chevronDownLeft24.json +1 -0
  518. package/dist/solutions-components/assets/icon/chevronDownLeft32.json +1 -0
  519. package/dist/solutions-components/assets/icon/chevronDownRight16.json +1 -0
  520. package/dist/solutions-components/assets/icon/chevronDownRight24.json +1 -0
  521. package/dist/solutions-components/assets/icon/chevronDownRight32.json +1 -0
  522. package/dist/solutions-components/assets/icon/chevronUpLeft16.json +1 -0
  523. package/dist/solutions-components/assets/icon/chevronUpLeft24.json +1 -0
  524. package/dist/solutions-components/assets/icon/chevronUpLeft32.json +1 -0
  525. package/dist/solutions-components/assets/icon/chevronUpRight16.json +1 -0
  526. package/dist/solutions-components/assets/icon/chevronUpRight24.json +1 -0
  527. package/dist/solutions-components/assets/icon/chevronUpRight32.json +1 -0
  528. package/dist/solutions-components/assets/icon/clearSelection16.json +1 -0
  529. package/dist/solutions-components/assets/icon/clearSelection24.json +1 -0
  530. package/dist/solutions-components/assets/icon/clearSelection32.json +1 -0
  531. package/dist/solutions-components/assets/icon/communityLinkChartLayout16.json +1 -0
  532. package/dist/solutions-components/assets/icon/communityLinkChartLayout24.json +1 -0
  533. package/dist/solutions-components/assets/icon/communityLinkChartLayout32.json +1 -0
  534. package/dist/solutions-components/assets/icon/dataCard16.json +1 -0
  535. package/dist/solutions-components/assets/icon/dataCard24.json +1 -0
  536. package/dist/solutions-components/assets/icon/dataCard32.json +1 -0
  537. package/dist/solutions-components/assets/icon/dateTime16.json +1 -0
  538. package/dist/solutions-components/assets/icon/dateTime24.json +1 -0
  539. package/dist/solutions-components/assets/icon/dateTime32.json +1 -0
  540. package/dist/solutions-components/assets/icon/expressionDefinedColor16.json +1 -0
  541. package/dist/solutions-components/assets/icon/expressionDefinedColor24.json +1 -0
  542. package/dist/solutions-components/assets/icon/expressionDefinedColor32.json +1 -0
  543. package/dist/solutions-components/assets/icon/forceDirectedLinkChartLayout16.json +1 -0
  544. package/dist/solutions-components/assets/icon/forceDirectedLinkChartLayout24.json +1 -0
  545. package/dist/solutions-components/assets/icon/forceDirectedLinkChartLayout32.json +1 -0
  546. package/dist/solutions-components/assets/icon/hierarchicalLinkChartLayout16.json +1 -0
  547. package/dist/solutions-components/assets/icon/hierarchicalLinkChartLayout24.json +1 -0
  548. package/dist/solutions-components/assets/icon/hierarchicalLinkChartLayout32.json +1 -0
  549. package/dist/solutions-components/assets/icon/knowledgeStudio16.json +1 -0
  550. package/dist/solutions-components/assets/icon/knowledgeStudio24.json +1 -0
  551. package/dist/solutions-components/assets/icon/knowledgeStudio32.json +1 -0
  552. package/dist/solutions-components/assets/icon/linkChartExpand16.json +1 -0
  553. package/dist/solutions-components/assets/icon/linkChartExpand24.json +1 -0
  554. package/dist/solutions-components/assets/icon/linkChartExpand32.json +1 -0
  555. package/dist/solutions-components/assets/icon/minusSquare16F.json +1 -0
  556. package/dist/solutions-components/assets/icon/minusSquare24F.json +1 -0
  557. package/dist/solutions-components/assets/icon/minusSquare32F.json +1 -0
  558. package/dist/solutions-components/assets/icon/newLinkChart16.json +1 -0
  559. package/dist/solutions-components/assets/icon/newLinkChart24.json +1 -0
  560. package/dist/solutions-components/assets/icon/newLinkChart32.json +1 -0
  561. package/dist/solutions-components/assets/icon/radialTreeLinkChartYayout16.json +1 -0
  562. package/dist/solutions-components/assets/icon/radialTreeLinkChartYayout24.json +1 -0
  563. package/dist/solutions-components/assets/icon/radialTreeLinkChartYayout32.json +1 -0
  564. package/dist/solutions-components/assets/icon/removeLinkchart16.json +1 -0
  565. package/dist/solutions-components/assets/icon/removeLinkchart24.json +1 -0
  566. package/dist/solutions-components/assets/icon/removeLinkchart32.json +1 -0
  567. package/dist/solutions-components/assets/icon/simpleLinkChartLayout16.json +1 -0
  568. package/dist/solutions-components/assets/icon/simpleLinkChartLayout24.json +1 -0
  569. package/dist/solutions-components/assets/icon/simpleLinkChartLayout32.json +1 -0
  570. package/dist/solutions-components/assets/icon/smartTreeLinkChartLayout16.json +1 -0
  571. package/dist/solutions-components/assets/icon/smartTreeLinkChartLayout24.json +1 -0
  572. package/dist/solutions-components/assets/icon/smartTreeLinkChartLayout32.json +1 -0
  573. package/dist/solutions-components/assets/icon/sortAscendingArrow16.json +1 -1
  574. package/dist/solutions-components/assets/icon/sortAscendingArrow24.json +1 -1
  575. package/dist/solutions-components/assets/icon/sortAscendingArrow32.json +1 -1
  576. package/dist/solutions-components/assets/icon/sortDescendingArrow16.json +1 -1
  577. package/dist/solutions-components/assets/icon/sortDescendingArrow24.json +1 -1
  578. package/dist/solutions-components/assets/icon/sortDescendingArrow32.json +1 -1
  579. package/dist/solutions-components/assets/icon/timeZone16.json +1 -0
  580. package/dist/solutions-components/assets/icon/timeZone24.json +1 -0
  581. package/dist/solutions-components/assets/icon/timeZone32.json +1 -0
  582. package/dist/solutions-components/assets/icon/updateProject16.json +1 -0
  583. package/dist/solutions-components/assets/icon/updateProject24.json +1 -0
  584. package/dist/solutions-components/assets/icon/updateProject32.json +1 -0
  585. package/dist/solutions-components/demos/crowdsource-manager.html +26 -1
  586. package/dist/solutions-components/{p-9fb16c72.entry.js → p-0109bef4.entry.js} +10 -10
  587. package/dist/solutions-components/{p-46d5970b.entry.js → p-01c83b8c.entry.js} +1 -1
  588. package/dist/solutions-components/{p-6de98c51.js → p-0266ca81.js} +1 -1
  589. package/dist/solutions-components/{p-8a758303.js → p-05b2bdf9.js} +3 -3
  590. package/dist/solutions-components/p-072155f9.js +12 -0
  591. package/dist/solutions-components/{p-e07b8a72.entry.js → p-082365d6.entry.js} +3 -3
  592. package/dist/solutions-components/{p-ea282908.js → p-0b8463d6.js} +1 -1
  593. package/dist/solutions-components/{p-cad5587c.entry.js → p-0c2e392e.entry.js} +6 -6
  594. package/dist/solutions-components/{p-7c33e500.entry.js → p-0dd8368d.entry.js} +1 -1
  595. package/dist/solutions-components/{p-c3f8b670.js → p-0ecd7346.js} +1 -1
  596. package/dist/solutions-components/{p-18f1772b.js → p-0ed14b4b.js} +1 -1
  597. package/dist/solutions-components/p-0f77e83c.entry.js +11 -0
  598. package/dist/solutions-components/{p-29d41c7e.js → p-0f85fa4b.js} +1 -1
  599. package/dist/solutions-components/{p-541697d0.js → p-0fa3d1aa.js} +2 -2
  600. package/dist/solutions-components/{p-a6900100.entry.js → p-10e1ebe4.entry.js} +3 -3
  601. package/dist/solutions-components/{p-f41105c8.js → p-138cf009.js} +1 -1
  602. package/dist/solutions-components/{p-2b96e551.entry.js → p-149b4d3c.entry.js} +3 -3
  603. package/dist/solutions-components/{p-022a9b7a.js → p-167eb73b.js} +1 -1
  604. package/dist/solutions-components/{p-32f9c709.js → p-168a7d63.js} +1 -1
  605. package/dist/solutions-components/{p-2b252afd.entry.js → p-17a29fa6.entry.js} +1 -1
  606. package/dist/solutions-components/p-18538cd9.entry.js +11 -0
  607. package/dist/solutions-components/p-1bcfca9b.entry.js +6 -0
  608. package/dist/solutions-components/{p-19fe7725.js → p-1cebde99.js} +1 -1
  609. package/dist/solutions-components/{p-b948ecd2.entry.js → p-1dbaff04.entry.js} +2 -2
  610. package/dist/solutions-components/{p-2656168f.entry.js → p-1e7a31c1.entry.js} +3 -3
  611. package/dist/solutions-components/{p-d554507d.js → p-1eda2d20.js} +1 -1
  612. package/dist/solutions-components/{p-ef48bd77.entry.js → p-1efcac52.entry.js} +3 -3
  613. package/dist/solutions-components/{p-c6d83122.entry.js → p-1fba74a5.entry.js} +3 -3
  614. package/dist/solutions-components/{p-3cbe5ef3.js → p-2154de6d.js} +1 -1
  615. package/dist/solutions-components/{p-1ede2e18.js → p-2592c0b8.js} +3 -3
  616. package/dist/solutions-components/{p-90bbf223.entry.js → p-261394d7.entry.js} +1 -1
  617. package/dist/solutions-components/{p-754e2df2.js → p-27e0f599.js} +1 -1
  618. package/dist/solutions-components/{p-6a820c4d.js → p-28b5a7cf.js} +1 -1
  619. package/dist/solutions-components/{p-804e4751.entry.js → p-29efbf76.entry.js} +3 -3
  620. package/dist/solutions-components/{p-421d5e7c.js → p-2bf63e2e.js} +1 -1
  621. package/dist/solutions-components/{p-d4c103a8.js → p-2e8a41da.js} +1 -1
  622. package/dist/solutions-components/{p-de59d2f5.js → p-31aaa60f.js} +1 -1
  623. package/dist/solutions-components/{p-a2748b38.entry.js → p-34ef43ce.entry.js} +1 -1
  624. package/dist/solutions-components/{p-97c47bbd.entry.js → p-35cb6eca.entry.js} +3 -3
  625. package/dist/solutions-components/{p-39ff5ee5.js → p-3766be72.js} +2 -2
  626. package/dist/solutions-components/{p-9e727488.js → p-38f906f2.js} +1 -1
  627. package/dist/solutions-components/{p-c5e294e4.js → p-3948a96c.js} +1 -1
  628. package/dist/solutions-components/{p-9bbc05ff.js → p-3a844a72.js} +1 -1
  629. package/dist/solutions-components/{p-825bac0e.js → p-3c15959e.js} +1 -1
  630. package/dist/solutions-components/{p-ffac6f88.entry.js → p-3ce89910.entry.js} +1 -1
  631. package/dist/solutions-components/{p-7920b5a2.entry.js → p-3cfaf52b.entry.js} +2 -2
  632. package/dist/solutions-components/{p-b9749e09.js → p-3d3e6e20.js} +1 -1
  633. package/dist/solutions-components/{p-844ee452.entry.js → p-410068d9.entry.js} +2 -2
  634. package/dist/solutions-components/{p-a775ba2f.entry.js → p-42f9ab43.entry.js} +3 -3
  635. package/dist/solutions-components/{p-2291b598.js → p-43ba7a04.js} +1 -1
  636. package/dist/solutions-components/{p-f28d69ac.entry.js → p-446ab7f8.entry.js} +3 -3
  637. package/dist/solutions-components/{p-4bc7b875.entry.js → p-452850b4.entry.js} +2 -2
  638. package/dist/solutions-components/{p-0fbc27fd.entry.js → p-456f5afe.entry.js} +2 -2
  639. package/dist/solutions-components/p-46352a57.entry.js +6 -0
  640. package/dist/solutions-components/{p-b86b4512.entry.js → p-46e0ce0c.entry.js} +2 -2
  641. package/dist/solutions-components/p-470a9ec4.entry.js +6 -0
  642. package/dist/solutions-components/{p-d62784a4.js → p-476e5302.js} +1 -1
  643. package/dist/solutions-components/{p-5961c4e0.js → p-4a75b3dc.js} +1 -1
  644. package/dist/solutions-components/{p-42c7a5fa.entry.js → p-4d76eaf6.entry.js} +2 -2
  645. package/dist/solutions-components/{p-4e4b55b9.entry.js → p-4f9f97b2.entry.js} +3 -3
  646. package/dist/solutions-components/{p-67ce3c0c.entry.js → p-56f1d66b.entry.js} +3 -3
  647. package/dist/solutions-components/{p-5b9b1cbb.entry.js → p-58167087.entry.js} +3 -3
  648. package/dist/solutions-components/{p-ad72a379.entry.js → p-586f0e3d.entry.js} +3 -3
  649. package/dist/solutions-components/{p-6f2edf5b.js → p-588bc0c0.js} +1 -1
  650. package/dist/solutions-components/{p-a040efff.js → p-5958dad9.js} +1 -1
  651. package/dist/solutions-components/{p-4d17943f.js → p-5c9fa0e7.js} +1 -1
  652. package/dist/solutions-components/{p-b4157e6a.js → p-5ceef49b.js} +1 -1
  653. package/dist/solutions-components/{p-c9858d8f.entry.js → p-5d62566c.entry.js} +2 -2
  654. package/dist/solutions-components/{p-5f5c371e.js → p-5e08d4de.js} +1 -1
  655. package/dist/solutions-components/{p-b684bbc7.entry.js → p-5eaaf6ea.entry.js} +1 -1
  656. package/dist/solutions-components/{p-10248e04.js → p-60c15592.js} +1 -1
  657. package/dist/solutions-components/{p-7601988d.entry.js → p-6295e168.entry.js} +2 -2
  658. package/dist/solutions-components/{p-4f0c3fc1.js → p-635bbbd4.js} +1 -1
  659. package/dist/solutions-components/{p-aeebdb15.js → p-636f4631.js} +1 -1
  660. package/dist/solutions-components/{p-fb7e0054.js → p-643a0325.js} +1 -1
  661. package/dist/solutions-components/{p-606ca126.js → p-64e2c099.js} +1 -1
  662. package/dist/solutions-components/{p-ad4d6d02.entry.js → p-651459e2.entry.js} +4 -4
  663. package/dist/solutions-components/{p-b0c4138f.entry.js → p-667e7134.entry.js} +2 -2
  664. package/dist/solutions-components/{p-4b95d05e.entry.js → p-66b5211f.entry.js} +1 -1
  665. package/dist/solutions-components/{p-216801d5.js → p-688f6a0a.js} +1 -1
  666. package/dist/solutions-components/{p-3e139360.js → p-6be3c411.js} +1 -1
  667. package/dist/solutions-components/{p-6a524392.entry.js → p-6ce7b446.entry.js} +2 -2
  668. package/dist/solutions-components/{p-0e7914e6.entry.js → p-6ddc9567.entry.js} +3 -3
  669. package/dist/solutions-components/{p-1ea1dcac.js → p-6eb4ba8f.js} +1 -1
  670. package/dist/solutions-components/{p-7b9adfff.js → p-7060caf6.js} +1 -1
  671. package/dist/solutions-components/{p-bd3a3afe.js → p-7262469a.js} +1 -1
  672. package/dist/solutions-components/{p-3f0193e9.js → p-73220ff1.js} +1 -1
  673. package/dist/solutions-components/{p-31ff3452.entry.js → p-78a40191.entry.js} +2 -2
  674. package/dist/solutions-components/{p-82199b7b.entry.js → p-7a027758.entry.js} +1 -1
  675. package/dist/solutions-components/{p-a843af2a.js → p-7b2314ac.js} +1 -1
  676. package/dist/solutions-components/p-7bb12deb.js +11 -0
  677. package/dist/solutions-components/{p-56300653.js → p-7f271c31.js} +5 -5
  678. package/dist/solutions-components/p-7f9642d5.js +21 -0
  679. package/dist/solutions-components/{p-5c097e25.entry.js → p-80cb42e4.entry.js} +3 -3
  680. package/dist/solutions-components/{p-5383607a.js → p-80ea5869.js} +3 -3
  681. package/dist/solutions-components/{p-ab8f5c6b.entry.js → p-81814234.entry.js} +2 -2
  682. package/dist/solutions-components/{p-abda8ca2.entry.js → p-8544d557.entry.js} +2 -2
  683. package/dist/solutions-components/{p-680d193d.entry.js → p-864c190b.entry.js} +3 -3
  684. package/dist/solutions-components/p-869d4521.entry.js +6 -0
  685. package/dist/solutions-components/{p-d3a22725.js → p-872036a8.js} +1 -1
  686. package/dist/solutions-components/{p-22d580b0.entry.js → p-879d6377.entry.js} +3 -3
  687. package/dist/solutions-components/{p-4805ff13.js → p-87d66120.js} +1 -1
  688. package/dist/solutions-components/{p-9cb94ea0.js → p-8927339d.js} +1 -1
  689. package/dist/solutions-components/{p-7aa949a3.entry.js → p-89504313.entry.js} +2 -2
  690. package/dist/solutions-components/{p-cf43278c.entry.js → p-8af52074.entry.js} +3 -3
  691. package/dist/solutions-components/{p-3fc17d72.js → p-8b448a5b.js} +1 -1
  692. package/dist/solutions-components/{p-03fccde6.entry.js → p-8b74f5bb.entry.js} +3 -3
  693. package/dist/solutions-components/{p-2ae17fa2.js → p-8c61431d.js} +1 -1
  694. package/dist/solutions-components/{p-634e1240.js → p-8d00a17e.js} +1 -1
  695. package/dist/solutions-components/{p-c07af9c2.entry.js → p-8f68f1d3.entry.js} +2 -2
  696. package/dist/solutions-components/{p-e6bee82f.js → p-8f8d2861.js} +1 -1
  697. package/dist/solutions-components/{p-108fbf59.entry.js → p-90cef98d.entry.js} +1 -1
  698. package/dist/solutions-components/{p-9603c3ff.entry.js → p-9370bb48.entry.js} +2 -2
  699. package/dist/solutions-components/{p-75f26870.js → p-95c11620.js} +13 -13
  700. package/dist/solutions-components/{p-a777b18c.js → p-96239d0d.js} +2 -2
  701. package/dist/solutions-components/{p-215d3505.js → p-99402001.js} +1 -1
  702. package/dist/solutions-components/p-99891e57.js +11 -0
  703. package/dist/solutions-components/{p-15ef7894.js → p-9a35ef8e.js} +1 -1
  704. package/dist/solutions-components/{p-35123c90.js → p-9b76bf3d.js} +1 -1
  705. package/dist/solutions-components/p-9eba78eb.entry.js +6 -0
  706. package/dist/solutions-components/{p-6b2f2b85.js → p-a16feeec.js} +4 -4
  707. package/dist/solutions-components/{p-e645edf2.entry.js → p-a1c6db13.entry.js} +1 -1
  708. package/dist/solutions-components/{p-0cc32f06.js → p-a287be8b.js} +1 -1
  709. package/dist/solutions-components/{p-052ff2c7.js → p-a46f1b45.js} +1 -1
  710. package/dist/solutions-components/{p-1f468797.js → p-ab072027.js} +1 -1
  711. package/dist/solutions-components/{p-31316d61.entry.js → p-ac0abf04.entry.js} +3 -3
  712. package/dist/solutions-components/{p-38ef0684.js → p-ad75b9bb.js} +2 -2
  713. package/dist/solutions-components/{p-a08bd8c1.entry.js → p-ae6a7b3b.entry.js} +1 -1
  714. package/dist/solutions-components/{p-05db4340.js → p-aea37c90.js} +1 -1
  715. package/dist/solutions-components/{p-164be8ef.entry.js → p-b25005cf.entry.js} +1 -1
  716. package/dist/solutions-components/{p-b2e6c578.js → p-b28b6d40.js} +1 -1
  717. package/dist/solutions-components/{p-639cca97.js → p-b28ff52c.js} +1 -1
  718. package/dist/solutions-components/{p-21f00df6.js → p-bde323ec.js} +1 -1
  719. package/dist/solutions-components/{p-a0edbb27.js → p-be146646.js} +1 -1
  720. package/dist/solutions-components/{p-a258f5e7.js → p-c1dcc1e7.js} +1 -1
  721. package/dist/solutions-components/{p-5e59219b.entry.js → p-c26cd409.entry.js} +1 -1
  722. package/dist/solutions-components/p-c3ab7439.js +11 -0
  723. package/dist/solutions-components/{p-283e3a2d.js → p-c6e55b32.js} +1 -1
  724. package/dist/solutions-components/{p-e10a62f4.entry.js → p-c79c7978.entry.js} +3 -3
  725. package/dist/solutions-components/{p-647a4130.js → p-c9633864.js} +3 -3
  726. package/dist/solutions-components/{p-916f90ec.entry.js → p-c968f9aa.entry.js} +1 -1
  727. package/dist/solutions-components/{p-cf1af08f.entry.js → p-c9df539a.entry.js} +1 -1
  728. package/dist/solutions-components/{p-93074bd4.entry.js → p-ca3d7edd.entry.js} +2 -2
  729. package/dist/solutions-components/{p-2005280f.js → p-cacfa6ae.js} +2 -2
  730. package/dist/solutions-components/{p-27a1ac1f.entry.js → p-cc2393c3.entry.js} +3 -3
  731. package/dist/solutions-components/p-cd673260.js +6 -0
  732. package/dist/solutions-components/{p-761a033a.entry.js → p-cec47579.entry.js} +2 -2
  733. package/dist/solutions-components/{p-32ef065d.entry.js → p-ced11bea.entry.js} +2 -2
  734. package/dist/solutions-components/{p-ee066c67.js → p-cee23126.js} +5 -5
  735. package/dist/solutions-components/p-d2d3e4b5.js +11 -0
  736. package/dist/solutions-components/p-d4cb29ed.entry.js +6 -0
  737. package/dist/solutions-components/{p-0ece6df1.entry.js → p-d6f68a4e.entry.js} +2 -2
  738. package/dist/solutions-components/{p-326fa270.js → p-d864b7e3.js} +1 -1
  739. package/dist/solutions-components/{p-5adf37ea.entry.js → p-da6acb22.entry.js} +2 -2
  740. package/dist/solutions-components/{p-de58bd49.js → p-e0c011b8.js} +1 -1
  741. package/dist/solutions-components/{p-58ce5639.js → p-e0fb0920.js} +1 -1
  742. package/dist/solutions-components/{p-b1f84ae5.js → p-e2637fe6.js} +1 -1
  743. package/dist/solutions-components/{p-ef96894d.entry.js → p-e2eb4fd3.entry.js} +4 -4
  744. package/dist/solutions-components/{p-18869c0f.js → p-e3525c00.js} +1 -1
  745. package/dist/solutions-components/{p-1add4e39.entry.js → p-e3d72832.entry.js} +2 -2
  746. package/dist/solutions-components/{p-6431fd69.js → p-e4d2fcc5.js} +3 -3
  747. package/dist/solutions-components/{p-f055a840.js → p-e761b7cd.js} +1 -1
  748. package/dist/solutions-components/{p-4daae757.js → p-ea285144.js} +1 -1
  749. package/dist/solutions-components/p-ebbff02e.js +6 -0
  750. package/dist/solutions-components/{p-07bc4f07.entry.js → p-ec378ea0.entry.js} +3 -3
  751. package/dist/solutions-components/{p-12a4fa84.js → p-ec889511.js} +1 -1
  752. package/dist/solutions-components/{p-e02fcfa9.entry.js → p-f153f1c9.entry.js} +2 -2
  753. package/dist/solutions-components/{p-b49bdc72.entry.js → p-f596eabd.entry.js} +1 -1
  754. package/dist/solutions-components/{p-3aba40e8.js → p-f7b520ae.js} +2 -2
  755. package/dist/solutions-components/{p-4c43820f.entry.js → p-f815b5ef.entry.js} +1 -1
  756. package/dist/solutions-components/p-fb7ca639.entry.js +6 -0
  757. package/dist/solutions-components/{p-955a956a.entry.js → p-fe96e0d9.entry.js} +4 -4
  758. package/dist/solutions-components/{p-b5d67495.entry.js → p-feff224c.entry.js} +2 -2
  759. package/dist/solutions-components/solutions-components.esm.js +1 -1
  760. package/dist/solutions-components/utils/downloadUtils.ts +358 -326
  761. package/dist/solutions-components/utils/interfaces.ts +11 -0
  762. package/dist/solutions-components/utils/test/downloadUtils.spec.tsx +587 -61
  763. package/dist/types/components/crowdsource-manager/crowdsource-manager.d.ts +28 -4
  764. package/dist/types/components/info-card/info-card.d.ts +23 -0
  765. package/dist/types/components/layer-table/layer-table.d.ts +14 -2
  766. package/dist/types/components/map-card/map-card.d.ts +6 -2
  767. package/dist/types/components/map-legend/map-legend.d.ts +64 -0
  768. package/dist/types/components/map-tools/map-tools.d.ts +11 -41
  769. package/dist/types/components.d.ts +40 -11
  770. package/dist/types/preact.d.ts +2 -0
  771. package/dist/types/utils/downloadUtils.d.ts +126 -15
  772. package/dist/types/utils/interfaces.d.ts +9 -0
  773. package/package.json +4 -10
  774. package/dist/solutions-components/p-2d70d3fd.js +0 -12
  775. package/dist/solutions-components/p-361f1fe1.js +0 -11
  776. package/dist/solutions-components/p-3bd99fc9.js +0 -11
  777. package/dist/solutions-components/p-418d0b60.entry.js +0 -6
  778. package/dist/solutions-components/p-525f1188.js +0 -11
  779. package/dist/solutions-components/p-55aefaa8.entry.js +0 -6
  780. package/dist/solutions-components/p-5b5a6ac8.entry.js +0 -6
  781. package/dist/solutions-components/p-7b90c18e.entry.js +0 -6
  782. package/dist/solutions-components/p-91caf655.entry.js +0 -11
  783. package/dist/solutions-components/p-a0a2c53d.js +0 -21
  784. package/dist/solutions-components/p-a6c85bd7.entry.js +0 -6
  785. package/dist/solutions-components/p-b6578a32.js +0 -6
  786. package/dist/solutions-components/p-baccfd70.entry.js +0 -6
  787. package/dist/solutions-components/p-bba3fa4e.entry.js +0 -11
  788. package/dist/solutions-components/p-c1ee0d69.js +0 -11
  789. package/dist/solutions-components/p-d6322e4b.js +0 -6
@@ -24,32 +24,33 @@ import { IExportInfo, IExportInfos } from "../utils/interfaces";
24
24
 
25
25
  export { ILabel } from "./pdfUtils";
26
26
 
27
- interface IArcadeExecutors {
28
- [expressionName: string]: __esri.ArcadeExecutor;
27
+ export interface IAttributeOrigNames {
28
+ [lowercaseName: string]: string;
29
29
  }
30
30
 
31
- interface IArcadeExecutorPromises {
32
- [expressionName: string]: Promise<__esri.ArcadeExecutor>;
33
- }
34
-
35
- interface IAttributeDomains {
31
+ export interface IAttributeDomains {
36
32
  [attributeName: string]: __esri.CodedValueDomain | __esri.RangeDomain | __esri.InheritedDomain | null;
37
33
  }
38
34
 
39
- interface IAttributeFormats {
35
+ export interface IAttributeFormats {
40
36
  [attributeName: string]: __esri.FieldInfoFormat;
41
37
  }
42
38
 
43
- interface IAttributeTypes {
39
+ export interface IAttributeTypes {
44
40
  [attributeName: string]: string;
45
41
  }
46
42
 
47
- interface ILayerRelationshipQuery {
43
+ export interface ILabelFormat {
44
+ type: "pattern" | "executor" | "unsupported";
45
+ format: string | __esri.ArcadeExecutor | undefined;
46
+ }
47
+
48
+ export interface ILayerRelationshipQuery {
48
49
  layer: __esri.FeatureLayer;
49
50
  relatedQuery: IRelatedFeaturesQuery;
50
51
  }
51
52
 
52
- interface ILayerRelationshipQueryHash {
53
+ export interface ILayerRelationshipQueryHash {
53
54
  [relationshipId: string]: ILayerRelationshipQuery;
54
55
  }
55
56
 
@@ -66,8 +67,39 @@ interface IRelatedFeaturesQuery {
66
67
  const lineSeparatorChar = "|";
67
68
 
68
69
  //#endregion
70
+ // ------------------------------------------------------------------------------------------------------------------ //
69
71
  //#region Public functions
70
72
 
73
+ /**
74
+ * Create and consolidate labels from all layers
75
+ *
76
+ * @param exportInfos Key details about what to export (ids, layer, and selectionSetNames)
77
+ * @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
78
+ * all attributes are exported
79
+ * @param includeHeaderNames Add the label format at the front of the list of generated labels
80
+ * @returns selectionSetNames that will be used for export filenames
81
+ */
82
+ export async function consolidateLabels(
83
+ exportInfos: IExportInfos,
84
+ formatUsingLayerPopup = true,
85
+ includeHeaderNames = false,
86
+ isCSVExport = false
87
+ ): Promise<string[][]> {
88
+ const labelRequests = [];
89
+
90
+ Object.keys(exportInfos).forEach(k => {
91
+ const labelInfo: IExportInfo = exportInfos[k];
92
+ labelRequests.push(_prepareLabels(labelInfo.layerView?.layer || labelInfo.layer, labelInfo.ids, formatUsingLayerPopup, includeHeaderNames));
93
+ if (isCSVExport) {
94
+ // add the layer id as a temp value separator that we can use to split values for CSV export
95
+ labelRequests.push(Promise.resolve([[k]]));
96
+ }
97
+ });
98
+
99
+ const labels = await Promise.all(labelRequests);
100
+ return labels.reduce((prev, cur) => prev.concat(cur), []);
101
+ }
102
+
71
103
  /**
72
104
  * Downloads csv of mailing labels for the provided list of ids
73
105
  *
@@ -140,59 +172,51 @@ export async function downloadPDF(
140
172
  return Promise.resolve();
141
173
  }
142
174
 
143
- //#endregion
144
- //#region Private functions
145
-
146
175
  /**
147
- * Converts a set of fieldInfos into template lines.
176
+ * Remove any duplicate labels
148
177
  *
149
- * @param fieldInfos Layer's fieldInfos structure
150
- * @param bypassFieldVisiblity Indicates if the configured fieldInfo visibility property should be ignored
151
- * @return Label spec with lines separated by `lineSeparatorChar`
178
+ * @param labels Labels to evaluate for duplicates
179
+ * @returns labels with duplicates removed
152
180
  */
153
- export function _convertPopupFieldsToLabelSpec(
154
- fieldInfos: __esri.FieldInfo[],
155
- bypassFieldVisiblity = false
156
- ): string {
157
- const labelSpec: string[] = [];
158
-
159
- // Every visible attribute is used
160
- fieldInfos.forEach(
161
- fieldInfo => {
162
- if (fieldInfo.visible || bypassFieldVisiblity) {
163
- labelSpec.push(`{${fieldInfo.fieldName}}`);
164
- }
165
- }
181
+ export function removeDuplicateLabels(
182
+ labels: string[][]
183
+ ): string[][] {
184
+ const labelsAsStrings: string[] = labels.map(label => JSON.stringify(label));
185
+ const uniqueLabels = new Set(labelsAsStrings);
186
+ return Array.from(uniqueLabels,
187
+ labelString => JSON.parse(labelString)
166
188
  );
189
+ }
167
190
 
168
- return labelSpec.join(lineSeparatorChar);
169
- };
191
+ //#endregion
192
+ // ------------------------------------------------------------------------------------------------------------------ //
193
+ //#region Private functions
170
194
 
171
195
  /**
172
196
  * Converts the text of a custom popup into a multiline label specification; conversion splits text into
173
- * lines on <br>s, and removes HTML tags. It does not handle Arcade and related records.
197
+ * lines on <br>s, and removes HTML tags.
174
198
  *
175
- * @param popupInfo Layer's popupInfo structure containing description, fieldInfos, and expressionInfos, e.g.,
199
+ * @param labelText Layer's popup text, e.g.,
176
200
  * "<div style='text-align: left;'>{NAME}<br />{STREET}<br />{CITY}, {STATE} {ZIP} <br /></div>"
177
- * @return Label spec with lines separated by `lineSeparatorChar`
201
+ * @return Cleaned-up popup text with lines separated by `lineSeparatorChar`
178
202
  */
179
- export function _convertPopupTextToLabelSpec(
180
- popupInfo: string,
203
+ export function _cleanupLabel(
204
+ labelText: string,
181
205
  ): string {
182
206
  // Replace <br> variants with the line separator character
183
- popupInfo = popupInfo.replace(/<br\s*\/?>/gi, lineSeparatorChar);
207
+ labelText = labelText.replace(/<br\s*\/?>/gi, lineSeparatorChar);
184
208
 
185
209
  // Replace <p> variants with the line separator character, except in the first position
186
- popupInfo = popupInfo.replace(/<p[^>]*>/gi, lineSeparatorChar).trim().replace(/^\|/, "");
210
+ labelText = labelText.replace(/<p[^>]*>/gi, lineSeparatorChar).trim().replace(/^\|/, "");
187
211
 
188
212
  // Remove </p>
189
- popupInfo = popupInfo.replace(/<\/p>/gi, "");
213
+ labelText = labelText.replace(/<\/p>/gi, "");
190
214
 
191
215
  // Replace \n with the line separator character
192
- popupInfo = popupInfo.replace(/\n/gi, "|");
216
+ labelText = labelText.replace(/\n/gi, "|");
193
217
 
194
218
  // Remove remaining HTML tags, replace 0xA0 that popup uses for spaces, and replace some char representations
195
- let labelSpec = popupInfo
219
+ labelText = labelText
196
220
  .replace(/<[\s.]*[^<>]*\/?>/gi, "")
197
221
  .replace(/\xA0/gi, " ")
198
222
  .replace(/&lt;/gi, "<")
@@ -200,47 +224,75 @@ export function _convertPopupTextToLabelSpec(
200
224
  .replace(/&nbsp;/gi, " ");
201
225
 
202
226
  // Trim each line
203
- labelSpec = labelSpec.replace(/\s*\|\s*/g, "|");
227
+ labelText = labelText.replace(/\s*\|\s*/g, "|");
204
228
 
205
229
  // Remove empty lines
206
- while (labelSpec.match(/\|\|/)) {
207
- labelSpec = labelSpec.replace(/\|\|/, "|");
230
+ while (labelText.match(/\|\|/)) {
231
+ labelText = labelText.replace(/\|\|/, "|");
208
232
  }
209
233
 
210
234
  // Remove leading and trailing line feeds
211
- labelSpec = labelSpec.replace(/^\|/, "");
212
- labelSpec = labelSpec.replace(/\|$/, "");
235
+ labelText = labelText.replace(/^\|/, "");
236
+ labelText = labelText.replace(/\|$/, "");
213
237
 
214
- return labelSpec.trim();
238
+ return labelText;
215
239
  };
216
240
 
217
241
  /**
218
- * Extracts Arcade expressions from the lines of a label format and creates an Arcade executor for each
219
- * referenced expression name.
242
+ * Converts a set of fieldInfos into template lines.
220
243
  *
221
- * @param labelFormat Label to examine
222
- * @param layer Layer from which to fetch features
223
- * @return Promise resolving to a set of executors keyed using the expression name
244
+ * @param fieldInfos Layer's fieldInfos structure
245
+ * @param bypassFieldVisiblity Indicates if the configured fieldInfo visibility property should be ignored
246
+ * @return "pattern" label spec with lines separated by `lineSeparatorChar`
224
247
  */
225
- async function _createArcadeExecutors(
226
- labelFormat: string,
227
- layer: __esri.FeatureLayer
228
- ): Promise<IArcadeExecutors> {
229
- const arcadeExecutors: IArcadeExecutors = {};
248
+ export function _convertPopupFieldsToLabelSpec(
249
+ fieldInfos: __esri.FieldInfo[],
250
+ bypassFieldVisiblity = false
251
+ ): ILabelFormat {
252
+ const labelSpec: string[] = [];
230
253
 
231
- // Are any Arcade expressions in the layer?
232
- if (!Array.isArray(layer.popupTemplate.expressionInfos) || layer.popupTemplate.expressionInfos.length === 0) {
233
- return Promise.resolve(arcadeExecutors);
234
- }
254
+ // Every visible attribute is used
255
+ fieldInfos.forEach(
256
+ fieldInfo => {
257
+ if (fieldInfo.visible || bypassFieldVisiblity) {
258
+ labelSpec.push(`{${fieldInfo.fieldName}}`);
259
+ }
260
+ }
261
+ );
235
262
 
236
- // Are there any Arcade expressions in the label format?
237
- const arcadeExpressionRegExp = /\{expression\/\w+\}/g;
238
- const arcadeExpressionsMatches = labelFormat.match(arcadeExpressionRegExp);
239
- if (!arcadeExpressionsMatches) {
240
- return Promise.resolve(arcadeExecutors);
241
- }
263
+ return {
264
+ type: "pattern",
265
+ format: labelSpec.join(lineSeparatorChar)
266
+ } as ILabelFormat;
267
+ };
268
+
269
+ /**
270
+ * Converts the text of a custom popup into a multiline label specification; conversion splits text into
271
+ * lines on <br>s, and removes HTML tags. It does not handle Arcade and related records.
272
+ *
273
+ * @param labelText Layer's labelText structure containing description, fieldInfos, and expressionInfos, e.g.,
274
+ * "<div style='text-align: left;'>{NAME}<br />{STREET}<br />{CITY}, {STATE} {ZIP} <br /></div>"
275
+ * @return "pattern" label spec with lines separated by `lineSeparatorChar`
276
+ */
277
+ export function _convertPopupTextToLabelSpec(
278
+ popupInfo: string,
279
+ ): ILabelFormat {
280
+ return {
281
+ type: "pattern",
282
+ format: _cleanupLabel(popupInfo)
283
+ } as ILabelFormat;
284
+ };
242
285
 
243
- // Generate an Arcade executor for each match
286
+ /**
287
+ * Converts an Arcade expression of a custom popup into a multiline label specification.
288
+ *
289
+ * @param expressionInfo Structure containing expression and info about it
290
+ * @return Promise resolving to an "executor" label spec
291
+ */
292
+ export async function _convertPopupArcadeToLabelSpec(
293
+ expressionInfo: __esri.ElementExpressionInfo
294
+ ): Promise<ILabelFormat> {
295
+ // Generate an Arcade executor
244
296
  const [arcade] = await loadModules(["esri/arcade"]);
245
297
  const labelingProfile: __esri.Profile = {
246
298
  variables: [
@@ -262,36 +314,12 @@ async function _createArcadeExecutors(
262
314
  }
263
315
  ]
264
316
  };
317
+ const executor = await arcade.createArcadeExecutor(expressionInfo.expression, labelingProfile);
265
318
 
266
- const createArcadeExecutorPromises: IArcadeExecutorPromises = {};
267
- arcadeExpressionsMatches.forEach(
268
- (match: string) => {
269
- const expressionName = match.substring(match.indexOf("/") + 1, match.length - 1);
270
-
271
- (layer.popupTemplate.expressionInfos || []).forEach(
272
- expressionInfo => {
273
- if (expressionInfo.name === expressionName) {
274
- createArcadeExecutorPromises[expressionName] =
275
- arcade.createArcadeExecutor(expressionInfo.expression, labelingProfile);
276
- }
277
- }
278
- );
279
- }
280
- );
281
-
282
- const promises = Object.values(createArcadeExecutorPromises);
283
- return Promise.all(promises)
284
- .then(
285
- executors => {
286
- const expressionNames = Object.keys(createArcadeExecutorPromises);
287
-
288
- for (let i = 0; i < expressionNames.length; ++i) {
289
- arcadeExecutors[expressionNames[i]] = executors[i].valueOf() as __esri.ArcadeExecutor;
290
- }
291
-
292
- return arcadeExecutors;
293
- }
294
- );
319
+ return Promise.resolve({
320
+ type: "executor",
321
+ format: executor
322
+ } as ILabelFormat);
295
323
  }
296
324
 
297
325
  /**
@@ -349,12 +377,12 @@ export function _createRelationshipQueries(
349
377
 
350
378
  /**
351
379
  * Extracts Arcade expression references from the lines of a label format.
352
- *
380
+ *
353
381
  * @param labelFormat Label to examine
354
382
  * @return Array of Arcade expression references, e.g., ["{expression/expr1}", "{expression/expr2}"]
355
383
  */
356
384
  export function _getExpressionsFromLabel(
357
- labelFormat: string
385
+ labelFormat: string
358
386
  ): string[] {
359
387
  const arcadeExpressionRegExp = /\{expression\/\w+\}/g;
360
388
  return labelFormat.match(arcadeExpressionRegExp) ?? [];
@@ -362,11 +390,11 @@ export function _getExpressionsFromLabel(
362
390
 
363
391
  /**
364
392
  * Extracts field name expressions from the lines of a label format.
365
- *
393
+ *
366
394
  * @param labelFormat Label to examine
367
395
  * @returns Array of field name expressions, e.g., ["{NAME}", "{STREET}", "{CITY}", "{STATE}", "{ZIP}"]
368
396
  */
369
- export function _getFieldsFromLabel(
397
+ export function _getFieldExpressionsFromLabel(
370
398
  labelFormat: string
371
399
  ): string[] {
372
400
  // Get all fields
@@ -390,6 +418,99 @@ export function _getFieldsFromLabel(
390
418
  return fieldExpressions.filter(fieldExpression => arcadeExpressions.indexOf(fieldExpression) < 0);
391
419
  }
392
420
 
421
+ /**
422
+ * Extracts field names from field name expressions.
423
+ *
424
+ * @param fieldExpressions Array of field name expressions, e.g., ["{NAME}", "{STREET}", "{CITY}", "{STATE}", "{ZIP}"]
425
+ * @returns Array of field names, e.g., ["NAME", "STREET", "CITY", "STATE", "ZIP"]
426
+ */
427
+ export function _getFieldNamesFromFieldExpressions(
428
+ fieldExpressions: string[]
429
+ ): string[] {
430
+ return fieldExpressions.map(
431
+ expr => expr.substring(1, expr.length - 1)
432
+ )
433
+ }
434
+
435
+ /**
436
+ * Extracts the label format from the layer.
437
+ *
438
+ * @param layer Layer with label format
439
+ * @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
440
+ * all attributes are exported
441
+ * @param attributeFormats Empty object to hold the formats for each attribute in a feature; the object is filled
442
+ * with formats by this function
443
+ * @returns A Promise resolving to the format of a single label with fields coerced to lowercase, e.g.,
444
+ * for ILabelFormat type "pattern": "{name}|{street}|{city}, {state} {zip}"
445
+ */
446
+ export async function _getLabelFormat(
447
+ layer: __esri.FeatureLayer,
448
+ formatUsingLayerPopup: boolean,
449
+ attributeFormats: IAttributeFormats
450
+ ): Promise<ILabelFormat> {
451
+ let labelFormat: ILabelFormat = {
452
+ type: "unsupported",
453
+ format: undefined
454
+ };
455
+
456
+ if (layer.popupEnabled) {
457
+ layer.popupTemplate.fieldInfos.forEach(
458
+ // Extract any format info that we have
459
+ fieldInfo => {
460
+ if (fieldInfo.format) {
461
+ attributeFormats[fieldInfo.fieldName.toLowerCase()] = fieldInfo.format;
462
+ }
463
+ }
464
+ );
465
+
466
+ // What is the nature of the label content?
467
+ // Fields list
468
+ if (formatUsingLayerPopup && layer.popupTemplate?.content[0]?.type === "fields") {
469
+ labelFormat = _convertPopupFieldsToLabelSpec(layer.popupTemplate.fieldInfos);
470
+
471
+ // If popup is configured with "no attribute information", then no fields will visible
472
+ if ((labelFormat.format as string).length === 0) {
473
+ // Can we use the popup title?
474
+ labelFormat = layer.popupTemplate.title && typeof layer.popupTemplate.title === "string" ?
475
+ { type: "pattern", format: layer.popupTemplate.title } as ILabelFormat
476
+ :
477
+ // Otherwise revert to using attributes
478
+ _convertPopupFieldsToLabelSpec(layer.popupTemplate.fieldInfos, true);
479
+ }
480
+
481
+ // Example text: '<p>{name} {age} years &nbsp;</p><p>started: {start}</p>'
482
+ } else if (formatUsingLayerPopup && layer.popupTemplate?.content[0]?.type === "text") {
483
+ labelFormat = _convertPopupTextToLabelSpec(layer.popupTemplate.content[0].text);
484
+
485
+ // Example expression: 'var feat = $feature\nvar label = `\n\t${feat["name"]} ${feat["age"]} years <br>\n\tstarted: ${feat["start"]}\n`\n\nreturn { \n type : \'text\', \n text : label\n}',
486
+ } else if (formatUsingLayerPopup && layer.popupTemplate?.content[0]?.type === "expression") {
487
+ labelFormat = await _convertPopupArcadeToLabelSpec(layer.popupTemplate.content[0].expressionInfo);
488
+ }
489
+ }
490
+
491
+ return Promise.resolve(labelFormat);
492
+ }
493
+
494
+ /**
495
+ * Extract selectionSetNames from the provided exportInfos
496
+ *
497
+ * @param exportInfos Key details about what to export (ids, layer, and selectionSetNames)
498
+ * @returns selectionSetNames that will be used for export filenames
499
+ */
500
+ export function _getSelectionSetNames(
501
+ exportInfos: IExportInfos,
502
+ id = /.+/
503
+ ): string[] {
504
+ let selectionSetNames: string[] = [];
505
+ Object.keys(exportInfos).forEach(k => {
506
+ const exportInfo: IExportInfo = exportInfos[k];
507
+ if (id.test(k)) {
508
+ selectionSetNames = selectionSetNames.concat(exportInfo.selectionSetNames);
509
+ }
510
+ });
511
+ return selectionSetNames;
512
+ }
513
+
393
514
  /**
394
515
  * Prepares an attribute's value by applying domain and type information.
395
516
  *
@@ -398,19 +519,23 @@ export function _getFieldsFromLabel(
398
519
  * @param attributeDomain Domain info for attribute, if any
399
520
  * @param attributeFormat Format info for attribute, if any
400
521
  * @param intl esri/intl
401
- * @return Attribute value modified appropriate to domain and type
522
+ * @return Attribute value modified appropriate to domain and type and converted to a string
402
523
  */
403
- function _prepareAttributeValue(
524
+ export function _prepareAttributeValue(
404
525
  attributeValue: any,
405
526
  attributeType: string,
406
527
  attributeDomain: __esri.CodedValueDomain | __esri.RangeDomain | __esri.InheritedDomain | null,
407
528
  attributeFormat: __esri.FieldInfoFormat,
408
529
  intl: any
409
- ): any {
530
+ ): string {
531
+ if (attributeValue === null || typeof attributeValue === "undefined") {
532
+ return "";
533
+ }
534
+
410
535
  if (attributeDomain && (attributeDomain as __esri.CodedValueDomain).type === "coded-value") {
411
536
  // "coded-value" domain field
412
537
  const value = (attributeDomain as __esri.CodedValueDomain).getName(attributeValue);
413
- return value;
538
+ return value.toString();
414
539
  } else {
415
540
  // Non-domain field or unsupported domain type
416
541
  let value = attributeValue;
@@ -418,7 +543,7 @@ function _prepareAttributeValue(
418
543
  switch (attributeType) {
419
544
  case "date":
420
545
  if (attributeFormat?.dateFormat) {
421
- const dateFormatIntlOptions = intl.convertDateFormatToIntlOptions(attributeFormat.dateFormat);
546
+ const dateFormatIntlOptions = intl.convertDateFormatToIntlOptions(attributeFormat.dateFormat as any);
422
547
  value = intl.formatDate(value, dateFormatIntlOptions);
423
548
  } else {
424
549
  value = intl.formatDate(value);
@@ -455,199 +580,85 @@ function _prepareAttributeValue(
455
580
  * @param includeHeaderNames Add the label format at the front of the list of generated labels
456
581
  * @returns Promise resolving when function is done
457
582
  */
458
- async function _prepareLabels(
583
+ export async function _prepareLabels(
459
584
  layer: __esri.FeatureLayer,
460
585
  ids: number[],
461
586
  formatUsingLayerPopup = true,
462
587
  includeHeaderNames = false
463
588
  ): Promise<string[][]> {
464
- const [intl] = await loadModules(["esri/intl"]);
465
-
466
589
  // Get the features to export
467
590
  const featureSet = await queryFeaturesByID(ids, layer, [], false);
468
591
 
469
592
  // Get field data types. Do we have any domain-based fields?
593
+ const attributeOrigNames: IAttributeOrigNames = {};
470
594
  const attributeTypes: IAttributeTypes = {};
471
595
  const attributeDomains: IAttributeDomains = {};
472
596
  layer.fields.forEach(
473
597
  field => {
474
- attributeTypes[field.name] = field.type;
475
- attributeDomains[field.name] = field.domain;
598
+ const lowercaseFieldname = field.name.toLowerCase();
599
+ attributeOrigNames[lowercaseFieldname] = field.name;
600
+ attributeDomains[lowercaseFieldname] = field.domain;
601
+ attributeTypes[lowercaseFieldname] = field.type;
476
602
  }
477
603
  );
478
604
  const attributeFormats: IAttributeFormats = {};
479
605
 
480
606
  // Get the label formatting, if any
481
- let labelFormat: string;
482
- let relationshipQueries: ILayerRelationshipQueryHash = {};
483
- let arcadeExecutors: IArcadeExecutors = {};
484
- if (layer.popupEnabled) {
485
- layer.popupTemplate.fieldInfos.forEach(
486
- // Extract any format info that we have
487
- fieldInfo => {
488
- if (fieldInfo.format) {
489
- attributeFormats[fieldInfo.fieldName] = fieldInfo.format;
490
- }
491
- }
492
- );
493
-
494
- // What data fields are used in the labels?
495
- // Example labelFormat: ['{NAME}', '{STREET}', '{CITY}, {STATE} {ZIP}']
496
- if (formatUsingLayerPopup && layer.popupTemplate?.content[0]?.type === "fields") {
497
- labelFormat = _convertPopupFieldsToLabelSpec(layer.popupTemplate.fieldInfos);
498
-
499
- // If popup is configured with "no attribute information", then no fields will visible
500
- if (labelFormat.length === 0) {
501
- // Can we use the popup title?
502
- // eslint-disable-next-line unicorn/prefer-ternary
503
- if (typeof layer.popupTemplate.title === "string") {
504
- labelFormat = layer.popupTemplate.title;
505
-
506
- // Otherwise revert to using attributes
507
- } else {
508
- labelFormat = _convertPopupFieldsToLabelSpec(layer.popupTemplate.fieldInfos, true);
509
- }
510
- }
511
-
512
- } else if (formatUsingLayerPopup && layer.popupTemplate?.content[0]?.type === "text") {
513
- labelFormat = _convertPopupTextToLabelSpec(layer.popupTemplate.content[0].text);
514
-
515
- // Do we need any relationship queries?
516
- relationshipQueries = _createRelationshipQueries(layer);
517
-
518
- // Do we need any Arcade executors?
519
- arcadeExecutors = await _createArcadeExecutors(labelFormat, layer);
520
- }
521
- }
607
+ const labelFormat: ILabelFormat = await _getLabelFormat(layer, formatUsingLayerPopup, attributeFormats);
522
608
 
523
609
  // Apply the label format
524
- let labels: string[][];
525
- // eslint-disable-next-line unicorn/prefer-ternary
526
- if (labelFormat) {
527
- // Find the label fields that we need to replace with values
528
- const arcadeExpressionMatches = _getExpressionsFromLabel(labelFormat);
529
- const attributeMatches = _getFieldsFromLabel(labelFormat);
530
-
531
- // Convert feature attributes into an array of labels
532
- const relationshipKeys = Object.keys(relationshipQueries);
533
- labels = await Promise.all(featureSet.map(
534
- async feature => {
535
- let labelPrep = labelFormat;
536
-
537
- // Replace Arcade expressions in this feature
538
- arcadeExpressionMatches.forEach(
539
- (match: string) => {
540
- const expressionName = match.substring(match.indexOf("/") + 1, match.length - 1);
541
- const value = arcadeExecutors[expressionName].execute({"$feature": feature});
542
- labelPrep = labelPrep.replace(match, value);
543
- }
544
- )
545
-
546
- // Replace relationship expressions in this feature
547
- const relatedFeatureQueries = [] as Promise<__esri.FeatureSet>[];
548
- const relationshipIds = [] as string[];
549
- relationshipKeys.forEach(
550
- (relationshipId) => {
551
- const relationship = relationshipQueries[relationshipId];
552
- const objectId = feature.attributes[relationship.layer.objectIdField];
553
- const relatedQuery = {
554
- ...relationship.relatedQuery,
555
- objectIds: [objectId]
556
- };
557
- relatedFeatureQueries.push(relationship.layer.queryRelatedFeatures(relatedQuery as any));
558
- relationshipIds.push(relationshipId);
559
- }
560
- );
561
-
562
- // Wait for all of the queries for related records for this label
563
- const relatedFeatureQueryResults = await Promise.all(relatedFeatureQueries);
564
- relatedFeatureQueryResults.forEach(
565
- (relatedFeatureQueryResult, i) => {
566
- // We have an object with FeatureSets grouped by source layer or table objectIds
567
- const relationshipId = relationshipIds[i];
568
-
569
- // Run through the source layer or table objectIds
570
- Object.keys(relatedFeatureQueryResult).forEach(
571
- relatedFeatureSetId => {
572
- // We have a feature set
573
- const relatedFeatures = relatedFeatureQueryResult[relatedFeatureSetId].features;
574
-
575
- // Get the values from each feature and replace them in the label
576
- relatedFeatures.forEach(
577
- feature => {
578
- // Merge the base and related feature attributes and create the label
579
- // Prefix related feature's attributes with "relationships/<id>/" to match popup
580
- const rePrefix = "\{relationships/" + relationshipId + "/";
581
- const reSuffix = "\}";
582
-
583
- const attributes = feature.attributes;
584
- Object.keys(attributes).forEach(
585
- attributeName => {
586
- // Replace the value using the attribute name as a relationship
587
- const attributeRelationshipRegExp = new RegExp(rePrefix + attributeName + reSuffix, "g");
588
- labelPrep = labelPrep.replaceAll(attributeRelationshipRegExp, attributes[attributeName]);
589
- }
590
- );
591
- }
592
- );
593
- }
594
- );
595
- }
596
- );
597
-
598
- // Replace non-Arcade fields in this feature
599
- attributeMatches.forEach(
600
- (match: string) => {
601
- const attributeName = match.substring(1, match.length - 1);
602
-
603
- const value = _prepareAttributeValue(feature.attributes[attributeName],
604
- attributeTypes[attributeName], attributeDomains[attributeName],
605
- attributeFormats[attributeName], intl);
606
- labelPrep = labelPrep.replace(match, value);
607
-
608
- }
609
- )
610
-
611
- // Split label into lines
612
- let label = labelPrep.split(lineSeparatorChar);
613
-
614
- // Trim lines
615
- label = label.map(line => line.trim());
616
-
617
- return label;
618
- }
619
- ));
620
-
621
- } else {
610
+ const labels = labelFormat.type === "unsupported" ?
622
611
  // Export all attributes
623
- labels = featureSet.map(
624
- feature => {
625
- return Object.keys(feature.attributes).map(
626
- (attributeName: string) => {
627
- const value = _prepareAttributeValue(feature.attributes[attributeName],
628
- attributeTypes[attributeName], attributeDomains[attributeName],
629
- null, intl);
630
- return `${value}`;
631
- }
632
- );
633
- }
634
- );
635
- }
612
+ await _prepareLabelsFromAll(featureSet, attributeTypes, attributeDomains, includeHeaderNames)
613
+ : labelFormat.type == "pattern" ?
614
+ // Export attributes in format
615
+ await _prepareLabelsFromPattern(featureSet, attributeOrigNames, attributeTypes, attributeDomains,
616
+ attributeFormats, labelFormat.format as string, includeHeaderNames)
617
+ :
618
+ // Export attributes in expression
619
+ await _prepareLabelsUsingExecutor(featureSet, labelFormat.format as __esri.ArcadeExecutor);
636
620
 
637
- // Add header names
638
- if (includeHeaderNames) {
639
- let headerNames = [];
621
+ return Promise.resolve(labels);
622
+ }
640
623
 
641
- if (labelFormat) {
642
- headerNames = labelFormat.replace(/\{/g, "").replace(/\}/g, "").split(lineSeparatorChar);
624
+ /**
625
+ * Creates labels from all attributes in items.
626
+ *
627
+ * @param featureSet Features to convert to labels
628
+ * @param attributeTypes Type for each attribute in a feature
629
+ * @param attributeDomains Domains for each attribute in a feature
630
+ * @param includeHeaderNames Add the label format at the front of the list of generated labels
631
+ * @returns Promise resolving with list of labels, each of which is a list of label lines
632
+ */
633
+ export async function _prepareLabelsFromAll(
634
+ featureSet: __esri.Graphic[],
635
+ attributeTypes: IAttributeTypes,
636
+ attributeDomains: IAttributeDomains,
637
+ includeHeaderNames = false
638
+ ): Promise<string[][]> {
639
+ const [intl] = await loadModules(["esri/intl"]);
643
640
 
644
- } else {
645
- const featuresAttrs = featureSet[0].attributes;
646
- Object.keys(featuresAttrs).forEach(k => {
647
- headerNames.push(k);
648
- });
641
+ // Export all attributes
642
+ const labels = featureSet.map(
643
+ feature => {
644
+ return Object.keys(feature.attributes).map(
645
+ (attributeName: string) => {
646
+ const lowercaseFieldname = attributeName.toLowerCase();
647
+ return _prepareAttributeValue(feature.attributes[attributeName],
648
+ attributeTypes[lowercaseFieldname], attributeDomains[lowercaseFieldname],
649
+ null, intl);
650
+ }
651
+ );
649
652
  }
653
+ );
650
654
 
655
+ // Add header names
656
+ if (includeHeaderNames) {
657
+ const headerNames = [];
658
+ const featuresAttrs = featureSet[0].attributes;
659
+ Object.keys(featuresAttrs).forEach(k => {
660
+ headerNames.push(k);
661
+ });
651
662
  labels.unshift(headerNames);
652
663
  }
653
664
 
@@ -655,69 +666,90 @@ async function _prepareLabels(
655
666
  }
656
667
 
657
668
  /**
658
- * Remove any duplicate labels
669
+ * Creates labels from attributes in a layer popup.
659
670
  *
660
- * @param labels Labels to evaluate for duplicates
661
- * @returns labels with duplicates removed
671
+ * @param featureSet Features to convert to labels
672
+ * @param attributeOrigNames Mapping from lowercase field names to original field names
673
+ * @param attributeTypes Type for each attribute in a feature
674
+ * @param attributeDomains Domains for each attribute in a feature
675
+ * @param attributeFormats Formats for each attribute in a feature
676
+ * @param labelFormat Format for label
677
+ * @param includeHeaderNames Add the label format at the front of the list of generated labels
678
+ * @returns Promise resolving with list of labels, each of which is a list of label lines
662
679
  */
663
- export function removeDuplicateLabels(
664
- labels: string[][]
665
- ): string[][] {
666
- const labelsAsStrings: string[] = labels.map(label => JSON.stringify(label));
667
- const uniqueLabels = new Set(labelsAsStrings);
668
- return Array.from(uniqueLabels,
669
- labelString => JSON.parse(labelString)
670
- );
671
- }
680
+ export async function _prepareLabelsFromPattern(
681
+ featureSet: __esri.Graphic[],
682
+ attributeOrigNames: IAttributeOrigNames,
683
+ attributeTypes: IAttributeTypes,
684
+ attributeDomains: IAttributeDomains,
685
+ attributeFormats: IAttributeFormats,
686
+ labelFormat: string,
687
+ includeHeaderNames = false
688
+ ): Promise<string[][]> {
689
+ const [intl] = await loadModules(["esri/intl"]);
672
690
 
673
- /**
674
- * Extract selectionSetNames from the provided exportInfos
675
- *
676
- * @param exportInfos Key details about what to export (ids, layer, and selectionSetNames)
677
- * @returns selectionSetNames that will be used for export filenames
678
- */
679
- function _getSelectionSetNames(
680
- exportInfos: IExportInfos,
681
- id = /.+/
682
- ): string[] {
683
- let selectionSetNames: string[] = [];
684
- Object.keys(exportInfos).forEach(k => {
685
- const exportInfo: IExportInfo = exportInfos[k];
686
- if (id.test(k)) {
687
- selectionSetNames = selectionSetNames.concat(exportInfo.selectionSetNames);
691
+ // Find the label fields that we need to replace with values
692
+ const attributeExpressionMatches = _getFieldExpressionsFromLabel(labelFormat);
693
+ const attributeNames = _getFieldNamesFromFieldExpressions(attributeExpressionMatches);
694
+
695
+ // Convert feature attributes into an array of labels
696
+ const labels = await Promise.all(featureSet.map(
697
+ async feature => {
698
+ let labelPrep = labelFormat;
699
+
700
+ // Replace non-Arcade fields in this feature
701
+ attributeNames.forEach(
702
+ (attributeName: string, i: number) => {
703
+ const lowercaseFieldname = attributeName.toLowerCase();
704
+ const value = _prepareAttributeValue(feature.attributes[attributeOrigNames[lowercaseFieldname]],
705
+ attributeTypes[lowercaseFieldname], attributeDomains[lowercaseFieldname],
706
+ attributeFormats[lowercaseFieldname], intl);
707
+ labelPrep = labelPrep.replace(attributeExpressionMatches[i], value);
708
+
709
+ },
710
+ )
711
+
712
+ // Split label into lines
713
+ let label = labelPrep.split(lineSeparatorChar);
714
+
715
+ // Trim lines
716
+ label = label.map(line => _cleanupLabel(line));
717
+
718
+ return label;
688
719
  }
689
- });
690
- return selectionSetNames;
720
+ ));
721
+
722
+ // Add header names
723
+ if (includeHeaderNames) {
724
+ labels.unshift(attributeNames);
725
+ }
726
+
727
+ return Promise.resolve(labels);
691
728
  }
692
729
 
693
730
  /**
694
- * Create and consolidate labels from all layers
731
+ * Creates labels from attributes in an Arcade label.
695
732
  *
696
- * @param exportInfos Key details about what to export (ids, layer, and selectionSetNames)
697
- * @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
698
- * all attributes are exported
699
- * @param includeHeaderNames Add the label format at the front of the list of generated labels
700
- * @returns selectionSetNames that will be used for export filenames
733
+ * @param featureSet Features to convert to labels
734
+ * @param labelFormat Arcade executor for label
735
+ * @returns Promise resolving with list of labels, each of which is a list of label lines
701
736
  */
702
- export async function consolidateLabels(
703
- exportInfos: IExportInfos,
704
- formatUsingLayerPopup = true,
705
- includeHeaderNames = false,
706
- isCSVExport = false
737
+ export async function _prepareLabelsUsingExecutor(
738
+ featureSet: __esri.Graphic[],
739
+ labelFormat: __esri.ArcadeExecutor
707
740
  ): Promise<string[][]> {
708
- const labelRequests = [];
709
-
710
- Object.keys(exportInfos).forEach(k => {
711
- const labelInfo: IExportInfo = exportInfos[k];
712
- labelRequests.push(_prepareLabels(labelInfo.layerView?.layer || labelInfo.layer, labelInfo.ids, formatUsingLayerPopup, includeHeaderNames));
713
- if (isCSVExport) {
714
- // add the layer id as a temp value separator that we can use to split values for CSV export
715
- labelRequests.push(Promise.resolve([[k]]));
741
+ // Convert feature attributes into an array of labels
742
+ const execResults = await Promise.all(featureSet.map(
743
+ async feature => {
744
+ return labelFormat.executeAsync({"$feature": feature});
716
745
  }
717
- });
746
+ ));
718
747
 
719
- const labels = await Promise.all(labelRequests);
720
- return labels.reduce((prev, cur) => prev.concat(cur), []);
748
+ const labels = execResults.map(
749
+ result => _cleanupLabel(result.text).split(lineSeparatorChar)
750
+ )
751
+
752
+ return Promise.resolve(labels);
721
753
  }
722
754
 
723
755
  //#endregion