CCM NG/ccm-core: Localisation of Vaadin prototype UI

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4711 8810af33-2d31-482b-a856-94f89814c4df

Former-commit-id: dc2c2ce2d2
pull/2/head
jensp 2017-05-05 19:21:38 +00:00
parent 7a99509594
commit ab27e13d4f
7 changed files with 197 additions and 44 deletions

View File

@ -26,10 +26,8 @@ import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.server.ClassResource; import com.vaadin.server.ClassResource;
import com.vaadin.server.VaadinServlet; import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Alignment; import com.vaadin.ui.Alignment;
import com.vaadin.ui.Component;
import com.vaadin.ui.CssLayout; import com.vaadin.ui.CssLayout;
import com.vaadin.ui.CustomComponent; import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.Grid;
import com.vaadin.ui.GridLayout; import com.vaadin.ui.GridLayout;
import com.vaadin.ui.Image; import com.vaadin.ui.Image;
import com.vaadin.ui.Label; import com.vaadin.ui.Label;
@ -40,16 +38,13 @@ import org.libreccm.admin.ui.usersgroupsroles.UsersGroupsRoles;
import org.libreccm.admin.ui.usersgroupsroles.UsersTableDataProvider; import org.libreccm.admin.ui.usersgroupsroles.UsersTableDataProvider;
import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.security.PermissionChecker; import org.libreccm.security.PermissionChecker;
import org.libreccm.security.User;
import org.libreccm.security.UserRepository; import org.libreccm.security.UserRepository;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.inject.Inject; import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
/** /**
* *
@ -63,12 +58,11 @@ public class AdminView extends CustomComponent implements View {
public static final String VIEWNAME = "admin"; public static final String VIEWNAME = "admin";
private static final String COL_USER_NAME = "username"; // private static final String COL_USER_NAME = "username";
private static final String COL_GIVEN_NAME = "given_name"; // private static final String COL_GIVEN_NAME = "given_name";
private static final String COL_FAMILY_NAME = "family_name"; // private static final String COL_FAMILY_NAME = "family_name";
private static final String COL_EMAIL = "email"; // private static final String COL_EMAIL = "email";
private static final String COL_BANNED = "banned"; // private static final String COL_BANNED = "banned";
@Inject @Inject
private ServletContext servletContext; private ServletContext servletContext;
@ -94,6 +88,7 @@ public class AdminView extends CustomComponent implements View {
private final TabSheet tabSheet; private final TabSheet tabSheet;
// private final Grid<User> usersTable; // private final Grid<User> usersTable;
private final TabSheet.Tab tabUsersGroupsRoles;
private final UsersGroupsRoles usersGroupsRoles; private final UsersGroupsRoles usersGroupsRoles;
private final JpqlConsole jpqlConsole; private final JpqlConsole jpqlConsole;
@ -135,7 +130,8 @@ public class AdminView extends CustomComponent implements View {
// //
// tabSheet.addTab(userGroupsRoles, "Users/Groups/Roles"); // tabSheet.addTab(userGroupsRoles, "Users/Groups/Roles");
usersGroupsRoles = new UsersGroupsRoles(this); usersGroupsRoles = new UsersGroupsRoles(this);
tabSheet.addTab(usersGroupsRoles, "Users/Groups/Roles"); tabUsersGroupsRoles = tabSheet.addTab(usersGroupsRoles,
"Users/Groups/Roles");
final ServletContext servletContext = VaadinServlet final ServletContext servletContext = VaadinServlet
.getCurrent() .getCurrent()
@ -184,6 +180,11 @@ public class AdminView extends CustomComponent implements View {
globalizationHelper.getNegotiatedLocale()); globalizationHelper.getNegotiatedLocale());
usersGroupsRoles.setDataProvider(usersTableDataProvider); usersGroupsRoles.setDataProvider(usersTableDataProvider);
tabUsersGroupsRoles.setCaption(bundle
.getString("ui.admin.tab.users_groups_roles.title"));
usersGroupsRoles.localize();
} }
@Override @Override
@ -192,7 +193,6 @@ public class AdminView extends CustomComponent implements View {
// usersGroupsRoles.setUsers(userRepo.findAll()); // usersGroupsRoles.setUsers(userRepo.findAll());
} }
protected JpqlConsoleController getJpqlConsoleController() { protected JpqlConsoleController getJpqlConsoleController() {
return jpqlConsoleController; return jpqlConsoleController;
} }

View File

@ -18,21 +18,26 @@
*/ */
package org.libreccm.admin.ui.usersgroupsroles; package org.libreccm.admin.ui.usersgroupsroles;
import com.arsdigita.ui.admin.AdminUiConstants;
import com.vaadin.data.provider.AbstractDataProvider; import com.vaadin.data.provider.AbstractDataProvider;
import com.vaadin.data.provider.Query; import com.vaadin.data.provider.Query;
import com.vaadin.ui.Button; import com.vaadin.ui.Button;
import com.vaadin.ui.FormLayout; import com.vaadin.ui.FormLayout;
import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.ItemCaptionGenerator;
import com.vaadin.ui.Panel; import com.vaadin.ui.Panel;
import com.vaadin.ui.PasswordField; import com.vaadin.ui.PasswordField;
import com.vaadin.ui.RadioButtonGroup; import com.vaadin.ui.RadioButtonGroup;
import com.vaadin.ui.TextField; import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
import org.libreccm.core.UnexpectedErrorException; import org.libreccm.core.UnexpectedErrorException;
import org.libreccm.security.User; import org.libreccm.security.User;
import java.util.Arrays; import java.util.Arrays;
import java.util.ResourceBundle;
import java.util.stream.Stream; import java.util.stream.Stream;
/** /**
@ -75,18 +80,26 @@ public class UserEditor extends Window {
private void addWidgets() { private void addWidgets() {
userName = new TextField("User name"); final ResourceBundle bundle = ResourceBundle
.getBundle(AdminUiConstants.ADMIN_BUNDLE,
UI.getCurrent().getLocale());
userName = new TextField(bundle
.getString("ui.admin.user_edit.username.label"));
userName.setRequiredIndicatorVisible(true); userName.setRequiredIndicatorVisible(true);
familyName = new TextField("Family name"); familyName = new TextField(bundle
.getString("ui.admin.user_edit.familyname.label"));
givenName = new TextField("Given name"); givenName = new TextField(bundle
.getString("ui.admin.user_edit.givenname.label"));
emailAddress = new TextField("emailAddress"); emailAddress = new TextField(bundle
.getString("ui.admin.user_edit.emailAddress.label"));
emailAddress.setRequiredIndicatorVisible(true); emailAddress.setRequiredIndicatorVisible(true);
passwordOptions = new RadioButtonGroup<PasswordOptions>( passwordOptions = new RadioButtonGroup<PasswordOptions>(
"Generate password or set manually?", bundle.getString("ui.admin.user_edit.password_options.label"),
new AbstractDataProvider<PasswordOptions, String>() { new AbstractDataProvider<PasswordOptions, String>() {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -108,11 +121,28 @@ public class UserEditor extends Window {
} }
}); });
passwordOptions.setItemCaptionGenerator(
(final PasswordOptions item) -> {
switch (item) {
case GENERATE_AND_SEND:
return bundle.getString(
"ui.admin.user_edit.password_options.generate_and_send");
case SET:
return bundle.getString(
"ui.admin.user_edit.password_options.set");
default:
throw new UnexpectedErrorException(String.format(
"Unexpected value '%s' for password options.",
item.toString()));
}
});
password = new PasswordField("Password"); password = new PasswordField(bundle
.getString("ui.admin.user_edit.password.label"));
password.setRequiredIndicatorVisible(true); password.setRequiredIndicatorVisible(true);
passwordConfirmation = new PasswordField("Confirm password"); passwordConfirmation = new PasswordField(bundle
.getString("ui.admin.user_set_password_confirm.label"));
passwordConfirmation.setRequiredIndicatorVisible(true); passwordConfirmation.setRequiredIndicatorVisible(true);
passwordOptions.addValueChangeListener(event -> { passwordOptions.addValueChangeListener(event -> {
@ -140,12 +170,13 @@ public class UserEditor extends Window {
final Button submit = new Button(); final Button submit = new Button();
if (user == null) { if (user == null) {
submit.setCaption("Create new user"); submit.setCaption(bundle.getString(
"ui.admin.user.createpanel.header"));
} else { } else {
submit.setCaption("Save"); submit.setCaption(bundle.getString("ui.admin.save"));
} }
final Button cancel = new Button("Cancel"); final Button cancel = new Button(bundle.getString("ui.admin.cancel"));
final HorizontalLayout buttons = new HorizontalLayout(submit, cancel); final HorizontalLayout buttons = new HorizontalLayout(submit, cancel);
@ -161,9 +192,11 @@ public class UserEditor extends Window {
final Panel panel = new Panel(layout); final Panel panel = new Panel(layout);
if (user == null) { if (user == null) {
panel.setCaption("Create new user"); panel.setCaption(bundle
.getString("ui.admin.user.createpanel.header"));
} else { } else {
panel.setCaption("Edit user"); panel.setCaption(bundle
.getString("ui.admin.user_details.edit"));
} }
setContent(panel); setContent(panel);

View File

@ -34,6 +34,7 @@ import com.vaadin.ui.themes.ValoTheme;
import org.libreccm.admin.ui.AdminView; import org.libreccm.admin.ui.AdminView;
import org.libreccm.security.User; import org.libreccm.security.User;
import java.util.Locale;
import java.util.ResourceBundle; import java.util.ResourceBundle;
/** /**
@ -49,20 +50,28 @@ public class UsersGroupsRoles extends CustomComponent {
private static final String COL_FAMILY_NAME = "family_name"; private static final String COL_FAMILY_NAME = "family_name";
private static final String COL_EMAIL = "email"; private static final String COL_EMAIL = "email";
private static final String COL_BANNED = "banned"; private static final String COL_BANNED = "banned";
private static final String COL_PASSWORD_RESET_REQUIRED
= "password_reset_required";
private static final String COL_EDIT = "edit";
private static final String COL_DELETE = "delete";
private final AdminView view; private final AdminView view;
private final TabSheet tabSheet; private final TabSheet tabSheet;
private final Grid<User> usersTable; private final Grid<User> usersTable;
private final TextField userNameFilter;
private final Button clearFiltersButton;
private UsersTableDataProvider usersTableDataProvider; private UsersTableDataProvider usersTableDataProvider;
public UsersGroupsRoles(final AdminView view) { public UsersGroupsRoles(final AdminView view) {
this.view = view; this.view = view;
final ResourceBundle bundle = ResourceBundle.getBundle( final ResourceBundle bundle = ResourceBundle
AdminUiConstants.ADMIN_BUNDLE, UI.getCurrent().getLocale()); .getBundle(AdminUiConstants.ADMIN_BUNDLE,
UI.getCurrent().getLocale());
tabSheet = new TabSheet(); tabSheet = new TabSheet();
usersTable = new Grid<>(); usersTable = new Grid<>();
@ -94,16 +103,39 @@ public class UsersGroupsRoles extends CustomComponent {
.setId(COL_BANNED) .setId(COL_BANNED)
.setCaption("Banned?"); .setCaption("Banned?");
usersTable usersTable
.addColumn(user -> "Edit", .addColumn(user -> {
if (user.isPasswordResetRequired()) {
return bundle.getString(
"ui.admin.user.password_reset_required_yes");
} else {
return bundle.getString(
"ui.admin.user.password_reset_required_no");
}
})
.setId(COL_PASSWORD_RESET_REQUIRED)
.setCaption("Password reset required");
usersTable
.addColumn(user -> bundle.getString("ui.admin.users.table.edit"),
new ButtonRenderer<>(event -> { new ButtonRenderer<>(event -> {
final UserEditor editor = new UserEditor(event.getItem()); final UserEditor editor = new UserEditor(event
.getItem());
editor.center(); editor.center();
UI.getCurrent().addWindow(editor); UI.getCurrent().addWindow(editor);
})); }))
.setId(COL_EDIT);
usersTable
.addColumn(user -> bundle.getString("ui.admin.users.table.delete"),
new ButtonRenderer<>(event -> {
final UserEditor editor = new UserEditor(event
.getItem());
editor.center();
UI.getCurrent().addWindow(editor);
}))
.setId(COL_DELETE);
final HeaderRow filterRow = usersTable.appendHeaderRow(); final HeaderRow filterRow = usersTable.appendHeaderRow();
final HeaderCell userNameFilterCell = filterRow.getCell(COL_USER_NAME); final HeaderCell userNameFilterCell = filterRow.getCell(COL_USER_NAME);
final TextField userNameFilter = new TextField(); userNameFilter = new TextField();
userNameFilter.setPlaceholder("User name"); userNameFilter.setPlaceholder("User name");
userNameFilter.setDescription("Filter users by username"); userNameFilter.setDescription("Filter users by username");
userNameFilter.addStyleName(ValoTheme.TEXTFIELD_TINY); userNameFilter.addStyleName(ValoTheme.TEXTFIELD_TINY);
@ -120,7 +152,7 @@ public class UsersGroupsRoles extends CustomComponent {
COL_FAMILY_NAME, COL_FAMILY_NAME,
COL_EMAIL, COL_EMAIL,
COL_BANNED); COL_BANNED);
final Button clearFiltersButton = new Button("Clear filters"); clearFiltersButton = new Button("Clear filters");
clearFiltersButton.addStyleName(ValoTheme.BUTTON_TINY); clearFiltersButton.addStyleName(ValoTheme.BUTTON_TINY);
clearFiltersButton.addClickListener(event -> { clearFiltersButton.addClickListener(event -> {
// usersTableDataProvider.setUserNameFilter(null); // usersTableDataProvider.setUserNameFilter(null);
@ -136,6 +168,42 @@ public class UsersGroupsRoles extends CustomComponent {
} }
public void localize() {
final ResourceBundle bundle = ResourceBundle
.getBundle(AdminUiConstants.ADMIN_BUNDLE,
UI.getCurrent().getLocale());
usersTable
.getColumn(COL_USER_NAME)
.setCaption(bundle.getString("ui.admin.users.table.screenname"));
usersTable
.getColumn(COL_GIVEN_NAME)
.setCaption(bundle.getString("ui.admin.users.table.givenname"));
usersTable
.getColumn(COL_FAMILY_NAME)
.setCaption(bundle.getString("ui.admin.users.table.familyname"));
usersTable
.getColumn(COL_EMAIL)
.setCaption(bundle.getString("ui.admin.users.table.primary_email"));
usersTable
.getColumn(COL_BANNED)
.setCaption(bundle.getString("ui.admin.users.table.banned"));
usersTable
.getColumn(COL_PASSWORD_RESET_REQUIRED)
.setCaption(bundle.getString(
"ui.admin.users.table.password_reset_required"));
userNameFilter.setPlaceholder(bundle
.getString("ui.admin.users.table.filter.screenname.placeholder"));
userNameFilter.setDescription(bundle
.getString("ui.admin.users.table.filter.screenname.description"));
clearFiltersButton.setCaption(bundle
.getString("ui.admin.users.table.filter.clear"));
}
// public void setUsers(final List<User> users) { // public void setUsers(final List<User> users) {
// usersTable.setItems(users); // usersTable.setItems(users);
// } // }

View File

@ -559,3 +559,16 @@ ui.admin.user.banned_yes=Yes
ui.admin.user.banned_no=No ui.admin.user.banned_no=No
ui.admin.jpqlconsole.query=Query ui.admin.jpqlconsole.query=Query
ui.admin.jpqlconsole.results.none=No results ui.admin.jpqlconsole.results.none=No results
ui.admin.users.table.password_reset_required=Password reset required
ui.admin.users.table.edit=Edit
ui.admin.users.table.delete=Delete
ui.admin.user.password_reset_required_yes=Yes
ui.admin.user.password_reset_required_no=No
ui.admin.user_edit.emailAddress.label=E-Mail
ui.admin.user_edit.password_options.label=Generate password or set manually?
ui.admin.user_edit.password.label=Password
ui.admin.users.table.filter.screenname.placeholder=User name
ui.admin.users.table.filter.screenname.description=Filter users by user name
ui.admin.user_set_password_confirm.label=Confirm password
ui.admin.user_edit.password_options.generate_and_send=Generate and send to user
ui.admin.user_edit.password_options.set=Set password

View File

@ -228,7 +228,7 @@ ui.admin.new_user_form.error.username_already_in_use=Der angegebene Benutzername
ui.admin.new_user_form.error.email_already_in_use=Die angegebene E-Mail-Adresse ist bereits mit einem Benutzerkonto verbunden. ui.admin.new_user_form.error.email_already_in_use=Die angegebene E-Mail-Adresse ist bereits mit einem Benutzerkonto verbunden.
ui.admin.new_user_form.error.password_do_not_match=Die eingegebenen Passw\u00f6rter stimmen nicht \u00fcberein. ui.admin.new_user_form.error.password_do_not_match=Die eingegebenen Passw\u00f6rter stimmen nicht \u00fcberein.
ui.admin.new_user_form.error.failed_to_send_password=Fehler beim Senden des Passworts an den neuen Benutzer. ui.admin.new_user_form.error.failed_to_send_password=Fehler beim Senden des Passworts an den neuen Benutzer.
ui.admin.new_user_form.password_options.set_password=Passwert setzen ui.admin.new_user_form.password_options.set_password=Passwort setzen
ui.admin.user_details.groups=Gruppen ui.admin.user_details.groups=Gruppen
ui.admin.user.groups.edit=Bearbeiten ui.admin.user.groups.edit=Bearbeiten
ui.admin.user.roles=Zugewiesene Rollen ui.admin.user.roles=Zugewiesene Rollen
@ -563,3 +563,16 @@ ui.admin.user.banned_yes=Ja
ui.admin.user.banned_no=Nein ui.admin.user.banned_no=Nein
ui.admin.jpqlconsole.query=Abfrage ui.admin.jpqlconsole.query=Abfrage
ui.admin.jpqlconsole.results.none=Keine Ergebnisse ui.admin.jpqlconsole.results.none=Keine Ergebnisse
ui.admin.users.table.password_reset_required=Passwort muss neu gesetzt werden
ui.admin.users.table.edit=Bearbeiten
ui.admin.users.table.delete=L\u00f6schen
ui.admin.user.password_reset_required_yes=Ja
ui.admin.user.password_reset_required_no=Nein
ui.admin.user_edit.emailAddress.label=E-Mail
ui.admin.user_edit.password_options.label=Passwort generieren oder manuell setzen?
ui.admin.user_edit.password.label=Passwort
ui.admin.users.table.filter.screenname.placeholder=Benutzername
ui.admin.users.table.filter.screenname.description=Filter users by user name
ui.admin.user_set_password_confirm.label=Passwort best\u00e4tigen
ui.admin.user_edit.password_options.generate_and_send=Generieren und an Benutzer senden
ui.admin.user_edit.password_options.set=Passwort setzen

View File

@ -556,3 +556,16 @@ ui.admin.user.banned_yes=Yes
ui.admin.user.banned_no=No ui.admin.user.banned_no=No
ui.admin.jpqlconsole.query=Query ui.admin.jpqlconsole.query=Query
ui.admin.jpqlconsole.results.none=No results ui.admin.jpqlconsole.results.none=No results
ui.admin.users.table.password_reset_required=Password reset required
ui.admin.users.table.edit=Edit
ui.admin.users.table.delete=Delete
ui.admin.user.password_reset_required_yes=Yes
ui.admin.user.password_reset_required_no=No
ui.admin.user_edit.emailAddress.label=E-Mail
ui.admin.user_edit.password_options.label=Generate password or set manually?
ui.admin.user_edit.password.label=Password
ui.admin.users.table.filter.screenname.placeholder=User name
ui.admin.users.table.filter.screenname.description=Filter users by user name
ui.admin.user_set_password_confirm.label=Confirm password
ui.admin.user_edit.password_options.generate_and_send=Generate and send to user
ui.admin.user_edit.password_options.set=Set password

View File

@ -547,3 +547,16 @@ ui.admin.user.banned_yes=Yes
ui.admin.user.banned_no=No ui.admin.user.banned_no=No
ui.admin.jpqlconsole.query=Query ui.admin.jpqlconsole.query=Query
ui.admin.jpqlconsole.results.none=No results ui.admin.jpqlconsole.results.none=No results
ui.admin.users.table.password_reset_required=Password reset required
ui.admin.users.table.edit=Edit
ui.admin.users.table.delete=Delete
ui.admin.user.password_reset_required_yes=Yes
ui.admin.user.password_reset_required_no=No
ui.admin.user_edit.emailAddress.label=E-Mail
ui.admin.user_edit.password_options.label=Generate password or set manually?
ui.admin.user_edit.password.label=Password
ui.admin.users.table.filter.screenname.placeholder=User name
ui.admin.users.table.filter.screenname.description=Filter users by user name
ui.admin.user_set_password_confirm.label=Confirm password
ui.admin.user_edit.password_options.generate_and_send=Generate and send to user
ui.admin.user_edit.password_options.set=Set password