Skip to content

Commit e695b20

Browse files
committed
fix(gui): Limit search for managers to vo/group members
- For now limit this only for vo pithia.
1 parent 5f5d0e9 commit e695b20

File tree

5 files changed

+668
-5
lines changed

5 files changed

+668
-5
lines changed
Lines changed: 319 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,319 @@
1+
package cz.metacentrum.perun.webgui.tabs.groupstabs;
2+
3+
import com.google.gwt.cell.client.FieldUpdater;
4+
import com.google.gwt.core.client.JavaScriptObject;
5+
import com.google.gwt.event.dom.client.ClickEvent;
6+
import com.google.gwt.event.dom.client.ClickHandler;
7+
import com.google.gwt.resources.client.ImageResource;
8+
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
9+
import com.google.gwt.user.cellview.client.CellTable;
10+
import com.google.gwt.user.client.ui.HTML;
11+
import com.google.gwt.user.client.ui.Label;
12+
import com.google.gwt.user.client.ui.ScrollPanel;
13+
import com.google.gwt.user.client.ui.SimplePanel;
14+
import com.google.gwt.user.client.ui.VerticalPanel;
15+
import com.google.gwt.user.client.ui.Widget;
16+
import cz.metacentrum.perun.webgui.client.PerunWebSession;
17+
import cz.metacentrum.perun.webgui.client.UiElements;
18+
import cz.metacentrum.perun.webgui.client.localization.ButtonTranslation;
19+
import cz.metacentrum.perun.webgui.client.resources.ButtonType;
20+
import cz.metacentrum.perun.webgui.client.resources.PerunEntity;
21+
import cz.metacentrum.perun.webgui.client.resources.PerunSearchEvent;
22+
import cz.metacentrum.perun.webgui.client.resources.SmallIcons;
23+
import cz.metacentrum.perun.webgui.json.GetEntityById;
24+
import cz.metacentrum.perun.webgui.json.JsonCallbackEvents;
25+
import cz.metacentrum.perun.webgui.json.JsonUtils;
26+
import cz.metacentrum.perun.webgui.json.authzResolver.AddAdmin;
27+
import cz.metacentrum.perun.webgui.json.membersManager.FindCompleteRichMembers;
28+
import cz.metacentrum.perun.webgui.json.usersManager.FindCompleteRichUsers;
29+
import cz.metacentrum.perun.webgui.model.Group;
30+
import cz.metacentrum.perun.webgui.model.RichMember;
31+
import cz.metacentrum.perun.webgui.model.User;
32+
import cz.metacentrum.perun.webgui.tabs.TabItem;
33+
import cz.metacentrum.perun.webgui.tabs.userstabs.UserDetailTabItem;
34+
import cz.metacentrum.perun.webgui.widgets.CustomButton;
35+
import cz.metacentrum.perun.webgui.widgets.ExtendedTextBox;
36+
import cz.metacentrum.perun.webgui.widgets.TabMenu;
37+
38+
import java.util.ArrayList;
39+
40+
/**
41+
* Provides page with add admin to Group form
42+
*
43+
* !! USE AS INNER TAB ONLY !!
44+
*
45+
* @author Pavel Zlamal <[email protected]>
46+
* @author Vaclav Mach <[email protected]>
47+
*/
48+
public class AddGroupManagerFromMembersTabItem implements TabItem {
49+
50+
/**
51+
* Perun web session
52+
*/
53+
private PerunWebSession session = PerunWebSession.getInstance();
54+
55+
/**
56+
* Content widget - should be simple panel
57+
*/
58+
private SimplePanel contentWidget = new SimplePanel();
59+
60+
/**
61+
* Title widget
62+
*/
63+
private Label titleWidget = new Label("Loading group");
64+
65+
/**
66+
* Entity ID to set
67+
*/
68+
private Group group;
69+
private int groupId;
70+
71+
// when searching
72+
private String searchString = "";
73+
private FindCompleteRichMembers users;
74+
private ArrayList<RichMember> alreadyAddedList = new ArrayList<RichMember>();
75+
private SimplePanel alreadyAdded = new SimplePanel();
76+
77+
/**
78+
* Creates a tab instance
79+
*
80+
* @param group group to add admin into
81+
*/
82+
public AddGroupManagerFromMembersTabItem(Group group){
83+
this.group = group;
84+
this.groupId = group.getId();
85+
}
86+
87+
/**
88+
* Creates a tab instance
89+
*
90+
* @param groupId ID of group to add admin into
91+
*/
92+
public AddGroupManagerFromMembersTabItem(int groupId){
93+
this.groupId = groupId;
94+
JsonCallbackEvents events = new JsonCallbackEvents(){
95+
public void onFinished(JavaScriptObject jso) {
96+
group = jso.cast();
97+
}
98+
};
99+
new GetEntityById(PerunEntity.GROUP, groupId, events).retrieveData();
100+
}
101+
102+
103+
public boolean isPrepared() {
104+
return !(group == null);
105+
}
106+
107+
@Override
108+
public boolean isRefreshParentOnClose() {
109+
return !alreadyAddedList.isEmpty();
110+
}
111+
112+
@Override
113+
public void onClose() {
114+
115+
}
116+
117+
public Widget draw() {
118+
119+
titleWidget.setText("Add manager");
120+
121+
// MAIN PANEL
122+
VerticalPanel vp = new VerticalPanel();
123+
vp.setSize("100%", "100%");
124+
125+
// if members or admins group, hide
126+
if(group.isCoreGroup()){
127+
128+
vp.add(new HTML("<p>Group \""+group.getName()+"\" can't have managers managed from Group manager section. Please use VO manager section.</p>"));
129+
130+
this.contentWidget.setWidget(vp);
131+
return getWidget();
132+
}
133+
134+
final CustomButton searchButton = new CustomButton("Search", ButtonTranslation.INSTANCE.searchUsers(), SmallIcons.INSTANCE.findIcon());
135+
136+
137+
// VO managers can search whole VO, group managers can search only group members
138+
this.users = new FindCompleteRichMembers(session.isVoAdmin() ? PerunEntity.VIRTUAL_ORGANIZATION : PerunEntity.GROUP, session.isVoAdmin() ? group.getVoId() : groupId, "", null, JsonCallbackEvents.disableButtonEvents(searchButton, new JsonCallbackEvents(){
139+
@Override
140+
public void onFinished(JavaScriptObject jso) {
141+
// if found 1 item, select
142+
ArrayList<RichMember> list = JsonUtils.jsoAsList(jso);
143+
if (list != null && list.size() == 1) {
144+
users.getSelectionModel().setSelected(list.get(0), true);
145+
}
146+
}
147+
}));
148+
149+
// MAIN TAB PANEL
150+
VerticalPanel firstTabPanel = new VerticalPanel();
151+
firstTabPanel.setSize("100%", "100%");
152+
153+
// HORIZONTAL MENU
154+
TabMenu tabMenu = new TabMenu();
155+
tabMenu.addWidget(UiElements.getRefreshButton(this));
156+
157+
// get the table
158+
final CellTable<RichMember> table;
159+
if (session.isPerunAdmin()) {
160+
table = users.getTable(new FieldUpdater<RichMember, RichMember>() {
161+
public void update(int i, RichMember rm, RichMember rm2) {
162+
session.getTabManager().addTab(new UserDetailTabItem(rm.getUser()));
163+
}
164+
});
165+
} else {
166+
table = users.getTable();
167+
}
168+
169+
final TabItem tab = this;
170+
171+
// already added
172+
rebuildAlreadyAddedWidget();
173+
174+
// search textbox
175+
final ExtendedTextBox searchBox = tabMenu.addSearchWidget(new PerunSearchEvent() {
176+
@Override
177+
public void searchFor(String text) {
178+
startSearching(text);
179+
searchString = text;
180+
}
181+
}, searchButton);
182+
183+
final CustomButton addButton = TabMenu.getPredefinedButton(ButtonType.ADD, ButtonTranslation.INSTANCE.addSelectedManagersToGroup());
184+
addButton.addClickHandler(new ClickHandler() {
185+
public void onClick(ClickEvent event) {
186+
// TODO - SHOULD HAVE ONLY ONE CALLBACK TO CORE !!
187+
final ArrayList<RichMember> list = users.getTableSelectedList();
188+
if (UiElements.cantSaveEmptyListDialogBox(list)) {
189+
for (int i = 0; i < list.size(); i++) {
190+
final int n = i;
191+
AddAdmin request = new AddAdmin(JsonCallbackEvents.disableButtonEvents(addButton, new JsonCallbackEvents(){
192+
@Override
193+
public void onFinished(JavaScriptObject jso) {
194+
// put names to already added
195+
alreadyAddedList.add(list.get(n));
196+
rebuildAlreadyAddedWidget();
197+
// unselect added person
198+
users.getSelectionModel().setSelected(list.get(n), false);
199+
// clear search
200+
searchBox.getTextBox().setText("");
201+
}
202+
}));
203+
request.addGroupAdmin(group, list.get(i).getUser());
204+
}
205+
}
206+
}
207+
});
208+
tabMenu.addWidget(addButton);
209+
210+
tabMenu.addWidget(TabMenu.getPredefinedButton(ButtonType.CLOSE, "", new ClickHandler() {
211+
@Override
212+
public void onClick(ClickEvent clickEvent) {
213+
session.getTabManager().closeTab(tab, isRefreshParentOnClose());
214+
}
215+
}));
216+
217+
// if some text has been searched before
218+
if(!searchString.equals("")) {
219+
searchBox.getTextBox().setText(searchString);
220+
startSearching(searchString);
221+
}
222+
223+
addButton.setEnabled(false);
224+
JsonUtils.addTableManagedButton(users, table, addButton);
225+
226+
// add a class to the table and wrap it into scroll panel
227+
table.addStyleName("perun-table");
228+
ScrollPanel sp = new ScrollPanel(table);
229+
sp.addStyleName("perun-tableScrollPanel");
230+
231+
// add menu and the table to the main panel
232+
firstTabPanel.add(tabMenu);
233+
firstTabPanel.setCellHeight(tabMenu, "30px");
234+
firstTabPanel.add(alreadyAdded);
235+
firstTabPanel.add(sp);
236+
237+
session.getUiElements().resizePerunTable(sp, 350, this);
238+
239+
this.contentWidget.setWidget(firstTabPanel);
240+
return getWidget();
241+
242+
}
243+
244+
/**
245+
* Rebuild already added widget based on already added admins
246+
*/
247+
private void rebuildAlreadyAddedWidget() {
248+
249+
alreadyAdded.setStyleName("alreadyAdded");
250+
alreadyAdded.setVisible(!alreadyAddedList.isEmpty());
251+
alreadyAdded.setWidget(new HTML("<strong>Already added: </strong>"));
252+
for (int i=0; i<alreadyAddedList.size(); i++) {
253+
alreadyAdded.getWidget().getElement().setInnerHTML(alreadyAdded.getWidget().getElement().getInnerHTML()+ ((i!=0) ? ", " : "") + SafeHtmlUtils.fromString(alreadyAddedList.get(i).getUser().getFullName()).asString());
254+
}
255+
}
256+
257+
/**
258+
* Starts the search for users
259+
*/
260+
protected void startSearching(String text){
261+
262+
users.clearTable();
263+
users.searchFor(text);
264+
}
265+
266+
public Widget getWidget() {
267+
return this.contentWidget;
268+
}
269+
270+
public Widget getTitle() {
271+
return this.titleWidget;
272+
}
273+
274+
public ImageResource getIcon() {
275+
return SmallIcons.INSTANCE.addIcon();
276+
}
277+
278+
@Override
279+
public int hashCode() {
280+
final int prime = 797;
281+
int result = 1;
282+
result = prime * result + 6786786;
283+
return result;
284+
}
285+
286+
@Override
287+
public boolean equals(Object obj) {
288+
if (this == obj)
289+
return true;
290+
if (obj == null)
291+
return false;
292+
if (getClass() != obj.getClass())
293+
return false;
294+
295+
AddGroupManagerFromMembersTabItem create = (AddGroupManagerFromMembersTabItem) obj;
296+
if (groupId != create.groupId){
297+
return false;
298+
}
299+
300+
return true;
301+
}
302+
303+
public boolean multipleInstancesEnabled() {
304+
return false;
305+
}
306+
307+
public void open() { }
308+
309+
public boolean isAuthorized() {
310+
311+
if (session.isVoAdmin(group.getVoId()) || session.isGroupAdmin(groupId)) {
312+
return true;
313+
} else {
314+
return false;
315+
}
316+
317+
}
318+
319+
}

perun-web-gui/src/main/java/cz/metacentrum/perun/webgui/tabs/groupstabs/GroupManagersTabItem.java

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323
import cz.metacentrum.perun.webgui.json.authzResolver.GetAdminGroups;
2424
import cz.metacentrum.perun.webgui.json.authzResolver.GetRichAdminsWithAttributes;
2525
import cz.metacentrum.perun.webgui.json.authzResolver.RemoveAdmin;
26-
import cz.metacentrum.perun.webgui.model.GeneralObject;
2726
import cz.metacentrum.perun.webgui.model.Group;
2827
import cz.metacentrum.perun.webgui.model.User;
28+
import cz.metacentrum.perun.webgui.model.VirtualOrganization;
2929
import cz.metacentrum.perun.webgui.tabs.GroupsTabs;
3030
import cz.metacentrum.perun.webgui.tabs.TabItem;
3131
import cz.metacentrum.perun.webgui.tabs.TabItemWithUrl;
@@ -62,6 +62,7 @@ public class GroupManagersTabItem implements TabItem, TabItemWithUrl{
6262

6363
// data
6464
private Group group;
65+
private VirtualOrganization vo;
6566
private int groupId;
6667
private int selectedDropDownIndex = 0;
6768

@@ -83,14 +84,20 @@ public GroupManagersTabItem(int groupId){
8384
JsonCallbackEvents events = new JsonCallbackEvents(){
8485
public void onFinished(JavaScriptObject jso) {
8586
group = jso.cast();
87+
JsonCallbackEvents events = new JsonCallbackEvents(){
88+
public void onFinished(JavaScriptObject jso) {
89+
vo = jso.cast();
90+
}
91+
};
92+
new GetEntityById(PerunEntity.VIRTUAL_ORGANIZATION, group.getVoId(), events).retrieveData();
8693
}
8794
};
8895
new GetEntityById(PerunEntity.GROUP, groupId, events).retrieveData();
8996
}
9097

9198

9299
public boolean isPrepared(){
93-
return !(group == null);
100+
return ((group != null) && (vo != null));
94101
}
95102

96103
@Override
@@ -179,7 +186,28 @@ private Widget fillContentUsers(final GetRichAdminsWithAttributes admins, TabMen
179186

180187
CustomButton addButton = TabMenu.getPredefinedButton(ButtonType.ADD, true, ButtonTranslation.INSTANCE.addManagerToGroup(), new ClickHandler() {
181188
public void onClick(ClickEvent event) {
182-
session.getTabManager().addTabToCurrentTab(new AddGroupManagerTabItem(group), true);
189+
if (vo == null) {
190+
// load VO
191+
JsonCallbackEvents events = new JsonCallbackEvents(){
192+
public void onFinished(JavaScriptObject jso) {
193+
vo = jso.cast();
194+
//FIXME - temporary hack for pithia VO
195+
if ("vo.esc.pithia.eu".equals(vo.getShortName())) {
196+
session.getTabManager().addTabToCurrentTab(new AddGroupManagerFromMembersTabItem(group), true);
197+
} else {
198+
session.getTabManager().addTabToCurrentTab(new AddGroupManagerTabItem(group), true);
199+
}
200+
}
201+
};
202+
new GetEntityById(PerunEntity.VIRTUAL_ORGANIZATION, group.getVoId(), events).retrieveData();
203+
} else {
204+
//FIXME - temporary hack for pithia VO
205+
if ("vo.esc.pithia.eu".equals(vo.getShortName())) {
206+
session.getTabManager().addTabToCurrentTab(new AddGroupManagerFromMembersTabItem(group), true);
207+
} else {
208+
session.getTabManager().addTabToCurrentTab(new AddGroupManagerTabItem(group), true);
209+
}
210+
}
183211
}
184212
});
185213
if (!session.isVoAdmin(group.getVoId()) && !session.isGroupAdmin(group.getId())) addButton.setEnabled(false);

0 commit comments

Comments
 (0)