@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) => {
@@ -555,6 +555,7 @@ describe("downloadUtils", () => {
555
555
 
556
556
  });
557
557
 
558
+ /*
558
559
  describe('_getLabelFormat', () => {
559
560
 
560
561
  it('should prepare labels from visible popup fields', async () => {
@@ -841,6 +842,7 @@ describe("downloadUtils", () => {
841
842
  });
842
843
 
843
844
  });
845
+ */
844
846
 
845
847
  describe('_getSelectionSetNames', () => {
846
848
 
@@ -23,6 +23,14 @@ export declare class CrowdsourceManager {
23
23
  * boolean: when true the grid will display like the previous manager app with the table across the top
24
24
  */
25
25
  classicGrid: boolean;
26
+ /**
27
+ * boolean: when true the layer table will auto refresh the data
28
+ */
29
+ enableAutoRefresh: boolean;
30
+ /**
31
+ * boolean: when true edits can be applied directly within the table
32
+ */
33
+ enableInlineEdit: boolean;
26
34
  /**
27
35
  * boolean: when true the table will be sorted by objectid in descending order by default
28
36
  */
@@ -19,6 +19,14 @@ import LayerTable_T9n from "../../assets/t9n/layer-table/resources.json";
19
19
  import { IMapClick, IMapInfo } from "../../utils/interfaces";
20
20
  export declare class LayerTable {
21
21
  el: HTMLCrowdsourceManagerElement;
22
+ /**
23
+ * boolean: when true the layer table will auto refresh the data
24
+ */
25
+ enableAutoRefresh: boolean;
26
+ /**
27
+ * boolean: when true edits can be applied directly within the table
28
+ */
29
+ enableInlineEdit: boolean;
22
30
  /**
23
31
  * IMapInfo: key configuration details about the current map
24
32
  */
@@ -43,6 +51,10 @@ export declare class LayerTable {
43
51
  * boolean: When true a loading indicator will be shown in place of the layer table
44
52
  */
45
53
  _fetchingData: boolean;
54
+ /**
55
+ * boolean: When true a loading indicator will be shown in the delete button
56
+ */
57
+ _isDeleting: boolean;
46
58
  /**
47
59
  * esri/views/layers/FeatureLayer: https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-FeatureLayer.html
48
60
  */
@@ -69,33 +81,9 @@ export declare class LayerTable {
69
81
  */
70
82
  protected FeatureTable: typeof import("esri/widgets/FeatureTable");
71
83
  /**
72
- * any: The function that the alerts action should execute
73
- */
74
- protected _alertActionFunction: any;
75
- /**
76
- * string: The alerts action text...will be displayed when _alertShowAction is True
77
- */
78
- protected _alertActionText: string;
79
- /**
80
- * string: main icon of the alert
81
- */
82
- protected _alertIcon: string;
83
- /**
84
- * "warning" | "danger": the kind of alert to display
85
- */
86
- protected _alertKind: "warning" | "danger";
87
- /**
88
- * boolean: When true a action link will be deisplayed
89
- */
90
- protected _alertShowAction: boolean;
91
- /**
92
- * string: main message of the alert
93
- */
94
- protected _alertMessage: string;
95
- /**
96
- * string: the alerts title
84
+ * boolean: When true the user will be asked to confirm the delete operation
97
85
  */
98
- protected _alertTitle: string;
86
+ protected _confirmDelete: boolean;
99
87
  /**
100
88
  * number[]: A list of all IDs for the current layer
101
89
  */
@@ -104,6 +92,10 @@ export declare class LayerTable {
104
92
  * boolean: When false alerts will be shown to indicate that the layer must have editing enabled for edit actions
105
93
  */
106
94
  protected _editEnabled: boolean;
95
+ /**
96
+ * boolean: When false alerts will be shown to indicate that the layer must have delete and editing enabled
97
+ */
98
+ protected _deleteEnabled: boolean;
107
99
  /**
108
100
  * esri/core/reactiveUtils: https://developers.arcgis.com/javascript/latest/api-reference/esri-core-reactiveUtils.html
109
101
  */
@@ -201,12 +193,36 @@ export declare class LayerTable {
201
193
  * @returns void
202
194
  */
203
195
  protected _resetTable(): Promise<void>;
196
+ /**
197
+ * Verify edit capabilities of the layer
198
+ *
199
+ * @returns void
200
+ */
201
+ protected _checkEditEnabled(): void;
204
202
  /**
205
203
  * Sort the objectid field in descending order
206
204
  *
207
205
  * @returns void
208
206
  */
209
207
  protected _sortTable(): Promise<void>;
208
+ /**
209
+ * Show warning when editing is disabled
210
+ *
211
+ * @returns node with warning message
212
+ */
213
+ protected _getEditDisabledWarning(): VNode;
214
+ /**
215
+ * Show delete confirmation message
216
+ *
217
+ * @returns node to confirm or deny the delete operation
218
+ */
219
+ protected _deleteMessage(): VNode;
220
+ /**
221
+ * Delete the currently selected features
222
+ *
223
+ * @returns void
224
+ */
225
+ protected _deleteFeatures(): Promise<void>;
210
226
  /**
211
227
  * Handle map click events to keep table and map click selection in sync
212
228
  *
@@ -44,22 +44,24 @@ export declare class PdfDownload {
44
44
  /**
45
45
  * Downloads csv of mailing labels for the provided list of ids
46
46
  *
47
+ * @param webmap Webmap containing layer
47
48
  * @param exportInfos Information about items to be exported
48
49
  * @param removeDuplicates When true a single label is generated when multiple featues have a shared address value
49
50
  * @param addColumnTitle Indicates if column headings should be included in output
50
51
  * @returns Promise resolving when function is done
51
52
  */
52
- downloadCSV(exportInfos: IExportInfos, removeDuplicates: boolean, addColumnTitle?: boolean): Promise<void>;
53
+ downloadCSV(webmap: __esri.Map, exportInfos: IExportInfos, removeDuplicates: boolean, addColumnTitle?: boolean): Promise<void>;
53
54
  /**
54
55
  * Downloads pdf of mailing labels for the provided list of ids
55
56
  *
57
+ * @param webmap Webmap containing layer
56
58
  * @param exportInfos Information about items to be exported
57
59
  * @param removeDuplicates When true a single label is generated when multiple featues have a shared address value
58
60
  * @param title Title for each page
59
61
  * @param initialImageDataUrl Data URL of image for first page
60
62
  * @returns Promise resolving when function is done
61
63
  */
62
- downloadPDF(exportInfos: IExportInfos, removeDuplicates?: boolean, title?: string, initialImageDataUrl?: string): Promise<void>;
64
+ downloadPDF(webmap: __esri.Map, exportInfos: IExportInfos, removeDuplicates?: boolean, title?: string, initialImageDataUrl?: string): Promise<void>;
63
65
  /**
64
66
  * StencilJS: Called once just after the component is first connected to the DOM.
65
67
  */