diff --git a/web-ui/src/main/resources/catalog/components/search/formfields/FormFieldsDirective.js b/web-ui/src/main/resources/catalog/components/search/formfields/FormFieldsDirective.js index 2f3d2d49301..90816f60186 100644 --- a/web-ui/src/main/resources/catalog/components/search/formfields/FormFieldsDirective.js +++ b/web-ui/src/main/resources/catalog/components/search/formfields/FormFieldsDirective.js @@ -298,40 +298,47 @@ var optional = scope.optional != 'false' ? true : false; var setDefaultValue = attrs['setDefaultValue'] == 'false' ? false : true; scope.disabled = scope.disabled ? true : false; + scope.selectedGroup = null; + scope.$watch('selectedGroup', function(n, o) { + if (n && (n.hasOwnProperty('id') || n.hasOwnProperty('@id'))) { + scope.ownerGroup = scope.selectedGroup['@id'] || scope.selectedGroup.id; + } + }); $http.get(url, {cache: true}). - success(function(data) { - //data-ng-if is not correctly updating groups. - //So we do the filter here - if (scope.excludeSpecialGroups) { - scope.groups = []; - angular.forEach(data, function(g) { - if (g.id > 1) { - scope.groups.push(g); - } - }); - } else { - scope.groups = data; - } + success(function(data) { + //data-ng-if is not correctly updating groups. + //So we do the filter here + if (scope.excludeSpecialGroups) { + scope.groups = []; + angular.forEach(data, function(g) { + if (g.id > 1) { + scope.groups.push(g); + } + }); + } else { + scope.groups = data; + } - if (optional) { - scope.groups.unshift({ - id: 'undefined', - name: '' - }); - } + if (optional) { + scope.groups.unshift({ + id: undefined, + name: '' + }); + } - // Select by default the first group. - if (setDefaultValue && ( - angular.isUndefined(scope.ownerGroup) || - scope.ownerGroup === '' || - scope.ownerGroup === 'undefined' || - scope.ownerGroup === null) && data) { - // Requires to be converted to string, otherwise - // angularjs adds empty non valid option - scope.ownerGroup = scope.groups[0].id + ""; + if (angular.isNumber(scope.ownerGroup)) { + scope.selectedGroup = scope.groups.find(function(v) { + return v.id === scope.ownerGroup || v['@id'] === scope.ownerGroup + }); + + if (scope.selectedGroup === undefined) { + scope.selectedGroup = scope.groups[0]; } - }); + } else if (setDefaultValue) { + scope.selectedGroup = scope.groups[0]; + } + }); } }; }]) diff --git a/web-ui/src/main/resources/catalog/components/search/formfields/partials/groupsCombo.html b/web-ui/src/main/resources/catalog/components/search/formfields/partials/groupsCombo.html index cfdacaa85db..ed30168d0b3 100644 --- a/web-ui/src/main/resources/catalog/components/search/formfields/partials/groupsCombo.html +++ b/web-ui/src/main/resources/catalog/components/search/formfields/partials/groupsCombo.html @@ -1,8 +1,7 @@
-
diff --git a/web-ui/src/main/resources/catalog/components/utility/UtilityDirective.js b/web-ui/src/main/resources/catalog/components/utility/UtilityDirective.js index 2da583cdf5c..6d8ab87b76b 100644 --- a/web-ui/src/main/resources/catalog/components/utility/UtilityDirective.js +++ b/web-ui/src/main/resources/catalog/components/utility/UtilityDirective.js @@ -1738,4 +1738,41 @@ } }; }); + + /** + * Directive to display a metadata selector, that accepts a search object + * to filter the metadata to display in the selector. + */ + module.directive('gnMetadataSelector', [ + function() { + return { + restrict: 'A', + replace: true, + scope: { + uuid: '=gnMetadataSelector', // Model property with the metadata uuid selected + searchObj: '=', // ElasticSearch search object + md: '=', // Metadata object selected + elementName: '@' // Input element name for the uuid control + }, + templateUrl: '../../catalog/components/utility/' + + 'partials/metadataselector.html', + link: function(scope, element, attrs) { + scope.selectedMetadata = null; + + scope.searchObj.params = angular.extend({}, + scope.searchObj.defaultParams); + + scope.updateParams = function() { + scope.searchObj.params.any = scope.searchObj.any; + }; + + scope.selectMetadata = function(md) { + scope.selectedMetadata = md; + scope.uuid = md.uuid; + } + + } + }; + } + ]); })(); diff --git a/web-ui/src/main/resources/catalog/components/utility/partials/metadataselector.html b/web-ui/src/main/resources/catalog/components/utility/partials/metadataselector.html new file mode 100644 index 00000000000..0081b6a274f --- /dev/null +++ b/web-ui/src/main/resources/catalog/components/utility/partials/metadataselector.html @@ -0,0 +1,36 @@ +
+ +
diff --git a/web-ui/src/main/resources/catalog/js/admin/CSWSettingsController.js b/web-ui/src/main/resources/catalog/js/admin/CSWSettingsController.js index 4ccc15099a3..cf1433028ad 100644 --- a/web-ui/src/main/resources/catalog/js/admin/CSWSettingsController.js +++ b/web-ui/src/main/resources/catalog/js/admin/CSWSettingsController.js @@ -28,29 +28,6 @@ var module = angular.module('gn_csw_settings_controller', []); - - module.controller('GnCSWSearchServiceRecordController', [ - '$scope', 'gnGlobalSettings', - function($scope, gnGlobalSettings) { - $scope.searchObj = { - internal: true, - any: '', - defaultParams: { - any: '', - from: 1, - to: 50, - type: 'service', - sortBy: 'resourceTitleObject.default.keyword', - sortOrder: 'asc' - } - }; - $scope.searchObj.params = angular.extend({}, - $scope.searchObj.defaultParams); - $scope.updateParams = function() { - $scope.searchObj.params.any = $scope.searchObj.any; - }; - }]); - /** * GnCSWSettingsController provides management interface * for CSW settings. @@ -67,6 +44,19 @@ $scope.cswSettings = {}; $scope.cswServiceRecord = null; + $scope.serviceRecordSearchObj = { + internal: true, + any: '', + defaultParams: { + any: '', + from: 1, + to: 50, + type: 'service', + sortBy: 'resourceTitleObject.default.keyword', + sortOrder: 'asc' + } + }; + /** * CSW element set name (an array of xpath). */ diff --git a/web-ui/src/main/resources/catalog/js/admin/SourcesController.js b/web-ui/src/main/resources/catalog/js/admin/SourcesController.js index 1ecea67d8cf..a56661c7718 100644 --- a/web-ui/src/main/resources/catalog/js/admin/SourcesController.js +++ b/web-ui/src/main/resources/catalog/js/admin/SourcesController.js @@ -39,9 +39,23 @@ $scope.filter = { types: {'portal': true, 'subportal': true, 'externalportal': true, 'harvester': true} }; + + $scope.serviceRecordSearchObj = { + internal: true, + any: '', + defaultParams: { + any: '', + from: 1, + to: 50, + type: 'service', + sortBy: 'resourceTitleObject.default.keyword', + sortOrder: 'asc' + } + }; + $scope.selectSource = function(source) { source.uiConfig = source.uiConfig && source.uiConfig.toString(); - source.groupOwner = source.groupOwner != null ? source.groupOwner + '' : null; + source.groupOwner = source.groupOwner || null; $scope.source = source; }; diff --git a/web-ui/src/main/resources/catalog/js/admin/SystemSettingsController.js b/web-ui/src/main/resources/catalog/js/admin/SystemSettingsController.js index 0b5fc1174ac..5b3b8ec1433 100644 --- a/web-ui/src/main/resources/catalog/js/admin/SystemSettingsController.js +++ b/web-ui/src/main/resources/catalog/js/admin/SystemSettingsController.js @@ -89,8 +89,60 @@ module.controller('GnSystemSettingsController', [ '$scope', '$http', '$rootScope', '$translate', '$location', 'gnUtilityService', '$timeout', 'gnGlobalSettings', + 'gnConfig', 'gnESClient', 'Metadata', function($scope, $http, $rootScope, $translate, $location, - gnUtilityService, $timeout, gnGlobalSettings) { + gnUtilityService, $timeout, gnGlobalSettings, + gnConfig, gnESClient, Metadata) { + + $scope.selectTemplate = function (setting, md) { + setting.value = md.uuid; + $scope.defaultMetadataTemplate = md; + }; + + // Metadata template to select by default when + // creating new metadata + $scope.defaultMetadataTemplate = null; + + $scope.metadataTemplateSearchObj = { + internal: true, + any: '', + defaultParams: { + any: '', + from: 1, + to: 50, + isTemplate: 'y', + sortBy: 'resourceTitleObject.default.keyword', + sortOrder: 'asc' + } + }; + + function loadDefaultMetadataTemplate() { + var preferredTemplate = gnConfig['system.metadatacreate.preferredTemplate']; + + if (preferredTemplate){ + var query = + {"query": { + "term": { + "uuid": { + "value": preferredTemplate + } + } + }, "from": 0, "size": 1}; + + gnESClient.search(query).then(function(data) { + angular.forEach(data.hits.hits, function(record) { + var md = new Metadata(record); + $scope.defaultMetadataTemplate = md; + }); + }); + } + } + + $scope.$watchCollection('settings', function(n, o){ + if (n != o) { + loadDefaultMetadataTemplate(); + } + }); $scope.settings = []; $scope.initalSettings = []; diff --git a/web-ui/src/main/resources/catalog/js/edit/DirectoryController.js b/web-ui/src/main/resources/catalog/js/edit/DirectoryController.js index 8e771c287a7..9c1141b2eb8 100644 --- a/web-ui/src/main/resources/catalog/js/edit/DirectoryController.js +++ b/web-ui/src/main/resources/catalog/js/edit/DirectoryController.js @@ -62,6 +62,7 @@ 'gnMetadataActions', 'gnGlobalSettings', 'gnConfig', + 'gnConfigService', function($scope, $routeParams, $http, $rootScope, $translate, $compile, gnSearchManagerService, @@ -72,7 +73,8 @@ gnMetadataManager, gnMetadataActions, gnGlobalSettings, - gnConfig) { + gnConfig, + gnConfigService) { // option to allow only administrators // to validate a subtemplate @@ -93,7 +95,6 @@ $scope.mdList = null; $scope.activeType = null; $scope.activeEntry = null; - $scope.ownerGroup = null; $scope.defaultSearchObj = { selectionBucket: 'd101', configId: 'directory', @@ -154,6 +155,8 @@ var unknownType = 'unknownType'; var fullPrivileges = 'true'; + gnConfigService.load(); + $scope.selectType = function(type) { $scope.activeType = type; $scope.getEntries(type); @@ -166,12 +169,6 @@ $http.get('../api/groups?profile=Editor', {cache: true}). success(function(data) { $scope.groups = data; - // Select first user group with editor privileges. - // TODO: User should be able to select the group to put - // the entry in. - if ($scope.ownerGroup === null && data) { - $scope.ownerGroup = data[0]['id']; - } }); refreshEntriesInfo(); @@ -444,7 +441,7 @@ $scope.copyEntry = function(e) { //md.create?id=181&group=2&isTemplate=s&currTab=simple - gnMetadataManager.copy(e.id, $scope.ownerGroup, + gnMetadataManager.copy(e.id, $scope.importData.group, fullPrivileges, e.isTemplate === 't' ? 'TEMPLATE_OF_SUB_TEMPLATE' : 'SUB_TEMPLATE' ).then(refreshEntriesInfo); @@ -463,7 +460,7 @@ // conversion to template is done by duplicating into template type // the original entry is kept - gnMetadataManager.copy(e.id, $scope.ownerGroup, + gnMetadataManager.copy(e.id, $scope.importData.group, fullPrivileges, 'TEMPLATE_OF_SUB_TEMPLATE').then(refreshEntriesInfo); }; @@ -479,7 +476,7 @@ } // a copy of the template is created & opened - gnMetadataManager.copy(e.uuid, $scope.ownerGroup, + gnMetadataManager.copy(e.uuid, $scope.importData.group, fullPrivileges, 'SUB_TEMPLATE') .then(function(response) { @@ -522,6 +519,11 @@ }); }; + $scope.importData = { + metadataType: 'SUB_TEMPLATE', + group: null + }; + // begin creation of a new entry $scope.startImporting = function(asTemplate) { $scope.activeEntry = null; @@ -529,11 +531,10 @@ (asTemplate ? 'newTemplate' : 'newEntry'); // import data depends on type (template or entry) - $scope.importData = { - metadataType: asTemplate ? 'TEMPLATE_OF_SUB_TEMPLATE' : - 'SUB_TEMPLATE', - group: $scope.groups[0].id - }; + $scope.importData.metadataType = + asTemplate ? 'TEMPLATE_OF_SUB_TEMPLATE' : + 'SUB_TEMPLATE'; + $scope.importData.group = gnConfig['system.metadatacreate.preferredGroup']; }; // begin edition of an entry diff --git a/web-ui/src/main/resources/catalog/js/edit/ImportController.js b/web-ui/src/main/resources/catalog/js/edit/ImportController.js index d222a4b1379..8a8c4957b9a 100644 --- a/web-ui/src/main/resources/catalog/js/edit/ImportController.js +++ b/web-ui/src/main/resources/catalog/js/edit/ImportController.js @@ -46,8 +46,11 @@ '$scope', '$rootScope', 'gnMetadataManager', + 'gnConfigService', + 'gnConfig', '$window', - function($scope, $rootScope, gnMetadataManager, $window) { + function($scope, $rootScope, gnMetadataManager, + gnConfigService, gnConfig, $window) { $scope.importMode = 'uploadFile'; $scope.file_type = 'single'; $scope.queue = []; @@ -68,6 +71,10 @@ }; $scope.importing = false; + gnConfigService.load().then(function(c) { + $scope.params.group = gnConfig['system.metadatacreate.preferredGroup']; + }); + /** Upload management */ $scope.action = '../api/records'; var uploadImportMdDone = function(evt, data) { diff --git a/web-ui/src/main/resources/catalog/js/edit/NewMetadataController.js b/web-ui/src/main/resources/catalog/js/edit/NewMetadataController.js index c00f755f8dc..5b583f251f4 100644 --- a/web-ui/src/main/resources/catalog/js/edit/NewMetadataController.js +++ b/web-ui/src/main/resources/catalog/js/edit/NewMetadataController.js @@ -50,6 +50,7 @@ $scope.isTemplate = false; $scope.hasTemplates = true; $scope.mdList = null; + $scope.ownerGroup = null; // Used for the metadata identifier fields $scope.mdIdentifierTemplateTokens = {}; @@ -57,9 +58,10 @@ gnConfigService.load().then(function(c) { $scope.generateUuid = gnConfig['system.metadatacreate.generateUuid']; + $scope.ownerGroup = gnConfig['system.metadatacreate.preferredGroup']; + $scope.preferredTemplate = gnConfig['system.metadatacreate.preferredTemplate']; }); - // A map of icon to use for each types var icons = { featureCatalog: 'fa-table', @@ -76,6 +78,8 @@ var unknownType = 'unknownType'; var fullPrivileges = true; + // $scope.mdList, md.resourceType + $scope.getTypeIcon = function(type) { return icons[type] || 'fa-square-o'; }; @@ -116,26 +120,37 @@ // TODO: A faster option, could be to rely on facet type // But it may not be available for (var i = 0; i < $scope.mdList.length; i++) { - var type = $scope.mdList[i].resourceType || unknownType; - if (type instanceof Array) { - for (var j = 0; j < type.length; j++) { - if ($.inArray(type[j], dataTypesToExclude) === -1 && - $.inArray(type[j], types) === -1) { - types.push(type[j]); - } + var type = $scope.mdList[i].resourceType || [unknownType]; + for (var j = 0; j < type.length; j++) { + if ($.inArray(type[j], dataTypesToExclude) === -1 && + $.inArray(type[j], types) === -1) { + types.push(type[j]); } - } else if ($.inArray(type, dataTypesToExclude) === -1 && - $.inArray(type, types) === -1) { - types.push(type); } } types.sort(); $scope.mdTypes = types; + // Get default template and calculate the template type + var mdDefaultTemplate = _.find($scope.mdList, function(n) { + if (n._id == $scope.preferredTemplate) { + return true; + } + }); + + var templateToSelect = null; + if (mdDefaultTemplate) { + defaultType = mdDefaultTemplate.resourceType + .filter(function(i) { + return dataTypesToExclude.indexOf(i) === -1} + )[0] || unknownType; + templateToSelect = mdDefaultTemplate; + } + // Select the default one or the first one if (defaultType && $.inArray(defaultType, $scope.mdTypes) > -1) { - $scope.getTemplateNamesByType(defaultType); + $scope.getTemplateNamesByType(defaultType, templateToSelect); } else if ($scope.mdTypes[0]) { $scope.getTemplateNamesByType($scope.mdTypes[0]); } else { @@ -153,7 +168,7 @@ * Get all the templates for a given type. * Will put this list into $scope.tpls variable. */ - $scope.getTemplateNamesByType = function(type) { + $scope.getTemplateNamesByType = function(type, templateToSelect) { var tpls = []; for (var i = 0; i < $scope.mdList.length; i++) { var md = $scope.mdList[i]; @@ -178,8 +193,17 @@ tpls.sort(compare); $scope.tpls = tpls; + + var selectedTpl = $scope.tpls[0]; + if (templateToSelect) { + selectedTpl = _.find($scope.tpls, function(tpl) { + if (tpl._id == templateToSelect._id) { + return true; + } + }) + } $scope.activeType = type; - $scope.setActiveTpl($scope.tpls[0]); + $scope.setActiveTpl(selectedTpl); return false; }; diff --git a/web-ui/src/main/resources/catalog/locales/en-admin.json b/web-ui/src/main/resources/catalog/locales/en-admin.json index 158b06ac3f2..c97b1503ec0 100644 --- a/web-ui/src/main/resources/catalog/locales/en-admin.json +++ b/web-ui/src/main/resources/catalog/locales/en-admin.json @@ -871,6 +871,10 @@ "system/metadatacreate" : "Metadata create", "system/metadatacreate/generateUuid" : "Generate UUID", "system/metadatacreate/generateUuid-help" : "GeoNetwork assigns a random metadata UUID to the metadata created by a user (default). To assign the metadata UUID manually disable this option and fill the metadata UUID prefix.", + "system/metadatacreate/preferredGroup": "Preferred metadata group owner", + "system/metadatacreate/preferredGroup-help" : "Select the default group owner selected in the metadata creation page.", + "system/metadatacreate/preferredTemplate": "Preferred metadata template", + "system/metadatacreate/preferredTemplate-help" : "Select the default template selected in the metadata creation page.", "system/oai": "Open Archive Initiative (OAI-PMH) Provider", "system/oai/cachesize": "Cachesize", "system/oai/cachesize-help": "The number of OAI resultSets that can be stored in the Cache.", diff --git a/web-ui/src/main/resources/catalog/templates/admin/settings/csw.html b/web-ui/src/main/resources/catalog/templates/admin/settings/csw.html index 7ba525ebfed..ae6d58fbf0c 100644 --- a/web-ui/src/main/resources/catalog/templates/admin/settings/csw.html +++ b/web-ui/src/main/resources/catalog/templates/admin/settings/csw.html @@ -25,48 +25,19 @@

{{'system/csw/enable-help' | translate}}

-
+
- +
-

{{'system/csw/capabilityRecordUuid-help' | translate}}

+

{{'system/csw/capabilityRecordUuid-help' | translate}}

+