@esri/solutions-components 0.6.12 → 0.6.13

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 (338) hide show
  1. package/dist/assets/t9n/layer-table/resources.json +4 -3
  2. package/dist/assets/t9n/layer-table/resources_en.json +4 -3
  3. package/dist/cjs/calcite-shell-panel_14.cjs.entry.js +2 -1
  4. package/dist/cjs/card-manager_3.cjs.entry.js +60 -28
  5. package/dist/cjs/clean-url-d5326abb.js +573 -0
  6. package/dist/cjs/crowdsource-manager.cjs.entry.js +5 -3
  7. package/dist/cjs/{downloadUtils-43f5be48.js → downloadUtils-fb4744e0.js} +296 -51
  8. package/dist/cjs/edit-card_2.cjs.entry.js +3 -3
  9. package/dist/cjs/{index.es-8da43c21.js → index.es-372e33de.js} +2 -1
  10. package/dist/cjs/loader.cjs.js +1 -1
  11. package/dist/cjs/map-select-tools_3.cjs.entry.js +8 -5
  12. package/dist/cjs/public-notification.cjs.entry.js +5 -4
  13. package/dist/cjs/solution-configuration.cjs.entry.js +44 -43
  14. package/dist/cjs/solution-contents_3.cjs.entry.js +2 -1
  15. package/dist/cjs/{solution-store-3cd104d8.js → solution-store-c443e657.js} +7 -572
  16. package/dist/cjs/solutions-components.cjs.js +1 -1
  17. package/dist/collection/components/card-manager/card-manager.css +0 -5
  18. package/dist/collection/components/card-manager/card-manager.js +1 -1
  19. package/dist/collection/components/crowdsource-manager/crowdsource-manager.css +2 -2
  20. package/dist/collection/components/crowdsource-manager/crowdsource-manager.js +40 -2
  21. package/dist/collection/components/edit-card/edit-card.css +8 -0
  22. package/dist/collection/components/info-card/info-card.css +14 -14
  23. package/dist/collection/components/info-card/info-card.js +1 -1
  24. package/dist/collection/components/layer-table/layer-table.css +12 -0
  25. package/dist/collection/components/layer-table/layer-table.js +90 -24
  26. package/dist/collection/components/pdf-download/pdf-download.js +34 -6
  27. package/dist/collection/components/public-notification/public-notification.js +3 -3
  28. package/dist/collection/utils/downloadUtils.js +208 -82
  29. package/dist/collection/utils/downloadUtils.ts +257 -85
  30. package/dist/collection/utils/test/downloadUtils.spec.js +163 -134
  31. package/dist/collection/utils/test/downloadUtils.spec.tsx +2 -0
  32. package/dist/components/calcite-modal.js +1 -409
  33. package/dist/components/card-manager2.js +2 -2
  34. package/dist/components/clean-url.js +567 -0
  35. package/dist/components/crowdsource-manager.js +16 -12
  36. package/dist/components/downloadUtils.js +295 -50
  37. package/dist/components/edit-card2.js +1 -1
  38. package/dist/components/info-card2.js +2 -2
  39. package/dist/components/layer-table2.js +65 -31
  40. package/dist/components/modal.js +416 -0
  41. package/dist/components/pdf-download2.js +6 -4
  42. package/dist/components/public-notification.js +3 -3
  43. package/dist/components/solution-configuration.js +25 -24
  44. package/dist/components/solution-store.js +2 -562
  45. package/dist/esm/{ExpandToggle-86761b28.js → ExpandToggle-e614e3e4.js} +1 -1
  46. package/dist/esm/{ar-4a5375c6.js → ar-2f678abc.js} +8 -8
  47. package/dist/esm/{bg-b25e4b7a.js → bg-e514c4d7.js} +8 -8
  48. package/dist/esm/{bs-2485dfed.js → bs-81584b09.js} +8 -8
  49. package/dist/esm/buffer-tools_4.entry.js +4 -4
  50. package/dist/esm/{ca-bba36d26.js → ca-e8c40e21.js} +8 -8
  51. package/dist/esm/calcite-accordion-item.entry.js +1 -1
  52. package/dist/esm/calcite-action-bar_3.entry.js +5 -5
  53. package/dist/esm/calcite-action-group_2.entry.js +3 -3
  54. package/dist/esm/calcite-action-pad.entry.js +4 -4
  55. package/dist/esm/calcite-action_2.entry.js +5 -5
  56. package/dist/esm/calcite-alert.entry.js +3 -3
  57. package/dist/esm/calcite-avatar.entry.js +1 -1
  58. package/dist/esm/calcite-block-section.entry.js +3 -3
  59. package/dist/esm/calcite-block.entry.js +3 -3
  60. package/dist/esm/calcite-button.entry.js +5 -5
  61. package/dist/esm/calcite-card.entry.js +3 -3
  62. package/dist/esm/calcite-checkbox.entry.js +3 -3
  63. package/dist/esm/calcite-chip-group.entry.js +1 -1
  64. package/dist/esm/calcite-chip.entry.js +3 -3
  65. package/dist/esm/calcite-color-picker-hex-input_2.entry.js +1 -1
  66. package/dist/esm/calcite-color-picker.entry.js +3 -3
  67. package/dist/esm/calcite-combobox-item-group.entry.js +2 -2
  68. package/dist/esm/calcite-combobox_6.entry.js +7 -7
  69. package/dist/esm/calcite-date-picker-day_3.entry.js +3 -3
  70. package/dist/esm/calcite-date-picker.entry.js +5 -5
  71. package/dist/esm/calcite-fab.entry.js +1 -1
  72. package/dist/esm/calcite-filter_3.entry.js +3 -3
  73. package/dist/esm/calcite-flow-item.entry.js +3 -3
  74. package/dist/esm/calcite-icon.entry.js +1 -1
  75. package/dist/esm/calcite-inline-editable.entry.js +4 -4
  76. package/dist/esm/calcite-input-date-picker.entry.js +9 -9
  77. package/dist/esm/calcite-input-number_2.entry.js +5 -5
  78. package/dist/esm/{calcite-input-time-picker-7da2e80a.js → calcite-input-time-picker-fe6e499a.js} +55 -55
  79. package/dist/esm/calcite-input-time-picker.entry.js +8 -8
  80. package/dist/esm/calcite-input-time-zone.entry.js +5 -5
  81. package/dist/esm/calcite-input_2.entry.js +5 -5
  82. package/dist/esm/calcite-label.entry.js +2 -2
  83. package/dist/esm/calcite-link.entry.js +1 -1
  84. package/dist/esm/calcite-menu-item.entry.js +3 -3
  85. package/dist/esm/calcite-menu.entry.js +3 -3
  86. package/dist/esm/calcite-modal.entry.js +4 -4
  87. package/dist/esm/calcite-navigation.entry.js +1 -1
  88. package/dist/esm/calcite-notice.entry.js +3 -3
  89. package/dist/esm/calcite-option_2.entry.js +3 -3
  90. package/dist/esm/calcite-pagination.entry.js +3 -3
  91. package/dist/esm/calcite-panel_2.entry.js +3 -3
  92. package/dist/esm/calcite-pick-list-group.entry.js +1 -1
  93. package/dist/esm/calcite-pick-list-item.entry.js +3 -3
  94. package/dist/esm/calcite-pick-list.entry.js +2 -2
  95. package/dist/esm/calcite-radio-button.entry.js +3 -3
  96. package/dist/esm/calcite-rating.entry.js +5 -5
  97. package/dist/esm/calcite-scrim.entry.js +3 -3
  98. package/dist/esm/calcite-segmented-control_2.entry.js +3 -3
  99. package/dist/esm/calcite-shell-center-row.entry.js +1 -1
  100. package/dist/esm/calcite-shell-panel_14.entry.js +7 -6
  101. package/dist/esm/calcite-sortable-list.entry.js +2 -2
  102. package/dist/esm/calcite-stepper-item.entry.js +2 -2
  103. package/dist/esm/calcite-stepper.entry.js +1 -1
  104. package/dist/esm/calcite-switch.entry.js +3 -3
  105. package/dist/esm/calcite-text-area.entry.js +5 -5
  106. package/dist/esm/calcite-tile.entry.js +1 -1
  107. package/dist/esm/calcite-time-picker.entry.js +4 -4
  108. package/dist/esm/calcite-tip-manager.entry.js +3 -3
  109. package/dist/esm/calcite-tip.entry.js +3 -3
  110. package/dist/esm/calcite-tooltip.entry.js +2 -2
  111. package/dist/esm/calcite-tree_3.entry.js +1 -1
  112. package/dist/esm/card-manager_3.entry.js +60 -28
  113. package/dist/esm/clean-url-bce022e6.js +567 -0
  114. package/dist/esm/crowdsource-manager.entry.js +5 -3
  115. package/dist/esm/{cs-1052c5ac.js → cs-af5f115e.js} +8 -8
  116. package/dist/esm/{da-b7ed9204.js → da-06d9e22c.js} +8 -8
  117. package/dist/esm/{date-bd5b879c.js → date-641ae749.js} +1 -1
  118. package/dist/esm/{de-at-a993e5ae.js → de-at-f55a700a.js} +8 -8
  119. package/dist/esm/{de-ch-acff745d.js → de-ch-7307675f.js} +8 -8
  120. package/dist/esm/{de-bb68e752.js → de-dc98363f.js} +8 -8
  121. package/dist/esm/{dom-37f2dec9.js → dom-2b326ec3.js} +1 -1
  122. package/dist/esm/{downloadUtils-42156cd8.js → downloadUtils-67c7a6c8.js} +296 -51
  123. package/dist/esm/edit-card_2.entry.js +3 -3
  124. package/dist/esm/{el-9de96ff0.js → el-91c64808.js} +8 -8
  125. package/dist/esm/{en-au-f68b6bde.js → en-au-df08cc25.js} +8 -8
  126. package/dist/esm/{en-ca-5360517e.js → en-ca-175f7c0f.js} +8 -8
  127. package/dist/esm/{en-gb-de0b3125.js → en-gb-90a08c7f.js} +8 -8
  128. package/dist/esm/{es-5ecbba77.js → es-5cb54b05.js} +8 -8
  129. package/dist/esm/{es-mx-aa126462.js → es-mx-3a0cb804.js} +8 -8
  130. package/dist/esm/{et-7113eeb8.js → et-eceac6dc.js} +8 -8
  131. package/dist/esm/{fi-ffa60f15.js → fi-26e1c14f.js} +8 -8
  132. package/dist/esm/{floating-ui-7cde67cf.js → floating-ui-9f8e4ed4.js} +1 -1
  133. package/dist/esm/{focusTrapComponent-ec344399.js → focusTrapComponent-ad2c3a31.js} +1 -1
  134. package/dist/esm/{form-24e6ef1d.js → form-0871d2c6.js} +1 -1
  135. package/dist/esm/{fr-681c5bf6.js → fr-12a5b0f7.js} +8 -8
  136. package/dist/esm/{fr-ch-9af1f8b1.js → fr-ch-e3406887.js} +8 -8
  137. package/dist/esm/{he-5188f277.js → he-61eba811.js} +8 -8
  138. package/dist/esm/{hi-6a31e3a4.js → hi-a50282b5.js} +8 -8
  139. package/dist/esm/{hr-0598e59d.js → hr-da8bffaf.js} +8 -8
  140. package/dist/esm/{hu-13cb9f41.js → hu-dab932f1.js} +8 -8
  141. package/dist/esm/{id-7f342499.js → id-de468947.js} +8 -8
  142. package/dist/esm/{index.es-f47c4153.js → index.es-59a67d3d.js} +2 -1
  143. package/dist/esm/{it-57d790f2.js → it-375d9936.js} +8 -8
  144. package/dist/esm/{it-ch-081af760.js → it-ch-7e663d63.js} +8 -8
  145. package/dist/esm/{ja-3affb68e.js → ja-36dbe39d.js} +8 -8
  146. package/dist/esm/{ko-736632aa.js → ko-858bc871.js} +8 -8
  147. package/dist/esm/{label-b6dfb4d5.js → label-b8caf984.js} +1 -1
  148. package/dist/esm/loader.js +1 -1
  149. package/dist/esm/{locale-146251f7.js → locale-00000ab4.js} +1 -1
  150. package/dist/esm/{lt-e7d9b1c3.js → lt-d6dfa7e4.js} +8 -8
  151. package/dist/esm/{lv-4d1a507e.js → lv-facd25c5.js} +8 -8
  152. package/dist/esm/map-select-tools_3.entry.js +8 -5
  153. package/dist/esm/{mk-f960312d.js → mk-5ed05b6a.js} +8 -8
  154. package/dist/esm/{nb-4556b5e9.js → nb-936fc687.js} +8 -8
  155. package/dist/esm/{nl-8e281c01.js → nl-a923d626.js} +8 -8
  156. package/dist/esm/{pl-1460fd5a.js → pl-b1426275.js} +8 -8
  157. package/dist/esm/{pt-660332b6.js → pt-1ac2453f.js} +8 -8
  158. package/dist/esm/{pt-br-dba48f49.js → pt-br-7194cc5f.js} +8 -8
  159. package/dist/esm/public-notification.entry.js +5 -4
  160. package/dist/esm/{ro-ac18f292.js → ro-518aaed1.js} +8 -8
  161. package/dist/esm/{ru-b914f6b7.js → ru-762127a3.js} +8 -8
  162. package/dist/esm/{shared-list-render-cc889757.js → shared-list-render-ec232615.js} +1 -1
  163. package/dist/esm/{sk-1be12963.js → sk-f367b7ba.js} +8 -8
  164. package/dist/esm/{sl-5d47e4e4.js → sl-052fd4d2.js} +8 -8
  165. package/dist/esm/solution-configuration.entry.js +25 -24
  166. package/dist/esm/solution-contents_3.entry.js +2 -1
  167. package/dist/esm/{solution-store-cf902566.js → solution-store-b29d50f7.js} +2 -562
  168. package/dist/esm/solutions-components.js +1 -1
  169. package/dist/esm/{sortableComponent-8a84709a.js → sortableComponent-ebd6bb72.js} +1 -1
  170. package/dist/esm/{sr-3281c92d.js → sr-4dc0fdb9.js} +8 -8
  171. package/dist/esm/{sv-e5169404.js → sv-bdc87a4d.js} +8 -8
  172. package/dist/esm/{t9n-d9c203e4.js → t9n-9791aa0c.js} +1 -1
  173. package/dist/esm/{th-937796b8.js → th-d9df674c.js} +8 -8
  174. package/dist/esm/{time-fa1151aa.js → time-73378c4a.js} +1 -1
  175. package/dist/esm/{tr-6d3b100b.js → tr-61e134eb.js} +8 -8
  176. package/dist/esm/{uk-a6edcacf.js → uk-ea3d8da7.js} +8 -8
  177. package/dist/esm/{utils-667cc396.js → utils-593fafd7.js} +1 -1
  178. package/dist/esm/{utils-24a35b5a.js → utils-bd52db7d.js} +2 -2
  179. package/dist/esm/{vi-bf4c179c.js → vi-ade1c25b.js} +8 -8
  180. package/dist/esm/{zh-cn-de1858cb.js → zh-cn-b8756118.js} +8 -8
  181. package/dist/esm/{zh-hk-12fa404f.js → zh-hk-d18c05d9.js} +8 -8
  182. package/dist/esm/{zh-tw-5c4220e5.js → zh-tw-9c98ff7c.js} +8 -8
  183. package/dist/solutions-components/{p-3b891cc4.entry.js → p-01fea8d5.entry.js} +1 -1
  184. package/dist/solutions-components/{p-d793ec96.entry.js → p-0219a1a9.entry.js} +5 -5
  185. package/dist/solutions-components/{p-65022e7f.entry.js → p-02ff64f4.entry.js} +1 -1
  186. package/dist/solutions-components/p-062254a6.entry.js +6 -0
  187. package/dist/solutions-components/{p-bff158ff.js → p-062d2f9a.js} +1 -1
  188. package/dist/solutions-components/{p-f4e5b7e5.entry.js → p-084bced1.entry.js} +1 -1
  189. package/dist/solutions-components/{p-c261335b.entry.js → p-088e4cfc.entry.js} +1 -1
  190. package/dist/solutions-components/{p-96239d0d.js → p-08e35485.js} +1 -1
  191. package/dist/solutions-components/{p-3d3772fb.js → p-0d14d33a.js} +1 -1
  192. package/dist/solutions-components/{p-7f271c31.js → p-11550b3c.js} +3 -3
  193. package/dist/solutions-components/{p-ad19f9b0.entry.js → p-120c4098.entry.js} +1 -1
  194. package/dist/solutions-components/{p-45419d93.entry.js → p-12bcd474.entry.js} +1 -1
  195. package/dist/solutions-components/{p-bd82849c.entry.js → p-1597ec4b.entry.js} +1 -1
  196. package/dist/solutions-components/{p-afb35c95.js → p-17d176b5.js} +14 -43
  197. package/dist/solutions-components/{p-0503c78d.js → p-1b41181b.js} +44 -29
  198. package/dist/solutions-components/{p-127c3866.js → p-1c5787b1.js} +1 -1
  199. package/dist/solutions-components/{p-b97886b3.entry.js → p-1d9a5198.entry.js} +1 -1
  200. package/dist/solutions-components/{p-8e3e1ce8.entry.js → p-1dd5c4e6.entry.js} +1 -1
  201. package/dist/solutions-components/{p-97b69f54.entry.js → p-1e62d118.entry.js} +1 -1
  202. package/dist/solutions-components/{p-537c34a4.entry.js → p-1fae3819.entry.js} +1 -1
  203. package/dist/solutions-components/{p-82f0b25b.js → p-21aa112d.js} +1 -1
  204. package/dist/solutions-components/{p-f8944f59.entry.js → p-252a9a7f.entry.js} +1 -1
  205. package/dist/solutions-components/{p-80ea5869.js → p-26b28806.js} +1 -1
  206. package/dist/solutions-components/{p-dac10448.js → p-280fd963.js} +3 -3
  207. package/dist/solutions-components/{p-79d7f324.js → p-29049359.js} +1 -1
  208. package/dist/solutions-components/{p-c033b8ec.entry.js → p-2b378389.entry.js} +1 -1
  209. package/dist/solutions-components/{p-19ec0463.js → p-2bdd1a5d.js} +1 -1
  210. package/dist/solutions-components/{p-cacfa6ae.js → p-2ee21e9d.js} +1 -1
  211. package/dist/solutions-components/{p-300f4299.js → p-2f42ae51.js} +1 -1
  212. package/dist/solutions-components/{p-418be467.js → p-30b3261c.js} +1 -1
  213. package/dist/solutions-components/{p-4d91443a.entry.js → p-32ba2223.entry.js} +1 -1
  214. package/dist/solutions-components/{p-702c6093.js → p-34673137.js} +1 -1
  215. package/dist/solutions-components/{p-61af54b9.entry.js → p-3566ee69.entry.js} +1 -1
  216. package/dist/solutions-components/{p-90a9126f.js → p-358b9cc8.js} +1 -1
  217. package/dist/solutions-components/p-3a6c8fc3.entry.js +6 -0
  218. package/dist/solutions-components/p-3a8d82a2.js +11 -0
  219. package/dist/solutions-components/{p-628c170b.entry.js → p-3ab94526.entry.js} +1 -1
  220. package/dist/solutions-components/p-3b1fc7a2.entry.js +6 -0
  221. package/dist/solutions-components/{p-b1daad7e.js → p-3f7119c1.js} +1 -1
  222. package/dist/solutions-components/{p-f0f5ecb2.js → p-3fcd035e.js} +1 -1
  223. package/dist/solutions-components/{p-3766be72.js → p-419c9d89.js} +1 -1
  224. package/dist/solutions-components/p-453d1b31.entry.js +6 -0
  225. package/dist/solutions-components/{p-337f6adf.js → p-46918548.js} +1 -1
  226. package/dist/solutions-components/p-49e9e4e3.js +12 -0
  227. package/dist/solutions-components/p-4d942b0f.entry.js +36 -0
  228. package/dist/solutions-components/{p-85e0d2a3.js → p-4fc92419.js} +1 -1
  229. package/dist/solutions-components/{p-0d08a75d.entry.js → p-52afbe07.entry.js} +1 -1
  230. package/dist/solutions-components/{p-9391bb74.js → p-573d0763.js} +1 -1
  231. package/dist/solutions-components/{p-87971116.entry.js → p-59ef9461.entry.js} +1 -1
  232. package/dist/solutions-components/{p-25718b9f.entry.js → p-5e5749c0.entry.js} +1 -1
  233. package/dist/solutions-components/{p-54064b61.entry.js → p-5ff22d2e.entry.js} +1 -1
  234. package/dist/solutions-components/{p-4bd793ef.entry.js → p-617f32a0.entry.js} +1 -1
  235. package/dist/solutions-components/{p-747a1293.js → p-6510c06c.js} +1 -1
  236. package/dist/solutions-components/{p-1f69762c.js → p-65ba4d10.js} +1 -1
  237. package/dist/solutions-components/{p-4cb7cdb7.entry.js → p-65ffe4b0.entry.js} +1 -1
  238. package/dist/solutions-components/{p-1b4d6511.js → p-68007503.js} +1 -1
  239. package/dist/solutions-components/{p-e849d2ba.entry.js → p-6ba8483c.entry.js} +2 -2
  240. package/dist/solutions-components/{p-9961a2f9.entry.js → p-6c8c7b98.entry.js} +2 -2
  241. package/dist/solutions-components/{p-ff863f3d.entry.js → p-6e5d9ae9.entry.js} +1 -1
  242. package/dist/solutions-components/{p-b6a1c34f.entry.js → p-6ebf870c.entry.js} +1 -1
  243. package/dist/solutions-components/{p-d2d3e4b5.js → p-72f34a0a.js} +1 -1
  244. package/dist/solutions-components/{p-981fc8e4.entry.js → p-7359a6ac.entry.js} +1 -1
  245. package/dist/solutions-components/{p-9791fbf1.entry.js → p-73ab9d9a.entry.js} +1 -1
  246. package/dist/solutions-components/{p-9abb1c4c.entry.js → p-73fe6f7e.entry.js} +1 -1
  247. package/dist/solutions-components/{p-62e3adbb.js → p-7452d79a.js} +1 -1
  248. package/dist/solutions-components/{p-34169501.js → p-76c2c379.js} +1 -1
  249. package/dist/solutions-components/{p-941721ba.js → p-788aa5d7.js} +1 -1
  250. package/dist/solutions-components/{p-557d4cc5.js → p-79cc0531.js} +2 -2
  251. package/dist/solutions-components/{p-a19d8147.js → p-7a0fa011.js} +1 -1
  252. package/dist/solutions-components/{p-019fe9fe.entry.js → p-7a55cee6.entry.js} +3 -3
  253. package/dist/solutions-components/{p-48329056.entry.js → p-7bc63171.entry.js} +1 -1
  254. package/dist/solutions-components/{p-e7304151.entry.js → p-81664d83.entry.js} +1 -1
  255. package/dist/solutions-components/{p-9504c1b7.js → p-8354f486.js} +1 -1
  256. package/dist/solutions-components/{p-f812e3ee.entry.js → p-84dff306.entry.js} +1 -1
  257. package/dist/solutions-components/{p-a59dba2f.js → p-8594fe6b.js} +1 -1
  258. package/dist/solutions-components/{p-ae3ec77d.js → p-8b2d396e.js} +1 -1
  259. package/dist/solutions-components/{p-38cc8a4d.js → p-8ec6ea34.js} +1 -1
  260. package/dist/solutions-components/{p-da760d1d.entry.js → p-8ee00658.entry.js} +1 -1
  261. package/dist/solutions-components/{p-38211628.js → p-905fcf73.js} +1 -1
  262. package/dist/solutions-components/{p-e502ccce.entry.js → p-929909bc.entry.js} +1 -1
  263. package/dist/solutions-components/{p-dd5f68f2.js → p-948b5722.js} +1 -1
  264. package/dist/solutions-components/{p-39fe9a4c.js → p-956f3207.js} +1 -1
  265. package/dist/solutions-components/{p-f7aa542c.js → p-96287d23.js} +1 -1
  266. package/dist/solutions-components/{p-68630513.entry.js → p-964c0e7d.entry.js} +1 -1
  267. package/dist/solutions-components/{p-b09d8c0e.entry.js → p-98051370.entry.js} +1 -1
  268. package/dist/solutions-components/p-9a8c51bf.entry.js +6 -0
  269. package/dist/solutions-components/{p-efd70bf7.entry.js → p-9a94f48c.entry.js} +2 -2
  270. package/dist/solutions-components/{p-318790b8.js → p-9b94501c.js} +1 -1
  271. package/dist/solutions-components/{p-69e26726.js → p-9d4467a3.js} +1 -1
  272. package/dist/solutions-components/{p-f6cf9943.js → p-9e3c9cd2.js} +1 -1
  273. package/dist/solutions-components/{p-30542275.js → p-9fd59203.js} +1 -1
  274. package/dist/solutions-components/{p-d902b790.js → p-a201bffc.js} +1 -1
  275. package/dist/solutions-components/{p-1552c479.entry.js → p-a3729795.entry.js} +1 -1
  276. package/dist/solutions-components/{p-ae4ad673.entry.js → p-a47ed290.entry.js} +2 -2
  277. package/dist/solutions-components/{p-ca5be55f.entry.js → p-a5ef322f.entry.js} +2 -2
  278. package/dist/solutions-components/p-a776b7e6.entry.js +6 -0
  279. package/dist/solutions-components/{p-3658ebd8.entry.js → p-a97e8d6a.entry.js} +1 -1
  280. package/dist/solutions-components/{p-2937523d.js → p-aaea9203.js} +1 -1
  281. package/dist/solutions-components/{p-b7093e6d.entry.js → p-ad1d56b1.entry.js} +1 -1
  282. package/dist/solutions-components/{p-0ca528ec.js → p-adeb0e8f.js} +1 -1
  283. package/dist/solutions-components/{p-31d2a105.entry.js → p-af63959a.entry.js} +1 -1
  284. package/dist/solutions-components/{p-fbd71543.entry.js → p-b1125581.entry.js} +2 -2
  285. package/dist/solutions-components/{p-b029c6d8.js → p-b20a31c8.js} +1 -1
  286. package/dist/solutions-components/{p-71400268.js → p-b81131b3.js} +1 -1
  287. package/dist/solutions-components/p-b892e595.entry.js +6 -0
  288. package/dist/solutions-components/{p-cc624b0c.entry.js → p-b89c5865.entry.js} +1 -1
  289. package/dist/solutions-components/{p-245d667e.js → p-b9b52743.js} +1 -1
  290. package/dist/solutions-components/{p-0870f436.entry.js → p-ba99e562.entry.js} +1 -1
  291. package/dist/solutions-components/{p-2d614afc.js → p-bc548c06.js} +1 -1
  292. package/dist/solutions-components/{p-29b2f046.js → p-bccbdeb5.js} +1 -1
  293. package/dist/solutions-components/{p-f72e0965.entry.js → p-bd318e33.entry.js} +1 -1
  294. package/dist/solutions-components/{p-74aa84f6.js → p-bd766e49.js} +1 -1
  295. package/dist/solutions-components/{p-1a47516a.entry.js → p-be36d5ed.entry.js} +1 -1
  296. package/dist/solutions-components/{p-9b75102b.entry.js → p-c073d2d6.entry.js} +1 -1
  297. package/dist/solutions-components/{p-712ea336.entry.js → p-c644edf5.entry.js} +1 -1
  298. package/dist/solutions-components/p-c6b7e7ff.js +11 -0
  299. package/dist/solutions-components/{p-dc80cb69.entry.js → p-ca0b3a2b.entry.js} +1 -1
  300. package/dist/solutions-components/{p-3e9fc0aa.entry.js → p-cfd88a2f.entry.js} +1 -1
  301. package/dist/solutions-components/{p-e9fcf408.js → p-d5228aed.js} +1 -1
  302. package/dist/solutions-components/{p-80b87453.js → p-d98caa4c.js} +1 -1
  303. package/dist/solutions-components/{p-45b829b5.js → p-dd9c065e.js} +1 -1
  304. package/dist/solutions-components/{p-05b2bdf9.js → p-dedc167c.js} +1 -1
  305. package/dist/solutions-components/{p-a16feeec.js → p-e4f9b782.js} +1 -1
  306. package/dist/solutions-components/{p-ac1bd870.entry.js → p-e572a692.entry.js} +1 -1
  307. package/dist/solutions-components/{p-74521615.entry.js → p-e5dda947.entry.js} +1 -1
  308. package/dist/solutions-components/{p-bbfc2724.js → p-e7fbf2fe.js} +1 -1
  309. package/dist/solutions-components/{p-dda325a4.entry.js → p-e9ba0c7f.entry.js} +1 -1
  310. package/dist/solutions-components/{p-75e707d1.js → p-eb60ec2a.js} +1 -1
  311. package/dist/solutions-components/p-ecc95259.js +20 -0
  312. package/dist/solutions-components/{p-85791b16.entry.js → p-ee144348.entry.js} +1 -1
  313. package/dist/solutions-components/{p-4b4559f9.js → p-f03bed0c.js} +1 -1
  314. package/dist/solutions-components/{p-7a11983d.js → p-f5028a8e.js} +1 -1
  315. package/dist/solutions-components/{p-fb23ba4a.entry.js → p-f50cf603.entry.js} +1 -1
  316. package/dist/solutions-components/{p-f7b520ae.js → p-f7d8b6b3.js} +1 -1
  317. package/dist/solutions-components/{p-89cbb86a.js → p-f9166fcb.js} +3 -3
  318. package/dist/solutions-components/{p-792fcd62.entry.js → p-fb0f2016.entry.js} +1 -1
  319. package/dist/solutions-components/solutions-components.esm.js +1 -1
  320. package/dist/solutions-components/utils/downloadUtils.ts +257 -85
  321. package/dist/solutions-components/utils/test/downloadUtils.spec.tsx +2 -0
  322. package/dist/types/components/crowdsource-manager/crowdsource-manager.d.ts +8 -0
  323. package/dist/types/components/layer-table/layer-table.d.ts +42 -26
  324. package/dist/types/components/pdf-download/pdf-download.d.ts +4 -2
  325. package/dist/types/components.d.ts +36 -2
  326. package/dist/types/utils/downloadUtils.d.ts +34 -16
  327. package/package.json +8 -9
  328. package/dist/solutions-components/p-06712292.js +0 -11
  329. package/dist/solutions-components/p-0a0c3764.js +0 -11
  330. package/dist/solutions-components/p-12a7c2db.entry.js +0 -6
  331. package/dist/solutions-components/p-3a7cd2b0.entry.js +0 -37
  332. package/dist/solutions-components/p-8e9d9e6a.js +0 -12
  333. package/dist/solutions-components/p-97088307.entry.js +0 -6
  334. package/dist/solutions-components/p-a16e6f5f.entry.js +0 -6
  335. package/dist/solutions-components/p-d118a76e.entry.js +0 -6
  336. package/dist/solutions-components/p-d54c2dfd.entry.js +0 -6
  337. package/dist/solutions-components/p-d7d466e8.entry.js +0 -6
  338. package/dist/solutions-components/p-ffbe89cf.entry.js +0 -6
@@ -21,9 +21,20 @@ import { ILabel, exportPDF } from "./pdfUtils";
21
21
  import { loadModules } from "./loadModules";
22
22
  import { queryFeaturesByID } from "./queryUtils";
23
23
  import { IExportInfo, IExportInfos } from "../utils/interfaces";
24
+ //import * as common from "@esri/solution-common";
24
25
 
25
26
  export { ILabel } from "./pdfUtils";
26
27
 
28
+ /*
29
+ interface IArcadeExecutors {
30
+ [expressionName: string]: __esri.ArcadeExecutor;
31
+ }
32
+
33
+ interface IArcadeExecutorPromises {
34
+ [expressionName: string]: Promise<__esri.ArcadeExecutor>;
35
+ }
36
+ */
37
+
27
38
  export interface IAttributeOrigNames {
28
39
  [lowercaseName: string]: string;
29
40
  }
@@ -45,6 +56,13 @@ export interface ILabelFormat {
45
56
  format: string | __esri.ArcadeExecutor | undefined;
46
57
  }
47
58
 
59
+ export interface ILabelFormatProps {
60
+ layer: __esri.FeatureLayer;
61
+ attributeFormats: IAttributeFormats;
62
+ relationshipId: number | undefined;
63
+ labelFormat: ILabelFormat;
64
+ }
65
+
48
66
  export interface ILayerRelationshipQuery {
49
67
  layer: __esri.FeatureLayer;
50
68
  relatedQuery: IRelatedFeaturesQuery;
@@ -66,6 +84,34 @@ interface IRelatedFeaturesQuery {
66
84
 
67
85
  const lineSeparatorChar = "|";
68
86
 
87
+ import {
88
+ IFeature,
89
+ IQueryRelatedOptions,
90
+ IQueryRelatedResponse,
91
+ IRelatedRecordGroup,
92
+ queryRelated
93
+ } from "@esri/arcgis-rest-feature-layer";
94
+ /**
95
+ * Get the related records for a feature service.
96
+ *
97
+ * @param url Feature service's URL, e.g., layer.url
98
+ * @param relationshipId Id of relationship
99
+ * @param objectIds Objects in the feature service whose related records are sought
100
+ */
101
+ export function getFeatureServiceRelatedRecords(
102
+ url: string,
103
+ relationshipId?: number,
104
+ objectIds?: number[]
105
+ ): Promise<IQueryRelatedResponse> {
106
+ const options: IQueryRelatedOptions = {
107
+ url: url + `/${relationshipId}`,
108
+ relationshipId,
109
+ objectIds
110
+ }
111
+
112
+ return queryRelated(options);
113
+ }
114
+
69
115
  //#endregion
70
116
  // ------------------------------------------------------------------------------------------------------------------ //
71
117
  //#region Public functions
@@ -73,6 +119,7 @@ const lineSeparatorChar = "|";
73
119
  /**
74
120
  * Create and consolidate labels from all layers
75
121
  *
122
+ * @param webmap Webmap containing layer
76
123
  * @param exportInfos Key details about what to export (ids, layer, and selectionSetNames)
77
124
  * @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
78
125
  * all attributes are exported
@@ -80,6 +127,7 @@ const lineSeparatorChar = "|";
80
127
  * @returns selectionSetNames that will be used for export filenames
81
128
  */
82
129
  export async function consolidateLabels(
130
+ webmap: __esri.Map,
83
131
  exportInfos: IExportInfos,
84
132
  formatUsingLayerPopup = true,
85
133
  includeHeaderNames = false,
@@ -89,7 +137,9 @@ export async function consolidateLabels(
89
137
 
90
138
  Object.keys(exportInfos).forEach(k => {
91
139
  const labelInfo: IExportInfo = exportInfos[k];
92
- labelRequests.push(_prepareLabels(labelInfo.layerView?.layer || labelInfo.layer, labelInfo.ids, formatUsingLayerPopup, includeHeaderNames));
140
+ labelRequests.push(
141
+ _prepareLabels(webmap, labelInfo.layerView?.layer || labelInfo.layer, labelInfo.ids, formatUsingLayerPopup, includeHeaderNames)
142
+ );
93
143
  if (isCSVExport) {
94
144
  // add the layer id as a temp value separator that we can use to split values for CSV export
95
145
  labelRequests.push(Promise.resolve([[k]]));
@@ -103,6 +153,7 @@ export async function consolidateLabels(
103
153
  /**
104
154
  * Downloads csv of mailing labels for the provided list of ids
105
155
  *
156
+ * @param webmap Webmap containing layer
106
157
  * @param exportInfos Key details about what to export (ids, layer, and selectionSetNames)
107
158
  * @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
108
159
  * all attributes are exported
@@ -111,12 +162,13 @@ export async function consolidateLabels(
111
162
  * @returns Promise resolving when function is done
112
163
  */
113
164
  export async function downloadCSV(
165
+ webmap: __esri.Map,
114
166
  exportInfos: IExportInfos,
115
167
  formatUsingLayerPopup: boolean,
116
168
  removeDuplicates = false,
117
169
  addColumnTitle = false
118
170
  ): Promise<void> {
119
- let labels = await consolidateLabels(exportInfos, formatUsingLayerPopup, addColumnTitle, true);
171
+ let labels = await consolidateLabels(webmap, exportInfos, formatUsingLayerPopup, addColumnTitle, true);
120
172
  labels = removeDuplicates ? removeDuplicateLabels(labels) : labels;
121
173
 
122
174
  const layerIds = Object.keys(exportInfos);
@@ -142,6 +194,7 @@ export async function downloadCSV(
142
194
  /**
143
195
  * Downloads csv of mailing labels for the provided list of ids
144
196
  *
197
+ * @param webmap Webmap containing layer
145
198
  * @param exportInfos Key details about what to export (ids, layer, and selectionSetNames)
146
199
  * @param labelPageDescription Provides PDF page layout info
147
200
  * @param removeDuplicates When true a single label is generated when multiple featues have a shared address value
@@ -150,13 +203,14 @@ export async function downloadCSV(
150
203
  * @returns Promise resolving when function is done
151
204
  */
152
205
  export async function downloadPDF(
206
+ webmap: __esri.Map,
153
207
  exportInfos: IExportInfos,
154
208
  labelPageDescription: ILabel,
155
209
  removeDuplicates = false,
156
210
  title = "",
157
211
  initialImageDataUrl = ""
158
212
  ): Promise<void> {
159
- let labels = await consolidateLabels(exportInfos);
213
+ let labels = await consolidateLabels(webmap, exportInfos);
160
214
  const selectionSetNames = _getSelectionSetNames(exportInfos);
161
215
 
162
216
  labels =
@@ -322,6 +376,88 @@ export async function _convertPopupArcadeToLabelSpec(
322
376
  } as ILabelFormat);
323
377
  }
324
378
 
379
+ /**
380
+ * Extracts Arcade expressions from the lines of a label format and creates an Arcade executor for each
381
+ * referenced expression name.
382
+ *
383
+ * @param labelFormat Label to examine
384
+ * @param layer Layer from which to fetch features
385
+ * @return Promise resolving to a set of executors keyed using the expression name
386
+ */
387
+ /*
388
+ async function _createArcadeExecutors(
389
+ labelFormat: string,
390
+ layer: __esri.FeatureLayer
391
+ ): Promise<IArcadeExecutors> {
392
+ const arcadeExecutors: IArcadeExecutors = {};
393
+
394
+ // Are any Arcade expressions in the layer?
395
+ if (!Array.isArray(layer.popupTemplate.expressionInfos) || layer.popupTemplate.expressionInfos.length === 0) {
396
+ return Promise.resolve(arcadeExecutors);
397
+ }
398
+
399
+ // Are there any Arcade expressions in the label format?
400
+ const arcadeExpressionRegExp = /\{expression\/\w+\}/g;
401
+ const arcadeExpressionsMatches = labelFormat.match(arcadeExpressionRegExp);
402
+ if (!arcadeExpressionsMatches) {
403
+ return Promise.resolve(arcadeExecutors);
404
+ }
405
+
406
+ // Generate an Arcade executor for each match
407
+ const [arcade] = await loadModules(["esri/arcade"]);
408
+ const labelingProfile: __esri.Profile = {
409
+ variables: [
410
+ {
411
+ name: "$feature",
412
+ type: "feature"
413
+ },
414
+ {
415
+ name: "$layer",
416
+ type: "featureSet"
417
+ },
418
+ {
419
+ name: "$datastore",
420
+ type: "featureSetCollection"
421
+ },
422
+ {
423
+ name: "$map",
424
+ type: "featureSetCollection"
425
+ }
426
+ ]
427
+ };
428
+
429
+ const createArcadeExecutorPromises: IArcadeExecutorPromises = {};
430
+ arcadeExpressionsMatches.forEach(
431
+ (match: string) => {
432
+ const expressionName = match.substring(match.indexOf("/") + 1, match.length - 1);
433
+
434
+ (layer.popupTemplate.expressionInfos || []).forEach(
435
+ expressionInfo => {
436
+ if (expressionInfo.name === expressionName) {
437
+ createArcadeExecutorPromises[expressionName] =
438
+ arcade.createArcadeExecutor(expressionInfo.expression, labelingProfile);
439
+ }
440
+ }
441
+ );
442
+ }
443
+ );
444
+
445
+ const promises = Object.values(createArcadeExecutorPromises);
446
+ return Promise.all(promises)
447
+ .then(
448
+ executors => {
449
+ const expressionNames = Object.keys(createArcadeExecutorPromises);
450
+
451
+ for (let i = 0; i < expressionNames.length; ++i) {
452
+ arcadeExecutors[expressionNames[i]] = executors[i].valueOf() as __esri.ArcadeExecutor;
453
+ }
454
+
455
+ return arcadeExecutors;
456
+ }
457
+ );
458
+ }
459
+ */
460
+
325
461
  /**
326
462
  * Creates a title from a list of selection set names.
327
463
  *
@@ -337,44 +473,6 @@ export function _createFilename(
337
473
  return title;
338
474
  }
339
475
 
340
- /**
341
- * Creates relationship queries for each relationship flag in a popup.
342
- * @param layer Layer whose popup is to be examined
343
- * @return Hash of relationships by their id, or null if there are no relationship flags in the
344
- * popup; each relationship has the properties layer and relatedQuery for the related layer
345
- * and the query for that layer
346
- */
347
- export function _createRelationshipQueries(
348
- layer: __esri.FeatureLayer,
349
- ): ILayerRelationshipQueryHash {
350
-
351
- const relationships: ILayerRelationshipQueryHash = {};
352
- const relationshipFieldPattern = /\{relationships\/\d+\//gm;
353
- const relationshipIdPattern = /\d+/;
354
-
355
- // Test if this popup has any relationship references
356
- const matches = layer.popupTemplate.content[0].text.match(relationshipFieldPattern);
357
- if (matches) {
358
- matches.forEach(match => {
359
- // Add a query to a found relationship if we don't already have one
360
- const id = match.match(relationshipIdPattern)[0];
361
- if (!relationships.hasOwnProperty(id)) {
362
- const relatedQuery: IRelatedFeaturesQuery = {
363
- outFields: ['*'],
364
- relationshipId: id,
365
- returnGeometry: false
366
- };
367
- relationships[id] = {
368
- layer,
369
- relatedQuery
370
- } as ILayerRelationshipQuery;
371
- }
372
- });
373
- }
374
-
375
- return relationships;
376
- }
377
-
378
476
  /**
379
477
  * Extracts Arcade expression references from the lines of a label format.
380
478
  *
@@ -435,22 +533,26 @@ export function _getFieldNamesFromFieldExpressions(
435
533
  /**
436
534
  * Extracts the label format from the layer.
437
535
  *
536
+ * @param webmap Webmap containing layer
438
537
  * @param layer Layer with label format
439
538
  * @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
440
539
  * 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
540
  * @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}"
541
+ * for ILabelFormatProps type "pattern": "{name}|{street}|{city}, {state} {zip}"
445
542
  */
446
543
  export async function _getLabelFormat(
544
+ webmap: __esri.Map,
447
545
  layer: __esri.FeatureLayer,
448
- formatUsingLayerPopup: boolean,
449
- attributeFormats: IAttributeFormats
450
- ): Promise<ILabelFormat> {
451
- let labelFormat: ILabelFormat = {
452
- type: "unsupported",
453
- format: undefined
546
+ formatUsingLayerPopup: boolean
547
+ ): Promise<ILabelFormatProps> {
548
+ let labelFormatProps: ILabelFormatProps = {
549
+ layer,
550
+ attributeFormats: {},
551
+ relationshipId: undefined,
552
+ labelFormat: {
553
+ type: "unsupported",
554
+ format: undefined
555
+ }
454
556
  };
455
557
 
456
558
  if (layer.popupEnabled) {
@@ -458,37 +560,59 @@ export async function _getLabelFormat(
458
560
  // Extract any format info that we have
459
561
  fieldInfo => {
460
562
  if (fieldInfo.format) {
461
- attributeFormats[fieldInfo.fieldName.toLowerCase()] = fieldInfo.format;
563
+ labelFormatProps.attributeFormats[fieldInfo.fieldName.toLowerCase()] = fieldInfo.format;
462
564
  }
463
565
  }
464
566
  );
465
567
 
466
568
  // What is the nature of the label content?
569
+
467
570
  // 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
- }
571
+ if (formatUsingLayerPopup) {
572
+ const labelFormatType = layer.popupTemplate?.content[0]?.type;
573
+
574
+ if (labelFormatType === "relationship") {
575
+ const relationshipId = layer.popupTemplate.content[0].relationshipId;
576
+
577
+ const webmapLayers = webmap.layers.toArray().concat(webmap.tables.toArray())
578
+ .filter((entry: __esri.FeatureLayer) =>
579
+ entry.type === "feature"
580
+ && entry.id !== layer.id
581
+ && entry.relationships
582
+ && entry.relationships.some(relationship => relationship.id === relationshipId));
583
+
584
+ labelFormatProps = await _getLabelFormat(webmap, webmapLayers[0] as __esri.FeatureLayer, formatUsingLayerPopup);
585
+ labelFormatProps.relationshipId = relationshipId;
586
+
587
+ } else if (labelFormatType === "fields") {
588
+ labelFormatProps.labelFormat = _convertPopupFieldsToLabelSpec(layer.popupTemplate.fieldInfos);
589
+
590
+ // If popup is configured with "no attribute information", then no fields will visible
591
+ if ((labelFormatProps.labelFormat.format as string).length === 0) {
592
+ // Can we use the popup title?
593
+ labelFormatProps.labelFormat = layer.popupTemplate.title && typeof layer.popupTemplate.title === "string" ?
594
+ { type: "pattern", format: layer.popupTemplate.title } as ILabelFormat
595
+ :
596
+ // Otherwise revert to using attributes
597
+ _convertPopupFieldsToLabelSpec(layer.popupTemplate.fieldInfos, true);
598
+ }
599
+
600
+ // Example text: '<p>{name} {age} years &nbsp;</p><p>started: {start}</p>'
601
+ } else if (labelFormatType === "text") {
602
+ labelFormatProps.labelFormat = _convertPopupTextToLabelSpec(layer.popupTemplate.content[0].text);
480
603
 
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);
604
+ // 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}',
605
+ } else if (labelFormatType === "expression") {
606
+ labelFormatProps.labelFormat = await _convertPopupArcadeToLabelSpec(layer.popupTemplate.content[0].expressionInfo);
484
607
 
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);
608
+ // Fallback to all fields
609
+ } else {
610
+ labelFormatProps.labelFormat = _convertPopupFieldsToLabelSpec(layer.popupTemplate.fieldInfos);
611
+ }
488
612
  }
489
613
  }
490
614
 
491
- return Promise.resolve(labelFormat);
615
+ return Promise.resolve(labelFormatProps);
492
616
  }
493
617
 
494
618
  /**
@@ -573,6 +697,7 @@ export function _prepareAttributeValue(
573
697
  /**
574
698
  * Creates labels from items.
575
699
  *
700
+ * @param webmap Webmap containing layer
576
701
  * @param layer Layer from which to fetch features
577
702
  * @param ids List of ids to download
578
703
  * @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
@@ -581,19 +706,49 @@ export function _prepareAttributeValue(
581
706
  * @returns Promise resolving when function is done
582
707
  */
583
708
  export async function _prepareLabels(
709
+ webmap: __esri.Map,
584
710
  layer: __esri.FeatureLayer,
585
711
  ids: number[],
586
712
  formatUsingLayerPopup = true,
587
713
  includeHeaderNames = false
588
714
  ): Promise<string[][]> {
589
- // Get the features to export
590
- const featureSet = await queryFeaturesByID(ids, layer, [], false);
715
+ // Get the label formatting, if any
716
+ const labelFormatProps: ILabelFormatProps = await _getLabelFormat(webmap, layer, formatUsingLayerPopup);
717
+
718
+ // Because the label may actually come from a related layer, we'll use the layer that comes back from _getLabelFormat.
719
+ // That function returns the supplied layer in all cases except for a "relationship" type of popup.
720
+ const featureLayer = labelFormatProps.layer;
721
+
722
+ let featureSet: __esri.Graphic[] = [];
723
+ if (typeof(labelFormatProps.relationshipId) !== "undefined") {
724
+ // Get the related items for each id
725
+ const relatedRecResponse = await getFeatureServiceRelatedRecords(layer.url, labelFormatProps.relationshipId, ids);
726
+
727
+ const objectIdField = layer.objectIdField;
728
+ let relatedFeatureIds: number[] = [];
729
+ relatedRecResponse.relatedRecordGroups.forEach(
730
+ (relatedRecGroup: IRelatedRecordGroup) => {
731
+ relatedFeatureIds = relatedFeatureIds.concat(relatedRecGroup.relatedRecords.map((rec: IFeature) => rec.attributes[objectIdField]));
732
+ }
733
+ );
734
+
735
+ // Remove duplicates
736
+ relatedFeatureIds.sort();
737
+ relatedFeatureIds = relatedFeatureIds.filter((id, i) => i === 0 ? true : id !== relatedFeatureIds[i-1]);
738
+
739
+ // Get the full items
740
+ featureSet = await queryFeaturesByID(relatedFeatureIds, featureLayer, [], false);
741
+
742
+ } else {
743
+ // Get the features to export
744
+ featureSet = await queryFeaturesByID(ids, featureLayer, [], false);
745
+ }
591
746
 
592
747
  // Get field data types. Do we have any domain-based fields?
593
748
  const attributeOrigNames: IAttributeOrigNames = {};
594
749
  const attributeTypes: IAttributeTypes = {};
595
750
  const attributeDomains: IAttributeDomains = {};
596
- layer.fields.forEach(
751
+ featureLayer.fields.forEach(
597
752
  field => {
598
753
  const lowercaseFieldname = field.name.toLowerCase();
599
754
  attributeOrigNames[lowercaseFieldname] = field.name;
@@ -601,22 +756,21 @@ export async function _prepareLabels(
601
756
  attributeTypes[lowercaseFieldname] = field.type;
602
757
  }
603
758
  );
604
- const attributeFormats: IAttributeFormats = {};
605
-
606
- // Get the label formatting, if any
607
- const labelFormat: ILabelFormat = await _getLabelFormat(layer, formatUsingLayerPopup, attributeFormats);
608
759
 
609
760
  // Apply the label format
610
- const labels = labelFormat.type === "unsupported" ?
611
- // Export all attributes
612
- await _prepareLabelsFromAll(featureSet, attributeTypes, attributeDomains, includeHeaderNames)
613
- : labelFormat.type == "pattern" ?
761
+ const labels
762
+ = labelFormatProps.labelFormat.type === "pattern" ?
614
763
  // Export attributes in format
615
- await _prepareLabelsFromPattern(featureSet, attributeOrigNames, attributeTypes, attributeDomains,
616
- attributeFormats, labelFormat.format as string, includeHeaderNames)
617
- :
764
+ await _prepareLabelsFromPattern(/*layer,*/ featureSet, attributeOrigNames, attributeTypes, attributeDomains,
765
+ labelFormatProps.attributeFormats, labelFormatProps.labelFormat.format as string, includeHeaderNames)
766
+
767
+ : labelFormatProps.labelFormat.type === "executor" ?
618
768
  // Export attributes in expression
619
- await _prepareLabelsUsingExecutor(featureSet, labelFormat.format as __esri.ArcadeExecutor);
769
+ await _prepareLabelsUsingExecutor(featureSet, labelFormatProps.labelFormat.format as __esri.ArcadeExecutor)
770
+
771
+ :
772
+ // Export all attributes
773
+ await _prepareLabelsFromAll(featureSet, attributeTypes, attributeDomains, includeHeaderNames);
620
774
 
621
775
  return Promise.resolve(labels);
622
776
  }
@@ -678,6 +832,7 @@ export async function _prepareLabelsFromAll(
678
832
  * @returns Promise resolving with list of labels, each of which is a list of label lines
679
833
  */
680
834
  export async function _prepareLabelsFromPattern(
835
+ //layer: __esri.FeatureLayer,
681
836
  featureSet: __esri.Graphic[],
682
837
  attributeOrigNames: IAttributeOrigNames,
683
838
  attributeTypes: IAttributeTypes,
@@ -692,11 +847,28 @@ export async function _prepareLabelsFromPattern(
692
847
  const attributeExpressionMatches = _getFieldExpressionsFromLabel(labelFormat);
693
848
  const attributeNames = _getFieldNamesFromFieldExpressions(attributeExpressionMatches);
694
849
 
850
+ // Do we need any Arcade executors?
851
+ //const arcadeExecutors = await _createArcadeExecutors(labelFormat, layer);
852
+ //const arcadeExpressionRegExp = /\{expression\/\w+\}/g;
853
+
854
+ // Find the label fields that we need to replace with values
855
+ //const arcadeExpressionMatches = labelFormat.match(arcadeExpressionRegExp) ?? [];
856
+
695
857
  // Convert feature attributes into an array of labels
696
858
  const labels = await Promise.all(featureSet.map(
697
859
  async feature => {
698
860
  let labelPrep = labelFormat;
699
861
 
862
+ /*
863
+ // Replace Arcade expressions in this feature
864
+ for (let i = 0; i < arcadeExpressionMatches.length; i++) {
865
+ const match: string = arcadeExpressionMatches[i];
866
+ const expressionName = match.substring(match.indexOf("/") + 1, match.length - 1);
867
+ const value = await arcadeExecutors[expressionName].executeAsync({"$feature": feature, "$layer", layer});
868
+ labelPrep = labelPrep.replace(match, value);
869
+ }
870
+ */
871
+
700
872
  // Replace non-Arcade fields in this feature
701
873
  attributeNames.forEach(
702
874
  (attributeName: string, i: number) => {