@esri/solutions-components 0.5.7 → 0.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -24,7 +24,7 @@ const mapViewUtils = require('./mapViewUtils-c45571b9.js');
24
24
  const interfaces = require('./interfaces-842c84a1.js');
25
25
  const publicNotificationStore = require('./publicNotificationStore-cd1a32c3.js');
26
26
  const locale$1 = require('./locale-b113c6b2.js');
27
- const downloadUtils = require('./downloadUtils-06876768.js');
27
+ const downloadUtils = require('./downloadUtils-8d66f03e.js');
28
28
  require('./guid-c58d5ead.js');
29
29
  require('./key-d55baa11.js');
30
30
  require('./index-e1b1954f.js');
@@ -1507,7 +1507,7 @@ function(t){var e=function(t){for(var e=t.length,r=new Uint8Array(e),n=0;n<e;n++
1507
1507
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1508
1508
  * ====================================================================
1509
1509
  */
1510
- function(t){function e(){return (n.canvg?Promise.resolve(n.canvg):Promise.resolve().then(function () { return require('./index.es-d07646b4.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},
1510
+ function(t){function e(){return (n.canvg?Promise.resolve(n.canvg):Promise.resolve().then(function () { return require('./index.es-4f5dfcc6.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},
1511
1511
  /** ====================================================================
1512
1512
  * @license
1513
1513
  * jsPDF XMP metadata plugin
@@ -2427,6 +2427,38 @@ function _createFilename(selectionSetNames) {
2427
2427
  const title = selectionSetNames.length > 0 ? selectionSetNames.join(", ") : "download";
2428
2428
  return title;
2429
2429
  }
2430
+ /**
2431
+ * Creates relationship queries for each relationship flag in a popup.
2432
+ * @param layer Layer whose popup is to be examined
2433
+ * @return Hash of relationships by their id, or null if there are no relationship flags in the
2434
+ * popup; each relationship has the properties layer and relatedQuery for the related layer
2435
+ * and the query for that layer
2436
+ */
2437
+ function _createRelationshipQueries(layer) {
2438
+ const relationships = {};
2439
+ const relationshipFieldPattern = /\{relationships\/\d+\//gm;
2440
+ const relationshipIdPattern = /\d+/;
2441
+ // Test if this popup has any relationship references
2442
+ const matches = layer.popupTemplate.content[0].text.match(relationshipFieldPattern);
2443
+ if (matches) {
2444
+ matches.forEach(match => {
2445
+ // Add a query to a found relationship if we don't already have one
2446
+ const id = match.match(relationshipIdPattern)[0];
2447
+ if (!relationships.hasOwnProperty(id)) {
2448
+ const relatedQuery = {
2449
+ outFields: ['*'],
2450
+ relationshipId: id,
2451
+ returnGeometry: false
2452
+ };
2453
+ relationships[id] = {
2454
+ layer,
2455
+ relatedQuery
2456
+ };
2457
+ }
2458
+ });
2459
+ }
2460
+ return relationships;
2461
+ }
2430
2462
  /**
2431
2463
  * Prepares an attribute's value by applying domain and type information.
2432
2464
  *
@@ -2487,7 +2519,7 @@ function _prepareAttributeValue(attributeValue, attributeType, attributeDomain,
2487
2519
  * @returns Promise resolving when function is done
2488
2520
  */
2489
2521
  async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLayerPopup = true, includeHeaderNames = false) {
2490
- var _a, _b, _c, _d;
2522
+ var _a, _b, _c, _d, _e, _f;
2491
2523
  const [intl] = await loadModules.loadModules(["esri/intl"]);
2492
2524
  // Get the features to export
2493
2525
  const featureSet = await mapViewUtils.queryFeaturesByID(ids, layer);
@@ -2501,6 +2533,7 @@ async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLa
2501
2533
  const attributeFormats = {};
2502
2534
  // Get the label formatting, if any
2503
2535
  let labelFormat;
2536
+ let relationshipQueries = {};
2504
2537
  let arcadeExecutors = {};
2505
2538
  if (layer.popupEnabled) {
2506
2539
  layer.popupTemplate.fieldInfos.forEach(
@@ -2529,6 +2562,8 @@ async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLa
2529
2562
  }
2530
2563
  else if (formatUsingLayerPopup && ((_d = (_c = layer.popupTemplate) === null || _c === void 0 ? void 0 : _c.content[0]) === null || _d === void 0 ? void 0 : _d.type) === "text") {
2531
2564
  labelFormat = _convertPopupTextToLabelSpec(layer.popupTemplate.content[0].text);
2565
+ // Do we need any relationship queries?
2566
+ relationshipQueries = _createRelationshipQueries(layer);
2532
2567
  // Do we need any Arcade executors?
2533
2568
  arcadeExecutors = await _createArcadeExecutors(labelFormat, layer);
2534
2569
  }
@@ -2537,36 +2572,75 @@ async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLa
2537
2572
  let labels;
2538
2573
  // eslint-disable-next-line unicorn/prefer-ternary
2539
2574
  if (labelFormat) {
2575
+ console.log("labelFormat", labelFormat); //???
2540
2576
  const arcadeExpressionRegExp = /\{expression\/\w+\}/g;
2541
2577
  const attributeRegExp = /\{\w+\}/g;
2542
2578
  // Find the label fields that we need to replace with values
2543
- const arcadeExpressionMatches = labelFormat.match(arcadeExpressionRegExp);
2544
- const attributeMatches = labelFormat.match(attributeRegExp);
2579
+ const arcadeExpressionMatches = (_e = labelFormat.match(arcadeExpressionRegExp)) !== null && _e !== void 0 ? _e : [];
2580
+ const attributeMatches = (_f = labelFormat.match(attributeRegExp)) !== null && _f !== void 0 ? _f : [];
2545
2581
  // Convert feature attributes into an array of labels
2546
- labels = featureSet.features.map(feature => {
2582
+ const relationshipKeys = Object.keys(relationshipQueries);
2583
+ labels = await Promise.all(featureSet.features.map(async (feature) => {
2547
2584
  let labelPrep = labelFormat;
2548
- // Replace Arcade expressions
2549
- if (arcadeExpressionMatches) {
2550
- arcadeExpressionMatches.forEach((match) => {
2551
- const expressionName = match.substring(match.indexOf("/") + 1, match.length - 1);
2552
- const value = arcadeExecutors[expressionName].execute({ "$feature": feature });
2553
- labelPrep = labelPrep.replace(match, value);
2554
- });
2555
- }
2556
- // Replace non-Arcade fields
2557
- if (attributeMatches) {
2558
- attributeMatches.forEach((match) => {
2559
- const attributeName = match.substring(1, match.length - 1);
2560
- const value = _prepareAttributeValue(feature.attributes[attributeName], attributeTypes[attributeName], attributeDomains[attributeName], attributeFormats[attributeName], intl);
2561
- labelPrep = labelPrep.replace(match, value);
2585
+ // Replace Arcade expressions in this feature
2586
+ arcadeExpressionMatches.forEach((match) => {
2587
+ const expressionName = match.substring(match.indexOf("/") + 1, match.length - 1);
2588
+ const value = arcadeExecutors[expressionName].execute({ "$feature": feature });
2589
+ labelPrep = labelPrep.replace(match, value);
2590
+ });
2591
+ // Replace relationship expressions in this feature
2592
+ const relatedFeatureQueries = [];
2593
+ const relationshipIds = [];
2594
+ relationshipKeys.forEach((relationshipId) => {
2595
+ const relationship = relationshipQueries[relationshipId];
2596
+ const objectId = feature.attributes[relationship.layer.objectIdField];
2597
+ const relatedQuery = Object.assign(Object.assign({}, relationship.relatedQuery), { objectIds: [objectId] });
2598
+ relatedFeatureQueries.push(relationship.layer.queryRelatedFeatures(relatedQuery));
2599
+ relationshipIds.push(relationshipId);
2600
+ });
2601
+ // Wait for all of the queries for related records for this label
2602
+ const relatedFeatureQueryResults = await Promise.all(relatedFeatureQueries);
2603
+ console.log("relatedFeatureQueryResults", relatedFeatureQueryResults); //???
2604
+ relatedFeatureQueryResults.forEach((relatedFeatureQueryResult, i) => {
2605
+ // We have an object with FeatureSets grouped by source layer or table objectIds
2606
+ const relationshipId = relationshipIds[i];
2607
+ console.log("relationshipId", relationshipId); //???
2608
+ console.log("relatedFeatureQueryResult", relatedFeatureQueryResult); //???
2609
+ // Run through the source layer or table objectIds
2610
+ Object.keys(relatedFeatureQueryResult).forEach(relatedFeatureSetId => {
2611
+ console.log("relatedFeatureSetId", relatedFeatureSetId); //???
2612
+ // We have a feature set
2613
+ const relatedFeatures = relatedFeatureQueryResult[relatedFeatureSetId].features;
2614
+ console.log("relatedFeatures", relatedFeatures); //???
2615
+ // Get the values from each feature and replace them in the label
2616
+ relatedFeatures.forEach(feature => {
2617
+ // Merge the base and related feature attributes and create the label
2618
+ // Prefix related feature's attributes with "relationships/<id>/" to match popup
2619
+ const rePrefix = "\{relationships/" + relationshipId + "/";
2620
+ const reSuffix = "\}";
2621
+ console.log("/rePrefix + attributeName + reSuffix/g", rePrefix + "attributeName" + reSuffix); //???
2622
+ const attributes = feature.attributes;
2623
+ Object.keys(attributes).forEach(attributeName => {
2624
+ console.log("/rePrefix + attributeName + reSuffix/g", rePrefix + attributeName + reSuffix); //???
2625
+ // Replace the value using the attribute name as a relationship
2626
+ const attributeRelationshipRegExp = new RegExp(rePrefix + attributeName + reSuffix, "g");
2627
+ labelPrep = labelPrep.replaceAll(attributeRelationshipRegExp, attributes[attributeName]);
2628
+ });
2629
+ });
2562
2630
  });
2563
- }
2631
+ });
2632
+ // Replace non-Arcade fields in this feature
2633
+ attributeMatches.forEach((match) => {
2634
+ const attributeName = match.substring(1, match.length - 1);
2635
+ const value = _prepareAttributeValue(feature.attributes[attributeName], attributeTypes[attributeName], attributeDomains[attributeName], attributeFormats[attributeName], intl);
2636
+ labelPrep = labelPrep.replace(match, value);
2637
+ });
2564
2638
  // Split label into lines
2565
2639
  let label = labelPrep.split(lineSeparatorChar);
2566
2640
  // Trim lines
2567
2641
  label = label.map(line => line.trim());
2568
2642
  return label;
2569
- });
2643
+ }));
2570
2644
  }
2571
2645
  else {
2572
2646
  // Export all attributes
@@ -6,7 +6,7 @@
6
6
  'use strict';
7
7
 
8
8
  const _commonjsHelpers = require('./_commonjsHelpers-384729db.js');
9
- const downloadUtils = require('./downloadUtils-06876768.js');
9
+ const downloadUtils = require('./downloadUtils-8d66f03e.js');
10
10
  require('./index-6654298b.js');
11
11
  require('./loadModules-ae7715f2.js');
12
12
  require('./locale-b113c6b2.js');
@@ -11,7 +11,7 @@ const index = require('./index-6654298b.js');
11
11
  const loadModules = require('./loadModules-ae7715f2.js');
12
12
  const locale = require('./locale-b113c6b2.js');
13
13
  const mapViewUtils = require('./mapViewUtils-c45571b9.js');
14
- const downloadUtils = require('./downloadUtils-06876768.js');
14
+ const downloadUtils = require('./downloadUtils-8d66f03e.js');
15
15
  const interfaces = require('./interfaces-842c84a1.js');
16
16
  require('./_commonjsHelpers-384729db.js');
17
17
 
@@ -1,86 +1,86 @@
1
- /** @license
2
- * Copyright 2022 Esri
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
-
17
- :host {
18
- display: block;
19
- }
20
-
21
- .div-visible {
22
- display: inherit;
23
- }
24
-
25
- .div-not-visible {
26
- display: none !important;
27
- }
28
-
29
- .padding-top-1-2 {
30
- padding-top: .5rem;
31
- }
32
-
33
- .main-label {
34
- display: flex;
35
- float: left;
36
- }
37
-
38
- html[dir="rtl"] .main-label {
39
- display: flex;
40
- float: right;
41
- }
42
-
43
- .border {
44
- outline: 1px solid var(--calcite-ui-border-input);
45
- }
46
-
47
- .margin-top-1 {
48
- margin-top: 1rem;
49
- }
50
-
51
- /* COPY FROM JS */
52
- .esri-sketch {
53
- display: flex;
54
- flex-flow: column wrap;
55
- }
56
-
57
- .esri-widget {
58
- box-sizing: border-box;
59
- color: #323232;
60
- font-size: 14px;
61
- font-family: "Avenir Next","Helvetica Neue",Helvetica,Arial,sans-serif;
62
- line-height: 1.3em;
63
- background-color: var(--calcite-ui-foreground-1);
64
- }
65
-
66
- /* DIV CHILD */
67
- .esri-sketch__panel {
68
- align-items: center;
69
- display: flex;
70
- flex-flow: row nowrap;
71
- padding: 0;
72
- } */
73
-
74
- /* DIV CHILD CHILD */
75
- .esri-sketch__tool-section {
76
- border-right: 1px solid rgba(110,110,110,.3);
77
- }
78
-
79
- .esri-sketch__section {
80
- align-items: center;
81
- display: flex;
82
- flex-flow: row nowrap;
83
- padding: 0 7px;
84
- margin: 6px 0;
85
- border-right: 1px solid rgba(110,110,110,.3);
1
+ /** @license
2
+ * Copyright 2022 Esri
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ :host {
18
+ display: block;
19
+ }
20
+
21
+ .div-visible {
22
+ display: inherit;
23
+ }
24
+
25
+ .div-not-visible {
26
+ display: none !important;
27
+ }
28
+
29
+ .padding-top-1-2 {
30
+ padding-top: .5rem;
31
+ }
32
+
33
+ .main-label {
34
+ display: flex;
35
+ float: left;
36
+ }
37
+
38
+ html[dir="rtl"] .main-label {
39
+ display: flex;
40
+ float: right;
41
+ }
42
+
43
+ .border {
44
+ outline: 1px solid var(--calcite-ui-border-input);
45
+ }
46
+
47
+ .margin-top-1 {
48
+ margin-top: 1rem;
49
+ }
50
+
51
+ /* COPY FROM JS */
52
+ .esri-sketch {
53
+ display: flex;
54
+ flex-flow: column wrap;
55
+ }
56
+
57
+ .esri-widget {
58
+ box-sizing: border-box;
59
+ color: #323232;
60
+ font-size: 14px;
61
+ font-family: "Avenir Next","Helvetica Neue",Helvetica,Arial,sans-serif;
62
+ line-height: 1.3em;
63
+ background-color: var(--calcite-ui-foreground-1);
64
+ }
65
+
66
+ /* DIV CHILD */
67
+ .esri-sketch__panel {
68
+ align-items: center;
69
+ display: flex;
70
+ flex-flow: row nowrap;
71
+ padding: 0;
72
+ } */
73
+
74
+ /* DIV CHILD CHILD */
75
+ .esri-sketch__tool-section {
76
+ border-right: 1px solid rgba(110,110,110,.3);
77
+ }
78
+
79
+ .esri-sketch__section {
80
+ align-items: center;
81
+ display: flex;
82
+ flex-flow: row nowrap;
83
+ padding: 0 7px;
84
+ margin: 6px 0;
85
+ border-right: 1px solid rgba(110,110,110,.3);
86
86
  }
@@ -196,6 +196,38 @@ export function _createFilename(selectionSetNames) {
196
196
  const title = selectionSetNames.length > 0 ? selectionSetNames.join(", ") : "download";
197
197
  return title;
198
198
  }
199
+ /**
200
+ * Creates relationship queries for each relationship flag in a popup.
201
+ * @param layer Layer whose popup is to be examined
202
+ * @return Hash of relationships by their id, or null if there are no relationship flags in the
203
+ * popup; each relationship has the properties layer and relatedQuery for the related layer
204
+ * and the query for that layer
205
+ */
206
+ export function _createRelationshipQueries(layer) {
207
+ const relationships = {};
208
+ const relationshipFieldPattern = /\{relationships\/\d+\//gm;
209
+ const relationshipIdPattern = /\d+/;
210
+ // Test if this popup has any relationship references
211
+ const matches = layer.popupTemplate.content[0].text.match(relationshipFieldPattern);
212
+ if (matches) {
213
+ matches.forEach(match => {
214
+ // Add a query to a found relationship if we don't already have one
215
+ const id = match.match(relationshipIdPattern)[0];
216
+ if (!relationships.hasOwnProperty(id)) {
217
+ const relatedQuery = {
218
+ outFields: ['*'],
219
+ relationshipId: id,
220
+ returnGeometry: false
221
+ };
222
+ relationships[id] = {
223
+ layer,
224
+ relatedQuery
225
+ };
226
+ }
227
+ });
228
+ }
229
+ return relationships;
230
+ }
199
231
  /**
200
232
  * Prepares an attribute's value by applying domain and type information.
201
233
  *
@@ -256,7 +288,7 @@ function _prepareAttributeValue(attributeValue, attributeType, attributeDomain,
256
288
  * @returns Promise resolving when function is done
257
289
  */
258
290
  async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLayerPopup = true, includeHeaderNames = false) {
259
- var _a, _b, _c, _d;
291
+ var _a, _b, _c, _d, _e, _f;
260
292
  const [intl] = await loadModules(["esri/intl"]);
261
293
  // Get the features to export
262
294
  const featureSet = await queryFeaturesByID(ids, layer);
@@ -270,6 +302,7 @@ async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLa
270
302
  const attributeFormats = {};
271
303
  // Get the label formatting, if any
272
304
  let labelFormat;
305
+ let relationshipQueries = {};
273
306
  let arcadeExecutors = {};
274
307
  if (layer.popupEnabled) {
275
308
  layer.popupTemplate.fieldInfos.forEach(
@@ -298,6 +331,8 @@ async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLa
298
331
  }
299
332
  else if (formatUsingLayerPopup && ((_d = (_c = layer.popupTemplate) === null || _c === void 0 ? void 0 : _c.content[0]) === null || _d === void 0 ? void 0 : _d.type) === "text") {
300
333
  labelFormat = _convertPopupTextToLabelSpec(layer.popupTemplate.content[0].text);
334
+ // Do we need any relationship queries?
335
+ relationshipQueries = _createRelationshipQueries(layer);
301
336
  // Do we need any Arcade executors?
302
337
  arcadeExecutors = await _createArcadeExecutors(labelFormat, layer);
303
338
  }
@@ -306,36 +341,75 @@ async function _prepareLabels(layer, ids, removeDuplicates = true, formatUsingLa
306
341
  let labels;
307
342
  // eslint-disable-next-line unicorn/prefer-ternary
308
343
  if (labelFormat) {
344
+ console.log("labelFormat", labelFormat); //???
309
345
  const arcadeExpressionRegExp = /\{expression\/\w+\}/g;
310
346
  const attributeRegExp = /\{\w+\}/g;
311
347
  // Find the label fields that we need to replace with values
312
- const arcadeExpressionMatches = labelFormat.match(arcadeExpressionRegExp);
313
- const attributeMatches = labelFormat.match(attributeRegExp);
348
+ const arcadeExpressionMatches = (_e = labelFormat.match(arcadeExpressionRegExp)) !== null && _e !== void 0 ? _e : [];
349
+ const attributeMatches = (_f = labelFormat.match(attributeRegExp)) !== null && _f !== void 0 ? _f : [];
314
350
  // Convert feature attributes into an array of labels
315
- labels = featureSet.features.map(feature => {
351
+ const relationshipKeys = Object.keys(relationshipQueries);
352
+ labels = await Promise.all(featureSet.features.map(async (feature) => {
316
353
  let labelPrep = labelFormat;
317
- // Replace Arcade expressions
318
- if (arcadeExpressionMatches) {
319
- arcadeExpressionMatches.forEach((match) => {
320
- const expressionName = match.substring(match.indexOf("/") + 1, match.length - 1);
321
- const value = arcadeExecutors[expressionName].execute({ "$feature": feature });
322
- labelPrep = labelPrep.replace(match, value);
323
- });
324
- }
325
- // Replace non-Arcade fields
326
- if (attributeMatches) {
327
- attributeMatches.forEach((match) => {
328
- const attributeName = match.substring(1, match.length - 1);
329
- const value = _prepareAttributeValue(feature.attributes[attributeName], attributeTypes[attributeName], attributeDomains[attributeName], attributeFormats[attributeName], intl);
330
- labelPrep = labelPrep.replace(match, value);
354
+ // Replace Arcade expressions in this feature
355
+ arcadeExpressionMatches.forEach((match) => {
356
+ const expressionName = match.substring(match.indexOf("/") + 1, match.length - 1);
357
+ const value = arcadeExecutors[expressionName].execute({ "$feature": feature });
358
+ labelPrep = labelPrep.replace(match, value);
359
+ });
360
+ // Replace relationship expressions in this feature
361
+ const relatedFeatureQueries = [];
362
+ const relationshipIds = [];
363
+ relationshipKeys.forEach((relationshipId) => {
364
+ const relationship = relationshipQueries[relationshipId];
365
+ const objectId = feature.attributes[relationship.layer.objectIdField];
366
+ const relatedQuery = Object.assign(Object.assign({}, relationship.relatedQuery), { objectIds: [objectId] });
367
+ relatedFeatureQueries.push(relationship.layer.queryRelatedFeatures(relatedQuery));
368
+ relationshipIds.push(relationshipId);
369
+ });
370
+ // Wait for all of the queries for related records for this label
371
+ const relatedFeatureQueryResults = await Promise.all(relatedFeatureQueries);
372
+ console.log("relatedFeatureQueryResults", relatedFeatureQueryResults); //???
373
+ relatedFeatureQueryResults.forEach((relatedFeatureQueryResult, i) => {
374
+ // We have an object with FeatureSets grouped by source layer or table objectIds
375
+ const relationshipId = relationshipIds[i];
376
+ console.log("relationshipId", relationshipId); //???
377
+ console.log("relatedFeatureQueryResult", relatedFeatureQueryResult); //???
378
+ // Run through the source layer or table objectIds
379
+ Object.keys(relatedFeatureQueryResult).forEach(relatedFeatureSetId => {
380
+ console.log("relatedFeatureSetId", relatedFeatureSetId); //???
381
+ // We have a feature set
382
+ const relatedFeatures = relatedFeatureQueryResult[relatedFeatureSetId].features;
383
+ console.log("relatedFeatures", relatedFeatures); //???
384
+ // Get the values from each feature and replace them in the label
385
+ relatedFeatures.forEach(feature => {
386
+ // Merge the base and related feature attributes and create the label
387
+ // Prefix related feature's attributes with "relationships/<id>/" to match popup
388
+ const rePrefix = "\{relationships/" + relationshipId + "/";
389
+ const reSuffix = "\}";
390
+ console.log("/rePrefix + attributeName + reSuffix/g", rePrefix + "attributeName" + reSuffix); //???
391
+ const attributes = feature.attributes;
392
+ Object.keys(attributes).forEach(attributeName => {
393
+ console.log("/rePrefix + attributeName + reSuffix/g", rePrefix + attributeName + reSuffix); //???
394
+ // Replace the value using the attribute name as a relationship
395
+ const attributeRelationshipRegExp = new RegExp(rePrefix + attributeName + reSuffix, "g");
396
+ labelPrep = labelPrep.replaceAll(attributeRelationshipRegExp, attributes[attributeName]);
397
+ });
398
+ });
331
399
  });
332
- }
400
+ });
401
+ // Replace non-Arcade fields in this feature
402
+ attributeMatches.forEach((match) => {
403
+ const attributeName = match.substring(1, match.length - 1);
404
+ const value = _prepareAttributeValue(feature.attributes[attributeName], attributeTypes[attributeName], attributeDomains[attributeName], attributeFormats[attributeName], intl);
405
+ labelPrep = labelPrep.replace(match, value);
406
+ });
333
407
  // Split label into lines
334
408
  let label = labelPrep.split(lineSeparatorChar);
335
409
  // Trim lines
336
410
  label = label.map(line => line.trim());
337
411
  return label;
338
- });
412
+ }));
339
413
  }
340
414
  else {
341
415
  // Export all attributes