diff --git a/web-ui/src/main/resources/catalog/components/edit/suggestion/partials/suggestbutton.html b/web-ui/src/main/resources/catalog/components/edit/suggestion/partials/suggestbutton.html
index 158d61607d4..563e5009689 100644
--- a/web-ui/src/main/resources/catalog/components/edit/suggestion/partials/suggestbutton.html
+++ b/web-ui/src/main/resources/catalog/components/edit/suggestion/partials/suggestbutton.html
@@ -1,10 +1,11 @@
diff --git a/web-ui/src/main/resources/catalog/components/filestore/FileStoreDirective.js b/web-ui/src/main/resources/catalog/components/filestore/FileStoreDirective.js
index 2752b39cb95..b44dc2baac1 100644
--- a/web-ui/src/main/resources/catalog/components/filestore/FileStoreDirective.js
+++ b/web-ui/src/main/resources/catalog/components/filestore/FileStoreDirective.js
@@ -147,11 +147,12 @@
) {
return {
restrict: "A",
- templateUrl: "../../catalog/components/filestore/" + "partials/filestore.html",
+ templateUrl: "../../catalog/components/filestore/partials/filestore.html",
scope: {
uuid: "=gnFileStore",
selectCallback: "&",
- filter: "="
+ filter: "=",
+ layout: "@"
},
link: function (scope, element, attrs, controller) {
scope.autoUpload =
@@ -161,11 +162,12 @@
: attrs["defaultStatus"];
scope.onlinesrcService = gnOnlinesrc;
scope.gnCurrentEdit = gnCurrentEdit;
+ scope.selectOptions = { current: undefined };
+ scope.metadataResources = [];
scope.setResource = function (r) {
scope.selectCallback({ selected: r });
};
- scope.metadataResources = [];
scope.loadMetadataResources = function () {
return gnfilestoreService
@@ -195,16 +197,37 @@
}
);
};
+
scope.deleteResource = function (r) {
gnfilestoreService.delete(r).then(scope.loadMetadataResources);
};
- scope.$on("gnFileStoreUploadDone", scope.loadMetadataResources);
+
+ scope.$on("gnFileStoreUploadDone", function (evt, data) {
+ if (data) {
+ // Select the provided resource by the url value.
+ scope.loadMetadataResources().then(function () {
+ for (var i = 0; i < scope.metadataResources.length; i++) {
+ if (scope.metadataResources[i].url === data) {
+ scope.setResource(scope.metadataResources[i]);
+ break;
+ }
+ }
+ });
+ } else {
+ scope.loadMetadataResources();
+ }
+ });
scope.$watch("filter", function (newValue, oldValue) {
if (angular.isDefined(scope.uuid) && newValue != oldValue) {
scope.loadMetadataResources();
}
});
+ scope.$watch("selectOptions.current", function (newValue, oldValue) {
+ if (newValue != oldValue) {
+ scope.setResource(scope.selectOptions.current);
+ }
+ });
scope.$watch("uuid", function (newValue, oldValue) {
if (angular.isDefined(scope.uuid) && newValue != oldValue) {
scope.loadMetadataResources();
@@ -221,6 +244,9 @@
};
}
});
+ if (angular.isDefined(scope.uuid)) {
+ scope.loadMetadataResources();
+ }
}
};
}
diff --git a/web-ui/src/main/resources/catalog/components/filestore/partials/filestore.html b/web-ui/src/main/resources/catalog/components/filestore/partials/filestore.html
index 3c7224044c8..f650c59f205 100644
--- a/web-ui/src/main/resources/catalog/components/filestore/partials/filestore.html
+++ b/web-ui/src/main/resources/catalog/components/filestore/partials/filestore.html
@@ -1,87 +1,106 @@
-
- fileStoreNoFileMatching
+
+
filestoreChooseAFile
+
+
filestoreUploadAFile
+
+
diff --git a/web-ui/src/main/resources/catalog/components/metadataactions/RelatedDirective.js b/web-ui/src/main/resources/catalog/components/metadataactions/RelatedDirective.js
index 725b7b7e742..04bba86d128 100644
--- a/web-ui/src/main/resources/catalog/components/metadataactions/RelatedDirective.js
+++ b/web-ui/src/main/resources/catalog/components/metadataactions/RelatedDirective.js
@@ -189,6 +189,318 @@
}
]);
+ /**
+ * Directive to display a panel in the metadata editor with a header and a list of distributions grouped by type.
+ *
+ */
+ module.directive("gnDistributionResourcesPanel", [
+ function () {
+ return {
+ restrict: "A",
+ templateUrl: function (elem, attrs) {
+ return (
+ attrs.template ||
+ "../../catalog/components/metadataactions/partials/distributionResourcesPanel.html"
+ );
+ },
+ scope: {
+ md: "=gnDistributionResourcesPanel",
+ mode: "=",
+ relatedConfig: "=",
+ editorConfig: "@"
+ },
+ link: function (scope, element, attrs) {}
+ };
+ }
+ ]);
+
+ /**
+ * Displays a panel with different types of distributions available in the metadata object 'md'.
+ *
+ * - mode: mode to display the distributions.
+ * - tabset: displays the distributions in a tabset panel.
+ * - (other value): displays the distributions in different div blocks.
+ *
+ * - layout: Layout for the distribution items.
+ * - card: display the distribution items as a card.
+ * - (other value): display the distribution items as a list.
+ *
+ * - editable: when used in the metadata editor, set to true.
+ *
+ * - relatedConfig: array with the configuration of the distributions to display. For each distribution:
+ * - filter: Filter a type based on an attribute.
+ * Can't be used when multiple types are requested
+ * eg. data-filter="associationType:upstreamData"
+ * data-filter="protocol:OGC:.*|ESRI:.*"
+ * data-filter="-protocol:OGC:.*"
+ * - title: title translation key for the relations section.
+ * - editActions: List of edit actions to add online resources to the distribution.
+ * eg. editActions: ['addOnlinesrc'] -> adds a button to open the default dialog to add
+ * an online resource.
+ * editActions: ['addOnlinesrc', 'onlineDiscoverWMS', 'onlineDiscoverArcGIS'] ->
+ * adds a button to open the default dialog to add an online resourceand other 2 buttons
+ * with predefined values to add WMS and ArcGIS resources.
+ *
+ * Example configuration (view mode):
+ *
+ *
+ *
+ *
+ *
+ * Example configuration (edit mode):
+ *
+ *
+ *
+ *
+ *
+ */
+ module.directive("gnDistributionResourcesContainer", [
+ "gnRelatedResources",
+ "gnConfigService",
+ "$injector",
+ function (gnRelatedResources, gnConfigService, $injector) {
+ return {
+ restrict: "A",
+ templateUrl: function (elem, attrs) {
+ return (
+ attrs.template ||
+ "../../catalog/components/metadataactions/partials/distributionResourcesContainer.html"
+ );
+ },
+ scope: {
+ md: "=gnDistributionResourcesContainer",
+ mode: "=",
+ relatedConfig: "=",
+ editorConfig: "="
+ },
+ link: function (scope, element, attrs, controller) {
+ scope.lang = scope.lang || scope.$parent.lang;
+ scope.relations = {};
+ scope.relatedConfigUI = [];
+ scope.editable = angular.isDefined(scope.editorConfig);
+ scope.config = gnRelatedResources;
+ if ($injector.has("gnOnlinesrc")) {
+ scope.onlinesrcService = $injector.get("gnOnlinesrc");
+ }
+
+ scope.relatedConfig.forEach(function (config) {
+ config.relations = scope.md.link || {};
+ config.relationFound = config.relations.length > 0;
+
+ var value = config.relations;
+
+ // Check if tabs needs to be displayed
+ if (scope.mode === "tabset" && config.filter && angular.isArray(value)) {
+ var filters = gnConfigService.parseFilters(config.filter);
+
+ config.relations = [];
+ for (var j = 0; j < value.length; j++) {
+ gnConfigService.testFilters(filters, value[j]) &&
+ config.relations.push(value[j]);
+ }
+ config.relationFound = config.relations.length > 0;
+ } else {
+ config.relations = value;
+ }
+
+ scope.relatedConfigUI.push(config);
+ });
+ }
+ };
+ }
+ ]);
+
+ module.directive("gnRelatedDistribution", [
+ "gnGlobalSettings",
+ "gnSearchSettings",
+ "gnRelatedResources",
+ "gnExternalViewer",
+ "gnConfigService",
+ "gnUrlUtils",
+ "gnDoiService",
+ "$injector",
+ function (
+ gnGlobalSettings,
+ gnSearchSettings,
+ gnRelatedResources,
+ gnExternalViewer,
+ gnConfigService,
+ gnUrlUtils,
+ gnDoiService,
+ $injector
+ ) {
+ return {
+ restrict: "A",
+ templateUrl: function (elem, attrs) {
+ return (
+ attrs.template ||
+ "../../catalog/components/metadataactions/partials/relatedDistribution.html"
+ );
+ },
+ scope: {
+ md: "=gnRelatedDistribution",
+ template: "@",
+ title: "@",
+ altTitle: "@",
+ list: "@",
+ // Filter a type based on an attribute.
+ // Can't be used when multiple types are requested
+ // eg. data-filter="associationType:upstreamData"
+ // data-filter="protocol:OGC:.*|ESRI:.*"
+ // data-filter="-protocol:OGC:.*"
+ filter: "@",
+ user: "=",
+ hasResults: "=?",
+ layout: "@",
+ editorConfig: "="
+ },
+ link: function (scope, element, attrs) {
+ scope.canPublishDoiForResource = gnDoiService.canPublishDoiForResource;
+ scope.editable = angular.isDefined(scope.editorConfig);
+ scope.lang = scope.lang || scope.$parent.lang;
+
+ if ($injector.has("gnOnlinesrc")) {
+ scope.onlinesrcService = $injector.get("gnOnlinesrc");
+ $injector.get("gnCurrentEdit").associatedPanelConfigId = scope.editorConfig;
+ }
+
+ /**
+ * The type is use to find the config to use for this
+ * type of link. See link-utility.xsl.
+ */
+ function getType(fn) {
+ if (fn === "legend") {
+ return fn;
+ } else if (fn === "featureCatalogue") {
+ return "fcats";
+ } else if (fn === "dataQualityReport") {
+ return "dq-report";
+ }
+ return "onlinesrc";
+ }
+
+ function convertLangProperties(object) {
+ if (!angular.isObject(object)) {
+ return;
+ }
+ var newObject = {};
+ Object.keys(object).forEach(function (key) {
+ newObject[key.replace(/^lang/, "")] = object[key];
+ });
+ return newObject;
+ }
+
+ scope.convertLinkToEdit = function (link) {
+ var convertedLink = {
+ id: link.url,
+ url: convertLangProperties(link.urlObject),
+ type: getType(link.function),
+ title: convertLangProperties(link.nameObject),
+ protocol: link.protocol,
+ description: convertLangProperties(link.descriptionObject),
+ function: link["function"],
+ mimeType: link.mimeType,
+ applicationProfile: link.applicationProfile,
+ lUrl: link.url,
+ locTitle: link.nameObject ? link.nameObject["default"] : "",
+ locDescription: link.descriptionObject
+ ? link.descriptionObject["default"]
+ : "",
+ locUrl: link.urlObject["default"]
+ };
+ return convertedLink;
+ };
+
+ scope.loadDistributions = function (distribution) {
+ var distributionCount = 0;
+ scope.distributionFound = false;
+ scope.distributions = [];
+
+ angular.forEach(distribution, function (value) {
+ if (!value) {
+ return;
+ }
+
+ // init object if required
+ scope.distributions = scope.distributions || [];
+ scope.hasResults = true;
+
+ if (!scope.distributions) {
+ scope.distributions = [];
+ }
+ if (scope.filter) {
+ var filters = gnConfigService.parseFilters(scope.filter);
+
+ if (gnConfigService.testFilters(filters, value)) {
+ scope.distributions.push(value);
+ }
+ } else {
+ scope.distributions = value;
+ }
+
+ // For draft version append "approved=false" to url
+ if (scope.md.draft === "y") {
+ for (var i = 0; i < scope.distributions.length; i++) {
+ if (
+ scope.distributions[i].url.match(
+ ".*/api/records/" + scope.md.uuid + "/attachments/.*"
+ ) != null
+ ) {
+ scope.distributions[i].url = gnUrlUtils.remove(
+ scope.distributions[i].url,
+ ["approved"],
+ true
+ );
+ scope.distributions[i].url = gnUrlUtils.append(
+ scope.distributions[i].url,
+ "approved=false"
+ );
+ }
+ }
+ }
+
+ distributionCount += scope.distributions.length;
+ });
+ scope.distributionFound = distributionCount > 0;
+ };
+
+ scope.getOrderBy = function (link) {
+ return link && link.resourceTitle ? link.resourceTitle : link.locTitle;
+ };
+
+ scope.externalViewerAction = function (mainType, link, md) {
+ gnExternalViewer.viewService(md, link);
+ };
+ scope.hasAction = gnRelatedResources.hasAction;
+ scope.getBadgeLabel = gnRelatedResources.getBadgeLabel;
+ scope.isLayerProtocol = gnRelatedResources.isLayerProtocol;
+ scope.externalViewerActionEnabled = gnExternalViewer.isEnabledViewAction();
+
+ scope.config = gnRelatedResources;
+
+ scope.$watchCollection("md.link", function (n, o) {
+ if (n && n !== o) {
+ if (scope.md != null && scope.md.link) {
+ scope.loadDistributions(scope.md.link);
+ }
+ }
+ });
+
+ if (scope.md != null && scope.md.link) {
+ scope.loadDistributions(scope.md.link);
+ }
+ }
+ };
+ }
+ ]);
+
module.directive("gnRelatedList", [
"gnRelatedResources",
function (gnRelatedResources) {
diff --git a/web-ui/src/main/resources/catalog/components/metadataactions/partials/distributionResourcesContainer.html b/web-ui/src/main/resources/catalog/components/metadataactions/partials/distributionResourcesContainer.html
new file mode 100644
index 00000000000..da6b061d339
--- /dev/null
+++ b/web-ui/src/main/resources/catalog/components/metadataactions/partials/distributionResourcesContainer.html
@@ -0,0 +1,67 @@
+
+
+
+
+
+ {{::config.title | translate}}
+
+
+
+
+
+
+
+
+
+
diff --git a/web-ui/src/main/resources/catalog/components/metadataactions/partials/distributionResourcesPanel.html b/web-ui/src/main/resources/catalog/components/metadataactions/partials/distributionResourcesPanel.html
new file mode 100644
index 00000000000..c3d378b8b5d
--- /dev/null
+++ b/web-ui/src/main/resources/catalog/components/metadataactions/partials/distributionResourcesPanel.html
@@ -0,0 +1,21 @@
+
+
+
+
+ distributionPanel
+
+
+
+
+
diff --git a/web-ui/src/main/resources/catalog/components/metadataactions/partials/relatedDistribution.html b/web-ui/src/main/resources/catalog/components/metadataactions/partials/relatedDistribution.html
new file mode 100644
index 00000000000..900d7f03508
--- /dev/null
+++ b/web-ui/src/main/resources/catalog/components/metadataactions/partials/relatedDistribution.html
@@ -0,0 +1,278 @@
+
diff --git a/web-ui/src/main/resources/catalog/components/viewer/wfsfilter/WfsFilterDirective.js b/web-ui/src/main/resources/catalog/components/viewer/wfsfilter/WfsFilterDirective.js
index 742d41ae97f..a76fa85ea0f 100644
--- a/web-ui/src/main/resources/catalog/components/viewer/wfsfilter/WfsFilterDirective.js
+++ b/web-ui/src/main/resources/catalog/components/viewer/wfsfilter/WfsFilterDirective.js
@@ -162,7 +162,8 @@
baseLayer: "=?baseLayer",
layer: "=?layer",
md: "=?",
- managerOnly: "@?"
+ managerOnly: "@?",
+ alertTimeout: "@?"
},
controller: function () {},
link: function (scope, element, attrs, ctrl) {
@@ -177,6 +178,7 @@
wfsIndexJobSavedPromise;
scope.managerOnly = scope.managerOnly === "true";
scope.map = scope.$parent.map;
+
var map = scope.map;
scope.strategy = attrs["strategy"] || "investigator";
@@ -383,6 +385,9 @@
},
function () {
scope.isWfsAvailable = false;
+ $timeout(function () {
+ scope.isWfsAvailable = undefined;
+ }, scope.alertTimeout || 0);
}
);
};
diff --git a/web-ui/src/main/resources/catalog/js/CatController.js b/web-ui/src/main/resources/catalog/js/CatController.js
index 45514757406..5e2797fa6a4 100644
--- a/web-ui/src/main/resources/catalog/js/CatController.js
+++ b/web-ui/src/main/resources/catalog/js/CatController.js
@@ -859,32 +859,28 @@
//'layout': 'tabset',
layout: "",
sections: [
- // {'types': 'services', 'title': 'Services', 'layout': 'card'},
{
- types: "onlines",
- filter: "protocol:OGC:.*|ESRI:.*|atom.*",
+ filter:
+ "protocol:OGC:WMS|OGC:WMTS|ESRI:.*|atom.*|REST|OGC API Maps|OGC API Records",
title: "API"
},
{
- types: "onlines",
- filter: "protocol:.*DOWNLOAD.*|DB:.*|FILE:.*",
+ filter:
+ "protocol:OGC:WFS|OGC:WCS|.*DOWNLOAD.*|DB:.*|FILE:.*|OGC API Features|OGC API Coverages",
title: "download"
},
- { types: "onlines", filter: "function:legend", title: "mapLegend" },
+ { filter: "function:legend", title: "mapLegend" },
{
- types: "onlines",
filter: "function:featureCatalogue",
title: "featureCatalog"
},
{
- types: "onlines",
filter: "function:dataQualityReport",
title: "quality"
},
{
- types: "onlines",
filter:
- "-protocol:OGC:.*|ESRI:.*|atom.*|.*DOWNLOAD.*|DB:.*|FILE:.* AND -function:legend|featureCatalogue|dataQualityReport",
+ "-protocol:OGC.*|REST|ESRI:.*|atom.*|.*DOWNLOAD.*|DB:.*|FILE:.* AND -function:legend|featureCatalogue|dataQualityReport",
title: "links"
}
]
diff --git a/web-ui/src/main/resources/catalog/js/edit/EditorController.js b/web-ui/src/main/resources/catalog/js/edit/EditorController.js
index c38ff20189b..91a086f5d40 100644
--- a/web-ui/src/main/resources/catalog/js/edit/EditorController.js
+++ b/web-ui/src/main/resources/catalog/js/edit/EditorController.js
@@ -206,6 +206,7 @@
// Enable workflow functions
$scope.isMdWorkflowEnable = gnConfig["metadata.workflow.enable"];
+ $scope.viewConfig = gnGlobalSettings.gnCfg.mods.recordview;
if ($routeParams.id) {
// Check requested metadata exists
@@ -390,6 +391,7 @@
var formLoadExtraFunctions = function () {
setViewMenuInTopToolbar();
setEditorIndentType();
+ refreshMetadata();
};
$scope.$on("$locationChangeSuccess", function (e, newUrl, oldUrl) {
@@ -420,6 +422,37 @@
}
};
+ /**
+ * Refresh the metadata information in the current edit session
+ */
+ var refreshMetadata = function () {
+ // Refresh the metadata property
+ $http
+ .post("../api/search/records/_search", {
+ query: {
+ bool: {
+ must: [
+ {
+ multi_match: {
+ query: gnCurrentEdit.id,
+ fields: ["id^2", "uuid"]
+ }
+ },
+ { terms: { draft: ["n", "y", "e"] } },
+ { terms: { isTemplate: ["n", "y", "s"] } }
+ ]
+ }
+ }
+ })
+ .then(function (r) {
+ var metadataFound = r.data.hits.total.value !== 0;
+
+ if (metadataFound) {
+ $scope.gnCurrentEdit.metadata = new Metadata(r.data.hits.hits[0]);
+ }
+ });
+ };
+
/**
* When the form is loaded, this function is called.
* Use it to retrieve form variables or initialize
diff --git a/web-ui/src/main/resources/catalog/locales/en-core.json b/web-ui/src/main/resources/catalog/locales/en-core.json
index 9e68593a273..f85b26d8d59 100644
--- a/web-ui/src/main/resources/catalog/locales/en-core.json
+++ b/web-ui/src/main/resources/catalog/locales/en-core.json
@@ -580,5 +580,9 @@
"reviewerNotAllowedPublish": "Reviewer not allowed to publish the metadata",
"reviewerNotAllowedUnpublish": "Reviewer not allowed to un-publish the metadata",
"reviewerNotAllowedPublishUnpublish": "Reviewer not allowed to publish / un-publish the metadata",
- "missingTitle": "Missing title"
+ "missingTitle": "Missing title",
+ "mapLegend": "Legend",
+ "quality": "Quality",
+ "download": "Download",
+ "links": "Links"
}
diff --git a/web-ui/src/main/resources/catalog/locales/en-editor.json b/web-ui/src/main/resources/catalog/locales/en-editor.json
index ebe4bb18463..ca1cd98e87e 100644
--- a/web-ui/src/main/resources/catalog/locales/en-editor.json
+++ b/web-ui/src/main/resources/catalog/locales/en-editor.json
@@ -22,7 +22,7 @@
"addLinks": "Add links",
"addOnlinesrc": "Add online resource",
"updateOnlinesrc": "Update link",
- "addOnlinesrcTitle": "Link an online resource",
+ "addOnlinesrcTitle": "New link",
"addThumbnail": "Add a thumbnail",
"addThumbnailTitle": "Add an overview to the current metadata",
"allChangesCanceled": "All changes cancelled.",
@@ -171,6 +171,8 @@
"linkToSourceTitle": "Link a source dataset to the current metadata",
"linkUrl": "URL to remove",
"fileStore": "Metadata file store",
+ "filestoreUploadAFile": "or upload a new file",
+ "filestoreChooseAFile": "or choose a file from the filestore",
"openResource": "Open resource",
"linkMetadata": "Link metadata",
"setResourceStatus": "Change resource status. This will not update references which may be contained in the metadata document.",
@@ -215,12 +217,12 @@
"onlineDiscoverArcGIS-help": "ArcGIS service URL to be used in desktop GIS or other app",
"onlineDiscoverKML": "View KML",
"onlineDiscoverKML-help": "KML or KMZ file to be used in Google apps to view data",
- "localNetwork": "Access the resource (local network)",
+ "localNetwork": "Download (local network)",
"localNetworkVectorFile": "Vector file",
"localNetworkRasterFile": "Raster file",
"localNetworkDBOracle": "Oracle",
"localNetworkDBPostgis": "PostGIS",
- "onlineDownload": "Access the resource",
+ "onlineDownload": "Download",
"onlineDownloadKML": "Download as KML",
"onlineDownloadKML-help": "KML or KMZ file to be used in Google apps to download data",
"onlineDownloadFile": "Download a copy",
@@ -429,5 +431,21 @@
"allowEditGroupMembers": "Allow group editors to edit",
"wmsSelectedLayers": "Selected layers",
"wmsSelectedLayersNone": "No layers selected",
- "remoteAssociatedMetadataTitlePlaceholder": "Remote associated metadata title"
+ "remoteAssociatedMetadataTitlePlaceholder": "Remote associated metadata title",
+ "distributionPanel": "Distributions",
+ "onlineDiscoverWMSTitle": "Link to a WMS service",
+ "onlineDiscoverArcGISTitle": "Link to an ESRI service",
+ "suggest-add-info-from-wms": "Update with view service info (bbox, crs, overview)",
+ "suggest-create-featurecatalogue-from-wfs": "Add or replace data model",
+ "wmsLayerName": "Layer name",
+ "addOnlinesrc#API": "Add API",
+ "addOnlinesrc#API-help": "eg. view service, REST API",
+ "addOnlinesrc#onlineDownload|localNetwork": "Add download",
+ "addOnlinesrc#onlineDownload|localNetwork-help": "eg. file, download service, local network links",
+ "addOnlinesrc#onlineUseLegend": "Add portrayal",
+ "addOnlinesrc#onlineUseLegend-help": "eg. LYR, QML, SLD files",
+ "addOnlinesrc#links": "Add links",
+ "addOnlinesrc#links-help": "eg. web links",
+ "addOnlinesrc#quality": "Add quality info",
+ "addOnlinesrc#quality-help": "eg. specification, reports"
}
diff --git a/web-ui/src/main/resources/catalog/locales/en-search.json b/web-ui/src/main/resources/catalog/locales/en-search.json
index 01e3e74844f..0822492f999 100644
--- a/web-ui/src/main/resources/catalog/locales/en-search.json
+++ b/web-ui/src/main/resources/catalog/locales/en-search.json
@@ -51,7 +51,6 @@
"displayHeatMap": "Show heatmap",
"removeFeatures": "Remove features",
"refresh": "Refresh",
- "mapLegend": "Legend",
"kmlFile": "{{layer}} (KML)",
"noRecordFoundWithResourceRegistered": "No record found with one or more WMS layers registered.",
"noRecordFoundWithResourceRegisteredmap": "No record found with one or more maps registered.",
@@ -138,7 +137,6 @@
"mapImportFailure": "Failed to import layer",
"recentChanges": "Recent changes",
"homeTitle": "Search for geodata and geoservices",
- "download": "Download",
"visualize": "View",
"template": "Template",
"valid": "Valid",
@@ -149,7 +147,6 @@
"unchecked": "Unchecked",
"createDate": "Created",
"changeDate": "Modified",
- "links": "Links",
"publish": "Publish",
"unpublish": "Unpublish",
"View": "View",
@@ -214,7 +211,7 @@
"revisionDate": "Revision date",
"tempExtentBegin": "Period",
"updateFrequency": "Update frequency",
- "quality": "Quality",
+
"lineage": "Lineage",
"identification": "Identification",
"metadata": "Metadata",
diff --git a/web-ui/src/main/resources/catalog/locales/en-v4.json b/web-ui/src/main/resources/catalog/locales/en-v4.json
index eeff4b00804..8c894c03911 100644
--- a/web-ui/src/main/resources/catalog/locales/en-v4.json
+++ b/web-ui/src/main/resources/catalog/locales/en-v4.json
@@ -31,6 +31,7 @@
"language.id": "Identifier",
"language.remove": "Remove language",
"layerName": "Layer name",
+ "layerNameTooltip": "A layer name from the GetCapabilities document",
"ogcServiceUrl": "Service URL",
"translation.addFor": "Add a new translation for",
"translation.add": "Add",
@@ -418,5 +419,8 @@
"associationType": "Association type",
"initiativeType": "Initiative type",
"associatedTo": "Associated ",
+ "overviewDescription": "Overview description",
+ "overviewUrl": "Overview URL",
+ "restApiUrl": "REST API URL",
"filterHelp": "Please click on one of the buttons below to activate the filter"
}
diff --git a/web-ui/src/main/resources/catalog/style/gn.less b/web-ui/src/main/resources/catalog/style/gn.less
index d7e136699f0..1e1bfa84b74 100644
--- a/web-ui/src/main/resources/catalog/style/gn.less
+++ b/web-ui/src/main/resources/catalog/style/gn.less
@@ -223,6 +223,9 @@ a {
word-wrap: break-word;
word-break: break-word;
}
+.gn-break-all {
+ word-break: break-all;
+}
/**
* Nav bar title may be longer than default
@@ -1575,6 +1578,9 @@ gn-indexing-task-status {
.flex-self-center {
align-self: center;
}
+.flex-self-right {
+ align-self: end;
+}
.flex-gap-5 {
gap: 5px;
}
diff --git a/web-ui/src/main/resources/catalog/views/default/less/gn_editor_default.less b/web-ui/src/main/resources/catalog/views/default/less/gn_editor_default.less
index 004457acf43..10b05f52a5a 100644
--- a/web-ui/src/main/resources/catalog/views/default/less/gn_editor_default.less
+++ b/web-ui/src/main/resources/catalog/views/default/less/gn_editor_default.less
@@ -2,7 +2,6 @@
@import "../../../style/gn_editor.less";
@import "gn_view.less";
-
.gn-results-editor {
.gn-status {
font-weight: 500;
@@ -99,8 +98,11 @@
// tabs above editor
.nav {
min-height: 42px;
+ margin-bottom: @gn-spacing;
}
- .nav .open > a, .nav .open > a:hover, .nav .open > a:focus {
+ .nav .open > a,
+ .nav .open > a:hover,
+ .nav .open > a:focus {
border-color: @panel-default-border;
}
div[data-gn-toggle] {
@@ -115,7 +117,12 @@
font-size: 12px;
font-weight: bold;
}
- input[type=text], input[type=number], select, textarea.form-control, .form-control, .bootstrap-tagsinput {
+ input[type="text"],
+ input[type="number"],
+ select,
+ textarea.form-control,
+ .form-control,
+ .bootstrap-tagsinput {
border-color: #ddd;
box-shadow: none;
outline: 0;
@@ -129,7 +136,8 @@
.btn {
border-radius: @gn-border-radius;
}
- .input-group-addon, .input-group-btn {
+ .input-group-addon,
+ .input-group-btn {
width: 0.1%;
}
@media (max-width: @screen-xs-max) {
@@ -153,8 +161,8 @@
background-position: right 50%;
background-repeat: no-repeat;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAMCAYAAABSgIzaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDZFNDEwNjlGNzFEMTFFMkJEQ0VDRTM1N0RCMzMyMkIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDZFNDEwNkFGNzFEMTFFMkJEQ0VDRTM1N0RCMzMyMkIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NkU0MTA2N0Y3MUQxMUUyQkRDRUNFMzU3REIzMzIyQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0NkU0MTA2OEY3MUQxMUUyQkRDRUNFMzU3REIzMzIyQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuGsgwQAAAA5SURBVHjaYvz//z8DOYCJgUxAf42MQIzTk0D/M+KzkRGPoQSdykiKJrBGpOhgJFYTWNEIiEeAAAMAzNENEOH+do8AAAAASUVORK5CYII=);
- padding: .5em;
- padding-right: 1.5em
+ padding: 0.5em;
+ padding-right: 1.5em;
}
fieldset {
padding: 0 0 5px 0;
@@ -186,7 +194,8 @@
content: "\f105";
}
table {
- .col-sm-2, .col-sm-9 {
+ .col-sm-2,
+ .col-sm-9 {
padding-right: 0;
padding-left: 0;
}
@@ -196,7 +205,8 @@
fieldset {
margin: 0 0 10px 0;
padding: 0;
- .col-sm-2, .col-sm-9 {
+ .col-sm-2,
+ .col-sm-9 {
padding-right: 15px;
padding-left: 15px;
}
@@ -237,7 +247,8 @@
}
// date and time
[data-gn-date-picker] {
- .col-sm-9, .col-sm-12 {
+ .col-sm-9,
+ .col-sm-12 {
padding-left: 2px;
padding-right: 0;
@media (max-width: @screen-xs-max) {
@@ -247,7 +258,8 @@
}
// default switch
[data-ng-switch-default] {
- .col-xs-8, .col-xs-4 {
+ .col-xs-8,
+ .col-xs-4 {
padding-left: 0;
padding-right: 0;
}
@@ -355,12 +367,16 @@
}
.gn-control {
padding-left: 0;
- .field-tooltip, [data-gn-field-highlight-remove] {
+ .field-tooltip,
+ [data-gn-field-highlight-remove] {
padding: 6px;
}
}
.gn-multi-field {
- label.gn-required:after, .gn-required > label:after, label.gn-mandatory:after, .gn-mandatory > label:after {
+ label.gn-required:after,
+ .gn-required > label:after,
+ label.gn-mandatory:after,
+ .gn-mandatory > label:after {
margin-top: -7px;
}
.col-sm-11 {
@@ -407,6 +423,46 @@
}
}
}
+ // for both sidebar and main
+ .onlinesrc-remove {
+ &:hover {
+ text-decoration: none;
+ }
+ }
+ .list-group-item {
+ padding: @gn-spacing;
+ }
+ #gn-editor-distribution-panel {
+ h2 {
+ font-size: 16px;
+ }
+ h3 {
+ display: inline-block;
+ font-size: 15px;
+ margin: @gn-spacing-sm @gn-spacing-sm 0px 0px;
+ a {
+ display: flex;
+ }
+ }
+ .list-group-item {
+ margin-top: -1px;
+ }
+ .alert {
+ margin-bottom: @gn-spacing-sm;
+ }
+ [data-gn-link-icon] {
+ display: inline-block;
+ color: #333;
+ strong {
+ display: flex;
+ .label {
+ display: inline-block;
+ }
+ }
+
+ }
+ }
+
}
// map for Editor and Batch Editor
.gn-drawmap-panel {
@@ -497,7 +553,8 @@ form.gn-editor.gn-label-above-input {
width: 65%;
}
// Cancel offset used in action
- .col-xs-offset-2, .col-md-offset-2 {
+ .col-xs-offset-2,
+ .col-md-offset-2 {
margin-left: 0px;
}
div.gn-extra-field > label {
@@ -588,31 +645,31 @@ form.gn-editor.gn-indent-bluescale {
fieldset {
margin: 10px 15px;
- border-left-color: ~'rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .9)';
+ border-left-color: ~"rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .9)";
legend {
padding-right: 11px;
font-size: 14px;
- border-left-color: ~'rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .9)';
+ border-left-color: ~"rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .9)";
}
fieldset {
- border-left-color: ~'rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .7)';
+ border-left-color: ~"rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .7)";
legend {
- border-left-color: ~'rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .7)';
+ border-left-color: ~"rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .7)";
}
fieldset {
- border-left-color: ~'rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .5)';
+ border-left-color: ~"rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .5)";
legend {
- border-left-color: ~'rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .5)';
+ border-left-color: ~"rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .5)";
}
fieldset {
- border-left-color: ~'rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .3)';
+ border-left-color: ~"rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .3)";
legend {
- border-left-color: ~'rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .3)';
+ border-left-color: ~"rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .3)";
}
fieldset {
- border-left-color: ~'rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .1)';
+ border-left-color: ~"rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .1)";
legend {
- border-left-color: ~'rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .1)';
+ border-left-color: ~"rgba(@{indent-color-r}, @{indent-color-g}, @{indent-color-b}, .1)";
}
}
}
@@ -625,7 +682,7 @@ form.gn-editor.gn-indent-bluescale {
// inspire
// md type widget (used only in editor for now)
.fa-inspire {
- background: url('../catalog/views/default/images/inspire.png');
+ background: url("../catalog/views/default/images/inspire.png");
background-repeat: no-repeat;
background-size: 16px 16px;
width: 16px;
@@ -633,6 +690,5 @@ form.gn-editor.gn-indent-bluescale {
margin-top: 3px;
&:before {
content: "";
-
}
}
diff --git a/web-ui/src/main/resources/catalog/views/default/templates/recordView/downloads.html b/web-ui/src/main/resources/catalog/views/default/templates/recordView/downloads.html
index 874b8ec67e9..b692f4ed290 100644
--- a/web-ui/src/main/resources/catalog/views/default/templates/recordView/downloads.html
+++ b/web-ui/src/main/resources/catalog/views/default/templates/recordView/downloads.html
@@ -1,7 +1,8 @@