@esri/solutions-components 0.8.2 → 0.8.4

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 (117) hide show
  1. package/dist/cjs/calcite-action-pad_2.cjs.entry.js +1 -1
  2. package/dist/cjs/calcite-input-date-picker_3.cjs.entry.js +16 -10
  3. package/dist/cjs/card-manager_3.cjs.entry.js +1 -1
  4. package/dist/cjs/{downloadUtils-c2bd7c80.js → downloadUtils-8b05d7cc.js} +39 -8
  5. package/dist/cjs/{helpers-81779c18.js → helpers-b014d9a9.js} +1 -1
  6. package/dist/cjs/{index.es-22b3d1a2.js → index.es-e7587227.js} +1 -1
  7. package/dist/cjs/instant-apps-ckeditor-wrapper_3.cjs.entry.js +4 -4
  8. package/dist/cjs/instant-apps-control-panel.cjs.entry.js +1 -1
  9. package/dist/cjs/instant-apps-export.cjs.entry.js +16 -10
  10. package/dist/cjs/instant-apps-header.cjs.entry.js +1 -1
  11. package/dist/cjs/instant-apps-interactive-legend-classic.cjs.entry.js +2 -2
  12. package/dist/cjs/instant-apps-interactive-legend-count_2.cjs.entry.js +2 -2
  13. package/dist/cjs/instant-apps-interactive-legend-group-legend-element-caption.cjs.entry.js +2 -2
  14. package/dist/cjs/instant-apps-interactive-legend-group-legend-element_5.cjs.entry.js +2 -2
  15. package/dist/cjs/instant-apps-interactive-legend.cjs.entry.js +4 -4
  16. package/dist/cjs/instant-apps-keyboard-shortcuts.cjs.entry.js +3 -3
  17. package/dist/cjs/instant-apps-landing-page.cjs.entry.js +1 -1
  18. package/dist/cjs/instant-apps-language-switcher.cjs.entry.js +5 -5
  19. package/dist/cjs/instant-apps-language-translator.cjs.entry.js +5 -5
  20. package/dist/cjs/instant-apps-measurement.cjs.entry.js +4 -4
  21. package/dist/cjs/instant-apps-popover.cjs.entry.js +3 -3
  22. package/dist/cjs/instant-apps-scoreboard.cjs.entry.js +3 -3
  23. package/dist/cjs/instant-apps-splash.cjs.entry.js +14 -5
  24. package/dist/cjs/{languageSwitcher-4822684b.js → languageSwitcher-3870c772.js} +1 -1
  25. package/dist/cjs/{languageUtil-9bd00bad.js → languageUtil-0df39c0c.js} +1 -1
  26. package/dist/cjs/{loadModules-69fc5b98.js → loadModules-01306709.js} +1 -1
  27. package/dist/cjs/loader.cjs.js +1 -1
  28. package/dist/cjs/{locale-3e33f44c.js → locale-4cef466e.js} +2 -2
  29. package/dist/cjs/map-select-tools_3.cjs.entry.js +1 -1
  30. package/dist/cjs/public-notification.cjs.entry.js +1 -1
  31. package/dist/cjs/solutions-components.cjs.js +1 -1
  32. package/dist/cjs/{utils-ea7a5a63.js → utils-ac836e7a.js} +1 -1
  33. package/dist/collection/utils/downloadUtils.js +38 -7
  34. package/dist/collection/utils/downloadUtils.ts +46 -7
  35. package/dist/collection/utils/test/downloadUtils.spec.js +33 -1
  36. package/dist/collection/utils/test/downloadUtils.spec.tsx +40 -1
  37. package/dist/components/downloadUtils.js +38 -7
  38. package/dist/components/instant-apps-export.js +13 -7
  39. package/dist/components/instant-apps-landing-page.js +1 -1
  40. package/dist/components/instant-apps-measurement.js +1 -1
  41. package/dist/components/instant-apps-social-share2.js +13 -7
  42. package/dist/components/instant-apps-splash.js +16 -2
  43. package/dist/components/languageUtil.js +1 -1
  44. package/dist/components/loadModules2.js +1 -1
  45. package/dist/esm/calcite-action-pad_2.entry.js +1 -1
  46. package/dist/esm/calcite-input-date-picker_3.entry.js +16 -10
  47. package/dist/esm/card-manager_3.entry.js +1 -1
  48. package/dist/esm/{downloadUtils-a6c0e25f.js → downloadUtils-0c13073b.js} +39 -8
  49. package/dist/esm/{helpers-aeddac74.js → helpers-f9256189.js} +1 -1
  50. package/dist/esm/{index.es-b0a676ae.js → index.es-ad250bc6.js} +1 -1
  51. package/dist/esm/instant-apps-ckeditor-wrapper_3.entry.js +4 -4
  52. package/dist/esm/instant-apps-control-panel.entry.js +1 -1
  53. package/dist/esm/instant-apps-export.entry.js +16 -10
  54. package/dist/esm/instant-apps-header.entry.js +1 -1
  55. package/dist/esm/instant-apps-interactive-legend-classic.entry.js +2 -2
  56. package/dist/esm/instant-apps-interactive-legend-count_2.entry.js +2 -2
  57. package/dist/esm/instant-apps-interactive-legend-group-legend-element-caption.entry.js +2 -2
  58. package/dist/esm/instant-apps-interactive-legend-group-legend-element_5.entry.js +2 -2
  59. package/dist/esm/instant-apps-interactive-legend.entry.js +4 -4
  60. package/dist/esm/instant-apps-keyboard-shortcuts.entry.js +3 -3
  61. package/dist/esm/instant-apps-landing-page.entry.js +1 -1
  62. package/dist/esm/instant-apps-language-switcher.entry.js +5 -5
  63. package/dist/esm/instant-apps-language-translator.entry.js +5 -5
  64. package/dist/esm/instant-apps-measurement.entry.js +4 -4
  65. package/dist/esm/instant-apps-popover.entry.js +3 -3
  66. package/dist/esm/instant-apps-scoreboard.entry.js +3 -3
  67. package/dist/esm/instant-apps-splash.entry.js +14 -5
  68. package/dist/esm/{languageSwitcher-4faa659f.js → languageSwitcher-068998b1.js} +1 -1
  69. package/dist/esm/{languageUtil-dc3111c1.js → languageUtil-035e7728.js} +1 -1
  70. package/dist/esm/{loadModules-877bbb89.js → loadModules-7a5f1022.js} +1 -1
  71. package/dist/esm/loader.js +1 -1
  72. package/dist/esm/{locale-bd9034e1.js → locale-4cab280d.js} +2 -2
  73. package/dist/esm/map-select-tools_3.entry.js +1 -1
  74. package/dist/esm/public-notification.entry.js +1 -1
  75. package/dist/esm/solutions-components.js +1 -1
  76. package/dist/esm/{utils-28d0a086.js → utils-78fe6e5b.js} +1 -1
  77. package/dist/node_modules/@esri/instant-apps-components/dist/collection/components/instant-apps-header/instant-apps-header.css +1 -1
  78. package/dist/node_modules/@esri/instant-apps-components/dist/collection/components/instant-apps-scoreboard/instant-apps-scoreboard.css +1 -1
  79. package/dist/node_modules/@esri/instant-apps-components/dist/collection/components/instant-apps-social-share/instant-apps-social-share.css +8 -1
  80. package/dist/solutions-components/{p-a455c3f0.entry.js → p-00524417.entry.js} +1 -1
  81. package/dist/solutions-components/{p-8e9f96db.js → p-12a7d0d1.js} +1 -1
  82. package/dist/solutions-components/{p-a7b7f8d1.js → p-15a0e7fb.js} +1 -1
  83. package/dist/solutions-components/{p-b41e2c4c.js → p-1d3a1794.js} +11 -11
  84. package/dist/solutions-components/p-2d72eac3.entry.js +6 -0
  85. package/dist/solutions-components/{p-a2544cba.entry.js → p-30edeb79.entry.js} +1 -1
  86. package/dist/solutions-components/{p-220c46c2.entry.js → p-3a6a1ce9.entry.js} +1 -1
  87. package/dist/solutions-components/{p-a59078ee.entry.js → p-3b9e4882.entry.js} +1 -1
  88. package/dist/solutions-components/{p-8ad937b4.entry.js → p-465aa7d9.entry.js} +1 -1
  89. package/dist/solutions-components/p-4dcc150d.entry.js +6 -0
  90. package/dist/solutions-components/{p-1bca71bf.entry.js → p-4efd2af6.entry.js} +1 -1
  91. package/dist/solutions-components/{p-5a28d60c.entry.js → p-5320dc25.entry.js} +1 -1
  92. package/dist/solutions-components/{p-734d1dc5.js → p-590a2a26.js} +1 -1
  93. package/dist/solutions-components/{p-0d72a9ca.entry.js → p-5f6e7429.entry.js} +1 -1
  94. package/dist/solutions-components/{p-015a45e2.entry.js → p-65ad1625.entry.js} +1 -1
  95. package/dist/solutions-components/{p-2e7a9b9b.entry.js → p-88932d2f.entry.js} +2 -2
  96. package/dist/solutions-components/{p-104f07e3.entry.js → p-954dc86f.entry.js} +1 -1
  97. package/dist/solutions-components/{p-52b37bad.entry.js → p-989bf0bf.entry.js} +1 -1
  98. package/dist/solutions-components/{p-0f427774.entry.js → p-a0611720.entry.js} +1 -1
  99. package/dist/solutions-components/{p-c302bbea.entry.js → p-a3132356.entry.js} +1 -1
  100. package/dist/solutions-components/{p-c10b44ee.entry.js → p-a886ab7f.entry.js} +1 -1
  101. package/dist/solutions-components/{p-03037cf9.js → p-ad98c346.js} +1 -1
  102. package/dist/solutions-components/{p-03a65871.entry.js → p-bf6b4eb7.entry.js} +1 -1
  103. package/dist/solutions-components/{p-09801ba6.entry.js → p-c4ff3b52.entry.js} +3 -3
  104. package/dist/solutions-components/p-d599cfa8.entry.js +6 -0
  105. package/dist/solutions-components/{p-cfe890f6.entry.js → p-f313b45b.entry.js} +1 -1
  106. package/dist/solutions-components/{p-aec4441b.entry.js → p-fc1367d9.entry.js} +1 -1
  107. package/dist/solutions-components/{p-07626c45.js → p-fc2fb61b.js} +1 -1
  108. package/dist/solutions-components/solutions-components.esm.js +1 -1
  109. package/dist/solutions-components/utils/downloadUtils.ts +46 -7
  110. package/dist/solutions-components/utils/test/downloadUtils.spec.tsx +40 -1
  111. package/dist/types/utils/downloadUtils.d.ts +18 -4
  112. package/package.json +6 -6
  113. package/dist/solutions-components/p-7d6ee026.entry.js +0 -6
  114. package/dist/solutions-components/p-b80bc5b9.entry.js +0 -6
  115. package/dist/solutions-components/p-dd45738e.entry.js +0 -6
  116. /package/dist/solutions-components/{p-70359c2b.js → p-89218b6e.js} +0 -0
  117. /package/dist/solutions-components/{p-090e0241.js → p-e85ba21c.js} +0 -0
@@ -5,7 +5,7 @@
5
5
  */
6
6
  'use strict';
7
7
 
8
- const locale = require('./locale-3e33f44c.js');
8
+ const locale = require('./locale-4cef466e.js');
9
9
  const index = require('./index-ae65e42f.js');
10
10
 
11
11
  exports.EInputType = void 0;
@@ -37,7 +37,11 @@ import { queryRelated } from "@esri/arcgis-rest-feature-layer";
37
37
  * @param exportInfos Key details about what to export (ids, layer, and selectionSetNames)
38
38
  * @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
39
39
  * all attributes are exported
40
- * @param includeHeaderNames Add the label format at the front of the list of generated labels
40
+ * @param includeHeaderNames Add a heading entries at the beginning of the list of generated labels
41
+ * @param isCSVExport Indicates if the export is for a CSV file
42
+ * @param fields Fields to include in the export
43
+ * @param useFieldAliasNames Indicates if field alias names should be used in the export
44
+ * @param filterFields Indicates if fields should be filtered
41
45
  * @returns selectionSetNames that will be used for export filenames
42
46
  */
43
47
  export async function consolidateLabels(webmap, exportInfos, formatUsingLayerPopup = true, includeHeaderNames = false, isCSVExport = false, fields = undefined, useFieldAliasNames = false, filterFields = false) {
@@ -63,6 +67,9 @@ export async function consolidateLabels(webmap, exportInfos, formatUsingLayerPop
63
67
  * all attributes are exported
64
68
  * @param removeDuplicates When true a single label is generated when multiple featues have a shared address value
65
69
  * @param addColumnTitle Indicates if column headings should be included in output
70
+ * @param fields Fields to include in the export
71
+ * @param useFieldAliasNames Indicates if field alias names should be used in the export
72
+ * @param filterFields Indicates if fields should be filtered
66
73
  * @returns Promise resolving when function is done
67
74
  */
68
75
  export async function downloadCSV(webmap, exportInfos, formatUsingLayerPopup, removeDuplicates = false, addColumnTitle = false, fields = undefined, useFieldAliasNames = false, filterFields = false) {
@@ -304,6 +311,30 @@ export function _createFilename(selectionSetNames) {
304
311
  const title = selectionSetNames.length > 0 ? selectionSetNames.join(", ") : "download";
305
312
  return title;
306
313
  }
314
+ /**
315
+ * Creates headings from a label format.
316
+ *
317
+ * @param labelFormat Format for label
318
+ * @returns A list of headings, with one heading for each line in the label format
319
+ */
320
+ export function _extractHeaderNames(labelFormat) {
321
+ // Split the format into lines
322
+ const lines = labelFormat.split(lineSeparatorChar);
323
+ // Generate a header for each line
324
+ const headerNames = lines.map((line, i) => {
325
+ // Find the field names in the line
326
+ const fieldNameSyms = line.match(/\{[^\}]*\}/g);
327
+ // Extract the field names from the symbols; if there are no symbols, use a default name; if a field name
328
+ // is an Arcade expression, extract the expression name
329
+ return fieldNameSyms
330
+ ? fieldNameSyms
331
+ .map(fieldName => fieldName.substring(1, fieldName.length - 1))
332
+ .map(fieldName => fieldName.startsWith("expression/") ? fieldName.substring(fieldName.indexOf("/") + 1) : fieldName)
333
+ .join("__")
334
+ : `column_${i + 1}`;
335
+ });
336
+ return headerNames;
337
+ }
307
338
  /**
308
339
  * Extracts Arcade expression references from the lines of a label format.
309
340
  *
@@ -437,7 +468,7 @@ export async function _getLabelFormat(webmap, layer, formatUsingLayerPopup) {
437
468
  webmapLayers = webmapLayers.filter((webmapLayer) => webmapLayer.type === "feature" && webmapLayer.layerId === layerRelationship.relatedTableId);
438
469
  if (webmapLayers.length > 0) {
439
470
  labelFormatProps = await _getLabelFormat(webmap, webmapLayers[0], formatUsingLayerPopup);
440
- labelFormatProps.relationshipId = relationshipId;
471
+ labelFormatProps.relationshipId = relationshipId.toString();
441
472
  }
442
473
  else {
443
474
  // Related layer info is not in webmap; get the label info from the related layer
@@ -475,7 +506,7 @@ export async function _getLabelFormat(webmap, layer, formatUsingLayerPopup) {
475
506
  }
476
507
  else {
477
508
  labelFormatProps = await labelFormatPropsPromise;
478
- labelFormatProps.relationshipId = relationshipId;
509
+ labelFormatProps.relationshipId = relationshipId.toString();
479
510
  }
480
511
  }
481
512
  }
@@ -602,7 +633,7 @@ export function _prepareAttributeValue(attributeValue, attributeType, attributeD
602
633
  * @param ids List of ids to download
603
634
  * @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
604
635
  * all attributes are exported
605
- * @param includeHeaderNames Add the label format at the front of the list of generated labels
636
+ * @param includeHeaderNames Add a heading entries at the beginning of the list of generated labels
606
637
  * @returns Promise resolving when function is done
607
638
  */
608
639
  export async function _prepareLabels(webmap, layer, ids, formatUsingLayerPopup = true, includeHeaderNames = false, fields = undefined, useFieldAliasNames = false, filterFields = false) {
@@ -707,7 +738,7 @@ export async function _prepareLabels(webmap, layer, ids, formatUsingLayerPopup =
707
738
  * @param featureSet Features to convert to labels
708
739
  * @param attributeTypes Type for each attribute in a feature
709
740
  * @param attributeDomains Domains for each attribute in a feature
710
- * @param includeHeaderNames Add the label format at the front of the list of generated labels
741
+ * @param includeHeaderNames Add a heading entries at the beginning of the list of generated labels
711
742
  * @returns Promise resolving with list of labels, each of which is a list of label lines
712
743
  */
713
744
  export async function _prepareLabelsFromAll(featureSet, attributeTypes, attributeDomains, includeHeaderNames = false, useFieldAliasNames = false) {
@@ -744,7 +775,7 @@ export async function _prepareLabelsFromAll(featureSet, attributeTypes, attribut
744
775
  * @param attributeDomains Domains for each attribute in a feature
745
776
  * @param attributeFormats Formats for each attribute in a feature
746
777
  * @param labelFormat Format for label
747
- * @param includeHeaderNames Add the label format at the front of the list of generated labels
778
+ * @param includeHeaderNames Add a heading entries at the beginning of the list of generated labels
748
779
  * @returns Promise resolving with list of labels, each of which is a list of label lines
749
780
  */
750
781
  export async function _prepareLabelsFromPattern(layer, featureSet, attributeOrigNames, attributeTypes, attributeDomains, attributeFormats, labelFormat, includeHeaderNames = false) {
@@ -784,7 +815,7 @@ export async function _prepareLabelsFromPattern(layer, featureSet, attributeOrig
784
815
  }));
785
816
  // Add header names
786
817
  if (includeHeaderNames) {
787
- labels.unshift(attributeNames);
818
+ labels.unshift(_extractHeaderNames(labelFormat));
788
819
  }
789
820
  return Promise.resolve(labels);
790
821
  }
@@ -117,7 +117,11 @@ import {
117
117
  * @param exportInfos Key details about what to export (ids, layer, and selectionSetNames)
118
118
  * @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
119
119
  * all attributes are exported
120
- * @param includeHeaderNames Add the label format at the front of the list of generated labels
120
+ * @param includeHeaderNames Add a heading entries at the beginning of the list of generated labels
121
+ * @param isCSVExport Indicates if the export is for a CSV file
122
+ * @param fields Fields to include in the export
123
+ * @param useFieldAliasNames Indicates if field alias names should be used in the export
124
+ * @param filterFields Indicates if fields should be filtered
121
125
  * @returns selectionSetNames that will be used for export filenames
122
126
  */
123
127
  export async function consolidateLabels(
@@ -156,6 +160,9 @@ export async function consolidateLabels(
156
160
  * all attributes are exported
157
161
  * @param removeDuplicates When true a single label is generated when multiple featues have a shared address value
158
162
  * @param addColumnTitle Indicates if column headings should be included in output
163
+ * @param fields Fields to include in the export
164
+ * @param useFieldAliasNames Indicates if field alias names should be used in the export
165
+ * @param filterFields Indicates if fields should be filtered
159
166
  * @returns Promise resolving when function is done
160
167
  */
161
168
  export async function downloadCSV(
@@ -472,6 +479,38 @@ export function _createFilename(
472
479
  return title;
473
480
  }
474
481
 
482
+ /**
483
+ * Creates headings from a label format.
484
+ *
485
+ * @param labelFormat Format for label
486
+ * @returns A list of headings, with one heading for each line in the label format
487
+ */
488
+ export function _extractHeaderNames(
489
+ labelFormat: string
490
+ ): string[] {
491
+ // Split the format into lines
492
+ const lines = labelFormat.split(lineSeparatorChar);
493
+
494
+ // Generate a header for each line
495
+ const headerNames = lines.map(
496
+ (line, i) => {
497
+ // Find the field names in the line
498
+ const fieldNameSyms = line.match(/\{[^\}]*\}/g);
499
+
500
+ // Extract the field names from the symbols; if there are no symbols, use a default name; if a field name
501
+ // is an Arcade expression, extract the expression name
502
+ return fieldNameSyms
503
+ ? fieldNameSyms
504
+ .map(fieldName => fieldName.substring(1, fieldName.length - 1))
505
+ .map(fieldName => fieldName.startsWith("expression/") ? fieldName.substring(fieldName.indexOf("/") + 1) : fieldName)
506
+ .join("__")
507
+ : `column_${i + 1}`;
508
+ }
509
+ );
510
+
511
+ return headerNames;
512
+ }
513
+
475
514
  /**
476
515
  * Extracts Arcade expression references from the lines of a label format.
477
516
  *
@@ -647,7 +686,7 @@ export async function _getLabelFormat(
647
686
 
648
687
  if (webmapLayers.length > 0) {
649
688
  labelFormatProps = await _getLabelFormat(webmap, webmapLayers[0], formatUsingLayerPopup);
650
- labelFormatProps.relationshipId = relationshipId;
689
+ labelFormatProps.relationshipId = relationshipId.toString();
651
690
 
652
691
  } else {
653
692
  // Related layer info is not in webmap; get the label info from the related layer
@@ -694,7 +733,7 @@ export async function _getLabelFormat(
694
733
  labelFormatProps.labelFormat = _convertPopupFieldsToLabelSpec(layer.popupTemplate.fieldInfos);
695
734
  } else {
696
735
  labelFormatProps = await labelFormatPropsPromise;
697
- labelFormatProps.relationshipId = relationshipId;
736
+ labelFormatProps.relationshipId = relationshipId.toString();
698
737
  }
699
738
  }
700
739
 
@@ -836,7 +875,7 @@ export function _prepareAttributeValue(
836
875
  * @param ids List of ids to download
837
876
  * @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
838
877
  * all attributes are exported
839
- * @param includeHeaderNames Add the label format at the front of the list of generated labels
878
+ * @param includeHeaderNames Add a heading entries at the beginning of the list of generated labels
840
879
  * @returns Promise resolving when function is done
841
880
  */
842
881
  export async function _prepareLabels(
@@ -973,7 +1012,7 @@ export async function _prepareLabels(
973
1012
  * @param featureSet Features to convert to labels
974
1013
  * @param attributeTypes Type for each attribute in a feature
975
1014
  * @param attributeDomains Domains for each attribute in a feature
976
- * @param includeHeaderNames Add the label format at the front of the list of generated labels
1015
+ * @param includeHeaderNames Add a heading entries at the beginning of the list of generated labels
977
1016
  * @returns Promise resolving with list of labels, each of which is a list of label lines
978
1017
  */
979
1018
  export async function _prepareLabelsFromAll(
@@ -1025,7 +1064,7 @@ export async function _prepareLabelsFromAll(
1025
1064
  * @param attributeDomains Domains for each attribute in a feature
1026
1065
  * @param attributeFormats Formats for each attribute in a feature
1027
1066
  * @param labelFormat Format for label
1028
- * @param includeHeaderNames Add the label format at the front of the list of generated labels
1067
+ * @param includeHeaderNames Add a heading entries at the beginning of the list of generated labels
1029
1068
  * @returns Promise resolving with list of labels, each of which is a list of label lines
1030
1069
  */
1031
1070
  export async function _prepareLabelsFromPattern(
@@ -1089,7 +1128,7 @@ export async function _prepareLabelsFromPattern(
1089
1128
 
1090
1129
  // Add header names
1091
1130
  if (includeHeaderNames) {
1092
- labels.unshift(attributeNames);
1131
+ labels.unshift(_extractHeaderNames(labelFormat));
1093
1132
  }
1094
1133
 
1095
1134
  return Promise.resolve(labels);
@@ -189,9 +189,41 @@ describe("downloadUtils", () => {
189
189
  expect(title).toEqual(expectedTitle);
190
190
  });
191
191
  });
192
+ describe("_extractHeaderNames", () => {
193
+ it("handles a single-line label", () => {
194
+ const labelSpec = "{PSTLCITY}, {PSTLSTATE} {PSTLZIP5}";
195
+ const headerNames = downloadUtils._extractHeaderNames(labelSpec);
196
+ const expectedHeaderNames = ["PSTLCITY__PSTLSTATE__PSTLZIP5"];
197
+ expect(headerNames).toEqual(expectedHeaderNames);
198
+ });
199
+ it("handles a multi-line label", () => {
200
+ const labelSpec = "{OWNERNM1}|{PSTLADDRESS}|{PSTLCITY}, {PSTLSTATE} {PSTLZIP5}";
201
+ const headerNames = downloadUtils._extractHeaderNames(labelSpec);
202
+ const expectedHeaderNames = ["OWNERNM1", "PSTLADDRESS", "PSTLCITY__PSTLSTATE__PSTLZIP5"];
203
+ expect(headerNames).toEqual(expectedHeaderNames);
204
+ });
205
+ it("handles a multi-line label with a line without attributes", () => {
206
+ const labelSpec = "{OWNERNM1}|Line without attributes|{PSTLCITY}, {PSTLSTATE} {PSTLZIP5}";
207
+ const headerNames = downloadUtils._extractHeaderNames(labelSpec);
208
+ const expectedHeaderNames = ["OWNERNM1", "column_2", "PSTLCITY__PSTLSTATE__PSTLZIP5"];
209
+ expect(headerNames).toEqual(expectedHeaderNames);
210
+ });
211
+ it("handles a label with an Arcade expression", () => {
212
+ const labelSpec = "{expression/expr0}|{OWNERNM1}|{PSTLADDRESS}|{PSTLCITY}, {PSTLSTATE} {PSTLZIP5}";
213
+ const headerNames = downloadUtils._extractHeaderNames(labelSpec);
214
+ const expectedHeaderNames = ["expr0", "OWNERNM1", "PSTLADDRESS", "PSTLCITY__PSTLSTATE__PSTLZIP5"];
215
+ expect(headerNames).toEqual(expectedHeaderNames);
216
+ });
217
+ it("handles a label with multiple Arcade expressions", () => {
218
+ const labelSpec = "{expression/expr3}: {expression/expr1}|{OWNERNM1}|{expression/expr0}|{PSTLCITY}, {PSTLSTATE} {PSTLZIP5}";
219
+ const headerNames = downloadUtils._extractHeaderNames(labelSpec);
220
+ const expectedHeaderNames = ["expr3__expr1", "OWNERNM1", "expr0", "PSTLCITY__PSTLSTATE__PSTLZIP5"];
221
+ expect(headerNames).toEqual(expectedHeaderNames);
222
+ });
223
+ });
192
224
  describe("_getExpressionsFromLabel", () => {
193
225
  it("handles a label with ASCII expression names", () => {
194
- const labelSpec = "{expression/expr0}\n{OWNERNM1}\n{PSTLADDRESS}\n{PSTLCITY}, {PSTLSTATE} {PSTLZIP5}";
226
+ const labelSpec = "{expression/expr0}|{OWNERNM1}|{PSTLADDRESS}|{PSTLCITY}, {PSTLSTATE} {PSTLZIP5}";
195
227
  const expectedExpressions = ["{expression/expr0}"];
196
228
  const expressions = downloadUtils._getExpressionsFromLabel(labelSpec);
197
229
  expect(expressions).toEqual(expectedExpressions);
@@ -251,10 +251,49 @@ describe("downloadUtils", () => {
251
251
 
252
252
  });
253
253
 
254
+ describe("_extractHeaderNames", () => {
255
+
256
+ it("handles a single-line label", () => {
257
+ const labelSpec = "{PSTLCITY}, {PSTLSTATE} {PSTLZIP5}";
258
+ const headerNames = downloadUtils._extractHeaderNames(labelSpec);
259
+ const expectedHeaderNames = ["PSTLCITY__PSTLSTATE__PSTLZIP5"];
260
+ expect(headerNames).toEqual(expectedHeaderNames);
261
+ });
262
+
263
+ it("handles a multi-line label", () => {
264
+ const labelSpec = "{OWNERNM1}|{PSTLADDRESS}|{PSTLCITY}, {PSTLSTATE} {PSTLZIP5}";
265
+ const headerNames = downloadUtils._extractHeaderNames(labelSpec);
266
+ const expectedHeaderNames = ["OWNERNM1", "PSTLADDRESS", "PSTLCITY__PSTLSTATE__PSTLZIP5"];
267
+ expect(headerNames).toEqual(expectedHeaderNames);
268
+ });
269
+
270
+ it("handles a multi-line label with a line without attributes", () => {
271
+ const labelSpec = "{OWNERNM1}|Line without attributes|{PSTLCITY}, {PSTLSTATE} {PSTLZIP5}";
272
+ const headerNames = downloadUtils._extractHeaderNames(labelSpec);
273
+ const expectedHeaderNames = ["OWNERNM1", "column_2", "PSTLCITY__PSTLSTATE__PSTLZIP5"];
274
+ expect(headerNames).toEqual(expectedHeaderNames);
275
+ });
276
+
277
+ it("handles a label with an Arcade expression", () => {
278
+ const labelSpec = "{expression/expr0}|{OWNERNM1}|{PSTLADDRESS}|{PSTLCITY}, {PSTLSTATE} {PSTLZIP5}";
279
+ const headerNames = downloadUtils._extractHeaderNames(labelSpec);
280
+ const expectedHeaderNames = ["expr0", "OWNERNM1", "PSTLADDRESS", "PSTLCITY__PSTLSTATE__PSTLZIP5"];
281
+ expect(headerNames).toEqual(expectedHeaderNames);
282
+ });
283
+
284
+ it("handles a label with multiple Arcade expressions", () => {
285
+ const labelSpec = "{expression/expr3}: {expression/expr1}|{OWNERNM1}|{expression/expr0}|{PSTLCITY}, {PSTLSTATE} {PSTLZIP5}";
286
+ const headerNames = downloadUtils._extractHeaderNames(labelSpec);
287
+ const expectedHeaderNames = ["expr3__expr1", "OWNERNM1", "expr0", "PSTLCITY__PSTLSTATE__PSTLZIP5"];
288
+ expect(headerNames).toEqual(expectedHeaderNames);
289
+ });
290
+
291
+ });
292
+
254
293
  describe("_getExpressionsFromLabel", () => {
255
294
 
256
295
  it("handles a label with ASCII expression names", () => {
257
- const labelSpec = "{expression/expr0}\n{OWNERNM1}\n{PSTLADDRESS}\n{PSTLCITY}, {PSTLSTATE} {PSTLZIP5}";
296
+ const labelSpec = "{expression/expr0}|{OWNERNM1}|{PSTLADDRESS}|{PSTLCITY}, {PSTLSTATE} {PSTLZIP5}";
258
297
  const expectedExpressions = ["{expression/expr0}"];
259
298
  const expressions = downloadUtils._getExpressionsFromLabel(labelSpec);
260
299
  expect(expressions).toEqual(expectedExpressions);
@@ -2359,7 +2359,11 @@ const lineSeparatorChar = "|";
2359
2359
  * @param exportInfos Key details about what to export (ids, layer, and selectionSetNames)
2360
2360
  * @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
2361
2361
  * all attributes are exported
2362
- * @param includeHeaderNames Add the label format at the front of the list of generated labels
2362
+ * @param includeHeaderNames Add a heading entries at the beginning of the list of generated labels
2363
+ * @param isCSVExport Indicates if the export is for a CSV file
2364
+ * @param fields Fields to include in the export
2365
+ * @param useFieldAliasNames Indicates if field alias names should be used in the export
2366
+ * @param filterFields Indicates if fields should be filtered
2363
2367
  * @returns selectionSetNames that will be used for export filenames
2364
2368
  */
2365
2369
  async function consolidateLabels(webmap, exportInfos, formatUsingLayerPopup = true, includeHeaderNames = false, isCSVExport = false, fields = undefined, useFieldAliasNames = false, filterFields = false) {
@@ -2385,6 +2389,9 @@ async function consolidateLabels(webmap, exportInfos, formatUsingLayerPopup = tr
2385
2389
  * all attributes are exported
2386
2390
  * @param removeDuplicates When true a single label is generated when multiple featues have a shared address value
2387
2391
  * @param addColumnTitle Indicates if column headings should be included in output
2392
+ * @param fields Fields to include in the export
2393
+ * @param useFieldAliasNames Indicates if field alias names should be used in the export
2394
+ * @param filterFields Indicates if fields should be filtered
2388
2395
  * @returns Promise resolving when function is done
2389
2396
  */
2390
2397
  async function downloadCSV(webmap, exportInfos, formatUsingLayerPopup, removeDuplicates = false, addColumnTitle = false, fields = undefined, useFieldAliasNames = false, filterFields = false) {
@@ -2623,6 +2630,30 @@ function _createFilename(selectionSetNames) {
2623
2630
  const title = selectionSetNames.length > 0 ? selectionSetNames.join(", ") : "download";
2624
2631
  return title;
2625
2632
  }
2633
+ /**
2634
+ * Creates headings from a label format.
2635
+ *
2636
+ * @param labelFormat Format for label
2637
+ * @returns A list of headings, with one heading for each line in the label format
2638
+ */
2639
+ function _extractHeaderNames(labelFormat) {
2640
+ // Split the format into lines
2641
+ const lines = labelFormat.split(lineSeparatorChar);
2642
+ // Generate a header for each line
2643
+ const headerNames = lines.map((line, i) => {
2644
+ // Find the field names in the line
2645
+ const fieldNameSyms = line.match(/\{[^\}]*\}/g);
2646
+ // Extract the field names from the symbols; if there are no symbols, use a default name; if a field name
2647
+ // is an Arcade expression, extract the expression name
2648
+ return fieldNameSyms
2649
+ ? fieldNameSyms
2650
+ .map(fieldName => fieldName.substring(1, fieldName.length - 1))
2651
+ .map(fieldName => fieldName.startsWith("expression/") ? fieldName.substring(fieldName.indexOf("/") + 1) : fieldName)
2652
+ .join("__")
2653
+ : `column_${i + 1}`;
2654
+ });
2655
+ return headerNames;
2656
+ }
2626
2657
  /**
2627
2658
  * Extracts Arcade expression references from the lines of a label format.
2628
2659
  *
@@ -2756,7 +2787,7 @@ async function _getLabelFormat(webmap, layer, formatUsingLayerPopup) {
2756
2787
  webmapLayers = webmapLayers.filter((webmapLayer) => webmapLayer.type === "feature" && webmapLayer.layerId === layerRelationship.relatedTableId);
2757
2788
  if (webmapLayers.length > 0) {
2758
2789
  labelFormatProps = await _getLabelFormat(webmap, webmapLayers[0], formatUsingLayerPopup);
2759
- labelFormatProps.relationshipId = relationshipId;
2790
+ labelFormatProps.relationshipId = relationshipId.toString();
2760
2791
  }
2761
2792
  else {
2762
2793
  // Related layer info is not in webmap; get the label info from the related layer
@@ -2794,7 +2825,7 @@ async function _getLabelFormat(webmap, layer, formatUsingLayerPopup) {
2794
2825
  }
2795
2826
  else {
2796
2827
  labelFormatProps = await labelFormatPropsPromise;
2797
- labelFormatProps.relationshipId = relationshipId;
2828
+ labelFormatProps.relationshipId = relationshipId.toString();
2798
2829
  }
2799
2830
  }
2800
2831
  }
@@ -2921,7 +2952,7 @@ function _prepareAttributeValue(attributeValue, attributeType, attributeDomain,
2921
2952
  * @param ids List of ids to download
2922
2953
  * @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
2923
2954
  * all attributes are exported
2924
- * @param includeHeaderNames Add the label format at the front of the list of generated labels
2955
+ * @param includeHeaderNames Add a heading entries at the beginning of the list of generated labels
2925
2956
  * @returns Promise resolving when function is done
2926
2957
  */
2927
2958
  async function _prepareLabels(webmap, layer, ids, formatUsingLayerPopup = true, includeHeaderNames = false, fields = undefined, useFieldAliasNames = false, filterFields = false) {
@@ -3026,7 +3057,7 @@ async function _prepareLabels(webmap, layer, ids, formatUsingLayerPopup = true,
3026
3057
  * @param featureSet Features to convert to labels
3027
3058
  * @param attributeTypes Type for each attribute in a feature
3028
3059
  * @param attributeDomains Domains for each attribute in a feature
3029
- * @param includeHeaderNames Add the label format at the front of the list of generated labels
3060
+ * @param includeHeaderNames Add a heading entries at the beginning of the list of generated labels
3030
3061
  * @returns Promise resolving with list of labels, each of which is a list of label lines
3031
3062
  */
3032
3063
  async function _prepareLabelsFromAll(featureSet, attributeTypes, attributeDomains, includeHeaderNames = false, useFieldAliasNames = false) {
@@ -3063,7 +3094,7 @@ async function _prepareLabelsFromAll(featureSet, attributeTypes, attributeDomain
3063
3094
  * @param attributeDomains Domains for each attribute in a feature
3064
3095
  * @param attributeFormats Formats for each attribute in a feature
3065
3096
  * @param labelFormat Format for label
3066
- * @param includeHeaderNames Add the label format at the front of the list of generated labels
3097
+ * @param includeHeaderNames Add a heading entries at the beginning of the list of generated labels
3067
3098
  * @returns Promise resolving with list of labels, each of which is a list of label lines
3068
3099
  */
3069
3100
  async function _prepareLabelsFromPattern(layer, featureSet, attributeOrigNames, attributeTypes, attributeDomains, attributeFormats, labelFormat, includeHeaderNames = false) {
@@ -3103,7 +3134,7 @@ async function _prepareLabelsFromPattern(layer, featureSet, attributeOrigNames,
3103
3134
  }));
3104
3135
  // Add header names
3105
3136
  if (includeHeaderNames) {
3106
- labels.unshift(attributeNames);
3137
+ labels.unshift(_extractHeaderNames(labelFormat));
3107
3138
  }
3108
3139
  return Promise.resolve(labels);
3109
3140
  }
@@ -167,7 +167,7 @@ const printStyling = `
167
167
  }
168
168
 
169
169
  .instant-apps-export-print .esri-legend--card__service-caption-text {
170
- padding-bottom: 0;
170
+ padding-bottom: 4px;
171
171
  }
172
172
 
173
173
  .instant-apps-export-print__compass-container {
@@ -602,8 +602,10 @@ const InstantAppsExport$1 = /*@__PURE__*/ proxyCustomElement(class InstantAppsEx
602
602
  }
603
603
  }
604
604
  handleLegendSetup() {
605
+ var _a;
605
606
  if (this.showIncludeLegend && this.view != null && this.includeMap && this.legendContainerEl != null) {
606
- this.legendContainerEl.style.display = this.includeLegend ? 'block' : 'none';
607
+ const hasActiveLayers = this.legend != null && ((_a = this.legend.activeLayerInfos) === null || _a === void 0 ? void 0 : _a.length) > 0;
608
+ this.legendContainerEl.style.display = this.includeLegend && hasActiveLayers ? 'block' : 'none';
607
609
  }
608
610
  }
609
611
  handleWidgetCreation() {
@@ -611,11 +613,11 @@ const InstantAppsExport$1 = /*@__PURE__*/ proxyCustomElement(class InstantAppsEx
611
613
  this.handleCompassCreation();
612
614
  }
613
615
  handleLegendCreation() {
614
- var _a, _b, _c, _d;
616
+ var _a, _b, _c, _d, _e;
615
617
  if (this.includeMap && this.view != null && this.showIncludeLegend && this.legendContainerEl != null) {
616
618
  const map = this.view.map;
617
619
  const legendMap = (_b = (_a = this.legend) === null || _a === void 0 ? void 0 : _a.view) === null || _b === void 0 ? void 0 : _b.map;
618
- const checkId = ((_c = map === null || map === void 0 ? void 0 : map.portalItem) === null || _c === void 0 ? void 0 : _c.id) === ((_d = legendMap === null || legendMap === void 0 ? void 0 : legendMap.portalItem) === null || _d === void 0 ? void 0 : _d.id);
620
+ const checkId = ((_c = map === null || map === void 0 ? void 0 : map.portalItem) === null || _c === void 0 ? void 0 : _c.id) != null && ((_d = map === null || map === void 0 ? void 0 : map.portalItem) === null || _d === void 0 ? void 0 : _d.id) === ((_e = legendMap === null || legendMap === void 0 ? void 0 : legendMap.portalItem) === null || _e === void 0 ? void 0 : _e.id);
619
621
  if (!checkId) {
620
622
  this.updateLegend();
621
623
  }
@@ -624,13 +626,17 @@ const InstantAppsExport$1 = /*@__PURE__*/ proxyCustomElement(class InstantAppsEx
624
626
  updateLegend() {
625
627
  var _a;
626
628
  (_a = this.view) === null || _a === void 0 ? void 0 : _a.when(async (view) => {
627
- var _a;
628
- (_a = this.legend) === null || _a === void 0 ? void 0 : _a.destroy();
629
+ if (this.legend != null) {
630
+ this.legend.destroy();
631
+ this.legend = null;
632
+ }
629
633
  if (this.legendContainerEl != null) {
630
634
  this.legendContainerEl.innerHTML = '';
635
+ const legendCont = document.createElement('div');
636
+ this.legendContainerEl.append(legendCont);
631
637
  const [Legend] = await loadModules(['esri/widgets/Legend']);
632
638
  this.legend = new Legend({
633
- container: this.legendContainerEl,
639
+ container: legendCont,
634
640
  view,
635
641
  style: {
636
642
  type: 'card',
@@ -84,7 +84,7 @@ const InstantAppsLandingPage$1 = /*@__PURE__*/ proxyCustomElement(class InstantA
84
84
  fontFamily,
85
85
  };
86
86
  return (h("div", { style: this.backgroundImageSrc
87
- ? Object.assign(Object.assign({}, style), { backgroundSize: 'cover', backgroundImage: `url("${this.backgroundImageSrc}")`, backgroundRepeat: 'no-repeat' }) : style, class: `${CSS.BASE}${alignmentClass}${closed}${removeTransition}` }, h("div", { class: CSS.contentContainer }, this.renderIconImage(), this.renderTitleText(), this.renderSubtitleText(), this.renderDescriptionText()), h("div", { class: CSS.buttonContainer }, this.renderEntryButton(), h("slot", { name: "secondary-action" }))));
87
+ ? Object.assign(Object.assign({}, style), { backgroundSize: 'cover', backgroundImage: `url("${this.backgroundImageSrc}")`, backgroundRepeat: 'no-repeat', backgroundPosition: 'center' }) : style, class: `${CSS.BASE}${alignmentClass}${closed}${removeTransition}` }, h("div", { class: CSS.contentContainer }, this.renderIconImage(), this.renderTitleText(), this.renderSubtitleText(), this.renderDescriptionText()), h("div", { class: CSS.buttonContainer }, this.renderEntryButton(), h("slot", { name: "secondary-action" }))));
88
88
  }
89
89
  renderIconImage() {
90
90
  return this.iconImage ? h("img", { class: `${CSS.iconImage}${this.getIconImageScale()}`, src: this.iconImage, alt: this.iconImageAltText }) : null;
@@ -51,7 +51,7 @@ const InstantAppsMeasurement$1 = /*@__PURE__*/ proxyCustomElement(class InstantA
51
51
  }
52
52
  renderActionPad() {
53
53
  const { messages, activeToolType } = this;
54
- return (h("calcite-action-pad", { "expand-disabled": true, layout: "horizontal", position: "end" }, h("calcite-action", { class: activeToolType === 'distance' ? 'active-tool' : "", text: messages === null || messages === void 0 ? void 0 : messages.line, icon: "measure", scale: "m", "data-value": "distance", onClick: this._handleToolClick.bind(this) }, h("calcite-tooltip", { "close-on-click": true, placement: "bottom", slot: "tooltip" }, messages === null || messages === void 0 ? void 0 : messages.line)), h("calcite-action", { class: activeToolType === 'area' ? 'active-tool' : "", text: messages === null || messages === void 0 ? void 0 : messages.area, scale: "m", icon: "measure-area", "data-value": "area", onClick: this._handleToolClick.bind(this) }, h("calcite-tooltip", { "close-on-click": true, placement: "bottom", slot: "tooltip" }, messages === null || messages === void 0 ? void 0 : messages.area)), h("calcite-action", { class: activeToolType === 'point' ? 'active-tool' : "", text: messages === null || messages === void 0 ? void 0 : messages.point, scale: "m", icon: "pin-plus", "data-value": "point", onClick: this._handleToolClick.bind(this) }, h("calcite-tooltip", { "close-on-click": true, placement: "bottom", slot: "tooltip" }, messages === null || messages === void 0 ? void 0 : messages.point)), h("calcite-action", { text: messages === null || messages === void 0 ? void 0 : messages.clear, scale: "m", icon: "trash", "data-value": "clear", onClick: this._handleToolClick.bind(this) }, h("calcite-tooltip", { "close-on-click": true, placement: "bottom", slot: "tooltip" }, messages === null || messages === void 0 ? void 0 : messages.clear))));
54
+ return (h("calcite-action-pad", { "expand-disabled": true, layout: "horizontal", position: "end" }, h("calcite-action", { class: activeToolType === 'distance' ? 'active-tool' : '', text: messages === null || messages === void 0 ? void 0 : messages.line, icon: "measure", scale: "m", "data-value": "distance", onClick: this._handleToolClick.bind(this) }, h("calcite-tooltip", { "close-on-click": true, placement: "bottom", slot: "tooltip" }, messages === null || messages === void 0 ? void 0 : messages.line)), h("calcite-action", { class: activeToolType === 'area' ? 'active-tool' : '', text: messages === null || messages === void 0 ? void 0 : messages.area, scale: "m", icon: "measure-area", "data-value": "area", onClick: this._handleToolClick.bind(this) }, h("calcite-tooltip", { "close-on-click": true, placement: "bottom", slot: "tooltip" }, messages === null || messages === void 0 ? void 0 : messages.area)), h("calcite-action", { class: activeToolType === 'point' ? 'active-tool' : '', text: messages === null || messages === void 0 ? void 0 : messages.point, scale: "m", icon: "pin-plus", "data-value": "point", onClick: this._handleToolClick.bind(this) }, h("calcite-tooltip", { "close-on-click": true, placement: "bottom", slot: "tooltip" }, messages === null || messages === void 0 ? void 0 : messages.point)), h("calcite-action", { text: messages === null || messages === void 0 ? void 0 : messages.clear, scale: "m", icon: "trash", "data-value": "clear", onClick: this._handleToolClick.bind(this) }, h("calcite-tooltip", { "close-on-click": true, placement: "bottom", slot: "tooltip" }, messages === null || messages === void 0 ? void 0 : messages.clear))));
55
55
  }
56
56
  _handleToolClick(e) {
57
57
  var _a, _b, _c, _d;
@@ -12,9 +12,10 @@ import { d as defineCustomElement$3 } from './icon.js';
12
12
  import { d as defineCustomElement$2 } from './loader.js';
13
13
  import { d as defineCustomElement$1 } from './popover.js';
14
14
 
15
- const instantAppsSocialShareCss = ":host{display:block;--instant-apps-social-share-action-width:initial;--instant-apps-social-share-width--s:200px;--instant-apps-social-share-width--m:280px;--instant-apps-social-share-width--l:320px;--instant-apps-social-share-width-horizontal--s:300px;--instant-apps-social-share-width-horizontal--m:380px;--instant-apps-social-share-width-horizontal--l:420px;--instant-apps-social-share-background-color:var(--calcite-color-foreground-1);--instant-apps-social-share-popover-button-background-color:transparent;--instant-apps-social-share-popover-button-icon-color:var(--calcite-ui-icon-color);--instant-apps-social-share-embed-border:1px solid $border;--instant-apps-social-share-embed-text-area-text:#468540}:host .instant-apps-social-share__popover-button{background-color:var(--instant-apps-social-share-popover-button-background-color)}:host .instant-apps-social-share__popover-button calcite-icon{color:var(--instant-apps-social-share-popover-button-icon-color)}:host .instant-apps-social-share__dialog,:host .instant-apps-social-share__dialog-embed{background-color:var(--instant-apps-social-share-background-color);border:var(--instant-apps-social-share-embed-border)}:host .instant-apps-social-share__dialog{box-sizing:border-box;height:auto;padding:10px 0;border-radius:5px}:host .instant-apps-social-share__options{margin:0;padding:1% 0 0 0;list-style-type:none}:host .instant-apps-social-share__options li{box-sizing:border-box;display:flex;align-items:center;width:100%;padding:5%;transition:background-color 0.15s ease-out 0s}:host .instant-apps-social-share__options li .instant-apps-social-share__icon,:host .instant-apps-social-share__options li .instant-apps-social-share__option-text{display:inline-block}:host .instant-apps-social-share__options li .instant-apps-social-share__icon{display:flex;align-items:center}:host .instant-apps-social-share__options li .instant-apps-social-share__option-text{width:85%;margin-left:10px;word-break:break-word}:host .instant-apps-social-share__options li .instant-apps-social-share__option-text--rtl{margin-left:0;margin-right:10px}:host .instant-apps-social-share__options li:hover{cursor:pointer;background-color:var(--calcite-color-foreground-2)}:host .instant-apps-social-share__tip{box-sizing:border-box;padding:0 5% 1% 5%}:host .instant-apps-social-share__tip-header{display:flex;align-items:center;color:#007ac2;margin:8px 0 5px 0}:host .instant-apps-social-share__tip-header calcite-icon{margin-right:5px}:host .instant-apps-social-share__tip-content{line-height:17px;margin:0;padding-top:2%}:host .instant-apps-social-share__success{display:flex;flex-direction:column;padding:15px}:host .instant-apps-social-share__success-header{display:flex;align-items:center;font-weight:bold;margin-bottom:10px}:host .instant-apps-social-share__success-icon{display:flex;align-items:center;margin-right:5px}:host .instant-apps-social-share__success-icon calcite-icon{color:var(--calcite-color-status-success)}:host .instant-apps-social-share__success-message{line-height:16px}:host .instant-apps-social-share__embed{box-sizing:border-box;width:100%;padding:5%;margin-bottom:10px;border-top:1px solid #d3d3d3}:host .instant-apps-social-share__embed-header{display:flex;align-items:center;margin-bottom:5px}:host .instant-apps-social-share__embed-header calcite-icon{margin-right:5px}:host .instant-apps-social-share__embed-code-text-area{border:1px solid #d3d3d3}:host .instant-apps-social-share__embed-code-text-area textarea{box-sizing:border-box;padding:4%;border:none;resize:none;background:transparent;width:100%;font-family:var(--calcite-sans-family);color:var(--calcite-color-text-1)}:host .instant-apps-social-share__embed-code-text-area button{display:flex;align-items:center;text-align:start;width:100%;border:none;border-top:1px solid #d3d3d3;background-color:transparent;line-height:16px;font-weight:400;padding:3%;color:var(--calcite-color-text-1)}:host .instant-apps-social-share__embed-code-text-area button calcite-icon{color:#007ac2;margin-right:3px}:host .instant-apps-social-share__embed-code-text-area button:hover{cursor:pointer;background-color:var(--calcite-color-foreground-2);transition:background-color 0.15s ease-out 0s}:host .instant-apps-social-share__embed-text-area-text{font-weight:600;color:var(--instant-apps-social-share-embed-text-area-text)}:host .instant-apps-social-share__embed .instant-apps-social-share__text-area--rtl{text-align:left}:host .instant-apps-social-share__embed-dimensions{display:flex;justify-content:space-between;margin-top:10px}:host .instant-apps-social-share__embed-dimensions-input{width:47%;box-sizing:border-box}:host .instant-apps-social-share__embed-dimensions-input input{border:1px solid #d3d3d3;width:100%;height:25px;font-family:var(--calcite-sans-family)}:host .instant-apps-social-share__layout--horizontal .instant-apps-social-share__options{display:flex;justify-content:space-around;margin-bottom:8%}:host .instant-apps-social-share__layout--horizontal .instant-apps-social-share__options li{flex-direction:column;padding:0}:host .instant-apps-social-share__layout--horizontal .instant-apps-social-share__options li .instant-apps-social-share__option-text{word-break:break-word;margin-left:0;margin-top:10px;text-align:center}:host .instant-apps-social-share__layout--horizontal .instant-apps-social-share__options li:hover{background-color:unset}:host .instant-apps-social-share__icon-container{display:flex;align-items:center}:host calcite-action{width:var(--instant-apps-social-share-action-width)}:host([scale=s]) .instant-apps-social-share__dialog{width:var(--instant-apps-social-share-width--s)}:host([scale=s]) .instant-apps-social-share__icon{width:16px;height:16px}:host([scale=s]) .instant-apps-social-share__option-text{font-size:var(--calcite-font-size--1)}:host([scale=s]) .instant-apps-social-share__dialog.instant-apps-social-share__layout--horizontal{width:var(--instant-apps-social-share-width-horizontal--s)}:host([scale=s]) .instant-apps-social-share__tip-header,:host([scale=s]) .instant-apps-social-share__tip-content,:host([scale=s]) .instant-apps-social-share__embed-header,:host([scale=s]) .instant-apps-social-share__embed-dimensions-input{font-size:var(--calcite-font-size--2)}:host([scale=m]) .instant-apps-social-share__dialog{width:var(--instant-apps-social-share-width--m)}:host([scale=m]) .instant-apps-social-share__icon{width:24px;height:24px}:host([scale=m]) .instant-apps-social-share__option-text{font-size:var(--calcite-font-size-0)}:host([scale=m]) .instant-apps-social-share__dialog.instant-apps-social-share__layout--horizontal{width:var(--instant-apps-social-share-width-horizontal--m)}:host([scale=m]) .instant-apps-social-share__tip-header,:host([scale=m]) .instant-apps-social-share__tip-content,:host([scale=m]) .instant-apps-social-share__embed-header,:host([scale=m]) .instant-apps-social-share__embed-dimensions-input{font-size:var(--calcite-font-size--1)}:host([scale=l]) .instant-apps-social-share__dialog{width:var(--instant-apps-social-share-width--l)}:host([scale=l]) .instant-apps-social-share__icon{width:32px;height:32px}:host([scale=l]) .instant-apps-social-share__option-text{font-size:var(--calcite-font-size-1)}:host([scale=l]) .instant-apps-social-share__dialog.instant-apps-social-share__layout--horizontal{width:var(--instant-apps-social-share-width-horizontal--l)}:host([scale=l]) .instant-apps-social-share__tip-header,:host([scale=l]) .instant-apps-social-share__tip-content,:host([scale=l]) .instant-apps-social-share__embed-header,:host([scale=l]) .instant-apps-social-share__embed-dimensions-input{font-size:var(--calcite-font-size-0)}";
15
+ const instantAppsSocialShareCss = ":host{display:block;--instant-apps-social-share-action-width:initial;--instant-apps-social-share-width--s:200px;--instant-apps-social-share-width--m:280px;--instant-apps-social-share-width--l:320px;--instant-apps-social-share-width-horizontal--s:300px;--instant-apps-social-share-width-horizontal--m:380px;--instant-apps-social-share-width-horizontal--l:420px;--instant-apps-social-share-background-color:var(--calcite-color-foreground-1);--instant-apps-social-share-popover-button-background-color:transparent;--instant-apps-social-share-popover-button-icon-color:var(--calcite-ui-icon-color);--instant-apps-social-share-embed-border:1px solid $border;--instant-apps-social-share-embed-text-area-text:#468540}:host .instant-apps-social-share__popover-button{background-color:var(--instant-apps-social-share-popover-button-background-color)}:host .instant-apps-social-share__popover-button calcite-icon{color:var(--instant-apps-social-share-popover-button-icon-color)}:host .instant-apps-social-share__dialog,:host .instant-apps-social-share__dialog-embed{background-color:var(--instant-apps-social-share-background-color);border:var(--instant-apps-social-share-embed-border)}:host .instant-apps-social-share__dialog{box-sizing:border-box;height:auto;padding:10px 0;border-radius:5px}:host .instant-apps-social-share__options{margin:0;padding:1% 0 0 0;list-style-type:none}:host .instant-apps-social-share__options li{box-sizing:border-box;display:flex;align-items:center;width:100%;padding:5%;transition:background-color 0.15s ease-out 0s}:host .instant-apps-social-share__options li .instant-apps-social-share__icon,:host .instant-apps-social-share__options li .instant-apps-social-share__option-text{display:inline-block}:host .instant-apps-social-share__options li .instant-apps-social-share__icon{display:flex;align-items:center}:host .instant-apps-social-share__options li .instant-apps-social-share__option-text{width:85%;margin-left:10px;word-break:break-word}:host .instant-apps-social-share__options li .instant-apps-social-share__option-text--rtl{margin-left:0;margin-right:10px}:host .instant-apps-social-share__options li:hover{cursor:pointer;background-color:var(--calcite-color-foreground-2)}:host .instant-apps-social-share__options__x-logo--light path{fill:#000000}:host .instant-apps-social-share__options__x-logo--dark path{fill:#ffffff}:host .instant-apps-social-share__tip{box-sizing:border-box;padding:0 5% 1% 5%}:host .instant-apps-social-share__tip-header{display:flex;align-items:center;color:#007ac2;margin:8px 0 5px 0}:host .instant-apps-social-share__tip-header calcite-icon{margin-right:5px}:host .instant-apps-social-share__tip-content{line-height:17px;margin:0;padding-top:2%}:host .instant-apps-social-share__success{display:flex;flex-direction:column;padding:15px}:host .instant-apps-social-share__success-header{display:flex;align-items:center;font-weight:bold;margin-bottom:10px}:host .instant-apps-social-share__success-icon{display:flex;align-items:center;margin-right:5px}:host .instant-apps-social-share__success-icon calcite-icon{color:var(--calcite-color-status-success)}:host .instant-apps-social-share__success-message{line-height:16px}:host .instant-apps-social-share__embed{box-sizing:border-box;width:100%;padding:5%;margin-bottom:10px;border-top:1px solid #d3d3d3}:host .instant-apps-social-share__embed-header{display:flex;align-items:center;margin-bottom:5px}:host .instant-apps-social-share__embed-header calcite-icon{margin-right:5px}:host .instant-apps-social-share__embed-code-text-area{border:1px solid #d3d3d3}:host .instant-apps-social-share__embed-code-text-area textarea{box-sizing:border-box;padding:4%;border:none;resize:none;background:transparent;width:100%;font-family:var(--calcite-sans-family);color:var(--calcite-color-text-1)}:host .instant-apps-social-share__embed-code-text-area button{display:flex;align-items:center;text-align:start;width:100%;border:none;border-top:1px solid #d3d3d3;background-color:transparent;line-height:16px;font-weight:400;padding:3%;color:var(--calcite-color-text-1)}:host .instant-apps-social-share__embed-code-text-area button calcite-icon{color:#007ac2;margin-right:3px}:host .instant-apps-social-share__embed-code-text-area button:hover{cursor:pointer;background-color:var(--calcite-color-foreground-2);transition:background-color 0.15s ease-out 0s}:host .instant-apps-social-share__embed-text-area-text{font-weight:600;color:var(--instant-apps-social-share-embed-text-area-text)}:host .instant-apps-social-share__embed .instant-apps-social-share__text-area--rtl{text-align:left;direction:ltr}:host .instant-apps-social-share__embed-dimensions{display:flex;justify-content:space-between;margin-top:10px}:host .instant-apps-social-share__embed-dimensions-input{width:47%;box-sizing:border-box}:host .instant-apps-social-share__embed-dimensions-input input{border:1px solid #d3d3d3;width:100%;height:25px;font-family:var(--calcite-sans-family)}:host .instant-apps-social-share__layout--horizontal .instant-apps-social-share__options{display:flex;justify-content:space-around;margin-bottom:8%}:host .instant-apps-social-share__layout--horizontal .instant-apps-social-share__options li{flex-direction:column;padding:0}:host .instant-apps-social-share__layout--horizontal .instant-apps-social-share__options li .instant-apps-social-share__option-text{word-break:break-word;margin-left:0;margin-top:10px;text-align:center}:host .instant-apps-social-share__layout--horizontal .instant-apps-social-share__options li:hover{background-color:unset}:host .instant-apps-social-share__icon-container{display:flex;align-items:center}:host calcite-action{width:var(--instant-apps-social-share-action-width)}:host([scale=s]) .instant-apps-social-share__dialog{width:var(--instant-apps-social-share-width--s)}:host([scale=s]) .instant-apps-social-share__icon{width:16px;height:16px}:host([scale=s]) .instant-apps-social-share__option-text{font-size:var(--calcite-font-size--1)}:host([scale=s]) .instant-apps-social-share__dialog.instant-apps-social-share__layout--horizontal{width:var(--instant-apps-social-share-width-horizontal--s)}:host([scale=s]) .instant-apps-social-share__tip-header,:host([scale=s]) .instant-apps-social-share__tip-content,:host([scale=s]) .instant-apps-social-share__embed-header,:host([scale=s]) .instant-apps-social-share__embed-dimensions-input{font-size:var(--calcite-font-size--2)}:host([scale=m]) .instant-apps-social-share__dialog{width:var(--instant-apps-social-share-width--m)}:host([scale=m]) .instant-apps-social-share__icon{width:24px;height:24px}:host([scale=m]) .instant-apps-social-share__option-text{font-size:var(--calcite-font-size-0)}:host([scale=m]) .instant-apps-social-share__dialog.instant-apps-social-share__layout--horizontal{width:var(--instant-apps-social-share-width-horizontal--m)}:host([scale=m]) .instant-apps-social-share__tip-header,:host([scale=m]) .instant-apps-social-share__tip-content,:host([scale=m]) .instant-apps-social-share__embed-header,:host([scale=m]) .instant-apps-social-share__embed-dimensions-input{font-size:var(--calcite-font-size--1)}:host([scale=l]) .instant-apps-social-share__dialog{width:var(--instant-apps-social-share-width--l)}:host([scale=l]) .instant-apps-social-share__icon{width:32px;height:32px}:host([scale=l]) .instant-apps-social-share__option-text{font-size:var(--calcite-font-size-1)}:host([scale=l]) .instant-apps-social-share__dialog.instant-apps-social-share__layout--horizontal{width:var(--instant-apps-social-share-width-horizontal--l)}:host([scale=l]) .instant-apps-social-share__tip-header,:host([scale=l]) .instant-apps-social-share__tip-content,:host([scale=l]) .instant-apps-social-share__embed-header,:host([scale=l]) .instant-apps-social-share__embed-dimensions-input{font-size:var(--calcite-font-size-0)}";
16
16
 
17
17
  const base = 'instant-apps-social-share';
18
+ const CALCITE_MODE_DARK = '.calcite-mode-dark';
18
19
  const CSS = {
19
20
  base,
20
21
  dialog: `${base}__dialog`,
@@ -32,6 +33,10 @@ const CSS = {
32
33
  vertical: `${base}__layout--vertical`,
33
34
  horizontal: `${base}__layout--horizontal`,
34
35
  },
36
+ xLogo: {
37
+ light: `${base}__x-logo--light`,
38
+ dark: `${base}__x-logo--dark`,
39
+ },
35
40
  success: {
36
41
  container: `${base}__success`,
37
42
  header: `${base}__success-header`,
@@ -59,7 +64,7 @@ const CSS = {
59
64
  };
60
65
  const SOCIAL_URL_TEMPLATES = {
61
66
  facebook: 'https://www.facebook.com/sharer/sharer.php?u={url}',
62
- twitter: 'https://twitter.com/intent/tweet?text={text}&url={url}',
67
+ x: 'https://x.com/intent/post?url={url}',
63
68
  linkedIn: 'https://www.linkedin.com/sharing/share-offsite/?url={url}',
64
69
  };
65
70
  const SHORTEN_API = 'https://arcg.is/prod/shorten';
@@ -240,7 +245,7 @@ const InstantAppsSocialShare = /*@__PURE__*/ proxyCustomElement(class InstantApp
240
245
  return (h("ul", { ref: el => (this.shareListRef = el), class: CSS.options, role: "menu" }, h("li", { id: "copyToClipboard", onClick: this.handleShareItem.bind(this, 'link'), onKeyDown: this.handleOptionKeyDown('link'), role: "menuitem", tabindex: "0" }, h("span", { class: CSS.icon }, h("calcite-icon", { icon: "link", scale: this.scale })), h("span", { class: `${CSS.optionText}${optionText_RTL}` }, (_b = options === null || options === void 0 ? void 0 : options.link) === null || _b === void 0 ? void 0 : _b.label)), this.socialMedia
241
246
  ? [
242
247
  h("li", { onClick: this.handleShareItem.bind(this, 'facebook'), onKeyDown: this.handleOptionKeyDown('facebook'), role: "menuitem", tabindex: "0" }, h("span", { class: CSS.icon }, this.renderFacebookIcon()), h("span", { class: `${CSS.optionText}${optionText_RTL}` }, (_c = options === null || options === void 0 ? void 0 : options.facebook) === null || _c === void 0 ? void 0 : _c.label)),
243
- h("li", { onClick: this.handleShareItem.bind(this, 'twitter'), onKeyDown: this.handleOptionKeyDown('twitter'), role: "menuitem", tabindex: "0" }, h("span", { class: CSS.icon }, this.renderTwitterIcon()), h("span", { class: `${CSS.optionText}${optionText_RTL}` }, "Twitter")),
248
+ h("li", { onClick: this.handleShareItem.bind(this, 'x'), onKeyDown: this.handleOptionKeyDown('x'), role: "menuitem", tabindex: "0" }, h("span", { class: CSS.icon }, this.renderXIcon()), h("span", { class: `${CSS.optionText}${optionText_RTL}` }, "X")),
244
249
  h("li", { onClick: this.handleShareItem.bind(this, 'linkedIn'), onKeyDown: this.handleOptionKeyDown('linkedIn'), role: "menuitem", tabindex: "0" }, h("span", { class: CSS.icon }, this.renderLinkedInIcon()), h("span", { class: `${CSS.optionText}${optionText_RTL}` }, (_d = options === null || options === void 0 ? void 0 : options.linkedIn) === null || _d === void 0 ? void 0 : _d.label)),
245
250
  ]
246
251
  : null));
@@ -257,8 +262,9 @@ const InstantAppsSocialShare = /*@__PURE__*/ proxyCustomElement(class InstantApp
257
262
  renderFacebookIcon() {
258
263
  return (h("svg", { height: "100%", style: { fillRule: 'evenodd', clipRule: 'evenodd', strokeLinejoin: 'round', strokeMiterlimit: '2' }, version: "1.1", viewBox: "0 0 512 512", width: "100%", xmlns: "http://www.w3.org/2000/svg" }, h("g", null, h("path", { d: "M512,256c0,-141.385 -114.615,-256 -256,-256c-141.385,0 -256,114.615 -256,256c0,127.777 93.616,233.685 216,252.89l0,-178.89l-65,0l0,-74l65,0l0,-56.4c0,-64.16 38.219,-99.6 96.695,-99.6c28.009,0 57.305,5 57.305,5l0,63l-32.281,0c-31.801,0 -41.719,19.733 -41.719,39.978l0,48.022l71,0l-11.35,74l-59.65,0l0,178.89c122.385,-19.205 216,-125.113 216,-252.89Z", style: { fill: '#1877f2', fillRule: 'nonzero' } }), h("path", { d: "M355.65,330l11.35,-74l-71,0l0,-48.022c0,-20.245 9.917,-39.978 41.719,-39.978l32.281,0l0,-63c0,0 -29.297,-5 -57.305,-5c-58.476,0 -96.695,35.44 -96.695,99.6l0,56.4l-65,0l0,74l65,0l0,178.89c13.033,2.045 26.392,3.11 40,3.11c13.608,0 26.966,-1.065 40,-3.11l0,-178.89l59.65,0Z", style: { fill: '#fff', fillRule: 'nonzero' } }))));
259
264
  }
260
- renderTwitterIcon() {
261
- return (h("svg", { height: "100%", style: { fillRule: 'evenodd', clipRule: 'evenodd', strokeLinejoin: 'round', strokeMiterlimit: '2' }, version: "1.1", viewBox: "0 0 512 512", width: "100%", xmlns: "http://www.w3.org/2000/svg" }, h("rect", { height: "400", style: { fill: 'none' }, width: "400", x: "56", y: "56" }), h("path", { d: "M161.014,464.013c193.208,0 298.885,-160.071 298.885,-298.885c0,-4.546 0,-9.072 -0.307,-13.578c20.558,-14.871 38.305,-33.282 52.408,-54.374c-19.171,8.495 -39.51,14.065 -60.334,16.527c21.924,-13.124 38.343,-33.782 46.182,-58.102c-20.619,12.235 -43.18,20.859 -66.703,25.498c-19.862,-21.121 -47.602,-33.112 -76.593,-33.112c-57.682,0 -105.145,47.464 -105.145,105.144c0,8.002 0.914,15.979 2.722,23.773c-84.418,-4.231 -163.18,-44.161 -216.494,-109.752c-27.724,47.726 -13.379,109.576 32.522,140.226c-16.715,-0.495 -33.071,-5.005 -47.677,-13.148l0,1.331c0.014,49.814 35.447,93.111 84.275,102.974c-15.464,4.217 -31.693,4.833 -47.431,1.802c13.727,42.685 53.311,72.108 98.14,72.95c-37.19,29.227 -83.157,45.103 -130.458,45.056c-8.358,-0.016 -16.708,-0.522 -25.006,-1.516c48.034,30.825 103.94,47.18 161.014,47.104", style: { fill: '#1da1f2', fillRule: 'nonzero' } })));
265
+ renderXIcon() {
266
+ const isCalciteModeDark = !!this.el.closest(CALCITE_MODE_DARK);
267
+ return (h("svg", { class: isCalciteModeDark ? CSS.xLogo.dark : CSS.xLogo.light, width: "1200", height: "1227", viewBox: "0 0 1200 1227", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, h("rect", { height: "400", style: { fill: 'none' }, width: "400", x: "56", y: "56" }), h("path", { d: "M714.163 519.284L1160.89 0H1055.03L667.137 450.887L357.328 0H0L468.492 681.821L0 1226.37H105.866L515.491 750.218L842.672 1226.37H1200L714.137 519.284H714.163ZM569.165 687.828L521.697 619.934L144.011 79.6944H306.615L611.412 515.685L658.88 583.579L1055.08 1150.3H892.476L569.165 687.854V687.828Z", fill: isCalciteModeDark ? 'white' : 'black' })));
262
268
  }
263
269
  renderLinkedInIcon() {
264
270
  return (h("svg", { height: "100%", style: { fillRule: 'evenodd', clipRule: 'evenodd', strokeLinejoin: 'round', strokeMiterlimit: '2' }, version: "1.1", viewBox: "0 0 512 512", width: "100%", xmlns: "http://www.w3.org/2000/svg" }, h("g", { id: "g5891" }, h("path", { d: "M512,64c0,-35.323 -28.677,-64 -64,-64l-384,0c-35.323,0 -64,28.677 -64,64l0,384c0,35.323 28.677,64 64,64l384,0c35.323,0 64,-28.677 64,-64l0,-384Z", id: "background", style: { fill: '#2867b2' } }), h("g", { id: "shapes" }, h("rect", { height: "257.962", id: "rect11", style: { fill: '#fff' }, width: "85.76", x: "61.053", y: "178.667" }), h("path", { d: "M104.512,54.28c-29.341,0 -48.512,19.29 -48.512,44.573c0,24.752 18.588,44.574 47.377,44.574l0.554,0c29.903,0 48.516,-19.822 48.516,-44.574c-0.555,-25.283 -18.611,-44.573 -47.935,-44.573Z", id: "path13-0", style: { fill: '#fff', fillRule: 'nonzero' } }), h("path", { d: "M357.278,172.601c-45.49,0 -65.866,25.017 -77.276,42.589l0,-36.523l-85.738,0c1.137,24.197 0,257.961 0,257.961l85.737,0l0,-144.064c0,-7.711 0.554,-15.42 2.827,-20.931c6.188,-15.4 20.305,-31.352 43.993,-31.352c31.012,0 43.436,23.664 43.436,58.327l0,138.02l85.741,0l0,-147.93c0,-79.237 -42.305,-116.097 -98.72,-116.097Z", id: "path15", style: { fill: '#fff', fillRule: 'nonzero' } })))));
@@ -324,7 +330,7 @@ const InstantAppsSocialShare = /*@__PURE__*/ proxyCustomElement(class InstantApp
324
330
  setTimeout(() => this.closePopover(), 2000);
325
331
  return;
326
332
  case 'facebook':
327
- case 'twitter':
333
+ case 'x':
328
334
  case 'linkedIn':
329
335
  let socialWin;
330
336
  if (isSafari) {
@@ -336,7 +342,7 @@ const InstantAppsSocialShare = /*@__PURE__*/ proxyCustomElement(class InstantApp
336
342
  const urlData = {
337
343
  url: encodeURI(urlToUse),
338
344
  };
339
- const data = type === 'twitter' ? Object.assign(Object.assign({}, urlData), { text: this.shareText }) : urlData;
345
+ const data = type === 'x' ? Object.assign(Object.assign({}, urlData), { text: this.shareText }) : urlData;
340
346
  const [intl] = await loadModules(['esri/intl']);
341
347
  const url = intl.substitute(SOCIAL_URL_TEMPLATES[type], data);
342
348
  if (this.mode === 'popover') {