@esri/solutions-components 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. package/dist/assets/t9n/public-notification/resources.json +5 -5
  2. package/dist/assets/t9n/public-notification/resources_en.json +5 -5
  3. package/dist/cjs/calcite-input-message_5.cjs.entry.js +1 -17
  4. package/dist/cjs/{downloadUtils-ae182e3a.js → downloadUtils-d05b069f.js} +91 -42
  5. package/dist/cjs/{index.es-b71e9071.js → index.es-e47b660c.js} +1 -1
  6. package/dist/cjs/layer-table.cjs.entry.js +1 -1
  7. package/dist/cjs/public-notification.cjs.entry.js +3 -11
  8. package/dist/collection/components/map-select-tools/map-select-tools.js +0 -16
  9. package/dist/collection/components/public-notification/public-notification.js +3 -11
  10. package/dist/collection/utils/downloadUtils.js +90 -41
  11. package/dist/collection/utils/downloadUtils.ts +123 -52
  12. package/dist/components/downloadUtils.js +90 -41
  13. package/dist/components/map-select-tools2.js +0 -16
  14. package/dist/components/public-notification.js +3 -11
  15. package/dist/esm/calcite-input-message_5.entry.js +1 -17
  16. package/dist/esm/{downloadUtils-8d64719e.js → downloadUtils-a9b39194.js} +91 -42
  17. package/dist/esm/{index.es-1d777745.js → index.es-4904465f.js} +1 -1
  18. package/dist/esm/layer-table.entry.js +1 -1
  19. package/dist/esm/public-notification.entry.js +3 -11
  20. package/dist/solutions-components/p-20c73673.entry.js +6 -0
  21. package/dist/solutions-components/{p-702e1915.js → p-25eb36dc.js} +1 -1
  22. package/dist/solutions-components/p-59caff67.entry.js +17 -0
  23. package/dist/solutions-components/{p-048a4c91.entry.js → p-a606221a.entry.js} +1 -1
  24. package/dist/solutions-components/{p-01215468.js → p-e7b3a4d9.js} +3 -3
  25. package/dist/solutions-components/solutions-components.esm.js +1 -1
  26. package/dist/solutions-components/utils/downloadUtils.ts +123 -52
  27. package/dist/types/components/json-editor/assets/monaco-editor/monaco.d.ts +8262 -0
  28. package/package.json +1 -1
  29. package/dist/solutions-components/p-4bfcd9ea.entry.js +0 -17
  30. package/dist/solutions-components/p-a99ca396.entry.js +0 -6
@@ -2122,6 +2122,7 @@ function _downloadPDFFile(labels, labelPageDescription, fileTitle) {
2122
2122
  * See the License for the specific language governing permissions and
2123
2123
  * limitations under the License.
2124
2124
  */
2125
+ const lineSeparatorChar = "|";
2125
2126
  //#endregion
2126
2127
  //#region Public functions
2127
2128
  /**
@@ -2154,7 +2155,12 @@ async function downloadCSV(selectionSetNames, layer, ids, formatUsingLayerPopup,
2154
2155
  */
2155
2156
  async function downloadPDF(selectionSetNames, layer, ids, removeDuplicates, labelPageDescription) {
2156
2157
  console.log("downloadPDF using selectionSetNames " + JSON.stringify(selectionSetNames)); //???
2157
- const labels = await _prepareLabels(layer, ids, removeDuplicates);
2158
+ let labels = await _prepareLabels(layer, ids, removeDuplicates);
2159
+ labels =
2160
+ // Remove empty lines in labels
2161
+ labels.map(labelLines => labelLines.filter(line => line.length > 0))
2162
+ // Remove empty labels
2163
+ .filter(label => label.length > 0);
2158
2164
  exportPDF(labels, labelPageDescription);
2159
2165
  return Promise.resolve();
2160
2166
  }
@@ -2165,7 +2171,7 @@ async function downloadPDF(selectionSetNames, layer, ids, removeDuplicates, labe
2165
2171
  *
2166
2172
  * @param fieldInfos Layer's fieldInfos structure
2167
2173
  * @param bypassFieldVisiblity Indicates if the configured fieldInfo visibility property should be ignored
2168
- * @return Label spec
2174
+ * @return Label spec with lines separated by `lineSeparatorChar`
2169
2175
  */
2170
2176
  function _convertPopupFieldsToLabelSpec(fieldInfos, bypassFieldVisiblity = false) {
2171
2177
  const labelSpec = [];
@@ -2175,7 +2181,7 @@ function _convertPopupFieldsToLabelSpec(fieldInfos, bypassFieldVisiblity = false
2175
2181
  labelSpec.push(`{${fieldInfo.fieldName}}`);
2176
2182
  }
2177
2183
  });
2178
- return labelSpec;
2184
+ return labelSpec.join(lineSeparatorChar);
2179
2185
  }
2180
2186
  /**
2181
2187
  * Converts the text of a custom popup into a multiline label specification; conversion splits text into
@@ -2183,22 +2189,19 @@ function _convertPopupFieldsToLabelSpec(fieldInfos, bypassFieldVisiblity = false
2183
2189
  *
2184
2190
  * @param popupInfo Layer's popupInfo structure containing description, fieldInfos, and expressionInfos, e.g.,
2185
2191
  * "<div style='text-align: left;'>{NAME}<br />{STREET}<br />{CITY}, {STATE} {ZIP} <br /></div>"
2186
- * @return Label spec
2192
+ * @return Label spec with lines separated by `lineSeparatorChar`
2187
2193
  */
2188
2194
  function _convertPopupTextToLabelSpec(popupInfo) {
2189
- // Replace <br>, <br/> with |
2190
- popupInfo = popupInfo.replace(/<br\s*\/?>/gi, "|");
2191
- // Remove remaining HTML tags, replace 0xA0 that popup uses for spaces, replace some char representations,
2195
+ // Replace <br>, <br/> with the line separator character
2196
+ popupInfo = popupInfo.replace(/<br\s*\/?>/gi, lineSeparatorChar);
2197
+ // Remove remaining HTML tags, replace 0xA0 that popup uses for spaces, and replace some char representations,
2192
2198
  // and split the label back into individual lines
2193
- let labelSpec = popupInfo
2199
+ const labelSpec = popupInfo
2194
2200
  .replace(/<[\s.]*[^<>]*\/?>/gi, "")
2195
2201
  .replace(/\xA0/gi, " ")
2196
2202
  .replace(/&lt;/gi, "<")
2197
2203
  .replace(/&gt;/gi, ">")
2198
- .replace(/&nbsp;/gi, " ")
2199
- .split("|");
2200
- // Trim lines and remove empties
2201
- labelSpec = labelSpec.map(line => line.trim()).filter(line => line.length > 0);
2204
+ .replace(/&nbsp;/gi, " ");
2202
2205
  return labelSpec;
2203
2206
  }
2204
2207
  /**
@@ -2217,7 +2220,7 @@ async function _createArcadeExecutors(labelFormat, layer) {
2217
2220
  }
2218
2221
  // Are there any Arcade expressions in the label format?
2219
2222
  const arcadeExpressionRegExp = /\{expression\/\w+\}/g;
2220
- const arcadeExpressionsMatches = labelFormat.join("|").match(arcadeExpressionRegExp);
2223
+ const arcadeExpressionsMatches = labelFormat.match(arcadeExpressionRegExp);
2221
2224
  if (!arcadeExpressionsMatches) {
2222
2225
  return Promise.resolve(arcadeExecutors);
2223
2226
  }
@@ -2244,6 +2247,39 @@ async function _createArcadeExecutors(labelFormat, layer) {
2244
2247
  return arcadeExecutors;
2245
2248
  });
2246
2249
  }
2250
+ /**
2251
+ * Prepares an attribute's value by applying domain and type information.
2252
+ *
2253
+ * @param attributeValue Value of attribute
2254
+ * @param attributeType Type of attribute
2255
+ * @param attributeDomain Domain info for attribute, if any
2256
+ * @return Attribute value modified appropriate to domain and type
2257
+ */
2258
+ function _prepareAttributeValue(attributeValue, attributeType, attributeDomain, intl) {
2259
+ if (attributeDomain && attributeDomain.type === "coded-value") {
2260
+ // "coded-value" domain field
2261
+ const value = attributeDomain.getName(attributeValue);
2262
+ return value;
2263
+ }
2264
+ else {
2265
+ // Non-domain field or unsupported domain type
2266
+ let value = attributeValue;
2267
+ switch (attributeType) {
2268
+ case "date":
2269
+ // Format date produces odd characters for the space between the time and the AM/PM text,
2270
+ // e.g., "12/31/1969, 4:00 PM"
2271
+ value = intl.formatDate(value).replace(/\xe2\x80\xaf/g, "");
2272
+ break;
2273
+ case "double":
2274
+ case "integer":
2275
+ case "long":
2276
+ case "small-integer":
2277
+ value = intl.formatNumber(value);
2278
+ break;
2279
+ }
2280
+ return value;
2281
+ }
2282
+ }
2247
2283
  /**
2248
2284
  * Creates labels from items.
2249
2285
  *
@@ -2260,6 +2296,13 @@ async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLa
2260
2296
  const [intl] = await loadModules(["esri/intl"]);
2261
2297
  // Get the features to export
2262
2298
  const featureSet = await queryFeaturesByID(ids, layer);
2299
+ // Get field data types. Do we have any domain-based fields?
2300
+ const attributeTypes = {};
2301
+ const attributeDomains = {};
2302
+ layer.fields.forEach(field => {
2303
+ attributeTypes[field.name] = field.type;
2304
+ attributeDomains[field.name] = field.domain;
2305
+ });
2263
2306
  // Get the label formatting, if any
2264
2307
  let labelFormat;
2265
2308
  let arcadeExecutors = {};
@@ -2273,7 +2316,7 @@ async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLa
2273
2316
  // Can we use the popup title?
2274
2317
  // eslint-disable-next-line unicorn/prefer-ternary
2275
2318
  if (typeof layer.popupTemplate.title === "string") {
2276
- labelFormat = [layer.popupTemplate.title];
2319
+ labelFormat = layer.popupTemplate.title;
2277
2320
  // Otherwise revert to using attributes
2278
2321
  }
2279
2322
  else {
@@ -2292,35 +2335,43 @@ async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLa
2292
2335
  // eslint-disable-next-line unicorn/prefer-ternary
2293
2336
  if (labelFormat) {
2294
2337
  const arcadeExpressionRegExp = /\{expression\/\w+\}/g;
2295
- // Convert attributes into an array of labels
2338
+ const attributeRegExp = /\{\w+\}/g;
2339
+ // Find the label fields that we need to replace with values
2340
+ const arcadeExpressionMatches = labelFormat.match(arcadeExpressionRegExp);
2341
+ const attributeMatches = labelFormat.match(attributeRegExp);
2342
+ // Convert feature attributes into an array of labels
2296
2343
  labels = featureSet.features.map(feature => {
2297
- const label = [];
2298
- labelFormat.forEach(labelLineTemplate => {
2299
- let labelLine = labelLineTemplate;
2300
- // Replace Arcade expressions
2301
- const arcadeExpressionsMatches = labelLine.match(arcadeExpressionRegExp);
2302
- if (arcadeExpressionsMatches) {
2303
- arcadeExpressionsMatches.forEach((match) => {
2304
- const expressionName = match.substring(match.indexOf("/") + 1, match.length - 1);
2305
- const replacement = arcadeExecutors[expressionName].execute({ "$feature": feature });
2306
- labelLine = labelLine.replace(match, replacement);
2307
- });
2308
- }
2309
- // Replace fields; must be done after Arcade check because `substitute` will discard Arcade expressions!
2310
- labelLine = intl.substitute(labelLine, feature.attributes).trim();
2311
- if (labelLine.length > 0) {
2312
- label.push(labelLine);
2313
- }
2314
- });
2344
+ let labelPrep = labelFormat;
2345
+ // Replace Arcade expressions
2346
+ if (arcadeExpressionMatches) {
2347
+ arcadeExpressionMatches.forEach((match) => {
2348
+ const expressionName = match.substring(match.indexOf("/") + 1, match.length - 1);
2349
+ const value = arcadeExecutors[expressionName].execute({ "$feature": feature });
2350
+ labelPrep = labelPrep.replace(match, value);
2351
+ });
2352
+ }
2353
+ // Replace non-Arcade fields
2354
+ if (attributeMatches) {
2355
+ attributeMatches.forEach((match) => {
2356
+ const attributeName = match.substring(1, match.length - 1);
2357
+ const value = _prepareAttributeValue(feature.attributes[attributeName], attributeTypes[attributeName], attributeDomains[attributeName], intl);
2358
+ labelPrep = labelPrep.replace(match, value);
2359
+ });
2360
+ }
2361
+ // Split label into lines
2362
+ let label = labelPrep.split(lineSeparatorChar);
2363
+ // Trim lines
2364
+ label = label.map(line => line.trim());
2315
2365
  return label;
2316
- })
2317
- // Remove empty labels
2318
- .filter(label => label.length > 0);
2366
+ });
2319
2367
  }
2320
2368
  else {
2321
2369
  // Export all attributes
2322
2370
  labels = featureSet.features.map(feature => {
2323
- return Object.values(feature.attributes).map(attribute => `${attribute}`);
2371
+ return Object.keys(feature.attributes).map((attributeName) => {
2372
+ const value = _prepareAttributeValue(feature.attributes[attributeName], attributeTypes[attributeName], attributeDomains[attributeName], intl);
2373
+ return `${value}`;
2374
+ });
2324
2375
  });
2325
2376
  }
2326
2377
  // Remove duplicates
@@ -2333,14 +2384,12 @@ async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLa
2333
2384
  if (includeHeaderNames) {
2334
2385
  let headerNames = [];
2335
2386
  if (labelFormat) {
2336
- headerNames = labelFormat.map(labelFormatLine => labelFormatLine.replace(/\{/g, "").replace(/\}/g, ""));
2387
+ headerNames = labelFormat.replace(/\{/g, "").replace(/\}/g, "").split(lineSeparatorChar);
2337
2388
  }
2338
2389
  else {
2339
2390
  const featuresAttrs = featureSet.features[0].attributes;
2340
2391
  Object.keys(featuresAttrs).forEach(k => {
2341
- if (featuresAttrs[0].hasOwnProperty(k)) {
2342
- headerNames.push(k);
2343
- }
2392
+ headerNames.push(k);
2344
2393
  });
2345
2394
  }
2346
2395
  labels.unshift(headerNames);
@@ -91,11 +91,6 @@ const MapSelectTools = /*@__PURE__*/ proxyCustomElement(class extends HTMLElemen
91
91
  * @returns Promise when complete
92
92
  */
93
93
  async watchSearchConfigurationHandler(newValue, oldValue) {
94
- console.log("watchSearchConfigurationHandler");
95
- console.log("newValue");
96
- console.log(newValue);
97
- console.log("oldValue");
98
- console.log(oldValue);
99
94
  if (JSON.stringify(newValue) !== JSON.stringify(oldValue)) {
100
95
  this._initSearchWidget();
101
96
  }
@@ -162,7 +157,6 @@ const MapSelectTools = /*@__PURE__*/ proxyCustomElement(class extends HTMLElemen
162
157
  * Handle changes to the search configuration
163
158
  */
164
159
  searchConfigurationChangeChanged(event) {
165
- console.log("searchConfigurationChange listener");
166
160
  this.searchConfiguration = event.detail;
167
161
  }
168
162
  /**
@@ -295,16 +289,8 @@ const MapSelectTools = /*@__PURE__*/ proxyCustomElement(class extends HTMLElemen
295
289
  * @protected
296
290
  */
297
291
  _initSearchWidget() {
298
- console.log("_initSearchWidget");
299
- console.log("this.mapView");
300
- console.log(this.mapView);
301
- console.log("this._searchElement");
302
- console.log(this._searchElement);
303
292
  if (this.mapView && this._searchElement) {
304
- console.log("this._getSearchConfig");
305
293
  const searchConfiguration = this._getSearchConfig(this.searchConfiguration, this.mapView);
306
- console.log("searchConfiguration");
307
- console.log(searchConfiguration);
308
294
  const searchOptions = Object.assign({ view: this.mapView, container: this._searchElement, searchTerm: this._searchTerm }, searchConfiguration);
309
295
  this._searchWidget = new this.Search(searchOptions);
310
296
  this._searchWidget.popupEnabled = false;
@@ -344,11 +330,9 @@ const MapSelectTools = /*@__PURE__*/ proxyCustomElement(class extends HTMLElemen
344
330
  ? view.map.findLayerById(layerSource.layer.id)
345
331
  : null;
346
332
  if (layerFromMap) {
347
- console.log("layerFromMap");
348
333
  layerSource.layer = layerFromMap;
349
334
  }
350
335
  else if ((_b = layerSource === null || layerSource === void 0 ? void 0 : layerSource.layer) === null || _b === void 0 ? void 0 : _b.url) {
351
- console.log("create new");
352
336
  layerSource.layer = new this.FeatureLayer((_c = layerSource === null || layerSource === void 0 ? void 0 : layerSource.layer) === null || _c === void 0 ? void 0 : _c.url);
353
337
  }
354
338
  }
@@ -100,17 +100,9 @@ const PublicNotification$1 = /*@__PURE__*/ proxyCustomElement(class extends HTML
100
100
  * @returns Promise when complete
101
101
  */
102
102
  async watchSearchConfigurationHandler(newValue, oldValue) {
103
- //TODO adding this here to see if its any different than having in map-select-tools
104
- // I would have thought that the prop would have made it through on the next render of map-select-tools
105
- // however we are still seeing a broken search...need to understand why and don't see a clean way to debug in devext
106
- console.log("PN watchSearchConfigurationHandler");
107
- console.log("PN newValue");
108
- console.log(newValue);
109
- console.log("PN oldValue");
110
- console.log(oldValue);
111
- if (JSON.stringify(newValue) !== JSON.stringify(oldValue)) {
112
- console.log("Emit event from parent");
113
- this._searchConfiguration = Object.assign({}, newValue);
103
+ const s_newValue = JSON.stringify(newValue);
104
+ if (s_newValue !== JSON.stringify(oldValue)) {
105
+ this._searchConfiguration = JSON.parse(s_newValue);
114
106
  this.searchConfigurationChange.emit(this._searchConfiguration);
115
107
  }
116
108
  }
@@ -12,7 +12,7 @@ import { g as goToSelection, h as highlightFeatures, d as queryObjectIds, e as g
12
12
  import { E as EWorkflowType, f as ESelectionMode, g as ERefineMode, c as ESketchType } from './interfaces-d0d83efa.js';
13
13
  import { s as state } from './publicNotificationStore-b9daaee4.js';
14
14
  import { g as getLocaleComponentStrings } from './locale-7bf10e0a.js';
15
- import { d as downloadCSV, a as downloadPDF } from './downloadUtils-8d64719e.js';
15
+ import { d as downloadCSV, a as downloadPDF } from './downloadUtils-a9b39194.js';
16
16
  import { a as getSelectionIds, g as getTotal } from './publicNotificationUtils-5cb5a607.js';
17
17
  import './resources-436ae282.js';
18
18
  import './guid-15fce7c0.js';
@@ -292,11 +292,6 @@ const MapSelectTools = class {
292
292
  * @returns Promise when complete
293
293
  */
294
294
  async watchSearchConfigurationHandler(newValue, oldValue) {
295
- console.log("watchSearchConfigurationHandler");
296
- console.log("newValue");
297
- console.log(newValue);
298
- console.log("oldValue");
299
- console.log(oldValue);
300
295
  if (JSON.stringify(newValue) !== JSON.stringify(oldValue)) {
301
296
  this._initSearchWidget();
302
297
  }
@@ -363,7 +358,6 @@ const MapSelectTools = class {
363
358
  * Handle changes to the search configuration
364
359
  */
365
360
  searchConfigurationChangeChanged(event) {
366
- console.log("searchConfigurationChange listener");
367
361
  this.searchConfiguration = event.detail;
368
362
  }
369
363
  /**
@@ -496,16 +490,8 @@ const MapSelectTools = class {
496
490
  * @protected
497
491
  */
498
492
  _initSearchWidget() {
499
- console.log("_initSearchWidget");
500
- console.log("this.mapView");
501
- console.log(this.mapView);
502
- console.log("this._searchElement");
503
- console.log(this._searchElement);
504
493
  if (this.mapView && this._searchElement) {
505
- console.log("this._getSearchConfig");
506
494
  const searchConfiguration = this._getSearchConfig(this.searchConfiguration, this.mapView);
507
- console.log("searchConfiguration");
508
- console.log(searchConfiguration);
509
495
  const searchOptions = Object.assign({ view: this.mapView, container: this._searchElement, searchTerm: this._searchTerm }, searchConfiguration);
510
496
  this._searchWidget = new this.Search(searchOptions);
511
497
  this._searchWidget.popupEnabled = false;
@@ -545,11 +531,9 @@ const MapSelectTools = class {
545
531
  ? view.map.findLayerById(layerSource.layer.id)
546
532
  : null;
547
533
  if (layerFromMap) {
548
- console.log("layerFromMap");
549
534
  layerSource.layer = layerFromMap;
550
535
  }
551
536
  else if ((_b = layerSource === null || layerSource === void 0 ? void 0 : layerSource.layer) === null || _b === void 0 ? void 0 : _b.url) {
552
- console.log("create new");
553
537
  layerSource.layer = new this.FeatureLayer((_c = layerSource === null || layerSource === void 0 ? void 0 : layerSource.layer) === null || _c === void 0 ? void 0 : _c.url);
554
538
  }
555
539
  }
@@ -1080,7 +1080,7 @@ function(t){var e=function(t){for(var e=t.length,r=new Uint8Array(e),n=0;n<e;n++
1080
1080
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1081
1081
  * ====================================================================
1082
1082
  */
1083
- function(t){function e(){return (n.canvg?Promise.resolve(n.canvg):import('./index.es-1d777745.js')).catch((function(t){return Promise.reject(new Error("Could not load canvg: "+t))})).then((function(t){return t.default?t.default:t}))}E.API.addSvgAsImage=function(t,r,n,i,o,s,c,u){if(isNaN(r)||isNaN(n))throw a.error("jsPDF.addSvgAsImage: Invalid coordinates",arguments),new Error("Invalid coordinates passed to jsPDF.addSvgAsImage");if(isNaN(i)||isNaN(o))throw a.error("jsPDF.addSvgAsImage: Invalid measurements",arguments),new Error("Invalid measurements (width and/or height) passed to jsPDF.addSvgAsImage");var h=document.createElement("canvas");h.width=i,h.height=o;var l=h.getContext("2d");l.fillStyle="#fff",l.fillRect(0,0,h.width,h.height);var f={ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0},d=this;return e().then((function(e){return e.fromString(l,t,f)}),(function(){return Promise.reject(new Error("Could not load canvg."))})).then((function(t){return t.render(f)})).then((function(){d.addImage(h.toDataURL("image/jpeg",1),r,n,i,o,c,u);}))};}(),E.API.putTotalPages=function(t){var e,r=0;parseInt(this.internal.getFont().id.substr(1),10)<15?(e=new RegExp(t,"g"),r=this.internal.getNumberOfPages()):(e=new RegExp(this.pdfEscape16(t,this.internal.getFont()),"g"),r=this.pdfEscape16(this.internal.getNumberOfPages()+"",this.internal.getFont()));for(var n=1;n<=this.internal.getNumberOfPages();n++)for(var i=0;i<this.internal.pages[n].length;i++)this.internal.pages[n][i]=this.internal.pages[n][i].replace(e,r);return this},E.API.viewerPreferences=function(e,r){var n;e=e||{},r=r||!1;var i,a,o,s={HideToolbar:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},HideMenubar:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},HideWindowUI:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},FitWindow:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},CenterWindow:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},DisplayDocTitle:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.4},NonFullScreenPageMode:{defaultValue:"UseNone",value:"UseNone",type:"name",explicitSet:!1,valueSet:["UseNone","UseOutlines","UseThumbs","UseOC"],pdfVersion:1.3},Direction:{defaultValue:"L2R",value:"L2R",type:"name",explicitSet:!1,valueSet:["L2R","R2L"],pdfVersion:1.3},ViewArea:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},ViewClip:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintArea:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintClip:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintScaling:{defaultValue:"AppDefault",value:"AppDefault",type:"name",explicitSet:!1,valueSet:["AppDefault","None"],pdfVersion:1.6},Duplex:{defaultValue:"",value:"none",type:"name",explicitSet:!1,valueSet:["Simplex","DuplexFlipShortEdge","DuplexFlipLongEdge","none"],pdfVersion:1.7},PickTrayByPDFSize:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.7},PrintPageRange:{defaultValue:"",value:"",type:"array",explicitSet:!1,valueSet:null,pdfVersion:1.7},NumCopies:{defaultValue:1,value:1,type:"integer",explicitSet:!1,valueSet:null,pdfVersion:1.7}},c=Object.keys(s),u=[],h=0,l=0,f=0;function d(t,e){var r,n=!1;for(r=0;r<t.length;r+=1)t[r]===e&&(n=!0);return n}if(void 0===this.internal.viewerpreferences&&(this.internal.viewerpreferences={},this.internal.viewerpreferences.configuration=JSON.parse(JSON.stringify(s)),this.internal.viewerpreferences.isSubscribed=!1),n=this.internal.viewerpreferences.configuration,"reset"===e||!0===r){var p=c.length;for(f=0;f<p;f+=1)n[c[f]].value=n[c[f]].defaultValue,n[c[f]].explicitSet=!1;}if("object"===t(e))for(a in e)if(o=e[a],d(c,a)&&void 0!==o){if("boolean"===n[a].type&&"boolean"==typeof o)n[a].value=o;else if("name"===n[a].type&&d(n[a].valueSet,o))n[a].value=o;else if("integer"===n[a].type&&Number.isInteger(o))n[a].value=o;else if("array"===n[a].type){for(h=0;h<o.length;h+=1)if(i=!0,1===o[h].length&&"number"==typeof o[h][0])u.push(String(o[h]-1));else if(o[h].length>1){for(l=0;l<o[h].length;l+=1)"number"!=typeof o[h][l]&&(i=!1);!0===i&&u.push([o[h][0]-1,o[h][1]-1].join(" "));}n[a].value="["+u.join(" ")+"]";}else n[a].value=n[a].defaultValue;n[a].explicitSet=!0;}return !1===this.internal.viewerpreferences.isSubscribed&&(this.internal.events.subscribe("putCatalog",(function(){var t,e=[];for(t in n)!0===n[t].explicitSet&&("name"===n[t].type?e.push("/"+t+" /"+n[t].value):e.push("/"+t+" "+n[t].value));0!==e.length&&this.internal.write("/ViewerPreferences\n<<\n"+e.join("\n")+"\n>>");})),this.internal.viewerpreferences.isSubscribed=!0),this.internal.viewerpreferences.configuration=n,this},
1083
+ function(t){function e(){return (n.canvg?Promise.resolve(n.canvg):import('./index.es-4904465f.js')).catch((function(t){return Promise.reject(new Error("Could not load canvg: "+t))})).then((function(t){return t.default?t.default:t}))}E.API.addSvgAsImage=function(t,r,n,i,o,s,c,u){if(isNaN(r)||isNaN(n))throw a.error("jsPDF.addSvgAsImage: Invalid coordinates",arguments),new Error("Invalid coordinates passed to jsPDF.addSvgAsImage");if(isNaN(i)||isNaN(o))throw a.error("jsPDF.addSvgAsImage: Invalid measurements",arguments),new Error("Invalid measurements (width and/or height) passed to jsPDF.addSvgAsImage");var h=document.createElement("canvas");h.width=i,h.height=o;var l=h.getContext("2d");l.fillStyle="#fff",l.fillRect(0,0,h.width,h.height);var f={ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0},d=this;return e().then((function(e){return e.fromString(l,t,f)}),(function(){return Promise.reject(new Error("Could not load canvg."))})).then((function(t){return t.render(f)})).then((function(){d.addImage(h.toDataURL("image/jpeg",1),r,n,i,o,c,u);}))};}(),E.API.putTotalPages=function(t){var e,r=0;parseInt(this.internal.getFont().id.substr(1),10)<15?(e=new RegExp(t,"g"),r=this.internal.getNumberOfPages()):(e=new RegExp(this.pdfEscape16(t,this.internal.getFont()),"g"),r=this.pdfEscape16(this.internal.getNumberOfPages()+"",this.internal.getFont()));for(var n=1;n<=this.internal.getNumberOfPages();n++)for(var i=0;i<this.internal.pages[n].length;i++)this.internal.pages[n][i]=this.internal.pages[n][i].replace(e,r);return this},E.API.viewerPreferences=function(e,r){var n;e=e||{},r=r||!1;var i,a,o,s={HideToolbar:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},HideMenubar:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},HideWindowUI:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},FitWindow:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},CenterWindow:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},DisplayDocTitle:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.4},NonFullScreenPageMode:{defaultValue:"UseNone",value:"UseNone",type:"name",explicitSet:!1,valueSet:["UseNone","UseOutlines","UseThumbs","UseOC"],pdfVersion:1.3},Direction:{defaultValue:"L2R",value:"L2R",type:"name",explicitSet:!1,valueSet:["L2R","R2L"],pdfVersion:1.3},ViewArea:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},ViewClip:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintArea:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintClip:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintScaling:{defaultValue:"AppDefault",value:"AppDefault",type:"name",explicitSet:!1,valueSet:["AppDefault","None"],pdfVersion:1.6},Duplex:{defaultValue:"",value:"none",type:"name",explicitSet:!1,valueSet:["Simplex","DuplexFlipShortEdge","DuplexFlipLongEdge","none"],pdfVersion:1.7},PickTrayByPDFSize:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.7},PrintPageRange:{defaultValue:"",value:"",type:"array",explicitSet:!1,valueSet:null,pdfVersion:1.7},NumCopies:{defaultValue:1,value:1,type:"integer",explicitSet:!1,valueSet:null,pdfVersion:1.7}},c=Object.keys(s),u=[],h=0,l=0,f=0;function d(t,e){var r,n=!1;for(r=0;r<t.length;r+=1)t[r]===e&&(n=!0);return n}if(void 0===this.internal.viewerpreferences&&(this.internal.viewerpreferences={},this.internal.viewerpreferences.configuration=JSON.parse(JSON.stringify(s)),this.internal.viewerpreferences.isSubscribed=!1),n=this.internal.viewerpreferences.configuration,"reset"===e||!0===r){var p=c.length;for(f=0;f<p;f+=1)n[c[f]].value=n[c[f]].defaultValue,n[c[f]].explicitSet=!1;}if("object"===t(e))for(a in e)if(o=e[a],d(c,a)&&void 0!==o){if("boolean"===n[a].type&&"boolean"==typeof o)n[a].value=o;else if("name"===n[a].type&&d(n[a].valueSet,o))n[a].value=o;else if("integer"===n[a].type&&Number.isInteger(o))n[a].value=o;else if("array"===n[a].type){for(h=0;h<o.length;h+=1)if(i=!0,1===o[h].length&&"number"==typeof o[h][0])u.push(String(o[h]-1));else if(o[h].length>1){for(l=0;l<o[h].length;l+=1)"number"!=typeof o[h][l]&&(i=!1);!0===i&&u.push([o[h][0]-1,o[h][1]-1].join(" "));}n[a].value="["+u.join(" ")+"]";}else n[a].value=n[a].defaultValue;n[a].explicitSet=!0;}return !1===this.internal.viewerpreferences.isSubscribed&&(this.internal.events.subscribe("putCatalog",(function(){var t,e=[];for(t in n)!0===n[t].explicitSet&&("name"===n[t].type?e.push("/"+t+" /"+n[t].value):e.push("/"+t+" "+n[t].value));0!==e.length&&this.internal.write("/ViewerPreferences\n<<\n"+e.join("\n")+"\n>>");})),this.internal.viewerpreferences.isSubscribed=!0),this.internal.viewerpreferences.configuration=n,this},
1084
1084
  /** ====================================================================
1085
1085
  * @license
1086
1086
  * jsPDF XMP metadata plugin
@@ -2122,6 +2122,7 @@ function _downloadPDFFile(labels, labelPageDescription, fileTitle) {
2122
2122
  * See the License for the specific language governing permissions and
2123
2123
  * limitations under the License.
2124
2124
  */
2125
+ const lineSeparatorChar = "|";
2125
2126
  //#endregion
2126
2127
  //#region Public functions
2127
2128
  /**
@@ -2154,7 +2155,12 @@ async function downloadCSV(selectionSetNames, layer, ids, formatUsingLayerPopup,
2154
2155
  */
2155
2156
  async function downloadPDF(selectionSetNames, layer, ids, removeDuplicates, labelPageDescription) {
2156
2157
  console.log("downloadPDF using selectionSetNames " + JSON.stringify(selectionSetNames)); //???
2157
- const labels = await _prepareLabels(layer, ids, removeDuplicates);
2158
+ let labels = await _prepareLabels(layer, ids, removeDuplicates);
2159
+ labels =
2160
+ // Remove empty lines in labels
2161
+ labels.map(labelLines => labelLines.filter(line => line.length > 0))
2162
+ // Remove empty labels
2163
+ .filter(label => label.length > 0);
2158
2164
  exportPDF(labels, labelPageDescription);
2159
2165
  return Promise.resolve();
2160
2166
  }
@@ -2165,7 +2171,7 @@ async function downloadPDF(selectionSetNames, layer, ids, removeDuplicates, labe
2165
2171
  *
2166
2172
  * @param fieldInfos Layer's fieldInfos structure
2167
2173
  * @param bypassFieldVisiblity Indicates if the configured fieldInfo visibility property should be ignored
2168
- * @return Label spec
2174
+ * @return Label spec with lines separated by `lineSeparatorChar`
2169
2175
  */
2170
2176
  function _convertPopupFieldsToLabelSpec(fieldInfos, bypassFieldVisiblity = false) {
2171
2177
  const labelSpec = [];
@@ -2175,7 +2181,7 @@ function _convertPopupFieldsToLabelSpec(fieldInfos, bypassFieldVisiblity = false
2175
2181
  labelSpec.push(`{${fieldInfo.fieldName}}`);
2176
2182
  }
2177
2183
  });
2178
- return labelSpec;
2184
+ return labelSpec.join(lineSeparatorChar);
2179
2185
  }
2180
2186
  /**
2181
2187
  * Converts the text of a custom popup into a multiline label specification; conversion splits text into
@@ -2183,22 +2189,19 @@ function _convertPopupFieldsToLabelSpec(fieldInfos, bypassFieldVisiblity = false
2183
2189
  *
2184
2190
  * @param popupInfo Layer's popupInfo structure containing description, fieldInfos, and expressionInfos, e.g.,
2185
2191
  * "<div style='text-align: left;'>{NAME}<br />{STREET}<br />{CITY}, {STATE} {ZIP} <br /></div>"
2186
- * @return Label spec
2192
+ * @return Label spec with lines separated by `lineSeparatorChar`
2187
2193
  */
2188
2194
  function _convertPopupTextToLabelSpec(popupInfo) {
2189
- // Replace <br>, <br/> with |
2190
- popupInfo = popupInfo.replace(/<br\s*\/?>/gi, "|");
2191
- // Remove remaining HTML tags, replace 0xA0 that popup uses for spaces, replace some char representations,
2195
+ // Replace <br>, <br/> with the line separator character
2196
+ popupInfo = popupInfo.replace(/<br\s*\/?>/gi, lineSeparatorChar);
2197
+ // Remove remaining HTML tags, replace 0xA0 that popup uses for spaces, and replace some char representations,
2192
2198
  // and split the label back into individual lines
2193
- let labelSpec = popupInfo
2199
+ const labelSpec = popupInfo
2194
2200
  .replace(/<[\s.]*[^<>]*\/?>/gi, "")
2195
2201
  .replace(/\xA0/gi, " ")
2196
2202
  .replace(/&lt;/gi, "<")
2197
2203
  .replace(/&gt;/gi, ">")
2198
- .replace(/&nbsp;/gi, " ")
2199
- .split("|");
2200
- // Trim lines and remove empties
2201
- labelSpec = labelSpec.map(line => line.trim()).filter(line => line.length > 0);
2204
+ .replace(/&nbsp;/gi, " ");
2202
2205
  return labelSpec;
2203
2206
  }
2204
2207
  /**
@@ -2217,7 +2220,7 @@ async function _createArcadeExecutors(labelFormat, layer) {
2217
2220
  }
2218
2221
  // Are there any Arcade expressions in the label format?
2219
2222
  const arcadeExpressionRegExp = /\{expression\/\w+\}/g;
2220
- const arcadeExpressionsMatches = labelFormat.join("|").match(arcadeExpressionRegExp);
2223
+ const arcadeExpressionsMatches = labelFormat.match(arcadeExpressionRegExp);
2221
2224
  if (!arcadeExpressionsMatches) {
2222
2225
  return Promise.resolve(arcadeExecutors);
2223
2226
  }
@@ -2244,6 +2247,39 @@ async function _createArcadeExecutors(labelFormat, layer) {
2244
2247
  return arcadeExecutors;
2245
2248
  });
2246
2249
  }
2250
+ /**
2251
+ * Prepares an attribute's value by applying domain and type information.
2252
+ *
2253
+ * @param attributeValue Value of attribute
2254
+ * @param attributeType Type of attribute
2255
+ * @param attributeDomain Domain info for attribute, if any
2256
+ * @return Attribute value modified appropriate to domain and type
2257
+ */
2258
+ function _prepareAttributeValue(attributeValue, attributeType, attributeDomain, intl) {
2259
+ if (attributeDomain && attributeDomain.type === "coded-value") {
2260
+ // "coded-value" domain field
2261
+ const value = attributeDomain.getName(attributeValue);
2262
+ return value;
2263
+ }
2264
+ else {
2265
+ // Non-domain field or unsupported domain type
2266
+ let value = attributeValue;
2267
+ switch (attributeType) {
2268
+ case "date":
2269
+ // Format date produces odd characters for the space between the time and the AM/PM text,
2270
+ // e.g., "12/31/1969, 4:00 PM"
2271
+ value = intl.formatDate(value).replace(/\xe2\x80\xaf/g, "");
2272
+ break;
2273
+ case "double":
2274
+ case "integer":
2275
+ case "long":
2276
+ case "small-integer":
2277
+ value = intl.formatNumber(value);
2278
+ break;
2279
+ }
2280
+ return value;
2281
+ }
2282
+ }
2247
2283
  /**
2248
2284
  * Creates labels from items.
2249
2285
  *
@@ -2260,6 +2296,13 @@ async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLa
2260
2296
  const [intl] = await loadModules(["esri/intl"]);
2261
2297
  // Get the features to export
2262
2298
  const featureSet = await queryFeaturesByID(ids, layer);
2299
+ // Get field data types. Do we have any domain-based fields?
2300
+ const attributeTypes = {};
2301
+ const attributeDomains = {};
2302
+ layer.fields.forEach(field => {
2303
+ attributeTypes[field.name] = field.type;
2304
+ attributeDomains[field.name] = field.domain;
2305
+ });
2263
2306
  // Get the label formatting, if any
2264
2307
  let labelFormat;
2265
2308
  let arcadeExecutors = {};
@@ -2273,7 +2316,7 @@ async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLa
2273
2316
  // Can we use the popup title?
2274
2317
  // eslint-disable-next-line unicorn/prefer-ternary
2275
2318
  if (typeof layer.popupTemplate.title === "string") {
2276
- labelFormat = [layer.popupTemplate.title];
2319
+ labelFormat = layer.popupTemplate.title;
2277
2320
  // Otherwise revert to using attributes
2278
2321
  }
2279
2322
  else {
@@ -2292,35 +2335,43 @@ async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLa
2292
2335
  // eslint-disable-next-line unicorn/prefer-ternary
2293
2336
  if (labelFormat) {
2294
2337
  const arcadeExpressionRegExp = /\{expression\/\w+\}/g;
2295
- // Convert attributes into an array of labels
2338
+ const attributeRegExp = /\{\w+\}/g;
2339
+ // Find the label fields that we need to replace with values
2340
+ const arcadeExpressionMatches = labelFormat.match(arcadeExpressionRegExp);
2341
+ const attributeMatches = labelFormat.match(attributeRegExp);
2342
+ // Convert feature attributes into an array of labels
2296
2343
  labels = featureSet.features.map(feature => {
2297
- const label = [];
2298
- labelFormat.forEach(labelLineTemplate => {
2299
- let labelLine = labelLineTemplate;
2300
- // Replace Arcade expressions
2301
- const arcadeExpressionsMatches = labelLine.match(arcadeExpressionRegExp);
2302
- if (arcadeExpressionsMatches) {
2303
- arcadeExpressionsMatches.forEach((match) => {
2304
- const expressionName = match.substring(match.indexOf("/") + 1, match.length - 1);
2305
- const replacement = arcadeExecutors[expressionName].execute({ "$feature": feature });
2306
- labelLine = labelLine.replace(match, replacement);
2307
- });
2308
- }
2309
- // Replace fields; must be done after Arcade check because `substitute` will discard Arcade expressions!
2310
- labelLine = intl.substitute(labelLine, feature.attributes).trim();
2311
- if (labelLine.length > 0) {
2312
- label.push(labelLine);
2313
- }
2314
- });
2344
+ let labelPrep = labelFormat;
2345
+ // Replace Arcade expressions
2346
+ if (arcadeExpressionMatches) {
2347
+ arcadeExpressionMatches.forEach((match) => {
2348
+ const expressionName = match.substring(match.indexOf("/") + 1, match.length - 1);
2349
+ const value = arcadeExecutors[expressionName].execute({ "$feature": feature });
2350
+ labelPrep = labelPrep.replace(match, value);
2351
+ });
2352
+ }
2353
+ // Replace non-Arcade fields
2354
+ if (attributeMatches) {
2355
+ attributeMatches.forEach((match) => {
2356
+ const attributeName = match.substring(1, match.length - 1);
2357
+ const value = _prepareAttributeValue(feature.attributes[attributeName], attributeTypes[attributeName], attributeDomains[attributeName], intl);
2358
+ labelPrep = labelPrep.replace(match, value);
2359
+ });
2360
+ }
2361
+ // Split label into lines
2362
+ let label = labelPrep.split(lineSeparatorChar);
2363
+ // Trim lines
2364
+ label = label.map(line => line.trim());
2315
2365
  return label;
2316
- })
2317
- // Remove empty labels
2318
- .filter(label => label.length > 0);
2366
+ });
2319
2367
  }
2320
2368
  else {
2321
2369
  // Export all attributes
2322
2370
  labels = featureSet.features.map(feature => {
2323
- return Object.values(feature.attributes).map(attribute => `${attribute}`);
2371
+ return Object.keys(feature.attributes).map((attributeName) => {
2372
+ const value = _prepareAttributeValue(feature.attributes[attributeName], attributeTypes[attributeName], attributeDomains[attributeName], intl);
2373
+ return `${value}`;
2374
+ });
2324
2375
  });
2325
2376
  }
2326
2377
  // Remove duplicates
@@ -2333,14 +2384,12 @@ async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLa
2333
2384
  if (includeHeaderNames) {
2334
2385
  let headerNames = [];
2335
2386
  if (labelFormat) {
2336
- headerNames = labelFormat.map(labelFormatLine => labelFormatLine.replace(/\{/g, "").replace(/\}/g, ""));
2387
+ headerNames = labelFormat.replace(/\{/g, "").replace(/\}/g, "").split(lineSeparatorChar);
2337
2388
  }
2338
2389
  else {
2339
2390
  const featuresAttrs = featureSet.features[0].attributes;
2340
2391
  Object.keys(featuresAttrs).forEach(k => {
2341
- if (featuresAttrs[0].hasOwnProperty(k)) {
2342
- headerNames.push(k);
2343
- }
2392
+ headerNames.push(k);
2344
2393
  });
2345
2394
  }
2346
2395
  labels.unshift(headerNames);
@@ -4,7 +4,7 @@
4
4
  * http://www.apache.org/licenses/LICENSE-2.0
5
5
  */
6
6
  import { a as commonjsGlobal, c as createCommonjsModule, g as getDefaultExportFromCjs } from './_commonjsHelpers-d5f9d613.js';
7
- import { _ as _typeof_1 } from './downloadUtils-8d64719e.js';
7
+ import { _ as _typeof_1 } from './downloadUtils-a9b39194.js';
8
8
  import './index-c246d90e.js';
9
9
  import './loadModules-b299cd43.js';
10
10
  import './locale-7bf10e0a.js';
@@ -6,7 +6,7 @@
6
6
  import { r as registerInstance, h, H as Host, g as getElement } from './index-c246d90e.js';
7
7
  import { g as getLocaleComponentStrings } from './locale-7bf10e0a.js';
8
8
  import { g as goToSelection, a as getMapLayerView, q as queryAllFeatures } from './mapViewUtils-02696ab6.js';
9
- import { d as downloadCSV } from './downloadUtils-8d64719e.js';
9
+ import { d as downloadCSV } from './downloadUtils-a9b39194.js';
10
10
  import './_commonjsHelpers-d5f9d613.js';
11
11
  import './interfaces-d0d83efa.js';
12
12
  import './loadModules-b299cd43.js';
@@ -65,17 +65,9 @@ const PublicNotification = class {
65
65
  * @returns Promise when complete
66
66
  */
67
67
  async watchSearchConfigurationHandler(newValue, oldValue) {
68
- //TODO adding this here to see if its any different than having in map-select-tools
69
- // I would have thought that the prop would have made it through on the next render of map-select-tools
70
- // however we are still seeing a broken search...need to understand why and don't see a clean way to debug in devext
71
- console.log("PN watchSearchConfigurationHandler");
72
- console.log("PN newValue");
73
- console.log(newValue);
74
- console.log("PN oldValue");
75
- console.log(oldValue);
76
- if (JSON.stringify(newValue) !== JSON.stringify(oldValue)) {
77
- console.log("Emit event from parent");
78
- this._searchConfiguration = Object.assign({}, newValue);
68
+ const s_newValue = JSON.stringify(newValue);
69
+ if (s_newValue !== JSON.stringify(oldValue)) {
70
+ this._searchConfiguration = JSON.parse(s_newValue);
79
71
  this.searchConfigurationChange.emit(this._searchConfiguration);
80
72
  }
81
73
  }