@itwin/map-layers 5.2.1 → 5.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/lib/cjs/mapLayers.d.ts +2 -1
  3. package/lib/cjs/mapLayers.d.ts.map +1 -1
  4. package/lib/cjs/mapLayers.js +3 -0
  5. package/lib/cjs/mapLayers.js.map +1 -1
  6. package/lib/cjs/public/locales/en/mapLayers.json +23 -5
  7. package/lib/cjs/ui/FeatureInfoUiItemsProvider.js +1 -1
  8. package/lib/cjs/ui/FeatureInfoUiItemsProvider.js.map +1 -1
  9. package/lib/cjs/ui/Interfaces.d.ts +4 -2
  10. package/lib/cjs/ui/Interfaces.d.ts.map +1 -1
  11. package/lib/cjs/ui/Interfaces.js.map +1 -1
  12. package/lib/cjs/ui/widget/BasemapPanel.d.ts.map +1 -1
  13. package/lib/cjs/ui/widget/BasemapPanel.js +58 -38
  14. package/lib/cjs/ui/widget/BasemapPanel.js.map +1 -1
  15. package/lib/cjs/ui/widget/FeatureInfoWidget.d.ts +1 -0
  16. package/lib/cjs/ui/widget/FeatureInfoWidget.d.ts.map +1 -1
  17. package/lib/cjs/ui/widget/FeatureInfoWidget.js +17 -1
  18. package/lib/cjs/ui/widget/FeatureInfoWidget.js.map +1 -1
  19. package/lib/cjs/ui/widget/MapLayerDroppable.d.ts.map +1 -1
  20. package/lib/cjs/ui/widget/MapLayerDroppable.js +7 -4
  21. package/lib/cjs/ui/widget/MapLayerDroppable.js.map +1 -1
  22. package/lib/cjs/ui/widget/MapLayerManager.d.ts +4 -1
  23. package/lib/cjs/ui/widget/MapLayerManager.d.ts.map +1 -1
  24. package/lib/cjs/ui/widget/MapLayerManager.js +10 -6
  25. package/lib/cjs/ui/widget/MapLayerManager.js.map +1 -1
  26. package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.d.ts.map +1 -1
  27. package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.js +3 -2
  28. package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.js.map +1 -1
  29. package/lib/cjs/ui/widget/MapSelectFeaturesDialog.d.ts.map +1 -1
  30. package/lib/cjs/ui/widget/MapSelectFeaturesDialog.js +17 -18
  31. package/lib/cjs/ui/widget/MapSelectFeaturesDialog.js.map +1 -1
  32. package/lib/cjs/ui/widget/MapUrlDialog.d.ts.map +1 -1
  33. package/lib/cjs/ui/widget/MapUrlDialog.js +37 -17
  34. package/lib/cjs/ui/widget/MapUrlDialog.js.map +1 -1
  35. package/lib/cjs/ui/widget/MapUrlDialog.scss +39 -10
  36. package/lib/cjs/ui/widget/SelectMapFormat.d.ts.map +1 -1
  37. package/lib/cjs/ui/widget/SelectMapFormat.js +2 -2
  38. package/lib/cjs/ui/widget/SelectMapFormat.js.map +1 -1
  39. package/lib/cjs/ui/widget/SubLayersTree.d.ts.map +1 -1
  40. package/lib/cjs/ui/widget/SubLayersTree.js +8 -7
  41. package/lib/cjs/ui/widget/SubLayersTree.js.map +1 -1
  42. package/lib/cjs/ui/widget/SubLayersTree.scss +27 -31
  43. package/lib/esm/mapLayers.d.ts +2 -1
  44. package/lib/esm/mapLayers.d.ts.map +1 -1
  45. package/lib/esm/mapLayers.js +3 -0
  46. package/lib/esm/mapLayers.js.map +1 -1
  47. package/lib/esm/public/locales/en/mapLayers.json +23 -5
  48. package/lib/esm/ui/FeatureInfoUiItemsProvider.js +1 -1
  49. package/lib/esm/ui/FeatureInfoUiItemsProvider.js.map +1 -1
  50. package/lib/esm/ui/Interfaces.d.ts +4 -2
  51. package/lib/esm/ui/Interfaces.d.ts.map +1 -1
  52. package/lib/esm/ui/Interfaces.js.map +1 -1
  53. package/lib/esm/ui/widget/BasemapPanel.d.ts.map +1 -1
  54. package/lib/esm/ui/widget/BasemapPanel.js +59 -39
  55. package/lib/esm/ui/widget/BasemapPanel.js.map +1 -1
  56. package/lib/esm/ui/widget/FeatureInfoWidget.d.ts +1 -0
  57. package/lib/esm/ui/widget/FeatureInfoWidget.d.ts.map +1 -1
  58. package/lib/esm/ui/widget/FeatureInfoWidget.js +15 -0
  59. package/lib/esm/ui/widget/FeatureInfoWidget.js.map +1 -1
  60. package/lib/esm/ui/widget/MapLayerDroppable.d.ts.map +1 -1
  61. package/lib/esm/ui/widget/MapLayerDroppable.js +7 -4
  62. package/lib/esm/ui/widget/MapLayerDroppable.js.map +1 -1
  63. package/lib/esm/ui/widget/MapLayerManager.d.ts +4 -1
  64. package/lib/esm/ui/widget/MapLayerManager.d.ts.map +1 -1
  65. package/lib/esm/ui/widget/MapLayerManager.js +10 -6
  66. package/lib/esm/ui/widget/MapLayerManager.js.map +1 -1
  67. package/lib/esm/ui/widget/MapLayerSettingsPopupButton.d.ts.map +1 -1
  68. package/lib/esm/ui/widget/MapLayerSettingsPopupButton.js +5 -4
  69. package/lib/esm/ui/widget/MapLayerSettingsPopupButton.js.map +1 -1
  70. package/lib/esm/ui/widget/MapSelectFeaturesDialog.d.ts.map +1 -1
  71. package/lib/esm/ui/widget/MapSelectFeaturesDialog.js +18 -19
  72. package/lib/esm/ui/widget/MapSelectFeaturesDialog.js.map +1 -1
  73. package/lib/esm/ui/widget/MapUrlDialog.d.ts.map +1 -1
  74. package/lib/esm/ui/widget/MapUrlDialog.js +40 -20
  75. package/lib/esm/ui/widget/MapUrlDialog.js.map +1 -1
  76. package/lib/esm/ui/widget/MapUrlDialog.scss +39 -10
  77. package/lib/esm/ui/widget/SelectMapFormat.d.ts.map +1 -1
  78. package/lib/esm/ui/widget/SelectMapFormat.js +3 -3
  79. package/lib/esm/ui/widget/SelectMapFormat.js.map +1 -1
  80. package/lib/esm/ui/widget/SubLayersTree.d.ts.map +1 -1
  81. package/lib/esm/ui/widget/SubLayersTree.js +10 -9
  82. package/lib/esm/ui/widget/SubLayersTree.js.map +1 -1
  83. package/lib/esm/ui/widget/SubLayersTree.scss +27 -31
  84. package/lib/public/locales/en/mapLayers.json +23 -5
  85. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MapSelectFeaturesDialog.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapSelectFeaturesDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n// cSpell:ignore Modeless WMTS\n\nimport { Dialog, Icon } from \"@itwin/core-react\";\nimport * as React from \"react\";\nimport \"./MapSelectFeaturesDialog.scss\";\n\nimport { DialogButtonType } from \"@itwin/appui-abstract\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { MapLayerSource } from \"@itwin/core-frontend\";\nimport { MapSubLayerProps } from \"@itwin/core-common\";\nimport { SubLayersTree } from \"./SubLayersTree\";\n\nexport interface MapSelectFeaturesProps {\n source: MapLayerSource;\n subLayers: MapSubLayerProps[];\n handleOk: (subLayers: MapSubLayerProps[]) => void;\n handleCancel: () => void;\n}\nconst minHeight = 250;\nconst maxSubLayers = 30;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function MapSelectFeaturesDialog(props: MapSelectFeaturesProps) {\n const [subLayers, setSubLayers] = React.useState(props.subLayers);\n const [NoLayersSelectedMsg] = React.useState(()=>MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.NoLayersSelected\"));\n const [dialogTitle] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.SelectLayersToCreate\"));\n\n const dialogContainer = React.useRef<HTMLDivElement>(null);\n\n const handleOk = React.useCallback(() => {\n props.handleOk(subLayers);\n }, [props, subLayers]);\n\n const handleCancel = React.useCallback(() => {\n props.handleCancel();\n }, [props]);\n\n const hasVisibleLayers = () => subLayers.some((entry)=>entry.visible);\n const hasTooManyVisibleLayers = () => subLayers.filter((entry)=>entry.visible).length > maxSubLayers;\n const readyToSave = () => hasVisibleLayers();\n const buttonCluster = [\n { type: DialogButtonType.OK, onClick: handleOk, disabled: !readyToSave() },\n { type: DialogButtonType.Cancel, onClick: handleCancel },\n ];\n\n function renderWarningMessage(): React.ReactNode {\n let warningMessage: string | undefined;\n\n // Get the proper warning message\n if (!hasVisibleLayers()) {\n warningMessage = NoLayersSelectedMsg;\n } else if (hasTooManyVisibleLayers()) {\n warningMessage = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.TooManyLayersSelected\", { layerCount: subLayers.filter((entry)=>entry.visible).length});\n }\n\n if (warningMessage !== undefined) {\n return (\n <div className=\"map-layer-source-warnMessage\">\n <Icon className=\"map-layer-source-warnMessage-icon\" iconSpec=\"icon-status-warning\" />\n <span className=\"map-layer-source-warnMessage-label\">{warningMessage}</span >\n </div>);\n }\n return <></>;\n }\n\n return (\n <div ref={dialogContainer}>\n <Dialog\n className=\"map-layer-select-features-dialog\"\n title={dialogTitle}\n opened={true}\n resizable={true}\n movable={true}\n modal={true}\n buttonCluster={buttonCluster}\n onClose={handleCancel}\n onEscape={handleCancel}\n minHeight={minHeight}\n maxWidth={600}\n titleStyle={{ paddingLeft: \"10px\" }}\n footerStyle={{ paddingBottom: \"10px\", paddingRight: \"10px\" }}\n trapFocus={false}\n >\n {/* 'onSubLayerStateChange' is used to trigger hook state change only, no need to update subLayer objects */}\n <SubLayersTree expandMode=\"full\" checkboxStyle=\"standard\" subLayers={subLayers} onSubLayerStateChange={() => setSubLayers([...subLayers])}/>\n\n {/* Warning message */}\n {renderWarningMessage()}\n </Dialog>\n </div >\n );\n}\n"]}
1
+ {"version":3,"file":"MapSelectFeaturesDialog.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapSelectFeaturesDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n// cSpell:ignore Modeless WMTS\n\nimport { Dialog } from \"@itwin/core-react\";\nimport * as React from \"react\";\nimport \"./MapSelectFeaturesDialog.scss\";\n\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { MapLayerSource } from \"@itwin/core-frontend\";\nimport { MapSubLayerProps } from \"@itwin/core-common\";\nimport { SubLayersTree } from \"./SubLayersTree\";\nimport { Button, Icon } from \"@itwin/itwinui-react\";\nimport { SvgStatusWarning } from \"@itwin/itwinui-icons-color-react\";\n\nexport interface MapSelectFeaturesProps {\n source: MapLayerSource;\n subLayers: MapSubLayerProps[];\n handleOk: (subLayers: MapSubLayerProps[]) => void;\n handleCancel: () => void;\n}\nconst minHeight = 250;\nconst maxSubLayers = 30;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function MapSelectFeaturesDialog(props: MapSelectFeaturesProps) {\n const [subLayers, setSubLayers] = React.useState(props.subLayers);\n\n const dialogContainer = React.useRef<HTMLDivElement>(null);\n\n const handleOk = React.useCallback(() => {\n props.handleOk(subLayers);\n }, [props, subLayers]);\n\n const handleCancel = React.useCallback(() => {\n props.handleCancel();\n }, [props]);\n\n const hasVisibleLayers = () => subLayers.some((entry)=>entry.visible);\n const hasTooManyVisibleLayers = () => subLayers.filter((entry)=>entry.visible).length > maxSubLayers;\n const readyToSave = () => hasVisibleLayers();\n\n function renderWarningMessage(): React.ReactNode {\n let warningMessage: string | undefined;\n\n // Get the proper warning message\n if (!hasVisibleLayers()) {\n warningMessage = MapLayersUI.translate(\"CustomAttach.NoLayersSelected\");\n } else if (hasTooManyVisibleLayers()) {\n warningMessage = MapLayersUI.translate(\"CustomAttach.TooManyLayersSelected\", { layerCount: subLayers.filter((entry)=>entry.visible).length});\n }\n\n return (\n <div className=\"map-layer-source-warnMessage\">\n {warningMessage !== undefined && <>\n <Icon size=\"small\"><SvgStatusWarning></SvgStatusWarning></Icon>\n <span className=\"map-layer-source-warnMessage-label\">{warningMessage}</span >\n </>}\n </div>);\n\n }\n\n function getFooter() {\n return (\n <div className=\"map-layer-features-footer\">\n <div className=\"map-layer-features-footer-warnMessage\">\n {renderWarningMessage()}\n </div>\n\n <div className=\"map-layer-features-footer-buttons\">\n <Button\n className=\"map-layer-features-footer-button\"\n styleType='high-visibility'\n onClick={handleOk}\n disabled={!readyToSave()}\n >\n {MapLayersUI.translate(\"Dialog.Add\")}\n </Button>\n <Button\n className=\"map-layer-features-footer-button\"\n styleType='default'\n onClick={handleCancel}\n >\n {MapLayersUI.translate(\"Dialog.Cancel\")}\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div ref={dialogContainer}>\n <Dialog\n className=\"map-layer-select-features-dialog\"\n title={MapLayersUI.translate(\"CustomAttach.SelectLayersToCreate\")}\n opened={true}\n resizable={true}\n movable={true}\n modal={true}\n footer={getFooter()}\n onClose={handleCancel}\n onEscape={handleCancel}\n minHeight={minHeight}\n maxWidth={600}\n titleStyle={{ paddingLeft: \"10px\" }}\n footerStyle={{ paddingBottom: \"10px\", paddingRight: \"10px\" }}\n trapFocus={false}\n >\n {/* 'onSubLayerStateChange' is used to trigger hook state change only, no need to update subLayer objects */}\n <SubLayersTree expandMode=\"full\" checkboxStyle=\"standard\" subLayers={subLayers} onSubLayerStateChange={() => setSubLayers([...subLayers])}/>\n\n </Dialog>\n </div >\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MapUrlDialog.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/MapUrlDialog.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAC4B,cAAc,EACzB,wBAAwB,EAA+C,cAAc,EAC5G,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,qBAAqB,CAAC;AAE7B,eAAO,MAAM,SAAS;;;;;;CAMrB,CAAC;AAEF,oBAAY,iBAAiB,GAAG,QAAQ,GAAC,UAAU,CAAC;AACpD,UAAU,iBAAiB;IACzB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,IAAI,CAAC;IAC3C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,eAAe,CAAC;IAGlC,yBAAyB,CAAC,EAAE,kBAAkB,CAAC;IAE/C,oBAAoB,CAAC,EAAE,cAAc,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,wBAAwB,CAAC;CACtC;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,eA+fpD"}
1
+ {"version":3,"file":"MapUrlDialog.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/MapUrlDialog.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAC4B,cAAc,EACzB,wBAAwB,EAA+C,cAAc,EAC5G,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,qBAAqB,CAAC;AAG7B,eAAO,MAAM,SAAS;;;;;;CAMrB,CAAC;AAEF,oBAAY,iBAAiB,GAAG,QAAQ,GAAC,UAAU,CAAC;AACpD,UAAU,iBAAiB;IACzB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,IAAI,CAAC;IAC3C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,eAAe,CAAC;IAGlC,yBAAyB,CAAC,EAAE,kBAAkB,CAAC;IAE/C,oBAAoB,CAAC,EAAE,cAAc,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,wBAAwB,CAAC;CACtC;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,eAoiBpD"}
@@ -16,6 +16,7 @@ const mapLayers_1 = require("../../mapLayers");
16
16
  const core_bentley_1 = require("@itwin/core-bentley");
17
17
  const SelectMapFormat_1 = require("./SelectMapFormat");
18
18
  require("./MapUrlDialog.scss");
19
+ const itwinui_icons_color_react_1 = require("@itwin/itwinui-icons-color-react");
19
20
  exports.MAP_TYPES = {
20
21
  wms: "WMS",
21
22
  arcGis: "ArcGIS",
@@ -88,6 +89,7 @@ function MapUrlDialog(props) {
88
89
  const [onOauthProcessEnd] = React.useState(new core_bentley_1.BeEvent());
89
90
  const [accessClient, setAccessClient] = React.useState();
90
91
  const [isAccessClientInitialized, setAccessClientInitialized] = React.useState(false);
92
+ const [shouldAutoAttachSource, setShouldAutoAttachSource] = React.useState(true);
91
93
  const [mapType, setMapType] = React.useState(getFormatFromProps() ?? "ArcGIS");
92
94
  // 'isMounted' is used to prevent any async operation once the hook has been
93
95
  // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.
@@ -129,8 +131,9 @@ function MapUrlDialog(props) {
129
131
  // return true if authorization is needed
130
132
  const updateAuthState = React.useCallback(async (source, sourceValidation) => {
131
133
  const sourceRequireAuth = (sourceValidation.status === core_frontend_1.MapLayerSourceStatus.RequireAuth);
132
- const invalidCredentials = (sourceValidation.status === core_frontend_1.MapLayerSourceStatus.InvalidCredentials);
134
+ let invalidCredentials = (sourceValidation.status === core_frontend_1.MapLayerSourceStatus.InvalidCredentials);
133
135
  if (sourceRequireAuth) {
136
+ let hasTokenEndPoint = false;
134
137
  const settings = source.toLayerSettings();
135
138
  if (accessClient !== undefined && accessClient.getTokenServiceEndPoint !== undefined && settings !== undefined) {
136
139
  try {
@@ -138,11 +141,20 @@ function MapUrlDialog(props) {
138
141
  if (tokenEndpoint !== undefined) {
139
142
  const loginUrl = tokenEndpoint.getLoginUrl();
140
143
  setExternalLoginUrl(loginUrl);
144
+ hasTokenEndPoint = true;
141
145
  }
142
146
  }
143
147
  catch (_error) {
144
148
  }
145
149
  }
150
+ else if (userName.length > 0 || password.length > 0) {
151
+ // This is a patch until @itwin\core-frontend return the expected 'InvalidCredentials' status.
152
+ invalidCredentials = true;
153
+ }
154
+ if (!hasTokenEndPoint && (userName.length > 0 || password.length > 0)) {
155
+ // This is a patch until @itwin\core-frontend return the expected 'InvalidCredentials' status.
156
+ invalidCredentials = true;
157
+ }
146
158
  }
147
159
  setServerRequireCredentials(sourceRequireAuth || invalidCredentials);
148
160
  if (invalidCredentials) {
@@ -152,7 +164,7 @@ function MapUrlDialog(props) {
152
164
  setInvalidCredentialsProvided(false); // flag reset
153
165
  }
154
166
  return sourceRequireAuth || invalidCredentials;
155
- }, [accessClient, invalidCredentialsProvided]);
167
+ }, [accessClient, invalidCredentialsProvided, password.length, userName.length]);
156
168
  const onNameChange = React.useCallback((event) => {
157
169
  setMapName(event.target.value);
158
170
  }, [setMapName]);
@@ -252,8 +264,7 @@ function MapUrlDialog(props) {
252
264
  const handleOAuthProcessEnd = (success, _state) => {
253
265
  onOauthProcessEnd.raiseEvent(success, _state);
254
266
  };
255
- // Currently only arcgis support AccessClient
256
- const ac = core_frontend_1.IModelApp.mapLayerFormatRegistry.getAccessClient(exports.MAP_TYPES.arcGis);
267
+ const ac = core_frontend_1.IModelApp.mapLayerFormatRegistry.getAccessClient(mapType);
257
268
  if (ac?.onOAuthProcessEnd) {
258
269
  setAccessClient(ac); // cache it, so we dont need to make another lookup;
259
270
  ac.onOAuthProcessEnd.addListener(handleOAuthProcessEnd);
@@ -282,7 +293,10 @@ function MapUrlDialog(props) {
282
293
  React.useEffect(() => {
283
294
  // Attach source asynchronously.
284
295
  void (async () => {
285
- if (isAccessClientInitialized && props.layerRequiringCredentials?.url !== undefined && props.layerRequiringCredentials?.name !== undefined) {
296
+ if (isAccessClientInitialized
297
+ && shouldAutoAttachSource
298
+ && props.layerRequiringCredentials?.url !== undefined
299
+ && props.layerRequiringCredentials?.name !== undefined) {
286
300
  try {
287
301
  const source = core_frontend_1.MapLayerSource.fromJSON({
288
302
  url: props.layerRequiringCredentials.url,
@@ -291,6 +305,7 @@ function MapUrlDialog(props) {
291
305
  });
292
306
  if (source !== undefined) {
293
307
  setLayerAttachPending(true);
308
+ setShouldAutoAttachSource(false);
294
309
  const validation = await source.validateSource(true);
295
310
  if (isMounted.current) {
296
311
  setLayerAttachPending(false);
@@ -301,24 +316,21 @@ function MapUrlDialog(props) {
301
316
  catch (_error) { }
302
317
  }
303
318
  })();
304
- }, [isAccessClientInitialized,
305
- props.layerRequiringCredentials?.formatId,
306
- props.layerRequiringCredentials?.name,
307
- props.layerRequiringCredentials?.url,
308
- updateAuthState]);
319
+ }, [isAccessClientInitialized, props.layerRequiringCredentials?.formatId, props.layerRequiringCredentials?.name, props.layerRequiringCredentials?.url, shouldAutoAttachSource, updateAuthState]);
309
320
  const dialogContainer = React.useRef(null);
310
321
  const readyToSave = React.useCallback(() => {
311
322
  const credentialsSet = !!userName && !!password;
312
- return (!!mapUrl && !!mapName)
323
+ const ready = (!!mapUrl && !!mapName)
313
324
  && !layerAttachPending
314
325
  && (!serverRequireCredentials || credentialsSet)
315
326
  && !invalidCredentialsProvided
316
327
  && (externalLoginUrl === undefined || (externalLoginUrl !== undefined && oauthProcessSucceeded));
328
+ return ready;
317
329
  }, [userName, password, mapUrl, mapName, serverRequireCredentials, layerAttachPending, invalidCredentialsProvided, externalLoginUrl, oauthProcessSucceeded]);
318
- const buttonCluster = React.useMemo(() => [
319
- { type: appui_abstract_1.DialogButtonType.OK, onClick: handleOk, disabled: !readyToSave() },
320
- { type: appui_abstract_1.DialogButtonType.Cancel, onClick: handleCancel },
321
- ], [readyToSave, handleCancel, handleOk]);
330
+ // const buttonCluster = React.useMemo(() => [
331
+ // { type: DialogButtonType.OK, onClick: handleOk, disabled: !readyToSave() },
332
+ // { type: DialogButtonType.Cancel, onClick: handleCancel },
333
+ // ], [readyToSave, handleCancel, handleOk]);
322
334
  const handleOnKeyDown = React.useCallback((event) => {
323
335
  if (event.key === appui_abstract_1.SpecialKey.Enter) {
324
336
  if (readyToSave())
@@ -388,7 +400,8 @@ function MapUrlDialog(props) {
388
400
  }
389
401
  if (warningMessage !== undefined) {
390
402
  return (React.createElement("div", { className: "map-layer-source-warnMessage" },
391
- React.createElement(core_react_1.Icon, { className: "map-layer-source-warnMessage-icon", iconSpec: "icon-status-warning" }),
403
+ React.createElement(itwinui_react_1.Icon, { size: "small" },
404
+ React.createElement(itwinui_icons_color_react_1.SvgStatusWarning, null)),
392
405
  React.createElement("span", { className: "map-layer-source-warnMessage-label" }, warningMessage),
393
406
  extraNode));
394
407
  }
@@ -400,8 +413,15 @@ function MapUrlDialog(props) {
400
413
  // Use a hook to display the popup.
401
414
  // The display of the popup is controlled by the 'showOauthPopup' state variable.
402
415
  (0, core_react_1.useCrossOriginPopup)(showOauthPopup, externalLoginUrl, externalLoginTitle, 450, 450, handleOAuthPopupClose);
416
+ function getFooter() {
417
+ return (React.createElement("div", { className: "map-layer-source-footer" },
418
+ React.createElement("div", { className: "map-layer-source-footer-status" }),
419
+ React.createElement("div", null,
420
+ React.createElement(itwinui_react_1.Button, { className: "map-layer-features-footer-button", styleType: 'high-visibility', onClick: handleOk, disabled: !readyToSave() }, props?.mapLayerSourceToEdit ? mapLayers_1.MapLayersUI.translate("Dialog.Edit") : mapLayers_1.MapLayersUI.translate("Dialog.Add")),
421
+ React.createElement(itwinui_react_1.Button, { className: "map-layer-source-footer-button", styleType: 'default', onClick: handleCancel }, mapLayers_1.MapLayersUI.translate("Dialog.Cancel")))));
422
+ }
403
423
  return (React.createElement("div", { ref: dialogContainer },
404
- React.createElement(core_react_1.Dialog, { className: "map-layer-url-dialog", title: dialogTitle, opened: true, resizable: true, movable: true, modal: true, buttonCluster: buttonCluster, onClose: handleCancel, onEscape: handleCancel, minHeight: 120, maxWidth: 600, titleStyle: { paddingLeft: "10px" }, footerStyle: { paddingBottom: "10px", paddingRight: "10px" }, trapFocus: false },
424
+ React.createElement(core_react_1.Dialog, { className: "map-layer-url-dialog", title: dialogTitle, opened: true, resizable: true, movable: true, modal: true, footer: getFooter(), onClose: handleCancel, onEscape: handleCancel, minHeight: 120, maxWidth: 600, titleStyle: { paddingLeft: "10px" }, footerStyle: { paddingBottom: "10px", paddingRight: "10px" }, trapFocus: false },
405
425
  React.createElement("div", { className: "map-layer-url-dialog-content" },
406
426
  React.createElement("div", { className: "map-layer-source-url" },
407
427
  React.createElement("span", { className: "map-layer-source-label" }, typeLabel),
@@ -1 +1 @@
1
- {"version":3,"file":"MapUrlDialog.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapUrlDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n// cSpell:ignore Modeless WMTS\n\nimport { DialogButtonType, SpecialKey } from \"@itwin/appui-abstract\";\nimport { Button, Input, LabeledInput, ProgressLinear, Radio } from \"@itwin/itwinui-react\";\nimport { ImageMapLayerProps } from \"@itwin/core-common\";\nimport {\n IModelApp, MapLayerAccessClient, MapLayerSource,\n MapLayerSourceStatus, MapLayerSourceValidation, NotifyMessageDetails, OutputMessagePriority, ScreenViewport,\n} from \"@itwin/core-frontend\";\nimport { Dialog, Icon, useCrossOriginPopup } from \"@itwin/core-react\";\nimport * as React from \"react\";\nimport { MapLayerPreferences } from \"../../MapLayerPreferences\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { MapTypesOptions } from \"../Interfaces\";\nimport { BeEvent, Guid } from \"@itwin/core-bentley\";\nimport { SelectMapFormat } from \"./SelectMapFormat\";\nimport \"./MapUrlDialog.scss\";\n\nexport const MAP_TYPES = {\n wms: \"WMS\",\n arcGis: \"ArcGIS\",\n wmts: \"WMTS\",\n tileUrl: \"TileURL\",\n arcGisFeature: \"ArcGISFeature\",\n};\n\nexport type LayerCreationMode = \"single\"|\"multiple\";\ninterface MapUrlDialogProps {\n activeViewport?: ScreenViewport;\n isOverlay: boolean;\n onOkResult: (result?: SourceState) => void;\n onCancelResult?: () => void;\n mapTypesOptions?: MapTypesOptions;\n\n // An optional layer definition can be provide to enable the edit mode\n layerRequiringCredentials?: ImageMapLayerProps;\n\n mapLayerSourceToEdit?: MapLayerSource;\n}\n\nexport interface SourceState {\n source: MapLayerSource;\n validation: MapLayerSourceValidation;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function MapUrlDialog(props: MapUrlDialogProps) {\n const { onOkResult, mapTypesOptions } = props;\n\n const getMapUrlFromProps = React.useCallback(() => {\n if (props.mapLayerSourceToEdit) {\n return props.mapLayerSourceToEdit.url;\n } else if (props.layerRequiringCredentials?.url) {\n return props.layerRequiringCredentials.url;\n }\n return \"\";\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\n\n const getMapNameFromProps = React.useCallback(() => {\n if (props.mapLayerSourceToEdit) {\n return props.mapLayerSourceToEdit.name;\n } else if (props.layerRequiringCredentials?.name) {\n return props.layerRequiringCredentials.name;\n }\n return \"\";\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\n\n const getFormatFromProps = React.useCallback(() => {\n if (props.mapLayerSourceToEdit) {\n return props.mapLayerSourceToEdit.formatId;\n } else if (props.layerRequiringCredentials?.formatId) {\n return props.layerRequiringCredentials.formatId;\n }\n return undefined;\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\n\n const [dialogTitle] = React.useState(MapLayersUI.localization.getLocalizedString(props.layerRequiringCredentials || props.mapLayerSourceToEdit ? \"mapLayers:CustomAttach.EditCustomLayer\" : \"mapLayers:CustomAttach.AttachCustomLayer\"));\n const [typeLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.Type\"));\n const [nameLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.Name\"));\n const [nameInputPlaceHolder] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.NameInputPlaceHolder\"));\n const [urlLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.URL\"));\n const [urlInputPlaceHolder] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.UrlInputPlaceHolder\"));\n const [iTwinSettingsLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.StoreOnITwinSettings\"));\n const [modelSettingsLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.StoreOnModelSettings\"));\n const [missingCredentialsLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.MissingCredentials\"));\n const [invalidCredentialsLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.InvalidCredentials\"));\n const [externalLoginTitle] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLogin\"));\n const [externalLoginFailedMsg] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginFailed\"));\n const [externalLoginSucceededMsg] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginSucceeded\"));\n const [externalLoginWaitingMsg] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginWaiting\"));\n const [externalLoginTryAgainLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginTryAgain\"));\n const [serverRequireCredentials, setServerRequireCredentials] = React.useState(false);\n const [invalidCredentialsProvided, setInvalidCredentialsProvided] = React.useState(false);\n const [layerAttachPending, setLayerAttachPending] = React.useState(false);\n const [layerAuthPending, setLayerAuthPending] = React.useState(false);\n const [mapUrl, setMapUrl] = React.useState(getMapUrlFromProps());\n const [mapName, setMapName] = React.useState(getMapNameFromProps());\n const [userName, setUserName] = React.useState(\"\");\n const [password, setPassword] = React.useState(\"\");\n const [noSaveSettingsWarning] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.NoSaveSettingsWarning\"));\n const [passwordLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Password\"));\n const [passwordRequiredLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.PasswordRequired\"));\n const [userNameLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Username\"));\n const [userNameRequiredLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.UsernameRequired\"));\n const [settingsStorage, setSettingsStorageRadio] = React.useState(\"iTwin\");\n const [oauthProcessSucceeded, setOAuthProcessSucceeded] = React.useState<undefined | boolean>(undefined);\n const [showOauthPopup, setShowOauthPopup] = React.useState(false);\n const [externalLoginUrl, setExternalLoginUrl] = React.useState<string | undefined>();\n const [onOauthProcessEnd] = React.useState(new BeEvent());\n const [accessClient, setAccessClient] = React.useState<MapLayerAccessClient | undefined>();\n const [isAccessClientInitialized, setAccessClientInitialized] = React.useState(false);\n\n const [mapType, setMapType] = React.useState(getFormatFromProps() ?? \"ArcGIS\");\n\n // 'isMounted' is used to prevent any async operation once the hook has been\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\n const isMounted = React.useRef(false);\n React.useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n const [isSettingsStorageAvailable] = React.useState(MapLayersUI.iTwinConfig && props?.activeViewport?.iModel?.iTwinId);\n const [hasImodelContext] = React.useState(\n props?.activeViewport?.iModel?.iTwinId !== undefined\n && props.activeViewport.iModel.iTwinId !== Guid.empty\n && props?.activeViewport?.iModel?.iModelId !== undefined\n && props?.activeViewport.iModel.iModelId !== Guid.empty);\n\n const handleCancel = React.useCallback(() => {\n if (props.onCancelResult) {\n props.onCancelResult();\n return;\n }\n }, [props]);\n\n const onUsernameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setUserName(event.target.value);\n if (invalidCredentialsProvided)\n setInvalidCredentialsProvided(false);\n }, [setUserName, invalidCredentialsProvided, setInvalidCredentialsProvided]);\n\n const onPasswordChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setPassword(event.target.value);\n if (invalidCredentialsProvided)\n setInvalidCredentialsProvided(false);\n }, [setPassword, invalidCredentialsProvided, setInvalidCredentialsProvided]);\n\n const handleArcGisLogin = React.useCallback(() => {\n setLayerAuthPending(true);\n setShowOauthPopup(true);\n if (oauthProcessSucceeded === false) {\n setOAuthProcessSucceeded(undefined);\n }\n\n }, [oauthProcessSucceeded]);\n\n // return true if authorization is needed\n const updateAuthState = React.useCallback(async (source: MapLayerSource, sourceValidation: MapLayerSourceValidation) => {\n const sourceRequireAuth = (sourceValidation.status === MapLayerSourceStatus.RequireAuth);\n const invalidCredentials = (sourceValidation.status === MapLayerSourceStatus.InvalidCredentials);\n if (sourceRequireAuth) {\n const settings = source.toLayerSettings();\n\n if (accessClient !== undefined && accessClient.getTokenServiceEndPoint !== undefined && settings !== undefined) {\n try {\n const tokenEndpoint = await accessClient.getTokenServiceEndPoint(settings.url);\n if (tokenEndpoint !== undefined) {\n const loginUrl = tokenEndpoint.getLoginUrl();\n setExternalLoginUrl(loginUrl);\n }\n\n } catch (_error) {\n\n }\n }\n\n }\n setServerRequireCredentials(sourceRequireAuth || invalidCredentials);\n if (invalidCredentials) {\n setInvalidCredentialsProvided(true);\n } else if (invalidCredentialsProvided) {\n setInvalidCredentialsProvided(false); // flag reset\n }\n\n return sourceRequireAuth || invalidCredentials;\n }, [accessClient, invalidCredentialsProvided]);\n\n const onNameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setMapName(event.target.value);\n }, [setMapName]);\n\n const onRadioChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setSettingsStorageRadio(event.target.value);\n }, [setSettingsStorageRadio]);\n\n const onUrlChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setMapUrl(event.target.value);\n }, [setMapUrl]);\n\n const createSource = React.useCallback(() => {\n let source: MapLayerSource | undefined;\n if (mapUrl && mapName) {\n source = MapLayerSource.fromJSON({\n url: mapUrl,\n name: mapName,\n formatId: mapType,\n });\n\n // Set credentials separately since they are not part of JSON\n if (source) {\n source.userName = userName || undefined; // When there is no value, empty string is always returned, in this case force it to undefined,\n source.password = password || undefined;\n }\n\n }\n return source;\n }, [mapName, mapType, mapUrl, password, userName]);\n\n const handleOk = React.useCallback(() => {\n const source = createSource();\n if (source === undefined || props.mapLayerSourceToEdit) {\n onOkResult();\n\n if (source === undefined) {\n // Close the dialog and inform end user something went wrong.\n const msgError = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerLayerSourceCreationFailed\");\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttachError\", { error: msgError, sourceName: mapName });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n return;\n }\n\n // Simply change the source definition in the setting service\n if (props.mapLayerSourceToEdit !== undefined) {\n const vp = props.activeViewport;\n void (async () => {\n if (isSettingsStorageAvailable && vp?.iModel?.iTwinId) {\n try {\n await MapLayerPreferences.replaceSource(props.mapLayerSourceToEdit!, source, vp.iModel.iTwinId, vp?.iModel.iModelId);\n } catch (err: any) {\n const errorMessage = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerEditError\", { layerName: props.mapLayerSourceToEdit?.name });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, errorMessage));\n return;\n }\n }\n })();\n return;\n }\n }\n\n // Attach source asynchronously.\n void (async () => {\n\n try {\n setLayerAttachPending(true);\n const validation = await source.validateSource(true);\n\n if (isMounted.current) {\n setLayerAttachPending(false);\n }\n\n if (validation.status === MapLayerSourceStatus.Valid) {\n // Update service settings if storage is available and we are not prompting user for credentials\n if (isSettingsStorageAvailable && !props.layerRequiringCredentials) {\n const storeOnIModel = (hasImodelContext ? \"Model\" === settingsStorage : undefined);\n const vp = props.activeViewport;\n if (vp?.iModel.iTwinId && !(await MapLayerPreferences.storeSource(source, vp.iModel.iTwinId, vp.iModel.iModelId, storeOnIModel))) {\n const msgError = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerPreferencesStoreFailed\");\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msgError));\n }\n }\n\n onOkResult({source, validation});\n } else if (validation.status === MapLayerSourceStatus.InvalidCoordinateSystem) {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.InvalidCoordinateSystem\");\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n onOkResult({source, validation});\n } else {\n const authNeeded = await updateAuthState(source, validation);\n if (!authNeeded) {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ValidationError\");\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, `${msg} ${source.url}`));\n onOkResult({source, validation});\n }\n }\n } catch (error) {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttachError\", { error, sourceName: source.name });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n onOkResult();\n }\n })();\n\n }, [createSource, mapName, props.mapLayerSourceToEdit, props.activeViewport, onOkResult, isSettingsStorageAvailable, updateAuthState, hasImodelContext, props.layerRequiringCredentials, settingsStorage]);\n\n React.useEffect(() => {\n const handleOAuthProcessEnd = (success: boolean, _state: any) => {\n onOauthProcessEnd.raiseEvent(success, _state);\n };\n\n // Currently only arcgis support AccessClient\n\n const ac = IModelApp.mapLayerFormatRegistry.getAccessClient(MAP_TYPES.arcGis);\n if (ac?.onOAuthProcessEnd) {\n setAccessClient(ac); // cache it, so we dont need to make another lookup;\n ac.onOAuthProcessEnd.addListener(handleOAuthProcessEnd);\n }\n setAccessClientInitialized(true);\n return () => {\n if (ac?.onOAuthProcessEnd) {\n ac.onOAuthProcessEnd.removeListener(handleOAuthProcessEnd);\n }\n\n setAccessClient(undefined);\n setAccessClientInitialized(false);\n };\n }, [mapType, onOauthProcessEnd, setAccessClient]);\n\n // After a map type change, make sure the different Oauth states are reset.\n React.useEffect(() => {\n // Reset few states\n setServerRequireCredentials(false);\n setInvalidCredentialsProvided(false);\n setShowOauthPopup(false);\n setOAuthProcessSucceeded(undefined);\n setExternalLoginUrl(undefined);\n\n }, [mapType]);\n\n // The first time the dialog is loaded and we already know the layer requires auth. (i.e ImageryProvider already made an attempt)\n // makes a request to discover the authentification types and adjust UI accordingly (i.e. username/password fields, Oauth popup)\n // Without this effect, user would have to manually click the 'OK' button in order to trigger the layer connection.\n React.useEffect(() => {\n // Attach source asynchronously.\n void (async () => {\n if (isAccessClientInitialized && props.layerRequiringCredentials?.url !== undefined && props.layerRequiringCredentials?.name !== undefined) {\n try {\n const source = MapLayerSource.fromJSON({\n url: props.layerRequiringCredentials.url,\n name: props.layerRequiringCredentials.name,\n formatId: props.layerRequiringCredentials.formatId,\n });\n\n if (source !== undefined) {\n setLayerAttachPending(true);\n const validation = await source.validateSource(true);\n if (isMounted.current) {\n setLayerAttachPending(false);\n }\n await updateAuthState(source, validation);\n }\n } catch (_error) { }\n }\n })();\n\n }, [isAccessClientInitialized,\n props.layerRequiringCredentials?.formatId,\n props.layerRequiringCredentials?.name,\n props.layerRequiringCredentials?.url,\n updateAuthState]);\n\n const dialogContainer = React.useRef<HTMLDivElement>(null);\n\n const readyToSave = React.useCallback(() => {\n const credentialsSet = !!userName && !!password;\n return (!!mapUrl && !!mapName)\n && !layerAttachPending\n && (!serverRequireCredentials || credentialsSet)\n && !invalidCredentialsProvided\n && (externalLoginUrl === undefined || (externalLoginUrl !== undefined && oauthProcessSucceeded));\n }, [userName, password, mapUrl, mapName, serverRequireCredentials, layerAttachPending, invalidCredentialsProvided, externalLoginUrl, oauthProcessSucceeded]);\n\n const buttonCluster = React.useMemo(() => [\n { type: DialogButtonType.OK, onClick: handleOk, disabled: !readyToSave() },\n { type: DialogButtonType.Cancel, onClick: handleCancel },\n ], [readyToSave, handleCancel, handleOk]);\n\n const handleOnKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === SpecialKey.Enter) {\n if (readyToSave())\n handleOk();\n }\n }, [handleOk, readyToSave]);\n\n // onOauthProcessEnd events handler\n React.useEffect(() => {\n const handleOauthProcess = (success: boolean, _state: any) => {\n setLayerAuthPending(false);\n if (success) {\n setOAuthProcessSucceeded(true);\n setShowOauthPopup(false);\n setLayerAttachPending(false);\n handleOk(); // Add the layer the same way the user would do by clicking 'ok'\n } else {\n setShowOauthPopup(false);\n setLayerAttachPending(false);\n setOAuthProcessSucceeded(false);\n }\n };\n\n onOauthProcessEnd.addListener(handleOauthProcess);\n return () => {\n onOauthProcessEnd.removeListener(handleOauthProcess);\n };\n }, [handleOk, onOauthProcessEnd]);\n\n //\n // Monitors authentication method changes\n React.useEffect(() => {\n\n if (serverRequireCredentials && oauthProcessSucceeded === undefined && externalLoginUrl !== undefined) {\n handleArcGisLogin();\n }\n }, [oauthProcessSucceeded, externalLoginUrl, handleArcGisLogin, serverRequireCredentials]);\n\n // Monitors Oauth2 popup was closed\n const handleOAuthPopupClose = React.useCallback(() => {\n setShowOauthPopup(false);\n setLayerAuthPending(false);\n if (oauthProcessSucceeded === undefined)\n setOAuthProcessSucceeded(false); // indicates there was a failed attempt\n }, [oauthProcessSucceeded]);\n\n // Utility function to get warning message section\n function renderWarningMessage(): React.ReactNode {\n let node: React.ReactNode;\n let warningMessage: string | undefined;\n\n // Get the proper warning message\n if (showOauthPopup) {\n warningMessage = externalLoginWaitingMsg;\n } else if (oauthProcessSucceeded === false) {\n warningMessage = externalLoginFailedMsg;\n } else if (oauthProcessSucceeded === true) {\n warningMessage = externalLoginSucceededMsg;\n } else if (invalidCredentialsProvided) {\n warningMessage = invalidCredentialsLabel;\n } else if (serverRequireCredentials && (!userName || !password)) {\n warningMessage = missingCredentialsLabel;\n }\n\n // Sometimes we want to add an extra node, such as a button\n let extraNode: React.ReactNode;\n if (oauthProcessSucceeded === false) {\n extraNode = <div>\n <Button onClick={handleArcGisLogin}>{externalLoginTryAgainLabel}</Button>\n </div>;\n }\n\n if (warningMessage !== undefined) {\n return (\n <div className=\"map-layer-source-warnMessage\">\n <Icon className=\"map-layer-source-warnMessage-icon\" iconSpec=\"icon-status-warning\" />\n <span className=\"map-layer-source-warnMessage-label\">{warningMessage}</span >\n {extraNode}\n </div>);\n } else {\n return (<span className=\"map-layer-source-placeholder\">&nbsp;</span>);\n }\n return node;\n }\n\n // Use a hook to display the popup.\n // The display of the popup is controlled by the 'showOauthPopup' state variable.\n useCrossOriginPopup(showOauthPopup, externalLoginUrl, externalLoginTitle, 450, 450, handleOAuthPopupClose);\n return (\n <div ref={dialogContainer}>\n <Dialog\n className=\"map-layer-url-dialog\"\n title={dialogTitle}\n opened={true}\n resizable={true}\n movable={true}\n modal={true}\n buttonCluster={buttonCluster}\n onClose={handleCancel}\n onEscape={handleCancel}\n minHeight={120}\n maxWidth={600}\n titleStyle={{ paddingLeft: \"10px\" }}\n footerStyle={{ paddingBottom: \"10px\", paddingRight: \"10px\" }}\n trapFocus={false}\n >\n <div className=\"map-layer-url-dialog-content\">\n <div className=\"map-layer-source-url\">\n <span className=\"map-layer-source-label\">{typeLabel}</span>\n <SelectMapFormat\n value={mapType}\n disabled={props.layerRequiringCredentials !== undefined || props.mapLayerSourceToEdit !== undefined || layerAttachPending || layerAuthPending}\n onChange={setMapType}\n mapTypesOptions={mapTypesOptions}\n />\n <span className=\"map-layer-source-label\">{nameLabel}</span>\n <Input className=\"map-layer-source-input\" placeholder={nameInputPlaceHolder} onChange={onNameChange} value={mapName} disabled={props.layerRequiringCredentials !== undefined || layerAttachPending || layerAuthPending} />\n <span className=\"map-layer-source-label\">{urlLabel}</span>\n <Input className=\"map-layer-source-input\" placeholder={urlInputPlaceHolder} onKeyPress={handleOnKeyDown} onChange={onUrlChange} disabled={props.mapLayerSourceToEdit !== undefined || layerAttachPending || layerAuthPending} value={mapUrl} />\n {serverRequireCredentials\n && externalLoginUrl === undefined // external login is handled in popup\n && props.mapLayerSourceToEdit === undefined &&\n <>\n <span className=\"map-layer-source-label\">{userNameLabel}</span>\n <LabeledInput className=\"map-layer-source-input\"\n displayStyle=\"inline\"\n placeholder={serverRequireCredentials ? userNameRequiredLabel : userNameLabel}\n status={(!userName && serverRequireCredentials) || invalidCredentialsProvided ? \"warning\" : undefined}\n disabled={layerAttachPending || layerAuthPending}\n onChange={onUsernameChange}\n value={userName}\n size=\"small\" />\n\n <span className=\"map-layer-source-label\">{passwordLabel}</span>\n <LabeledInput className=\"map-layer-source-input\"\n\n displayStyle=\"inline\"\n type=\"password\" placeholder={serverRequireCredentials ? passwordRequiredLabel : passwordLabel}\n status={(!password && serverRequireCredentials) || invalidCredentialsProvided ? \"warning\" : undefined}\n disabled={layerAttachPending || layerAuthPending}\n onChange={onPasswordChange}\n onKeyPress={handleOnKeyDown}\n value={password}\n size=\"small\" />\n\n </>\n }\n\n {/* Store settings options, not shown when editing a layer */}\n {!props.layerRequiringCredentials\n && !props.mapLayerSourceToEdit\n && <div title={!isSettingsStorageAvailable ? noSaveSettingsWarning : \"\"}>\n {hasImodelContext &&\n <div>\n <Radio disabled={!isSettingsStorageAvailable}\n name=\"settingsStorage\" value=\"iTwin\"\n label={iTwinSettingsLabel} checked={settingsStorage === \"iTwin\"}\n onChange={onRadioChange} />\n <Radio disabled={!isSettingsStorageAvailable}\n name=\"settingsStorage\" value=\"Model\"\n label={modelSettingsLabel} checked={settingsStorage === \"Model\"}\n onChange={onRadioChange} />\n </div>}\n </div>}\n </div>\n </div>\n\n {/* Warning message */}\n {renderWarningMessage()}\n\n {/* Progress bar */}\n {(layerAttachPending || layerAuthPending) &&\n <div className=\"map-layer-source-progressBar\">\n <ProgressLinear indeterminate />\n </div>\n }\n </Dialog>\n </div >\n );\n}\n"]}
1
+ {"version":3,"file":"MapUrlDialog.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapUrlDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n// cSpell:ignore Modeless WMTS\n\nimport { SpecialKey } from \"@itwin/appui-abstract\";\nimport { Button, Icon, Input, LabeledInput, ProgressLinear, Radio } from \"@itwin/itwinui-react\";\nimport { ImageMapLayerProps } from \"@itwin/core-common\";\nimport {\n IModelApp, MapLayerAccessClient, MapLayerSource,\n MapLayerSourceStatus, MapLayerSourceValidation, NotifyMessageDetails, OutputMessagePriority, ScreenViewport,\n} from \"@itwin/core-frontend\";\nimport { Dialog, useCrossOriginPopup } from \"@itwin/core-react\";\nimport * as React from \"react\";\nimport { MapLayerPreferences } from \"../../MapLayerPreferences\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { MapTypesOptions } from \"../Interfaces\";\nimport { BeEvent, Guid } from \"@itwin/core-bentley\";\nimport { SelectMapFormat } from \"./SelectMapFormat\";\nimport \"./MapUrlDialog.scss\";\nimport { SvgStatusWarning } from \"@itwin/itwinui-icons-color-react\";\n\nexport const MAP_TYPES = {\n wms: \"WMS\",\n arcGis: \"ArcGIS\",\n wmts: \"WMTS\",\n tileUrl: \"TileURL\",\n arcGisFeature: \"ArcGISFeature\",\n};\n\nexport type LayerCreationMode = \"single\"|\"multiple\";\ninterface MapUrlDialogProps {\n activeViewport?: ScreenViewport;\n isOverlay: boolean;\n onOkResult: (result?: SourceState) => void;\n onCancelResult?: () => void;\n mapTypesOptions?: MapTypesOptions;\n\n // An optional layer definition can be provide to enable the edit mode\n layerRequiringCredentials?: ImageMapLayerProps;\n\n mapLayerSourceToEdit?: MapLayerSource;\n}\n\nexport interface SourceState {\n source: MapLayerSource;\n validation: MapLayerSourceValidation;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function MapUrlDialog(props: MapUrlDialogProps) {\n const { onOkResult, mapTypesOptions } = props;\n\n const getMapUrlFromProps = React.useCallback(() => {\n if (props.mapLayerSourceToEdit) {\n return props.mapLayerSourceToEdit.url;\n } else if (props.layerRequiringCredentials?.url) {\n return props.layerRequiringCredentials.url;\n }\n return \"\";\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\n\n const getMapNameFromProps = React.useCallback(() => {\n if (props.mapLayerSourceToEdit) {\n return props.mapLayerSourceToEdit.name;\n } else if (props.layerRequiringCredentials?.name) {\n return props.layerRequiringCredentials.name;\n }\n return \"\";\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\n\n const getFormatFromProps = React.useCallback(() => {\n if (props.mapLayerSourceToEdit) {\n return props.mapLayerSourceToEdit.formatId;\n } else if (props.layerRequiringCredentials?.formatId) {\n return props.layerRequiringCredentials.formatId;\n }\n return undefined;\n }, [props.layerRequiringCredentials, props.mapLayerSourceToEdit]);\n\n const [dialogTitle] = React.useState(MapLayersUI.localization.getLocalizedString(props.layerRequiringCredentials || props.mapLayerSourceToEdit ? \"mapLayers:CustomAttach.EditCustomLayer\" : \"mapLayers:CustomAttach.AttachCustomLayer\"));\n const [typeLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.Type\"));\n const [nameLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.Name\"));\n const [nameInputPlaceHolder] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.NameInputPlaceHolder\"));\n const [urlLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.URL\"));\n const [urlInputPlaceHolder] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.UrlInputPlaceHolder\"));\n const [iTwinSettingsLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.StoreOnITwinSettings\"));\n const [modelSettingsLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.StoreOnModelSettings\"));\n const [missingCredentialsLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.MissingCredentials\"));\n const [invalidCredentialsLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.InvalidCredentials\"));\n const [externalLoginTitle] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLogin\"));\n const [externalLoginFailedMsg] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginFailed\"));\n const [externalLoginSucceededMsg] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginSucceeded\"));\n const [externalLoginWaitingMsg] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginWaiting\"));\n const [externalLoginTryAgainLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ExternalLoginTryAgain\"));\n const [serverRequireCredentials, setServerRequireCredentials] = React.useState(false);\n const [invalidCredentialsProvided, setInvalidCredentialsProvided] = React.useState(false);\n const [layerAttachPending, setLayerAttachPending] = React.useState(false);\n const [layerAuthPending, setLayerAuthPending] = React.useState(false);\n const [mapUrl, setMapUrl] = React.useState(getMapUrlFromProps());\n const [mapName, setMapName] = React.useState(getMapNameFromProps());\n const [userName, setUserName] = React.useState(\"\");\n const [password, setPassword] = React.useState(\"\");\n const [noSaveSettingsWarning] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.NoSaveSettingsWarning\"));\n const [passwordLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Password\"));\n const [passwordRequiredLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.PasswordRequired\"));\n const [userNameLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.Username\"));\n const [userNameRequiredLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:AuthenticationInputs.UsernameRequired\"));\n const [settingsStorage, setSettingsStorageRadio] = React.useState(\"iTwin\");\n const [oauthProcessSucceeded, setOAuthProcessSucceeded] = React.useState<undefined | boolean>(undefined);\n const [showOauthPopup, setShowOauthPopup] = React.useState(false);\n const [externalLoginUrl, setExternalLoginUrl] = React.useState<string | undefined>();\n const [onOauthProcessEnd] = React.useState(new BeEvent());\n const [accessClient, setAccessClient] = React.useState<MapLayerAccessClient | undefined>();\n const [isAccessClientInitialized, setAccessClientInitialized] = React.useState(false);\n const [shouldAutoAttachSource, setShouldAutoAttachSource] = React.useState(true);\n\n const [mapType, setMapType] = React.useState(getFormatFromProps() ?? \"ArcGIS\");\n\n // 'isMounted' is used to prevent any async operation once the hook has been\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\n const isMounted = React.useRef(false);\n React.useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n const [isSettingsStorageAvailable] = React.useState(MapLayersUI.iTwinConfig && props?.activeViewport?.iModel?.iTwinId);\n const [hasImodelContext] = React.useState(\n props?.activeViewport?.iModel?.iTwinId !== undefined\n && props.activeViewport.iModel.iTwinId !== Guid.empty\n && props?.activeViewport?.iModel?.iModelId !== undefined\n && props?.activeViewport.iModel.iModelId !== Guid.empty);\n\n const handleCancel = React.useCallback(() => {\n if (props.onCancelResult) {\n props.onCancelResult();\n return;\n }\n }, [props]);\n\n const onUsernameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setUserName(event.target.value);\n if (invalidCredentialsProvided)\n setInvalidCredentialsProvided(false);\n }, [setUserName, invalidCredentialsProvided, setInvalidCredentialsProvided]);\n\n const onPasswordChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setPassword(event.target.value);\n if (invalidCredentialsProvided)\n setInvalidCredentialsProvided(false);\n }, [setPassword, invalidCredentialsProvided, setInvalidCredentialsProvided]);\n\n const handleArcGisLogin = React.useCallback(() => {\n setLayerAuthPending(true);\n setShowOauthPopup(true);\n if (oauthProcessSucceeded === false) {\n setOAuthProcessSucceeded(undefined);\n }\n\n }, [oauthProcessSucceeded]);\n\n // return true if authorization is needed\n const updateAuthState = React.useCallback(async (source: MapLayerSource, sourceValidation: MapLayerSourceValidation) => {\n const sourceRequireAuth = (sourceValidation.status === MapLayerSourceStatus.RequireAuth);\n let invalidCredentials = (sourceValidation.status === MapLayerSourceStatus.InvalidCredentials);\n if (sourceRequireAuth) {\n let hasTokenEndPoint = false;\n const settings = source.toLayerSettings();\n\n if (accessClient !== undefined && accessClient.getTokenServiceEndPoint !== undefined && settings !== undefined) {\n try {\n const tokenEndpoint = await accessClient.getTokenServiceEndPoint(settings.url);\n if (tokenEndpoint !== undefined) {\n const loginUrl = tokenEndpoint.getLoginUrl();\n setExternalLoginUrl(loginUrl);\n hasTokenEndPoint = true;\n }\n\n } catch (_error) {\n\n }\n } else if (userName.length > 0 || password.length > 0 ) {\n // This is a patch until @itwin\\core-frontend return the expected 'InvalidCredentials' status.\n invalidCredentials = true;\n }\n\n if (!hasTokenEndPoint && (userName.length > 0 || password.length > 0 )) {\n // This is a patch until @itwin\\core-frontend return the expected 'InvalidCredentials' status.\n invalidCredentials = true;\n }\n }\n setServerRequireCredentials(sourceRequireAuth || invalidCredentials);\n if (invalidCredentials) {\n setInvalidCredentialsProvided(true);\n } else if (invalidCredentialsProvided) {\n setInvalidCredentialsProvided(false); // flag reset\n }\n\n return sourceRequireAuth || invalidCredentials;\n }, [accessClient, invalidCredentialsProvided, password.length, userName.length]);\n\n const onNameChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setMapName(event.target.value);\n }, [setMapName]);\n\n const onRadioChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setSettingsStorageRadio(event.target.value);\n }, [setSettingsStorageRadio]);\n\n const onUrlChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setMapUrl(event.target.value);\n }, [setMapUrl]);\n\n const createSource = React.useCallback(() => {\n let source: MapLayerSource | undefined;\n if (mapUrl && mapName) {\n source = MapLayerSource.fromJSON({\n url: mapUrl,\n name: mapName,\n formatId: mapType,\n });\n\n // Set credentials separately since they are not part of JSON\n if (source) {\n source.userName = userName || undefined; // When there is no value, empty string is always returned, in this case force it to undefined,\n source.password = password || undefined;\n }\n\n }\n return source;\n }, [mapName, mapType, mapUrl, password, userName]);\n\n const handleOk = React.useCallback(() => {\n const source = createSource();\n if (source === undefined || props.mapLayerSourceToEdit) {\n onOkResult();\n\n if (source === undefined) {\n // Close the dialog and inform end user something went wrong.\n const msgError = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerLayerSourceCreationFailed\");\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttachError\", { error: msgError, sourceName: mapName });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n return;\n }\n\n // Simply change the source definition in the setting service\n if (props.mapLayerSourceToEdit !== undefined) {\n const vp = props.activeViewport;\n void (async () => {\n if (isSettingsStorageAvailable && vp?.iModel?.iTwinId) {\n try {\n await MapLayerPreferences.replaceSource(props.mapLayerSourceToEdit!, source, vp.iModel.iTwinId, vp?.iModel.iModelId);\n } catch (err: any) {\n const errorMessage = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerEditError\", { layerName: props.mapLayerSourceToEdit?.name });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, errorMessage));\n return;\n }\n }\n })();\n return;\n }\n }\n\n // Attach source asynchronously.\n void (async () => {\n\n try {\n setLayerAttachPending(true);\n const validation = await source.validateSource(true);\n\n if (isMounted.current) {\n setLayerAttachPending(false);\n }\n\n if (validation.status === MapLayerSourceStatus.Valid) {\n // Update service settings if storage is available and we are not prompting user for credentials\n if (isSettingsStorageAvailable && !props.layerRequiringCredentials) {\n const storeOnIModel = (hasImodelContext ? \"Model\" === settingsStorage : undefined);\n const vp = props.activeViewport;\n if (vp?.iModel.iTwinId && !(await MapLayerPreferences.storeSource(source, vp.iModel.iTwinId, vp.iModel.iModelId, storeOnIModel))) {\n const msgError = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerPreferencesStoreFailed\");\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msgError));\n }\n }\n\n onOkResult({source, validation});\n } else if (validation.status === MapLayerSourceStatus.InvalidCoordinateSystem) {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.InvalidCoordinateSystem\");\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n onOkResult({source, validation});\n } else {\n const authNeeded = await updateAuthState(source, validation);\n if (!authNeeded) {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.ValidationError\");\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, `${msg} ${source.url}`));\n onOkResult({source, validation});\n }\n }\n } catch (error) {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttachError\", { error, sourceName: source.name });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n onOkResult();\n }\n })();\n\n }, [createSource, mapName, props.mapLayerSourceToEdit, props.activeViewport, onOkResult, isSettingsStorageAvailable, updateAuthState, hasImodelContext, props.layerRequiringCredentials, settingsStorage]);\n\n React.useEffect(() => {\n const handleOAuthProcessEnd = (success: boolean, _state: any) => {\n onOauthProcessEnd.raiseEvent(success, _state);\n };\n\n const ac = IModelApp.mapLayerFormatRegistry.getAccessClient(mapType);\n if (ac?.onOAuthProcessEnd) {\n setAccessClient(ac); // cache it, so we dont need to make another lookup;\n ac.onOAuthProcessEnd.addListener(handleOAuthProcessEnd);\n }\n setAccessClientInitialized(true);\n return () => {\n if (ac?.onOAuthProcessEnd) {\n ac.onOAuthProcessEnd.removeListener(handleOAuthProcessEnd);\n }\n\n setAccessClient(undefined);\n setAccessClientInitialized(false);\n };\n }, [mapType, onOauthProcessEnd, setAccessClient]);\n\n // After a map type change, make sure the different Oauth states are reset.\n React.useEffect(() => {\n // Reset few states\n setServerRequireCredentials(false);\n setInvalidCredentialsProvided(false);\n setShowOauthPopup(false);\n setOAuthProcessSucceeded(undefined);\n setExternalLoginUrl(undefined);\n\n }, [mapType]);\n\n // The first time the dialog is loaded and we already know the layer requires auth. (i.e ImageryProvider already made an attempt)\n // makes a request to discover the authentification types and adjust UI accordingly (i.e. username/password fields, Oauth popup)\n // Without this effect, user would have to manually click the 'OK' button in order to trigger the layer connection.\n React.useEffect(() => {\n // Attach source asynchronously.\n void (async () => {\n if (isAccessClientInitialized\n && shouldAutoAttachSource\n && props.layerRequiringCredentials?.url !== undefined\n && props.layerRequiringCredentials?.name !== undefined) {\n try {\n\n const source = MapLayerSource.fromJSON({\n url: props.layerRequiringCredentials.url,\n name: props.layerRequiringCredentials.name,\n formatId: props.layerRequiringCredentials.formatId,\n });\n\n if (source !== undefined) {\n setLayerAttachPending(true);\n setShouldAutoAttachSource(false);\n const validation = await source.validateSource(true);\n if (isMounted.current) {\n setLayerAttachPending(false);\n }\n await updateAuthState(source, validation);\n }\n } catch (_error) { }\n }\n })();\n\n }, [isAccessClientInitialized, props.layerRequiringCredentials?.formatId, props.layerRequiringCredentials?.name, props.layerRequiringCredentials?.url, shouldAutoAttachSource, updateAuthState]);\n\n const dialogContainer = React.useRef<HTMLDivElement>(null);\n\n const readyToSave = React.useCallback(() => {\n const credentialsSet = !!userName && !!password;\n const ready = (!!mapUrl && !!mapName)\n && !layerAttachPending\n && (!serverRequireCredentials || credentialsSet)\n && !invalidCredentialsProvided\n && (externalLoginUrl === undefined || (externalLoginUrl !== undefined && oauthProcessSucceeded));\n return ready;\n }, [userName, password, mapUrl, mapName, serverRequireCredentials, layerAttachPending, invalidCredentialsProvided, externalLoginUrl, oauthProcessSucceeded]);\n\n // const buttonCluster = React.useMemo(() => [\n // { type: DialogButtonType.OK, onClick: handleOk, disabled: !readyToSave() },\n // { type: DialogButtonType.Cancel, onClick: handleCancel },\n // ], [readyToSave, handleCancel, handleOk]);\n\n const handleOnKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === SpecialKey.Enter) {\n if (readyToSave())\n handleOk();\n }\n }, [handleOk, readyToSave]);\n\n // onOauthProcessEnd events handler\n React.useEffect(() => {\n const handleOauthProcess = (success: boolean, _state: any) => {\n setLayerAuthPending(false);\n if (success) {\n setOAuthProcessSucceeded(true);\n setShowOauthPopup(false);\n setLayerAttachPending(false);\n handleOk(); // Add the layer the same way the user would do by clicking 'ok'\n } else {\n setShowOauthPopup(false);\n setLayerAttachPending(false);\n setOAuthProcessSucceeded(false);\n }\n };\n\n onOauthProcessEnd.addListener(handleOauthProcess);\n return () => {\n onOauthProcessEnd.removeListener(handleOauthProcess);\n };\n }, [handleOk, onOauthProcessEnd]);\n\n //\n // Monitors authentication method changes\n React.useEffect(() => {\n\n if (serverRequireCredentials && oauthProcessSucceeded === undefined && externalLoginUrl !== undefined) {\n handleArcGisLogin();\n }\n }, [oauthProcessSucceeded, externalLoginUrl, handleArcGisLogin, serverRequireCredentials]);\n\n // Monitors Oauth2 popup was closed\n const handleOAuthPopupClose = React.useCallback(() => {\n setShowOauthPopup(false);\n setLayerAuthPending(false);\n if (oauthProcessSucceeded === undefined)\n setOAuthProcessSucceeded(false); // indicates there was a failed attempt\n }, [oauthProcessSucceeded]);\n\n // Utility function to get warning message section\n function renderWarningMessage(): React.ReactNode {\n let node: React.ReactNode;\n let warningMessage: string | undefined;\n\n // Get the proper warning message\n if (showOauthPopup) {\n warningMessage = externalLoginWaitingMsg;\n } else if (oauthProcessSucceeded === false) {\n warningMessage = externalLoginFailedMsg;\n } else if (oauthProcessSucceeded === true) {\n warningMessage = externalLoginSucceededMsg;\n } else if (invalidCredentialsProvided) {\n warningMessage = invalidCredentialsLabel;\n } else if (serverRequireCredentials && (!userName || !password)) {\n warningMessage = missingCredentialsLabel;\n }\n\n // Sometimes we want to add an extra node, such as a button\n let extraNode: React.ReactNode;\n if (oauthProcessSucceeded === false) {\n extraNode = <div>\n <Button onClick={handleArcGisLogin}>{externalLoginTryAgainLabel}</Button>\n </div>;\n }\n\n if (warningMessage !== undefined) {\n return (\n <div className=\"map-layer-source-warnMessage\">\n <Icon size=\"small\"><SvgStatusWarning></SvgStatusWarning></Icon>\n <span className=\"map-layer-source-warnMessage-label\">{warningMessage}</span >\n {extraNode}\n </div>);\n } else {\n return (<span className=\"map-layer-source-placeholder\">&nbsp;</span>);\n }\n return node;\n }\n\n // Use a hook to display the popup.\n // The display of the popup is controlled by the 'showOauthPopup' state variable.\n useCrossOriginPopup(showOauthPopup, externalLoginUrl, externalLoginTitle, 450, 450, handleOAuthPopupClose);\n\n function getFooter() {\n\n return (\n <div className=\"map-layer-source-footer\">\n <div className=\"map-layer-source-footer-status\"/>\n <div>\n <Button\n className=\"map-layer-features-footer-button\"\n styleType='high-visibility'\n onClick={handleOk}\n disabled={!readyToSave()}\n >\n {props?.mapLayerSourceToEdit ? MapLayersUI.translate(\"Dialog.Edit\") : MapLayersUI.translate(\"Dialog.Add\")}\n </Button>\n <Button\n className=\"map-layer-source-footer-button\"\n styleType='default'\n onClick={handleCancel}\n >\n {MapLayersUI.translate(\"Dialog.Cancel\")}\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div ref={dialogContainer}>\n <Dialog\n className=\"map-layer-url-dialog\"\n title={dialogTitle}\n opened={true}\n resizable={true}\n movable={true}\n modal={true}\n footer={getFooter()}\n onClose={handleCancel}\n onEscape={handleCancel}\n minHeight={120}\n maxWidth={600}\n titleStyle={{ paddingLeft: \"10px\" }}\n footerStyle={{ paddingBottom: \"10px\", paddingRight: \"10px\" }}\n trapFocus={false}\n >\n <div className=\"map-layer-url-dialog-content\">\n <div className=\"map-layer-source-url\">\n <span className=\"map-layer-source-label\">{typeLabel}</span>\n <SelectMapFormat\n value={mapType}\n disabled={props.layerRequiringCredentials !== undefined || props.mapLayerSourceToEdit !== undefined || layerAttachPending || layerAuthPending}\n onChange={setMapType}\n mapTypesOptions={mapTypesOptions}\n />\n <span className=\"map-layer-source-label\">{nameLabel}</span>\n <Input className=\"map-layer-source-input\" placeholder={nameInputPlaceHolder} onChange={onNameChange} value={mapName} disabled={props.layerRequiringCredentials !== undefined || layerAttachPending || layerAuthPending} />\n <span className=\"map-layer-source-label\">{urlLabel}</span>\n <Input className=\"map-layer-source-input\" placeholder={urlInputPlaceHolder} onKeyPress={handleOnKeyDown} onChange={onUrlChange} disabled={props.mapLayerSourceToEdit !== undefined || layerAttachPending || layerAuthPending} value={mapUrl} />\n {serverRequireCredentials\n && externalLoginUrl === undefined // external login is handled in popup\n && props.mapLayerSourceToEdit === undefined &&\n <>\n <span className=\"map-layer-source-label\">{userNameLabel}</span>\n <LabeledInput className=\"map-layer-source-input\"\n displayStyle=\"inline\"\n placeholder={serverRequireCredentials ? userNameRequiredLabel : userNameLabel}\n status={(!userName && serverRequireCredentials) || invalidCredentialsProvided ? \"warning\" : undefined}\n disabled={layerAttachPending || layerAuthPending}\n onChange={onUsernameChange}\n value={userName}\n size=\"small\" />\n\n <span className=\"map-layer-source-label\">{passwordLabel}</span>\n <LabeledInput className=\"map-layer-source-input\"\n\n displayStyle=\"inline\"\n type=\"password\" placeholder={serverRequireCredentials ? passwordRequiredLabel : passwordLabel}\n status={(!password && serverRequireCredentials) || invalidCredentialsProvided ? \"warning\" : undefined}\n disabled={layerAttachPending || layerAuthPending}\n onChange={onPasswordChange}\n onKeyPress={handleOnKeyDown}\n value={password}\n size=\"small\" />\n\n </>\n }\n\n {/* Store settings options, not shown when editing a layer */}\n {!props.layerRequiringCredentials\n && !props.mapLayerSourceToEdit\n && <div title={!isSettingsStorageAvailable ? noSaveSettingsWarning : \"\"}>\n {hasImodelContext &&\n <div>\n <Radio disabled={!isSettingsStorageAvailable}\n name=\"settingsStorage\" value=\"iTwin\"\n label={iTwinSettingsLabel} checked={settingsStorage === \"iTwin\"}\n onChange={onRadioChange} />\n <Radio disabled={!isSettingsStorageAvailable}\n name=\"settingsStorage\" value=\"Model\"\n label={modelSettingsLabel} checked={settingsStorage === \"Model\"}\n onChange={onRadioChange} />\n </div>}\n </div>}\n </div>\n </div>\n\n {/* Warning message */}\n {renderWarningMessage()}\n\n {/* Progress bar */}\n {(layerAttachPending || layerAuthPending) &&\n <div className=\"map-layer-source-progressBar\">\n <ProgressLinear indeterminate />\n </div>\n }\n </Dialog>\n </div >\n );\n}\n"]}
@@ -17,15 +17,11 @@ $default-font-size: --iui-font-size-1;
17
17
  padding-left: 5px;
18
18
  }
19
19
 
20
- .map-layer-source-select-previewBadge.iui-button.iui-small {
21
- // Make button appear as a simple icon
22
- border: 0;
23
- background: 0;
24
- padding: 0;
20
+ .map-layer-source-select-previewBadge {
21
+ margin-right: 10px;
25
22
  }
26
23
 
27
24
  .map-layer-source-url-subLayers {
28
-
29
25
  height: 200px;
30
26
  width: 500px;
31
27
  // height: calc(100% - 40px);
@@ -34,7 +30,6 @@ $default-font-size: --iui-font-size-1;
34
30
  // border-radius: 16px
35
31
  }
36
32
  .map-layer-source-url {
37
-
38
33
  height: 100%;
39
34
  width: 100%;
40
35
  display: grid;
@@ -72,7 +67,6 @@ $default-font-size: --iui-font-size-1;
72
67
  .map-layer-warning-icon {
73
68
  margin-left: 3%;
74
69
  }
75
-
76
70
  }
77
71
 
78
72
  .map-layer-source-progressBar {
@@ -83,8 +77,44 @@ $default-font-size: --iui-font-size-1;
83
77
  white-space: pre-wrap;
84
78
  }
85
79
 
80
+ .map-layer-source-footer {
81
+ display: flex;
82
+ margin-top: 10px;
83
+ }
84
+
85
+ .map-layer-source-footer-button {
86
+ margin-left: 5px;
87
+ }
88
+
89
+ .map-layer-source-footer-status {
90
+ flex: 1 1;
91
+ text-overflow: ellipsis;
92
+ white-space: nowrap;
93
+ overflow: hidden;
94
+ margin-left: 2px;
95
+ margin-bottom: 4px;
96
+ height: 2rem;
97
+ }
98
+
99
+ .map-layer-features-footer {
100
+ display: flex;
101
+ }
102
+
103
+ .map-layer-features-footer-buttons {
104
+ margin-top: auto;
105
+ }
106
+
107
+ .map-layer-features-footer-button {
108
+ margin-left: 5px;
109
+ }
110
+
111
+ .map-layer-features-footer-warnMessage {
112
+ flex: 1 1;
113
+ margin-left: 2px;
114
+ height: 3rem;
115
+ }
116
+
86
117
  .map-layer-source-warnMessage {
87
- margin-top: 5px;
88
118
 
89
119
  .map-layer-source-warnMessage-label {
90
120
  margin-left: 5px;
@@ -96,5 +126,4 @@ $default-font-size: --iui-font-size-1;
96
126
  color: var(--iui-color-icon-warning);
97
127
  background-color: transparent;
98
128
  }
99
-
100
129
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SelectMapFormat.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/SelectMapFormat.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,qBAAqB,CAAC;AAS7B,eAAO,MAAM,SAAS;;;;;;CAMrB,CAAC;AAEF,UAAU,oBAAoB;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,eAkD1D"}
1
+ {"version":3,"file":"SelectMapFormat.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/SelectMapFormat.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,qBAAqB,CAAC;AAS7B,eAAO,MAAM,SAAS;;;;;;CAMrB,CAAC;AAEF,UAAU,oBAAoB;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,eAgD1D"}
@@ -46,8 +46,8 @@ function SelectMapFormat(props) {
46
46
  }
47
47
  }, [props]);
48
48
  return (React.createElement(itwinui_react_1.Select, { className: "map-layer-source-select", options: mapFormats, value: mapFormat, disabled: props.disabled, onChange: handleOnChange, size: "small", itemRenderer: (option) => (React.createElement(itwinui_react_1.MenuItem, { badge: option.id?.includes("techPreview") ?
49
- React.createElement("div", { title: techPreviewTooltip },
50
- React.createElement(itwinui_react_1.IconButton, { className: "map-layer-source-select-previewBadge", size: "small" },
49
+ React.createElement("div", { title: techPreviewTooltip, className: "map-layer-source-select-previewBadge" },
50
+ React.createElement(itwinui_react_1.Icon, { size: "small" },
51
51
  React.createElement(itwinui_icons_color_react_1.SvgTechnicalPreviewMini, null)))
52
52
  : undefined }, option.label)) }));
53
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SelectMapFormat.js","sourceRoot":"","sources":["../../../../src/ui/widget/SelectMapFormat.tsx"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F,8BAA8B;;;AAE9B,wDAAkF;AAClF,+BAA+B;AAE/B,+BAA6B;AAC7B,gFAAyE;AACzE,+CAA8C;AAC9C,wDAAiD;AAEjD,QAAQ;AACR,wEAAwE;AACxE,4EAA4E;AAC5E,wDAAwD;AAC3C,QAAA,SAAS,GAAG;IACvB,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,aAAa,EAAE,eAAe;CAC/B,CAAC;AASF,gEAAgE;AAChE,SAAgB,eAAe,CAAC,KAA2B;IAEzD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,iBAAS,CAAC,MAAM,CAAC,CAAC;IAClF,MAAM,CAAC,kBAAkB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,uBAAW,CAAC,YAAY,CAAC,kBAAkB,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAE3I,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAA2B,EAAE;QAC/D,MAAM,OAAO,GAA2B;YACtC,EAAE,KAAK,EAAE,iBAAS,CAAC,MAAM,EAAS,KAAK,EAAE,iBAAS,CAAC,MAAM,EAAE;YAC3D,EAAE,KAAK,EAAE,iBAAS,CAAC,GAAG,EAAY,KAAK,EAAE,iBAAS,CAAC,GAAG,EAAE;YACxD,EAAE,KAAK,EAAE,iBAAS,CAAC,IAAI,EAAW,KAAK,EAAE,iBAAS,CAAC,IAAI,EAAE;SAC1D,CAAC;QACF,IAAI,KAAK,CAAC,eAAe,EAAE,cAAc;YACvC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAS,CAAC,OAAO,EAAE,KAAK,EAAE,iBAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAEvE,IAAI,yBAAS,CAAC,sBAAsB,CAAC,YAAY,CAAC,iBAAS,CAAC,aAAa,CAAC;YACxE,OAAO,CAAC,IAAI,CAAE,EAAE,KAAK,EAAE,iBAAS,CAAC,aAAa,EAAE,KAAK,EAAE,iBAAS,CAAC,aAAa,EAAE,EAAE,EAAC,aAAa,EAAE,CAAC,CAAC;QAEtG,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QACzD,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,KAAK,CAAC,QAAQ,EAAE;YAClB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SACvB;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,CAEL,oBAAC,sBAAM,IACL,SAAS,EAAC,yBAAyB,EACnC,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAC,OAAO,EACZ,YAAY,EACV,CAAC,MAAM,EAAE,EAAE,CAAC,CACV,oBAAC,wBAAQ,IACP,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;gBACzC,6BAAK,KAAK,EAAE,kBAAkB;oBAC5B,oBAAC,0BAAU,IAAC,SAAS,EAAC,sCAAsC,EAAE,IAAI,EAAC,OAAO;wBACxE,oBAAC,mDAAuB,OAAG,CAChB,CACT;gBACN,CAAC,CAAC,SAAS,IACZ,MAAM,CAAC,KAAK,CACJ,CAAC,GAChB,CACH,CAAC;AACJ,CAAC;AAlDD,0CAkDC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n// cSpell:ignore Modeless WMTS\n\nimport { IconButton, MenuItem, Select, SelectOption } from \"@itwin/itwinui-react\";\nimport * as React from \"react\";\nimport { MapTypesOptions } from \"../Interfaces\";\nimport \"./MapUrlDialog.scss\";\nimport {SvgTechnicalPreviewMini} from \"@itwin/itwinui-icons-color-react\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { IModelApp } from \"@itwin/core-frontend\";\n\n// TODO:\n// Remove this structure and iterate over the registry's active formats.\n// Still need a proper way to exclude some format, like we currently do with\n// 'TileUrl' without the need to hardcode any format Id.\nexport const MAP_TYPES = {\n wms: \"WMS\",\n arcGis: \"ArcGIS\",\n wmts: \"WMTS\",\n tileUrl: \"TileURL\",\n arcGisFeature: \"ArcGISFeature\",\n};\n\ninterface SelectMapFormatProps {\n value?: string;\n disabled?: boolean;\n mapTypesOptions?: MapTypesOptions;\n onChange?: (mapType: string) => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function SelectMapFormat(props: SelectMapFormatProps) {\n\n const [mapFormat, setMapFormat] = React.useState(props.value ?? MAP_TYPES.arcGis);\n const [techPreviewTooltip] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.TechPreviewBadgeTooltip\"));\n\n const [mapFormats] = React.useState((): SelectOption<string>[] => {\n const formats: SelectOption<string>[] = [\n { value: MAP_TYPES.arcGis, label: MAP_TYPES.arcGis },\n { value: MAP_TYPES.wms, label: MAP_TYPES.wms },\n { value: MAP_TYPES.wmts, label: MAP_TYPES.wmts },\n ];\n if (props.mapTypesOptions?.supportTileUrl)\n formats.push({ value: MAP_TYPES.tileUrl, label: MAP_TYPES.tileUrl });\n\n if (IModelApp.mapLayerFormatRegistry.isRegistered(MAP_TYPES.arcGisFeature))\n formats.push( { value: MAP_TYPES.arcGisFeature, label: MAP_TYPES.arcGisFeature, id:\"techPreview\" });\n\n return formats;\n });\n\n const handleOnChange = React.useCallback((value: string) => {\n setMapFormat(value);\n if (props.onChange) {\n props.onChange(value);\n }\n }, [props]);\n\n return (\n\n <Select\n className=\"map-layer-source-select\"\n options={mapFormats}\n value={mapFormat}\n disabled={props.disabled}\n onChange={handleOnChange}\n size=\"small\"\n itemRenderer={\n (option) => (\n <MenuItem\n badge={option.id?.includes(\"techPreview\") ?\n <div title={techPreviewTooltip}>\n <IconButton className=\"map-layer-source-select-previewBadge\" size=\"small\">\n <SvgTechnicalPreviewMini />\n </IconButton>\n </div>\n : undefined}>\n {option.label}\n </MenuItem>) }\n />\n );\n}\n"]}
1
+ {"version":3,"file":"SelectMapFormat.js","sourceRoot":"","sources":["../../../../src/ui/widget/SelectMapFormat.tsx"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F,8BAA8B;;;AAE9B,wDAA4E;AAC5E,+BAA+B;AAE/B,+BAA6B;AAC7B,gFAAyE;AACzE,+CAA8C;AAC9C,wDAAiD;AAEjD,QAAQ;AACR,wEAAwE;AACxE,4EAA4E;AAC5E,wDAAwD;AAC3C,QAAA,SAAS,GAAG;IACvB,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,aAAa,EAAE,eAAe;CAC/B,CAAC;AASF,gEAAgE;AAChE,SAAgB,eAAe,CAAC,KAA2B;IAEzD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,iBAAS,CAAC,MAAM,CAAC,CAAC;IAClF,MAAM,CAAC,kBAAkB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,uBAAW,CAAC,YAAY,CAAC,kBAAkB,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAE3I,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAA2B,EAAE;QAC/D,MAAM,OAAO,GAA2B;YACtC,EAAE,KAAK,EAAE,iBAAS,CAAC,MAAM,EAAS,KAAK,EAAE,iBAAS,CAAC,MAAM,EAAE;YAC3D,EAAE,KAAK,EAAE,iBAAS,CAAC,GAAG,EAAY,KAAK,EAAE,iBAAS,CAAC,GAAG,EAAE;YACxD,EAAE,KAAK,EAAE,iBAAS,CAAC,IAAI,EAAW,KAAK,EAAE,iBAAS,CAAC,IAAI,EAAE;SAC1D,CAAC;QACF,IAAI,KAAK,CAAC,eAAe,EAAE,cAAc;YACvC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAS,CAAC,OAAO,EAAE,KAAK,EAAE,iBAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAEvE,IAAI,yBAAS,CAAC,sBAAsB,CAAC,YAAY,CAAC,iBAAS,CAAC,aAAa,CAAC;YACxE,OAAO,CAAC,IAAI,CAAE,EAAE,KAAK,EAAE,iBAAS,CAAC,aAAa,EAAE,KAAK,EAAE,iBAAS,CAAC,aAAa,EAAE,EAAE,EAAC,aAAa,EAAE,CAAC,CAAC;QAEtG,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QACzD,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,KAAK,CAAC,QAAQ,EAAE;YAClB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SACvB;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,CAEL,oBAAC,sBAAM,IACL,SAAS,EAAC,yBAAyB,EACnC,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAC,OAAO,EACZ,YAAY,EACV,CAAC,MAAM,EAAE,EAAE,CAAC,CACV,oBAAC,wBAAQ,IACP,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;gBACzC,6BAAK,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAC,sCAAsC;oBAC9E,oBAAC,oBAAI,IAAC,IAAI,EAAC,OAAO;wBAAC,oBAAC,mDAAuB,OAAG,CAAO,CACjD;gBACN,CAAC,CAAC,SAAS,IACZ,MAAM,CAAC,KAAK,CACJ,CAAC,GAChB,CACH,CAAC;AACJ,CAAC;AAhDD,0CAgDC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n// cSpell:ignore Modeless WMTS\n\nimport { Icon, MenuItem, Select, SelectOption } from \"@itwin/itwinui-react\";\nimport * as React from \"react\";\nimport { MapTypesOptions } from \"../Interfaces\";\nimport \"./MapUrlDialog.scss\";\nimport {SvgTechnicalPreviewMini} from \"@itwin/itwinui-icons-color-react\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { IModelApp } from \"@itwin/core-frontend\";\n\n// TODO:\n// Remove this structure and iterate over the registry's active formats.\n// Still need a proper way to exclude some format, like we currently do with\n// 'TileUrl' without the need to hardcode any format Id.\nexport const MAP_TYPES = {\n wms: \"WMS\",\n arcGis: \"ArcGIS\",\n wmts: \"WMTS\",\n tileUrl: \"TileURL\",\n arcGisFeature: \"ArcGISFeature\",\n};\n\ninterface SelectMapFormatProps {\n value?: string;\n disabled?: boolean;\n mapTypesOptions?: MapTypesOptions;\n onChange?: (mapType: string) => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function SelectMapFormat(props: SelectMapFormatProps) {\n\n const [mapFormat, setMapFormat] = React.useState(props.value ?? MAP_TYPES.arcGis);\n const [techPreviewTooltip] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.TechPreviewBadgeTooltip\"));\n\n const [mapFormats] = React.useState((): SelectOption<string>[] => {\n const formats: SelectOption<string>[] = [\n { value: MAP_TYPES.arcGis, label: MAP_TYPES.arcGis },\n { value: MAP_TYPES.wms, label: MAP_TYPES.wms },\n { value: MAP_TYPES.wmts, label: MAP_TYPES.wmts },\n ];\n if (props.mapTypesOptions?.supportTileUrl)\n formats.push({ value: MAP_TYPES.tileUrl, label: MAP_TYPES.tileUrl });\n\n if (IModelApp.mapLayerFormatRegistry.isRegistered(MAP_TYPES.arcGisFeature))\n formats.push( { value: MAP_TYPES.arcGisFeature, label: MAP_TYPES.arcGisFeature, id:\"techPreview\" });\n\n return formats;\n });\n\n const handleOnChange = React.useCallback((value: string) => {\n setMapFormat(value);\n if (props.onChange) {\n props.onChange(value);\n }\n }, [props]);\n\n return (\n\n <Select\n className=\"map-layer-source-select\"\n options={mapFormats}\n value={mapFormat}\n disabled={props.disabled}\n onChange={handleOnChange}\n size=\"small\"\n itemRenderer={\n (option) => (\n <MenuItem\n badge={option.id?.includes(\"techPreview\") ?\n <div title={techPreviewTooltip} className=\"map-layer-source-select-previewBadge\">\n <Icon size=\"small\"><SvgTechnicalPreviewMini /></Icon>\n </div>\n : undefined}>\n {option.label}\n </MenuItem>) }\n />\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SubLayersTree.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/SubLayersTree.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIlE,OAAO,EAAyB,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,sBAAsB,CAAC;AAsB9B,oBAAY,yBAAyB,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;AAC9F,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC;IAChF,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAGD,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,eAWxD;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,UAAU,GAAG,KAAK,CAAC;IAClC,UAAU,EAAE,uBAAuB,CAAC;IACpC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,qBAAqB,CAAC,EAAE,yBAAyB,CAAC;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AAEH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,eAqFtD"}
1
+ {"version":3,"file":"SubLayersTree.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/SubLayersTree.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIlE,OAAO,EAAyB,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,sBAAsB,CAAC;AAuB9B,oBAAY,yBAAyB,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;AAC9F,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC;IAChF,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAGD,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,eAWxD;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,UAAU,GAAG,KAAK,CAAC;IAClC,UAAU,EAAE,uBAAuB,CAAC;IACpC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,qBAAqB,CAAC,EAAE,yBAAyB,CAAC;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AAEH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,eAmGtD"}
@@ -13,6 +13,7 @@ const React = require("react");
13
13
  const SubLayersDataProvider_1 = require("./SubLayersDataProvider");
14
14
  require("./SubLayersTree.scss");
15
15
  const mapLayers_1 = require("../../mapLayers");
16
+ const itwinui_icons_react_1 = require("@itwin/itwinui-icons-react");
16
17
  // eslint-disable-next-line @typescript-eslint/naming-convention
17
18
  function Toolbar(props) {
18
19
  return (React.createElement("div", { className: "map-manager-sublayer-tree-toolbar" },
@@ -41,13 +42,15 @@ function SubLayersTree(props) {
41
42
  const [height, setHeight] = React.useState(props.height);
42
43
  const [placeholderLabel] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:SubLayers.SearchPlaceholder"));
43
44
  const [noResults] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:SubLayers.NoResults"));
44
- const [allOnLabel] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:SubLayers.AllOn"));
45
- const [allOffLabel] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:SubLayers.AllOff"));
46
45
  const [subLayers, setSubLayers] = React.useState(props.subLayers);
47
46
  const [layerFilterString, setLayerFilterString] = React.useState("");
48
47
  // create data provider to get some nodes to show in tree
49
48
  // `React.useMemo' is used avoid creating new object on each render cycle
50
- const dataProvider = React.useMemo(() => new SubLayersDataProvider_1.SubLayersDataProvider(subLayers, props.expandMode), [subLayers, props.expandMode]);
49
+ // We DO want a dependency on 'layerFilterString' (event though eslint doesn't like it)..
50
+ // each time the filter is updated the provider must be refreshed otherwise the state of model is out of synch.
51
+ const dataProvider = React.useMemo(() => new SubLayersDataProvider_1.SubLayersDataProvider(subLayers, props.expandMode),
52
+ // eslint-disable-next-line react-hooks/exhaustive-deps
53
+ [subLayers, props.expandMode, layerFilterString]);
51
54
  const { modelSource, nodeLoader, nodeHighlightingProps, } = useTreeFiltering(dataProvider, layerFilterString);
52
55
  // create custom event handler. It handles all tree event same as `TreeEventHandler` but additionally
53
56
  // it selects/deselects node when checkbox is checked/unchecked and vice versa.
@@ -74,10 +77,8 @@ function SubLayersTree(props) {
74
77
  return React.createElement(React.Fragment, null,
75
78
  React.createElement("div", { className: "map-manager-sublayer-tree" },
76
79
  React.createElement(Toolbar, { searchField: React.createElement(itwinui_react_1.Input, { type: "text", className: "map-manager-sublayer-tree-searchbox", placeholder: placeholderLabel, value: layerFilterString, onChange: handleFilterTextChanged, size: "small" }) }, props.singleVisibleSubLayer ? undefined : [
77
- React.createElement(itwinui_react_1.Button, { size: "small", styleType: "borderless", key: "show-all-btn", title: allOnLabel, onClick: async () => changeAll(true) },
78
- React.createElement(core_react_1.WebFontIcon, { iconName: props.checkboxStyle === "eye" ? "icon-visibility" : "icon-checkbox-select" })),
79
- React.createElement(itwinui_react_1.Button, { size: "small", styleType: "borderless", key: "hide-all-btn", title: allOffLabel, onClick: async () => changeAll(false) },
80
- React.createElement(core_react_1.WebFontIcon, { iconName: props.checkboxStyle === "eye" ? "icon-visibility-hide-2" : "icon-checkbox-deselect" })),
80
+ React.createElement(itwinui_react_1.IconButton, { key: "show-all-btn", size: "small", title: props.checkboxStyle === "eye" ? mapLayers_1.MapLayersUI.translate("SubLayers.AllOn") : mapLayers_1.MapLayersUI.translate("SelectFeaturesDialog.AllOn"), onClick: async () => changeAll(true) }, props.checkboxStyle === "eye" ? React.createElement(itwinui_icons_react_1.SvgVisibilityShow, null) : React.createElement(itwinui_icons_react_1.SvgCheckboxSelect, null)),
81
+ React.createElement(itwinui_react_1.IconButton, { style: { marginLeft: "5px" }, key: "hide-all-btn", size: "small", title: props.checkboxStyle === "eye" ? mapLayers_1.MapLayersUI.translate("SubLayers.AllOff") : mapLayers_1.MapLayersUI.translate("SelectFeaturesDialog.AllOff"), onClick: async () => changeAll(false) }, props.checkboxStyle === "eye" ? React.createElement(itwinui_icons_react_1.SvgVisibilityHide, null) : React.createElement(itwinui_icons_react_1.SvgCheckboxDeselect, null)),
81
82
  ]),
82
83
  React.createElement("div", { className: "map-manager-sublayer-tree-content" },
83
84
  (props.width === undefined && props.height === undefined) && React.createElement(core_react_1.ResizableContainerObserver, { onResize: (w, h) => { setWidth(w); setHeight(h); } }),