@esri/solutions-components 0.6.8 → 0.6.9

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