some actions by role
This commit is contained in:
parent
9099e62b9b
commit
33d9ae1470
|
@ -132,6 +132,18 @@ public class OrganizationController {
|
|||
}
|
||||
}
|
||||
|
||||
@GetMapping("/discard")
|
||||
public OrganizationView discardById(@RequestParam final String id, final Authentication authentication) {
|
||||
final Organization org = organizationRepository.findById(id).get();
|
||||
|
||||
if (UserInfo.isSuperAdmin(authentication) || UserInfo.isNationalAdmin(authentication) &&
|
||||
userCountryRepository.verifyAuthorizationForCountry(org.getCountry(), authentication.getName())) {
|
||||
return databaseUtils.markAsDiscarded(id, authentication.getName());
|
||||
} else {
|
||||
throw new RuntimeException("User not authorized");
|
||||
}
|
||||
}
|
||||
|
||||
@GetMapping("/conflicts")
|
||||
public List<OrganizationConflict> conflicts(@RequestParam final String id, final Authentication authentication) {
|
||||
if (UserInfo.isSuperAdmin(authentication) || userCountryRepository.verifyAuthorizationForId(id, authentication.getName())) {
|
||||
|
|
|
@ -359,6 +359,13 @@ public class DatabaseUtils {
|
|||
return organizationViewRepository.findById(id).get();
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public OrganizationView markAsDiscarded(final String id, final String user) {
|
||||
final OffsetDateTime now = OffsetDateTime.now();
|
||||
updateStatus(id, OrganizationStatus.discarded, user, now);
|
||||
return organizationViewRepository.findById(id).get();
|
||||
}
|
||||
|
||||
private void updateStatus(final String id, final OrganizationStatus status, final String user, final OffsetDateTime now) {
|
||||
organizationRepository.updateStatus(id, status.toString());
|
||||
organizationRepository.updateModificationDate(id, user, now);
|
||||
|
|
|
@ -2,9 +2,9 @@ package eu.dnetlib.organizations.utils;
|
|||
|
||||
public enum OrganizationStatus {
|
||||
suggested, // from user or dedup depends by created_by field
|
||||
approved,
|
||||
discarded,
|
||||
hidden,
|
||||
deleted,
|
||||
duplicate
|
||||
approved, // normal status of valid organizations
|
||||
discarded, // suggested organization that have been rejected by an administrator
|
||||
hidden, // hidden organizations after the fix of a conflict
|
||||
deleted, // organizations that are virtually deleted
|
||||
duplicate // organizations that duplicate of a valid organization (their id is not an openorgs id)
|
||||
}
|
||||
|
|
|
@ -13,23 +13,23 @@
|
|||
<li class="nav-item">
|
||||
<a href="javascript:void(0)" class="nav-link" ng-class="{'active': currentTab == 1}" ng-click="gotoTab(1)">Metadata Management</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<li class="nav-item" ng-show="org.status == 'approved'">
|
||||
<a href="javascript:void(0)" class="nav-link" ng-class="{'active': currentTab == 2}" ng-click="gotoTab(2)">Duplicates <span class="badge badge-danger ml-2" ng-if="info.nDuplicates > 0" title="{{info.nDuplicates}} duplicate(s) to validate">new</span></a>
|
||||
</li>
|
||||
<li class="nav-item" >
|
||||
<li class="nav-item" ng-show="org.status == 'approved'">
|
||||
<a href="javascript:void(0)" class="nav-link" ng-class="{'active': currentTab == 3}" ng-click="gotoTab(3)">Conflicts <span class="badge badge-danger ml-2" ng-if="info.nConflicts > 0" title="the current organization seems in conflict with {{info.nConflicts}} other(s)">new</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="card-body" ng-if="currentTab == 1 && org.status">
|
||||
<org-form-metadata org-id="{{orgId}}" org="org" vocabularies="vocabularies" info-method="getInfo()" mode="update_full" ng-if="adminMode && org.status == 'approved'"></org-form-metadata>
|
||||
<org-form-metadata org-id="{{orgId}}" org="org" vocabularies="vocabularies" info-method="getInfo()" mode="update_simple" ng-if="!adminMode && org.status == 'approved'"></org-form-metadata>
|
||||
<org-form-metadata org="org" vocabularies="vocabularies" info-method="getInfo()" mode="update_full" ng-if="adminMode && org.status == 'approved'"></org-form-metadata>
|
||||
<org-form-metadata org="org" vocabularies="vocabularies" info-method="getInfo()" mode="update_simple" ng-if="!adminMode && org.status == 'approved'"></org-form-metadata>
|
||||
|
||||
<org-form-metadata org-id="{{orgId}}" org="org" vocabularies="vocabularies" info-method="getInfo()" mode="approve" ng-if="adminMode && org.status == 'suggested'"></org-form-metadata>
|
||||
<org-form-metadata org-id="{{orgId}}" org="org" vocabularies="vocabularies" info-method="getInfo()" mode="not_authorized" ng-if="!adminMode && org.status == 'suggested'"></org-form-metadata>
|
||||
<org-form-metadata org="org" vocabularies="vocabularies" info-method="getInfo()" mode="approve" ng-if="adminMode && org.status == 'suggested'"></org-form-metadata>
|
||||
<org-form-metadata org="org" vocabularies="vocabularies" info-method="getInfo()" mode="not_authorized" ng-if="!adminMode && org.status == 'suggested'"></org-form-metadata>
|
||||
|
||||
<org-form-metadata org-id="{{orgId}}" org="org" vocabularies="vocabularies" info-method="getInfo()" mode="readonly" ng-if="org.status != 'approved' && org.status != 'suggested'"></org-form-metadata>
|
||||
<org-form-metadata org="org" vocabularies="vocabularies" info-method="getInfo()" mode="readonly" ng-if="org.status != 'approved' && org.status != 'suggested'"></org-form-metadata>
|
||||
|
||||
</div>
|
||||
|
||||
|
|
|
@ -16,14 +16,14 @@
|
|||
<div class="form-group">
|
||||
<div class="input-group input-group-sm">
|
||||
<div class="input-group-prepend">
|
||||
<div class="input-group-text text-white" ng-class="{'bg-primary' : mode != 'approve', 'bg-warning' : mode == 'approve'}">name</div>
|
||||
<div class="input-group-text bg-primary text-white" ng-class="{'bg-light text-dark' : mode == 'readonly' || mode == 'not_authorized', 'bg-warning' : mode == 'approve'}">name</div>
|
||||
</div>
|
||||
<input name="org_nm" type="text" class="form-control"
|
||||
placeholder="organization name..." ng-model="org.name"
|
||||
required="required"
|
||||
ng-class="{'is-invalid' : organizationForm.org_nm.$error.required}" />
|
||||
<div class="input-group-append input-group-prepend">
|
||||
<div class="input-group-text text-white" ng-class="{'bg-primary' : mode != 'approve', 'bg-warning' : mode == 'approve'}">type</div>
|
||||
<div class="input-group-text bg-primary text-white" ng-class="{'bg-light text-dark' : mode == 'readonly' || mode == 'not_authorized', 'bg-warning' : mode == 'approve'}">type</div>
|
||||
</div>
|
||||
<select name="org_tp" class="custom-select" ng-model="org.type"
|
||||
required="required"
|
||||
|
@ -40,12 +40,12 @@
|
|||
<div class="form-group">
|
||||
<div class="input-group input-group-sm">
|
||||
<div class="input-group-prepend">
|
||||
<div class="input-group-text text-white" ng-class="{'bg-primary' : mode != 'approve', 'bg-warning' : mode == 'approve'}">city</div>
|
||||
<div class="input-group-text bg-primary text-white" ng-class="{'bg-light text-dark' : mode == 'readonly' || mode == 'not_authorized', 'bg-warning' : mode == 'approve'}">city</div>
|
||||
</div>
|
||||
<input name="org_ct" type="text" class="form-control" placeholder=""
|
||||
ng-model="org.city" />
|
||||
<div class="input-group-append input-group-prepend">
|
||||
<div class="input-group-text text-white" ng-class="{'bg-primary' : mode != 'approve', 'bg-warning' : mode == 'approve'}">country</div>
|
||||
<div class="input-group-text bg-primary text-white" ng-class="{'bg-light text-dark' : mode == 'readonly' || mode == 'not_authorized', 'bg-warning' : mode == 'approve'}">country</div>
|
||||
</div>
|
||||
|
||||
<select name="org_cntr" class="custom-select" ng-model="org.country"
|
||||
|
@ -55,12 +55,12 @@
|
|||
<option ng-repeat="c in vocabularies.countries"value="{{c.value}}">{{c.name}}</option>
|
||||
</select>
|
||||
<div class="input-group-append input-group-prepend">
|
||||
<div class="input-group-text text-white" ng-class="{'bg-primary' : mode != 'approve', 'bg-warning' : mode == 'approve'}">lat</div>
|
||||
<div class="input-group-text bg-primary text-white" ng-class="{'bg-light text-dark' : mode == 'readonly' || mode == 'not_authorized', 'bg-warning' : mode == 'approve'}">lat</div>
|
||||
</div>
|
||||
<input name="org_lat" type="text" class="form-control"
|
||||
placeholder="0.0" ng-model="org.lat" />
|
||||
<div class="input-group-append input-group-prepend">
|
||||
<div class="input-group-text text-white" ng-class="{'bg-primary' : mode != 'approve', 'bg-warning' : mode == 'approve'}">lng</div>
|
||||
<div class="input-group-text bg-primary text-white" ng-class="{'bg-light text-dark' : mode == 'readonly' || mode == 'not_authorized', 'bg-warning' : mode == 'approve'}">lng</div>
|
||||
</div>
|
||||
<input name="org_lng" type="text" class="form-control"
|
||||
placeholder="0.0" ng-model="org.lng" />
|
||||
|
@ -74,7 +74,7 @@
|
|||
<div class="form-group row">
|
||||
<div class="col-lg-8 mb-2">
|
||||
<div class="card">
|
||||
<div class="card-header text-white text-center py-1" ng-class="{'bg-primary' : mode != 'approve', 'bg-warning' : mode == 'approve'}">Acronyms</div>
|
||||
<div class="card-header text-white text-center py-1 bg-primary" ng-class="{'bg-light text-dark' : mode == 'readonly' || mode == 'not_authorized', 'bg-warning' : mode == 'approve'}">Acronyms</div>
|
||||
<table class="table table-sm">
|
||||
<tbody>
|
||||
<tr ng-repeat="a in org.acronyms">
|
||||
|
@ -108,7 +108,7 @@
|
|||
<div class="form-group row">
|
||||
<div class="col-lg-8 mb-2">
|
||||
<div class="card">
|
||||
<div class="card-header text-white text-center py-1" ng-class="{'bg-primary' : mode != 'approve', 'bg-warning' : mode == 'approve'}">Aliases</div>
|
||||
<div class="card-header text-white text-center py-1 bg-primary" ng-class="{'bg-light text-dark' : mode == 'readonly' || mode == 'not_authorized', 'bg-warning' : mode == 'approve'}">Aliases</div>
|
||||
<table class="table table-sm">
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
|
@ -155,7 +155,7 @@
|
|||
<div class="form-group row">
|
||||
<div class="col-lg-8 mb-2">
|
||||
<div class="card">
|
||||
<div class="card-header text-white text-center py-1" ng-class="{'bg-primary' : mode != 'approve', 'bg-warning' : mode == 'approve'}">Identifiers</div>
|
||||
<div class="card-header text-white text-center py-1 bg-primary" ng-class="{'bg-light text-dark' : mode == 'readonly' || mode == 'not_authorized', 'bg-warning' : mode == 'approve'}">Identifiers</div>
|
||||
<table class="table table-sm">
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
|
@ -202,7 +202,7 @@
|
|||
<div class="form-group row">
|
||||
<div class="col-lg-8 mb-2">
|
||||
<div class="card">
|
||||
<div class="card-header text-white text-center py-1" ng-class="{'bg-primary' : mode != 'approve', 'bg-warning' : mode == 'approve'}">Urls</div>
|
||||
<div class="card-header text-white text-center py-1 bg-primary" ng-class="{'bg-light text-dark' : mode == 'readonly' || mode == 'not_authorized', 'bg-warning' : mode == 'approve'}">Urls</div>
|
||||
<table class="table table-sm">
|
||||
<tbody>
|
||||
<tr ng-repeat="u in org.urls">
|
||||
|
@ -239,7 +239,7 @@
|
|||
<div class="form-group row">
|
||||
<div class="col-lg-8 mb-2">
|
||||
<div class="card">
|
||||
<div class="card-header text-white text-center py-1" ng-class="{'bg-primary' : mode != 'approve', 'bg-warning' : mode == 'approve'}">Relations</div>
|
||||
<div class="card-header text-white text-center py-1 bg-primary" ng-class="{'bg-light text-dark' : mode == 'readonly' || mode == 'not_authorized', 'bg-warning' : mode == 'approve'}">Relations</div>
|
||||
<table class="table table-sm">
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
|
|
|
@ -123,7 +123,6 @@ orgsModule.directive('orgFormMetadata', function($http, $location, $route, $rout
|
|||
return {
|
||||
restrict: 'E',
|
||||
scope: {
|
||||
'orgId' : '@',
|
||||
'org' : '=',
|
||||
'vocabularies' : '=',
|
||||
'mode' : '@', // insert_full, insert_pending, update_simple, update_full, approve, readonly, not_authorized
|
||||
|
@ -161,8 +160,36 @@ orgsModule.directive('orgFormMetadata', function($http, $location, $route, $rout
|
|||
});
|
||||
}
|
||||
|
||||
scope.deleteOrg = function() { alert('TODO'); };
|
||||
scope.saveAsDiscarded = function() { alert('TODO'); };
|
||||
scope.deleteOrg = function() {
|
||||
if (confirm("Are you sure?")) {
|
||||
$http.get('api/organizations/delete?id=' + scope.org.id).then(function successCallback(res) {
|
||||
if ((typeof res.data) == 'string') {
|
||||
alert("Session expired !");
|
||||
location.reload(true);
|
||||
} else {
|
||||
alert("Organization marked as deleted !!!");
|
||||
$route.reload();
|
||||
}
|
||||
}, function errorCallback(res) {
|
||||
alert('ERROR: ' + res.data.error + ' (' + res.data.message + ')');
|
||||
});
|
||||
}
|
||||
};
|
||||
scope.saveAsDiscarded = function() {
|
||||
if (confirm("Are you sure?")) {
|
||||
$http.get('api/organizations/discard?id=' + scope.org.id).then(function successCallback(res) {
|
||||
if ((typeof res.data) == 'string') {
|
||||
alert("Session expired !");
|
||||
location.reload(true);
|
||||
} else {
|
||||
alert("Organization marked as deleted !!!");
|
||||
$route.reload();
|
||||
}
|
||||
}, function errorCallback(res) {
|
||||
alert('ERROR: ' + res.data.error + ' (' + res.data.message + ')');
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue