Revision 57607
Added by Michele Artini over 4 years ago
modules/dnet-orgs-database-application/trunk/src/main/java/eu/dnetlib/organizations/repository/readonly/WarningViewRepository.java | ||
---|---|---|
1 |
package eu.dnetlib.organizations.repository.readonly; |
|
2 |
|
|
3 |
import org.springframework.stereotype.Repository; |
|
4 |
|
|
5 |
import eu.dnetlib.organizations.model.view.WarningView; |
|
6 |
import eu.dnetlib.organizations.model.view.WarningViewPK; |
|
7 |
|
|
8 |
@Repository |
|
9 |
public interface WarningViewRepository extends ReadOnlyRepository<WarningView, WarningViewPK> { |
|
10 |
|
|
11 |
} |
modules/dnet-orgs-database-application/trunk/src/main/java/eu/dnetlib/organizations/model/view/WarningView.java | ||
---|---|---|
1 |
package eu.dnetlib.organizations.model.view; |
|
2 |
|
|
3 |
import java.io.Serializable; |
|
4 |
|
|
5 |
import javax.persistence.Column; |
|
6 |
import javax.persistence.Entity; |
|
7 |
import javax.persistence.Id; |
|
8 |
import javax.persistence.IdClass; |
|
9 |
import javax.persistence.Table; |
|
10 |
|
|
11 |
@Entity |
|
12 |
@Table(name = "warnings_view") |
|
13 |
@IdClass(WarningViewPK.class) |
|
14 |
public class WarningView implements Serializable { |
|
15 |
|
|
16 |
/** |
|
17 |
* |
|
18 |
*/ |
|
19 |
private static final long serialVersionUID = -6621501199394187765L; |
|
20 |
|
|
21 |
@Id |
|
22 |
@Column(name = "id_1") |
|
23 |
private String id1; |
|
24 |
|
|
25 |
@Id |
|
26 |
@Column(name = "id_2") |
|
27 |
private String id2; |
|
28 |
|
|
29 |
@Column(name = "name_1") |
|
30 |
private String name1; |
|
31 |
|
|
32 |
@Column(name = "name_2") |
|
33 |
private String name2; |
|
34 |
|
|
35 |
@Column(name = "type_1") |
|
36 |
private String type1; |
|
37 |
|
|
38 |
@Column(name = "type_2") |
|
39 |
private String type2; |
|
40 |
|
|
41 |
@Column(name = "city_1") |
|
42 |
private String city1; |
|
43 |
|
|
44 |
@Column(name = "city_2") |
|
45 |
private String city2; |
|
46 |
|
|
47 |
@Column(name = "country_1") |
|
48 |
private String country1; |
|
49 |
|
|
50 |
@Column(name = "country_2") |
|
51 |
private String country2; |
|
52 |
|
|
53 |
public String getId1() { |
|
54 |
return id1; |
|
55 |
} |
|
56 |
|
|
57 |
public void setId1(final String id1) { |
|
58 |
this.id1 = id1; |
|
59 |
} |
|
60 |
|
|
61 |
public String getId2() { |
|
62 |
return id2; |
|
63 |
} |
|
64 |
|
|
65 |
public void setId2(final String id2) { |
|
66 |
this.id2 = id2; |
|
67 |
} |
|
68 |
|
|
69 |
public String getName1() { |
|
70 |
return name1; |
|
71 |
} |
|
72 |
|
|
73 |
public void setName1(final String name1) { |
|
74 |
this.name1 = name1; |
|
75 |
} |
|
76 |
|
|
77 |
public String getName2() { |
|
78 |
return name2; |
|
79 |
} |
|
80 |
|
|
81 |
public void setName2(final String name2) { |
|
82 |
this.name2 = name2; |
|
83 |
} |
|
84 |
|
|
85 |
public String getType1() { |
|
86 |
return type1; |
|
87 |
} |
|
88 |
|
|
89 |
public void setType1(final String type1) { |
|
90 |
this.type1 = type1; |
|
91 |
} |
|
92 |
|
|
93 |
public String getType2() { |
|
94 |
return type2; |
|
95 |
} |
|
96 |
|
|
97 |
public void setType2(final String type2) { |
|
98 |
this.type2 = type2; |
|
99 |
} |
|
100 |
|
|
101 |
public String getCity1() { |
|
102 |
return city1; |
|
103 |
} |
|
104 |
|
|
105 |
public void setCity1(final String city1) { |
|
106 |
this.city1 = city1; |
|
107 |
} |
|
108 |
|
|
109 |
public String getCity2() { |
|
110 |
return city2; |
|
111 |
} |
|
112 |
|
|
113 |
public void setCity2(final String city2) { |
|
114 |
this.city2 = city2; |
|
115 |
} |
|
116 |
|
|
117 |
public String getCountry1() { |
|
118 |
return country1; |
|
119 |
} |
|
120 |
|
|
121 |
public void setCountry1(final String country1) { |
|
122 |
this.country1 = country1; |
|
123 |
} |
|
124 |
|
|
125 |
public String getCountry2() { |
|
126 |
return country2; |
|
127 |
} |
|
128 |
|
|
129 |
public void setCountry2(final String country2) { |
|
130 |
this.country2 = country2; |
|
131 |
} |
|
132 |
|
|
133 |
} |
modules/dnet-orgs-database-application/trunk/src/main/java/eu/dnetlib/organizations/model/view/WarningViewPK.java | ||
---|---|---|
1 |
package eu.dnetlib.organizations.model.view; |
|
2 |
|
|
3 |
import java.io.Serializable; |
|
4 |
import java.util.Objects; |
|
5 |
|
|
6 |
public class WarningViewPK implements Serializable { |
|
7 |
|
|
8 |
/** |
|
9 |
* |
|
10 |
*/ |
|
11 |
private static final long serialVersionUID = -4702103726315884367L; |
|
12 |
|
|
13 |
private String id1; |
|
14 |
|
|
15 |
private String id2; |
|
16 |
|
|
17 |
public String getId1() { |
|
18 |
return id1; |
|
19 |
} |
|
20 |
|
|
21 |
public void setId1(final String id1) { |
|
22 |
this.id1 = id1; |
|
23 |
} |
|
24 |
|
|
25 |
public String getId2() { |
|
26 |
return id2; |
|
27 |
} |
|
28 |
|
|
29 |
public void setId2(final String id2) { |
|
30 |
this.id2 = id2; |
|
31 |
} |
|
32 |
|
|
33 |
@Override |
|
34 |
public int hashCode() { |
|
35 |
return Objects.hash(id1, id2); |
|
36 |
} |
|
37 |
|
|
38 |
@Override |
|
39 |
public boolean equals(final Object obj) { |
|
40 |
if (this == obj) { return true; } |
|
41 |
if (obj == null) { return false; } |
|
42 |
if (!(obj instanceof WarningViewPK)) { return false; } |
|
43 |
final WarningViewPK other = (WarningViewPK) obj; |
|
44 |
return Objects.equals(id1, other.id1) && Objects.equals(id2, other.id2); |
|
45 |
} |
|
46 |
|
|
47 |
@Override |
|
48 |
public String toString() { |
|
49 |
return String.format("WarningViewPK [id1=%s, id2=%s]", id1, id2); |
|
50 |
} |
|
51 |
} |
modules/dnet-orgs-database-application/trunk/src/main/java/eu/dnetlib/organizations/utils/OpenOrgsConstants.java | ||
---|---|---|
6 | 6 |
public static final String superUserRole = "SUPERUSER"; |
7 | 7 |
public static final String pendingRole = "PENDING"; |
8 | 8 |
|
9 |
public static final String OPENORGS_PREFIX = "openorgs____::"; |
|
10 |
public static final String OPENORGS_MESH_PREFIX = "openorgsmesh::"; |
|
11 |
|
|
9 | 12 |
} |
modules/dnet-orgs-database-application/trunk/src/main/java/eu/dnetlib/organizations/controller/OrganizationController.java | ||
---|---|---|
2 | 2 |
|
3 | 3 |
import java.util.Arrays; |
4 | 4 |
import java.util.List; |
5 |
import java.util.stream.Collectors; |
|
5 | 6 |
|
6 | 7 |
import org.apache.commons.lang3.StringUtils; |
7 | 8 |
import org.springframework.beans.factory.annotation.Autowired; |
... | ... | |
20 | 21 |
import eu.dnetlib.organizations.model.utils.RelationByOrg; |
21 | 22 |
import eu.dnetlib.organizations.model.view.OrganizationSimpleView; |
22 | 23 |
import eu.dnetlib.organizations.model.view.OrganizationView; |
24 |
import eu.dnetlib.organizations.model.view.WarningView; |
|
23 | 25 |
import eu.dnetlib.organizations.repository.OpenaireSimRelRepository; |
24 | 26 |
import eu.dnetlib.organizations.repository.OrganizationRepository; |
25 | 27 |
import eu.dnetlib.organizations.repository.readonly.OrganizationSimpleViewRepository; |
26 | 28 |
import eu.dnetlib.organizations.repository.readonly.OrganizationViewRepository; |
29 |
import eu.dnetlib.organizations.repository.readonly.WarningViewRepository; |
|
27 | 30 |
import eu.dnetlib.organizations.utils.DatabaseUtils; |
31 |
import eu.dnetlib.organizations.utils.OpenOrgsConstants; |
|
28 | 32 |
import eu.dnetlib.organizations.utils.RelationType; |
29 | 33 |
|
30 | 34 |
@RestController |
... | ... | |
40 | 44 |
@Autowired |
41 | 45 |
private OpenaireSimRelRepository openaireSimRelRepository; |
42 | 46 |
@Autowired |
47 |
private WarningViewRepository warningViewRepository; |
|
48 |
@Autowired |
|
43 | 49 |
private DatabaseUtils databaseUtils; |
44 | 50 |
|
45 | 51 |
@RequestMapping(value = "/save", method = RequestMethod.POST) |
... | ... | |
121 | 127 |
@RequestMapping(value = "/similarities", method = RequestMethod.GET) |
122 | 128 |
public List<OpenaireSimRel> findSimilaritiesById(@RequestParam final String id, final Authentication authentication) { |
123 | 129 |
if (UserInfo.isSuperUser(authentication) || organizationRepository.verifyAuthorizationForId(id, authentication.getName())) { |
124 |
return openaireSimRelRepository.findByLocalId(id); |
|
130 |
return openaireSimRelRepository.findByLocalId(id).stream().filter(s -> !s.getOaOriginalId().startsWith(OpenOrgsConstants.OPENORGS_PREFIX)).collect(Collectors.toList());
|
|
125 | 131 |
} else { |
126 | 132 |
throw new RuntimeException("User not authorized"); |
127 | 133 |
} |
128 | 134 |
} |
129 | 135 |
|
136 |
@RequestMapping(value = "/warnings", method = RequestMethod.GET) |
|
137 |
public Iterable<WarningView> findWarningsById(final Authentication authentication) { |
|
138 |
if (UserInfo.isSuperUser(authentication)) { |
|
139 |
return warningViewRepository.findAll(); |
|
140 |
} else { |
|
141 |
throw new RuntimeException("User not authorized"); |
|
142 |
} |
|
143 |
} |
|
144 |
|
|
130 | 145 |
@RequestMapping(value = "/similarities", method = RequestMethod.POST) |
131 | 146 |
public List<OpenaireSimRel> saveSimilarities(@RequestBody final List<OpenaireSimRel> simrels, final Authentication authentication) { |
132 | 147 |
|
133 |
final boolean b = UserInfo.isSuperUser(authentication) || simrels.stream() |
|
134 |
.map(OpenaireSimRel::getLocalId) |
|
135 |
.distinct() |
|
136 |
.allMatch(id -> organizationRepository.verifyAuthorizationForId(id, authentication.getName())); |
|
148 |
final boolean b = UserInfo.isSuperUser(authentication) |
|
149 |
|| simrels.stream().map(OpenaireSimRel::getLocalId).distinct().allMatch(id -> organizationRepository.verifyAuthorizationForId(id, authentication.getName())); |
|
137 | 150 |
|
138 | 151 |
if (b) { |
139 | 152 |
return openaireSimRelRepository.saveAll(simrels); |
modules/dnet-orgs-database-application/trunk/src/main/resources/sql/schema.sql | ||
---|---|---|
1 | 1 |
DROP VIEW organizations_view; |
2 | 2 |
DROP VIEW organizations_simple_view; |
3 | 3 |
DROP VIEW users_view; |
4 |
DROP VIEW warnings_view; |
|
4 | 5 |
|
5 | 6 |
DROP TABLE IF EXISTS other_ids; |
6 | 7 |
DROP TABLE IF EXISTS other_names; |
... | ... | |
195 | 196 |
GROUP BY u.email, u.valid, u.role |
196 | 197 |
ORDER BY u.email; |
197 | 198 |
|
199 |
CREATE VIEW warnings_view AS SELECT |
|
200 |
o1.id AS id_1, |
|
201 |
o1.name AS name_1, |
|
202 |
o1.type AS type_1, |
|
203 |
o1.city AS city_1, |
|
204 |
o1.country AS country_1, |
|
205 |
o2.id AS id_2, |
|
206 |
o2.name AS name_2, |
|
207 |
o2.type AS type_2, |
|
208 |
o2.city AS city_2, |
|
209 |
o2.country AS country_2 |
|
210 |
FROM |
|
211 |
openaire_simrels s |
|
212 |
LEFT OUTER JOIN organizations o1 ON (s.local_id = o1.id) |
|
213 |
LEFT OUTER JOIN organizations o2 ON (s.oa_original_id = o2.id) |
|
214 |
WHERE |
|
215 |
s.oa_original_id LIKE 'openorgs____::%' AND o1.id IS NOT NULL AND O2.id IS NOT NULL; |
|
216 |
|
|
198 | 217 |
|
218 |
|
|
199 | 219 |
|
modules/dnet-orgs-database-application/trunk/src/main/resources/static/resources/html/similarities.html | ||
---|---|---|
1 |
<p class="muted"><b>ID: </b>{{orgId}}</p> |
|
1 |
<div class="row" style="height: 5em"> |
|
2 |
<div class="col-xl-8 col-lg-10"> |
|
3 |
<p class="muted"><b>ID: </b>{{orgId}}</p> |
|
4 |
</div> |
|
5 |
</div> |
|
2 | 6 |
|
3 | 7 |
<div class="row"> |
4 |
<div class="col-xl-8 col-lg-10">
|
|
8 |
<div class="col-xl-10"> |
|
5 | 9 |
<div class="card"> |
6 | 10 |
<div class="card-header"> |
7 | 11 |
<ul class="nav nav-tabs card-header-tabs"> |
... | ... | |
9 | 13 |
<a href="#!/metadata/0/{{orgId}}" class="nav-link">Metadata</a> |
10 | 14 |
</li> |
11 | 15 |
<li class="nav-item"> |
12 |
<a href="#!/relations/{{orgId}}" class="nav-link" href="#">Relations</a>
|
|
16 |
<a href="#!/relations/{{orgId}}" class="nav-link">Relations</a> |
|
13 | 17 |
</li> |
14 | 18 |
<li class="nav-item"> |
15 |
<a href="javascript:void(0)" class="nav-link active" href="#">Similarities</a>
|
|
19 |
<a href="javascript:void(0)" class="nav-link active">Similarities</a> |
|
16 | 20 |
</li> |
17 | 21 |
</ul> |
18 | 22 |
</div> |
... | ... | |
26 | 30 |
<tr> |
27 | 31 |
<th class="pl-3" style="border-top: none;">Related organization</th> |
28 | 32 |
<th class="text-center" style="border-top: none;">Acronym</th> |
29 |
<th class="text-center" style="border-top: none;">Original ID</th> |
|
30 | 33 |
<th class="text-center" style="border-top: none;">Country</th> |
31 |
<th class="text-center" style="border-top: none;">Collected from</th>
|
|
34 |
<th style="border-top: none;">Source</th>
|
|
32 | 35 |
<th style="border-top: none;"></th> |
33 | 36 |
</tr> |
34 | 37 |
</thead> |
... | ... | |
39 | 42 |
<span class="small" ng-if="sr.oaUrl" ><br /><b>URL: </b><a href="{{sr.oaUrl}}" target="_blank">{{sr.oaUrl}}</a></span> |
40 | 43 |
</td> |
41 | 44 |
<td class="text-center small">{{sr.oaAcronym}}</td> |
42 |
<td class="text-center small">{{sr.oaOriginalId}}</td> |
|
43 |
<td class="text-center small">{{sr.oaCountry}}</td> |
|
44 |
<td class="text-center small">{{sr.oaCollectedFrom}}</td> |
|
45 |
<td class="text-center small"><img ng-src="resources/images/flags/{{sr.oaCountry}}.gif" /> {{sr.oaCountry}}</td> |
|
46 |
<td class="small"> |
|
47 |
<b>Collected from:</b> {{sr.oaCollectedFrom}}<br /> |
|
48 |
<b>Original Id:</b> <span class="text-monospace">{{sr.oaOriginalId}}</span> |
|
49 |
</td> |
|
45 | 50 |
<td class="text-right"> |
46 |
<div class="btn-group btn-group-sm btn-group-toggle" data-toggle="buttons">
|
|
51 |
<div class="btn-group btn-group-toggle btn-group-sm" data-toggle="buttons">
|
|
47 | 52 |
<label class="btn" ng-class="{'btn-danger' : sr.relType == 'is_different', 'btn-outline-danger' : sr.relType != 'is_different'}"> |
48 |
<input type="radio" autocomplete="off" ng-model="sr.relType" value="is_different" ng-class="{'active' : sr.relType == 'is_different'}"> different
|
|
53 |
<input type="radio" autocomplete="off" ng-model="sr.relType" value="is_different" ng-class="{'active' : sr.relType == 'is_different'}"><i class="fas fa-times fa-fw"></i>
|
|
49 | 54 |
</label> |
50 | 55 |
<label class="btn" ng-class="{'btn-info' : sr.relType == 'suggested', 'btn-outline-info' : sr.relType != 'suggested'}"> |
51 |
<input type="radio" autocomplete="off" ng-model="sr.relType" value="suggested" ng-class="{'active' : sr.relType == 'suggested'}"> suggested
|
|
56 |
<input type="radio" autocomplete="off" ng-model="sr.relType" value="suggested" ng-class="{'active' : sr.relType == 'suggested'}"><i class="fas fa-question fa-fw"></i>
|
|
52 | 57 |
</label> |
53 | 58 |
<label class="btn" ng-class="{'btn-success' : sr.relType == 'is_similar', 'btn-outline-success' : sr.relType != 'is_similar'}"> |
54 |
<input type="radio" autocomplete="off" ng-model="sr.relType" value="is_similar" ng-class="{'active' : sr.relType == 'is_similar'}"/> similar
|
|
59 |
<input type="radio" autocomplete="off" ng-model="sr.relType" value="is_similar" ng-class="{'active' : sr.relType == 'is_similar'}"/><i class="fas fa-check fa-fw"></i>
|
|
55 | 60 |
</label> |
56 | 61 |
</div> |
57 | 62 |
</td> |
modules/dnet-orgs-database-application/trunk/src/main/resources/static/resources/html/relations.html | ||
---|---|---|
1 |
<p class="muted"><b>ID: </b>{{orgId}}</p> |
|
1 |
<div class="row" style="height: 5em"> |
|
2 |
<div class="col-xl-8 col-lg-10"> |
|
3 |
<p class="muted"><b>ID: </b>{{orgId}}</p> |
|
4 |
</div> |
|
5 |
</div> |
|
2 | 6 |
|
3 | 7 |
<div class="row"> |
4 | 8 |
<div class="col-xl-8 col-lg-10"> |
... | ... | |
9 | 13 |
<a href="#!/metadata/0/{{orgId}}" class="nav-link">Metadata</a> |
10 | 14 |
</li> |
11 | 15 |
<li class="nav-item"> |
12 |
<a href="javascript:void(0)" class="nav-link active" href="#">Relations</a>
|
|
16 |
<a href="javascript:void(0)" class="nav-link active">Relations</a> |
|
13 | 17 |
</li> |
14 | 18 |
<li class="nav-item"> |
15 |
<a href="#!/similarities/{{orgId}}" class="nav-link" href="#">Similarities</a>
|
|
19 |
<a href="#!/similarities/{{orgId}}" class="nav-link">Similarities</a> |
|
16 | 20 |
</li> |
17 | 21 |
</ul> |
18 | 22 |
</div> |
modules/dnet-orgs-database-application/trunk/src/main/resources/static/resources/html/edit.html | ||
---|---|---|
18 | 18 |
<a href="javascript:void(0)" class="nav-link active">Metadata</a> |
19 | 19 |
</li> |
20 | 20 |
<li class="nav-item" ng-if="orgId"> |
21 |
<a href="#!/relations/{{orgId}}" class="nav-link" href="#">Relations</a>
|
|
21 |
<a href="#!/relations/{{orgId}}" class="nav-link">Relations</a> |
|
22 | 22 |
</li> |
23 | 23 |
<li class="nav-item" ng-if="orgId"> |
24 |
<a href="#!/similarities/{{orgId}}" class="nav-link" href="#">Similarities</a>
|
|
24 |
<a href="#!/similarities/{{orgId}}" class="nav-link">Similarities</a> |
|
25 | 25 |
</li> |
26 | 26 |
</ul> |
27 | 27 |
</div> |
modules/dnet-orgs-database-application/trunk/src/main/resources/static/resources/html/warnings.html | ||
---|---|---|
1 |
<h3>{{warnings.length}} warning(s)</h3> |
|
2 |
|
|
3 |
<table class="table table-sm" ng-if="warnings.length > 0"> |
|
4 |
<thead class="thead-light"> |
|
5 |
<tr> |
|
6 |
<th style="width:40px"></th> |
|
7 |
<th>Organization name</th> |
|
8 |
<th style="width:180px">Place</th> |
|
9 |
<th style="width:80px">Type</th> |
|
10 |
</tr> |
|
11 |
</thead> |
|
12 |
<tbody ng-repeat="w in warnings" class="mb-2"> |
|
13 |
<tr> |
|
14 |
<th class="text-center">#1</th> |
|
15 |
<td><a href="#!/metadata/0/{{w.id1}}" title="{{w.id1}}">{{w.name1}}</a></td> |
|
16 |
<td><img ng-src="resources/images/flags/{{w.country1}}.gif" /> {{w.city1}}, {{w.country1}}</td> |
|
17 |
<td class="text-right">{{w.type1}}</td> |
|
18 |
</tr> |
|
19 |
<tr> |
|
20 |
<th class="text-center" style="width:40px">#2</th> |
|
21 |
<td><a href="#!/metadata/0/{{w.id2}}" title="{{w.id2}}">{{w.name2}}</a></td> |
|
22 |
<td><img ng-src="resources/images/flags/{{w.country2}}.gif" /> {{w.city2}}, {{w.country2}}</td> |
|
23 |
<td class="text-right">{{w.type2}}</td> |
|
24 |
</tr> |
|
25 |
<tr> |
|
26 |
<th style="width:40px"></th> |
|
27 |
<td colspan="3"> |
|
28 |
<button type="button" class="btn btn-sm btn-primary">merge</button> |
|
29 |
<button type="button" class="btn btn-sm btn-outline-danger"><i class="fa fa-trash"></i></button> |
|
30 |
</td> |
|
31 |
</tr> |
|
32 |
</tbody> |
|
33 |
</table> |
|
34 |
|
modules/dnet-orgs-database-application/trunk/src/main/resources/static/resources/js/organizations.js | ||
---|---|---|
12 | 12 |
.when('/metadata/:msg/:id', { templateUrl: 'resources/html/edit.html', controller: 'showMetadataCtrl' }) |
13 | 13 |
.when('/relations/:id', { templateUrl: 'resources/html/relations.html', controller: 'showRelationsCtrl' }) |
14 | 14 |
.when('/similarities/:id', { templateUrl: 'resources/html/similarities.html', controller: 'showSimilaritiesCtrl' }) |
15 |
.when('/warnings', { templateUrl: 'resources/html/warnings.html', controller: 'showWarningsCtrl' }) |
|
15 | 16 |
.when('/users', { templateUrl: 'resources/html/users.html', controller: 'usersCtrl' }) |
16 | 17 |
.otherwise({ redirectTo: '/search' }); |
17 | 18 |
}); |
... | ... | |
267 | 268 |
}); |
268 | 269 |
|
269 | 270 |
|
271 |
orgsModule.controller('showWarningsCtrl', function ($scope, $http, $routeParams) { |
|
272 |
$scope.orgId = $routeParams.id; |
|
273 |
$scope.warnings = []; |
|
274 |
|
|
275 |
$http.get('api/organizations/warnings?id=' + $routeParams.id).then(function successCallback(res) { |
|
276 |
$scope.warnings = res.data; |
|
277 |
}, function errorCallback(res) { |
|
278 |
alert('ERROR: ' + res.data.error + ' (' + res.data.message + ')'); |
|
279 |
}); |
|
270 | 280 |
|
281 |
}); |
|
282 |
|
|
283 |
|
|
271 | 284 |
orgsModule.controller('usersCtrl', function ($scope, $http, $timeout, $route) { |
272 | 285 |
$scope.users = []; |
273 | 286 |
$scope.vocs = {}; |
modules/dnet-orgs-database-application/trunk/src/main/resources/templates/home.html | ||
---|---|---|
54 | 54 |
</div> |
55 | 55 |
</li> |
56 | 56 |
<li class="nav-item"><a class="nav-link" href="#!/new">New</a></li> |
57 |
<li class="nav-item" sec:authorize="hasRole('ROLE_SUPERUSER')"><a class="nav-link" href="#!/warnings">Warnings</a></li> |
|
57 | 58 |
</ul> |
58 | 59 |
</div> |
59 | 60 |
|
Also available in: Unified diff
warnings