@itwin/map-layers 5.3.1 → 5.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/CHANGELOG.md +17 -2
  2. package/lib/cjs/BrowserStorage.d.ts +25 -0
  3. package/lib/cjs/BrowserStorage.d.ts.map +1 -0
  4. package/lib/cjs/BrowserStorage.js +80 -0
  5. package/lib/cjs/BrowserStorage.js.map +1 -0
  6. package/lib/cjs/CustomParamUtils.d.ts +5 -0
  7. package/lib/cjs/CustomParamUtils.d.ts.map +1 -0
  8. package/lib/cjs/CustomParamUtils.js +26 -0
  9. package/lib/cjs/CustomParamUtils.js.map +1 -0
  10. package/lib/cjs/CustomParamsMappingStorage.d.ts +6 -0
  11. package/lib/cjs/CustomParamsMappingStorage.d.ts.map +1 -0
  12. package/lib/cjs/CustomParamsMappingStorage.js +15 -0
  13. package/lib/cjs/CustomParamsMappingStorage.js.map +1 -0
  14. package/lib/cjs/CustomParamsStorage.d.ts +6 -0
  15. package/lib/cjs/CustomParamsStorage.d.ts.map +1 -0
  16. package/lib/cjs/CustomParamsStorage.js +15 -0
  17. package/lib/cjs/CustomParamsStorage.js.map +1 -0
  18. package/lib/cjs/MapLayerPreferences.d.ts.map +1 -1
  19. package/lib/cjs/MapLayerPreferences.js +2 -0
  20. package/lib/cjs/MapLayerPreferences.js.map +1 -1
  21. package/lib/cjs/PreferencesBrowserStorage.d.ts +9 -2
  22. package/lib/cjs/PreferencesBrowserStorage.d.ts.map +1 -1
  23. package/lib/cjs/PreferencesBrowserStorage.js +11 -51
  24. package/lib/cjs/PreferencesBrowserStorage.js.map +1 -1
  25. package/lib/cjs/public/locales/en/mapLayers.json +29 -3
  26. package/lib/cjs/ui/Interfaces.d.ts +11 -0
  27. package/lib/cjs/ui/Interfaces.d.ts.map +1 -1
  28. package/lib/cjs/ui/Interfaces.js.map +1 -1
  29. package/lib/cjs/ui/widget/AttachLayerPopupButton.d.ts.map +1 -1
  30. package/lib/cjs/ui/widget/AttachLayerPopupButton.js +20 -18
  31. package/lib/cjs/ui/widget/AttachLayerPopupButton.js.map +1 -1
  32. package/lib/cjs/ui/widget/CustomParamEditDialog.d.ts +11 -0
  33. package/lib/cjs/ui/widget/CustomParamEditDialog.d.ts.map +1 -0
  34. package/lib/cjs/ui/widget/CustomParamEditDialog.js +57 -0
  35. package/lib/cjs/ui/widget/CustomParamEditDialog.js.map +1 -0
  36. package/lib/cjs/ui/widget/CustomParamEditDialog.scss +26 -0
  37. package/lib/cjs/ui/widget/CustomParamsSettings.d.ts +4 -0
  38. package/lib/cjs/ui/widget/CustomParamsSettings.d.ts.map +1 -0
  39. package/lib/cjs/ui/widget/CustomParamsSettings.js +116 -0
  40. package/lib/cjs/ui/widget/CustomParamsSettings.js.map +1 -0
  41. package/lib/cjs/ui/widget/CustomParamsSettings.scss +67 -0
  42. package/lib/cjs/ui/widget/MapLayerDroppable.d.ts +3 -3
  43. package/lib/cjs/ui/widget/MapLayerDroppable.d.ts.map +1 -1
  44. package/lib/cjs/ui/widget/MapLayerDroppable.js +23 -10
  45. package/lib/cjs/ui/widget/MapLayerDroppable.js.map +1 -1
  46. package/lib/cjs/ui/widget/MapLayerManager.d.ts +2 -2
  47. package/lib/cjs/ui/widget/MapLayerManager.d.ts.map +1 -1
  48. package/lib/cjs/ui/widget/MapLayerManager.js +19 -11
  49. package/lib/cjs/ui/widget/MapLayerManager.js.map +1 -1
  50. package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.d.ts.map +1 -1
  51. package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.js +1 -1
  52. package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.js.map +1 -1
  53. package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.scss +4 -1
  54. package/lib/cjs/ui/widget/MapManagerSettings.d.ts.map +1 -1
  55. package/lib/cjs/ui/widget/MapManagerSettings.js +37 -29
  56. package/lib/cjs/ui/widget/MapManagerSettings.js.map +1 -1
  57. package/lib/cjs/ui/widget/MapUrlDialog.d.ts +15 -5
  58. package/lib/cjs/ui/widget/MapUrlDialog.d.ts.map +1 -1
  59. package/lib/cjs/ui/widget/MapUrlDialog.js +129 -58
  60. package/lib/cjs/ui/widget/MapUrlDialog.js.map +1 -1
  61. package/lib/cjs/ui/widget/MapUrlDialog.scss +12 -1
  62. package/lib/cjs/ui/widget/SelectApiKey.d.ts +10 -0
  63. package/lib/cjs/ui/widget/SelectApiKey.d.ts.map +1 -0
  64. package/lib/cjs/ui/widget/SelectApiKey.js +39 -0
  65. package/lib/cjs/ui/widget/SelectApiKey.js.map +1 -0
  66. package/lib/cjs/ui/widget/SelectCustomParam.d.ts +10 -0
  67. package/lib/cjs/ui/widget/SelectCustomParam.d.ts.map +1 -0
  68. package/lib/cjs/ui/widget/SelectCustomParam.js +49 -0
  69. package/lib/cjs/ui/widget/SelectCustomParam.js.map +1 -0
  70. package/lib/cjs/ui/widget/SelectMapFormat.d.ts +11 -2
  71. package/lib/cjs/ui/widget/SelectMapFormat.d.ts.map +1 -1
  72. package/lib/cjs/ui/widget/SelectMapFormat.js +5 -6
  73. package/lib/cjs/ui/widget/SelectMapFormat.js.map +1 -1
  74. package/lib/cjs/ui/widget/UserPreferencesStorageOptions.d.ts +10 -0
  75. package/lib/cjs/ui/widget/UserPreferencesStorageOptions.d.ts.map +1 -0
  76. package/lib/cjs/ui/widget/UserPreferencesStorageOptions.js +17 -0
  77. package/lib/cjs/ui/widget/UserPreferencesStorageOptions.js.map +1 -0
  78. package/lib/esm/BrowserStorage.d.ts +25 -0
  79. package/lib/esm/BrowserStorage.d.ts.map +1 -0
  80. package/lib/esm/BrowserStorage.js +76 -0
  81. package/lib/esm/BrowserStorage.js.map +1 -0
  82. package/lib/esm/CustomParamUtils.d.ts +5 -0
  83. package/lib/esm/CustomParamUtils.d.ts.map +1 -0
  84. package/lib/esm/CustomParamUtils.js +22 -0
  85. package/lib/esm/CustomParamUtils.js.map +1 -0
  86. package/lib/esm/CustomParamsMappingStorage.d.ts +6 -0
  87. package/lib/esm/CustomParamsMappingStorage.d.ts.map +1 -0
  88. package/lib/esm/CustomParamsMappingStorage.js +11 -0
  89. package/lib/esm/CustomParamsMappingStorage.js.map +1 -0
  90. package/lib/esm/CustomParamsStorage.d.ts +6 -0
  91. package/lib/esm/CustomParamsStorage.d.ts.map +1 -0
  92. package/lib/esm/CustomParamsStorage.js +11 -0
  93. package/lib/esm/CustomParamsStorage.js.map +1 -0
  94. package/lib/esm/MapLayerPreferences.d.ts.map +1 -1
  95. package/lib/esm/MapLayerPreferences.js +2 -0
  96. package/lib/esm/MapLayerPreferences.js.map +1 -1
  97. package/lib/esm/PreferencesBrowserStorage.d.ts +9 -2
  98. package/lib/esm/PreferencesBrowserStorage.d.ts.map +1 -1
  99. package/lib/esm/PreferencesBrowserStorage.js +11 -51
  100. package/lib/esm/PreferencesBrowserStorage.js.map +1 -1
  101. package/lib/esm/public/locales/en/mapLayers.json +29 -3
  102. package/lib/esm/ui/Interfaces.d.ts +11 -0
  103. package/lib/esm/ui/Interfaces.d.ts.map +1 -1
  104. package/lib/esm/ui/Interfaces.js.map +1 -1
  105. package/lib/esm/ui/widget/AttachLayerPopupButton.d.ts.map +1 -1
  106. package/lib/esm/ui/widget/AttachLayerPopupButton.js +20 -18
  107. package/lib/esm/ui/widget/AttachLayerPopupButton.js.map +1 -1
  108. package/lib/esm/ui/widget/CustomParamEditDialog.d.ts +11 -0
  109. package/lib/esm/ui/widget/CustomParamEditDialog.d.ts.map +1 -0
  110. package/lib/esm/ui/widget/CustomParamEditDialog.js +53 -0
  111. package/lib/esm/ui/widget/CustomParamEditDialog.js.map +1 -0
  112. package/lib/esm/ui/widget/CustomParamEditDialog.scss +26 -0
  113. package/lib/esm/ui/widget/CustomParamsSettings.d.ts +4 -0
  114. package/lib/esm/ui/widget/CustomParamsSettings.d.ts.map +1 -0
  115. package/lib/esm/ui/widget/CustomParamsSettings.js +112 -0
  116. package/lib/esm/ui/widget/CustomParamsSettings.js.map +1 -0
  117. package/lib/esm/ui/widget/CustomParamsSettings.scss +67 -0
  118. package/lib/esm/ui/widget/MapLayerDroppable.d.ts +3 -3
  119. package/lib/esm/ui/widget/MapLayerDroppable.d.ts.map +1 -1
  120. package/lib/esm/ui/widget/MapLayerDroppable.js +24 -11
  121. package/lib/esm/ui/widget/MapLayerDroppable.js.map +1 -1
  122. package/lib/esm/ui/widget/MapLayerManager.d.ts +2 -2
  123. package/lib/esm/ui/widget/MapLayerManager.d.ts.map +1 -1
  124. package/lib/esm/ui/widget/MapLayerManager.js +20 -12
  125. package/lib/esm/ui/widget/MapLayerManager.js.map +1 -1
  126. package/lib/esm/ui/widget/MapLayerSettingsPopupButton.d.ts.map +1 -1
  127. package/lib/esm/ui/widget/MapLayerSettingsPopupButton.js +1 -1
  128. package/lib/esm/ui/widget/MapLayerSettingsPopupButton.js.map +1 -1
  129. package/lib/esm/ui/widget/MapLayerSettingsPopupButton.scss +4 -1
  130. package/lib/esm/ui/widget/MapManagerSettings.d.ts.map +1 -1
  131. package/lib/esm/ui/widget/MapManagerSettings.js +38 -30
  132. package/lib/esm/ui/widget/MapManagerSettings.js.map +1 -1
  133. package/lib/esm/ui/widget/MapUrlDialog.d.ts +15 -5
  134. package/lib/esm/ui/widget/MapUrlDialog.d.ts.map +1 -1
  135. package/lib/esm/ui/widget/MapUrlDialog.js +129 -58
  136. package/lib/esm/ui/widget/MapUrlDialog.js.map +1 -1
  137. package/lib/esm/ui/widget/MapUrlDialog.scss +12 -1
  138. package/lib/esm/ui/widget/SelectApiKey.d.ts +10 -0
  139. package/lib/esm/ui/widget/SelectApiKey.d.ts.map +1 -0
  140. package/lib/esm/ui/widget/SelectApiKey.js +35 -0
  141. package/lib/esm/ui/widget/SelectApiKey.js.map +1 -0
  142. package/lib/esm/ui/widget/SelectCustomParam.d.ts +10 -0
  143. package/lib/esm/ui/widget/SelectCustomParam.d.ts.map +1 -0
  144. package/lib/esm/ui/widget/SelectCustomParam.js +45 -0
  145. package/lib/esm/ui/widget/SelectCustomParam.js.map +1 -0
  146. package/lib/esm/ui/widget/SelectMapFormat.d.ts +11 -2
  147. package/lib/esm/ui/widget/SelectMapFormat.d.ts.map +1 -1
  148. package/lib/esm/ui/widget/SelectMapFormat.js +5 -6
  149. package/lib/esm/ui/widget/SelectMapFormat.js.map +1 -1
  150. package/lib/esm/ui/widget/UserPreferencesStorageOptions.d.ts +10 -0
  151. package/lib/esm/ui/widget/UserPreferencesStorageOptions.d.ts.map +1 -0
  152. package/lib/esm/ui/widget/UserPreferencesStorageOptions.js +13 -0
  153. package/lib/esm/ui/widget/UserPreferencesStorageOptions.js.map +1 -0
  154. package/lib/public/locales/en/mapLayers.json +29 -3
  155. package/package.json +6 -6
@@ -3,17 +3,22 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  // cSpell:ignore Modeless WMTS
6
+ import "./MapUrlDialog.scss";
7
+ import * as React from "react";
6
8
  import { SpecialKey } from "@itwin/appui-abstract";
7
- import { Button, Icon, Input, LabeledInput, ProgressLinear, Radio } from "@itwin/itwinui-react";
9
+ import { BeEvent, Guid } from "@itwin/core-bentley";
8
10
  import { IModelApp, MapLayerSource, MapLayerSourceStatus, NotifyMessageDetails, OutputMessagePriority, } from "@itwin/core-frontend";
9
11
  import { Dialog, useCrossOriginPopup } from "@itwin/core-react";
10
- import * as React from "react";
12
+ import { SvgStatusWarning, SvgTechnicalPreviewMini } from "@itwin/itwinui-icons-color-react";
13
+ import { Button, Icon, Input, LabeledInput, ProgressLinear } from "@itwin/itwinui-react";
14
+ import { CustomParamsMappingStorage } from "../../CustomParamsMappingStorage";
15
+ import { CustomParamsStorage } from "../../CustomParamsStorage";
16
+ import { CustomParamUtils } from "../../CustomParamUtils";
11
17
  import { MapLayerPreferences } from "../../MapLayerPreferences";
12
18
  import { MapLayersUI } from "../../mapLayers";
13
- import { BeEvent, Guid } from "@itwin/core-bentley";
19
+ import { SelectCustomParam } from "./SelectCustomParam";
14
20
  import { SelectMapFormat } from "./SelectMapFormat";
15
- import "./MapUrlDialog.scss";
16
- import { SvgStatusWarning } from "@itwin/itwinui-icons-color-react";
21
+ import { UserPreferencesStorageOptions } from "./UserPreferencesStorageOptions";
17
22
  export const MAP_TYPES = {
18
23
  wms: "WMS",
19
24
  arcGis: "ArcGIS",
@@ -23,42 +28,47 @@ export const MAP_TYPES = {
23
28
  };
24
29
  // eslint-disable-next-line @typescript-eslint/naming-convention
25
30
  export function MapUrlDialog(props) {
26
- const { onOkResult, mapTypesOptions } = props;
31
+ const { onOkResult, mapLayerOptions } = props;
27
32
  const getMapUrlFromProps = React.useCallback(() => {
28
33
  if (props.mapLayerSourceToEdit) {
29
34
  return props.mapLayerSourceToEdit.url;
30
35
  }
31
- else if (props.layerRequiringCredentials?.url) {
32
- return props.layerRequiringCredentials.url;
36
+ else if (props.signInModeArgs) {
37
+ return props.signInModeArgs.layer.url;
33
38
  }
34
39
  return "";
35
- }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);
40
+ }, [props.mapLayerSourceToEdit, props.signInModeArgs]);
36
41
  const getMapNameFromProps = React.useCallback(() => {
37
42
  if (props.mapLayerSourceToEdit) {
38
43
  return props.mapLayerSourceToEdit.name;
39
44
  }
40
- else if (props.layerRequiringCredentials?.name) {
41
- return props.layerRequiringCredentials.name;
45
+ else if (props.signInModeArgs) {
46
+ return props.signInModeArgs.layer.name;
42
47
  }
43
48
  return "";
44
- }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);
49
+ }, [props.mapLayerSourceToEdit, props.signInModeArgs]);
45
50
  const getFormatFromProps = React.useCallback(() => {
46
51
  if (props.mapLayerSourceToEdit) {
47
52
  return props.mapLayerSourceToEdit.formatId;
48
53
  }
49
- else if (props.layerRequiringCredentials?.formatId) {
50
- return props.layerRequiringCredentials.formatId;
54
+ else if (props.signInModeArgs) {
55
+ return props.signInModeArgs.layer.formatId;
51
56
  }
52
57
  return undefined;
53
- }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);
54
- const [dialogTitle] = React.useState(MapLayersUI.localization.getLocalizedString(props.layerRequiringCredentials || props.mapLayerSourceToEdit ? "mapLayers:CustomAttach.EditCustomLayer" : "mapLayers:CustomAttach.AttachCustomLayer"));
58
+ }, [props.mapLayerSourceToEdit, props.signInModeArgs]);
59
+ const getCustomParamsMapping = React.useCallback((url) => {
60
+ const cpMappingStorage = new CustomParamsMappingStorage();
61
+ const cpMapping = cpMappingStorage.get(url.toLowerCase());
62
+ if (cpMapping && cpMapping.length > 0)
63
+ return cpMapping[0].customParamNames;
64
+ return [];
65
+ }, []);
66
+ const [dialogTitle] = React.useState(MapLayersUI.localization.getLocalizedString(props.signInModeArgs || props.mapLayerSourceToEdit ? "mapLayers:CustomAttach.EditCustomLayer" : "mapLayers:CustomAttach.AttachCustomLayer"));
55
67
  const [typeLabel] = React.useState(MapLayersUI.localization.getLocalizedString("mapLayers:CustomAttach.Type"));
56
68
  const [nameLabel] = React.useState(MapLayersUI.localization.getLocalizedString("mapLayers:CustomAttach.Name"));
57
69
  const [nameInputPlaceHolder] = React.useState(MapLayersUI.localization.getLocalizedString("mapLayers:CustomAttach.NameInputPlaceHolder"));
58
70
  const [urlLabel] = React.useState(MapLayersUI.localization.getLocalizedString("mapLayers:CustomAttach.URL"));
59
71
  const [urlInputPlaceHolder] = React.useState(MapLayersUI.localization.getLocalizedString("mapLayers:CustomAttach.UrlInputPlaceHolder"));
60
- const [iTwinSettingsLabel] = React.useState(MapLayersUI.localization.getLocalizedString("mapLayers:CustomAttach.StoreOnITwinSettings"));
61
- const [modelSettingsLabel] = React.useState(MapLayersUI.localization.getLocalizedString("mapLayers:CustomAttach.StoreOnModelSettings"));
62
72
  const [missingCredentialsLabel] = React.useState(MapLayersUI.localization.getLocalizedString("mapLayers:CustomAttach.MissingCredentials"));
63
73
  const [invalidCredentialsLabel] = React.useState(MapLayersUI.localization.getLocalizedString("mapLayers:CustomAttach.InvalidCredentials"));
64
74
  const [externalLoginTitle] = React.useState(MapLayersUI.localization.getLocalizedString("mapLayers:CustomAttach.ExternalLogin"));
@@ -87,7 +97,14 @@ export function MapUrlDialog(props) {
87
97
  const [accessClient, setAccessClient] = React.useState();
88
98
  const [isAccessClientInitialized, setAccessClientInitialized] = React.useState(false);
89
99
  const [shouldAutoAttachSource, setShouldAutoAttachSource] = React.useState(true);
100
+ const [incompatibleFormat, setIncompatibleFormat] = React.useState(false);
90
101
  const [mapType, setMapType] = React.useState(getFormatFromProps() ?? "ArcGIS");
102
+ const [customParamNamesChangedByUser, SetCustomParamNamesChangedByUser] = React.useState(false);
103
+ const [customParamNames, setCustomParamNames] = React.useState(() => {
104
+ if (mapUrl)
105
+ return getCustomParamsMapping(mapUrl);
106
+ return undefined;
107
+ });
91
108
  // 'isMounted' is used to prevent any async operation once the hook has been
92
109
  // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.
93
110
  const isMounted = React.useRef(false);
@@ -164,13 +181,23 @@ export function MapUrlDialog(props) {
164
181
  }, [accessClient, invalidCredentialsProvided, password.length, userName.length]);
165
182
  const onNameChange = React.useCallback((event) => {
166
183
  setMapName(event.target.value);
167
- }, [setMapName]);
184
+ }, []);
168
185
  const onRadioChange = React.useCallback((event) => {
169
186
  setSettingsStorageRadio(event.target.value);
170
187
  }, [setSettingsStorageRadio]);
171
188
  const onUrlChange = React.useCallback((event) => {
172
- setMapUrl(event.target.value);
173
- }, [setMapUrl]);
189
+ const value = event.target.value;
190
+ setMapUrl(value);
191
+ if (!customParamNamesChangedByUser) {
192
+ if (value === "") {
193
+ setCustomParamNames(undefined);
194
+ }
195
+ else {
196
+ const paramNames = getCustomParamsMapping(value);
197
+ setCustomParamNames(paramNames);
198
+ }
199
+ }
200
+ }, [getCustomParamsMapping, customParamNamesChangedByUser]);
174
201
  const createSource = React.useCallback(() => {
175
202
  let source;
176
203
  if (mapUrl && mapName) {
@@ -183,10 +210,13 @@ export function MapUrlDialog(props) {
183
210
  if (source) {
184
211
  source.userName = userName || undefined; // When there is no value, empty string is always returned, in this case force it to undefined,
185
212
  source.password = password || undefined;
213
+ if (customParamNames) {
214
+ CustomParamUtils.setSourceCustomParams(source, customParamNames);
215
+ }
186
216
  }
187
217
  }
188
218
  return source;
189
- }, [mapName, mapType, mapUrl, password, userName]);
219
+ }, [customParamNames, mapName, mapType, mapUrl, password, userName]);
190
220
  const handleOk = React.useCallback(() => {
191
221
  const source = createSource();
192
222
  if (source === undefined || props.mapLayerSourceToEdit) {
@@ -198,8 +228,16 @@ export function MapUrlDialog(props) {
198
228
  IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));
199
229
  return;
200
230
  }
231
+ // Store custom params mapping
232
+ if (customParamNames) {
233
+ const cpmStorage = new CustomParamsMappingStorage();
234
+ cpmStorage.save(mapUrl.toLowerCase(), { customParamNames });
235
+ }
201
236
  // Simply change the source definition in the setting service
202
237
  if (props.mapLayerSourceToEdit !== undefined) {
238
+ // Apply changes to original source object
239
+ props.mapLayerSourceToEdit.savedQueryParams = { ...source.savedQueryParams };
240
+ props.mapLayerSourceToEdit.unsavedQueryParams = { ...source.unsavedQueryParams };
203
241
  const vp = props.activeViewport;
204
242
  void (async () => {
205
243
  if (isSettingsStorageAvailable && vp?.iModel?.iTwinId) {
@@ -226,7 +264,7 @@ export function MapUrlDialog(props) {
226
264
  }
227
265
  if (validation.status === MapLayerSourceStatus.Valid) {
228
266
  // Update service settings if storage is available and we are not prompting user for credentials
229
- if (isSettingsStorageAvailable && !props.layerRequiringCredentials) {
267
+ if (isSettingsStorageAvailable && !props.signInModeArgs) {
230
268
  const storeOnIModel = (hasImodelContext ? "Model" === settingsStorage : undefined);
231
269
  const vp = props.activeViewport;
232
270
  if (vp?.iModel.iTwinId && !(await MapLayerPreferences.storeSource(source, vp.iModel.iTwinId, vp.iModel.iModelId, storeOnIModel))) {
@@ -234,13 +272,32 @@ export function MapUrlDialog(props) {
234
272
  IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msgError));
235
273
  }
236
274
  }
237
- onOkResult({ source, validation });
275
+ // Link an API key to this map-layer URL
276
+ const customParamIdx = {};
277
+ const privateCustomParamIdx = {};
278
+ if (customParamNames && customParamNames.length > 0) {
279
+ // Link the map-layers URL custom params.
280
+ const cpmStorage = new CustomParamsMappingStorage();
281
+ cpmStorage.save(mapUrl.toLowerCase(), { customParamNames });
282
+ const cpStorage = new CustomParamsStorage();
283
+ customParamNames.forEach((customParamName) => {
284
+ const items = cpStorage.get(customParamName);
285
+ if (items && items.length > 0) {
286
+ const item = items[0];
287
+ (item.secret ? privateCustomParamIdx : customParamIdx)[item.key] = item.value;
288
+ }
289
+ });
290
+ }
291
+ onOkResult({ source, validation, customParamIdx, privateCustomParamIdx });
238
292
  }
239
293
  else if (validation.status === MapLayerSourceStatus.InvalidCoordinateSystem) {
240
294
  const msg = MapLayersUI.localization.getLocalizedString("mapLayers:CustomAttach.InvalidCoordinateSystem");
241
295
  IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));
242
296
  onOkResult({ source, validation });
243
297
  }
298
+ else if (validation.status === MapLayerSourceStatus.IncompatibleFormat) {
299
+ setIncompatibleFormat(true);
300
+ }
244
301
  else {
245
302
  const authNeeded = await updateAuthState(source, validation);
246
303
  if (!authNeeded) {
@@ -256,7 +313,7 @@ export function MapUrlDialog(props) {
256
313
  onOkResult();
257
314
  }
258
315
  })();
259
- }, [createSource, mapName, props.mapLayerSourceToEdit, props.activeViewport, onOkResult, isSettingsStorageAvailable, updateAuthState, hasImodelContext, props.layerRequiringCredentials, settingsStorage]);
316
+ }, [createSource, props.mapLayerSourceToEdit, props.activeViewport, props.signInModeArgs, onOkResult, customParamNames, mapName, mapUrl, isSettingsStorageAvailable, hasImodelContext, settingsStorage, updateAuthState]);
260
317
  React.useEffect(() => {
261
318
  const handleOAuthProcessEnd = (success, _state) => {
262
319
  onOauthProcessEnd.raiseEvent(success, _state);
@@ -275,15 +332,21 @@ export function MapUrlDialog(props) {
275
332
  setAccessClientInitialized(false);
276
333
  };
277
334
  }, [mapType, onOauthProcessEnd, setAccessClient]);
278
- // After a map type change, make sure the different Oauth states are reset.
279
- React.useEffect(() => {
280
- // Reset few states
335
+ const resetSignInState = React.useCallback(() => {
281
336
  setServerRequireCredentials(false);
282
337
  setInvalidCredentialsProvided(false);
283
338
  setShowOauthPopup(false);
284
339
  setOAuthProcessSucceeded(undefined);
285
340
  setExternalLoginUrl(undefined);
286
- }, [mapType]);
341
+ }, []);
342
+ // After a map type chang(or setting a new custom query Parameter), make sure the different Oauth states are reset.
343
+ React.useEffect(() => {
344
+ resetSignInState();
345
+ }, [mapType, resetSignInState]);
346
+ // After a map type change, make sure the different Oauth states are reset.
347
+ React.useEffect(() => {
348
+ setIncompatibleFormat(false);
349
+ }, [mapType, mapUrl]);
287
350
  // The first time the dialog is loaded and we already know the layer requires auth. (i.e ImageryProvider already made an attempt)
288
351
  // makes a request to discover the authentification types and adjust UI accordingly (i.e. username/password fields, Oauth popup)
289
352
  // Without this effect, user would have to manually click the 'OK' button in order to trigger the layer connection.
@@ -292,28 +355,38 @@ export function MapUrlDialog(props) {
292
355
  void (async () => {
293
356
  if (isAccessClientInitialized
294
357
  && shouldAutoAttachSource
295
- && props.layerRequiringCredentials?.url !== undefined
296
- && props.layerRequiringCredentials?.name !== undefined) {
358
+ && props.signInModeArgs !== undefined) {
297
359
  try {
298
- const source = MapLayerSource.fromJSON({
299
- url: props.layerRequiringCredentials.url,
300
- name: props.layerRequiringCredentials.name,
301
- formatId: props.layerRequiringCredentials.formatId,
302
- });
303
- if (source !== undefined) {
304
- setLayerAttachPending(true);
305
- setShouldAutoAttachSource(false);
306
- const validation = await source.validateSource(true);
307
- if (isMounted.current) {
308
- setLayerAttachPending(false);
360
+ let source = props.signInModeArgs.source;
361
+ let validation = props.signInModeArgs.validation;
362
+ if (!source || !validation) {
363
+ // In some cases we don't know why the layer failed to attach, so we need to go through validation process
364
+ source = MapLayerSource.fromJSON({
365
+ url: props.signInModeArgs.layer.url,
366
+ name: props.signInModeArgs.layer.name,
367
+ formatId: props.signInModeArgs.layer.formatId,
368
+ });
369
+ if (source !== undefined) {
370
+ if (props.signInModeArgs.layer.savedQueryParams)
371
+ source.savedQueryParams = { ...props.signInModeArgs.layer.savedQueryParams };
372
+ if (props.signInModeArgs.layer.unsavedQueryParams)
373
+ source.unsavedQueryParams = { ...props.signInModeArgs.layer.unsavedQueryParams };
374
+ setLayerAttachPending(true);
375
+ validation = await source.validateSource(true);
376
+ if (isMounted.current) {
377
+ setLayerAttachPending(false);
378
+ }
309
379
  }
380
+ }
381
+ if (source && validation) {
382
+ setShouldAutoAttachSource(false);
310
383
  await updateAuthState(source, validation);
311
384
  }
312
385
  }
313
386
  catch (_error) { }
314
387
  }
315
388
  })();
316
- }, [isAccessClientInitialized, props.layerRequiringCredentials?.formatId, props.layerRequiringCredentials?.name, props.layerRequiringCredentials?.url, shouldAutoAttachSource, updateAuthState]);
389
+ }, [isAccessClientInitialized, props.signInModeArgs, shouldAutoAttachSource, updateAuthState]);
317
390
  const dialogContainer = React.useRef(null);
318
391
  const readyToSave = React.useCallback(() => {
319
392
  const credentialsSet = !!userName && !!password;
@@ -321,13 +394,10 @@ export function MapUrlDialog(props) {
321
394
  && !layerAttachPending
322
395
  && (!serverRequireCredentials || credentialsSet)
323
396
  && !invalidCredentialsProvided
397
+ && !incompatibleFormat
324
398
  && (externalLoginUrl === undefined || (externalLoginUrl !== undefined && oauthProcessSucceeded));
325
399
  return ready;
326
- }, [userName, password, mapUrl, mapName, serverRequireCredentials, layerAttachPending, invalidCredentialsProvided, externalLoginUrl, oauthProcessSucceeded]);
327
- // const buttonCluster = React.useMemo(() => [
328
- // { type: DialogButtonType.OK, onClick: handleOk, disabled: !readyToSave() },
329
- // { type: DialogButtonType.Cancel, onClick: handleCancel },
330
- // ], [readyToSave, handleCancel, handleOk]);
400
+ }, [userName, password, mapUrl, mapName, layerAttachPending, serverRequireCredentials, invalidCredentialsProvided, incompatibleFormat, externalLoginUrl, oauthProcessSucceeded]);
331
401
  const handleOnKeyDown = React.useCallback((event) => {
332
402
  // eslint-disable-next-line deprecation/deprecation
333
403
  if (event.key === SpecialKey.Enter) {
@@ -372,7 +442,6 @@ export function MapUrlDialog(props) {
372
442
  }, [oauthProcessSucceeded]);
373
443
  // Utility function to get warning message section
374
444
  function renderWarningMessage() {
375
- let node;
376
445
  let warningMessage;
377
446
  // Get the proper warning message
378
447
  if (showOauthPopup) {
@@ -406,7 +475,6 @@ export function MapUrlDialog(props) {
406
475
  else {
407
476
  return (React.createElement("span", { className: "map-layer-source-placeholder" }, "\u00A0"));
408
477
  }
409
- return node;
410
478
  }
411
479
  // Use a hook to display the popup.
412
480
  // The display of the popup is controlled by the 'showOauthPopup' state variable.
@@ -423,11 +491,17 @@ export function MapUrlDialog(props) {
423
491
  React.createElement("div", { className: "map-layer-url-dialog-content" },
424
492
  React.createElement("div", { className: "map-layer-source-url" },
425
493
  React.createElement("span", { className: "map-layer-source-label" }, typeLabel),
426
- React.createElement(SelectMapFormat, { value: mapType, disabled: props.layerRequiringCredentials !== undefined || props.mapLayerSourceToEdit !== undefined || layerAttachPending || layerAuthPending, onChange: setMapType, mapTypesOptions: mapTypesOptions }),
494
+ React.createElement(SelectMapFormat, { value: mapType, disabled: props.signInModeArgs !== undefined || props.mapLayerSourceToEdit !== undefined || layerAttachPending || layerAuthPending, onChange: setMapType, mapTypesOptions: mapLayerOptions?.mapTypeOptions, status: incompatibleFormat ? "warning" : undefined, message: incompatibleFormat ? MapLayersUI.translate("CustomAttach.InvalidType") : undefined }),
427
495
  React.createElement("span", { className: "map-layer-source-label" }, nameLabel),
428
- React.createElement(Input, { className: "map-layer-source-input", placeholder: nameInputPlaceHolder, onChange: onNameChange, value: mapName, disabled: props.layerRequiringCredentials !== undefined || layerAttachPending || layerAuthPending }),
496
+ React.createElement(Input, { className: "map-layer-source-input", placeholder: nameInputPlaceHolder, onChange: onNameChange, value: mapName, disabled: !!props.signInModeArgs || layerAttachPending || layerAuthPending }),
429
497
  React.createElement("span", { className: "map-layer-source-label" }, urlLabel),
430
- React.createElement(Input, { className: "map-layer-source-input", placeholder: urlInputPlaceHolder, onKeyPress: handleOnKeyDown, onChange: onUrlChange, disabled: props.mapLayerSourceToEdit !== undefined || layerAttachPending || layerAuthPending, value: mapUrl }),
498
+ React.createElement(Input, { className: "map-layer-source-input", placeholder: urlInputPlaceHolder, onKeyPress: handleOnKeyDown, onChange: onUrlChange, disabled: !!props.signInModeArgs || props.mapLayerSourceToEdit !== undefined || layerAttachPending || layerAuthPending, value: mapUrl }),
499
+ React.createElement("span", { className: "map-layer-source-label" },
500
+ MapLayersUI.translate("CustomAttach.CustomParamsLabel"),
501
+ React.createElement("div", { title: MapLayersUI.translate("Labels.TechPreviewBadgeTooltip"), className: "map-layer-source-previewBadge-icon" },
502
+ React.createElement(Icon, { size: "small" },
503
+ React.createElement(SvgTechnicalPreviewMini, null)))),
504
+ React.createElement(SelectCustomParam, { value: customParamNames, disabled: layerAttachPending || layerAuthPending, onChange: (paramNames) => { setCustomParamNames(paramNames); SetCustomParamNamesChangedByUser(true); resetSignInState(); } }),
431
505
  serverRequireCredentials
432
506
  && externalLoginUrl === undefined // external login is handled in popup
433
507
  && props.mapLayerSourceToEdit === undefined &&
@@ -436,12 +510,9 @@ export function MapUrlDialog(props) {
436
510
  React.createElement(LabeledInput, { className: "map-layer-source-input", displayStyle: "inline", placeholder: serverRequireCredentials ? userNameRequiredLabel : userNameLabel, status: (!userName && serverRequireCredentials) || invalidCredentialsProvided ? "warning" : undefined, disabled: layerAttachPending || layerAuthPending, onChange: onUsernameChange, value: userName, size: "small" }),
437
511
  React.createElement("span", { className: "map-layer-source-label" }, passwordLabel),
438
512
  React.createElement(LabeledInput, { className: "map-layer-source-input", displayStyle: "inline", type: "password", placeholder: serverRequireCredentials ? passwordRequiredLabel : passwordLabel, status: (!password && serverRequireCredentials) || invalidCredentialsProvided ? "warning" : undefined, disabled: layerAttachPending || layerAuthPending, onChange: onPasswordChange, onKeyPress: handleOnKeyDown, value: password, size: "small" })),
439
- !props.layerRequiringCredentials
513
+ !props.signInModeArgs
440
514
  && !props.mapLayerSourceToEdit
441
- && React.createElement("div", { title: !isSettingsStorageAvailable ? noSaveSettingsWarning : "" }, hasImodelContext &&
442
- React.createElement("div", null,
443
- React.createElement(Radio, { disabled: !isSettingsStorageAvailable, name: "settingsStorage", value: "iTwin", label: iTwinSettingsLabel, checked: settingsStorage === "iTwin", onChange: onRadioChange }),
444
- React.createElement(Radio, { disabled: !isSettingsStorageAvailable, name: "settingsStorage", value: "Model", label: modelSettingsLabel, checked: settingsStorage === "Model", onChange: onRadioChange }))))),
515
+ && React.createElement("div", { title: !isSettingsStorageAvailable ? noSaveSettingsWarning : "" }, hasImodelContext && mapLayerOptions?.showUserPreferencesStorageOptions && (React.createElement(UserPreferencesStorageOptions, { disabled: !isSettingsStorageAvailable, itwinChecked: settingsStorage === "iTwin", modelChecked: settingsStorage === "Model", onChange: onRadioChange }))))),
445
516
  renderWarningMessage(),
446
517
  (layerAttachPending || layerAuthPending) &&
447
518
  React.createElement("div", { className: "map-layer-source-progressBar" },
@@ -1 +1 @@
1
- {"version":3,"file":"MapUrlDialog.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapUrlDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n// cSpell:ignore Modeless WMTS\n\nimport { SpecialKey } from \"@itwin/appui-abstract\";\nimport { Button, Icon, Input, LabeledInput, ProgressLinear, Radio } from \"@itwin/itwinui-react\";\nimport { ImageMapLayerProps } from \"@itwin/core-common\";\nimport {\n IModelApp, MapLayerAccessClient, MapLayerSource,\n MapLayerSourceStatus, MapLayerSourceValidation, NotifyMessageDetails, OutputMessagePriority, ScreenViewport,\n} from \"@itwin/core-frontend\";\nimport { Dialog, useCrossOriginPopup } from \"@itwin/core-react\";\nimport * as React from \"react\";\nimport { MapLayerPreferences } from \"../../MapLayerPreferences\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { MapTypesOptions } from \"../Interfaces\";\nimport { BeEvent, Guid } from \"@itwin/core-bentley\";\nimport { SelectMapFormat } from \"./SelectMapFormat\";\nimport \"./MapUrlDialog.scss\";\nimport { SvgStatusWarning } from \"@itwin/itwinui-icons-color-react\";\n\nexport const MAP_TYPES = {\n wms: \"WMS\",\n arcGis: \"ArcGIS\",\n wmts: \"WMTS\",\n tileUrl: \"TileURL\",\n arcGisFeature: \"ArcGISFeature\",\n};\n\nexport type LayerCreationMode = \"single\"|\"multiple\";\ninterface MapUrlDialogProps {\n activeViewport?: ScreenViewport;\n isOverlay: boolean;\n onOkResult: (result?: SourceState) => void;\n onCancelResult?: () => void;\n mapTypesOptions?: MapTypesOptions;\n\n // An optional layer definition can be provide to enable the edit mode\n layerRequiringCredentials?: ImageMapLayerProps;\n\n mapLayerSourceToEdit?: MapLayerSource;\n}\n\nexport interface SourceState {\n source: MapLayerSource;\n validation: MapLayerSourceValidation;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function MapUrlDialog(props: MapUrlDialogProps) {\n const { onOkResult, mapTypesOptions } = props;\n\n const getMapUrlFromProps = React.useCallback(() => {\n if (props.mapLayerSourceToEdit) {\n return props.mapLayerSourceToEdit.url;\n } else if (props.layerRequiringCredentials?.url) {\n return props.layerRequiringCredentials.url;\n }\n return \"\";\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\n\n const getMapNameFromProps = React.useCallback(() => {\n if (props.mapLayerSourceToEdit) {\n return props.mapLayerSourceToEdit.name;\n } else if (props.layerRequiringCredentials?.name) {\n return props.layerRequiringCredentials.name;\n }\n return \"\";\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\n\n const getFormatFromProps = React.useCallback(() => {\n if (props.mapLayerSourceToEdit) {\n return props.mapLayerSourceToEdit.formatId;\n } else if (props.layerRequiringCredentials?.formatId) {\n return props.layerRequiringCredentials.formatId;\n }\n return undefined;\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\n\n const [dialogTitle] = React.useState(MapLayersUI.localization.getLocalizedString(props.layerRequiringCredentials || props.mapLayerSourceToEdit ? \"mapLayers:CustomAttach.EditCustomLayer\" : \"mapLayers:CustomAttach.AttachCustomLayer\"));\n const [typeLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.Type\"));\n const [nameLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.Name\"));\n const [nameInputPlaceHolder] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.NameInputPlaceHolder\"));\n const [urlLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.URL\"));\n const [urlInputPlaceHolder] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.UrlInputPlaceHolder\"));\n const [iTwinSettingsLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.StoreOnITwinSettings\"));\n const [modelSettingsLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.StoreOnModelSettings\"));\n const [missingCredentialsLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.MissingCredentials\"));\n const [invalidCredentialsLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.InvalidCredentials\"));\n const [externalLoginTitle] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLogin\"));\n const [externalLoginFailedMsg] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginFailed\"));\n const [externalLoginSucceededMsg] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginSucceeded\"));\n const [externalLoginWaitingMsg] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginWaiting\"));\n const [externalLoginTryAgainLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginTryAgain\"));\n const [serverRequireCredentials, setServerRequireCredentials] = React.useState(false);\n const [invalidCredentialsProvided, setInvalidCredentialsProvided] = React.useState(false);\n const [layerAttachPending, setLayerAttachPending] = React.useState(false);\n const [layerAuthPending, setLayerAuthPending] = React.useState(false);\n const [mapUrl, setMapUrl] = React.useState(getMapUrlFromProps());\n const [mapName, setMapName] = React.useState(getMapNameFromProps());\n const [userName, setUserName] = React.useState(\"\");\n const [password, setPassword] = React.useState(\"\");\n const [noSaveSettingsWarning] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.NoSaveSettingsWarning\"));\n const [passwordLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Password\"));\n const [passwordRequiredLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.PasswordRequired\"));\n const [userNameLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Username\"));\n const [userNameRequiredLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.UsernameRequired\"));\n const [settingsStorage, setSettingsStorageRadio] = React.useState(\"iTwin\");\n const [oauthProcessSucceeded, setOAuthProcessSucceeded] = React.useState<undefined | boolean>(undefined);\n const [showOauthPopup, setShowOauthPopup] = React.useState(false);\n const [externalLoginUrl, setExternalLoginUrl] = React.useState<string | undefined>();\n const [onOauthProcessEnd] = React.useState(new BeEvent());\n const [accessClient, setAccessClient] = React.useState<MapLayerAccessClient | undefined>();\n const [isAccessClientInitialized, setAccessClientInitialized] = React.useState(false);\n const [shouldAutoAttachSource, setShouldAutoAttachSource] = React.useState(true);\n\n const [mapType, setMapType] = React.useState(getFormatFromProps() ?? \"ArcGIS\");\n\n // 'isMounted' is used to prevent any async operation once the hook has been\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\n const isMounted = React.useRef(false);\n React.useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n const [isSettingsStorageAvailable] = React.useState(MapLayersUI.iTwinConfig && props?.activeViewport?.iModel?.iTwinId);\n const [hasImodelContext] = React.useState(\n props?.activeViewport?.iModel?.iTwinId !== undefined\n && props.activeViewport.iModel.iTwinId !== Guid.empty\n && props?.activeViewport?.iModel?.iModelId !== undefined\n && props?.activeViewport.iModel.iModelId !== Guid.empty);\n\n const handleCancel = React.useCallback(() => {\n if (props.onCancelResult) {\n props.onCancelResult();\n return;\n }\n }, [props]);\n\n const onUsernameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setUserName(event.target.value);\n if (invalidCredentialsProvided)\n setInvalidCredentialsProvided(false);\n }, [setUserName, invalidCredentialsProvided, setInvalidCredentialsProvided]);\n\n const onPasswordChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setPassword(event.target.value);\n if (invalidCredentialsProvided)\n setInvalidCredentialsProvided(false);\n }, [setPassword, invalidCredentialsProvided, setInvalidCredentialsProvided]);\n\n const handleArcGisLogin = React.useCallback(() => {\n setLayerAuthPending(true);\n setShowOauthPopup(true);\n if (oauthProcessSucceeded === false) {\n setOAuthProcessSucceeded(undefined);\n }\n\n }, [oauthProcessSucceeded]);\n\n // return true if authorization is needed\n const updateAuthState = React.useCallback(async (source: MapLayerSource, sourceValidation: MapLayerSourceValidation) => {\n const sourceRequireAuth = (sourceValidation.status === MapLayerSourceStatus.RequireAuth);\n let invalidCredentials = (sourceValidation.status === MapLayerSourceStatus.InvalidCredentials);\n if (sourceRequireAuth) {\n let hasTokenEndPoint = false;\n const settings = source.toLayerSettings();\n\n if (accessClient !== undefined && accessClient.getTokenServiceEndPoint !== undefined && settings !== undefined) {\n try {\n const tokenEndpoint = await accessClient.getTokenServiceEndPoint(settings.url);\n if (tokenEndpoint !== undefined) {\n const loginUrl = tokenEndpoint.getLoginUrl();\n setExternalLoginUrl(loginUrl);\n hasTokenEndPoint = true;\n }\n\n } catch (_error) {\n\n }\n } else if (userName.length > 0 || password.length > 0 ) {\n // This is a patch until @itwin\\core-frontend return the expected 'InvalidCredentials' status.\n invalidCredentials = true;\n }\n\n if (!hasTokenEndPoint && (userName.length > 0 || password.length > 0 )) {\n // This is a patch until @itwin\\core-frontend return the expected 'InvalidCredentials' status.\n invalidCredentials = true;\n }\n }\n setServerRequireCredentials(sourceRequireAuth || invalidCredentials);\n if (invalidCredentials) {\n setInvalidCredentialsProvided(true);\n } else if (invalidCredentialsProvided) {\n setInvalidCredentialsProvided(false); // flag reset\n }\n\n return sourceRequireAuth || invalidCredentials;\n }, [accessClient, invalidCredentialsProvided, password.length, userName.length]);\n\n const onNameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setMapName(event.target.value);\n }, [setMapName]);\n\n const onRadioChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setSettingsStorageRadio(event.target.value);\n }, [setSettingsStorageRadio]);\n\n const onUrlChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setMapUrl(event.target.value);\n }, [setMapUrl]);\n\n const createSource = React.useCallback(() => {\n let source: MapLayerSource | undefined;\n if (mapUrl && mapName) {\n source = MapLayerSource.fromJSON({\n url: mapUrl,\n name: mapName,\n formatId: mapType,\n });\n\n // Set credentials separately since they are not part of JSON\n if (source) {\n source.userName = userName || undefined; // When there is no value, empty string is always returned, in this case force it to undefined,\n source.password = password || undefined;\n }\n\n }\n return source;\n }, [mapName, mapType, mapUrl, password, userName]);\n\n const handleOk = React.useCallback(() => {\n const source = createSource();\n if (source === undefined || props.mapLayerSourceToEdit) {\n onOkResult();\n\n if (source === undefined) {\n // Close the dialog and inform end user something went wrong.\n const msgError = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerLayerSourceCreationFailed\");\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttachError\", { error: msgError, sourceName: mapName });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n return;\n }\n\n // Simply change the source definition in the setting service\n if (props.mapLayerSourceToEdit !== undefined) {\n const vp = props.activeViewport;\n void (async () => {\n if (isSettingsStorageAvailable && vp?.iModel?.iTwinId) {\n try {\n await MapLayerPreferences.replaceSource(props.mapLayerSourceToEdit!, source, vp.iModel.iTwinId, vp?.iModel.iModelId);\n } catch (err: any) {\n const errorMessage = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerEditError\", { layerName: props.mapLayerSourceToEdit?.name });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, errorMessage));\n return;\n }\n }\n })();\n return;\n }\n }\n\n // Attach source asynchronously.\n void (async () => {\n\n try {\n setLayerAttachPending(true);\n const validation = await source.validateSource(true);\n\n if (isMounted.current) {\n setLayerAttachPending(false);\n }\n\n if (validation.status === MapLayerSourceStatus.Valid) {\n // Update service settings if storage is available and we are not prompting user for credentials\n if (isSettingsStorageAvailable && !props.layerRequiringCredentials) {\n const storeOnIModel = (hasImodelContext ? \"Model\" === settingsStorage : undefined);\n const vp = props.activeViewport;\n if (vp?.iModel.iTwinId && !(await MapLayerPreferences.storeSource(source, vp.iModel.iTwinId, vp.iModel.iModelId, storeOnIModel))) {\n const msgError = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerPreferencesStoreFailed\");\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msgError));\n }\n }\n\n onOkResult({source, validation});\n } else if (validation.status === MapLayerSourceStatus.InvalidCoordinateSystem) {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.InvalidCoordinateSystem\");\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n onOkResult({source, validation});\n } else {\n const authNeeded = await updateAuthState(source, validation);\n if (!authNeeded) {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ValidationError\");\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, `${msg} ${source.url}`));\n onOkResult({source, validation});\n }\n }\n } catch (error) {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttachError\", { error, sourceName: source.name });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n onOkResult();\n }\n })();\n\n }, [createSource, mapName, props.mapLayerSourceToEdit, props.activeViewport, onOkResult, isSettingsStorageAvailable, updateAuthState, hasImodelContext, props.layerRequiringCredentials, settingsStorage]);\n\n React.useEffect(() => {\n const handleOAuthProcessEnd = (success: boolean, _state: any) => {\n onOauthProcessEnd.raiseEvent(success, _state);\n };\n\n const ac = IModelApp.mapLayerFormatRegistry.getAccessClient(mapType);\n if (ac?.onOAuthProcessEnd) {\n setAccessClient(ac); // cache it, so we dont need to make another lookup;\n ac.onOAuthProcessEnd.addListener(handleOAuthProcessEnd);\n }\n setAccessClientInitialized(true);\n return () => {\n if (ac?.onOAuthProcessEnd) {\n ac.onOAuthProcessEnd.removeListener(handleOAuthProcessEnd);\n }\n\n setAccessClient(undefined);\n setAccessClientInitialized(false);\n };\n }, [mapType, onOauthProcessEnd, setAccessClient]);\n\n // After a map type change, make sure the different Oauth states are reset.\n React.useEffect(() => {\n // Reset few states\n setServerRequireCredentials(false);\n setInvalidCredentialsProvided(false);\n setShowOauthPopup(false);\n setOAuthProcessSucceeded(undefined);\n setExternalLoginUrl(undefined);\n\n }, [mapType]);\n\n // The first time the dialog is loaded and we already know the layer requires auth. (i.e ImageryProvider already made an attempt)\n // makes a request to discover the authentification types and adjust UI accordingly (i.e. username/password fields, Oauth popup)\n // Without this effect, user would have to manually click the 'OK' button in order to trigger the layer connection.\n React.useEffect(() => {\n // Attach source asynchronously.\n void (async () => {\n if (isAccessClientInitialized\n && shouldAutoAttachSource\n && props.layerRequiringCredentials?.url !== undefined\n && props.layerRequiringCredentials?.name !== undefined) {\n try {\n\n const source = MapLayerSource.fromJSON({\n url: props.layerRequiringCredentials.url,\n name: props.layerRequiringCredentials.name,\n formatId: props.layerRequiringCredentials.formatId,\n });\n\n if (source !== undefined) {\n setLayerAttachPending(true);\n setShouldAutoAttachSource(false);\n const validation = await source.validateSource(true);\n if (isMounted.current) {\n setLayerAttachPending(false);\n }\n await updateAuthState(source, validation);\n }\n } catch (_error) { }\n }\n })();\n\n }, [isAccessClientInitialized, props.layerRequiringCredentials?.formatId, props.layerRequiringCredentials?.name, props.layerRequiringCredentials?.url, shouldAutoAttachSource, updateAuthState]);\n\n const dialogContainer = React.useRef<HTMLDivElement>(null);\n\n const readyToSave = React.useCallback(() => {\n const credentialsSet = !!userName && !!password;\n const ready = (!!mapUrl && !!mapName)\n && !layerAttachPending\n && (!serverRequireCredentials || credentialsSet)\n && !invalidCredentialsProvided\n && (externalLoginUrl === undefined || (externalLoginUrl !== undefined && oauthProcessSucceeded));\n return ready;\n }, [userName, password, mapUrl, mapName, serverRequireCredentials, layerAttachPending, invalidCredentialsProvided, externalLoginUrl, oauthProcessSucceeded]);\n\n // const buttonCluster = React.useMemo(() => [\n // { type: DialogButtonType.OK, onClick: handleOk, disabled: !readyToSave() },\n // { type: DialogButtonType.Cancel, onClick: handleCancel },\n // ], [readyToSave, handleCancel, handleOk]);\n\n const handleOnKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLInputElement>) => {\n // eslint-disable-next-line deprecation/deprecation\n if (event.key === SpecialKey.Enter) {\n if (readyToSave())\n handleOk();\n }\n }, [handleOk, readyToSave]);\n\n // onOauthProcessEnd events handler\n React.useEffect(() => {\n const handleOauthProcess = (success: boolean, _state: any) => {\n setLayerAuthPending(false);\n if (success) {\n setOAuthProcessSucceeded(true);\n setShowOauthPopup(false);\n setLayerAttachPending(false);\n handleOk(); // Add the layer the same way the user would do by clicking 'ok'\n } else {\n setShowOauthPopup(false);\n setLayerAttachPending(false);\n setOAuthProcessSucceeded(false);\n }\n };\n\n onOauthProcessEnd.addListener(handleOauthProcess);\n return () => {\n onOauthProcessEnd.removeListener(handleOauthProcess);\n };\n }, [handleOk, onOauthProcessEnd]);\n\n //\n // Monitors authentication method changes\n React.useEffect(() => {\n\n if (serverRequireCredentials && oauthProcessSucceeded === undefined && externalLoginUrl !== undefined) {\n handleArcGisLogin();\n }\n }, [oauthProcessSucceeded, externalLoginUrl, handleArcGisLogin, serverRequireCredentials]);\n\n // Monitors Oauth2 popup was closed\n const handleOAuthPopupClose = React.useCallback(() => {\n setShowOauthPopup(false);\n setLayerAuthPending(false);\n if (oauthProcessSucceeded === undefined)\n setOAuthProcessSucceeded(false); // indicates there was a failed attempt\n }, [oauthProcessSucceeded]);\n\n // Utility function to get warning message section\n function renderWarningMessage(): React.ReactNode {\n let node: React.ReactNode;\n let warningMessage: string | undefined;\n\n // Get the proper warning message\n if (showOauthPopup) {\n warningMessage = externalLoginWaitingMsg;\n } else if (oauthProcessSucceeded === false) {\n warningMessage = externalLoginFailedMsg;\n } else if (oauthProcessSucceeded === true) {\n warningMessage = externalLoginSucceededMsg;\n } else if (invalidCredentialsProvided) {\n warningMessage = invalidCredentialsLabel;\n } else if (serverRequireCredentials && (!userName || !password)) {\n warningMessage = missingCredentialsLabel;\n }\n\n // Sometimes we want to add an extra node, such as a button\n let extraNode: React.ReactNode;\n if (oauthProcessSucceeded === false) {\n extraNode = <div>\n <Button onClick={handleArcGisLogin}>{externalLoginTryAgainLabel}</Button>\n </div>;\n }\n\n if (warningMessage !== undefined) {\n return (\n <div className=\"map-layer-source-warnMessage\">\n <Icon size=\"small\"><SvgStatusWarning></SvgStatusWarning></Icon>\n <span className=\"map-layer-source-warnMessage-label\">{warningMessage}</span >\n {extraNode}\n </div>);\n } else {\n return (<span className=\"map-layer-source-placeholder\">&nbsp;</span>);\n }\n return node;\n }\n\n // Use a hook to display the popup.\n // The display of the popup is controlled by the 'showOauthPopup' state variable.\n useCrossOriginPopup(showOauthPopup, externalLoginUrl, externalLoginTitle, 450, 450, handleOAuthPopupClose);\n\n function getFooter() {\n\n return (\n <div className=\"map-layer-source-footer\">\n <div className=\"map-layer-source-footer-status\"/>\n <div>\n <Button\n className=\"map-layer-features-footer-button\"\n styleType='high-visibility'\n onClick={handleOk}\n disabled={!readyToSave()}\n >\n {props?.mapLayerSourceToEdit ? MapLayersUI.translate(\"Dialog.Edit\") : MapLayersUI.translate(\"Dialog.Add\")}\n </Button>\n <Button\n className=\"map-layer-source-footer-button\"\n styleType='default'\n onClick={handleCancel}\n >\n {MapLayersUI.translate(\"Dialog.Cancel\")}\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div ref={dialogContainer}>\n <Dialog\n className=\"map-layer-url-dialog\"\n title={dialogTitle}\n opened={true}\n resizable={true}\n movable={true}\n modal={true}\n footer={getFooter()}\n onClose={handleCancel}\n onEscape={handleCancel}\n minHeight={120}\n maxWidth={600}\n titleStyle={{ paddingLeft: \"10px\" }}\n footerStyle={{ paddingBottom: \"10px\", paddingRight: \"10px\" }}\n trapFocus={false}\n >\n <div className=\"map-layer-url-dialog-content\">\n <div className=\"map-layer-source-url\">\n <span className=\"map-layer-source-label\">{typeLabel}</span>\n <SelectMapFormat\n value={mapType}\n disabled={props.layerRequiringCredentials !== undefined || props.mapLayerSourceToEdit !== undefined || layerAttachPending || layerAuthPending}\n onChange={setMapType}\n mapTypesOptions={mapTypesOptions}\n />\n <span className=\"map-layer-source-label\">{nameLabel}</span>\n <Input className=\"map-layer-source-input\" placeholder={nameInputPlaceHolder} onChange={onNameChange} value={mapName} disabled={props.layerRequiringCredentials !== undefined || layerAttachPending || layerAuthPending} />\n <span className=\"map-layer-source-label\">{urlLabel}</span>\n <Input className=\"map-layer-source-input\" placeholder={urlInputPlaceHolder} onKeyPress={handleOnKeyDown} onChange={onUrlChange} disabled={props.mapLayerSourceToEdit !== undefined || layerAttachPending || layerAuthPending} value={mapUrl} />\n {serverRequireCredentials\n && externalLoginUrl === undefined // external login is handled in popup\n && props.mapLayerSourceToEdit === undefined &&\n <>\n <span className=\"map-layer-source-label\">{userNameLabel}</span>\n <LabeledInput className=\"map-layer-source-input\"\n displayStyle=\"inline\"\n placeholder={serverRequireCredentials ? userNameRequiredLabel : userNameLabel}\n status={(!userName && serverRequireCredentials) || invalidCredentialsProvided ? \"warning\" : undefined}\n disabled={layerAttachPending || layerAuthPending}\n onChange={onUsernameChange}\n value={userName}\n size=\"small\" />\n\n <span className=\"map-layer-source-label\">{passwordLabel}</span>\n <LabeledInput className=\"map-layer-source-input\"\n\n displayStyle=\"inline\"\n type=\"password\" placeholder={serverRequireCredentials ? passwordRequiredLabel : passwordLabel}\n status={(!password && serverRequireCredentials) || invalidCredentialsProvided ? \"warning\" : undefined}\n disabled={layerAttachPending || layerAuthPending}\n onChange={onPasswordChange}\n onKeyPress={handleOnKeyDown}\n value={password}\n size=\"small\" />\n\n </>\n }\n\n {/* Store settings options, not shown when editing a layer */}\n {!props.layerRequiringCredentials\n && !props.mapLayerSourceToEdit\n && <div title={!isSettingsStorageAvailable ? noSaveSettingsWarning : \"\"}>\n {hasImodelContext &&\n <div>\n <Radio disabled={!isSettingsStorageAvailable}\n name=\"settingsStorage\" value=\"iTwin\"\n label={iTwinSettingsLabel} checked={settingsStorage === \"iTwin\"}\n onChange={onRadioChange} />\n <Radio disabled={!isSettingsStorageAvailable}\n name=\"settingsStorage\" value=\"Model\"\n label={modelSettingsLabel} checked={settingsStorage === \"Model\"}\n onChange={onRadioChange} />\n </div>}\n </div>}\n </div>\n </div>\n\n {/* Warning message */}\n {renderWarningMessage()}\n\n {/* Progress bar */}\n {(layerAttachPending || layerAuthPending) &&\n <div className=\"map-layer-source-progressBar\">\n <ProgressLinear indeterminate />\n </div>\n }\n </Dialog>\n </div >\n );\n}\n"]}
1
+ {"version":3,"file":"MapUrlDialog.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapUrlDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n// cSpell:ignore Modeless WMTS\n\nimport \"./MapUrlDialog.scss\";\nimport * as React from \"react\";\nimport { SpecialKey } from \"@itwin/appui-abstract\";\nimport { BeEvent, Guid } from \"@itwin/core-bentley\";\nimport { ImageMapLayerSettings } from \"@itwin/core-common\";\nimport {\n IModelApp, MapLayerAccessClient, MapLayerSource, MapLayerSourceStatus, MapLayerSourceValidation, NotifyMessageDetails, OutputMessagePriority,\n ScreenViewport,\n} from \"@itwin/core-frontend\";\nimport { Dialog, useCrossOriginPopup } from \"@itwin/core-react\";\nimport { SvgStatusWarning, SvgTechnicalPreviewMini } from \"@itwin/itwinui-icons-color-react\";\nimport { Button, Icon, Input, LabeledInput, ProgressLinear } from \"@itwin/itwinui-react\";\nimport { CustomParamsMappingStorage } from \"../../CustomParamsMappingStorage\";\nimport { CustomParamsStorage } from \"../../CustomParamsStorage\";\nimport { CustomParamUtils } from \"../../CustomParamUtils\";\nimport { MapLayerPreferences } from \"../../MapLayerPreferences\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { MapLayerOptions } from \"../Interfaces\";\nimport { SelectCustomParam } from \"./SelectCustomParam\";\nimport { SelectMapFormat } from \"./SelectMapFormat\";\nimport { UserPreferencesStorageOptions } from \"./UserPreferencesStorageOptions\";\n\nexport const MAP_TYPES = {\n wms: \"WMS\",\n arcGis: \"ArcGIS\",\n wmts: \"WMTS\",\n tileUrl: \"TileURL\",\n arcGisFeature: \"ArcGISFeature\",\n};\n\nexport type LayerCreationMode = \"single\"|\"multiple\";\ninterface MapUrlDialogProps {\n activeViewport?: ScreenViewport;\n isOverlay: boolean;\n onOkResult: (result?: SourceState) => void;\n onCancelResult?: () => void;\n mapLayerOptions?: MapLayerOptions;\n\n // An optional layer definition can be provide to enable the edit mode\n signInModeArgs?: {\n layer: ImageMapLayerSettings;\n validation?: MapLayerSourceValidation;\n source?: MapLayerSource;\n };\n\n mapLayerSourceToEdit?: MapLayerSource;\n}\n\nexport interface SourceState {\n source: MapLayerSource;\n validation: MapLayerSourceValidation;\n customParamIdx?: { [key: string]: string };\n privateCustomParamIdx?: { [key: string]: string };\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function MapUrlDialog(props: MapUrlDialogProps) {\n const { onOkResult, mapLayerOptions } = props;\n\n const getMapUrlFromProps = React.useCallback(() => {\n if (props.mapLayerSourceToEdit) {\n return props.mapLayerSourceToEdit.url;\n } else if (props.signInModeArgs) {\n return props.signInModeArgs.layer.url;\n }\n return \"\";\n }, [props.mapLayerSourceToEdit, props.signInModeArgs]);\n\n const getMapNameFromProps = React.useCallback(() => {\n if (props.mapLayerSourceToEdit) {\n return props.mapLayerSourceToEdit.name;\n } else if (props.signInModeArgs) {\n return props.signInModeArgs.layer.name;\n }\n return \"\";\n }, [props.mapLayerSourceToEdit, props.signInModeArgs]);\n\n const getFormatFromProps = React.useCallback(() => {\n if (props.mapLayerSourceToEdit) {\n return props.mapLayerSourceToEdit.formatId;\n } else if (props.signInModeArgs) {\n return props.signInModeArgs.layer.formatId;\n }\n return undefined;\n }, [props.mapLayerSourceToEdit, props.signInModeArgs]);\n\n const getCustomParamsMapping = React.useCallback((url: string): string [] => {\n const cpMappingStorage = new CustomParamsMappingStorage();\n const cpMapping = cpMappingStorage.get(url.toLowerCase());\n if (cpMapping && cpMapping.length > 0)\n return cpMapping[0].customParamNames;\n return [];\n }, []);\n\n const [dialogTitle] = React.useState(MapLayersUI.localization.getLocalizedString(props.signInModeArgs || props.mapLayerSourceToEdit ? \"mapLayers:CustomAttach.EditCustomLayer\" : \"mapLayers:CustomAttach.AttachCustomLayer\"));\n const [typeLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.Type\"));\n const [nameLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.Name\"));\n const [nameInputPlaceHolder] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.NameInputPlaceHolder\"));\n const [urlLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.URL\"));\n const [urlInputPlaceHolder] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.UrlInputPlaceHolder\"));\n const [missingCredentialsLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.MissingCredentials\"));\n const [invalidCredentialsLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.InvalidCredentials\"));\n const [externalLoginTitle] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLogin\"));\n const [externalLoginFailedMsg] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginFailed\"));\n const [externalLoginSucceededMsg] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginSucceeded\"));\n const [externalLoginWaitingMsg] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginWaiting\"));\n const [externalLoginTryAgainLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginTryAgain\"));\n const [serverRequireCredentials, setServerRequireCredentials] = React.useState(false);\n const [invalidCredentialsProvided, setInvalidCredentialsProvided] = React.useState(false);\n const [layerAttachPending, setLayerAttachPending] = React.useState(false);\n const [layerAuthPending, setLayerAuthPending] = React.useState(false);\n const [mapUrl, setMapUrl] = React.useState(getMapUrlFromProps());\n const [mapName, setMapName] = React.useState(getMapNameFromProps());\n const [userName, setUserName] = React.useState(\"\");\n const [password, setPassword] = React.useState(\"\");\n const [noSaveSettingsWarning] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.NoSaveSettingsWarning\"));\n const [passwordLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Password\"));\n const [passwordRequiredLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.PasswordRequired\"));\n const [userNameLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Username\"));\n const [userNameRequiredLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.UsernameRequired\"));\n const [settingsStorage, setSettingsStorageRadio] = React.useState(\"iTwin\");\n const [oauthProcessSucceeded, setOAuthProcessSucceeded] = React.useState<undefined | boolean>(undefined);\n const [showOauthPopup, setShowOauthPopup] = React.useState(false);\n const [externalLoginUrl, setExternalLoginUrl] = React.useState<string | undefined>();\n const [onOauthProcessEnd] = React.useState(new BeEvent());\n const [accessClient, setAccessClient] = React.useState<MapLayerAccessClient | undefined>();\n const [isAccessClientInitialized, setAccessClientInitialized] = React.useState(false);\n const [shouldAutoAttachSource, setShouldAutoAttachSource] = React.useState(true);\n const [incompatibleFormat, setIncompatibleFormat] = React.useState(false);\n\n const [mapType, setMapType] = React.useState(getFormatFromProps() ?? \"ArcGIS\");\n const [customParamNamesChangedByUser, SetCustomParamNamesChangedByUser] = React.useState<boolean>(false);\n const [customParamNames, setCustomParamNames] = React.useState<string[]|undefined>(() => {\n if (mapUrl)\n return getCustomParamsMapping(mapUrl);\n return undefined;\n });\n\n // 'isMounted' is used to prevent any async operation once the hook has been\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\n const isMounted = React.useRef(false);\n React.useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n const [isSettingsStorageAvailable] = React.useState(MapLayersUI.iTwinConfig && props?.activeViewport?.iModel?.iTwinId);\n const [hasImodelContext] = React.useState(\n props?.activeViewport?.iModel?.iTwinId !== undefined\n && props.activeViewport.iModel.iTwinId !== Guid.empty\n && props?.activeViewport?.iModel?.iModelId !== undefined\n && props?.activeViewport.iModel.iModelId !== Guid.empty);\n\n const handleCancel = React.useCallback(() => {\n if (props.onCancelResult) {\n props.onCancelResult();\n return;\n }\n }, [props]);\n\n const onUsernameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setUserName(event.target.value);\n if (invalidCredentialsProvided)\n setInvalidCredentialsProvided(false);\n }, [setUserName, invalidCredentialsProvided, setInvalidCredentialsProvided]);\n\n const onPasswordChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setPassword(event.target.value);\n if (invalidCredentialsProvided)\n setInvalidCredentialsProvided(false);\n }, [setPassword, invalidCredentialsProvided, setInvalidCredentialsProvided]);\n\n const handleArcGisLogin = React.useCallback(() => {\n setLayerAuthPending(true);\n setShowOauthPopup(true);\n if (oauthProcessSucceeded === false) {\n setOAuthProcessSucceeded(undefined);\n }\n\n }, [oauthProcessSucceeded]);\n\n // return true if authorization is needed\n const updateAuthState = React.useCallback(async (source: MapLayerSource, sourceValidation: MapLayerSourceValidation) => {\n const sourceRequireAuth = (sourceValidation.status === MapLayerSourceStatus.RequireAuth);\n let invalidCredentials = (sourceValidation.status === MapLayerSourceStatus.InvalidCredentials);\n if (sourceRequireAuth) {\n let hasTokenEndPoint = false;\n const settings = source.toLayerSettings();\n\n if (accessClient !== undefined && accessClient.getTokenServiceEndPoint !== undefined && settings !== undefined) {\n try {\n const tokenEndpoint = await accessClient.getTokenServiceEndPoint(settings.url);\n if (tokenEndpoint !== undefined) {\n const loginUrl = tokenEndpoint.getLoginUrl();\n setExternalLoginUrl(loginUrl);\n hasTokenEndPoint = true;\n }\n\n } catch (_error) {\n\n }\n } else if (userName.length > 0 || password.length > 0 ) {\n // This is a patch until @itwin\\core-frontend return the expected 'InvalidCredentials' status.\n invalidCredentials = true;\n }\n\n if (!hasTokenEndPoint && (userName.length > 0 || password.length > 0 )) {\n // This is a patch until @itwin\\core-frontend return the expected 'InvalidCredentials' status.\n invalidCredentials = true;\n }\n }\n setServerRequireCredentials(sourceRequireAuth || invalidCredentials);\n if (invalidCredentials) {\n setInvalidCredentialsProvided(true);\n } else if (invalidCredentialsProvided) {\n setInvalidCredentialsProvided(false); // flag reset\n }\n\n return sourceRequireAuth || invalidCredentials;\n }, [accessClient, invalidCredentialsProvided, password.length, userName.length]);\n\n const onNameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setMapName(event.target.value);\n }, []);\n\n const onRadioChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setSettingsStorageRadio(event.target.value);\n }, [setSettingsStorageRadio]);\n\n const onUrlChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setMapUrl(value);\n\n if (!customParamNamesChangedByUser) {\n if (value === \"\") {\n setCustomParamNames(undefined);\n } else {\n const paramNames = getCustomParamsMapping(value);\n setCustomParamNames(paramNames);\n }\n\n }\n\n }, [getCustomParamsMapping, customParamNamesChangedByUser]);\n\n const createSource = React.useCallback(() => {\n let source: MapLayerSource | undefined;\n if (mapUrl && mapName) {\n source = MapLayerSource.fromJSON({\n url: mapUrl,\n name: mapName,\n formatId: mapType,\n });\n\n // Set credentials separately since they are not part of JSON\n if (source) {\n source.userName = userName || undefined; // When there is no value, empty string is always returned, in this case force it to undefined,\n source.password = password || undefined;\n\n if (customParamNames) {\n CustomParamUtils.setSourceCustomParams(source, customParamNames);\n }\n }\n\n }\n return source;\n }, [customParamNames, mapName, mapType, mapUrl, password, userName]);\n\n const handleOk = React.useCallback(() => {\n const source = createSource();\n if (source === undefined || props.mapLayerSourceToEdit) {\n onOkResult();\n\n if (source === undefined) {\n // Close the dialog and inform end user something went wrong.\n const msgError = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerLayerSourceCreationFailed\");\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttachError\", { error: msgError, sourceName: mapName });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n return;\n }\n\n // Store custom params mapping\n if (customParamNames) {\n const cpmStorage = new CustomParamsMappingStorage();\n cpmStorage.save(mapUrl.toLowerCase(), {customParamNames});\n }\n\n // Simply change the source definition in the setting service\n if (props.mapLayerSourceToEdit !== undefined) {\n // Apply changes to original source object\n props.mapLayerSourceToEdit.savedQueryParams = {...source.savedQueryParams};\n props.mapLayerSourceToEdit.unsavedQueryParams = {...source.unsavedQueryParams};\n\n const vp = props.activeViewport;\n void (async () => {\n if (isSettingsStorageAvailable && vp?.iModel?.iTwinId) {\n try {\n await MapLayerPreferences.replaceSource(props.mapLayerSourceToEdit!, source, vp.iModel.iTwinId, vp?.iModel.iModelId);\n } catch (err: any) {\n const errorMessage = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerEditError\", { layerName: props.mapLayerSourceToEdit?.name });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, errorMessage));\n return;\n }\n }\n })();\n return;\n }\n }\n\n // Attach source asynchronously.\n void (async () => {\n\n try {\n setLayerAttachPending(true);\n const validation = await source.validateSource(true);\n\n if (isMounted.current) {\n setLayerAttachPending(false);\n }\n\n if (validation.status === MapLayerSourceStatus.Valid) {\n // Update service settings if storage is available and we are not prompting user for credentials\n if (isSettingsStorageAvailable && !props.signInModeArgs) {\n const storeOnIModel = (hasImodelContext ? \"Model\" === settingsStorage : undefined);\n const vp = props.activeViewport;\n if (vp?.iModel.iTwinId && !(await MapLayerPreferences.storeSource(source, vp.iModel.iTwinId, vp.iModel.iModelId, storeOnIModel))) {\n const msgError = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerPreferencesStoreFailed\");\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msgError));\n }\n }\n\n // Link an API key to this map-layer URL\n const customParamIdx: { [key: string]: string } = {};\n const privateCustomParamIdx: { [key: string]: string } = {};\n if (customParamNames && customParamNames.length>0) {\n // Link the map-layers URL custom params.\n const cpmStorage = new CustomParamsMappingStorage();\n cpmStorage.save(mapUrl.toLowerCase(), {customParamNames});\n\n const cpStorage = new CustomParamsStorage();\n customParamNames.forEach((customParamName) => {\n const items = cpStorage.get(customParamName);\n if (items && items.length > 0 ) {\n const item = items[0];\n (item.secret ? privateCustomParamIdx : customParamIdx)[item.key] = item.value;\n }\n });\n }\n\n onOkResult({source, validation, customParamIdx, privateCustomParamIdx});\n } else if (validation.status === MapLayerSourceStatus.InvalidCoordinateSystem) {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.InvalidCoordinateSystem\");\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n onOkResult({source, validation});\n } else if (validation.status === MapLayerSourceStatus.IncompatibleFormat) {\n setIncompatibleFormat(true);\n } else {\n const authNeeded = await updateAuthState(source, validation);\n if (!authNeeded) {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ValidationError\");\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, `${msg} ${source.url}`));\n onOkResult({source, validation});\n }\n }\n } catch (error) {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttachError\", { error, sourceName: source.name });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n onOkResult();\n }\n })();\n\n }, [createSource, props.mapLayerSourceToEdit, props.activeViewport, props.signInModeArgs, onOkResult, customParamNames, mapName, mapUrl, isSettingsStorageAvailable, hasImodelContext, settingsStorage, updateAuthState]);\n\n React.useEffect(() => {\n const handleOAuthProcessEnd = (success: boolean, _state: any) => {\n onOauthProcessEnd.raiseEvent(success, _state);\n };\n\n const ac = IModelApp.mapLayerFormatRegistry.getAccessClient(mapType);\n if (ac?.onOAuthProcessEnd) {\n setAccessClient(ac); // cache it, so we dont need to make another lookup;\n ac.onOAuthProcessEnd.addListener(handleOAuthProcessEnd);\n }\n setAccessClientInitialized(true);\n return () => {\n if (ac?.onOAuthProcessEnd) {\n ac.onOAuthProcessEnd.removeListener(handleOAuthProcessEnd);\n }\n\n setAccessClient(undefined);\n setAccessClientInitialized(false);\n };\n }, [mapType, onOauthProcessEnd, setAccessClient]);\n\n const resetSignInState = React.useCallback(() => {\n setServerRequireCredentials(false);\n setInvalidCredentialsProvided(false);\n setShowOauthPopup(false);\n setOAuthProcessSucceeded(undefined);\n setExternalLoginUrl(undefined);\n }, []);\n\n // After a map type chang(or setting a new custom query Parameter), make sure the different Oauth states are reset.\n React.useEffect(() => {\n resetSignInState();\n }, [mapType, resetSignInState]);\n\n // After a map type change, make sure the different Oauth states are reset.\n React.useEffect(() => {\n setIncompatibleFormat(false);\n }, [mapType, mapUrl]);\n\n // The first time the dialog is loaded and we already know the layer requires auth. (i.e ImageryProvider already made an attempt)\n // makes a request to discover the authentification types and adjust UI accordingly (i.e. username/password fields, Oauth popup)\n // Without this effect, user would have to manually click the 'OK' button in order to trigger the layer connection.\n React.useEffect(() => {\n // Attach source asynchronously.\n void (async () => {\n if (isAccessClientInitialized\n && shouldAutoAttachSource\n && props.signInModeArgs !== undefined) {\n try {\n\n let source = props.signInModeArgs.source;\n let validation = props.signInModeArgs.validation;\n if (!source || !validation) {\n // In some cases we don't know why the layer failed to attach, so we need to go through validation process\n source = MapLayerSource.fromJSON({\n url: props.signInModeArgs.layer.url,\n name: props.signInModeArgs.layer.name,\n formatId: props.signInModeArgs.layer.formatId,\n });\n\n if (source !== undefined) {\n if (props.signInModeArgs.layer.savedQueryParams)\n source.savedQueryParams = {...props.signInModeArgs.layer.savedQueryParams};\n if (props.signInModeArgs.layer.unsavedQueryParams)\n source.unsavedQueryParams = {...props.signInModeArgs.layer.unsavedQueryParams};\n\n setLayerAttachPending(true);\n\n validation = await source.validateSource(true);\n if (isMounted.current) {\n setLayerAttachPending(false);\n }\n }\n }\n if (source && validation) {\n setShouldAutoAttachSource(false);\n await updateAuthState(source, validation);\n }\n\n } catch (_error) { }\n }\n })();\n\n }, [isAccessClientInitialized, props.signInModeArgs, shouldAutoAttachSource, updateAuthState]);\n\n const dialogContainer = React.useRef<HTMLDivElement>(null);\n\n const readyToSave = React.useCallback(() => {\n const credentialsSet = !!userName && !!password;\n const ready = (!!mapUrl && !!mapName)\n && !layerAttachPending\n && (!serverRequireCredentials || credentialsSet)\n && !invalidCredentialsProvided\n && !incompatibleFormat\n && (externalLoginUrl === undefined || (externalLoginUrl !== undefined && oauthProcessSucceeded));\n return ready;\n }, [userName, password, mapUrl, mapName, layerAttachPending, serverRequireCredentials, invalidCredentialsProvided, incompatibleFormat, externalLoginUrl, oauthProcessSucceeded]);\n\n const handleOnKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLInputElement>) => {\n // eslint-disable-next-line deprecation/deprecation\n if (event.key === SpecialKey.Enter) {\n if (readyToSave())\n handleOk();\n }\n }, [handleOk, readyToSave]);\n\n // onOauthProcessEnd events handler\n React.useEffect(() => {\n const handleOauthProcess = (success: boolean, _state: any) => {\n setLayerAuthPending(false);\n if (success) {\n setOAuthProcessSucceeded(true);\n setShowOauthPopup(false);\n setLayerAttachPending(false);\n handleOk(); // Add the layer the same way the user would do by clicking 'ok'\n } else {\n setShowOauthPopup(false);\n setLayerAttachPending(false);\n setOAuthProcessSucceeded(false);\n }\n };\n\n onOauthProcessEnd.addListener(handleOauthProcess);\n return () => {\n onOauthProcessEnd.removeListener(handleOauthProcess);\n };\n }, [handleOk, onOauthProcessEnd]);\n\n //\n // Monitors authentication method changes\n React.useEffect(() => {\n\n if (serverRequireCredentials && oauthProcessSucceeded === undefined && externalLoginUrl !== undefined) {\n handleArcGisLogin();\n }\n }, [oauthProcessSucceeded, externalLoginUrl, handleArcGisLogin, serverRequireCredentials]);\n\n // Monitors Oauth2 popup was closed\n const handleOAuthPopupClose = React.useCallback(() => {\n setShowOauthPopup(false);\n setLayerAuthPending(false);\n if (oauthProcessSucceeded === undefined)\n setOAuthProcessSucceeded(false); // indicates there was a failed attempt\n }, [oauthProcessSucceeded]);\n\n // Utility function to get warning message section\n function renderWarningMessage(): React.ReactNode {\n let warningMessage: string | undefined;\n\n // Get the proper warning message\n if (showOauthPopup) {\n warningMessage = externalLoginWaitingMsg;\n } else if (oauthProcessSucceeded === false) {\n warningMessage = externalLoginFailedMsg;\n } else if (oauthProcessSucceeded === true) {\n warningMessage = externalLoginSucceededMsg;\n } else if (invalidCredentialsProvided) {\n warningMessage = invalidCredentialsLabel;\n } else if (serverRequireCredentials && (!userName || !password)) {\n warningMessage = missingCredentialsLabel;\n }\n\n // Sometimes we want to add an extra node, such as a button\n let extraNode: React.ReactNode;\n if (oauthProcessSucceeded === false) {\n extraNode = <div>\n <Button onClick={handleArcGisLogin}>{externalLoginTryAgainLabel}</Button>\n </div>;\n }\n\n if (warningMessage !== undefined) {\n return (\n <div className=\"map-layer-source-warnMessage\">\n <Icon size=\"small\"><SvgStatusWarning></SvgStatusWarning></Icon>\n <span className=\"map-layer-source-warnMessage-label\">{warningMessage}</span >\n {extraNode}\n </div>);\n } else {\n return (<span className=\"map-layer-source-placeholder\">&nbsp;</span>);\n }\n }\n\n // Use a hook to display the popup.\n // The display of the popup is controlled by the 'showOauthPopup' state variable.\n useCrossOriginPopup(showOauthPopup, externalLoginUrl, externalLoginTitle, 450, 450, handleOAuthPopupClose);\n\n function getFooter() {\n\n return (\n <div className=\"map-layer-source-footer\">\n <div className=\"map-layer-source-footer-status\"/>\n <div>\n <Button\n className=\"map-layer-features-footer-button\"\n styleType='high-visibility'\n onClick={handleOk}\n disabled={!readyToSave()}\n >\n {props?.mapLayerSourceToEdit ? MapLayersUI.translate(\"Dialog.Edit\") : MapLayersUI.translate(\"Dialog.Add\")}\n </Button>\n <Button\n className=\"map-layer-source-footer-button\"\n styleType='default'\n onClick={handleCancel}\n >\n {MapLayersUI.translate(\"Dialog.Cancel\")}\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div ref={dialogContainer}>\n <Dialog\n className=\"map-layer-url-dialog\"\n title={dialogTitle}\n opened={true}\n resizable={true}\n movable={true}\n modal={true}\n footer={getFooter()}\n onClose={handleCancel}\n onEscape={handleCancel}\n minHeight={120}\n maxWidth={600}\n titleStyle={{ paddingLeft: \"10px\" }}\n footerStyle={{ paddingBottom: \"10px\", paddingRight: \"10px\" }}\n trapFocus={false}\n >\n <div className=\"map-layer-url-dialog-content\">\n <div className=\"map-layer-source-url\">\n <span className=\"map-layer-source-label\">{typeLabel}</span>\n <SelectMapFormat\n value={mapType}\n disabled={props.signInModeArgs !== undefined || props.mapLayerSourceToEdit !== undefined || layerAttachPending || layerAuthPending}\n onChange={setMapType}\n mapTypesOptions={mapLayerOptions?.mapTypeOptions}\n status={incompatibleFormat ? \"warning\" : undefined}\n message={incompatibleFormat ? MapLayersUI.translate(\"CustomAttach.InvalidType\") : undefined}\n />\n <span className=\"map-layer-source-label\">{nameLabel}</span>\n <Input className=\"map-layer-source-input\" placeholder={nameInputPlaceHolder} onChange={onNameChange} value={mapName} disabled={!!props.signInModeArgs || layerAttachPending || layerAuthPending} />\n <span className=\"map-layer-source-label\">{urlLabel}</span>\n <Input className=\"map-layer-source-input\" placeholder={urlInputPlaceHolder} onKeyPress={handleOnKeyDown} onChange={onUrlChange} disabled={!!props.signInModeArgs || props.mapLayerSourceToEdit !== undefined || layerAttachPending || layerAuthPending} value={mapUrl} />\n <span className=\"map-layer-source-label\">{MapLayersUI.translate(\"CustomAttach.CustomParamsLabel\")}\n <div title={MapLayersUI.translate(\"Labels.TechPreviewBadgeTooltip\")} className=\"map-layer-source-previewBadge-icon\">\n <Icon size=\"small\"><SvgTechnicalPreviewMini /></Icon>\n </div>\n </span>\n <SelectCustomParam value={customParamNames} disabled={layerAttachPending || layerAuthPending} onChange={(paramNames) => {setCustomParamNames(paramNames); SetCustomParamNamesChangedByUser(true); resetSignInState();}}/>\n\n {serverRequireCredentials\n && externalLoginUrl === undefined // external login is handled in popup\n && props.mapLayerSourceToEdit === undefined &&\n <>\n <span className=\"map-layer-source-label\">{userNameLabel}</span>\n <LabeledInput className=\"map-layer-source-input\"\n displayStyle=\"inline\"\n placeholder={serverRequireCredentials ? userNameRequiredLabel : userNameLabel}\n status={(!userName && serverRequireCredentials) || invalidCredentialsProvided ? \"warning\" : undefined}\n disabled={layerAttachPending || layerAuthPending}\n onChange={onUsernameChange}\n value={userName}\n size=\"small\" />\n\n <span className=\"map-layer-source-label\">{passwordLabel}</span>\n <LabeledInput className=\"map-layer-source-input\"\n displayStyle=\"inline\"\n type=\"password\" placeholder={serverRequireCredentials ? passwordRequiredLabel : passwordLabel}\n status={(!password && serverRequireCredentials) || invalidCredentialsProvided ? \"warning\" : undefined}\n disabled={layerAttachPending || layerAuthPending}\n onChange={onPasswordChange}\n onKeyPress={handleOnKeyDown}\n value={password}\n size=\"small\" />\n\n </>\n }\n\n {/* Store settings options, not shown when editing a layer */}\n {!props.signInModeArgs\n && !props.mapLayerSourceToEdit\n && <div title={!isSettingsStorageAvailable ? noSaveSettingsWarning : \"\"}>\n {hasImodelContext && mapLayerOptions?.showUserPreferencesStorageOptions && (\n <UserPreferencesStorageOptions\n disabled={!isSettingsStorageAvailable}\n itwinChecked={settingsStorage === \"iTwin\"}\n modelChecked={settingsStorage === \"Model\"}\n onChange={onRadioChange}\n />\n )}\n </div>}\n </div>\n </div>\n\n {/* Warning message */}\n {renderWarningMessage()}\n\n {/* Progress bar */}\n {(layerAttachPending || layerAuthPending) &&\n <div className=\"map-layer-source-progressBar\">\n <ProgressLinear indeterminate />\n </div>\n }\n </Dialog>\n </div >\n );\n}\n"]}