@itwin/map-layers 3.0.0-dev.174 → 3.0.0-dev.175

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.
@@ -63,6 +63,7 @@
63
63
  "MapLayerEditError": "Failed to edit '{{layerName}}'",
64
64
  "MapLayerLayerSettingsConversionError": "Conversion to layer settings failed",
65
65
  "MapLayerLayerSourceCreationFailed": "Map Layer Source creation failed",
66
+ "MapLayerPreferencesStoreFailed": "Failed to save map layer definition in preferences",
66
67
  "MapLayerValidationFailed": "Map layer validation failed for URL: {{sourceUrl}}"
67
68
  },
68
69
  "Widget": {
@@ -1 +1 @@
1
- {"version":3,"file":"MapUrlDialog.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/MapUrlDialog.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACqC,cAAc,EACW,cAAc,EAClF,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,qBAAqB,CAAC;AAI7B,eAAO,MAAM,SAAS;;;;;CAKrB,CAAC;AAEF,UAAU,iBAAiB;IACzB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,eAAe,CAAC;IAGlC,yBAAyB,CAAC,EAAE,aAAa,CAAC;IAE1C,oBAAoB,CAAC,EAAE,cAAc,CAAC;CACvC;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,eA8ZpD"}
1
+ {"version":3,"file":"MapUrlDialog.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/MapUrlDialog.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACqC,cAAc,EACW,cAAc,EAClF,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,qBAAqB,CAAC;AAK7B,eAAO,MAAM,SAAS;;;;;CAKrB,CAAC;AAEF,UAAU,iBAAiB;IACzB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,eAAe,CAAC;IAGlC,yBAAyB,CAAC,EAAE,aAAa,CAAC;IAE1C,oBAAoB,CAAC,EAAE,cAAc,CAAC;CACvC;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,eAgapD"}
@@ -15,6 +15,7 @@ const core_frontend_1 = require("@itwin/core-frontend");
15
15
  require("./MapUrlDialog.scss");
16
16
  const appui_abstract_1 = require("@itwin/appui-abstract");
17
17
  const MapLayerPreferences_1 = require("../../MapLayerPreferences");
18
+ const mapLayers_1 = require("../../mapLayers");
18
19
  exports.MAP_TYPES = {
19
20
  wms: "WMS",
20
21
  arcGis: "ArcGIS",
@@ -79,7 +80,7 @@ function MapUrlDialog(props) {
79
80
  const [passwordRequiredLabel] = React.useState(MapLayersUiItemsProvider_1.MapLayersUiItemsProvider.localization.getLocalizedString("mapLayers:AuthenticationInputs.PasswordRequired"));
80
81
  const [userNameLabel] = React.useState(MapLayersUiItemsProvider_1.MapLayersUiItemsProvider.localization.getLocalizedString("mapLayers:AuthenticationInputs.Username"));
81
82
  const [userNameRequiredLabel] = React.useState(MapLayersUiItemsProvider_1.MapLayersUiItemsProvider.localization.getLocalizedString("mapLayers:AuthenticationInputs.UsernameRequired"));
82
- const [settingsStorage, setSettingsStorageRadio] = React.useState("ITwin");
83
+ const [settingsStorage, setSettingsStorageRadio] = React.useState("iTwin");
83
84
  const [mapType, setMapType] = React.useState((_b = getFormatFromProps()) !== null && _b !== void 0 ? _b : exports.MAP_TYPES.arcGis);
84
85
  // 'isMounted' is used to prevent any async operation once the hook has been
85
86
  // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.
@@ -100,7 +101,7 @@ function MapUrlDialog(props) {
100
101
  types.push({ value: exports.MAP_TYPES.tileUrl, label: exports.MAP_TYPES.tileUrl });
101
102
  return types;
102
103
  });
103
- const [isSettingsStorageAvailable] = React.useState(((_d = (_c = props === null || props === void 0 ? void 0 : props.activeViewport) === null || _c === void 0 ? void 0 : _c.iModel) === null || _d === void 0 ? void 0 : _d.iTwinId) && ((_f = (_e = props === null || props === void 0 ? void 0 : props.activeViewport) === null || _e === void 0 ? void 0 : _e.iModel) === null || _f === void 0 ? void 0 : _f.iModelId));
104
+ const [isSettingsStorageAvailable] = React.useState(mapLayers_1.MapLayersUI.iTwinConfig && ((_d = (_c = props === null || props === void 0 ? void 0 : props.activeViewport) === null || _c === void 0 ? void 0 : _c.iModel) === null || _d === void 0 ? void 0 : _d.iTwinId) && ((_f = (_e = props === null || props === void 0 ? void 0 : props.activeViewport) === null || _e === void 0 ? void 0 : _e.iModel) === null || _f === void 0 ? void 0 : _f.iModelId));
104
105
  // Even though the settings storage is available,
105
106
  // we don't always want to enable it in the UI.
106
107
  const [settingsStorageDisabled] = React.useState(!isSettingsStorageAvailable || props.mapLayerSourceToEdit !== undefined || props.layerRequiringCredentials !== undefined);
@@ -198,8 +199,10 @@ function MapUrlDialog(props) {
198
199
  else {
199
200
  // Update service settings if storage is available and we are not prompting user for credentials
200
201
  if (!settingsStorageDisabled && !props.layerRequiringCredentials) {
201
- if (!(await MapLayerPreferences_1.MapLayerPreferences.storeSource(source, storeOnIModel, vp.iModel.iTwinId, vp.iModel.iModelId)))
202
- return;
202
+ if (!(await MapLayerPreferences_1.MapLayerPreferences.storeSource(source, storeOnIModel, vp.iModel.iTwinId, vp.iModel.iModelId))) {
203
+ const msgError = MapLayersUiItemsProvider_1.MapLayersUiItemsProvider.localization.getLocalizedString("mapLayers:Messages.MapLayerPreferencesStoreFailed");
204
+ core_frontend_1.IModelApp.notifications.outputMessage(new core_frontend_1.NotifyMessageDetails(core_frontend_1.OutputMessagePriority.Error, msgError));
205
+ }
203
206
  }
204
207
  const layerSettings = source.toLayerSettings(validation.subLayers);
205
208
  if (layerSettings) {
@@ -1 +1 @@
1
- {"version":3,"file":"MapUrlDialog.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapUrlDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n// cSpell:ignore Modeless WMTS\r\n\r\nimport * as React from \"react\";\r\nimport { Input, LabeledInput, ProgressLinear, Radio, Select, SelectOption } from \"@itwin/itwinui-react\";\r\nimport { Dialog, Icon, InputStatus } from \"@itwin/core-react\";\r\nimport { ModalDialogManager } from \"@itwin/appui-react\";\r\nimport { MapLayersUiItemsProvider } from \"../MapLayersUiItemsProvider\";\r\nimport { MapTypesOptions } from \"../Interfaces\";\r\nimport {\r\n IModelApp, MapLayerImageryProviderStatus, MapLayerSource,\r\n MapLayerSourceStatus, NotifyMessageDetails, OutputMessagePriority, ScreenViewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { MapLayerProps } from \"@itwin/core-common\";\r\nimport \"./MapUrlDialog.scss\";\r\nimport { DialogButtonType, SpecialKey } from \"@itwin/appui-abstract\";\r\nimport { MapLayerPreferences } from \"../../MapLayerPreferences\";\r\n\r\nexport const MAP_TYPES = {\r\n wms: \"WMS\",\r\n arcGis: \"ArcGIS\",\r\n wmts: \"WMTS\",\r\n tileUrl: \"TileURL\",\r\n};\r\n\r\ninterface MapUrlDialogProps {\r\n activeViewport?: ScreenViewport;\r\n isOverlay: boolean;\r\n onOkResult: () => void;\r\n onCancelResult?: () => void;\r\n mapTypesOptions?: MapTypesOptions;\r\n\r\n // An optional layer definition can be provide to enable the edit mode\r\n layerRequiringCredentials?: MapLayerProps;\r\n\r\n mapLayerSourceToEdit?: MapLayerSource;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function MapUrlDialog(props: MapUrlDialogProps) {\r\n const { isOverlay, onOkResult, mapTypesOptions } = props;\r\n const supportWmsAuthentication = (mapTypesOptions?.supportWmsAuthentication ? true : false);\r\n\r\n const getMapUrlFromProps = React.useCallback(() => {\r\n if (props.mapLayerSourceToEdit) {\r\n return props.mapLayerSourceToEdit.url;\r\n } else if (props.layerRequiringCredentials?.url) {\r\n return props.layerRequiringCredentials.url;\r\n }\r\n return \"\";\r\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\r\n\r\n const getMapNameFromProps = React.useCallback(() => {\r\n if (props.mapLayerSourceToEdit) {\r\n return props.mapLayerSourceToEdit.name;\r\n } else if (props.layerRequiringCredentials?.name) {\r\n return props.layerRequiringCredentials.name;\r\n }\r\n return \"\";\r\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\r\n\r\n const getFormatFromProps = React.useCallback(() => {\r\n if (props.mapLayerSourceToEdit) {\r\n return props.mapLayerSourceToEdit.formatId;\r\n } else if (props.layerRequiringCredentials?.formatId) {\r\n return props.layerRequiringCredentials.formatId;\r\n }\r\n return undefined;\r\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\r\n\r\n const [dialogTitle] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(props.layerRequiringCredentials || props.mapLayerSourceToEdit ? \"mapLayers:CustomAttach.EditCustomLayer\" : \"mapLayers:CustomAttach.AttachCustomLayer\"));\r\n const [typeLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.Type\"));\r\n const [nameLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.Name\"));\r\n const [nameInputPlaceHolder] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.NameInputPlaceHolder\"));\r\n const [urlLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.URL\"));\r\n const [urlInputPlaceHolder] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.UrlInputPlaceHolder\"));\r\n const [iTwinSettingsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.StoreOnITwinSettings\"));\r\n const [modelSettingsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.StoreOnModelSettings\"));\r\n const [missingCredentialsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MissingCredentials\"));\r\n const [invalidCredentialsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.InvalidCredentials\"));\r\n const [serverRequireCredentials, setServerRequireCredentials] = React.useState(props.layerRequiringCredentials ?? false);\r\n const [invalidCredentialsProvided, setInvalidCredentialsProvided] = React.useState(false);\r\n const [layerAttachPending, setLayerAttachPending] = React.useState(false);\r\n const [warningMessage, setWarningMessage] = React.useState(props.layerRequiringCredentials ? missingCredentialsLabel : undefined);\r\n const [mapUrl, setMapUrl] = React.useState(getMapUrlFromProps());\r\n const [mapName, setMapName] = React.useState(getMapNameFromProps());\r\n const [userName, setUserName] = React.useState(\"\");\r\n const [password, setPassword] = React.useState(\"\");\r\n const [noSaveSettingsWarning] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.NoSaveSettingsWarning\"));\r\n const [passwordLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Password\"));\r\n const [passwordRequiredLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.PasswordRequired\"));\r\n const [userNameLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Username\"));\r\n const [userNameRequiredLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.UsernameRequired\"));\r\n const [settingsStorage, setSettingsStorageRadio] = React.useState(\"ITwin\");\r\n\r\n const [mapType, setMapType] = React.useState(getFormatFromProps() ?? MAP_TYPES.arcGis);\r\n\r\n // 'isMounted' is used to prevent any async operation once the hook has been\r\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\r\n const isMounted = React.useRef(false);\r\n React.useEffect(() => {\r\n isMounted.current = true;\r\n return () => {\r\n isMounted.current = false;\r\n };\r\n }, []);\r\n\r\n const [mapTypes] = React.useState((): SelectOption<string>[] => {\r\n const types = [\r\n { value: MAP_TYPES.arcGis, label: MAP_TYPES.arcGis },\r\n { value: MAP_TYPES.wms, label: MAP_TYPES.wms },\r\n { value: MAP_TYPES.wmts, label: MAP_TYPES.wmts },\r\n ];\r\n if (mapTypesOptions?.supportTileUrl)\r\n types.push({ value: MAP_TYPES.tileUrl, label: MAP_TYPES.tileUrl });\r\n return types;\r\n });\r\n\r\n const [isSettingsStorageAvailable] = React.useState(props?.activeViewport?.iModel?.iTwinId && props?.activeViewport?.iModel?.iModelId);\r\n\r\n // Even though the settings storage is available,\r\n // we don't always want to enable it in the UI.\r\n const [settingsStorageDisabled] = React.useState(!isSettingsStorageAvailable || props.mapLayerSourceToEdit !== undefined || props.layerRequiringCredentials !== undefined);\r\n\r\n const isAuthSupported = React.useCallback(() => {\r\n return ((mapType === MAP_TYPES.wms || mapType === MAP_TYPES.wms) && supportWmsAuthentication)\r\n || mapType === MAP_TYPES.arcGis;\r\n }, [mapType, supportWmsAuthentication]);\r\n\r\n // const [layerIdxToEdit] = React.useState((): number | undefined => {\r\n const [layerRequiringCredentialsIdx] = React.useState((): number | undefined => {\r\n if (props.layerRequiringCredentials === undefined || !props.layerRequiringCredentials.name || !props.layerRequiringCredentials.url) {\r\n return undefined;\r\n }\r\n\r\n const indexInDisplayStyle = props.activeViewport?.displayStyle.findMapLayerIndexByNameAndUrl(props.layerRequiringCredentials.name, props.layerRequiringCredentials.url, isOverlay);\r\n if (indexInDisplayStyle === undefined || indexInDisplayStyle < 0) {\r\n return undefined;\r\n } else {\r\n return indexInDisplayStyle;\r\n }\r\n });\r\n\r\n // Update warning message based on the dialog state and server response\r\n React.useEffect(() => {\r\n if (invalidCredentialsProvided) {\r\n setWarningMessage(invalidCredentialsLabel);\r\n } else if (serverRequireCredentials && (!userName || !password)) {\r\n setWarningMessage(missingCredentialsLabel);\r\n } else {\r\n setWarningMessage(undefined);\r\n }\r\n }, [invalidCredentialsProvided, invalidCredentialsLabel, missingCredentialsLabel, serverRequireCredentials, userName, password, setWarningMessage]);\r\n\r\n const handleMapTypeSelection = React.useCallback((newValue: string) => {\r\n setMapType(newValue);\r\n }, [setMapType]);\r\n\r\n const handleCancel = React.useCallback(() => {\r\n if (props.onCancelResult) {\r\n props.onCancelResult();\r\n return;\r\n }\r\n ModalDialogManager.closeDialog();\r\n }, [props]);\r\n\r\n const onUsernameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setUserName(event.target.value);\r\n if (invalidCredentialsProvided)\r\n setInvalidCredentialsProvided(false);\r\n }, [setUserName, invalidCredentialsProvided, setInvalidCredentialsProvided]);\r\n\r\n const onPasswordChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setPassword(event.target.value);\r\n if (invalidCredentialsProvided)\r\n setInvalidCredentialsProvided(false);\r\n }, [setPassword, invalidCredentialsProvided, setInvalidCredentialsProvided]);\r\n\r\n const doAttach = React.useCallback(async (source: MapLayerSource): Promise<boolean> => {\r\n // Returns a promise, When true, the dialog should closed\r\n return new Promise<boolean>((resolve, _reject) => {\r\n const vp = props?.activeViewport;\r\n if (vp === undefined || source === undefined) {\r\n resolve(true);\r\n return;\r\n }\r\n\r\n const storeOnIModel = \"Model\" === settingsStorage;\r\n source.validateSource(true).then(async (validation) => {\r\n if (validation.status === MapLayerSourceStatus.Valid\r\n || validation.status === MapLayerSourceStatus.RequireAuth\r\n || validation.status === MapLayerSourceStatus.InvalidCredentials) {\r\n const sourceRequireAuth = (validation.status === MapLayerSourceStatus.RequireAuth);\r\n const invalidCredentials = (validation.status === MapLayerSourceStatus.InvalidCredentials);\r\n const closeDialog = !sourceRequireAuth && !invalidCredentials;\r\n resolve(closeDialog);\r\n\r\n if (sourceRequireAuth && !serverRequireCredentials) {\r\n setServerRequireCredentials(true);\r\n }\r\n if (invalidCredentials) {\r\n setInvalidCredentialsProvided(true);\r\n return;\r\n } else if (invalidCredentialsProvided) {\r\n setInvalidCredentialsProvided(false); // flag reset\r\n }\r\n\r\n if (validation.status === MapLayerSourceStatus.Valid) {\r\n // Attach layer and update settings service (only if editing)\r\n if (layerRequiringCredentialsIdx !== undefined) {\r\n // Update username / password\r\n vp.displayStyle.changeMapLayerProps({\r\n subLayers: validation.subLayers,\r\n }, layerRequiringCredentialsIdx, isOverlay);\r\n vp.displayStyle.changeMapLayerCredentials(layerRequiringCredentialsIdx, isOverlay, source.userName, source.password);\r\n\r\n // Reset the provider's status\r\n const provider = vp.getMapLayerImageryProvider(layerRequiringCredentialsIdx, isOverlay);\r\n if (provider && provider.status !== MapLayerImageryProviderStatus.Valid) {\r\n provider.status = MapLayerImageryProviderStatus.Valid;\r\n }\r\n } else {\r\n // Update service settings if storage is available and we are not prompting user for credentials\r\n if (!settingsStorageDisabled && !props.layerRequiringCredentials) {\r\n if (!(await MapLayerPreferences.storeSource(source, storeOnIModel, vp.iModel.iTwinId!, vp.iModel.iModelId!)))\r\n return;\r\n }\r\n const layerSettings = source.toLayerSettings(validation.subLayers);\r\n if (layerSettings) {\r\n vp.displayStyle.attachMapLayerSettings(layerSettings, isOverlay, undefined);\r\n\r\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttached\", { sourceName: source.name, sourceUrl: source.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));\r\n } else {\r\n const msgError = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Messages.MapLayerLayerSettingsConversionError\");\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MapLayerAttachError\", { error: msgError, sourceUrl: source.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n }\r\n }\r\n\r\n vp.invalidateRenderPlan();\r\n }\r\n\r\n if (closeDialog) {\r\n // This handler will close the layer source handler, and therefore the MapUrl dialog.\r\n // don't call it if the dialog needs to remains open.\r\n onOkResult();\r\n }\r\n\r\n } else {\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.ValidationError\");\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, `${msg} ${source.url}`));\r\n resolve(true);\r\n }\r\n resolve(false);\r\n }).catch((error) => {\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MapLayerAttachError\", { error, sourceUrl: source.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n resolve(true);\r\n });\r\n });\r\n }, [props.activeViewport, props.layerRequiringCredentials, settingsStorage, serverRequireCredentials, invalidCredentialsProvided, onOkResult, layerRequiringCredentialsIdx, isOverlay, settingsStorageDisabled]);\r\n\r\n const onNameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setMapName(event.target.value);\r\n }, [setMapName]);\r\n\r\n const onRadioChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setSettingsStorageRadio(event.target.value);\r\n }, [setSettingsStorageRadio]);\r\n\r\n const onUrlChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setMapUrl(event.target.value);\r\n }, [setMapUrl]);\r\n\r\n const handleOk = React.useCallback(() => {\r\n let source: MapLayerSource | undefined;\r\n if (mapUrl && mapName) {\r\n source = MapLayerSource.fromJSON({\r\n url: mapUrl,\r\n name: mapName,\r\n formatId: mapType,\r\n userName,\r\n password,\r\n });\r\n\r\n if (source === undefined || props.mapLayerSourceToEdit) {\r\n\r\n ModalDialogManager.closeDialog();\r\n\r\n if (source === undefined) {\r\n // Close the dialog and inform end user something went wrong.\r\n const msgError = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Messages.MapLayerLayerSourceCreationFailed\");\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MapLayerAttachError\", { error: msgError, sourceUrl: mapUrl });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n return;\r\n }\r\n\r\n // Simply change the source definition in the setting service\r\n if (props.mapLayerSourceToEdit !== undefined) {\r\n const vp = props.activeViewport;\r\n void (async () => {\r\n if (isSettingsStorageAvailable && vp) {\r\n try {\r\n await MapLayerPreferences.replaceSource(props.mapLayerSourceToEdit!, source, vp.iModel.iTwinId!, vp.iModel.iModelId!);\r\n } catch (err: any) {\r\n const errorMessage = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerEditError\", { layerName: props.mapLayerSourceToEdit?.name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, errorMessage));\r\n return;\r\n }\r\n }\r\n })();\r\n return;\r\n }\r\n }\r\n\r\n setLayerAttachPending(true);\r\n\r\n void (async () => {\r\n // Code below is executed in the an async manner but\r\n // I don't necessarily want to mark the handler as async\r\n // so Im wrapping it un in a void wrapper.\r\n try {\r\n const closeDialog = await doAttach(source);\r\n if (isMounted.current) {\r\n setLayerAttachPending(false);\r\n }\r\n\r\n // In theory the modal dialog should always get closed by the parent\r\n // AttachLayerPanel's 'onOkResult' handler. We close it here just in case.\r\n if (closeDialog) {\r\n ModalDialogManager.closeDialog();\r\n }\r\n } catch (_error) {\r\n ModalDialogManager.closeDialog();\r\n }\r\n })();\r\n }\r\n\r\n }, [mapUrl, mapName, mapType, userName, password, props.mapLayerSourceToEdit, props.activeViewport, isSettingsStorageAvailable, doAttach]);\r\n\r\n const dialogContainer = React.useRef<HTMLDivElement>(null);\r\n\r\n const readyToSave = React.useCallback(() => {\r\n const credentialsSet = !!userName && !!password;\r\n return (!!mapUrl && !!mapName)\r\n && (!serverRequireCredentials || (serverRequireCredentials && credentialsSet) && !layerAttachPending)\r\n && !invalidCredentialsProvided;\r\n }, [mapUrl, mapName, userName, password, layerAttachPending, invalidCredentialsProvided, serverRequireCredentials]);\r\n\r\n const buttonCluster = React.useMemo(() => [\r\n { type: DialogButtonType.OK, onClick: handleOk, disabled: !readyToSave() },\r\n { type: DialogButtonType.Cancel, onClick: handleCancel },\r\n ], [readyToSave, handleCancel, handleOk]);\r\n\r\n const handleOnKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (event.key === SpecialKey.Enter) {\r\n if (readyToSave())\r\n handleOk();\r\n }\r\n }, [handleOk, readyToSave]);\r\n\r\n return (\r\n <div ref={dialogContainer}>\r\n <Dialog\r\n className=\"map-layer-url-dialog\"\r\n title={dialogTitle}\r\n opened={true}\r\n resizable={true}\r\n movable={true}\r\n modal={true}\r\n buttonCluster={buttonCluster}\r\n onClose={handleCancel}\r\n onEscape={handleCancel}\r\n minHeight={120}\r\n maxWidth={600}\r\n titleStyle={{paddingLeft: \"10px\"}}\r\n footerStyle={{paddingBottom: \"10px\", paddingRight: \"10px\"}}\r\n trapFocus={false}\r\n >\r\n <div className=\"map-layer-url-dialog-content\">\r\n <div className=\"map-layer-source-url\">\r\n <span className=\"map-layer-source-label\">{typeLabel}</span>\r\n <Select\r\n className=\"map-layer-source-select\"\r\n options={mapTypes}\r\n value={mapType}\r\n disabled={props.layerRequiringCredentials !== undefined || props.mapLayerSourceToEdit !== undefined}\r\n onChange={handleMapTypeSelection}\r\n size=\"small\"/>\r\n <span className=\"map-layer-source-label\">{nameLabel}</span>\r\n <Input className=\"map-layer-source-input\" placeholder={nameInputPlaceHolder} onChange={onNameChange} value={mapName} disabled={props.layerRequiringCredentials !== undefined} size=\"small\" />\r\n <span className=\"map-layer-source-label\">{urlLabel}</span>\r\n <Input className=\"map-layer-source-input\" placeholder={urlInputPlaceHolder} onKeyPress={handleOnKeyDown} onChange={onUrlChange} disabled={props.mapLayerSourceToEdit !== undefined} value={mapUrl} size=\"small\" />\r\n {isAuthSupported() && props.mapLayerSourceToEdit === undefined &&\r\n <>\r\n <span className=\"map-layer-source-label\">{userNameLabel}</span>\r\n <LabeledInput\r\n className=\"map-layer-source-input\"\r\n displayStyle=\"inline\"\r\n placeholder={serverRequireCredentials ? userNameRequiredLabel : userNameLabel}\r\n status={!userName && serverRequireCredentials ? InputStatus.Warning : undefined}\r\n onChange={onUsernameChange}\r\n size=\"small\" />\r\n\r\n <span className=\"map-layer-source-label\">{passwordLabel}</span>\r\n <LabeledInput\r\n className=\"map-layer-source-input\"\r\n displayStyle=\"inline\"\r\n type=\"password\" placeholder={serverRequireCredentials ? passwordRequiredLabel : passwordLabel}\r\n status={!password && serverRequireCredentials ? InputStatus.Warning : undefined}\r\n onChange={onPasswordChange}\r\n onKeyPress={handleOnKeyDown}\r\n size=\"small\" />\r\n </>\r\n }\r\n\r\n {/* Store settings options, not shown when editing a layer */}\r\n {isSettingsStorageAvailable && <div title={settingsStorageDisabled ? noSaveSettingsWarning : \"\"}>\r\n <Radio disabled={settingsStorageDisabled}\r\n name=\"settingsStorage\" value=\"iTwin\"\r\n label={iTwinSettingsLabel} checked={settingsStorage === \"iTwin\"}\r\n onChange={onRadioChange} />\r\n <Radio disabled={settingsStorageDisabled}\r\n name=\"settingsStorage\" value=\"Model\"\r\n label={modelSettingsLabel} checked={settingsStorage === \"Model\"}\r\n onChange={onRadioChange} />\r\n </div>}\r\n </div>\r\n </div>\r\n\r\n {/* Warning message */}\r\n <div className=\"map-layer-source-warnMessage\">\r\n {warningMessage ?\r\n <>\r\n <Icon className=\"map-layer-source-warnMessage-icon\" iconSpec=\"icon-status-warning\" />\r\n <span className=\"map-layer-source-warnMessage-label\">{warningMessage}</span >\r\n </>\r\n :\r\n // Place holder to avoid dialog resize\r\n <span className=\"map-layer-source-placeholder\">&nbsp;</span>\r\n }\r\n </div>\r\n\r\n {/* Progress bar */}\r\n {layerAttachPending &&\r\n <div className=\"map-layer-source-progressBar\">\r\n <ProgressLinear indeterminate />\r\n </div>\r\n }\r\n </Dialog>\r\n </div >\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"MapUrlDialog.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapUrlDialog.tsx"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F,8BAA8B;;;AAE9B,+BAA+B;AAC/B,wDAAwG;AACxG,kDAA8D;AAC9D,oDAAwD;AACxD,0EAAuE;AAEvE,wDAG8B;AAE9B,+BAA6B;AAC7B,0DAAqE;AACrE,mEAAgE;AAChE,+CAA8C;AAEjC,QAAA,SAAS,GAAG;IACvB,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;CACnB,CAAC;AAeF,gEAAgE;AAChE,SAAgB,YAAY,CAAC,KAAwB;;IACnD,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IACzD,MAAM,wBAAwB,GAAG,CAAC,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,wBAAwB,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAE5F,MAAM,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;;QAChD,IAAI,KAAK,CAAC,oBAAoB,EAAE;YAC9B,OAAO,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC;SACvC;aAAM,IAAI,MAAA,KAAK,CAAC,yBAAyB,0CAAE,GAAG,EAAE;YAC/C,OAAO,KAAK,CAAC,yBAAyB,CAAC,GAAG,CAAC;SAC5C;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAElE,MAAM,mBAAmB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;;QACjD,IAAI,KAAK,CAAC,oBAAoB,EAAE;YAC9B,OAAO,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC;SACxC;aAAM,IAAI,MAAA,KAAK,CAAC,yBAAyB,0CAAE,IAAI,EAAE;YAChD,OAAO,KAAK,CAAC,yBAAyB,CAAC,IAAI,CAAC;SAC7C;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAElE,MAAM,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;;QAChD,IAAI,KAAK,CAAC,oBAAoB,EAAE;YAC9B,OAAO,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC;SAC5C;aAAM,IAAI,MAAA,KAAK,CAAC,yBAAyB,0CAAE,QAAQ,EAAE;YACpD,OAAO,KAAK,CAAC,yBAAyB,CAAC,QAAQ,CAAC;SACjD;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAElE,MAAM,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,KAAK,CAAC,yBAAyB,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACtP,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAC5H,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAC5H,MAAM,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,6CAA6C,CAAC,CAAC,CAAC;IACvJ,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAC1H,MAAM,CAAC,mBAAmB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACrJ,MAAM,CAAC,kBAAkB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,6CAA6C,CAAC,CAAC,CAAC;IACrJ,MAAM,CAAC,kBAAkB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,6CAA6C,CAAC,CAAC,CAAC;IACrJ,MAAM,CAAC,uBAAuB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACxJ,MAAM,CAAC,uBAAuB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACxJ,MAAM,CAAC,wBAAwB,EAAE,2BAA2B,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAA,KAAK,CAAC,yBAAyB,mCAAI,KAAK,CAAC,CAAC;IACzH,MAAM,CAAC,0BAA0B,EAAE,6BAA6B,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1F,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1E,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAClI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACpE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,qBAAqB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,8CAA8C,CAAC,CAAC,CAAC;IACzJ,MAAM,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,yCAAyC,CAAC,CAAC,CAAC;IAC5I,MAAM,CAAC,qBAAqB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,iDAAiD,CAAC,CAAC,CAAC;IAC5J,MAAM,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,yCAAyC,CAAC,CAAC,CAAC;IAC5I,MAAM,CAAC,qBAAqB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,iDAAiD,CAAC,CAAC,CAAC;IAC5J,MAAM,CAAC,eAAe,EAAE,uBAAuB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE3E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAA,kBAAkB,EAAE,mCAAI,iBAAS,CAAC,MAAM,CAAC,CAAC;IAEvF,4EAA4E;IAC5E,wHAAwH;IACxH,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAA2B,EAAE;QAC7D,MAAM,KAAK,GAAG;YACZ,EAAE,KAAK,EAAE,iBAAS,CAAC,MAAM,EAAE,KAAK,EAAE,iBAAS,CAAC,MAAM,EAAE;YACpD,EAAE,KAAK,EAAE,iBAAS,CAAC,GAAG,EAAE,KAAK,EAAE,iBAAS,CAAC,GAAG,EAAE;YAC9C,EAAE,KAAK,EAAE,iBAAS,CAAC,IAAI,EAAE,KAAK,EAAE,iBAAS,CAAC,IAAI,EAAE;SACjD,CAAC;QACF,IAAI,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,cAAc;YACjC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAS,CAAC,OAAO,EAAE,KAAK,EAAE,iBAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,0BAA0B,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,uBAAW,CAAC,WAAW,KAAI,MAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,cAAc,0CAAE,MAAM,0CAAE,OAAO,CAAA,KAAI,MAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,cAAc,0CAAE,MAAM,0CAAE,QAAQ,CAAA,CAAC,CAAC;IAElK,iDAAiD;IACjD,+CAA+C;IAC/C,MAAM,CAAC,uBAAuB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,0BAA0B,IAAI,KAAK,CAAC,oBAAoB,KAAK,SAAS,IAAI,KAAK,CAAC,yBAAyB,KAAK,SAAS,CAAC,CAAC;IAE3K,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAC7C,OAAO,CAAC,CAAC,OAAO,KAAK,iBAAS,CAAC,GAAG,IAAI,OAAO,KAAK,iBAAS,CAAC,GAAG,CAAC,IAAI,wBAAwB,CAAC;eACxF,OAAO,KAAK,iBAAS,CAAC,MAAM,CAAC;IACpC,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAExC,sEAAsE;IACtE,MAAM,CAAC,4BAA4B,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAuB,EAAE;;QAC7E,IAAI,KAAK,CAAC,yBAAyB,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,GAAG,EAAE;YAClI,OAAO,SAAS,CAAC;SAClB;QAED,MAAM,mBAAmB,GAAG,MAAA,KAAK,CAAC,cAAc,0CAAE,YAAY,CAAC,6BAA6B,CAAC,KAAK,CAAC,yBAAyB,CAAC,IAAI,EAAE,KAAK,CAAC,yBAAyB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACnL,IAAI,mBAAmB,KAAK,SAAS,IAAI,mBAAmB,GAAG,CAAC,EAAE;YAChE,OAAO,SAAS,CAAC;SAClB;aAAM;YACL,OAAO,mBAAmB,CAAC;SAC5B;IACH,CAAC,CAAC,CAAC;IAEH,uEAAuE;IACvE,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,0BAA0B,EAAE;YAC9B,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;SAC5C;aAAM,IAAI,wBAAwB,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,EAAE;YAC/D,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;SAC5C;aAAM;YACL,iBAAiB,CAAC,SAAS,CAAC,CAAC;SAC9B;IACH,CAAC,EAAE,CAAC,0BAA0B,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEpJ,MAAM,sBAAsB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,QAAgB,EAAE,EAAE;QACpE,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAC1C,IAAI,KAAK,CAAC,cAAc,EAAE;YACxB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO;SACR;QACD,gCAAkB,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAA0C,EAAE,EAAE;QACxF,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,0BAA0B;YAC5B,6BAA6B,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,WAAW,EAAE,0BAA0B,EAAE,6BAA6B,CAAC,CAAC,CAAC;IAE7E,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAA0C,EAAE,EAAE;QACxF,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,0BAA0B;YAC5B,6BAA6B,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,WAAW,EAAE,0BAA0B,EAAE,6BAA6B,CAAC,CAAC,CAAC;IAE7E,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,MAAsB,EAAoB,EAAE;QACpF,yDAAyD;QACzD,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YAC/C,MAAM,EAAE,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,cAAc,CAAC;YACjC,IAAI,EAAE,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE;gBAC5C,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;aACR;YAED,MAAM,aAAa,GAAG,OAAO,KAAK,eAAe,CAAC;YAClD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;gBACpD,IAAI,UAAU,CAAC,MAAM,KAAK,oCAAoB,CAAC,KAAK;uBAC/C,UAAU,CAAC,MAAM,KAAK,oCAAoB,CAAC,WAAW;uBACtD,UAAU,CAAC,MAAM,KAAK,oCAAoB,CAAC,kBAAkB,EAAE;oBAClE,MAAM,iBAAiB,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,oCAAoB,CAAC,WAAW,CAAC,CAAC;oBACnF,MAAM,kBAAkB,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,oCAAoB,CAAC,kBAAkB,CAAC,CAAC;oBAC3F,MAAM,WAAW,GAAG,CAAC,iBAAiB,IAAI,CAAC,kBAAkB,CAAC;oBAC9D,OAAO,CAAC,WAAW,CAAC,CAAC;oBAErB,IAAI,iBAAiB,IAAI,CAAC,wBAAwB,EAAE;wBAClD,2BAA2B,CAAC,IAAI,CAAC,CAAC;qBACnC;oBACD,IAAI,kBAAkB,EAAE;wBACtB,6BAA6B,CAAC,IAAI,CAAC,CAAC;wBACpC,OAAO;qBACR;yBAAM,IAAI,0BAA0B,EAAE;wBACrC,6BAA6B,CAAC,KAAK,CAAC,CAAC,CAAE,aAAa;qBACrD;oBAED,IAAI,UAAU,CAAC,MAAM,KAAK,oCAAoB,CAAC,KAAK,EAAE;wBACpD,6DAA6D;wBAC7D,IAAI,4BAA4B,KAAK,SAAS,EAAE;4BAC9C,6BAA6B;4BAC7B,EAAE,CAAC,YAAY,CAAC,mBAAmB,CAAC;gCAClC,SAAS,EAAE,UAAU,CAAC,SAAS;6BAChC,EAAE,4BAA4B,EAAE,SAAS,CAAC,CAAC;4BAC5C,EAAE,CAAC,YAAY,CAAC,yBAAyB,CAAC,4BAA4B,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;4BAErH,8BAA8B;4BAC9B,MAAM,QAAQ,GAAG,EAAE,CAAC,0BAA0B,CAAC,4BAA4B,EAAE,SAAS,CAAC,CAAC;4BACxF,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,6CAA6B,CAAC,KAAK,EAAE;gCACvE,QAAQ,CAAC,MAAM,GAAG,6CAA6B,CAAC,KAAK,CAAC;6BACvD;yBACF;6BAAM;4BACL,gGAAgG;4BAChG,IAAI,CAAC,uBAAuB,IAAI,CAAC,KAAK,CAAC,yBAAyB,EAAE;gCAChE,IAAI,CAAC,CAAC,MAAM,yCAAmB,CAAC,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,MAAM,CAAC,OAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,QAAS,CAAC,CAAC,EAAE;oCAC5G,MAAM,QAAQ,GAAG,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,mDAAmD,CAAC,CAAC;oCAC/H,yBAAS,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,oCAAoB,CAAC,qCAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;iCACxG;6BACF;4BACD,MAAM,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;4BACnE,IAAI,aAAa,EAAE;gCACjB,EAAE,CAAC,YAAY,CAAC,sBAAsB,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gCAE5E,MAAM,GAAG,GAAG,yBAAS,CAAC,YAAY,CAAC,kBAAkB,CAAC,qCAAqC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;gCACjJ,yBAAS,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,oCAAoB,CAAC,qCAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;6BAClG;iCAAM;gCACL,MAAM,QAAQ,GAAG,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,yDAAyD,CAAC,CAAC;gCACrI,MAAM,GAAG,GAAG,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,4CAA4C,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;gCAC/J,yBAAS,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,oCAAoB,CAAC,qCAAqB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;6BACnG;yBACF;wBAED,EAAE,CAAC,oBAAoB,EAAE,CAAC;qBAC3B;oBAED,IAAI,WAAW,EAAE;wBACf,qFAAqF;wBACrF,qDAAqD;wBACrD,UAAU,EAAE,CAAC;qBACd;iBAEF;qBAAM;oBACL,MAAM,GAAG,GAAG,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,wCAAwC,CAAC,CAAC;oBAC/G,yBAAS,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,oCAAoB,CAAC,qCAAqB,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACrH,OAAO,CAAC,IAAI,CAAC,CAAC;iBACf;gBACD,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACjB,MAAM,GAAG,GAAG,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,4CAA4C,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;gBACrJ,yBAAS,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,oCAAoB,CAAC,qCAAqB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBAClG,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,yBAAyB,EAAE,eAAe,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,UAAU,EAAE,4BAA4B,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAEjN,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAA0C,EAAE,EAAE;QACpF,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAA0C,EAAE,EAAE;QACrF,uBAAuB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAE9B,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAA0C,EAAE,EAAE;QACnF,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,MAAkC,CAAC;QACvC,IAAI,MAAM,IAAI,OAAO,EAAE;YACrB,MAAM,GAAG,8BAAc,CAAC,QAAQ,CAAC;gBAC/B,GAAG,EAAE,MAAM;gBACX,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,OAAO;gBACjB,QAAQ;gBACR,QAAQ;aACT,CAAC,CAAC;YAEH,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,oBAAoB,EAAE;gBAEtD,gCAAkB,CAAC,WAAW,EAAE,CAAC;gBAEjC,IAAI,MAAM,KAAK,SAAS,EAAE;oBACxB,6DAA6D;oBAC7D,MAAM,QAAQ,GAAG,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,sDAAsD,CAAC,CAAC;oBAClI,MAAM,GAAG,GAAG,mDAAwB,CAAC,YAAY,CAAC,kBAAkB,CAAC,4CAA4C,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC3J,yBAAS,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,oCAAoB,CAAC,qCAAqB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;oBAClG,OAAO;iBACR;gBAED,6DAA6D;gBAC7D,IAAI,KAAK,CAAC,oBAAoB,KAAK,SAAS,EAAE;oBAC5C,MAAM,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC;oBAChC,KAAK,CAAC,KAAK,IAAI,EAAE;;wBACf,IAAI,0BAA0B,IAAI,EAAE,EAAE;4BACpC,IAAI;gCACF,MAAM,yCAAmB,CAAC,aAAa,CAAC,KAAK,CAAC,oBAAqB,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,QAAS,CAAC,CAAC;6BACvH;4BAAC,OAAO,GAAQ,EAAE;gCACjB,MAAM,YAAY,GAAG,yBAAS,CAAC,YAAY,CAAC,kBAAkB,CAAC,sCAAsC,EAAE,EAAE,SAAS,EAAE,MAAA,KAAK,CAAC,oBAAoB,0CAAE,IAAI,EAAE,CAAC,CAAC;gCACxJ,yBAAS,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,oCAAoB,CAAC,qCAAqB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;gCAC3G,OAAO;6BACR;yBACF;oBACH,CAAC,CAAC,EAAE,CAAC;oBACL,OAAO;iBACR;aACF;YAED,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAE5B,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,oDAAoD;gBACpD,yDAAyD;gBACzD,0CAA0C;gBAC1C,IAAI;oBACF,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAC3C,IAAI,SAAS,CAAC,OAAO,EAAE;wBACrB,qBAAqB,CAAC,KAAK,CAAC,CAAC;qBAC9B;oBAED,oEAAoE;oBACpE,2EAA2E;oBAC3E,IAAI,WAAW,EAAE;wBACf,gCAAkB,CAAC,WAAW,EAAE,CAAC;qBAClC;iBACF;gBAAC,OAAO,MAAM,EAAE;oBACf,gCAAkB,CAAC,WAAW,EAAE,CAAC;iBAClC;YACH,CAAC,CAAC,EAAE,CAAC;SACN;IAEH,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,cAAc,EAAE,0BAA0B,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE3I,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE3D,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACzC,MAAM,cAAc,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC;QAChD,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC;eACzB,CAAC,CAAC,wBAAwB,IAAI,CAAC,wBAAwB,IAAI,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC;eAClG,CAAC,0BAA0B,CAAC;IACnC,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAEpH,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACxC,EAAE,IAAI,EAAE,iCAAgB,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,EAAE;QAC1E,EAAE,IAAI,EAAE,iCAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE;KACzD,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE1C,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAA4C,EAAE,EAAE;QACzF,IAAI,KAAK,CAAC,GAAG,KAAK,2BAAU,CAAC,KAAK,EAAE;YAClC,IAAI,WAAW,EAAE;gBACf,QAAQ,EAAE,CAAC;SACd;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IAE5B,OAAO,CACL,6BAAK,GAAG,EAAE,eAAe;QACvB,oBAAC,mBAAM,IACL,SAAS,EAAC,sBAAsB,EAChC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,IAAI,EACZ,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,IAAI,EACb,KAAK,EAAE,IAAI,EACX,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,GAAG,EACd,QAAQ,EAAE,GAAG,EACb,UAAU,EAAE,EAAC,WAAW,EAAE,MAAM,EAAC,EACjC,WAAW,EAAE,EAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAC,EAC1D,SAAS,EAAE,KAAK;YAEhB,6BAAK,SAAS,EAAC,8BAA8B;gBAC3C,6BAAK,SAAS,EAAC,sBAAsB;oBACnC,8BAAM,SAAS,EAAC,wBAAwB,IAAE,SAAS,CAAQ;oBAC3D,oBAAC,sBAAM,IACL,SAAS,EAAC,yBAAyB,EACnC,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,KAAK,CAAC,yBAAyB,KAAK,SAAS,IAAI,KAAK,CAAC,oBAAoB,KAAK,SAAS,EACnG,QAAQ,EAAE,sBAAsB,EAChC,IAAI,EAAC,OAAO,GAAE;oBAChB,8BAAM,SAAS,EAAC,wBAAwB,IAAE,SAAS,CAAQ;oBAC3D,oBAAC,qBAAK,IAAC,SAAS,EAAC,wBAAwB,EAAC,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,yBAAyB,KAAK,SAAS,EAAE,IAAI,EAAC,OAAO,GAAG;oBAC7L,8BAAM,SAAS,EAAC,wBAAwB,IAAE,QAAQ,CAAQ;oBAC1D,oBAAC,qBAAK,IAAC,SAAS,EAAC,wBAAwB,EAAC,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,oBAAoB,KAAK,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAC,OAAO,GAAG;oBACjN,eAAe,EAAE,IAAI,KAAK,CAAC,oBAAoB,KAAK,SAAS;wBAC5D;4BACE,8BAAM,SAAS,EAAC,wBAAwB,IAAE,aAAa,CAAQ;4BAC/D,oBAAC,4BAAY,IACX,SAAS,EAAC,wBAAwB,EAClC,YAAY,EAAC,QAAQ,EACrB,WAAW,EAAE,wBAAwB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,aAAa,EAC7E,MAAM,EAAE,CAAC,QAAQ,IAAI,wBAAwB,CAAC,CAAC,CAAC,wBAAW,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAC/E,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAC,OAAO,GAAG;4BAEjB,8BAAM,SAAS,EAAC,wBAAwB,IAAE,aAAa,CAAQ;4BAC/D,oBAAC,4BAAY,IACX,SAAS,EAAC,wBAAwB,EAClC,YAAY,EAAC,QAAQ,EACrB,IAAI,EAAC,UAAU,EAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,aAAa,EAC7F,MAAM,EAAE,CAAC,QAAQ,IAAI,wBAAwB,CAAC,CAAC,CAAC,wBAAW,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAC/E,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAC,OAAO,GAAG,CAChB;oBAIJ,0BAA0B,IAAI,6BAAK,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE;wBAC7F,oBAAC,qBAAK,IAAC,QAAQ,EAAE,uBAAuB,EACtC,IAAI,EAAC,iBAAiB,EAAC,KAAK,EAAC,OAAO,EACpC,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,eAAe,KAAK,OAAO,EAC/D,QAAQ,EAAE,aAAa,GAAI;wBAC7B,oBAAC,qBAAK,IAAC,QAAQ,EAAE,uBAAuB,EACtC,IAAI,EAAC,iBAAiB,EAAC,KAAK,EAAC,OAAO,EACpC,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,eAAe,KAAK,OAAO,EAC/D,QAAQ,EAAE,aAAa,GAAI,CACzB,CACF,CACF;YAGN,6BAAK,SAAS,EAAC,8BAA8B,IAC1C,cAAc,CAAC,CAAC;gBACf;oBACE,oBAAC,iBAAI,IAAC,SAAS,EAAC,mCAAmC,EAAC,QAAQ,EAAC,qBAAqB,GAAG;oBACrF,8BAAM,SAAS,EAAC,oCAAoC,IAAE,cAAc,CAAS,CAC5E;gBACH,CAAC;oBACD,sCAAsC;oBACtC,8BAAM,SAAS,EAAC,8BAA8B,aAAc,CAE1D;YAGL,kBAAkB;gBACjB,6BAAK,SAAS,EAAC,8BAA8B;oBAC3C,oBAAC,8BAAc,IAAC,aAAa,SAAG,CAC5B,CAED,CACJ,CACR,CAAC;AACJ,CAAC;AAhaD,oCAgaC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n// cSpell:ignore Modeless WMTS\r\n\r\nimport * as React from \"react\";\r\nimport { Input, LabeledInput, ProgressLinear, Radio, Select, SelectOption } from \"@itwin/itwinui-react\";\r\nimport { Dialog, Icon, InputStatus } from \"@itwin/core-react\";\r\nimport { ModalDialogManager } from \"@itwin/appui-react\";\r\nimport { MapLayersUiItemsProvider } from \"../MapLayersUiItemsProvider\";\r\nimport { MapTypesOptions } from \"../Interfaces\";\r\nimport {\r\n IModelApp, MapLayerImageryProviderStatus, MapLayerSource,\r\n MapLayerSourceStatus, NotifyMessageDetails, OutputMessagePriority, ScreenViewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { MapLayerProps } from \"@itwin/core-common\";\r\nimport \"./MapUrlDialog.scss\";\r\nimport { DialogButtonType, SpecialKey } from \"@itwin/appui-abstract\";\r\nimport { MapLayerPreferences } from \"../../MapLayerPreferences\";\r\nimport { MapLayersUI } from \"../../mapLayers\";\r\n\r\nexport const MAP_TYPES = {\r\n wms: \"WMS\",\r\n arcGis: \"ArcGIS\",\r\n wmts: \"WMTS\",\r\n tileUrl: \"TileURL\",\r\n};\r\n\r\ninterface MapUrlDialogProps {\r\n activeViewport?: ScreenViewport;\r\n isOverlay: boolean;\r\n onOkResult: () => void;\r\n onCancelResult?: () => void;\r\n mapTypesOptions?: MapTypesOptions;\r\n\r\n // An optional layer definition can be provide to enable the edit mode\r\n layerRequiringCredentials?: MapLayerProps;\r\n\r\n mapLayerSourceToEdit?: MapLayerSource;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function MapUrlDialog(props: MapUrlDialogProps) {\r\n const { isOverlay, onOkResult, mapTypesOptions } = props;\r\n const supportWmsAuthentication = (mapTypesOptions?.supportWmsAuthentication ? true : false);\r\n\r\n const getMapUrlFromProps = React.useCallback(() => {\r\n if (props.mapLayerSourceToEdit) {\r\n return props.mapLayerSourceToEdit.url;\r\n } else if (props.layerRequiringCredentials?.url) {\r\n return props.layerRequiringCredentials.url;\r\n }\r\n return \"\";\r\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\r\n\r\n const getMapNameFromProps = React.useCallback(() => {\r\n if (props.mapLayerSourceToEdit) {\r\n return props.mapLayerSourceToEdit.name;\r\n } else if (props.layerRequiringCredentials?.name) {\r\n return props.layerRequiringCredentials.name;\r\n }\r\n return \"\";\r\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\r\n\r\n const getFormatFromProps = React.useCallback(() => {\r\n if (props.mapLayerSourceToEdit) {\r\n return props.mapLayerSourceToEdit.formatId;\r\n } else if (props.layerRequiringCredentials?.formatId) {\r\n return props.layerRequiringCredentials.formatId;\r\n }\r\n return undefined;\r\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\r\n\r\n const [dialogTitle] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(props.layerRequiringCredentials || props.mapLayerSourceToEdit ? \"mapLayers:CustomAttach.EditCustomLayer\" : \"mapLayers:CustomAttach.AttachCustomLayer\"));\r\n const [typeLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.Type\"));\r\n const [nameLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.Name\"));\r\n const [nameInputPlaceHolder] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.NameInputPlaceHolder\"));\r\n const [urlLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.URL\"));\r\n const [urlInputPlaceHolder] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.UrlInputPlaceHolder\"));\r\n const [iTwinSettingsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.StoreOnITwinSettings\"));\r\n const [modelSettingsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.StoreOnModelSettings\"));\r\n const [missingCredentialsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MissingCredentials\"));\r\n const [invalidCredentialsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.InvalidCredentials\"));\r\n const [serverRequireCredentials, setServerRequireCredentials] = React.useState(props.layerRequiringCredentials ?? false);\r\n const [invalidCredentialsProvided, setInvalidCredentialsProvided] = React.useState(false);\r\n const [layerAttachPending, setLayerAttachPending] = React.useState(false);\r\n const [warningMessage, setWarningMessage] = React.useState(props.layerRequiringCredentials ? missingCredentialsLabel : undefined);\r\n const [mapUrl, setMapUrl] = React.useState(getMapUrlFromProps());\r\n const [mapName, setMapName] = React.useState(getMapNameFromProps());\r\n const [userName, setUserName] = React.useState(\"\");\r\n const [password, setPassword] = React.useState(\"\");\r\n const [noSaveSettingsWarning] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.NoSaveSettingsWarning\"));\r\n const [passwordLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Password\"));\r\n const [passwordRequiredLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.PasswordRequired\"));\r\n const [userNameLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Username\"));\r\n const [userNameRequiredLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.UsernameRequired\"));\r\n const [settingsStorage, setSettingsStorageRadio] = React.useState(\"iTwin\");\r\n\r\n const [mapType, setMapType] = React.useState(getFormatFromProps() ?? MAP_TYPES.arcGis);\r\n\r\n // 'isMounted' is used to prevent any async operation once the hook has been\r\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\r\n const isMounted = React.useRef(false);\r\n React.useEffect(() => {\r\n isMounted.current = true;\r\n return () => {\r\n isMounted.current = false;\r\n };\r\n }, []);\r\n\r\n const [mapTypes] = React.useState((): SelectOption<string>[] => {\r\n const types = [\r\n { value: MAP_TYPES.arcGis, label: MAP_TYPES.arcGis },\r\n { value: MAP_TYPES.wms, label: MAP_TYPES.wms },\r\n { value: MAP_TYPES.wmts, label: MAP_TYPES.wmts },\r\n ];\r\n if (mapTypesOptions?.supportTileUrl)\r\n types.push({ value: MAP_TYPES.tileUrl, label: MAP_TYPES.tileUrl });\r\n return types;\r\n });\r\n\r\n const [isSettingsStorageAvailable] = React.useState(MapLayersUI.iTwinConfig && props?.activeViewport?.iModel?.iTwinId && props?.activeViewport?.iModel?.iModelId);\r\n\r\n // Even though the settings storage is available,\r\n // we don't always want to enable it in the UI.\r\n const [settingsStorageDisabled] = React.useState(!isSettingsStorageAvailable || props.mapLayerSourceToEdit !== undefined || props.layerRequiringCredentials !== undefined);\r\n\r\n const isAuthSupported = React.useCallback(() => {\r\n return ((mapType === MAP_TYPES.wms || mapType === MAP_TYPES.wms) && supportWmsAuthentication)\r\n || mapType === MAP_TYPES.arcGis;\r\n }, [mapType, supportWmsAuthentication]);\r\n\r\n // const [layerIdxToEdit] = React.useState((): number | undefined => {\r\n const [layerRequiringCredentialsIdx] = React.useState((): number | undefined => {\r\n if (props.layerRequiringCredentials === undefined || !props.layerRequiringCredentials.name || !props.layerRequiringCredentials.url) {\r\n return undefined;\r\n }\r\n\r\n const indexInDisplayStyle = props.activeViewport?.displayStyle.findMapLayerIndexByNameAndUrl(props.layerRequiringCredentials.name, props.layerRequiringCredentials.url, isOverlay);\r\n if (indexInDisplayStyle === undefined || indexInDisplayStyle < 0) {\r\n return undefined;\r\n } else {\r\n return indexInDisplayStyle;\r\n }\r\n });\r\n\r\n // Update warning message based on the dialog state and server response\r\n React.useEffect(() => {\r\n if (invalidCredentialsProvided) {\r\n setWarningMessage(invalidCredentialsLabel);\r\n } else if (serverRequireCredentials && (!userName || !password)) {\r\n setWarningMessage(missingCredentialsLabel);\r\n } else {\r\n setWarningMessage(undefined);\r\n }\r\n }, [invalidCredentialsProvided, invalidCredentialsLabel, missingCredentialsLabel, serverRequireCredentials, userName, password, setWarningMessage]);\r\n\r\n const handleMapTypeSelection = React.useCallback((newValue: string) => {\r\n setMapType(newValue);\r\n }, [setMapType]);\r\n\r\n const handleCancel = React.useCallback(() => {\r\n if (props.onCancelResult) {\r\n props.onCancelResult();\r\n return;\r\n }\r\n ModalDialogManager.closeDialog();\r\n }, [props]);\r\n\r\n const onUsernameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setUserName(event.target.value);\r\n if (invalidCredentialsProvided)\r\n setInvalidCredentialsProvided(false);\r\n }, [setUserName, invalidCredentialsProvided, setInvalidCredentialsProvided]);\r\n\r\n const onPasswordChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setPassword(event.target.value);\r\n if (invalidCredentialsProvided)\r\n setInvalidCredentialsProvided(false);\r\n }, [setPassword, invalidCredentialsProvided, setInvalidCredentialsProvided]);\r\n\r\n const doAttach = React.useCallback(async (source: MapLayerSource): Promise<boolean> => {\r\n // Returns a promise, When true, the dialog should closed\r\n return new Promise<boolean>((resolve, _reject) => {\r\n const vp = props?.activeViewport;\r\n if (vp === undefined || source === undefined) {\r\n resolve(true);\r\n return;\r\n }\r\n\r\n const storeOnIModel = \"Model\" === settingsStorage;\r\n source.validateSource(true).then(async (validation) => {\r\n if (validation.status === MapLayerSourceStatus.Valid\r\n || validation.status === MapLayerSourceStatus.RequireAuth\r\n || validation.status === MapLayerSourceStatus.InvalidCredentials) {\r\n const sourceRequireAuth = (validation.status === MapLayerSourceStatus.RequireAuth);\r\n const invalidCredentials = (validation.status === MapLayerSourceStatus.InvalidCredentials);\r\n const closeDialog = !sourceRequireAuth && !invalidCredentials;\r\n resolve(closeDialog);\r\n\r\n if (sourceRequireAuth && !serverRequireCredentials) {\r\n setServerRequireCredentials(true);\r\n }\r\n if (invalidCredentials) {\r\n setInvalidCredentialsProvided(true);\r\n return;\r\n } else if (invalidCredentialsProvided) {\r\n setInvalidCredentialsProvided(false); // flag reset\r\n }\r\n\r\n if (validation.status === MapLayerSourceStatus.Valid) {\r\n // Attach layer and update settings service (only if editing)\r\n if (layerRequiringCredentialsIdx !== undefined) {\r\n // Update username / password\r\n vp.displayStyle.changeMapLayerProps({\r\n subLayers: validation.subLayers,\r\n }, layerRequiringCredentialsIdx, isOverlay);\r\n vp.displayStyle.changeMapLayerCredentials(layerRequiringCredentialsIdx, isOverlay, source.userName, source.password);\r\n\r\n // Reset the provider's status\r\n const provider = vp.getMapLayerImageryProvider(layerRequiringCredentialsIdx, isOverlay);\r\n if (provider && provider.status !== MapLayerImageryProviderStatus.Valid) {\r\n provider.status = MapLayerImageryProviderStatus.Valid;\r\n }\r\n } else {\r\n // Update service settings if storage is available and we are not prompting user for credentials\r\n if (!settingsStorageDisabled && !props.layerRequiringCredentials) {\r\n if (!(await MapLayerPreferences.storeSource(source, storeOnIModel, vp.iModel.iTwinId!, vp.iModel.iModelId!))) {\r\n const msgError = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Messages.MapLayerPreferencesStoreFailed\");\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msgError));\r\n }\r\n }\r\n const layerSettings = source.toLayerSettings(validation.subLayers);\r\n if (layerSettings) {\r\n vp.displayStyle.attachMapLayerSettings(layerSettings, isOverlay, undefined);\r\n\r\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttached\", { sourceName: source.name, sourceUrl: source.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));\r\n } else {\r\n const msgError = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Messages.MapLayerLayerSettingsConversionError\");\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MapLayerAttachError\", { error: msgError, sourceUrl: source.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n }\r\n }\r\n\r\n vp.invalidateRenderPlan();\r\n }\r\n\r\n if (closeDialog) {\r\n // This handler will close the layer source handler, and therefore the MapUrl dialog.\r\n // don't call it if the dialog needs to remains open.\r\n onOkResult();\r\n }\r\n\r\n } else {\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.ValidationError\");\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, `${msg} ${source.url}`));\r\n resolve(true);\r\n }\r\n resolve(false);\r\n }).catch((error) => {\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MapLayerAttachError\", { error, sourceUrl: source.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n resolve(true);\r\n });\r\n });\r\n }, [props.activeViewport, props.layerRequiringCredentials, settingsStorage, serverRequireCredentials, invalidCredentialsProvided, onOkResult, layerRequiringCredentialsIdx, isOverlay, settingsStorageDisabled]);\r\n\r\n const onNameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setMapName(event.target.value);\r\n }, [setMapName]);\r\n\r\n const onRadioChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setSettingsStorageRadio(event.target.value);\r\n }, [setSettingsStorageRadio]);\r\n\r\n const onUrlChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setMapUrl(event.target.value);\r\n }, [setMapUrl]);\r\n\r\n const handleOk = React.useCallback(() => {\r\n let source: MapLayerSource | undefined;\r\n if (mapUrl && mapName) {\r\n source = MapLayerSource.fromJSON({\r\n url: mapUrl,\r\n name: mapName,\r\n formatId: mapType,\r\n userName,\r\n password,\r\n });\r\n\r\n if (source === undefined || props.mapLayerSourceToEdit) {\r\n\r\n ModalDialogManager.closeDialog();\r\n\r\n if (source === undefined) {\r\n // Close the dialog and inform end user something went wrong.\r\n const msgError = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Messages.MapLayerLayerSourceCreationFailed\");\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MapLayerAttachError\", { error: msgError, sourceUrl: mapUrl });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n return;\r\n }\r\n\r\n // Simply change the source definition in the setting service\r\n if (props.mapLayerSourceToEdit !== undefined) {\r\n const vp = props.activeViewport;\r\n void (async () => {\r\n if (isSettingsStorageAvailable && vp) {\r\n try {\r\n await MapLayerPreferences.replaceSource(props.mapLayerSourceToEdit!, source, vp.iModel.iTwinId!, vp.iModel.iModelId!);\r\n } catch (err: any) {\r\n const errorMessage = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerEditError\", { layerName: props.mapLayerSourceToEdit?.name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, errorMessage));\r\n return;\r\n }\r\n }\r\n })();\r\n return;\r\n }\r\n }\r\n\r\n setLayerAttachPending(true);\r\n\r\n void (async () => {\r\n // Code below is executed in the an async manner but\r\n // I don't necessarily want to mark the handler as async\r\n // so Im wrapping it un in a void wrapper.\r\n try {\r\n const closeDialog = await doAttach(source);\r\n if (isMounted.current) {\r\n setLayerAttachPending(false);\r\n }\r\n\r\n // In theory the modal dialog should always get closed by the parent\r\n // AttachLayerPanel's 'onOkResult' handler. We close it here just in case.\r\n if (closeDialog) {\r\n ModalDialogManager.closeDialog();\r\n }\r\n } catch (_error) {\r\n ModalDialogManager.closeDialog();\r\n }\r\n })();\r\n }\r\n\r\n }, [mapUrl, mapName, mapType, userName, password, props.mapLayerSourceToEdit, props.activeViewport, isSettingsStorageAvailable, doAttach]);\r\n\r\n const dialogContainer = React.useRef<HTMLDivElement>(null);\r\n\r\n const readyToSave = React.useCallback(() => {\r\n const credentialsSet = !!userName && !!password;\r\n return (!!mapUrl && !!mapName)\r\n && (!serverRequireCredentials || (serverRequireCredentials && credentialsSet) && !layerAttachPending)\r\n && !invalidCredentialsProvided;\r\n }, [mapUrl, mapName, userName, password, layerAttachPending, invalidCredentialsProvided, serverRequireCredentials]);\r\n\r\n const buttonCluster = React.useMemo(() => [\r\n { type: DialogButtonType.OK, onClick: handleOk, disabled: !readyToSave() },\r\n { type: DialogButtonType.Cancel, onClick: handleCancel },\r\n ], [readyToSave, handleCancel, handleOk]);\r\n\r\n const handleOnKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (event.key === SpecialKey.Enter) {\r\n if (readyToSave())\r\n handleOk();\r\n }\r\n }, [handleOk, readyToSave]);\r\n\r\n return (\r\n <div ref={dialogContainer}>\r\n <Dialog\r\n className=\"map-layer-url-dialog\"\r\n title={dialogTitle}\r\n opened={true}\r\n resizable={true}\r\n movable={true}\r\n modal={true}\r\n buttonCluster={buttonCluster}\r\n onClose={handleCancel}\r\n onEscape={handleCancel}\r\n minHeight={120}\r\n maxWidth={600}\r\n titleStyle={{paddingLeft: \"10px\"}}\r\n footerStyle={{paddingBottom: \"10px\", paddingRight: \"10px\"}}\r\n trapFocus={false}\r\n >\r\n <div className=\"map-layer-url-dialog-content\">\r\n <div className=\"map-layer-source-url\">\r\n <span className=\"map-layer-source-label\">{typeLabel}</span>\r\n <Select\r\n className=\"map-layer-source-select\"\r\n options={mapTypes}\r\n value={mapType}\r\n disabled={props.layerRequiringCredentials !== undefined || props.mapLayerSourceToEdit !== undefined}\r\n onChange={handleMapTypeSelection}\r\n size=\"small\"/>\r\n <span className=\"map-layer-source-label\">{nameLabel}</span>\r\n <Input className=\"map-layer-source-input\" placeholder={nameInputPlaceHolder} onChange={onNameChange} value={mapName} disabled={props.layerRequiringCredentials !== undefined} size=\"small\" />\r\n <span className=\"map-layer-source-label\">{urlLabel}</span>\r\n <Input className=\"map-layer-source-input\" placeholder={urlInputPlaceHolder} onKeyPress={handleOnKeyDown} onChange={onUrlChange} disabled={props.mapLayerSourceToEdit !== undefined} value={mapUrl} size=\"small\" />\r\n {isAuthSupported() && props.mapLayerSourceToEdit === undefined &&\r\n <>\r\n <span className=\"map-layer-source-label\">{userNameLabel}</span>\r\n <LabeledInput\r\n className=\"map-layer-source-input\"\r\n displayStyle=\"inline\"\r\n placeholder={serverRequireCredentials ? userNameRequiredLabel : userNameLabel}\r\n status={!userName && serverRequireCredentials ? InputStatus.Warning : undefined}\r\n onChange={onUsernameChange}\r\n size=\"small\" />\r\n\r\n <span className=\"map-layer-source-label\">{passwordLabel}</span>\r\n <LabeledInput\r\n className=\"map-layer-source-input\"\r\n displayStyle=\"inline\"\r\n type=\"password\" placeholder={serverRequireCredentials ? passwordRequiredLabel : passwordLabel}\r\n status={!password && serverRequireCredentials ? InputStatus.Warning : undefined}\r\n onChange={onPasswordChange}\r\n onKeyPress={handleOnKeyDown}\r\n size=\"small\" />\r\n </>\r\n }\r\n\r\n {/* Store settings options, not shown when editing a layer */}\r\n {isSettingsStorageAvailable && <div title={settingsStorageDisabled ? noSaveSettingsWarning : \"\"}>\r\n <Radio disabled={settingsStorageDisabled}\r\n name=\"settingsStorage\" value=\"iTwin\"\r\n label={iTwinSettingsLabel} checked={settingsStorage === \"iTwin\"}\r\n onChange={onRadioChange} />\r\n <Radio disabled={settingsStorageDisabled}\r\n name=\"settingsStorage\" value=\"Model\"\r\n label={modelSettingsLabel} checked={settingsStorage === \"Model\"}\r\n onChange={onRadioChange} />\r\n </div>}\r\n </div>\r\n </div>\r\n\r\n {/* Warning message */}\r\n <div className=\"map-layer-source-warnMessage\">\r\n {warningMessage ?\r\n <>\r\n <Icon className=\"map-layer-source-warnMessage-icon\" iconSpec=\"icon-status-warning\" />\r\n <span className=\"map-layer-source-warnMessage-label\">{warningMessage}</span >\r\n </>\r\n :\r\n // Place holder to avoid dialog resize\r\n <span className=\"map-layer-source-placeholder\">&nbsp;</span>\r\n }\r\n </div>\r\n\r\n {/* Progress bar */}\r\n {layerAttachPending &&\r\n <div className=\"map-layer-source-progressBar\">\r\n <ProgressLinear indeterminate />\r\n </div>\r\n }\r\n </Dialog>\r\n </div >\r\n );\r\n}\r\n"]}
@@ -63,6 +63,7 @@
63
63
  "MapLayerEditError": "Failed to edit '{{layerName}}'",
64
64
  "MapLayerLayerSettingsConversionError": "Conversion to layer settings failed",
65
65
  "MapLayerLayerSourceCreationFailed": "Map Layer Source creation failed",
66
+ "MapLayerPreferencesStoreFailed": "Failed to save map layer definition in preferences",
66
67
  "MapLayerValidationFailed": "Map layer validation failed for URL: {{sourceUrl}}"
67
68
  },
68
69
  "Widget": {
@@ -1 +1 @@
1
- {"version":3,"file":"MapUrlDialog.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/MapUrlDialog.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACqC,cAAc,EACW,cAAc,EAClF,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,qBAAqB,CAAC;AAI7B,eAAO,MAAM,SAAS;;;;;CAKrB,CAAC;AAEF,UAAU,iBAAiB;IACzB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,eAAe,CAAC;IAGlC,yBAAyB,CAAC,EAAE,aAAa,CAAC;IAE1C,oBAAoB,CAAC,EAAE,cAAc,CAAC;CACvC;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,eA8ZpD"}
1
+ {"version":3,"file":"MapUrlDialog.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/MapUrlDialog.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACqC,cAAc,EACW,cAAc,EAClF,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,qBAAqB,CAAC;AAK7B,eAAO,MAAM,SAAS;;;;;CAKrB,CAAC;AAEF,UAAU,iBAAiB;IACzB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,eAAe,CAAC;IAGlC,yBAAyB,CAAC,EAAE,aAAa,CAAC;IAE1C,oBAAoB,CAAC,EAAE,cAAc,CAAC;CACvC;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,eAgapD"}
@@ -12,6 +12,7 @@ import { IModelApp, MapLayerImageryProviderStatus, MapLayerSource, MapLayerSourc
12
12
  import "./MapUrlDialog.scss";
13
13
  import { DialogButtonType, SpecialKey } from "@itwin/appui-abstract";
14
14
  import { MapLayerPreferences } from "../../MapLayerPreferences";
15
+ import { MapLayersUI } from "../../mapLayers";
15
16
  export const MAP_TYPES = {
16
17
  wms: "WMS",
17
18
  arcGis: "ArcGIS",
@@ -76,7 +77,7 @@ export function MapUrlDialog(props) {
76
77
  const [passwordRequiredLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString("mapLayers:AuthenticationInputs.PasswordRequired"));
77
78
  const [userNameLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString("mapLayers:AuthenticationInputs.Username"));
78
79
  const [userNameRequiredLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString("mapLayers:AuthenticationInputs.UsernameRequired"));
79
- const [settingsStorage, setSettingsStorageRadio] = React.useState("ITwin");
80
+ const [settingsStorage, setSettingsStorageRadio] = React.useState("iTwin");
80
81
  const [mapType, setMapType] = React.useState((_b = getFormatFromProps()) !== null && _b !== void 0 ? _b : MAP_TYPES.arcGis);
81
82
  // 'isMounted' is used to prevent any async operation once the hook has been
82
83
  // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.
@@ -97,7 +98,7 @@ export function MapUrlDialog(props) {
97
98
  types.push({ value: MAP_TYPES.tileUrl, label: MAP_TYPES.tileUrl });
98
99
  return types;
99
100
  });
100
- const [isSettingsStorageAvailable] = React.useState(((_d = (_c = props === null || props === void 0 ? void 0 : props.activeViewport) === null || _c === void 0 ? void 0 : _c.iModel) === null || _d === void 0 ? void 0 : _d.iTwinId) && ((_f = (_e = props === null || props === void 0 ? void 0 : props.activeViewport) === null || _e === void 0 ? void 0 : _e.iModel) === null || _f === void 0 ? void 0 : _f.iModelId));
101
+ const [isSettingsStorageAvailable] = React.useState(MapLayersUI.iTwinConfig && ((_d = (_c = props === null || props === void 0 ? void 0 : props.activeViewport) === null || _c === void 0 ? void 0 : _c.iModel) === null || _d === void 0 ? void 0 : _d.iTwinId) && ((_f = (_e = props === null || props === void 0 ? void 0 : props.activeViewport) === null || _e === void 0 ? void 0 : _e.iModel) === null || _f === void 0 ? void 0 : _f.iModelId));
101
102
  // Even though the settings storage is available,
102
103
  // we don't always want to enable it in the UI.
103
104
  const [settingsStorageDisabled] = React.useState(!isSettingsStorageAvailable || props.mapLayerSourceToEdit !== undefined || props.layerRequiringCredentials !== undefined);
@@ -195,8 +196,10 @@ export function MapUrlDialog(props) {
195
196
  else {
196
197
  // Update service settings if storage is available and we are not prompting user for credentials
197
198
  if (!settingsStorageDisabled && !props.layerRequiringCredentials) {
198
- if (!(await MapLayerPreferences.storeSource(source, storeOnIModel, vp.iModel.iTwinId, vp.iModel.iModelId)))
199
- return;
199
+ if (!(await MapLayerPreferences.storeSource(source, storeOnIModel, vp.iModel.iTwinId, vp.iModel.iModelId))) {
200
+ const msgError = MapLayersUiItemsProvider.localization.getLocalizedString("mapLayers:Messages.MapLayerPreferencesStoreFailed");
201
+ IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msgError));
202
+ }
200
203
  }
201
204
  const layerSettings = source.toLayerSettings(validation.subLayers);
202
205
  if (layerSettings) {
@@ -1 +1 @@
1
- {"version":3,"file":"MapUrlDialog.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapUrlDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n// cSpell:ignore Modeless WMTS\r\n\r\nimport * as React from \"react\";\r\nimport { Input, LabeledInput, ProgressLinear, Radio, Select, SelectOption } from \"@itwin/itwinui-react\";\r\nimport { Dialog, Icon, InputStatus } from \"@itwin/core-react\";\r\nimport { ModalDialogManager } from \"@itwin/appui-react\";\r\nimport { MapLayersUiItemsProvider } from \"../MapLayersUiItemsProvider\";\r\nimport { MapTypesOptions } from \"../Interfaces\";\r\nimport {\r\n IModelApp, MapLayerImageryProviderStatus, MapLayerSource,\r\n MapLayerSourceStatus, NotifyMessageDetails, OutputMessagePriority, ScreenViewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { MapLayerProps } from \"@itwin/core-common\";\r\nimport \"./MapUrlDialog.scss\";\r\nimport { DialogButtonType, SpecialKey } from \"@itwin/appui-abstract\";\r\nimport { MapLayerPreferences } from \"../../MapLayerPreferences\";\r\n\r\nexport const MAP_TYPES = {\r\n wms: \"WMS\",\r\n arcGis: \"ArcGIS\",\r\n wmts: \"WMTS\",\r\n tileUrl: \"TileURL\",\r\n};\r\n\r\ninterface MapUrlDialogProps {\r\n activeViewport?: ScreenViewport;\r\n isOverlay: boolean;\r\n onOkResult: () => void;\r\n onCancelResult?: () => void;\r\n mapTypesOptions?: MapTypesOptions;\r\n\r\n // An optional layer definition can be provide to enable the edit mode\r\n layerRequiringCredentials?: MapLayerProps;\r\n\r\n mapLayerSourceToEdit?: MapLayerSource;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function MapUrlDialog(props: MapUrlDialogProps) {\r\n const { isOverlay, onOkResult, mapTypesOptions } = props;\r\n const supportWmsAuthentication = (mapTypesOptions?.supportWmsAuthentication ? true : false);\r\n\r\n const getMapUrlFromProps = React.useCallback(() => {\r\n if (props.mapLayerSourceToEdit) {\r\n return props.mapLayerSourceToEdit.url;\r\n } else if (props.layerRequiringCredentials?.url) {\r\n return props.layerRequiringCredentials.url;\r\n }\r\n return \"\";\r\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\r\n\r\n const getMapNameFromProps = React.useCallback(() => {\r\n if (props.mapLayerSourceToEdit) {\r\n return props.mapLayerSourceToEdit.name;\r\n } else if (props.layerRequiringCredentials?.name) {\r\n return props.layerRequiringCredentials.name;\r\n }\r\n return \"\";\r\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\r\n\r\n const getFormatFromProps = React.useCallback(() => {\r\n if (props.mapLayerSourceToEdit) {\r\n return props.mapLayerSourceToEdit.formatId;\r\n } else if (props.layerRequiringCredentials?.formatId) {\r\n return props.layerRequiringCredentials.formatId;\r\n }\r\n return undefined;\r\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\r\n\r\n const [dialogTitle] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(props.layerRequiringCredentials || props.mapLayerSourceToEdit ? \"mapLayers:CustomAttach.EditCustomLayer\" : \"mapLayers:CustomAttach.AttachCustomLayer\"));\r\n const [typeLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.Type\"));\r\n const [nameLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.Name\"));\r\n const [nameInputPlaceHolder] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.NameInputPlaceHolder\"));\r\n const [urlLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.URL\"));\r\n const [urlInputPlaceHolder] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.UrlInputPlaceHolder\"));\r\n const [iTwinSettingsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.StoreOnITwinSettings\"));\r\n const [modelSettingsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.StoreOnModelSettings\"));\r\n const [missingCredentialsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MissingCredentials\"));\r\n const [invalidCredentialsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.InvalidCredentials\"));\r\n const [serverRequireCredentials, setServerRequireCredentials] = React.useState(props.layerRequiringCredentials ?? false);\r\n const [invalidCredentialsProvided, setInvalidCredentialsProvided] = React.useState(false);\r\n const [layerAttachPending, setLayerAttachPending] = React.useState(false);\r\n const [warningMessage, setWarningMessage] = React.useState(props.layerRequiringCredentials ? missingCredentialsLabel : undefined);\r\n const [mapUrl, setMapUrl] = React.useState(getMapUrlFromProps());\r\n const [mapName, setMapName] = React.useState(getMapNameFromProps());\r\n const [userName, setUserName] = React.useState(\"\");\r\n const [password, setPassword] = React.useState(\"\");\r\n const [noSaveSettingsWarning] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.NoSaveSettingsWarning\"));\r\n const [passwordLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Password\"));\r\n const [passwordRequiredLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.PasswordRequired\"));\r\n const [userNameLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Username\"));\r\n const [userNameRequiredLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.UsernameRequired\"));\r\n const [settingsStorage, setSettingsStorageRadio] = React.useState(\"ITwin\");\r\n\r\n const [mapType, setMapType] = React.useState(getFormatFromProps() ?? MAP_TYPES.arcGis);\r\n\r\n // 'isMounted' is used to prevent any async operation once the hook has been\r\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\r\n const isMounted = React.useRef(false);\r\n React.useEffect(() => {\r\n isMounted.current = true;\r\n return () => {\r\n isMounted.current = false;\r\n };\r\n }, []);\r\n\r\n const [mapTypes] = React.useState((): SelectOption<string>[] => {\r\n const types = [\r\n { value: MAP_TYPES.arcGis, label: MAP_TYPES.arcGis },\r\n { value: MAP_TYPES.wms, label: MAP_TYPES.wms },\r\n { value: MAP_TYPES.wmts, label: MAP_TYPES.wmts },\r\n ];\r\n if (mapTypesOptions?.supportTileUrl)\r\n types.push({ value: MAP_TYPES.tileUrl, label: MAP_TYPES.tileUrl });\r\n return types;\r\n });\r\n\r\n const [isSettingsStorageAvailable] = React.useState(props?.activeViewport?.iModel?.iTwinId && props?.activeViewport?.iModel?.iModelId);\r\n\r\n // Even though the settings storage is available,\r\n // we don't always want to enable it in the UI.\r\n const [settingsStorageDisabled] = React.useState(!isSettingsStorageAvailable || props.mapLayerSourceToEdit !== undefined || props.layerRequiringCredentials !== undefined);\r\n\r\n const isAuthSupported = React.useCallback(() => {\r\n return ((mapType === MAP_TYPES.wms || mapType === MAP_TYPES.wms) && supportWmsAuthentication)\r\n || mapType === MAP_TYPES.arcGis;\r\n }, [mapType, supportWmsAuthentication]);\r\n\r\n // const [layerIdxToEdit] = React.useState((): number | undefined => {\r\n const [layerRequiringCredentialsIdx] = React.useState((): number | undefined => {\r\n if (props.layerRequiringCredentials === undefined || !props.layerRequiringCredentials.name || !props.layerRequiringCredentials.url) {\r\n return undefined;\r\n }\r\n\r\n const indexInDisplayStyle = props.activeViewport?.displayStyle.findMapLayerIndexByNameAndUrl(props.layerRequiringCredentials.name, props.layerRequiringCredentials.url, isOverlay);\r\n if (indexInDisplayStyle === undefined || indexInDisplayStyle < 0) {\r\n return undefined;\r\n } else {\r\n return indexInDisplayStyle;\r\n }\r\n });\r\n\r\n // Update warning message based on the dialog state and server response\r\n React.useEffect(() => {\r\n if (invalidCredentialsProvided) {\r\n setWarningMessage(invalidCredentialsLabel);\r\n } else if (serverRequireCredentials && (!userName || !password)) {\r\n setWarningMessage(missingCredentialsLabel);\r\n } else {\r\n setWarningMessage(undefined);\r\n }\r\n }, [invalidCredentialsProvided, invalidCredentialsLabel, missingCredentialsLabel, serverRequireCredentials, userName, password, setWarningMessage]);\r\n\r\n const handleMapTypeSelection = React.useCallback((newValue: string) => {\r\n setMapType(newValue);\r\n }, [setMapType]);\r\n\r\n const handleCancel = React.useCallback(() => {\r\n if (props.onCancelResult) {\r\n props.onCancelResult();\r\n return;\r\n }\r\n ModalDialogManager.closeDialog();\r\n }, [props]);\r\n\r\n const onUsernameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setUserName(event.target.value);\r\n if (invalidCredentialsProvided)\r\n setInvalidCredentialsProvided(false);\r\n }, [setUserName, invalidCredentialsProvided, setInvalidCredentialsProvided]);\r\n\r\n const onPasswordChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setPassword(event.target.value);\r\n if (invalidCredentialsProvided)\r\n setInvalidCredentialsProvided(false);\r\n }, [setPassword, invalidCredentialsProvided, setInvalidCredentialsProvided]);\r\n\r\n const doAttach = React.useCallback(async (source: MapLayerSource): Promise<boolean> => {\r\n // Returns a promise, When true, the dialog should closed\r\n return new Promise<boolean>((resolve, _reject) => {\r\n const vp = props?.activeViewport;\r\n if (vp === undefined || source === undefined) {\r\n resolve(true);\r\n return;\r\n }\r\n\r\n const storeOnIModel = \"Model\" === settingsStorage;\r\n source.validateSource(true).then(async (validation) => {\r\n if (validation.status === MapLayerSourceStatus.Valid\r\n || validation.status === MapLayerSourceStatus.RequireAuth\r\n || validation.status === MapLayerSourceStatus.InvalidCredentials) {\r\n const sourceRequireAuth = (validation.status === MapLayerSourceStatus.RequireAuth);\r\n const invalidCredentials = (validation.status === MapLayerSourceStatus.InvalidCredentials);\r\n const closeDialog = !sourceRequireAuth && !invalidCredentials;\r\n resolve(closeDialog);\r\n\r\n if (sourceRequireAuth && !serverRequireCredentials) {\r\n setServerRequireCredentials(true);\r\n }\r\n if (invalidCredentials) {\r\n setInvalidCredentialsProvided(true);\r\n return;\r\n } else if (invalidCredentialsProvided) {\r\n setInvalidCredentialsProvided(false); // flag reset\r\n }\r\n\r\n if (validation.status === MapLayerSourceStatus.Valid) {\r\n // Attach layer and update settings service (only if editing)\r\n if (layerRequiringCredentialsIdx !== undefined) {\r\n // Update username / password\r\n vp.displayStyle.changeMapLayerProps({\r\n subLayers: validation.subLayers,\r\n }, layerRequiringCredentialsIdx, isOverlay);\r\n vp.displayStyle.changeMapLayerCredentials(layerRequiringCredentialsIdx, isOverlay, source.userName, source.password);\r\n\r\n // Reset the provider's status\r\n const provider = vp.getMapLayerImageryProvider(layerRequiringCredentialsIdx, isOverlay);\r\n if (provider && provider.status !== MapLayerImageryProviderStatus.Valid) {\r\n provider.status = MapLayerImageryProviderStatus.Valid;\r\n }\r\n } else {\r\n // Update service settings if storage is available and we are not prompting user for credentials\r\n if (!settingsStorageDisabled && !props.layerRequiringCredentials) {\r\n if (!(await MapLayerPreferences.storeSource(source, storeOnIModel, vp.iModel.iTwinId!, vp.iModel.iModelId!)))\r\n return;\r\n }\r\n const layerSettings = source.toLayerSettings(validation.subLayers);\r\n if (layerSettings) {\r\n vp.displayStyle.attachMapLayerSettings(layerSettings, isOverlay, undefined);\r\n\r\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttached\", { sourceName: source.name, sourceUrl: source.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));\r\n } else {\r\n const msgError = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Messages.MapLayerLayerSettingsConversionError\");\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MapLayerAttachError\", { error: msgError, sourceUrl: source.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n }\r\n }\r\n\r\n vp.invalidateRenderPlan();\r\n }\r\n\r\n if (closeDialog) {\r\n // This handler will close the layer source handler, and therefore the MapUrl dialog.\r\n // don't call it if the dialog needs to remains open.\r\n onOkResult();\r\n }\r\n\r\n } else {\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.ValidationError\");\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, `${msg} ${source.url}`));\r\n resolve(true);\r\n }\r\n resolve(false);\r\n }).catch((error) => {\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MapLayerAttachError\", { error, sourceUrl: source.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n resolve(true);\r\n });\r\n });\r\n }, [props.activeViewport, props.layerRequiringCredentials, settingsStorage, serverRequireCredentials, invalidCredentialsProvided, onOkResult, layerRequiringCredentialsIdx, isOverlay, settingsStorageDisabled]);\r\n\r\n const onNameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setMapName(event.target.value);\r\n }, [setMapName]);\r\n\r\n const onRadioChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setSettingsStorageRadio(event.target.value);\r\n }, [setSettingsStorageRadio]);\r\n\r\n const onUrlChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setMapUrl(event.target.value);\r\n }, [setMapUrl]);\r\n\r\n const handleOk = React.useCallback(() => {\r\n let source: MapLayerSource | undefined;\r\n if (mapUrl && mapName) {\r\n source = MapLayerSource.fromJSON({\r\n url: mapUrl,\r\n name: mapName,\r\n formatId: mapType,\r\n userName,\r\n password,\r\n });\r\n\r\n if (source === undefined || props.mapLayerSourceToEdit) {\r\n\r\n ModalDialogManager.closeDialog();\r\n\r\n if (source === undefined) {\r\n // Close the dialog and inform end user something went wrong.\r\n const msgError = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Messages.MapLayerLayerSourceCreationFailed\");\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MapLayerAttachError\", { error: msgError, sourceUrl: mapUrl });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n return;\r\n }\r\n\r\n // Simply change the source definition in the setting service\r\n if (props.mapLayerSourceToEdit !== undefined) {\r\n const vp = props.activeViewport;\r\n void (async () => {\r\n if (isSettingsStorageAvailable && vp) {\r\n try {\r\n await MapLayerPreferences.replaceSource(props.mapLayerSourceToEdit!, source, vp.iModel.iTwinId!, vp.iModel.iModelId!);\r\n } catch (err: any) {\r\n const errorMessage = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerEditError\", { layerName: props.mapLayerSourceToEdit?.name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, errorMessage));\r\n return;\r\n }\r\n }\r\n })();\r\n return;\r\n }\r\n }\r\n\r\n setLayerAttachPending(true);\r\n\r\n void (async () => {\r\n // Code below is executed in the an async manner but\r\n // I don't necessarily want to mark the handler as async\r\n // so Im wrapping it un in a void wrapper.\r\n try {\r\n const closeDialog = await doAttach(source);\r\n if (isMounted.current) {\r\n setLayerAttachPending(false);\r\n }\r\n\r\n // In theory the modal dialog should always get closed by the parent\r\n // AttachLayerPanel's 'onOkResult' handler. We close it here just in case.\r\n if (closeDialog) {\r\n ModalDialogManager.closeDialog();\r\n }\r\n } catch (_error) {\r\n ModalDialogManager.closeDialog();\r\n }\r\n })();\r\n }\r\n\r\n }, [mapUrl, mapName, mapType, userName, password, props.mapLayerSourceToEdit, props.activeViewport, isSettingsStorageAvailable, doAttach]);\r\n\r\n const dialogContainer = React.useRef<HTMLDivElement>(null);\r\n\r\n const readyToSave = React.useCallback(() => {\r\n const credentialsSet = !!userName && !!password;\r\n return (!!mapUrl && !!mapName)\r\n && (!serverRequireCredentials || (serverRequireCredentials && credentialsSet) && !layerAttachPending)\r\n && !invalidCredentialsProvided;\r\n }, [mapUrl, mapName, userName, password, layerAttachPending, invalidCredentialsProvided, serverRequireCredentials]);\r\n\r\n const buttonCluster = React.useMemo(() => [\r\n { type: DialogButtonType.OK, onClick: handleOk, disabled: !readyToSave() },\r\n { type: DialogButtonType.Cancel, onClick: handleCancel },\r\n ], [readyToSave, handleCancel, handleOk]);\r\n\r\n const handleOnKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (event.key === SpecialKey.Enter) {\r\n if (readyToSave())\r\n handleOk();\r\n }\r\n }, [handleOk, readyToSave]);\r\n\r\n return (\r\n <div ref={dialogContainer}>\r\n <Dialog\r\n className=\"map-layer-url-dialog\"\r\n title={dialogTitle}\r\n opened={true}\r\n resizable={true}\r\n movable={true}\r\n modal={true}\r\n buttonCluster={buttonCluster}\r\n onClose={handleCancel}\r\n onEscape={handleCancel}\r\n minHeight={120}\r\n maxWidth={600}\r\n titleStyle={{paddingLeft: \"10px\"}}\r\n footerStyle={{paddingBottom: \"10px\", paddingRight: \"10px\"}}\r\n trapFocus={false}\r\n >\r\n <div className=\"map-layer-url-dialog-content\">\r\n <div className=\"map-layer-source-url\">\r\n <span className=\"map-layer-source-label\">{typeLabel}</span>\r\n <Select\r\n className=\"map-layer-source-select\"\r\n options={mapTypes}\r\n value={mapType}\r\n disabled={props.layerRequiringCredentials !== undefined || props.mapLayerSourceToEdit !== undefined}\r\n onChange={handleMapTypeSelection}\r\n size=\"small\"/>\r\n <span className=\"map-layer-source-label\">{nameLabel}</span>\r\n <Input className=\"map-layer-source-input\" placeholder={nameInputPlaceHolder} onChange={onNameChange} value={mapName} disabled={props.layerRequiringCredentials !== undefined} size=\"small\" />\r\n <span className=\"map-layer-source-label\">{urlLabel}</span>\r\n <Input className=\"map-layer-source-input\" placeholder={urlInputPlaceHolder} onKeyPress={handleOnKeyDown} onChange={onUrlChange} disabled={props.mapLayerSourceToEdit !== undefined} value={mapUrl} size=\"small\" />\r\n {isAuthSupported() && props.mapLayerSourceToEdit === undefined &&\r\n <>\r\n <span className=\"map-layer-source-label\">{userNameLabel}</span>\r\n <LabeledInput\r\n className=\"map-layer-source-input\"\r\n displayStyle=\"inline\"\r\n placeholder={serverRequireCredentials ? userNameRequiredLabel : userNameLabel}\r\n status={!userName && serverRequireCredentials ? InputStatus.Warning : undefined}\r\n onChange={onUsernameChange}\r\n size=\"small\" />\r\n\r\n <span className=\"map-layer-source-label\">{passwordLabel}</span>\r\n <LabeledInput\r\n className=\"map-layer-source-input\"\r\n displayStyle=\"inline\"\r\n type=\"password\" placeholder={serverRequireCredentials ? passwordRequiredLabel : passwordLabel}\r\n status={!password && serverRequireCredentials ? InputStatus.Warning : undefined}\r\n onChange={onPasswordChange}\r\n onKeyPress={handleOnKeyDown}\r\n size=\"small\" />\r\n </>\r\n }\r\n\r\n {/* Store settings options, not shown when editing a layer */}\r\n {isSettingsStorageAvailable && <div title={settingsStorageDisabled ? noSaveSettingsWarning : \"\"}>\r\n <Radio disabled={settingsStorageDisabled}\r\n name=\"settingsStorage\" value=\"iTwin\"\r\n label={iTwinSettingsLabel} checked={settingsStorage === \"iTwin\"}\r\n onChange={onRadioChange} />\r\n <Radio disabled={settingsStorageDisabled}\r\n name=\"settingsStorage\" value=\"Model\"\r\n label={modelSettingsLabel} checked={settingsStorage === \"Model\"}\r\n onChange={onRadioChange} />\r\n </div>}\r\n </div>\r\n </div>\r\n\r\n {/* Warning message */}\r\n <div className=\"map-layer-source-warnMessage\">\r\n {warningMessage ?\r\n <>\r\n <Icon className=\"map-layer-source-warnMessage-icon\" iconSpec=\"icon-status-warning\" />\r\n <span className=\"map-layer-source-warnMessage-label\">{warningMessage}</span >\r\n </>\r\n :\r\n // Place holder to avoid dialog resize\r\n <span className=\"map-layer-source-placeholder\">&nbsp;</span>\r\n }\r\n </div>\r\n\r\n {/* Progress bar */}\r\n {layerAttachPending &&\r\n <div className=\"map-layer-source-progressBar\">\r\n <ProgressLinear indeterminate />\r\n </div>\r\n }\r\n </Dialog>\r\n </div >\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"MapUrlDialog.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapUrlDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n// cSpell:ignore Modeless WMTS\r\n\r\nimport * as React from \"react\";\r\nimport { Input, LabeledInput, ProgressLinear, Radio, Select, SelectOption } from \"@itwin/itwinui-react\";\r\nimport { Dialog, Icon, InputStatus } from \"@itwin/core-react\";\r\nimport { ModalDialogManager } from \"@itwin/appui-react\";\r\nimport { MapLayersUiItemsProvider } from \"../MapLayersUiItemsProvider\";\r\nimport { MapTypesOptions } from \"../Interfaces\";\r\nimport {\r\n IModelApp, MapLayerImageryProviderStatus, MapLayerSource,\r\n MapLayerSourceStatus, NotifyMessageDetails, OutputMessagePriority, ScreenViewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { MapLayerProps } from \"@itwin/core-common\";\r\nimport \"./MapUrlDialog.scss\";\r\nimport { DialogButtonType, SpecialKey } from \"@itwin/appui-abstract\";\r\nimport { MapLayerPreferences } from \"../../MapLayerPreferences\";\r\nimport { MapLayersUI } from \"../../mapLayers\";\r\n\r\nexport const MAP_TYPES = {\r\n wms: \"WMS\",\r\n arcGis: \"ArcGIS\",\r\n wmts: \"WMTS\",\r\n tileUrl: \"TileURL\",\r\n};\r\n\r\ninterface MapUrlDialogProps {\r\n activeViewport?: ScreenViewport;\r\n isOverlay: boolean;\r\n onOkResult: () => void;\r\n onCancelResult?: () => void;\r\n mapTypesOptions?: MapTypesOptions;\r\n\r\n // An optional layer definition can be provide to enable the edit mode\r\n layerRequiringCredentials?: MapLayerProps;\r\n\r\n mapLayerSourceToEdit?: MapLayerSource;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function MapUrlDialog(props: MapUrlDialogProps) {\r\n const { isOverlay, onOkResult, mapTypesOptions } = props;\r\n const supportWmsAuthentication = (mapTypesOptions?.supportWmsAuthentication ? true : false);\r\n\r\n const getMapUrlFromProps = React.useCallback(() => {\r\n if (props.mapLayerSourceToEdit) {\r\n return props.mapLayerSourceToEdit.url;\r\n } else if (props.layerRequiringCredentials?.url) {\r\n return props.layerRequiringCredentials.url;\r\n }\r\n return \"\";\r\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\r\n\r\n const getMapNameFromProps = React.useCallback(() => {\r\n if (props.mapLayerSourceToEdit) {\r\n return props.mapLayerSourceToEdit.name;\r\n } else if (props.layerRequiringCredentials?.name) {\r\n return props.layerRequiringCredentials.name;\r\n }\r\n return \"\";\r\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\r\n\r\n const getFormatFromProps = React.useCallback(() => {\r\n if (props.mapLayerSourceToEdit) {\r\n return props.mapLayerSourceToEdit.formatId;\r\n } else if (props.layerRequiringCredentials?.formatId) {\r\n return props.layerRequiringCredentials.formatId;\r\n }\r\n return undefined;\r\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\r\n\r\n const [dialogTitle] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(props.layerRequiringCredentials || props.mapLayerSourceToEdit ? \"mapLayers:CustomAttach.EditCustomLayer\" : \"mapLayers:CustomAttach.AttachCustomLayer\"));\r\n const [typeLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.Type\"));\r\n const [nameLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.Name\"));\r\n const [nameInputPlaceHolder] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.NameInputPlaceHolder\"));\r\n const [urlLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.URL\"));\r\n const [urlInputPlaceHolder] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.UrlInputPlaceHolder\"));\r\n const [iTwinSettingsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.StoreOnITwinSettings\"));\r\n const [modelSettingsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.StoreOnModelSettings\"));\r\n const [missingCredentialsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MissingCredentials\"));\r\n const [invalidCredentialsLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.InvalidCredentials\"));\r\n const [serverRequireCredentials, setServerRequireCredentials] = React.useState(props.layerRequiringCredentials ?? false);\r\n const [invalidCredentialsProvided, setInvalidCredentialsProvided] = React.useState(false);\r\n const [layerAttachPending, setLayerAttachPending] = React.useState(false);\r\n const [warningMessage, setWarningMessage] = React.useState(props.layerRequiringCredentials ? missingCredentialsLabel : undefined);\r\n const [mapUrl, setMapUrl] = React.useState(getMapUrlFromProps());\r\n const [mapName, setMapName] = React.useState(getMapNameFromProps());\r\n const [userName, setUserName] = React.useState(\"\");\r\n const [password, setPassword] = React.useState(\"\");\r\n const [noSaveSettingsWarning] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.NoSaveSettingsWarning\"));\r\n const [passwordLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Password\"));\r\n const [passwordRequiredLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.PasswordRequired\"));\r\n const [userNameLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Username\"));\r\n const [userNameRequiredLabel] = React.useState(MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.UsernameRequired\"));\r\n const [settingsStorage, setSettingsStorageRadio] = React.useState(\"iTwin\");\r\n\r\n const [mapType, setMapType] = React.useState(getFormatFromProps() ?? MAP_TYPES.arcGis);\r\n\r\n // 'isMounted' is used to prevent any async operation once the hook has been\r\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\r\n const isMounted = React.useRef(false);\r\n React.useEffect(() => {\r\n isMounted.current = true;\r\n return () => {\r\n isMounted.current = false;\r\n };\r\n }, []);\r\n\r\n const [mapTypes] = React.useState((): SelectOption<string>[] => {\r\n const types = [\r\n { value: MAP_TYPES.arcGis, label: MAP_TYPES.arcGis },\r\n { value: MAP_TYPES.wms, label: MAP_TYPES.wms },\r\n { value: MAP_TYPES.wmts, label: MAP_TYPES.wmts },\r\n ];\r\n if (mapTypesOptions?.supportTileUrl)\r\n types.push({ value: MAP_TYPES.tileUrl, label: MAP_TYPES.tileUrl });\r\n return types;\r\n });\r\n\r\n const [isSettingsStorageAvailable] = React.useState(MapLayersUI.iTwinConfig && props?.activeViewport?.iModel?.iTwinId && props?.activeViewport?.iModel?.iModelId);\r\n\r\n // Even though the settings storage is available,\r\n // we don't always want to enable it in the UI.\r\n const [settingsStorageDisabled] = React.useState(!isSettingsStorageAvailable || props.mapLayerSourceToEdit !== undefined || props.layerRequiringCredentials !== undefined);\r\n\r\n const isAuthSupported = React.useCallback(() => {\r\n return ((mapType === MAP_TYPES.wms || mapType === MAP_TYPES.wms) && supportWmsAuthentication)\r\n || mapType === MAP_TYPES.arcGis;\r\n }, [mapType, supportWmsAuthentication]);\r\n\r\n // const [layerIdxToEdit] = React.useState((): number | undefined => {\r\n const [layerRequiringCredentialsIdx] = React.useState((): number | undefined => {\r\n if (props.layerRequiringCredentials === undefined || !props.layerRequiringCredentials.name || !props.layerRequiringCredentials.url) {\r\n return undefined;\r\n }\r\n\r\n const indexInDisplayStyle = props.activeViewport?.displayStyle.findMapLayerIndexByNameAndUrl(props.layerRequiringCredentials.name, props.layerRequiringCredentials.url, isOverlay);\r\n if (indexInDisplayStyle === undefined || indexInDisplayStyle < 0) {\r\n return undefined;\r\n } else {\r\n return indexInDisplayStyle;\r\n }\r\n });\r\n\r\n // Update warning message based on the dialog state and server response\r\n React.useEffect(() => {\r\n if (invalidCredentialsProvided) {\r\n setWarningMessage(invalidCredentialsLabel);\r\n } else if (serverRequireCredentials && (!userName || !password)) {\r\n setWarningMessage(missingCredentialsLabel);\r\n } else {\r\n setWarningMessage(undefined);\r\n }\r\n }, [invalidCredentialsProvided, invalidCredentialsLabel, missingCredentialsLabel, serverRequireCredentials, userName, password, setWarningMessage]);\r\n\r\n const handleMapTypeSelection = React.useCallback((newValue: string) => {\r\n setMapType(newValue);\r\n }, [setMapType]);\r\n\r\n const handleCancel = React.useCallback(() => {\r\n if (props.onCancelResult) {\r\n props.onCancelResult();\r\n return;\r\n }\r\n ModalDialogManager.closeDialog();\r\n }, [props]);\r\n\r\n const onUsernameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setUserName(event.target.value);\r\n if (invalidCredentialsProvided)\r\n setInvalidCredentialsProvided(false);\r\n }, [setUserName, invalidCredentialsProvided, setInvalidCredentialsProvided]);\r\n\r\n const onPasswordChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setPassword(event.target.value);\r\n if (invalidCredentialsProvided)\r\n setInvalidCredentialsProvided(false);\r\n }, [setPassword, invalidCredentialsProvided, setInvalidCredentialsProvided]);\r\n\r\n const doAttach = React.useCallback(async (source: MapLayerSource): Promise<boolean> => {\r\n // Returns a promise, When true, the dialog should closed\r\n return new Promise<boolean>((resolve, _reject) => {\r\n const vp = props?.activeViewport;\r\n if (vp === undefined || source === undefined) {\r\n resolve(true);\r\n return;\r\n }\r\n\r\n const storeOnIModel = \"Model\" === settingsStorage;\r\n source.validateSource(true).then(async (validation) => {\r\n if (validation.status === MapLayerSourceStatus.Valid\r\n || validation.status === MapLayerSourceStatus.RequireAuth\r\n || validation.status === MapLayerSourceStatus.InvalidCredentials) {\r\n const sourceRequireAuth = (validation.status === MapLayerSourceStatus.RequireAuth);\r\n const invalidCredentials = (validation.status === MapLayerSourceStatus.InvalidCredentials);\r\n const closeDialog = !sourceRequireAuth && !invalidCredentials;\r\n resolve(closeDialog);\r\n\r\n if (sourceRequireAuth && !serverRequireCredentials) {\r\n setServerRequireCredentials(true);\r\n }\r\n if (invalidCredentials) {\r\n setInvalidCredentialsProvided(true);\r\n return;\r\n } else if (invalidCredentialsProvided) {\r\n setInvalidCredentialsProvided(false); // flag reset\r\n }\r\n\r\n if (validation.status === MapLayerSourceStatus.Valid) {\r\n // Attach layer and update settings service (only if editing)\r\n if (layerRequiringCredentialsIdx !== undefined) {\r\n // Update username / password\r\n vp.displayStyle.changeMapLayerProps({\r\n subLayers: validation.subLayers,\r\n }, layerRequiringCredentialsIdx, isOverlay);\r\n vp.displayStyle.changeMapLayerCredentials(layerRequiringCredentialsIdx, isOverlay, source.userName, source.password);\r\n\r\n // Reset the provider's status\r\n const provider = vp.getMapLayerImageryProvider(layerRequiringCredentialsIdx, isOverlay);\r\n if (provider && provider.status !== MapLayerImageryProviderStatus.Valid) {\r\n provider.status = MapLayerImageryProviderStatus.Valid;\r\n }\r\n } else {\r\n // Update service settings if storage is available and we are not prompting user for credentials\r\n if (!settingsStorageDisabled && !props.layerRequiringCredentials) {\r\n if (!(await MapLayerPreferences.storeSource(source, storeOnIModel, vp.iModel.iTwinId!, vp.iModel.iModelId!))) {\r\n const msgError = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Messages.MapLayerPreferencesStoreFailed\");\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msgError));\r\n }\r\n }\r\n const layerSettings = source.toLayerSettings(validation.subLayers);\r\n if (layerSettings) {\r\n vp.displayStyle.attachMapLayerSettings(layerSettings, isOverlay, undefined);\r\n\r\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttached\", { sourceName: source.name, sourceUrl: source.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));\r\n } else {\r\n const msgError = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Messages.MapLayerLayerSettingsConversionError\");\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MapLayerAttachError\", { error: msgError, sourceUrl: source.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n }\r\n }\r\n\r\n vp.invalidateRenderPlan();\r\n }\r\n\r\n if (closeDialog) {\r\n // This handler will close the layer source handler, and therefore the MapUrl dialog.\r\n // don't call it if the dialog needs to remains open.\r\n onOkResult();\r\n }\r\n\r\n } else {\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.ValidationError\");\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, `${msg} ${source.url}`));\r\n resolve(true);\r\n }\r\n resolve(false);\r\n }).catch((error) => {\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MapLayerAttachError\", { error, sourceUrl: source.url });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n resolve(true);\r\n });\r\n });\r\n }, [props.activeViewport, props.layerRequiringCredentials, settingsStorage, serverRequireCredentials, invalidCredentialsProvided, onOkResult, layerRequiringCredentialsIdx, isOverlay, settingsStorageDisabled]);\r\n\r\n const onNameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setMapName(event.target.value);\r\n }, [setMapName]);\r\n\r\n const onRadioChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setSettingsStorageRadio(event.target.value);\r\n }, [setSettingsStorageRadio]);\r\n\r\n const onUrlChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setMapUrl(event.target.value);\r\n }, [setMapUrl]);\r\n\r\n const handleOk = React.useCallback(() => {\r\n let source: MapLayerSource | undefined;\r\n if (mapUrl && mapName) {\r\n source = MapLayerSource.fromJSON({\r\n url: mapUrl,\r\n name: mapName,\r\n formatId: mapType,\r\n userName,\r\n password,\r\n });\r\n\r\n if (source === undefined || props.mapLayerSourceToEdit) {\r\n\r\n ModalDialogManager.closeDialog();\r\n\r\n if (source === undefined) {\r\n // Close the dialog and inform end user something went wrong.\r\n const msgError = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:Messages.MapLayerLayerSourceCreationFailed\");\r\n const msg = MapLayersUiItemsProvider.localization.getLocalizedString(\"mapLayers:CustomAttach.MapLayerAttachError\", { error: msgError, sourceUrl: mapUrl });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\r\n return;\r\n }\r\n\r\n // Simply change the source definition in the setting service\r\n if (props.mapLayerSourceToEdit !== undefined) {\r\n const vp = props.activeViewport;\r\n void (async () => {\r\n if (isSettingsStorageAvailable && vp) {\r\n try {\r\n await MapLayerPreferences.replaceSource(props.mapLayerSourceToEdit!, source, vp.iModel.iTwinId!, vp.iModel.iModelId!);\r\n } catch (err: any) {\r\n const errorMessage = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerEditError\", { layerName: props.mapLayerSourceToEdit?.name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, errorMessage));\r\n return;\r\n }\r\n }\r\n })();\r\n return;\r\n }\r\n }\r\n\r\n setLayerAttachPending(true);\r\n\r\n void (async () => {\r\n // Code below is executed in the an async manner but\r\n // I don't necessarily want to mark the handler as async\r\n // so Im wrapping it un in a void wrapper.\r\n try {\r\n const closeDialog = await doAttach(source);\r\n if (isMounted.current) {\r\n setLayerAttachPending(false);\r\n }\r\n\r\n // In theory the modal dialog should always get closed by the parent\r\n // AttachLayerPanel's 'onOkResult' handler. We close it here just in case.\r\n if (closeDialog) {\r\n ModalDialogManager.closeDialog();\r\n }\r\n } catch (_error) {\r\n ModalDialogManager.closeDialog();\r\n }\r\n })();\r\n }\r\n\r\n }, [mapUrl, mapName, mapType, userName, password, props.mapLayerSourceToEdit, props.activeViewport, isSettingsStorageAvailable, doAttach]);\r\n\r\n const dialogContainer = React.useRef<HTMLDivElement>(null);\r\n\r\n const readyToSave = React.useCallback(() => {\r\n const credentialsSet = !!userName && !!password;\r\n return (!!mapUrl && !!mapName)\r\n && (!serverRequireCredentials || (serverRequireCredentials && credentialsSet) && !layerAttachPending)\r\n && !invalidCredentialsProvided;\r\n }, [mapUrl, mapName, userName, password, layerAttachPending, invalidCredentialsProvided, serverRequireCredentials]);\r\n\r\n const buttonCluster = React.useMemo(() => [\r\n { type: DialogButtonType.OK, onClick: handleOk, disabled: !readyToSave() },\r\n { type: DialogButtonType.Cancel, onClick: handleCancel },\r\n ], [readyToSave, handleCancel, handleOk]);\r\n\r\n const handleOnKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (event.key === SpecialKey.Enter) {\r\n if (readyToSave())\r\n handleOk();\r\n }\r\n }, [handleOk, readyToSave]);\r\n\r\n return (\r\n <div ref={dialogContainer}>\r\n <Dialog\r\n className=\"map-layer-url-dialog\"\r\n title={dialogTitle}\r\n opened={true}\r\n resizable={true}\r\n movable={true}\r\n modal={true}\r\n buttonCluster={buttonCluster}\r\n onClose={handleCancel}\r\n onEscape={handleCancel}\r\n minHeight={120}\r\n maxWidth={600}\r\n titleStyle={{paddingLeft: \"10px\"}}\r\n footerStyle={{paddingBottom: \"10px\", paddingRight: \"10px\"}}\r\n trapFocus={false}\r\n >\r\n <div className=\"map-layer-url-dialog-content\">\r\n <div className=\"map-layer-source-url\">\r\n <span className=\"map-layer-source-label\">{typeLabel}</span>\r\n <Select\r\n className=\"map-layer-source-select\"\r\n options={mapTypes}\r\n value={mapType}\r\n disabled={props.layerRequiringCredentials !== undefined || props.mapLayerSourceToEdit !== undefined}\r\n onChange={handleMapTypeSelection}\r\n size=\"small\"/>\r\n <span className=\"map-layer-source-label\">{nameLabel}</span>\r\n <Input className=\"map-layer-source-input\" placeholder={nameInputPlaceHolder} onChange={onNameChange} value={mapName} disabled={props.layerRequiringCredentials !== undefined} size=\"small\" />\r\n <span className=\"map-layer-source-label\">{urlLabel}</span>\r\n <Input className=\"map-layer-source-input\" placeholder={urlInputPlaceHolder} onKeyPress={handleOnKeyDown} onChange={onUrlChange} disabled={props.mapLayerSourceToEdit !== undefined} value={mapUrl} size=\"small\" />\r\n {isAuthSupported() && props.mapLayerSourceToEdit === undefined &&\r\n <>\r\n <span className=\"map-layer-source-label\">{userNameLabel}</span>\r\n <LabeledInput\r\n className=\"map-layer-source-input\"\r\n displayStyle=\"inline\"\r\n placeholder={serverRequireCredentials ? userNameRequiredLabel : userNameLabel}\r\n status={!userName && serverRequireCredentials ? InputStatus.Warning : undefined}\r\n onChange={onUsernameChange}\r\n size=\"small\" />\r\n\r\n <span className=\"map-layer-source-label\">{passwordLabel}</span>\r\n <LabeledInput\r\n className=\"map-layer-source-input\"\r\n displayStyle=\"inline\"\r\n type=\"password\" placeholder={serverRequireCredentials ? passwordRequiredLabel : passwordLabel}\r\n status={!password && serverRequireCredentials ? InputStatus.Warning : undefined}\r\n onChange={onPasswordChange}\r\n onKeyPress={handleOnKeyDown}\r\n size=\"small\" />\r\n </>\r\n }\r\n\r\n {/* Store settings options, not shown when editing a layer */}\r\n {isSettingsStorageAvailable && <div title={settingsStorageDisabled ? noSaveSettingsWarning : \"\"}>\r\n <Radio disabled={settingsStorageDisabled}\r\n name=\"settingsStorage\" value=\"iTwin\"\r\n label={iTwinSettingsLabel} checked={settingsStorage === \"iTwin\"}\r\n onChange={onRadioChange} />\r\n <Radio disabled={settingsStorageDisabled}\r\n name=\"settingsStorage\" value=\"Model\"\r\n label={modelSettingsLabel} checked={settingsStorage === \"Model\"}\r\n onChange={onRadioChange} />\r\n </div>}\r\n </div>\r\n </div>\r\n\r\n {/* Warning message */}\r\n <div className=\"map-layer-source-warnMessage\">\r\n {warningMessage ?\r\n <>\r\n <Icon className=\"map-layer-source-warnMessage-icon\" iconSpec=\"icon-status-warning\" />\r\n <span className=\"map-layer-source-warnMessage-label\">{warningMessage}</span >\r\n </>\r\n :\r\n // Place holder to avoid dialog resize\r\n <span className=\"map-layer-source-placeholder\">&nbsp;</span>\r\n }\r\n </div>\r\n\r\n {/* Progress bar */}\r\n {layerAttachPending &&\r\n <div className=\"map-layer-source-progressBar\">\r\n <ProgressLinear indeterminate />\r\n </div>\r\n }\r\n </Dialog>\r\n </div >\r\n );\r\n}\r\n"]}
@@ -63,6 +63,7 @@
63
63
  "MapLayerEditError": "Failed to edit '{{layerName}}'",
64
64
  "MapLayerLayerSettingsConversionError": "Conversion to layer settings failed",
65
65
  "MapLayerLayerSourceCreationFailed": "Map Layer Source creation failed",
66
+ "MapLayerPreferencesStoreFailed": "Failed to save map layer definition in preferences",
66
67
  "MapLayerValidationFailed": "Map layer validation failed for URL: {{sourceUrl}}"
67
68
  },
68
69
  "Widget": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/map-layers",
3
- "version": "3.0.0-dev.174",
3
+ "version": "3.0.0-dev.175",
4
4
  "description": "Extension that adds a Map Layers Widget",
5
5
  "main": "lib/cjs/map-layers.js",
6
6
  "module": "lib/esm/map-layers.js",
@@ -21,23 +21,23 @@
21
21
  "url": "http://www.bentley.com"
22
22
  },
23
23
  "devDependencies": {
24
- "@bentley/itwin-client": "3.0.0-dev.174",
25
- "@itwin/appui-abstract": "3.0.0-dev.174",
26
- "@itwin/appui-layout-react": "3.0.0-dev.174",
27
- "@itwin/appui-react": "3.0.0-dev.174",
28
- "@itwin/build-tools": "3.0.0-dev.174",
29
- "@itwin/components-react": "3.0.0-dev.174",
30
- "@itwin/core-bentley": "3.0.0-dev.174",
31
- "@itwin/core-common": "3.0.0-dev.174",
32
- "@itwin/core-frontend": "3.0.0-dev.174",
33
- "@itwin/core-geometry": "3.0.0-dev.174",
34
- "@itwin/core-quantity": "3.0.0-dev.174",
35
- "@itwin/core-react": "3.0.0-dev.174",
36
- "@itwin/eslint-plugin": "3.0.0-dev.174",
37
- "@itwin/imodel-components-react": "3.0.0-dev.174",
24
+ "@bentley/itwin-client": "3.0.0-dev.175",
25
+ "@itwin/appui-abstract": "3.0.0-dev.175",
26
+ "@itwin/appui-layout-react": "3.0.0-dev.175",
27
+ "@itwin/appui-react": "3.0.0-dev.175",
28
+ "@itwin/build-tools": "3.0.0-dev.175",
29
+ "@itwin/components-react": "3.0.0-dev.175",
30
+ "@itwin/core-bentley": "3.0.0-dev.175",
31
+ "@itwin/core-common": "3.0.0-dev.175",
32
+ "@itwin/core-frontend": "3.0.0-dev.175",
33
+ "@itwin/core-geometry": "3.0.0-dev.175",
34
+ "@itwin/core-quantity": "3.0.0-dev.175",
35
+ "@itwin/core-react": "3.0.0-dev.175",
36
+ "@itwin/eslint-plugin": "3.0.0-dev.175",
37
+ "@itwin/imodel-components-react": "3.0.0-dev.175",
38
38
  "@itwin/itwinui-css": "^0.37.0",
39
39
  "@itwin/itwinui-react": "^1.27.0",
40
- "@itwin/presentation-common": "3.0.0-dev.174",
40
+ "@itwin/presentation-common": "3.0.0-dev.175",
41
41
  "@testing-library/react": "^12.0.0",
42
42
  "@testing-library/react-hooks": "^7.0.2",
43
43
  "@types/chai": "^4.1.4",
@@ -74,18 +74,18 @@
74
74
  "react-resize-detector": "^6.7.6"
75
75
  },
76
76
  "peerDependencies": {
77
- "@bentley/itwin-client": "3.0.0-dev.174",
78
- "@itwin/core-bentley": "3.0.0-dev.174",
79
- "@itwin/core-geometry": "3.0.0-dev.174",
80
- "@itwin/core-common": "3.0.0-dev.174",
81
- "@itwin/core-frontend": "3.0.0-dev.174",
82
- "@itwin/core-quantity": "3.0.0-dev.174",
83
- "@itwin/appui-abstract": "3.0.0-dev.174",
84
- "@itwin/components-react": "3.0.0-dev.174",
85
- "@itwin/core-react": "3.0.0-dev.174",
86
- "@itwin/appui-react": "3.0.0-dev.174",
87
- "@itwin/imodel-components-react": "3.0.0-dev.174",
88
- "@itwin/appui-layout-react": "3.0.0-dev.174",
77
+ "@bentley/itwin-client": "3.0.0-dev.175",
78
+ "@itwin/core-bentley": "3.0.0-dev.175",
79
+ "@itwin/core-geometry": "3.0.0-dev.175",
80
+ "@itwin/core-common": "3.0.0-dev.175",
81
+ "@itwin/core-frontend": "3.0.0-dev.175",
82
+ "@itwin/core-quantity": "3.0.0-dev.175",
83
+ "@itwin/appui-abstract": "3.0.0-dev.175",
84
+ "@itwin/components-react": "3.0.0-dev.175",
85
+ "@itwin/core-react": "3.0.0-dev.175",
86
+ "@itwin/appui-react": "3.0.0-dev.175",
87
+ "@itwin/imodel-components-react": "3.0.0-dev.175",
88
+ "@itwin/appui-layout-react": "3.0.0-dev.175",
89
89
  "react": "^17.0.0",
90
90
  "react-dom": "^17.0.0"
91
91
  },