diff --git a/packages/geoview-core/src/core/components/details/details-style.ts b/packages/geoview-core/src/core/components/details/details-style.ts
index a3e4ec35dde..52a0a9537ac 100644
--- a/packages/geoview-core/src/core/components/details/details-style.ts
+++ b/packages/geoview-core/src/core/components/details/details-style.ts
@@ -52,8 +52,20 @@ export const getSxClasses = (theme: Theme): SxStyles => ({
featureInfoItemValue: {
marginRight: 0,
wordBreak: 'break-word',
- overflow: 'hidden',
+ overflowX: 'auto',
textOverflow: 'ellipsis',
+ ' table': {
+ border: '1px solid',
+ width: '100%',
+ borderCollapse: 'collapse',
+ },
+ ' th, td': {
+ border: '1px solid',
+ wordBreak: 'normal',
+ textAllign: 'center',
+ padding: '5px',
+ whiteSpace: 'nowrap',
+ },
},
boxContainerFeatureInfo: {
wordWrap: 'break-word',
diff --git a/packages/geoview-core/src/core/components/details/feature-info-table.tsx b/packages/geoview-core/src/core/components/details/feature-info-table.tsx
index 5892ab01480..ff33a8aa5f0 100644
--- a/packages/geoview-core/src/core/components/details/feature-info-table.tsx
+++ b/packages/geoview-core/src/core/components/details/feature-info-table.tsx
@@ -59,7 +59,13 @@ export function FeatureInfoTable({ featureInfoList }: FeatureInfoTableProps): JS
function setFeatureItem(featureInfoItem: TypeFieldEntry): JSX.Element | JSX.Element[] {
function process(item: string, alias: string, index: number): JSX.Element {
let element: JSX.Element;
- if (typeof item === 'string' && isImage(item)) {
+ if (alias === 'html') {
+ element = (
+
+
+
+ );
+ } else if (typeof item === 'string' && isImage(item)) {
element = (
process(item, alias, index))
: process(values, alias, 0);
@@ -110,9 +118,11 @@ export function FeatureInfoTable({ featureInfoList }: FeatureInfoTableProps): JS
}}
key={`${featureInfoItem.alias} ${index.toString()}`}
>
-
- {featureInfoItem.alias}
-
+ {featureInfoItem.alias !== 'html' && (
+
+ {featureInfoItem.alias}
+
+ )}
{setFeatureItem(featureInfoItem)}
))}
diff --git a/packages/geoview-core/src/core/utils/date-mgt.ts b/packages/geoview-core/src/core/utils/date-mgt.ts
index 8f6355fcdd7..445a237a96b 100644
--- a/packages/geoview-core/src/core/utils/date-mgt.ts
+++ b/packages/geoview-core/src/core/utils/date-mgt.ts
@@ -703,7 +703,7 @@ export abstract class DateMgt {
if (index[SECOND_DATE_ELEMENT] + 1) returnValue = `${returnValue}${dateFragments[index[SECOND_DATE_ELEMENT]]}`;
if (returnValue && index[THIRD_DATE_ELEMENT] + 1) returnValue = `${returnValue}${separators[DATE]}`;
if (index[THIRD_DATE_ELEMENT] + 1) returnValue = `${returnValue}${dateFragments[index[THIRD_DATE_ELEMENT]]}`;
- if (index[TIME] + 1) returnValue = `${returnValue}${separators[DATE_TIME]}${timeString.slice(0, 8)}`;
+ if (index[TIME] + 1 && timeString) returnValue = `${returnValue}${separators[DATE_TIME]}${timeString.slice(0, 8)}`;
return returnValue;
}
diff --git a/packages/geoview-core/src/geo/layer/gv-layers/abstract-gv-layer.ts b/packages/geoview-core/src/geo/layer/gv-layers/abstract-gv-layer.ts
index c901d6709bc..78d4c75c766 100644
--- a/packages/geoview-core/src/geo/layer/gv-layers/abstract-gv-layer.ts
+++ b/packages/geoview-core/src/geo/layer/gv-layers/abstract-gv-layer.ts
@@ -251,8 +251,9 @@ export abstract class AbstractGVLayer extends AbstractBaseLayer {
// Get the layer config
const layerConfig = this.getLayerConfig();
- // If queryable
- if (!layerConfig.source?.featureInfo?.queryable) {
+ // If the layer is not queryable
+ // GV: This should always be set by now. There were instances where that was not happeneing, recheck once config API is being used
+ if (layerConfig.source?.featureInfo?.queryable === false) {
logger.logError(`Layer at path ${layerConfig.layerPath} is not queryable`);
return null;
}
diff --git a/packages/geoview-core/src/geo/layer/gv-layers/raster/gv-esri-dynamic.ts b/packages/geoview-core/src/geo/layer/gv-layers/raster/gv-esri-dynamic.ts
index 8d5df444ea6..b1188aba624 100644
--- a/packages/geoview-core/src/geo/layer/gv-layers/raster/gv-esri-dynamic.ts
+++ b/packages/geoview-core/src/geo/layer/gv-layers/raster/gv-esri-dynamic.ts
@@ -249,9 +249,9 @@ export class GVEsriDynamic extends AbstractGVRaster {
const layerConfig = this.getLayerConfig();
// If not queryable
- if (!layerConfig.source?.featureInfo?.queryable) return [];
+ if (!layerConfig.source.featureInfo?.queryable) return [];
- let identifyUrl = layerConfig.source?.dataAccessPath;
+ let identifyUrl = layerConfig.source.dataAccessPath;
if (!identifyUrl) return [];
identifyUrl = identifyUrl.endsWith('/') ? identifyUrl : `${identifyUrl}/`;
diff --git a/packages/geoview-core/src/geo/layer/gv-layers/raster/gv-wms.ts b/packages/geoview-core/src/geo/layer/gv-layers/raster/gv-wms.ts
index 032051934a0..16daf08ab06 100644
--- a/packages/geoview-core/src/geo/layer/gv-layers/raster/gv-wms.ts
+++ b/packages/geoview-core/src/geo/layer/gv-layers/raster/gv-wms.ts
@@ -18,6 +18,7 @@ import { TypeFeatureInfoEntry } from '@/geo/map/map-schema-types';
import { loadImage } from '@/geo/utils/renderer/geoview-renderer';
import { AbstractGVRaster } from './abstract-gv-raster';
import { TypeLegend } from '@/core/stores/store-interface-and-intial-values/layer-state';
+import { Projection } from '@/geo/utils/projection';
/**
* Manages a WMS layer.
@@ -117,6 +118,18 @@ export class GVWMS extends AbstractGVRaster {
// Get the layer config and source
const layerConfig = this.getLayerConfig();
+ // Check if bounds are properly set
+ if (!layerConfig.initialSettings!.bounds) {
+ const newBounds = this.getBounds(this.getLayerPath());
+ if (newBounds)
+ layerConfig.initialSettings!.bounds = Projection.transformExtentFromProj(
+ newBounds,
+ this.getMapViewer().getView().getProjection(),
+ Projection.PROJECTION_NAMES.LNGLAT
+ );
+ else return [];
+ }
+
const clickCoordinate = this.getMapViewer().convertCoordinateLngLatToMapProj(lnglat);
if (
lnglat[0] < layerConfig.initialSettings!.bounds![0] ||
@@ -130,8 +143,9 @@ export class GVWMS extends AbstractGVRaster {
const featureInfoFormat = this.getLayerConfig().getServiceMetadata()?.Capability?.Request?.GetFeatureInfo?.Format as TypeJsonArray;
if (featureInfoFormat)
if (featureInfoFormat.includes('text/xml' as TypeJsonObject)) infoFormat = 'text/xml';
+ else if (featureInfoFormat.includes('text/html' as TypeJsonObject)) infoFormat = 'text/html';
else if (featureInfoFormat.includes('text/plain' as TypeJsonObject)) infoFormat = 'text/plain';
- else throw new Error('Parameter info_format of GetFeatureInfo only support text/xml and text/plain for WMS services.');
+ else throw new Error('Parameter info_format of GetFeatureInfo only support text/xml, text/html and text/plain for WMS services.');
const wmsSource = this.getOLSource();
const viewResolution = this.getMapViewer().getView().getResolution()!;
@@ -166,12 +180,16 @@ export class GVWMS extends AbstractGVRaster {
}
}
}
+ } else if (infoFormat === 'text/html') {
+ featureMember = { html: response.data };
} else featureMember = { plain_text: { '#text': response.data } };
+
if (featureMember) {
const featureInfoResult = GVWMS.#formatWmsFeatureInfoResult(featureMember, clickCoordinate);
return featureInfoResult;
}
}
+
return [];
} catch (error) {
// Log
diff --git a/packages/geoview-core/src/geo/layer/layer.ts b/packages/geoview-core/src/geo/layer/layer.ts
index e122a828a6f..4f139e8deb4 100644
--- a/packages/geoview-core/src/geo/layer/layer.ts
+++ b/packages/geoview-core/src/geo/layer/layer.ts
@@ -384,7 +384,7 @@ export class LayerApi {
const newOrderedLayerInfos: TypeOrderedLayerInfo[] = [];
const addSubLayerPathToLayerOrder = (layerEntryConfig: TypeLayerEntryConfig, layerPath: string): void => {
- const subLayerPath = layerPath.endsWith(layerEntryConfig.layerId) ? layerPath : `${layerPath}/${layerEntryConfig.layerId}`;
+ const subLayerPath = layerPath.endsWith(`/${layerEntryConfig.layerId}`) ? layerPath : `${layerPath}/${layerEntryConfig.layerId}`;
const layerInfo: TypeOrderedLayerInfo = {
layerPath: subLayerPath,
visible: layerEntryConfig.initialSettings?.states?.visible !== false,