2 * Copyright 2008, 2009 Electronic Business Systems Ltd.
4 * This file is part of GSS.
6 * GSS is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * GSS is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with GSS. If not, see <http://www.gnu.org/licenses/>.
19 package gr.ebs.gss.client;
21 import gr.ebs.gss.client.rest.GetCommand;
22 import gr.ebs.gss.client.rest.RestException;
23 import gr.ebs.gss.client.rest.resource.GroupResource;
24 import gr.ebs.gss.client.rest.resource.PermissionHolder;
25 import gr.ebs.gss.client.rest.resource.UserResource;
26 import gr.ebs.gss.client.rest.resource.UserSearchResource;
28 import java.util.List;
30 import com.google.gwt.core.client.GWT;
31 import com.google.gwt.dom.client.NativeEvent;
32 import com.google.gwt.event.dom.client.ClickEvent;
33 import com.google.gwt.event.dom.client.ClickHandler;
34 import com.google.gwt.event.dom.client.FocusEvent;
35 import com.google.gwt.event.dom.client.FocusHandler;
36 import com.google.gwt.event.dom.client.KeyCodes;
37 import com.google.gwt.event.dom.client.KeyUpEvent;
38 import com.google.gwt.event.dom.client.KeyUpHandler;
39 import com.google.gwt.http.client.URL;
40 import com.google.gwt.user.client.DeferredCommand;
41 import com.google.gwt.user.client.Event.NativePreviewEvent;
42 import com.google.gwt.user.client.ui.Button;
43 import com.google.gwt.user.client.ui.CheckBox;
44 import com.google.gwt.user.client.ui.DialogBox;
45 import com.google.gwt.user.client.ui.FlexTable;
46 import com.google.gwt.user.client.ui.HasHorizontalAlignment;
47 import com.google.gwt.user.client.ui.HorizontalPanel;
48 import com.google.gwt.user.client.ui.ListBox;
49 import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
50 import com.google.gwt.user.client.ui.SuggestBox;
51 import com.google.gwt.user.client.ui.VerticalPanel;
56 public class PermissionsAddDialog extends DialogBox {
58 private MultiWordSuggestOracle oracle = new MultiWordSuggestOracle();
59 private SuggestBox suggestBox = new SuggestBox(oracle);
61 private String selectedUser = null;
63 private List<GroupResource> groups;
65 private ListBox groupBox = new ListBox();
67 private CheckBox read = new CheckBox();
69 private CheckBox write = new CheckBox();
71 private CheckBox modifyACL = new CheckBox();
73 private final PermissionsList permList;
77 public PermissionsAddDialog(List<GroupResource> _groups, PermissionsList _permList, boolean _userAdd) {
82 groupBox.getElement().setId("addPermission.dropDown");
84 suggestBox.getElement().setId("addPermission.textBox");
86 read.getElement().setId("addPermission.read");
88 write.getElement().setId("addPermission.write");
90 modifyACL.getElement().setId("addpermission.modify");
92 for (GroupResource group : _groups)
93 groupBox.addItem(group.getName(), group.getName());
94 final VerticalPanel panel = new VerticalPanel();
95 final HorizontalPanel buttons = new HorizontalPanel();
97 final FlexTable permTable = new FlexTable();
98 permTable.setText(0, 0, "Users/Groups");
99 permTable.setText(0, 1, "Read");
100 permTable.setText(0, 2, "Write");
101 permTable.setText(0, 3, "Modify Access");
102 permTable.getFlexCellFormatter().setStyleName(0, 0, "props-toplabels");
103 permTable.getFlexCellFormatter().setStyleName(0, 1, "props-toplabels");
104 permTable.getFlexCellFormatter().setStyleName(0, 2, "props-toplabels");
105 permTable.getFlexCellFormatter().setStyleName(0, 3, "props-toplabels");
107 suggestBox.getTextBox().addFocusHandler(new FocusHandler() {
110 public void onFocus(FocusEvent event) {
111 if (selectedUser != null && selectedUser.endsWith("@"))
117 suggestBox.addKeyUpHandler(new KeyUpHandler() {
120 public void onKeyUp(KeyUpEvent event) {
121 // Ignore the arrow keys.
122 int keyCode = event.getNativeKeyCode();
123 if (keyCode == KeyCodes.KEY_UP ||
124 keyCode == KeyCodes.KEY_DOWN ||
125 keyCode == KeyCodes.KEY_LEFT ||
126 keyCode == KeyCodes.KEY_RIGHT)
128 if (keyCode==KeyCodes.KEY_ESCAPE) {
129 suggestBox.hideSuggestionList();
132 String text = suggestBox.getText().trim();
133 // Avoid useless queries for keystrokes that do not modify
135 if (text.equals(selectedUser))
138 // Go to the server only if the user typed the @ character.
139 if (selectedUser.endsWith("@"))
143 permTable.setWidget(1, 0, suggestBox);
145 permTable.setWidget(1, 0, groupBox);
146 permTable.setWidget(1, 1, read);
147 permTable.setWidget(1, 2, write);
148 permTable.setWidget(1, 3, modifyACL);
150 permTable.getFlexCellFormatter().setStyleName(1, 0, "props-labels");
151 permTable.getFlexCellFormatter().setHorizontalAlignment(1, 1, HasHorizontalAlignment.ALIGN_CENTER);
152 permTable.getFlexCellFormatter().setHorizontalAlignment(1, 2, HasHorizontalAlignment.ALIGN_CENTER);
153 permTable.getFlexCellFormatter().setHorizontalAlignment(1, 3, HasHorizontalAlignment.ALIGN_CENTER);
154 panel.add(permTable);
156 final Button ok = new Button("OK", new ClickHandler() {
158 public void onClick(ClickEvent event) {
163 ok.getElement().setId("addPermission.button.ok");
165 buttons.setCellHorizontalAlignment(ok, HasHorizontalAlignment.ALIGN_CENTER);
166 // Create the 'Cancel' button, along with a listener that hides the
168 // when the button is clicked.
169 final Button cancel = new Button("Cancel", new ClickHandler() {
171 public void onClick(ClickEvent event) {
175 cancel.getElement().setId("addPermission.button.cancel");
177 buttons.setCellHorizontalAlignment(cancel, HasHorizontalAlignment.ALIGN_CENTER);
178 buttons.setSpacing(8);
179 buttons.addStyleName("gss-TabPanelBottom");
181 panel.addStyleName("gss-TabPanelBottom");
184 private void addPermission() {
185 PermissionHolder perm = new PermissionHolder();
187 selectedUser = suggestBox.getText();
188 for(PermissionHolder p : permList.permissions)
189 if (selectedUser.equals(p.getUser())){
190 GSS.get().displayError("User already has access to the resource");
193 perm.setUser(selectedUser);
195 String groupId = groupBox.getValue(groupBox.getSelectedIndex());
196 GroupResource selected = null;
197 for (GroupResource g : groups)
198 if (g.getName().equals(groupId))
200 if (selected == null)
202 for(PermissionHolder p : permList.permissions)
203 if (selected.getName().equals(p.getGroup())){
204 GSS.get().displayError("Group already has access to the resource");
207 perm.setGroup(selected.getName());
209 boolean readValue = read.getValue();
210 boolean writeValue = write.getValue();
211 boolean modifyValue = modifyACL.getValue();
213 perm.setRead(readValue);
214 perm.setWrite(writeValue);
215 perm.setModifyACL(modifyValue);
216 permList.addPermission(perm);
217 permList.updateTable();
221 protected void onPreviewNativeEvent(NativePreviewEvent preview) {
222 super.onPreviewNativeEvent(preview);
224 NativeEvent evt = preview.getNativeEvent();
225 if (evt.getType().equals("keydown"))
226 // Use the popup's key preview hooks to close the dialog when either
227 // enter or escape is pressed.
228 switch (evt.getKeyCode()) {
229 case KeyCodes.KEY_ENTER:
233 case KeyCodes.KEY_ESCAPE:
241 public void center() {
244 suggestBox.setFocus(true);
248 * Update the list of suggestions.
250 protected void updateSuggestions() {
251 final GSS app = GSS.get();
252 String query = selectedUser.substring(0, selectedUser.length()-1);
253 GWT.log("Searching for " + query, null);
255 GetCommand<UserSearchResource> eg = new GetCommand<UserSearchResource>(UserSearchResource.class,
256 app.getApiPath() + "users/" + URL.encodeComponent(query), false, null) {
259 public void onComplete() {
260 suggestBox.hideSuggestionList();
262 UserSearchResource s = getResult();
263 for (UserResource user : s.getUsers()) {
264 GWT.log("Found " + user.getUsername(), null);
265 oracle.add(user.getUsername());
267 suggestBox.showSuggestionList();
271 public void onError(Throwable t) {
272 if(t instanceof RestException)
273 app.displayError("Unable to perform search: "+((RestException)t).getHttpStatusText());
275 app.displayError("System error while searching for users: "+t.getMessage());
277 DisplayHelper.log(t.getMessage());
281 DeferredCommand.addCommand(eg);