@esri/solutions-components 0.3.9 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/t9n/public-notification/resources.json +0 -2
- package/dist/assets/t9n/public-notification/resources_en.json +0 -2
- package/dist/cjs/buffer-tools_6.cjs.entry.js +5 -2
- package/dist/cjs/calcite-input-message_5.cjs.entry.js +1342 -18
- package/dist/cjs/{calcite-input-message.calcite-notice.map-select-tools.pdf-download.refine-selection-cd8ad61e.js → downloadUtils-27dbd8b9.js} +205 -1337
- package/dist/cjs/{index.es-e89ba2a1.js → index.es-40d341ed.js} +3 -13
- package/dist/cjs/layer-table.cjs.entry.js +5 -15
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/public-notification.cjs.entry.js +23 -2
- package/dist/cjs/solutions-components.cjs.js +1 -1
- package/dist/collection/components/layer-table/layer-table.js +4 -16
- package/dist/collection/components/map-search/map-search.js +1 -1
- package/dist/collection/components/map-select-tools/map-select-tools.js +73 -17
- package/dist/collection/components/pdf-download/pdf-download.js +9 -76
- package/dist/collection/components/public-notification/public-notification.js +45 -3
- package/dist/collection/components/refine-selection/refine-selection.js +1 -1
- package/dist/collection/components/refine-selection-tools/refine-selection-tools.js +13 -5
- package/dist/collection/demos/buffer-tools.html +1 -1
- package/dist/collection/utils/csvUtils.js +4 -0
- package/dist/collection/utils/csvUtils.ts +7 -0
- package/dist/collection/utils/downloadUtils.js +181 -0
- package/dist/collection/utils/downloadUtils.ts +235 -0
- package/dist/collection/utils/interfaces.ts +8 -1
- package/dist/collection/utils/pdfUtils.js +7 -0
- package/dist/collection/utils/pdfUtils.ts +13 -2
- package/dist/components/downloadUtils.js +2279 -0
- package/dist/components/index.es.js +1 -1
- package/dist/components/layer-table.js +5 -16
- package/dist/components/map-layer-picker2.js +1 -1
- package/dist/components/map-search.js +1 -1
- package/dist/components/map-select-tools2.js +69 -19
- package/dist/components/pdf-download2.js +10 -2124
- package/dist/components/public-notification.js +24 -3
- package/dist/components/queryUtils.js +1 -1
- package/dist/components/refine-selection-tools2.js +6 -3
- package/dist/components/refine-selection2.js +1 -1
- package/dist/esm/buffer-tools_6.entry.js +6 -3
- package/dist/esm/calcite-combobox_3.entry.js +1 -1
- package/dist/esm/calcite-input-message_5.entry.js +1341 -13
- package/dist/esm/{calcite-input-message.calcite-notice.map-select-tools.pdf-download.refine-selection-ddd74bd6.js → downloadUtils-76e38a94.js} +206 -1335
- package/dist/esm/{index.es-8edafdb2.js → index.es-489f4f08.js} +2 -12
- package/dist/esm/layer-table.entry.js +6 -16
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{mapViewUtils-63e118f8.js → mapViewUtils-02696ab6.js} +1 -1
- package/dist/esm/public-notification.entry.js +24 -3
- package/dist/esm/solutions-components.js +1 -1
- package/dist/solutions-components/demos/buffer-tools.html +1 -1
- package/dist/solutions-components/{p-cc2e20c8.js → p-1bfd07e3.js} +1 -1
- package/dist/solutions-components/{p-117174e8.entry.js → p-335fce8c.entry.js} +1 -1
- package/dist/solutions-components/p-4ef94c6b.entry.js +6 -0
- package/dist/solutions-components/p-5d27b47d.entry.js +17 -0
- package/dist/solutions-components/p-92cb569a.entry.js +6 -0
- package/dist/solutions-components/{p-2a96314a.entry.js → p-a3b60bc9.entry.js} +2 -2
- package/dist/solutions-components/{p-98884f44.js → p-bff8aa4e.js} +3 -3
- package/dist/solutions-components/p-caa7e7a7.js +437 -0
- package/dist/solutions-components/solutions-components.esm.js +1 -1
- package/dist/solutions-components/utils/csvUtils.ts +7 -0
- package/dist/solutions-components/utils/downloadUtils.ts +235 -0
- package/dist/solutions-components/utils/interfaces.ts +8 -1
- package/dist/solutions-components/utils/pdfUtils.ts +13 -2
- package/dist/types/components/json-editor/assets/monaco-editor/monaco.d.ts +8262 -0
- package/dist/types/components/map-select-tools/map-select-tools.d.ts +19 -1
- package/dist/types/components/pdf-download/pdf-download.d.ts +0 -18
- package/dist/types/components/public-notification/public-notification.d.ts +10 -0
- package/dist/types/components/refine-selection-tools/refine-selection-tools.d.ts +2 -2
- package/dist/types/components.d.ts +6 -2
- package/dist/types/preact.d.ts +2 -1
- package/dist/types/utils/downloadUtils.d.ts +40 -0
- package/dist/types/utils/interfaces.d.ts +6 -2
- package/dist/types/utils/pdfUtils.d.ts +3 -1
- package/package.json +1 -1
- package/dist/cjs/csvUtils-3a56c6d8.js +0 -54
- package/dist/components/csvUtils.js +0 -52
- package/dist/esm/csvUtils-23b5418f.js +0 -52
- package/dist/solutions-components/p-15f9b0a0.entry.js +0 -6
- package/dist/solutions-components/p-238db156.js +0 -416
- package/dist/solutions-components/p-3069e3b7.js +0 -21
- package/dist/solutions-components/p-6d28f991.entry.js +0 -6
- package/dist/solutions-components/p-c5341977.entry.js +0 -6
|
@@ -0,0 +1,235 @@
|
|
|
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
|
+
//#region Declarations
|
|
18
|
+
|
|
19
|
+
import { exportCSV } from "./csvUtils";
|
|
20
|
+
import { ILabel, exportPDF } from "./pdfUtils";
|
|
21
|
+
import { loadModules } from "./loadModules";
|
|
22
|
+
import { queryFeaturesByID } from "./queryUtils";
|
|
23
|
+
|
|
24
|
+
export { ILabel } from "./pdfUtils";
|
|
25
|
+
|
|
26
|
+
//#endregion
|
|
27
|
+
//#region Public functions
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Downloads csv of mailing labels for the provided list of ids
|
|
31
|
+
*
|
|
32
|
+
* @param layer Layer providing features and attributes for download
|
|
33
|
+
* @param ids List of ids to download
|
|
34
|
+
* @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
|
|
35
|
+
* all attributes are exported
|
|
36
|
+
* @param removeDuplicates When true a single label is generated when multiple featues have a shared address value
|
|
37
|
+
* @param addColumnTitle Indicates if column headings should be included in output
|
|
38
|
+
* @returns Promise resolving when function is done
|
|
39
|
+
*/
|
|
40
|
+
export async function downloadCSV(
|
|
41
|
+
layer: __esri.FeatureLayer,
|
|
42
|
+
ids: number[],
|
|
43
|
+
formatUsingLayerPopup: boolean,
|
|
44
|
+
removeDuplicates = false,
|
|
45
|
+
addColumnTitle = false
|
|
46
|
+
): Promise<void> {
|
|
47
|
+
const labels = await _prepareLabels(layer, ids, removeDuplicates, formatUsingLayerPopup, addColumnTitle);
|
|
48
|
+
|
|
49
|
+
exportCSV(labels);
|
|
50
|
+
|
|
51
|
+
return Promise.resolve();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Downloads csv of mailing labels for the provided list of ids
|
|
56
|
+
*
|
|
57
|
+
* @param layer Layer providing features and attributes for download
|
|
58
|
+
* @param ids List of ids to download
|
|
59
|
+
* @param removeDuplicates When true a single label is generated when multiple featues have a shared address value
|
|
60
|
+
* @param labelPageDescription Provides PDF page layout info
|
|
61
|
+
* @returns Promise resolving when function is done
|
|
62
|
+
*/
|
|
63
|
+
export async function downloadPDF(
|
|
64
|
+
layer: __esri.FeatureLayer,
|
|
65
|
+
ids: number[],
|
|
66
|
+
removeDuplicates: boolean,
|
|
67
|
+
labelPageDescription: ILabel
|
|
68
|
+
): Promise<void> {
|
|
69
|
+
const labels = await _prepareLabels(layer, ids, removeDuplicates);
|
|
70
|
+
|
|
71
|
+
exportPDF(labels, labelPageDescription);
|
|
72
|
+
|
|
73
|
+
return Promise.resolve();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
//#endregion
|
|
77
|
+
//#region Private functions
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Converts a set of fieldInfos into template lines.
|
|
81
|
+
*
|
|
82
|
+
* @param fieldInfos Layer's fieldInfos structure
|
|
83
|
+
* @return Label spec
|
|
84
|
+
*/
|
|
85
|
+
function _convertPopupFieldsToLabelSpec(
|
|
86
|
+
fieldInfos: __esri.FieldInfo[]
|
|
87
|
+
): string[] {
|
|
88
|
+
const labelSpec: string[] = [];
|
|
89
|
+
|
|
90
|
+
// Every visible attribute is used
|
|
91
|
+
fieldInfos.forEach(
|
|
92
|
+
fieldInfo => {
|
|
93
|
+
if (fieldInfo.visible) {
|
|
94
|
+
labelSpec.push(`{${fieldInfo.fieldName}}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
return labelSpec;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Converts the text of a custom popup into a multiline label specification; conversion splits text into
|
|
104
|
+
* lines on <br>s, and removes HTML tags. It does not handle Arcade and related records.
|
|
105
|
+
*
|
|
106
|
+
* @param popupInfo Layer's popupInfo structure containing description, fieldInfos, and expressionInfos, e.g.,
|
|
107
|
+
* "<div style='text-align: left;'>{NAME}<br />{STREET}<br />{CITY}, {STATE} {ZIP} <br /></div>"
|
|
108
|
+
* @return Label spec
|
|
109
|
+
*/
|
|
110
|
+
function _convertPopupTextToLabelSpec(
|
|
111
|
+
popupInfo: string
|
|
112
|
+
): string[] {
|
|
113
|
+
// Replace <br>, <br/> with |
|
|
114
|
+
popupInfo = popupInfo.replace(/<br\s*\/?>/gi, "|");
|
|
115
|
+
|
|
116
|
+
// Remove remaining HTML tags, replace 0xA0 that popup uses for spaces, replace some char representations,
|
|
117
|
+
// and split the label back into individual lines
|
|
118
|
+
let labelSpec = popupInfo
|
|
119
|
+
.replace(/<[\s.]*[^<>]*\/?>/gi, "")
|
|
120
|
+
.replace(/\xA0/gi, " ")
|
|
121
|
+
.replace(/</gi, "<")
|
|
122
|
+
.replace(/>/gi, ">")
|
|
123
|
+
.replace(/ /gi, " ")
|
|
124
|
+
.split("|");
|
|
125
|
+
|
|
126
|
+
// Trim lines and remove empties
|
|
127
|
+
labelSpec = labelSpec.map(line => line.trim()).filter(line => line.length > 0);
|
|
128
|
+
|
|
129
|
+
return labelSpec;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Creates labels from items.
|
|
134
|
+
*
|
|
135
|
+
* @param layer Layer from which to fetch features
|
|
136
|
+
* @param ids List of ids to download
|
|
137
|
+
* @param removeDuplicates When true a single label is generated when multiple featues have a shared address value
|
|
138
|
+
* @param formatUsingLayerPopup When true, the layer's popup is used to choose attributes for each column; when false,
|
|
139
|
+
* all attributes are exported
|
|
140
|
+
* @param includeHeaderNames Add the label format at the front of the list of generated labels
|
|
141
|
+
* @returns Promise resolving when function is done
|
|
142
|
+
*/
|
|
143
|
+
async function _prepareLabels(
|
|
144
|
+
layer: __esri.FeatureLayer,
|
|
145
|
+
ids: number[],
|
|
146
|
+
removeDuplicates = true,
|
|
147
|
+
formatUsingLayerPopup = true,
|
|
148
|
+
includeHeaderNames = false
|
|
149
|
+
): Promise<string[][]> {
|
|
150
|
+
const [intl] = await loadModules([
|
|
151
|
+
"esri/intl"
|
|
152
|
+
]);
|
|
153
|
+
|
|
154
|
+
// Get the attributes of the features to export
|
|
155
|
+
const featureSet = await queryFeaturesByID(ids, layer);
|
|
156
|
+
const featuresAttrs = featureSet.features.map(f => f.attributes);
|
|
157
|
+
|
|
158
|
+
// Get the label formatting, if any
|
|
159
|
+
let labelFormat: string[];
|
|
160
|
+
if (layer.popupEnabled) {
|
|
161
|
+
// What data fields are used in the labels?
|
|
162
|
+
// Example labelFormat: ['{NAME}', '{STREET}', '{CITY}, {STATE} {ZIP}']
|
|
163
|
+
if (formatUsingLayerPopup && layer.popupTemplate?.content[0]?.type === "fields") {
|
|
164
|
+
labelFormat = _convertPopupFieldsToLabelSpec(layer.popupTemplate.fieldInfos);
|
|
165
|
+
|
|
166
|
+
} else if (formatUsingLayerPopup && layer.popupTemplate?.content[0]?.type === "text") {
|
|
167
|
+
labelFormat = _convertPopupTextToLabelSpec(layer.popupTemplate.content[0].text);
|
|
168
|
+
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Apply the label format
|
|
173
|
+
let labels: string[][];
|
|
174
|
+
// eslint-disable-next-line unicorn/prefer-ternary
|
|
175
|
+
if (labelFormat) {
|
|
176
|
+
// Convert attributes into an array of labels
|
|
177
|
+
labels = featuresAttrs.map(
|
|
178
|
+
featureAttributes => {
|
|
179
|
+
const label: string[] = [];
|
|
180
|
+
labelFormat.forEach(
|
|
181
|
+
labelLineTemplate => {
|
|
182
|
+
const labelLine = intl.substitute(labelLineTemplate, featureAttributes).trim();
|
|
183
|
+
if (labelLine.length > 0) {
|
|
184
|
+
label.push(labelLine);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
)
|
|
188
|
+
return label;
|
|
189
|
+
}
|
|
190
|
+
)
|
|
191
|
+
// Remove empty labels
|
|
192
|
+
.filter(label => label.length > 0);
|
|
193
|
+
|
|
194
|
+
} else {
|
|
195
|
+
// Export all attributes
|
|
196
|
+
labels = featuresAttrs.map(
|
|
197
|
+
featureAttributes => {
|
|
198
|
+
return Object.values(featureAttributes).map(
|
|
199
|
+
attribute => `${attribute}`
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Remove duplicates
|
|
206
|
+
if (removeDuplicates) {
|
|
207
|
+
const labelsAsStrings: string[] = labels.map(label => JSON.stringify(label));
|
|
208
|
+
const uniqueLabels = new Set(labelsAsStrings);
|
|
209
|
+
labels = Array.from(uniqueLabels,
|
|
210
|
+
labelString => JSON.parse(labelString)
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Add header names
|
|
215
|
+
if (includeHeaderNames) {
|
|
216
|
+
let headerNames = [];
|
|
217
|
+
|
|
218
|
+
if (labelFormat) {
|
|
219
|
+
headerNames = labelFormat.map(labelFormatLine => labelFormatLine.replace(/\{/g, "").replace(/\}/g, ""));
|
|
220
|
+
|
|
221
|
+
} else {
|
|
222
|
+
Object.keys(featuresAttrs[0]).forEach(k => {
|
|
223
|
+
if (featuresAttrs[0].hasOwnProperty(k)) {
|
|
224
|
+
headerNames.push(k);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
labels.unshift(headerNames);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return Promise.resolve(labels);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
//#endregion
|
|
@@ -108,7 +108,7 @@ export interface ISearchConfiguration {
|
|
|
108
108
|
sources: Array<ILocatorSourceConfigItem | ILayerSourceConfigItem>;
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
-
interface ISearchSourceConfigItem {
|
|
111
|
+
export interface ISearchSourceConfigItem {
|
|
112
112
|
maxResults: number;
|
|
113
113
|
maxSuggestions: number;
|
|
114
114
|
minSuggestCharacters: number;
|
|
@@ -387,6 +387,13 @@ export interface ISelectionSet {
|
|
|
387
387
|
refineIds: IRefineIds;
|
|
388
388
|
redoStack?: IRefineOperation[];
|
|
389
389
|
undoStack?: IRefineOperation[];
|
|
390
|
+
//skipGeomQuery?: boolean;
|
|
391
|
+
skipGeomOIDs?: number[];
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
export interface IRefineSelectionEvent {
|
|
395
|
+
graphics: __esri.Graphic[];
|
|
396
|
+
useOIDs: boolean;
|
|
390
397
|
}
|
|
391
398
|
|
|
392
399
|
export interface IRefineIds {
|
|
@@ -18,9 +18,13 @@
|
|
|
18
18
|
* See the License for the specific language governing permissions and
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
|
+
//#region Declarations
|
|
21
22
|
import * as PDFCreator_jsPDF from "../assets/arcgis-pdf-creator/PDFCreator_jsPDF";
|
|
22
23
|
import * as PDFLabels from "../assets/arcgis-pdf-creator/PDFLabels";
|
|
23
24
|
import { getAssetPath } from "@stencil/core";
|
|
25
|
+
export { ILabel } from "../assets/arcgis-pdf-creator/PDFLabels";
|
|
26
|
+
//#endregion
|
|
27
|
+
//#region Public functions
|
|
24
28
|
/**
|
|
25
29
|
* Exports a PDF of labels.
|
|
26
30
|
*
|
|
@@ -30,6 +34,8 @@ import { getAssetPath } from "@stencil/core";
|
|
|
30
34
|
export function exportPDF(labels, labelPageDescription) {
|
|
31
35
|
_downloadPDFFile(labels, labelPageDescription, `notify-${Date.now().toString()}`);
|
|
32
36
|
}
|
|
37
|
+
//#endregion
|
|
38
|
+
//#region Private functions
|
|
33
39
|
/**
|
|
34
40
|
* Downloads the PDF file.
|
|
35
41
|
*
|
|
@@ -51,3 +57,4 @@ function _downloadPDFFile(labels, labelPageDescription, fileTitle) {
|
|
|
51
57
|
});
|
|
52
58
|
});
|
|
53
59
|
}
|
|
60
|
+
//#endregion
|
|
@@ -14,9 +14,15 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
//#region Declarations
|
|
18
|
+
|
|
17
19
|
import * as PDFCreator_jsPDF from "../assets/arcgis-pdf-creator/PDFCreator_jsPDF";
|
|
18
20
|
import * as PDFLabels from "../assets/arcgis-pdf-creator/PDFLabels";
|
|
19
21
|
import { getAssetPath } from "@stencil/core";
|
|
22
|
+
export { ILabel } from "../assets/arcgis-pdf-creator/PDFLabels";
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region Public functions
|
|
20
26
|
|
|
21
27
|
/**
|
|
22
28
|
* Exports a PDF of labels.
|
|
@@ -26,11 +32,14 @@ import { getAssetPath } from "@stencil/core";
|
|
|
26
32
|
*/
|
|
27
33
|
export function exportPDF(
|
|
28
34
|
labels: string[][],
|
|
29
|
-
labelPageDescription:
|
|
35
|
+
labelPageDescription: PDFLabels.ILabel
|
|
30
36
|
): void {
|
|
31
37
|
_downloadPDFFile(labels, labelPageDescription, `notify-${Date.now().toString()}`);
|
|
32
38
|
}
|
|
33
39
|
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region Private functions
|
|
42
|
+
|
|
34
43
|
/**
|
|
35
44
|
* Downloads the PDF file.
|
|
36
45
|
*
|
|
@@ -40,7 +49,7 @@ export function exportPDF(
|
|
|
40
49
|
*/
|
|
41
50
|
function _downloadPDFFile(
|
|
42
51
|
labels: string[][],
|
|
43
|
-
labelPageDescription:
|
|
52
|
+
labelPageDescription: PDFLabels.ILabel,
|
|
44
53
|
fileTitle: string
|
|
45
54
|
): void {
|
|
46
55
|
const pdfLib = new PDFCreator_jsPDF.PDFCreator_jsPDF();
|
|
@@ -69,3 +78,5 @@ function _downloadPDFFile(
|
|
|
69
78
|
);
|
|
70
79
|
|
|
71
80
|
}
|
|
81
|
+
|
|
82
|
+
//#endregion
|