@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.
- package/dist/assets/t9n/layer-table/resources.json +4 -3
- package/dist/assets/t9n/layer-table/resources_en.json +4 -3
- package/dist/cjs/calcite-shell-panel_14.cjs.entry.js +2 -1
- package/dist/cjs/card-manager_3.cjs.entry.js +60 -28
- package/dist/cjs/clean-url-d5326abb.js +573 -0
- package/dist/cjs/crowdsource-manager.cjs.entry.js +5 -3
- package/dist/cjs/{downloadUtils-43f5be48.js → downloadUtils-fb4744e0.js} +296 -51
- package/dist/cjs/edit-card_2.cjs.entry.js +3 -3
- package/dist/cjs/{index.es-8da43c21.js → index.es-372e33de.js} +2 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/map-select-tools_3.cjs.entry.js +8 -5
- package/dist/cjs/public-notification.cjs.entry.js +5 -4
- package/dist/cjs/solution-configuration.cjs.entry.js +44 -43
- package/dist/cjs/solution-contents_3.cjs.entry.js +2 -1
- package/dist/cjs/{solution-store-3cd104d8.js → solution-store-c443e657.js} +7 -572
- package/dist/cjs/solutions-components.cjs.js +1 -1
- package/dist/collection/components/card-manager/card-manager.css +0 -5
- package/dist/collection/components/card-manager/card-manager.js +1 -1
- package/dist/collection/components/crowdsource-manager/crowdsource-manager.css +2 -2
- package/dist/collection/components/crowdsource-manager/crowdsource-manager.js +40 -2
- package/dist/collection/components/edit-card/edit-card.css +8 -0
- package/dist/collection/components/info-card/info-card.css +14 -14
- package/dist/collection/components/info-card/info-card.js +1 -1
- package/dist/collection/components/layer-table/layer-table.css +12 -0
- package/dist/collection/components/layer-table/layer-table.js +90 -24
- package/dist/collection/components/pdf-download/pdf-download.js +34 -6
- package/dist/collection/components/public-notification/public-notification.js +3 -3
- package/dist/collection/utils/downloadUtils.js +208 -82
- package/dist/collection/utils/downloadUtils.ts +257 -85
- package/dist/collection/utils/test/downloadUtils.spec.js +163 -134
- package/dist/collection/utils/test/downloadUtils.spec.tsx +2 -0
- package/dist/components/calcite-modal.js +1 -409
- package/dist/components/card-manager2.js +2 -2
- package/dist/components/clean-url.js +567 -0
- package/dist/components/crowdsource-manager.js +16 -12
- package/dist/components/downloadUtils.js +295 -50
- package/dist/components/edit-card2.js +1 -1
- package/dist/components/info-card2.js +2 -2
- package/dist/components/layer-table2.js +65 -31
- package/dist/components/modal.js +416 -0
- package/dist/components/pdf-download2.js +6 -4
- package/dist/components/public-notification.js +3 -3
- package/dist/components/solution-configuration.js +25 -24
- package/dist/components/solution-store.js +2 -562
- package/dist/esm/{ExpandToggle-86761b28.js → ExpandToggle-e614e3e4.js} +1 -1
- package/dist/esm/{ar-4a5375c6.js → ar-2f678abc.js} +8 -8
- package/dist/esm/{bg-b25e4b7a.js → bg-e514c4d7.js} +8 -8
- package/dist/esm/{bs-2485dfed.js → bs-81584b09.js} +8 -8
- package/dist/esm/buffer-tools_4.entry.js +4 -4
- package/dist/esm/{ca-bba36d26.js → ca-e8c40e21.js} +8 -8
- package/dist/esm/calcite-accordion-item.entry.js +1 -1
- package/dist/esm/calcite-action-bar_3.entry.js +5 -5
- package/dist/esm/calcite-action-group_2.entry.js +3 -3
- package/dist/esm/calcite-action-pad.entry.js +4 -4
- package/dist/esm/calcite-action_2.entry.js +5 -5
- package/dist/esm/calcite-alert.entry.js +3 -3
- package/dist/esm/calcite-avatar.entry.js +1 -1
- package/dist/esm/calcite-block-section.entry.js +3 -3
- package/dist/esm/calcite-block.entry.js +3 -3
- package/dist/esm/calcite-button.entry.js +5 -5
- package/dist/esm/calcite-card.entry.js +3 -3
- package/dist/esm/calcite-checkbox.entry.js +3 -3
- package/dist/esm/calcite-chip-group.entry.js +1 -1
- package/dist/esm/calcite-chip.entry.js +3 -3
- package/dist/esm/calcite-color-picker-hex-input_2.entry.js +1 -1
- package/dist/esm/calcite-color-picker.entry.js +3 -3
- package/dist/esm/calcite-combobox-item-group.entry.js +2 -2
- package/dist/esm/calcite-combobox_6.entry.js +7 -7
- package/dist/esm/calcite-date-picker-day_3.entry.js +3 -3
- package/dist/esm/calcite-date-picker.entry.js +5 -5
- package/dist/esm/calcite-fab.entry.js +1 -1
- package/dist/esm/calcite-filter_3.entry.js +3 -3
- package/dist/esm/calcite-flow-item.entry.js +3 -3
- package/dist/esm/calcite-icon.entry.js +1 -1
- package/dist/esm/calcite-inline-editable.entry.js +4 -4
- package/dist/esm/calcite-input-date-picker.entry.js +9 -9
- package/dist/esm/calcite-input-number_2.entry.js +5 -5
- package/dist/esm/{calcite-input-time-picker-7da2e80a.js → calcite-input-time-picker-fe6e499a.js} +55 -55
- package/dist/esm/calcite-input-time-picker.entry.js +8 -8
- package/dist/esm/calcite-input-time-zone.entry.js +5 -5
- package/dist/esm/calcite-input_2.entry.js +5 -5
- package/dist/esm/calcite-label.entry.js +2 -2
- package/dist/esm/calcite-link.entry.js +1 -1
- package/dist/esm/calcite-menu-item.entry.js +3 -3
- package/dist/esm/calcite-menu.entry.js +3 -3
- package/dist/esm/calcite-modal.entry.js +4 -4
- package/dist/esm/calcite-navigation.entry.js +1 -1
- package/dist/esm/calcite-notice.entry.js +3 -3
- package/dist/esm/calcite-option_2.entry.js +3 -3
- package/dist/esm/calcite-pagination.entry.js +3 -3
- package/dist/esm/calcite-panel_2.entry.js +3 -3
- package/dist/esm/calcite-pick-list-group.entry.js +1 -1
- package/dist/esm/calcite-pick-list-item.entry.js +3 -3
- package/dist/esm/calcite-pick-list.entry.js +2 -2
- package/dist/esm/calcite-radio-button.entry.js +3 -3
- package/dist/esm/calcite-rating.entry.js +5 -5
- package/dist/esm/calcite-scrim.entry.js +3 -3
- package/dist/esm/calcite-segmented-control_2.entry.js +3 -3
- package/dist/esm/calcite-shell-center-row.entry.js +1 -1
- package/dist/esm/calcite-shell-panel_14.entry.js +7 -6
- package/dist/esm/calcite-sortable-list.entry.js +2 -2
- package/dist/esm/calcite-stepper-item.entry.js +2 -2
- package/dist/esm/calcite-stepper.entry.js +1 -1
- package/dist/esm/calcite-switch.entry.js +3 -3
- package/dist/esm/calcite-text-area.entry.js +5 -5
- package/dist/esm/calcite-tile.entry.js +1 -1
- package/dist/esm/calcite-time-picker.entry.js +4 -4
- package/dist/esm/calcite-tip-manager.entry.js +3 -3
- package/dist/esm/calcite-tip.entry.js +3 -3
- package/dist/esm/calcite-tooltip.entry.js +2 -2
- package/dist/esm/calcite-tree_3.entry.js +1 -1
- package/dist/esm/card-manager_3.entry.js +60 -28
- package/dist/esm/clean-url-bce022e6.js +567 -0
- package/dist/esm/crowdsource-manager.entry.js +5 -3
- package/dist/esm/{cs-1052c5ac.js → cs-af5f115e.js} +8 -8
- package/dist/esm/{da-b7ed9204.js → da-06d9e22c.js} +8 -8
- package/dist/esm/{date-bd5b879c.js → date-641ae749.js} +1 -1
- package/dist/esm/{de-at-a993e5ae.js → de-at-f55a700a.js} +8 -8
- package/dist/esm/{de-ch-acff745d.js → de-ch-7307675f.js} +8 -8
- package/dist/esm/{de-bb68e752.js → de-dc98363f.js} +8 -8
- package/dist/esm/{dom-37f2dec9.js → dom-2b326ec3.js} +1 -1
- package/dist/esm/{downloadUtils-42156cd8.js → downloadUtils-67c7a6c8.js} +296 -51
- package/dist/esm/edit-card_2.entry.js +3 -3
- package/dist/esm/{el-9de96ff0.js → el-91c64808.js} +8 -8
- package/dist/esm/{en-au-f68b6bde.js → en-au-df08cc25.js} +8 -8
- package/dist/esm/{en-ca-5360517e.js → en-ca-175f7c0f.js} +8 -8
- package/dist/esm/{en-gb-de0b3125.js → en-gb-90a08c7f.js} +8 -8
- package/dist/esm/{es-5ecbba77.js → es-5cb54b05.js} +8 -8
- package/dist/esm/{es-mx-aa126462.js → es-mx-3a0cb804.js} +8 -8
- package/dist/esm/{et-7113eeb8.js → et-eceac6dc.js} +8 -8
- package/dist/esm/{fi-ffa60f15.js → fi-26e1c14f.js} +8 -8
- package/dist/esm/{floating-ui-7cde67cf.js → floating-ui-9f8e4ed4.js} +1 -1
- package/dist/esm/{focusTrapComponent-ec344399.js → focusTrapComponent-ad2c3a31.js} +1 -1
- package/dist/esm/{form-24e6ef1d.js → form-0871d2c6.js} +1 -1
- package/dist/esm/{fr-681c5bf6.js → fr-12a5b0f7.js} +8 -8
- package/dist/esm/{fr-ch-9af1f8b1.js → fr-ch-e3406887.js} +8 -8
- package/dist/esm/{he-5188f277.js → he-61eba811.js} +8 -8
- package/dist/esm/{hi-6a31e3a4.js → hi-a50282b5.js} +8 -8
- package/dist/esm/{hr-0598e59d.js → hr-da8bffaf.js} +8 -8
- package/dist/esm/{hu-13cb9f41.js → hu-dab932f1.js} +8 -8
- package/dist/esm/{id-7f342499.js → id-de468947.js} +8 -8
- package/dist/esm/{index.es-f47c4153.js → index.es-59a67d3d.js} +2 -1
- package/dist/esm/{it-57d790f2.js → it-375d9936.js} +8 -8
- package/dist/esm/{it-ch-081af760.js → it-ch-7e663d63.js} +8 -8
- package/dist/esm/{ja-3affb68e.js → ja-36dbe39d.js} +8 -8
- package/dist/esm/{ko-736632aa.js → ko-858bc871.js} +8 -8
- package/dist/esm/{label-b6dfb4d5.js → label-b8caf984.js} +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{locale-146251f7.js → locale-00000ab4.js} +1 -1
- package/dist/esm/{lt-e7d9b1c3.js → lt-d6dfa7e4.js} +8 -8
- package/dist/esm/{lv-4d1a507e.js → lv-facd25c5.js} +8 -8
- package/dist/esm/map-select-tools_3.entry.js +8 -5
- package/dist/esm/{mk-f960312d.js → mk-5ed05b6a.js} +8 -8
- package/dist/esm/{nb-4556b5e9.js → nb-936fc687.js} +8 -8
- package/dist/esm/{nl-8e281c01.js → nl-a923d626.js} +8 -8
- package/dist/esm/{pl-1460fd5a.js → pl-b1426275.js} +8 -8
- package/dist/esm/{pt-660332b6.js → pt-1ac2453f.js} +8 -8
- package/dist/esm/{pt-br-dba48f49.js → pt-br-7194cc5f.js} +8 -8
- package/dist/esm/public-notification.entry.js +5 -4
- package/dist/esm/{ro-ac18f292.js → ro-518aaed1.js} +8 -8
- package/dist/esm/{ru-b914f6b7.js → ru-762127a3.js} +8 -8
- package/dist/esm/{shared-list-render-cc889757.js → shared-list-render-ec232615.js} +1 -1
- package/dist/esm/{sk-1be12963.js → sk-f367b7ba.js} +8 -8
- package/dist/esm/{sl-5d47e4e4.js → sl-052fd4d2.js} +8 -8
- package/dist/esm/solution-configuration.entry.js +25 -24
- package/dist/esm/solution-contents_3.entry.js +2 -1
- package/dist/esm/{solution-store-cf902566.js → solution-store-b29d50f7.js} +2 -562
- package/dist/esm/solutions-components.js +1 -1
- package/dist/esm/{sortableComponent-8a84709a.js → sortableComponent-ebd6bb72.js} +1 -1
- package/dist/esm/{sr-3281c92d.js → sr-4dc0fdb9.js} +8 -8
- package/dist/esm/{sv-e5169404.js → sv-bdc87a4d.js} +8 -8
- package/dist/esm/{t9n-d9c203e4.js → t9n-9791aa0c.js} +1 -1
- package/dist/esm/{th-937796b8.js → th-d9df674c.js} +8 -8
- package/dist/esm/{time-fa1151aa.js → time-73378c4a.js} +1 -1
- package/dist/esm/{tr-6d3b100b.js → tr-61e134eb.js} +8 -8
- package/dist/esm/{uk-a6edcacf.js → uk-ea3d8da7.js} +8 -8
- package/dist/esm/{utils-667cc396.js → utils-593fafd7.js} +1 -1
- package/dist/esm/{utils-24a35b5a.js → utils-bd52db7d.js} +2 -2
- package/dist/esm/{vi-bf4c179c.js → vi-ade1c25b.js} +8 -8
- package/dist/esm/{zh-cn-de1858cb.js → zh-cn-b8756118.js} +8 -8
- package/dist/esm/{zh-hk-12fa404f.js → zh-hk-d18c05d9.js} +8 -8
- package/dist/esm/{zh-tw-5c4220e5.js → zh-tw-9c98ff7c.js} +8 -8
- package/dist/solutions-components/{p-3b891cc4.entry.js → p-01fea8d5.entry.js} +1 -1
- package/dist/solutions-components/{p-d793ec96.entry.js → p-0219a1a9.entry.js} +5 -5
- package/dist/solutions-components/{p-65022e7f.entry.js → p-02ff64f4.entry.js} +1 -1
- package/dist/solutions-components/p-062254a6.entry.js +6 -0
- package/dist/solutions-components/{p-bff158ff.js → p-062d2f9a.js} +1 -1
- package/dist/solutions-components/{p-f4e5b7e5.entry.js → p-084bced1.entry.js} +1 -1
- package/dist/solutions-components/{p-c261335b.entry.js → p-088e4cfc.entry.js} +1 -1
- package/dist/solutions-components/{p-96239d0d.js → p-08e35485.js} +1 -1
- package/dist/solutions-components/{p-3d3772fb.js → p-0d14d33a.js} +1 -1
- package/dist/solutions-components/{p-7f271c31.js → p-11550b3c.js} +3 -3
- package/dist/solutions-components/{p-ad19f9b0.entry.js → p-120c4098.entry.js} +1 -1
- package/dist/solutions-components/{p-45419d93.entry.js → p-12bcd474.entry.js} +1 -1
- package/dist/solutions-components/{p-bd82849c.entry.js → p-1597ec4b.entry.js} +1 -1
- package/dist/solutions-components/{p-afb35c95.js → p-17d176b5.js} +14 -43
- package/dist/solutions-components/{p-0503c78d.js → p-1b41181b.js} +44 -29
- package/dist/solutions-components/{p-127c3866.js → p-1c5787b1.js} +1 -1
- package/dist/solutions-components/{p-b97886b3.entry.js → p-1d9a5198.entry.js} +1 -1
- package/dist/solutions-components/{p-8e3e1ce8.entry.js → p-1dd5c4e6.entry.js} +1 -1
- package/dist/solutions-components/{p-97b69f54.entry.js → p-1e62d118.entry.js} +1 -1
- package/dist/solutions-components/{p-537c34a4.entry.js → p-1fae3819.entry.js} +1 -1
- package/dist/solutions-components/{p-82f0b25b.js → p-21aa112d.js} +1 -1
- package/dist/solutions-components/{p-f8944f59.entry.js → p-252a9a7f.entry.js} +1 -1
- package/dist/solutions-components/{p-80ea5869.js → p-26b28806.js} +1 -1
- package/dist/solutions-components/{p-dac10448.js → p-280fd963.js} +3 -3
- package/dist/solutions-components/{p-79d7f324.js → p-29049359.js} +1 -1
- package/dist/solutions-components/{p-c033b8ec.entry.js → p-2b378389.entry.js} +1 -1
- package/dist/solutions-components/{p-19ec0463.js → p-2bdd1a5d.js} +1 -1
- package/dist/solutions-components/{p-cacfa6ae.js → p-2ee21e9d.js} +1 -1
- package/dist/solutions-components/{p-300f4299.js → p-2f42ae51.js} +1 -1
- package/dist/solutions-components/{p-418be467.js → p-30b3261c.js} +1 -1
- package/dist/solutions-components/{p-4d91443a.entry.js → p-32ba2223.entry.js} +1 -1
- package/dist/solutions-components/{p-702c6093.js → p-34673137.js} +1 -1
- package/dist/solutions-components/{p-61af54b9.entry.js → p-3566ee69.entry.js} +1 -1
- package/dist/solutions-components/{p-90a9126f.js → p-358b9cc8.js} +1 -1
- package/dist/solutions-components/p-3a6c8fc3.entry.js +6 -0
- package/dist/solutions-components/p-3a8d82a2.js +11 -0
- package/dist/solutions-components/{p-628c170b.entry.js → p-3ab94526.entry.js} +1 -1
- package/dist/solutions-components/p-3b1fc7a2.entry.js +6 -0
- package/dist/solutions-components/{p-b1daad7e.js → p-3f7119c1.js} +1 -1
- package/dist/solutions-components/{p-f0f5ecb2.js → p-3fcd035e.js} +1 -1
- package/dist/solutions-components/{p-3766be72.js → p-419c9d89.js} +1 -1
- package/dist/solutions-components/p-453d1b31.entry.js +6 -0
- package/dist/solutions-components/{p-337f6adf.js → p-46918548.js} +1 -1
- package/dist/solutions-components/p-49e9e4e3.js +12 -0
- package/dist/solutions-components/p-4d942b0f.entry.js +36 -0
- package/dist/solutions-components/{p-85e0d2a3.js → p-4fc92419.js} +1 -1
- package/dist/solutions-components/{p-0d08a75d.entry.js → p-52afbe07.entry.js} +1 -1
- package/dist/solutions-components/{p-9391bb74.js → p-573d0763.js} +1 -1
- package/dist/solutions-components/{p-87971116.entry.js → p-59ef9461.entry.js} +1 -1
- package/dist/solutions-components/{p-25718b9f.entry.js → p-5e5749c0.entry.js} +1 -1
- package/dist/solutions-components/{p-54064b61.entry.js → p-5ff22d2e.entry.js} +1 -1
- package/dist/solutions-components/{p-4bd793ef.entry.js → p-617f32a0.entry.js} +1 -1
- package/dist/solutions-components/{p-747a1293.js → p-6510c06c.js} +1 -1
- package/dist/solutions-components/{p-1f69762c.js → p-65ba4d10.js} +1 -1
- package/dist/solutions-components/{p-4cb7cdb7.entry.js → p-65ffe4b0.entry.js} +1 -1
- package/dist/solutions-components/{p-1b4d6511.js → p-68007503.js} +1 -1
- package/dist/solutions-components/{p-e849d2ba.entry.js → p-6ba8483c.entry.js} +2 -2
- package/dist/solutions-components/{p-9961a2f9.entry.js → p-6c8c7b98.entry.js} +2 -2
- package/dist/solutions-components/{p-ff863f3d.entry.js → p-6e5d9ae9.entry.js} +1 -1
- package/dist/solutions-components/{p-b6a1c34f.entry.js → p-6ebf870c.entry.js} +1 -1
- package/dist/solutions-components/{p-d2d3e4b5.js → p-72f34a0a.js} +1 -1
- package/dist/solutions-components/{p-981fc8e4.entry.js → p-7359a6ac.entry.js} +1 -1
- package/dist/solutions-components/{p-9791fbf1.entry.js → p-73ab9d9a.entry.js} +1 -1
- package/dist/solutions-components/{p-9abb1c4c.entry.js → p-73fe6f7e.entry.js} +1 -1
- package/dist/solutions-components/{p-62e3adbb.js → p-7452d79a.js} +1 -1
- package/dist/solutions-components/{p-34169501.js → p-76c2c379.js} +1 -1
- package/dist/solutions-components/{p-941721ba.js → p-788aa5d7.js} +1 -1
- package/dist/solutions-components/{p-557d4cc5.js → p-79cc0531.js} +2 -2
- package/dist/solutions-components/{p-a19d8147.js → p-7a0fa011.js} +1 -1
- package/dist/solutions-components/{p-019fe9fe.entry.js → p-7a55cee6.entry.js} +3 -3
- package/dist/solutions-components/{p-48329056.entry.js → p-7bc63171.entry.js} +1 -1
- package/dist/solutions-components/{p-e7304151.entry.js → p-81664d83.entry.js} +1 -1
- package/dist/solutions-components/{p-9504c1b7.js → p-8354f486.js} +1 -1
- package/dist/solutions-components/{p-f812e3ee.entry.js → p-84dff306.entry.js} +1 -1
- package/dist/solutions-components/{p-a59dba2f.js → p-8594fe6b.js} +1 -1
- package/dist/solutions-components/{p-ae3ec77d.js → p-8b2d396e.js} +1 -1
- package/dist/solutions-components/{p-38cc8a4d.js → p-8ec6ea34.js} +1 -1
- package/dist/solutions-components/{p-da760d1d.entry.js → p-8ee00658.entry.js} +1 -1
- package/dist/solutions-components/{p-38211628.js → p-905fcf73.js} +1 -1
- package/dist/solutions-components/{p-e502ccce.entry.js → p-929909bc.entry.js} +1 -1
- package/dist/solutions-components/{p-dd5f68f2.js → p-948b5722.js} +1 -1
- package/dist/solutions-components/{p-39fe9a4c.js → p-956f3207.js} +1 -1
- package/dist/solutions-components/{p-f7aa542c.js → p-96287d23.js} +1 -1
- package/dist/solutions-components/{p-68630513.entry.js → p-964c0e7d.entry.js} +1 -1
- package/dist/solutions-components/{p-b09d8c0e.entry.js → p-98051370.entry.js} +1 -1
- package/dist/solutions-components/p-9a8c51bf.entry.js +6 -0
- package/dist/solutions-components/{p-efd70bf7.entry.js → p-9a94f48c.entry.js} +2 -2
- package/dist/solutions-components/{p-318790b8.js → p-9b94501c.js} +1 -1
- package/dist/solutions-components/{p-69e26726.js → p-9d4467a3.js} +1 -1
- package/dist/solutions-components/{p-f6cf9943.js → p-9e3c9cd2.js} +1 -1
- package/dist/solutions-components/{p-30542275.js → p-9fd59203.js} +1 -1
- package/dist/solutions-components/{p-d902b790.js → p-a201bffc.js} +1 -1
- package/dist/solutions-components/{p-1552c479.entry.js → p-a3729795.entry.js} +1 -1
- package/dist/solutions-components/{p-ae4ad673.entry.js → p-a47ed290.entry.js} +2 -2
- package/dist/solutions-components/{p-ca5be55f.entry.js → p-a5ef322f.entry.js} +2 -2
- package/dist/solutions-components/p-a776b7e6.entry.js +6 -0
- package/dist/solutions-components/{p-3658ebd8.entry.js → p-a97e8d6a.entry.js} +1 -1
- package/dist/solutions-components/{p-2937523d.js → p-aaea9203.js} +1 -1
- package/dist/solutions-components/{p-b7093e6d.entry.js → p-ad1d56b1.entry.js} +1 -1
- package/dist/solutions-components/{p-0ca528ec.js → p-adeb0e8f.js} +1 -1
- package/dist/solutions-components/{p-31d2a105.entry.js → p-af63959a.entry.js} +1 -1
- package/dist/solutions-components/{p-fbd71543.entry.js → p-b1125581.entry.js} +2 -2
- package/dist/solutions-components/{p-b029c6d8.js → p-b20a31c8.js} +1 -1
- package/dist/solutions-components/{p-71400268.js → p-b81131b3.js} +1 -1
- package/dist/solutions-components/p-b892e595.entry.js +6 -0
- package/dist/solutions-components/{p-cc624b0c.entry.js → p-b89c5865.entry.js} +1 -1
- package/dist/solutions-components/{p-245d667e.js → p-b9b52743.js} +1 -1
- package/dist/solutions-components/{p-0870f436.entry.js → p-ba99e562.entry.js} +1 -1
- package/dist/solutions-components/{p-2d614afc.js → p-bc548c06.js} +1 -1
- package/dist/solutions-components/{p-29b2f046.js → p-bccbdeb5.js} +1 -1
- package/dist/solutions-components/{p-f72e0965.entry.js → p-bd318e33.entry.js} +1 -1
- package/dist/solutions-components/{p-74aa84f6.js → p-bd766e49.js} +1 -1
- package/dist/solutions-components/{p-1a47516a.entry.js → p-be36d5ed.entry.js} +1 -1
- package/dist/solutions-components/{p-9b75102b.entry.js → p-c073d2d6.entry.js} +1 -1
- package/dist/solutions-components/{p-712ea336.entry.js → p-c644edf5.entry.js} +1 -1
- package/dist/solutions-components/p-c6b7e7ff.js +11 -0
- package/dist/solutions-components/{p-dc80cb69.entry.js → p-ca0b3a2b.entry.js} +1 -1
- package/dist/solutions-components/{p-3e9fc0aa.entry.js → p-cfd88a2f.entry.js} +1 -1
- package/dist/solutions-components/{p-e9fcf408.js → p-d5228aed.js} +1 -1
- package/dist/solutions-components/{p-80b87453.js → p-d98caa4c.js} +1 -1
- package/dist/solutions-components/{p-45b829b5.js → p-dd9c065e.js} +1 -1
- package/dist/solutions-components/{p-05b2bdf9.js → p-dedc167c.js} +1 -1
- package/dist/solutions-components/{p-a16feeec.js → p-e4f9b782.js} +1 -1
- package/dist/solutions-components/{p-ac1bd870.entry.js → p-e572a692.entry.js} +1 -1
- package/dist/solutions-components/{p-74521615.entry.js → p-e5dda947.entry.js} +1 -1
- package/dist/solutions-components/{p-bbfc2724.js → p-e7fbf2fe.js} +1 -1
- package/dist/solutions-components/{p-dda325a4.entry.js → p-e9ba0c7f.entry.js} +1 -1
- package/dist/solutions-components/{p-75e707d1.js → p-eb60ec2a.js} +1 -1
- package/dist/solutions-components/p-ecc95259.js +20 -0
- package/dist/solutions-components/{p-85791b16.entry.js → p-ee144348.entry.js} +1 -1
- package/dist/solutions-components/{p-4b4559f9.js → p-f03bed0c.js} +1 -1
- package/dist/solutions-components/{p-7a11983d.js → p-f5028a8e.js} +1 -1
- package/dist/solutions-components/{p-fb23ba4a.entry.js → p-f50cf603.entry.js} +1 -1
- package/dist/solutions-components/{p-f7b520ae.js → p-f7d8b6b3.js} +1 -1
- package/dist/solutions-components/{p-89cbb86a.js → p-f9166fcb.js} +3 -3
- package/dist/solutions-components/{p-792fcd62.entry.js → p-fb0f2016.entry.js} +1 -1
- package/dist/solutions-components/solutions-components.esm.js +1 -1
- package/dist/solutions-components/utils/downloadUtils.ts +257 -85
- package/dist/solutions-components/utils/test/downloadUtils.spec.tsx +2 -0
- package/dist/types/components/crowdsource-manager/crowdsource-manager.d.ts +8 -0
- package/dist/types/components/layer-table/layer-table.d.ts +42 -26
- package/dist/types/components/pdf-download/pdf-download.d.ts +4 -2
- package/dist/types/components.d.ts +36 -2
- package/dist/types/utils/downloadUtils.d.ts +34 -16
- package/package.json +8 -9
- package/dist/solutions-components/p-06712292.js +0 -11
- package/dist/solutions-components/p-0a0c3764.js +0 -11
- package/dist/solutions-components/p-12a7c2db.entry.js +0 -6
- package/dist/solutions-components/p-3a7cd2b0.entry.js +0 -37
- package/dist/solutions-components/p-8e9d9e6a.js +0 -12
- package/dist/solutions-components/p-97088307.entry.js +0 -6
- package/dist/solutions-components/p-a16e6f5f.entry.js +0 -6
- package/dist/solutions-components/p-d118a76e.entry.js +0 -6
- package/dist/solutions-components/p-d54c2dfd.entry.js +0 -6
- package/dist/solutions-components/p-d7d466e8.entry.js +0 -6
- 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(
|
|
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
|
|
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
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
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
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
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 </p><p>started: {start}</p>'
|
|
601
|
+
} else if (labelFormatType === "text") {
|
|
602
|
+
labelFormatProps.labelFormat = _convertPopupTextToLabelSpec(layer.popupTemplate.content[0].text);
|
|
480
603
|
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
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
|
-
|
|
486
|
-
|
|
487
|
-
|
|
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(
|
|
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
|
|
590
|
-
const
|
|
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
|
-
|
|
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
|
|
611
|
-
|
|
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) => {
|