@esri/solutions-components 0.8.2 → 0.8.4

Sign up to get free protection for your applications and to get access to all the features.
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') {