CCM NG:
- Further work on the admin UI - Refactored the GlobalizationHelper to use CDI for getting the current request. Also cleaned up the code. git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@3892 8810af33-2d31-482b-a856-94f89814c4dfpull/2/head
parent
260978d1c1
commit
1b206fecef
|
|
@ -12,6 +12,9 @@
|
|||
<Logger name="com.arsdigita.ui.admin.AdminServlet"
|
||||
level="debug">
|
||||
</Logger>
|
||||
<Logger name="com.arsdigita.ui.admin.usersgroupsroles.UsersTable"
|
||||
level="debug">
|
||||
</Logger>
|
||||
<Logger name="com.arsdigita.ui.login.UserLoginForm"
|
||||
level="debug">
|
||||
</Logger>
|
||||
|
|
|
|||
|
|
@ -30,15 +30,21 @@ import com.arsdigita.bebop.parameters.ParameterData;
|
|||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.Form;
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.parameters.*;
|
||||
import com.arsdigita.bebop.parameters.DateTimeParameter;
|
||||
import com.arsdigita.bebop.parameters.IncompleteDateParameter;
|
||||
import com.arsdigita.bebop.parameters.NotNullValidationListener;
|
||||
|
||||
// This interface contains the XML element name of this class
|
||||
// in a constant which is used when generating XML
|
||||
import com.arsdigita.bebop.util.BebopConstants;
|
||||
|
||||
import com.arsdigita.globalization.GlobalizationHelper;
|
||||
import com.arsdigita.bebop.util.GlobalizationUtil;
|
||||
|
||||
import com.arsdigita.xml.Element;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Locale;
|
||||
|
||||
|
|
@ -203,7 +209,8 @@ public class Date extends Widget implements BebopConstants {
|
|||
public Date(ParameterModel model) {
|
||||
super(model);
|
||||
|
||||
if (!(model instanceof DateParameter || model instanceof DateTimeParameter)) {
|
||||
if (!(model instanceof DateParameter
|
||||
|| model instanceof DateTimeParameter)) {
|
||||
throw new IllegalArgumentException(
|
||||
"The Date widget " + model.getName()
|
||||
+ " must be backed by a DateParameter parmeter model");
|
||||
|
|
@ -254,9 +261,12 @@ public class Date extends Widget implements BebopConstants {
|
|||
// Create an empty year entry to unset a date, if either
|
||||
// a) skipYearAllowed is true
|
||||
// b) skipDayAllowed is true and skipMonthAllowed is true, to unset a date
|
||||
if (((IncompleteDateParameter) this.getParameterModel()).isSkipYearAllowed()
|
||||
|| (((IncompleteDateParameter) this.getParameterModel()).isSkipDayAllowed()
|
||||
&& ((IncompleteDateParameter) this.getParameterModel())
|
||||
if (((IncompleteDateParameter) this.getParameterModel())
|
||||
.isSkipYearAllowed()
|
||||
|| (((IncompleteDateParameter) this.getParameterModel())
|
||||
.isSkipDayAllowed()
|
||||
&& ((IncompleteDateParameter) this
|
||||
.getParameterModel())
|
||||
.isSkipMonthAllowed())) {
|
||||
m_year.addOption(new Option("", ""));
|
||||
}
|
||||
|
|
@ -266,7 +276,7 @@ public class Date extends Widget implements BebopConstants {
|
|||
m_year.addOption(new Option(String.valueOf(year)));
|
||||
}
|
||||
} else {
|
||||
for(int year = m_year_end; year >= m_year_begin; year--) {
|
||||
for (int year = m_year_end; year >= m_year_begin; year--) {
|
||||
m_year.addOption(new Option(String.valueOf(year)));
|
||||
}
|
||||
}
|
||||
|
|
@ -305,8 +315,8 @@ public class Date extends Widget implements BebopConstants {
|
|||
}
|
||||
|
||||
/**
|
||||
* Sets the <tt>MAXLENGTH</tt> attribute for the <tt>INPUT</tt> tag used to render this form
|
||||
* element.
|
||||
* Sets the <tt>MAXLENGTH</tt> attribute for the <tt>INPUT</tt> tag used to
|
||||
* render this form element.
|
||||
*
|
||||
* @param length
|
||||
*/
|
||||
|
|
@ -344,7 +354,8 @@ public class Date extends Widget implements BebopConstants {
|
|||
Element date = parent.newChildElement(getElementTag(), BEBOP_XML_NS);
|
||||
date.addAttribute("name", getParameterModel().getName());
|
||||
if (getLabel() != null) {
|
||||
date.addAttribute("label", (String) getLabel().localize(ps.getRequest()));
|
||||
date.addAttribute("label", (String) getLabel().localize(ps
|
||||
.getRequest()));
|
||||
}
|
||||
exportAttributes(date);
|
||||
generateDescriptionXML(ps, date);
|
||||
|
|
@ -360,7 +371,8 @@ public class Date extends Widget implements BebopConstants {
|
|||
public void generateLocalizedWidget(PageState ps, Element date) {
|
||||
|
||||
Locale defaultLocale = Locale.getDefault();
|
||||
Locale locale = GlobalizationHelper.getNegotiatedLocale();
|
||||
Locale locale = CdiUtil.createCdiUtil().findBean(
|
||||
GlobalizationHelper.class).getNegotiatedLocale();
|
||||
|
||||
// Get the current Pattern
|
||||
// XXX This is really, really, really, really, really, really bad
|
||||
|
|
@ -418,9 +430,9 @@ public class Date extends Widget implements BebopConstants {
|
|||
}
|
||||
|
||||
/**
|
||||
* Sets the Form Object for this Widget. This method will throw an exception if the _form
|
||||
* pointer is already set. To explicity change the _form pointer the developer must first call
|
||||
* setForm(null)
|
||||
* Sets the Form Object for this Widget. This method will throw an exception
|
||||
* if the _form pointer is already set. To explicity change the _form
|
||||
* pointer the developer must first call setForm(null)
|
||||
*
|
||||
* @param f the <code>Form</code> Object for this Widget.
|
||||
*
|
||||
|
|
@ -458,7 +470,8 @@ public class Date extends Widget implements BebopConstants {
|
|||
|
||||
private void populateMonthOptions() {
|
||||
|
||||
Locale locale = GlobalizationHelper.getNegotiatedLocale();
|
||||
Locale locale = CdiUtil.createCdiUtil().findBean(
|
||||
GlobalizationHelper.class).getNegotiatedLocale();
|
||||
|
||||
if (m_locale == null || (locale != null && !m_locale.equals(locale))) {
|
||||
|
||||
|
|
@ -468,7 +481,8 @@ public class Date extends Widget implements BebopConstants {
|
|||
m_month.clearOptions();
|
||||
|
||||
if (this.getParameterModel() instanceof IncompleteDateParameter) {
|
||||
if (((IncompleteDateParameter) this.getParameterModel()).isSkipMonthAllowed()) {
|
||||
if (((IncompleteDateParameter) this.getParameterModel())
|
||||
.isSkipMonthAllowed()) {
|
||||
m_month.addOption(new Option("", ""));
|
||||
}
|
||||
}
|
||||
|
|
@ -480,7 +494,8 @@ public class Date extends Widget implements BebopConstants {
|
|||
m_month.addOption(new Option(String.valueOf(i), months[i]));
|
||||
}
|
||||
}
|
||||
m_locale = GlobalizationHelper.getNegotiatedLocale();
|
||||
m_locale = CdiUtil.createCdiUtil().findBean(
|
||||
GlobalizationHelper.class).getNegotiatedLocale();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -26,9 +26,9 @@ import com.arsdigita.bebop.parameters.ParameterData;
|
|||
import com.arsdigita.bebop.parameters.ParameterModel;
|
||||
import com.arsdigita.bebop.parameters.ParameterModelWrapper;
|
||||
import com.arsdigita.bebop.util.BebopConstants;
|
||||
import com.arsdigita.globalization.GlobalizationHelper;
|
||||
import com.arsdigita.util.Assert;
|
||||
import com.arsdigita.xml.Element;
|
||||
|
||||
import java.text.Collator;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
|
@ -41,6 +41,8 @@ import javax.servlet.http.HttpServletRequest;
|
|||
import javax.servlet.http.HttpServletRequestWrapper;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
|
||||
/**
|
||||
* A class representing any widget that contains a list of options.
|
||||
|
|
@ -62,7 +64,6 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
* would break the API.
|
||||
*/
|
||||
//protected String m_xmlElement;
|
||||
|
||||
// this only needs to be an ArrayList for multiple selection option groups
|
||||
private List<String> m_selected;
|
||||
private List<Option> m_options;
|
||||
|
|
@ -84,13 +85,16 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
private final static String TOO_MANY_OPTIONS_SELECTED
|
||||
= "Only one option may be selected by default on this option group.";
|
||||
|
||||
|
||||
/** request-local copy of selected elements, options */
|
||||
/**
|
||||
* request-local copy of selected elements, options
|
||||
*/
|
||||
private final RequestLocal m_requestOptions = new RequestLocal() {
|
||||
|
||||
@Override
|
||||
public Object initialValue(final PageState state) {
|
||||
return new ArrayList<Option>();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -104,6 +108,7 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
|
||||
/**
|
||||
* The ParameterModel for multiple OptionGroups is always an array parameter
|
||||
*
|
||||
* @param model
|
||||
*
|
||||
* @param model
|
||||
|
|
@ -150,9 +155,10 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
public abstract String getOptionXMLElement();
|
||||
|
||||
/**
|
||||
* This {@link Comparator} implementation is used to sort the list of options alphabetical. If
|
||||
* the sorting is ascending or descending depends on the selected sort mode. The Comparator
|
||||
* needs the {@link PageState} for retrieving the localised labels from the options.
|
||||
* This {@link Comparator} implementation is used to sort the list of
|
||||
* options alphabetical. If the sorting is ascending or descending depends
|
||||
* on the selected sort mode. The Comparator needs the {@link PageState} for
|
||||
* retrieving the localised labels from the options.
|
||||
*/
|
||||
private class AlphabeticalSortComparator implements Comparator<Option> {
|
||||
|
||||
|
|
@ -196,7 +202,8 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
//Depending on the sort mode we compare label1 with label2 (ascending) or label2 with
|
||||
//label1 (descending).
|
||||
final Collator collator = Collator
|
||||
.getInstance(GlobalizationHelper.getNegotiatedLocale());
|
||||
.getInstance(CdiUtil.createCdiUtil().findBean(
|
||||
GlobalizationHelper.class).getNegotiatedLocale());
|
||||
if (sortMode == SortMode.ALPHABETICAL_ASCENDING) {
|
||||
return collator.compare(label1, label2);
|
||||
} else if (sortMode == SortMode.ALPHABETICAL_DESENDING) {
|
||||
|
|
@ -209,8 +216,8 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns an Iterator of all the default Options in this group, plus any request-specific
|
||||
* options.
|
||||
* Returns an Iterator of all the default Options in this group, plus any
|
||||
* request-specific options.
|
||||
*
|
||||
* @param state
|
||||
*
|
||||
|
|
@ -220,7 +227,8 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
List<Option> allOptions = new ArrayList<Option>();
|
||||
allOptions.addAll(m_options);
|
||||
List<Option> requestOptions = (List<Option>) m_requestOptions.get(state);
|
||||
for (Iterator<Option> iterator = requestOptions.iterator(); iterator.hasNext();) {
|
||||
for (Iterator<Option> iterator = requestOptions.iterator(); iterator
|
||||
.hasNext();) {
|
||||
final Option option = iterator.next();
|
||||
if (!allOptions.contains(option)) {
|
||||
allOptions.add(option);
|
||||
|
|
@ -237,8 +245,9 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
/**
|
||||
* Adds a new option.
|
||||
*
|
||||
* @param option The {@link Option} to be added. Note: the argument is modified and associated
|
||||
* with this OptionGroup, regardless of what its group was.
|
||||
* @param option The {@link Option} to be added. Note: the argument is
|
||||
* modified and associated with this OptionGroup, regardless
|
||||
* of what its group was.
|
||||
*/
|
||||
public void addOption(final Option option) {
|
||||
addOption(option, null, false);
|
||||
|
|
@ -257,8 +266,9 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
/**
|
||||
* Adds a new option at the beginning of the list.
|
||||
*
|
||||
* @param option The {@link Option} to be added. Note: the argument is modified and associated
|
||||
* with this OptionGroup, regardless of what its group was.
|
||||
* @param option The {@link Option} to be added. Note: the argument is
|
||||
* modified and associated with this OptionGroup, regardless
|
||||
* of what its group was.
|
||||
*/
|
||||
public void prependOption(final Option option) {
|
||||
addOption(option, null, true);
|
||||
|
|
@ -273,15 +283,19 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
}
|
||||
|
||||
/**
|
||||
* Adds a new option for the scope of the current request, or to the page
|
||||
* as a whole if there is no current request.
|
||||
* Adds a new option for the scope of the current request, or to the page as
|
||||
* a whole if there is no current request.
|
||||
*
|
||||
* @param option The {@link Option} to be added. Note: the argument is modified and associated
|
||||
* with this OptionGroup, regardless of what its group was.
|
||||
* @param state the current page state. if ps is null, adds option to the default option list.
|
||||
* @param prepend If true, prepend option to the list instead of appending it
|
||||
* @param option The {@link Option} to be added. Note: the argument is
|
||||
* modified and associated with this OptionGroup, regardless
|
||||
* of what its group was.
|
||||
* @param state the current page state. if ps is null, adds option to the
|
||||
* default option list.
|
||||
* @param prepend If true, prepend option to the list instead of appending
|
||||
* it
|
||||
*/
|
||||
public void addOption(final Option option, final PageState state, final boolean prepend) {
|
||||
public void addOption(final Option option, final PageState state,
|
||||
final boolean prepend) {
|
||||
List<Option> list = m_options;
|
||||
if (state == null) {
|
||||
Assert.isUnlocked(this);
|
||||
|
|
@ -312,11 +326,12 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
}
|
||||
|
||||
/**
|
||||
* Removes the first option whose key is isEqual to the key that is
|
||||
* passed in.
|
||||
* Removes the first option whose key is isEqual to the key that is passed
|
||||
* in.
|
||||
*
|
||||
* @param key
|
||||
* @param state the current page state. if ps is null, adds option to
|
||||
* the default option list.
|
||||
* @param state the current page state. if ps is null, adds option to the
|
||||
* default option list.
|
||||
*/
|
||||
public void removeOption(final String key, final PageState state) {
|
||||
// This is not an entirely efficient technique. A more
|
||||
|
|
@ -345,10 +360,12 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
*
|
||||
* @param label
|
||||
* @param width The width, in characters, of the "Other" entry area
|
||||
* @param height The height, in characters, of the "Other" entry area. If this is 1 then a
|
||||
* TextField is used. Otherwise a TextArea is used.
|
||||
* @param height The height, in characters, of the "Other" entry area. If
|
||||
* this is 1 then a TextField is used. Otherwise a TextArea is
|
||||
* used.
|
||||
*/
|
||||
public void addOtherOption(final String label, final int width, final int height) {
|
||||
public void addOtherOption(final String label, final int width,
|
||||
final int height) {
|
||||
Assert.isUnlocked(this);
|
||||
|
||||
final Option otherOption = new Option(OTHER_OPTION, label);
|
||||
|
|
@ -383,12 +400,14 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
setParameterModel(new ParameterModelWrapper(model) {
|
||||
|
||||
@Override
|
||||
public ParameterData createParameterData(final HttpServletRequest request,
|
||||
public ParameterData createParameterData(
|
||||
final HttpServletRequest request,
|
||||
Object defaultValue,
|
||||
boolean isSubmission) {
|
||||
|
||||
final String[] values = request.getParameterValues(getName());
|
||||
String[] otherValues = request.getParameterValues(getName() + ".other");
|
||||
String[] otherValues = request.getParameterValues(getName()
|
||||
+ ".other");
|
||||
|
||||
String other = (null == otherValues) ? null : otherValues[0];
|
||||
|
||||
|
|
@ -402,7 +421,8 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
|
||||
LOGGER.debug("createParameterData in OptionGroup");
|
||||
|
||||
return super.createParameterData(new HttpServletRequestWrapper(request) {
|
||||
return super.createParameterData(new HttpServletRequestWrapper(
|
||||
request) {
|
||||
|
||||
@Override
|
||||
public String[] getParameterValues(String key) {
|
||||
|
|
@ -426,8 +446,8 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
}
|
||||
|
||||
/**
|
||||
* Make an option selected by default. Updates the parameter model for
|
||||
* the option group accordingly.
|
||||
* Make an option selected by default. Updates the parameter model for the
|
||||
* option group accordingly.
|
||||
*
|
||||
* @param value the value of the option to be added to the
|
||||
* by-default-selected set.
|
||||
|
|
@ -466,9 +486,9 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
}
|
||||
|
||||
/**
|
||||
* Whether this a multiple (and not single) selection option group.
|
||||
* Note that this should really be declared abstract, but we can't because
|
||||
* it used to be in the direct subclass Select and making it abstract could
|
||||
* Whether this a multiple (and not single) selection option group. Note
|
||||
* that this should really be declared abstract, but we can't because it
|
||||
* used to be in the direct subclass Select and making it abstract could
|
||||
* break other subclasses that don't declare isMultiple. So we have a
|
||||
* trivial implementation instead.
|
||||
*
|
||||
|
|
@ -524,12 +544,13 @@ public abstract class OptionGroup extends Widget implements BebopConstants {
|
|||
*/
|
||||
@Override
|
||||
public void generateWidget(final PageState state, final Element parent) {
|
||||
final Element optionGroup = parent.newChildElement(getElementTag(), BEBOP_XML_NS);
|
||||
final Element optionGroup = parent.newChildElement(getElementTag(),
|
||||
BEBOP_XML_NS);
|
||||
optionGroup.addAttribute("name", getName());
|
||||
optionGroup.addAttribute("class", getName().replace(".", " "));
|
||||
// Localized title for this option group
|
||||
if (getLabel() != null) {
|
||||
optionGroup.addAttribute("label", (String)getLabel()
|
||||
optionGroup.addAttribute("label", (String) getLabel()
|
||||
.localize(state.getRequest()));
|
||||
}
|
||||
if (isMultiple()) {
|
||||
|
|
|
|||
|
|
@ -29,9 +29,12 @@ import com.arsdigita.bebop.parameters.ParameterModel;
|
|||
import com.arsdigita.bebop.parameters.TimeParameter;
|
||||
|
||||
import com.arsdigita.bebop.util.BebopConstants;
|
||||
import com.arsdigita.globalization.GlobalizationHelper;
|
||||
import com.arsdigita.util.Assert;
|
||||
import com.arsdigita.xml.Element;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
|
||||
import java.text.DateFormat;
|
||||
|
||||
import java.text.DateFormatSymbols;
|
||||
|
|
@ -64,9 +67,11 @@ public class Time extends Widget implements BebopConstants {
|
|||
super(name);
|
||||
this.parent = parent;
|
||||
if (has12HourClock()) {
|
||||
this.addValidationListener(new NumberInRangeValidationListener(1, 12));
|
||||
this.addValidationListener(
|
||||
new NumberInRangeValidationListener(1, 12));
|
||||
} else {
|
||||
this.addValidationListener(new NumberInRangeValidationListener(1, 24));
|
||||
this.addValidationListener(
|
||||
new NumberInRangeValidationListener(1, 24));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -87,6 +92,7 @@ public class Time extends Widget implements BebopConstants {
|
|||
return parent.getFragmentValue(ps, Calendar.HOUR_OF_DAY);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class MinuteFragment extends TextField {
|
||||
|
|
@ -96,7 +102,8 @@ public class Time extends Widget implements BebopConstants {
|
|||
public MinuteFragment(String name, Time parent) {
|
||||
super(name);
|
||||
this.parent = parent;
|
||||
this.addValidationListener(new NumberInRangeValidationListener(0, 59));
|
||||
this.addValidationListener(
|
||||
new NumberInRangeValidationListener(0, 59));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -120,6 +127,7 @@ public class Time extends Widget implements BebopConstants {
|
|||
return min.toString();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class SecondFragment extends TextField {
|
||||
|
|
@ -129,7 +137,8 @@ public class Time extends Widget implements BebopConstants {
|
|||
public SecondFragment(String name, Time parent) {
|
||||
super(name);
|
||||
this.parent = parent;
|
||||
this.addValidationListener(new NumberInRangeValidationListener(0, 59));
|
||||
this.addValidationListener(
|
||||
new NumberInRangeValidationListener(0, 59));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -153,6 +162,7 @@ public class Time extends Widget implements BebopConstants {
|
|||
return sec.toString();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class AmPmFragment extends SingleSelect {
|
||||
|
|
@ -177,18 +187,24 @@ public class Time extends Widget implements BebopConstants {
|
|||
public Object getValue(PageState ps) {
|
||||
return parent.getFragmentValue(ps, Calendar.AM_PM);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/** Constructor. */
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
public Time(ParameterModel model) {
|
||||
this(model, false);
|
||||
}
|
||||
|
||||
/** Constructor. */
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
public Time(ParameterModel model, boolean showSeconds) {
|
||||
super(model);
|
||||
|
||||
if (!(model instanceof TimeParameter || model instanceof DateTimeParameter)) {
|
||||
if (!(model instanceof TimeParameter
|
||||
|| model instanceof DateTimeParameter)) {
|
||||
throw new IllegalArgumentException(
|
||||
"The Time widget " + model.getName()
|
||||
+ " must be backed by a TimeParameter parameter model");
|
||||
|
|
@ -232,14 +248,16 @@ public class Time extends Widget implements BebopConstants {
|
|||
this(new TimeParameter(name));
|
||||
}
|
||||
|
||||
/** Returns a string naming the type of this widget. */
|
||||
/**
|
||||
* Returns a string naming the type of this widget.
|
||||
*/
|
||||
public String getType() {
|
||||
return "time";
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the <tt>MAXLENGTH</tt> attributes for the <tt>INPUT</tt> tag
|
||||
* used to render this form element.
|
||||
* Sets the <tt>MAXLENGTH</tt> attributes for the <tt>INPUT</tt> tag used to
|
||||
* render this form element.
|
||||
*/
|
||||
public void setMaxLength(int length) {
|
||||
setAttribute("MAXLENGTH", String.valueOf(length));
|
||||
|
|
@ -249,7 +267,9 @@ public class Time extends Widget implements BebopConstants {
|
|||
return true;
|
||||
}
|
||||
|
||||
/** The XML tag for this derived class of Widget. */
|
||||
/**
|
||||
* The XML tag for this derived class of Widget.
|
||||
*/
|
||||
@Override
|
||||
protected String getElementTag() {
|
||||
return BEBOP_TIME;
|
||||
|
|
@ -309,12 +329,12 @@ public class Time extends Widget implements BebopConstants {
|
|||
}
|
||||
|
||||
/**
|
||||
* Sets the Form Object for this Widget. This method will throw an
|
||||
* exception if the _form pointer is already set. To explicity
|
||||
* change the _form pointer the developer must first call
|
||||
* setForm(null)
|
||||
* Sets the Form Object for this Widget. This method will throw an exception
|
||||
* if the _form pointer is already set. To explicity change the _form
|
||||
* pointer the developer must first call setForm(null)
|
||||
*
|
||||
* @param the <code>Form</code> Object for this Widget.
|
||||
*
|
||||
* @exception IllegalStateException if form already set.
|
||||
*/
|
||||
@Override
|
||||
|
|
@ -347,9 +367,12 @@ public class Time extends Widget implements BebopConstants {
|
|||
}
|
||||
|
||||
private boolean has12HourClock() {
|
||||
Locale locale = GlobalizationHelper.getNegotiatedLocale();
|
||||
DateFormat format_12Hour = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US);
|
||||
DateFormat format_locale = DateFormat.getTimeInstance(DateFormat.SHORT, locale);
|
||||
Locale locale = CdiUtil.createCdiUtil().findBean(
|
||||
GlobalizationHelper.class).getNegotiatedLocale();
|
||||
DateFormat format_12Hour = DateFormat.getTimeInstance(DateFormat.SHORT,
|
||||
Locale.US);
|
||||
DateFormat format_locale = DateFormat.getTimeInstance(DateFormat.SHORT,
|
||||
locale);
|
||||
|
||||
String midnight = "";
|
||||
try {
|
||||
|
|
@ -359,4 +382,5 @@ public class Time extends Widget implements BebopConstants {
|
|||
|
||||
return midnight.contains("12");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ package com.arsdigita.bebop.page;
|
|||
import com.arsdigita.bebop.BebopConfig;
|
||||
import com.arsdigita.dispatcher.DispatcherHelper;
|
||||
import com.arsdigita.globalization.Globalization;
|
||||
import com.arsdigita.globalization.GlobalizationHelper;
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
import com.arsdigita.templating.PresentationManager;
|
||||
import com.arsdigita.templating.Templating;
|
||||
|
|
@ -56,6 +55,8 @@ import javax.xml.transform.dom.DOMSource;
|
|||
import javax.xml.transform.stream.StreamResult;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
|
||||
/**
|
||||
* A class for managing and obtaining a Stylesheet based on the current
|
||||
|
|
@ -197,7 +198,9 @@ public class PageTransformer implements PresentationManager {
|
|||
@Override
|
||||
public String generateValue(
|
||||
HttpServletRequest request) {
|
||||
return GlobalizationHelper
|
||||
return CdiUtil.createCdiUtil()
|
||||
.findBean(
|
||||
GlobalizationHelper.class)
|
||||
.getNegotiatedLocale()
|
||||
.getLanguage();
|
||||
}
|
||||
|
|
@ -211,8 +214,10 @@ public class PageTransformer implements PresentationManager {
|
|||
public String generateValue(
|
||||
HttpServletRequest request) {
|
||||
Locale selectedLocale
|
||||
= com.arsdigita.globalization.GlobalizationHelper
|
||||
.getSelectedLocale(request);
|
||||
= CdiUtil.createCdiUtil()
|
||||
.findBean(
|
||||
GlobalizationHelper.class)
|
||||
.getSelectedLocale();
|
||||
return (selectedLocale != null)
|
||||
? selectedLocale
|
||||
.toString() : "";
|
||||
|
|
|
|||
|
|
@ -19,20 +19,21 @@
|
|||
package com.arsdigita.bebop.parameters;
|
||||
|
||||
import com.arsdigita.globalization.Globalization;
|
||||
import com.arsdigita.globalization.GlobalizationHelper;
|
||||
|
||||
import com.arsdigita.util.StringUtils;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.ParseException;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
import java.util.Locale;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* A class that represents the model for a time form parameter.
|
||||
*
|
||||
|
|
@ -40,57 +41,58 @@ import javax.servlet.http.HttpServletRequest;
|
|||
* @author Dave Turner
|
||||
* @version $Id$
|
||||
*/
|
||||
public class TimeParameter extends ParameterModel
|
||||
{
|
||||
public class TimeParameter extends ParameterModel {
|
||||
|
||||
public TimeParameter ( String name ) {
|
||||
public TimeParameter(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns a new Calendar object that is manipulated
|
||||
* within transformValue to create a Date Object. This method should
|
||||
* be overridden if you wish to use a Calendar other than the
|
||||
* lenient GregorianCalendar.
|
||||
* This method returns a new Calendar object that is manipulated within
|
||||
* transformValue to create a Date Object. This method should be overridden
|
||||
* if you wish to use a Calendar other than the lenient GregorianCalendar.
|
||||
*
|
||||
* @param request the servlet request from which Locale can be
|
||||
* extracted if needed
|
||||
* @param request the servlet request from which Locale can be extracted if
|
||||
* needed
|
||||
*
|
||||
* @return a new Calendar object
|
||||
* */
|
||||
*
|
||||
*/
|
||||
protected Calendar getCalendar(HttpServletRequest request) {
|
||||
return new GregorianCalendar();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Computes a dateTime object from multiple parameters in the
|
||||
* request. This method searches for parameters named
|
||||
* <code>getName() + ".hour"<code>,
|
||||
* Computes a dateTime object from multiple parameters in the request. This
|
||||
* method searches for parameters named <code>getName() + ".hour"<code>,
|
||||
* <code>getName() + ".minute"<code>,
|
||||
* <code>getName() + ".second"<code>, and
|
||||
* <code>getName() + ".amOrPm"<code>.
|
||||
* */
|
||||
*
|
||||
*/
|
||||
public Object transformValue(HttpServletRequest request)
|
||||
throws IllegalArgumentException {
|
||||
|
||||
Calendar c = getCalendar(request);
|
||||
c.clear();
|
||||
|
||||
String hour = Globalization.decodeParameter(request, getName()+".hour");
|
||||
String minute = Globalization.decodeParameter(request, getName()+".minute");
|
||||
String second = Globalization.decodeParameter(request, getName()+".second");
|
||||
String amOrPm = Globalization.decodeParameter(request, getName()+".amOrPm");
|
||||
String hour = Globalization
|
||||
.decodeParameter(request, getName() + ".hour");
|
||||
String minute = Globalization.decodeParameter(request, getName()
|
||||
+ ".minute");
|
||||
String second = Globalization.decodeParameter(request, getName()
|
||||
+ ".second");
|
||||
String amOrPm = Globalization.decodeParameter(request, getName()
|
||||
+ ".amOrPm");
|
||||
|
||||
if (StringUtils.emptyString(hour) &&
|
||||
StringUtils.emptyString(minute) &&
|
||||
StringUtils.emptyString(second)) {
|
||||
if (StringUtils.emptyString(hour) && StringUtils.emptyString(minute)
|
||||
&& StringUtils.emptyString(second)) {
|
||||
return transformSingleValue(request);
|
||||
}
|
||||
|
||||
if (!StringUtils.emptyString(hour)) {
|
||||
int hourInt = Integer.parseInt(hour);
|
||||
/* Das ist alles Blödsinn. Beim 24-Stundenformat brauchen wir das sowieso nicht.
|
||||
/* Das ist alles Blödsinn. Beim 24-Stundenformat brauchen wir das sowieso nicht.
|
||||
Beim 12-Stunden-Formato müßte es, wenn überhaupt, anderherum sein: Aus einer
|
||||
eingetragenen 0 in den Stunden muß eine 12 werden. ABER: Die Informationen
|
||||
werden in einem Calendar-Object gespeichert, das intern immer 24-Stunden-Format
|
||||
|
|
@ -100,7 +102,7 @@ zu 0:00 Uhr wird.
|
|||
if ((hourInt == 12) && has12HourClock()) {
|
||||
hourInt = 0;
|
||||
}
|
||||
*/
|
||||
*/
|
||||
c.set(Calendar.HOUR, hourInt);
|
||||
}
|
||||
|
||||
|
|
@ -112,35 +114,38 @@ zu 0:00 Uhr wird.
|
|||
c.set(Calendar.SECOND, Integer.parseInt(second));
|
||||
}
|
||||
|
||||
if ( amOrPm != null ) {
|
||||
if (amOrPm != null) {
|
||||
c.set(Calendar.AM_PM, Integer.parseInt(amOrPm));
|
||||
}
|
||||
|
||||
return c.getTime();
|
||||
}
|
||||
|
||||
|
||||
public Object unmarshal ( String encoded ) {
|
||||
public Object unmarshal(String encoded) {
|
||||
try {
|
||||
return new Date(Long.parseLong(encoded));
|
||||
} catch ( NumberFormatException ex ) {
|
||||
} catch (NumberFormatException ex) {
|
||||
throw new IllegalArgumentException("Cannot unmarshal time '"
|
||||
+ encoded + "': " + ex.getMessage());
|
||||
+ encoded + "': " + ex
|
||||
.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public String marshal ( Object value ) {
|
||||
return Long.toString(((Date)value).getTime());
|
||||
public String marshal(Object value) {
|
||||
return Long.toString(((Date) value).getTime());
|
||||
}
|
||||
|
||||
public Class getValueClass () {
|
||||
public Class getValueClass() {
|
||||
return Date.class;
|
||||
}
|
||||
|
||||
private boolean has12HourClock() {
|
||||
Locale locale = GlobalizationHelper.getNegotiatedLocale();
|
||||
DateFormat format_12Hour = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US);
|
||||
DateFormat format_locale = DateFormat.getTimeInstance(DateFormat.SHORT, locale);
|
||||
Locale locale = CdiUtil.createCdiUtil().findBean(
|
||||
GlobalizationHelper.class).getNegotiatedLocale();
|
||||
DateFormat format_12Hour = DateFormat.getTimeInstance(DateFormat.SHORT,
|
||||
Locale.US);
|
||||
DateFormat format_locale = DateFormat.getTimeInstance(DateFormat.SHORT,
|
||||
locale);
|
||||
|
||||
String midnight = "";
|
||||
try {
|
||||
|
|
@ -150,4 +155,5 @@ zu 0:00 Uhr wird.
|
|||
|
||||
return midnight.contains("12");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,8 +22,12 @@ import java.text.MessageFormat;
|
|||
import java.util.Locale;
|
||||
import java.util.MissingResourceException;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
|
|
@ -209,8 +213,8 @@ public class GlobalizedMessage {
|
|||
* GlobalizedObject?
|
||||
*/
|
||||
public Object localize() {
|
||||
return localize(com.arsdigita.globalization.GlobalizationHelper
|
||||
.getNegotiatedLocale());
|
||||
return localize(CdiUtil.createCdiUtil().findBean(
|
||||
GlobalizationHelper.class).getNegotiatedLocale());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -232,8 +236,8 @@ public class GlobalizedMessage {
|
|||
* GlobalizedObject?
|
||||
*/
|
||||
public Object localize(final HttpServletRequest request) {
|
||||
return localize(com.arsdigita.globalization.GlobalizationHelper
|
||||
.getNegotiatedLocale());
|
||||
return localize(CdiUtil.createCdiUtil().findBean(
|
||||
GlobalizationHelper.class).getNegotiatedLocale());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -18,15 +18,18 @@ import javax.servlet.http.HttpServletRequest;
|
|||
import javax.servlet.http.HttpSession;
|
||||
|
||||
/**
|
||||
*
|
||||
* @deprecated Replaced by {@link org.libreccm.l10n.GlobalizationHelper}
|
||||
*
|
||||
* @author Sören Bernstein <quasi@quasiweb.de>
|
||||
*/
|
||||
public class GlobalizationHelper {
|
||||
@Deprecated
|
||||
public class LegacyGlobalizationHelper {
|
||||
|
||||
private static final String LANG_PARAM = "lang";
|
||||
|
||||
// Don't instantiate
|
||||
private GlobalizationHelper() {
|
||||
private LegacyGlobalizationHelper() {
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -36,14 +39,14 @@ public class GlobalizationHelper {
|
|||
*
|
||||
* @return The negotiated locale
|
||||
*/
|
||||
public static java.util.Locale getNegotiatedLocale() {
|
||||
public static Locale getNegotiatedLocale() {
|
||||
final KernelConfig kernelConfig = KernelConfig.getConfig();
|
||||
|
||||
// Set the preferedLocale to the default locale (first entry in the config parameter list)
|
||||
java.util.Locale preferedLocale = getPrefferedLocale();
|
||||
Locale preferedLocale = getPrefferedLocale();
|
||||
|
||||
// The ACCEPTED_LANGUAGES from the client
|
||||
Enumeration<java.util.Locale> locales = null;
|
||||
Enumeration<Locale> locales = null;
|
||||
|
||||
// Try to get the RequestContext
|
||||
try {
|
||||
|
|
@ -53,7 +56,7 @@ public class GlobalizationHelper {
|
|||
.getRequest());
|
||||
|
||||
// Get the selected locale from the request, if any
|
||||
java.util.Locale selectedLocale = getSelectedLocale(request);
|
||||
Locale selectedLocale = getSelectedLocale(request);
|
||||
if (selectedLocale != null && kernelConfig.hasLanguage(
|
||||
selectedLocale.getLanguage())) {
|
||||
preferedLocale = selectedLocale;
|
||||
|
|
@ -65,7 +68,7 @@ public class GlobalizationHelper {
|
|||
while (locales.hasMoreElements()) {
|
||||
|
||||
// Test if the current locale is listed in the supported locales list
|
||||
java.util.Locale curLocale = (Locale) locales.nextElement();
|
||||
Locale curLocale = (Locale) locales.nextElement();
|
||||
if (kernelConfig.hasLanguage(curLocale.getLanguage())) {
|
||||
preferedLocale = curLocale;
|
||||
break;
|
||||
|
|
@ -82,13 +85,13 @@ public class GlobalizationHelper {
|
|||
}
|
||||
}
|
||||
|
||||
// public static java.util.Locale getSystemLocale() {
|
||||
// public static Locale getSystemLocale() {
|
||||
//
|
||||
// }
|
||||
private static Locale getPrefferedLocale() {
|
||||
final KernelConfig kernelConfig = KernelConfig.getConfig();
|
||||
|
||||
java.util.Locale preferedLocale = new java.util.Locale(kernelConfig
|
||||
Locale preferedLocale = new Locale(kernelConfig
|
||||
.getDefaultLanguage(), "", "");
|
||||
return preferedLocale;
|
||||
}
|
||||
|
|
@ -96,12 +99,12 @@ public class GlobalizationHelper {
|
|||
/**
|
||||
* Get the selected (as in fixed) locale from the ServletRequest
|
||||
*
|
||||
* @return the selected locale as java.util.Locale or null if not defined
|
||||
* @return the selected locale as Locale or null if not defined
|
||||
*/
|
||||
public static Locale getSelectedLocale(ServletRequest request) {
|
||||
|
||||
// Return value
|
||||
java.util.Locale selectedLocale = null;
|
||||
Locale selectedLocale = null;
|
||||
|
||||
// Access current HttpSession or create a new one, if none exist
|
||||
HttpSession session = ((HttpServletRequest) request).getSession(true);
|
||||
|
|
@ -132,19 +135,19 @@ public class GlobalizationHelper {
|
|||
*
|
||||
* @param lang A string encoded locale, as provided by browsers
|
||||
*
|
||||
* @return A java.util.Locale representation of the language string
|
||||
* @return A Locale representation of the language string
|
||||
*/
|
||||
private static java.util.Locale scanLocale(String lang) {
|
||||
private static Locale scanLocale(String lang) {
|
||||
|
||||
// Protect against empty lang string
|
||||
if ((lang != null) && !(lang.isEmpty())) {
|
||||
// Split the string and create the Locale object
|
||||
StringTokenizer paramValues = new StringTokenizer(lang, "_");
|
||||
if (paramValues.countTokens() > 1) {
|
||||
return new java.util.Locale(paramValues.nextToken(), paramValues
|
||||
return new Locale(paramValues.nextToken(), paramValues
|
||||
.nextToken());
|
||||
} else {
|
||||
return new java.util.Locale(paramValues.nextToken());
|
||||
return new Locale(paramValues.nextToken());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -64,7 +64,7 @@ public final class KernelConfig {
|
|||
|
||||
@Setting
|
||||
private Set<String> supportedLanguages = new HashSet<>(
|
||||
Arrays.asList(new String[]{"en"}));
|
||||
Arrays.asList(new String[]{"en", "de"}));
|
||||
|
||||
@Setting
|
||||
private String defaultLanguage = "en";
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@
|
|||
*/
|
||||
package com.arsdigita.ui.admin;
|
||||
|
||||
import com.arsdigita.ui.admin.usersgroupsroles.UsersGroupsRolesTab;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.PageFactory;
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ public final class AdminUiConstants {
|
|||
/**
|
||||
* Globalisation resource for administration UI.
|
||||
*/
|
||||
public static final String BUNDLE_NAME
|
||||
public static final String ADMIN_BUNDLE
|
||||
= "com.arsdigita.ui.admin.AdminResources";
|
||||
|
||||
/**
|
||||
|
|
@ -45,39 +45,39 @@ public final class AdminUiConstants {
|
|||
*/
|
||||
// Label MY_WORKSPACE_LABEL = new Label
|
||||
// (new GlobalizedMessage("ui.admin.nav.workspace",
|
||||
// BUNDLE_NAME));
|
||||
// ADMIN_BUNDLE));
|
||||
// Label LOG_OUT_LABEL = new Label
|
||||
// (new GlobalizedMessage("ui.admin.nav.logout",
|
||||
// BUNDLE_NAME));
|
||||
// ADMIN_BUNDLE));
|
||||
/**
|
||||
* Administration page title
|
||||
*/
|
||||
public static final Label PAGE_TITLE_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.admin.dispatcher.title",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
/**
|
||||
* Administration main tab names.
|
||||
*/
|
||||
public static final Label USER_TAB_TITLE = new Label(new GlobalizedMessage(
|
||||
"ui.admin.tab.user",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label GROUP_TAB_TITLE = new Label(new GlobalizedMessage(
|
||||
"ui.admin.tab.group",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label APPLICATIONS_TAB_TITLE = new Label(
|
||||
new GlobalizedMessage("ui.admin.tab.applications",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label SYSINFO_TAB_TITLE = new Label(
|
||||
new GlobalizedMessage("ui.admin.tab.sysinfo.title", BUNDLE_NAME));
|
||||
new GlobalizedMessage("ui.admin.tab.sysinfo.title", ADMIN_BUNDLE));
|
||||
|
||||
public static final GlobalizedMessage USER_NAVBAR_TITLE
|
||||
= new GlobalizedMessage(
|
||||
"ui.admin.tab.user.navbartitle",
|
||||
BUNDLE_NAME);
|
||||
ADMIN_BUNDLE);
|
||||
|
||||
/**
|
||||
* Tabbed pane indices
|
||||
|
|
@ -90,16 +90,16 @@ public final class AdminUiConstants {
|
|||
*/
|
||||
public static final Label USER_TAB_SUMMARY = new Label(
|
||||
new GlobalizedMessage("ui.admin.tab.user.summary",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
public static final Label USER_TAB_BROWSE = new Label(new GlobalizedMessage(
|
||||
"ui.admin.tab.user.browse",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
public static final Label USER_TAB_SEARCH = new Label(new GlobalizedMessage(
|
||||
"ui.admin.tab.user.search",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
public static final Label USER_TAB_CREATE_USER = new Label(
|
||||
new GlobalizedMessage("ui.admin.tab.user.createuser",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final int USER_TAB_SUMMARY_INDEX = 0;
|
||||
public static final int USER_TAB_BROWSE_INDEX = 1;
|
||||
|
|
@ -123,15 +123,15 @@ public final class AdminUiConstants {
|
|||
* User summary panel.
|
||||
*/
|
||||
public static final Label SUMMARY_PANEL_HEADER = new Label(
|
||||
new GlobalizedMessage("ui.admin.user.summarypanel.header", BUNDLE_NAME));
|
||||
new GlobalizedMessage("ui.admin.user.summarypanel.header", ADMIN_BUNDLE));
|
||||
|
||||
public static final Label CREATE_USER_LABEL = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.summarypanel.createUser", BUNDLE_NAME));
|
||||
"ui.admin.user.summarypanel.createUser", ADMIN_BUNDLE));
|
||||
|
||||
public static final Label TOTAL_USERS_LABEL = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.summarypanel.totalusers", BUNDLE_NAME));
|
||||
"ui.admin.user.summarypanel.totalusers", ADMIN_BUNDLE));
|
||||
|
||||
/**
|
||||
* User browse panel.
|
||||
|
|
@ -139,82 +139,82 @@ public final class AdminUiConstants {
|
|||
public static final Label BROWSE_USER_PANEL_HEADER = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.browsepanel.header",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_INFO_LABEL = new Label(new GlobalizedMessage(
|
||||
"ui.admin.user.userinfo.header",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_EDIT_PANEL_HEADER = new Label(
|
||||
new GlobalizedMessage("ui.admin.user.useredit.header",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_GROUP_PANEL_HEADER = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.groupmembership.header",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_DELETE_FAILED_PANEL_HEADER = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.action.delete.failed.header",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_PASSWORD_PANEL_HEADER = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.password.header",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_ACTION_PANEL_HEADER = new Label(
|
||||
new GlobalizedMessage("ui.admin.user.action.header",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_ACTION_CONTINUE = new Label(
|
||||
new GlobalizedMessage("ui.admin.user.action.continue",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_DELETE_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.admin.user.delete.label",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_BAN_LABEL = new Label(new GlobalizedMessage(
|
||||
"ui.admin.user.ban.label",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_UNBAN_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.admin.user.unban.label",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final GlobalizedMessage USER_DELETE_CONFIRMATION
|
||||
= new GlobalizedMessage(
|
||||
"ui.admin.user.delete.confirm", BUNDLE_NAME);
|
||||
"ui.admin.user.delete.confirm", ADMIN_BUNDLE);
|
||||
|
||||
public static final GlobalizedMessage USER_BAN_CONFIRMATION
|
||||
= new GlobalizedMessage(
|
||||
"ui.admin.user.ban.confirm",
|
||||
BUNDLE_NAME);
|
||||
ADMIN_BUNDLE);
|
||||
|
||||
public static final GlobalizedMessage USER_UNBAN_CONFIRMATION
|
||||
= new GlobalizedMessage(
|
||||
"ui.admin.user.unban.confirm",
|
||||
BUNDLE_NAME);
|
||||
ADMIN_BUNDLE);
|
||||
|
||||
public static final GlobalizedMessage USER_DELETE_FAILED_MSG
|
||||
= new GlobalizedMessage(
|
||||
"ui.admin.user.delete.failed.label", BUNDLE_NAME);
|
||||
"ui.admin.user.delete.failed.label", ADMIN_BUNDLE);
|
||||
|
||||
public static final Label USER_TAB_EXTREME_ACTION_LABEL = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.browsepanel.extremeaction",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label UPDATE_USER_PASSWORD_LABEL = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.browsepanel.updatePassword",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label BECOME_USER_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.admin.user.browsepanel.becomeUser",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
/**
|
||||
* Create new user panel.
|
||||
|
|
@ -222,39 +222,39 @@ public final class AdminUiConstants {
|
|||
public static final Label CREATE_USER_PANEL_HEADER = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.createpanel.header",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
/**
|
||||
* User search panel.
|
||||
*/
|
||||
public static final Label SEARCH_PANEL_HEADER = new Label(
|
||||
new GlobalizedMessage("ui.admin.user.search.header",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label PASSWORD_FORM_LABEL_PASSWORD = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.userpasswordform.passwordlabel",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label PASSWORD_FORM_LABEL_CONFIRMATION_PASSWORD
|
||||
= new Label(new GlobalizedMessage(
|
||||
"ui.admin.user.userpasswordform.confirmpasswordlabel",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label PASSWORD_FORM_LABEL_QUESTION = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.userpasswordform.question",
|
||||
BUNDLE_NAME), false);
|
||||
ADMIN_BUNDLE), false);
|
||||
|
||||
public static final Label PASSWORD_FORM_LABEL_ANSWER = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.userpasswordform.answer",
|
||||
BUNDLE_NAME), false);
|
||||
ADMIN_BUNDLE), false);
|
||||
|
||||
public static final GlobalizedMessage PASSWORD_FORM_SUBMIT
|
||||
= new GlobalizedMessage(
|
||||
"ui.admin.user.userpasswordform.submit",
|
||||
BUNDLE_NAME);
|
||||
ADMIN_BUNDLE);
|
||||
|
||||
/**
|
||||
* Constants for user add/edit form.
|
||||
|
|
@ -279,95 +279,95 @@ public final class AdminUiConstants {
|
|||
public static final Label USER_FORM_LABEL_FIRST_NAME = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.firstname",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_FORM_LABEL_LAST_NAME = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.lastname",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_FORM_LABEL_PASSWORD = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.password",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_FORM_LABEL_PASSWORD_CONFIRMATION = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.confirmation",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_FORM_LABEL_QUESTION = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.question",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_FORM_LABEL_ANSWER = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.answer",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_FORM_LABEL_PRIMARY_EMAIL = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.primaryemail",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_FORM_LABEL_ADDITIONAL_EMAIL = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.additionalemail",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_FORM_LABEL_ADDITIONAL_EMAIL_LIST = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.additionalemaillist",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_FORM_LABEL_SCREEN_NAME = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.screenname",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_FORM_LABEL_SSO = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.ssologinname",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_FORM_LABEL_URL = new Label(
|
||||
new GlobalizedMessage("ui.admin.user.addeditform.url",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label USER_FORM_DELETE_ADDITIONAL_EMAIL = new Label(
|
||||
new GlobalizedMessage("ui.admin.user.addeditform.deleteemail",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final GlobalizedMessage USER_FORM_SUBMIT
|
||||
= new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.submit",
|
||||
BUNDLE_NAME);
|
||||
ADMIN_BUNDLE);
|
||||
|
||||
public static final GlobalizedMessage USER_FORM_ERROR_SCREEN_NAME_NOT_UNIQUE
|
||||
= new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.error.screenname.notunique",
|
||||
BUNDLE_NAME);
|
||||
ADMIN_BUNDLE);
|
||||
|
||||
public static final GlobalizedMessage USER_FORM_ERROR_PRIMARY_EMAIL_NOT_UNIQUE
|
||||
= new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.error.primaryemail.notunique",
|
||||
BUNDLE_NAME);
|
||||
ADMIN_BUNDLE);
|
||||
|
||||
public static final GlobalizedMessage USER_FORM_ERROR_PASSWORD_NOT_MATCH
|
||||
= new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.error.password.notmatch",
|
||||
BUNDLE_NAME);
|
||||
ADMIN_BUNDLE);
|
||||
|
||||
public static final GlobalizedMessage USER_FORM_ERROR_ANSWER_NULL
|
||||
= new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.error.answer.null",
|
||||
BUNDLE_NAME);
|
||||
ADMIN_BUNDLE);
|
||||
|
||||
public static final GlobalizedMessage USER_FORM_ERROR_ANSWER_WHITESPACE
|
||||
= new GlobalizedMessage(
|
||||
"ui.admin.user.addeditform.error.answer.whitespace",
|
||||
BUNDLE_NAME);
|
||||
ADMIN_BUNDLE);
|
||||
|
||||
/**
|
||||
* Constants for group add/edit form.
|
||||
|
|
@ -380,115 +380,115 @@ public final class AdminUiConstants {
|
|||
public static final Label GROUP_FORM_LABEL_NAME = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.groups.addeditform.namelabel",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label GROUP_FORM_LABEL_PRIMARY_EMAIL = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.groups.addeditform.primaryemaillabel",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final GlobalizedMessage GROUP_FORM_SUBMIT
|
||||
= new GlobalizedMessage(
|
||||
"ui.admin.groups.addeditform.submit", BUNDLE_NAME);
|
||||
"ui.admin.groups.addeditform.submit", ADMIN_BUNDLE);
|
||||
|
||||
/**
|
||||
* Constants for group administration tab.
|
||||
*/
|
||||
public static final Label GROUP_ACTION_CONTINUE = new Label(
|
||||
new GlobalizedMessage("ui.admin.groups.actioncontinue",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final GlobalizedMessage GROUP_DELETE_FAILED_MSG
|
||||
= new GlobalizedMessage(
|
||||
"ui.admin.groups.groupdeletefailed",
|
||||
BUNDLE_NAME);
|
||||
ADMIN_BUNDLE);
|
||||
|
||||
public static final Label GROUP_INFORMATION_HEADER = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.groups.groupinformation",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label SUBGROUP_HEADER = new Label(new GlobalizedMessage(
|
||||
"ui.admin.groups.subgroups",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label GROUP_EDIT_HEADER = new Label(
|
||||
new GlobalizedMessage("ui.admin.groups.groupedit",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
public static final Label ADD_SUBGROUP_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.admin.groups.add",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label SUBMEMBER_HEADER = new Label(
|
||||
new GlobalizedMessage("ui.admin.groups.submembers",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label DELETE_GROUP_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.admin.groups.delete",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label GROUP_EXTREME_ACTIONS_HEADER = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.groups.extremeaction",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label GROUP_DELETE_FAILED_HEADER = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.groups.deletefailed",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label ADD_GROUP_LABEL = new Label(new GlobalizedMessage(
|
||||
"ui.admin.groups.addgrouplabel",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
public static final Label EDIT_GROUP_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.admin.groups.edit",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label SUBGROUP_COUNT_LABEL = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.groups.subgroupcountlabel",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
public static final String GROUP_DELETE_CONFIRMATION
|
||||
= "Are you sure you want to delete this group?";
|
||||
|
||||
public static final Label ADD_SUBMEMBER_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.admin.groups.addsubmemberlabel",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label REMOVE_SUBMEMBER_LABEL = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.groups.removesubmemberlabel",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
public static final Label ADD_EXISTING_GROUP_TO_SUBGROUPS_LABEL = new Label(
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.groups.addExisting",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label REMOVE_SUBGROUP_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.admin.groups.removeExisting",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label GROUP_SEARCH_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.admin.groups.search", BUNDLE_NAME));
|
||||
new GlobalizedMessage("ui.admin.groups.search", ADMIN_BUNDLE));
|
||||
|
||||
public static final GlobalizedMessage SEARCH_BUTTON = new GlobalizedMessage(
|
||||
"ui.admin.groups.button.search",
|
||||
BUNDLE_NAME);
|
||||
ADMIN_BUNDLE);
|
||||
|
||||
public static final Label GROUP_NO_RESULTS = new Label(
|
||||
new GlobalizedMessage("ui.admin.groups.searchForm.noResults",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label FOUND_GROUPS_TITLE = new Label(
|
||||
new GlobalizedMessage("ui.admin.groups.found.title",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final Label PICK_GROUPS = new Label(new GlobalizedMessage(
|
||||
"ui.admin.groups.select.explanation",
|
||||
BUNDLE_NAME));
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
public static final GlobalizedMessage SAVE_BUTTON = new GlobalizedMessage(
|
||||
"ui.admin.save", BUNDLE_NAME);
|
||||
"ui.admin.save", ADMIN_BUNDLE);
|
||||
|
||||
public static final String SEARCH_QUERY = "query";
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.usersgroupsroles;
|
||||
|
||||
import com.arsdigita.bebop.BoxPanel;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class UserAdmin extends BoxPanel {
|
||||
|
||||
public UserAdmin() {
|
||||
super();
|
||||
|
||||
//add(new Label("User Admin class"));
|
||||
add(new UsersTable());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin;
|
||||
package com.arsdigita.ui.admin.usersgroupsroles;
|
||||
|
||||
import com.arsdigita.bebop.BoxPanel;
|
||||
import com.arsdigita.bebop.Component;
|
||||
|
|
@ -25,6 +25,7 @@ import com.arsdigita.bebop.List;
|
|||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.Resettable;
|
||||
import com.arsdigita.bebop.SimpleContainer;
|
||||
import com.arsdigita.bebop.list.ListModel;
|
||||
import com.arsdigita.bebop.list.ListModelBuilder;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
|
@ -60,8 +61,8 @@ public class UsersGroupsRolesTab extends LayoutPanel {
|
|||
});
|
||||
sections.setClassAttr("navbar");
|
||||
|
||||
final BoxPanel usersPanel = new BoxPanel();
|
||||
usersPanel.add(new Label("Users Panel"));
|
||||
// final BoxPanel usersPanel = new BoxPanel();
|
||||
// usersPanel.add(new Label("Users Panel"));
|
||||
|
||||
final BoxPanel groupsPanel = new BoxPanel();
|
||||
groupsPanel.add(new Label("Groups Panel"));
|
||||
|
|
@ -73,19 +74,19 @@ public class UsersGroupsRolesTab extends LayoutPanel {
|
|||
addSection(
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.users_groups_roles.users.title",
|
||||
BUNDLE_NAME)),
|
||||
usersPanel,
|
||||
ADMIN_BUNDLE)),
|
||||
new UserAdmin(),
|
||||
body);
|
||||
addSection(
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.users_groups_roles.groups.title",
|
||||
BUNDLE_NAME)),
|
||||
ADMIN_BUNDLE)),
|
||||
groupsPanel,
|
||||
body);
|
||||
addSection(
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.users_roles_roles.users.title",
|
||||
BUNDLE_NAME)),
|
||||
ADMIN_BUNDLE)),
|
||||
rolesPanel,
|
||||
body);
|
||||
|
||||
|
|
@ -93,6 +94,16 @@ public class UsersGroupsRolesTab extends LayoutPanel {
|
|||
setBody(body);
|
||||
}
|
||||
|
||||
private SimpleContainer buildUserAdmin() {
|
||||
final BoxPanel panel = new BoxPanel();
|
||||
|
||||
|
||||
|
||||
panel.add(new Label("User Admin"));
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
private void addSection(final Label label,
|
||||
final Component component,
|
||||
final BoxPanel panel) {
|
||||
|
|
@ -0,0 +1,159 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.usersgroupsroles;
|
||||
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.Table;
|
||||
import com.arsdigita.bebop.table.TableColumn;
|
||||
import com.arsdigita.bebop.table.TableColumnModel;
|
||||
import com.arsdigita.bebop.table.TableModel;
|
||||
import com.arsdigita.bebop.table.TableModelBuilder;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.security.User;
|
||||
import org.libreccm.security.UserRepository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static com.arsdigita.ui.admin.AdminUiConstants.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class UsersTable extends Table {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(UsersTable.class);
|
||||
|
||||
private static final int COL_SCREEN_NAME = 0;
|
||||
private static final int COL_GIVEN_NAME = 1;
|
||||
private static final int COL_FAMILY_NAME = 2;
|
||||
private static final int COL_PRIMARY_EMAIL = 3;
|
||||
private static final int COL_BANNED = 4;
|
||||
|
||||
public UsersTable() {
|
||||
super();
|
||||
|
||||
setEmptyView(new Label(new GlobalizedMessage(
|
||||
"ui.admin.users.table.no_users", ADMIN_BUNDLE)));
|
||||
|
||||
final TableColumnModel columnModel = getColumnModel();
|
||||
columnModel.add(new TableColumn(
|
||||
COL_SCREEN_NAME,
|
||||
new Label(new GlobalizedMessage("ui.admin.users.table.screenname",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_GIVEN_NAME,
|
||||
new Label(new GlobalizedMessage("ui.admin.users.table.givenname",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_FAMILY_NAME,
|
||||
new Label(new GlobalizedMessage("ui.admin.users.table.familyname",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_PRIMARY_EMAIL,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.users.table.primary_email", ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_BANNED,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.users.table.banned", ADMIN_BUNDLE))));
|
||||
|
||||
setModelBuilder(new UsersTableModelBuilder());
|
||||
}
|
||||
|
||||
private class UsersTableModelBuilder extends LockableImpl
|
||||
implements TableModelBuilder {
|
||||
|
||||
@Override
|
||||
public TableModel makeModel(final Table table, final PageState state) {
|
||||
table.getRowSelectionModel().clearSelection(state);
|
||||
|
||||
return new UsersTableModel();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class UsersTableModel implements TableModel {
|
||||
|
||||
private final List<User> users;
|
||||
private int index = -1;
|
||||
|
||||
public UsersTableModel() {
|
||||
LOGGER.debug("Creating UsersTableModel...");
|
||||
final UserRepository userRepository = CdiUtil.createCdiUtil()
|
||||
.findBean(UserRepository.class);
|
||||
users = userRepository.findAll();
|
||||
LOGGER.debug("Found {} users in database.", users.size());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return 6;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean nextRow() {
|
||||
index++;
|
||||
LOGGER.debug("Next row called. Index is {}", index);
|
||||
return index < users.size();
|
||||
// index++;
|
||||
// LOGGER.debug("Result is '{}'. Index is now {}", result, index);
|
||||
// return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getElementAt(final int columnIndex) {
|
||||
LOGGER.debug("Getting element for row {}, column {}...",
|
||||
index,
|
||||
columnIndex);
|
||||
final User user = users.get(index);
|
||||
switch (columnIndex) {
|
||||
case COL_BANNED:
|
||||
return Boolean.toString(user.isBanned());
|
||||
case COL_FAMILY_NAME:
|
||||
return user.getFamilyName();
|
||||
case COL_GIVEN_NAME:
|
||||
return user.getGivenName();
|
||||
case COL_PRIMARY_EMAIL:
|
||||
return user.getPrimaryEmailAddress().getAddress();
|
||||
case COL_SCREEN_NAME:
|
||||
return user.getName();
|
||||
default:
|
||||
throw new IllegalArgumentException(
|
||||
"No a valid column index.");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getKeyAt(final int columnIndex) {
|
||||
LOGGER.debug("Getting key for row {}, column {}...",
|
||||
index,
|
||||
columnIndex);
|
||||
return users.get(index).getPartyId();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,151 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.l10n;
|
||||
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
|
||||
import java.util.Enumeration;
|
||||
import java.util.Locale;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Inject;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
/**
|
||||
* Provides the locale which has been selected based on the available languages
|
||||
* configured in the {@link KernelConfig}, the preferred languages of the client
|
||||
* provided an the request, the (optional) {@code lang} attribute in the current
|
||||
* session and the optional {@code lang} parameter in the current request.
|
||||
*
|
||||
* The algorithm used in the class is as follows:
|
||||
*
|
||||
* <ol>
|
||||
* <li>
|
||||
* If there is an attribute {@code lang} in the current session use that
|
||||
* language.
|
||||
* </li>
|
||||
* <li>
|
||||
* If there is a parameter {@code lang} for the current request, use that
|
||||
* language <em>and</em> store the selected language in the session.
|
||||
* </li>
|
||||
* <li>
|
||||
* Get the languages preferred by the client as transmitted in the request and
|
||||
* use the first match between the languages preferred by the client and
|
||||
* available languages (from the {@link KernelConfig}).
|
||||
* </li>
|
||||
* </ol>
|
||||
*
|
||||
* A historic note: This CDI bean replaces the old {@code GlobalizationHelper} class which used
|
||||
* static methods and relied on the old {@code DispatcherHelper} for getting the
|
||||
* current request. In a CDI environment we can simply inject the current request
|
||||
* and don't need to bother with static methods etc.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@RequestScoped
|
||||
public class GlobalizationHelper {
|
||||
|
||||
private static final String LANG_PARAM = "lang";
|
||||
|
||||
@Inject
|
||||
private HttpServletRequest request;
|
||||
|
||||
@Inject
|
||||
private ConfigurationManager confManager;
|
||||
|
||||
// private final KernelConfig kernelConfig;
|
||||
|
||||
// public GlobalizationHelper() {
|
||||
// kernelConfig = confManager.findConfiguration(KernelConfig.class);
|
||||
// }
|
||||
|
||||
public Locale getNegotiatedLocale() {
|
||||
final KernelConfig kernelConfig = confManager.findConfiguration(KernelConfig.class);
|
||||
|
||||
Locale preferred = new Locale(kernelConfig.getDefaultLanguage());
|
||||
|
||||
final Locale selectedLocale = getSelectedLocale();
|
||||
if (selectedLocale == null || !kernelConfig.hasLanguage(selectedLocale
|
||||
.getLanguage())) {
|
||||
final Enumeration<Locale> acceptedLocales = request.getLocales();
|
||||
|
||||
while (acceptedLocales.hasMoreElements()) {
|
||||
final Locale current = acceptedLocales.nextElement();
|
||||
if (kernelConfig.hasLanguage(current.getLanguage())) {
|
||||
preferred = current;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
preferred = selectedLocale;
|
||||
}
|
||||
|
||||
return preferred;
|
||||
}
|
||||
|
||||
public Locale getSelectedLocale() {
|
||||
// Get the current session, create one if there is none
|
||||
final HttpSession session = request.getSession(true);
|
||||
|
||||
// Retrieve previously selected language from session. Might be null if
|
||||
// no language has been selected in a previous request.
|
||||
final String langSession = (String) session.getAttribute(LANG_PARAM);
|
||||
|
||||
// Get value of lang parameter from request URL. Will be null
|
||||
// if the parameter is not set for the current request
|
||||
final String langRequest = request.getParameter(LANG_PARAM);
|
||||
|
||||
Locale selected = null;
|
||||
|
||||
if (langRequest == null) {
|
||||
if (langSession != null) {
|
||||
selected = scanLocale(langSession);
|
||||
}
|
||||
} else {
|
||||
final Locale localeRequest = scanLocale(langRequest);
|
||||
if (localeRequest != null) {
|
||||
session.setAttribute(LANG_PARAM, langRequest);
|
||||
selected = localeRequest;
|
||||
}
|
||||
}
|
||||
|
||||
return selected;
|
||||
}
|
||||
|
||||
private Locale scanLocale(final String language) {
|
||||
if (language == null || language.isEmpty()) {
|
||||
return null;
|
||||
} else {
|
||||
final String[] tokens = language.split("_");
|
||||
if (tokens.length == 1) {
|
||||
return new Locale(tokens[0]);
|
||||
} else if (tokens.length == 2) {
|
||||
return new Locale(tokens[0], tokens[1]);
|
||||
} else if (tokens.length >= 3) {
|
||||
return new Locale(tokens[0], tokens[1], tokens[2]);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,123 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.themes;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.annotation.WebServlet;
|
||||
import javax.servlet.http.HttpServlet;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@WebServlet(urlPatterns = {"/themes/static/*"})
|
||||
public class StaticThemesServlet extends HttpServlet {
|
||||
|
||||
private static final long serialVersionUID = -2732540547314051013L;
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
StaticThemesServlet.class);
|
||||
|
||||
@Override
|
||||
public void doGet(final HttpServletRequest request,
|
||||
final HttpServletResponse response)
|
||||
throws ServletException, IOException {
|
||||
|
||||
final String pathInfo = request.getPathInfo();
|
||||
if (pathInfo == null) {
|
||||
LOGGER.warn("Received request without path info which this Servlet "
|
||||
+ "can't handle. Responding with SC_FORBIDDEN.");
|
||||
response.sendError(HttpServletResponse.SC_FORBIDDEN);
|
||||
return;
|
||||
}
|
||||
|
||||
final String resourcePath = String.join("", "/themes", pathInfo);
|
||||
LOGGER.debug("Resource path is '{}'.", resourcePath);
|
||||
|
||||
// final InputStream inStream = getClass().getClassLoader()
|
||||
// .getResourceAsStream(resourcePath);
|
||||
// final URL resourceUrl = getClass().getClassLoader().getResource(
|
||||
// String.format("file://%s", resourcePath));
|
||||
// final MimetypesFileTypeMap mimetypesMap = new MimetypesFileTypeMap();
|
||||
// final String type;
|
||||
// try {
|
||||
// type = mimetypesMap.getContentType(new File(resourceUrl.toURI()));
|
||||
// } catch (URISyntaxException ex) {
|
||||
// throw new ServletException(ex);
|
||||
// }
|
||||
//
|
||||
// response.setContentType(type);
|
||||
// if (inStream == null) {
|
||||
// LOGGER.warn("Failed to get requested resource '{}'", resourcePath);
|
||||
// response.sendError(HttpServletResponse.SC_NOT_FOUND);
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// IOUtils.copy(inStream, response.getOutputStream());
|
||||
final ServletContext servletContext = getServletContext();
|
||||
|
||||
final Set<String> paths = servletContext.getResourcePaths(resourcePath);
|
||||
if (paths == null) {
|
||||
final InputStream inputStream = servletContext.getResourceAsStream(
|
||||
resourcePath);
|
||||
if (inputStream == null) {
|
||||
response.sendError(HttpServletResponse.SC_NOT_FOUND);
|
||||
} else {
|
||||
response.setContentType(servletContext.getMimeType(resourcePath));
|
||||
IOUtils.copy(inputStream, response.getOutputStream());
|
||||
}
|
||||
} else {
|
||||
response.setContentType("text/plain");
|
||||
final PrintWriter printWriter = response.getWriter();
|
||||
printWriter.append(String.format("%s%n", resourcePath));
|
||||
for(int i = 0; i < resourcePath.length(); i++) {
|
||||
printWriter.append('=');
|
||||
}
|
||||
printWriter.append(System.lineSeparator());
|
||||
paths.forEach(p -> printWriter.append(String.format("%s%n", p)));
|
||||
}
|
||||
|
||||
//IOUtils.copy(new FileInputStream(file), response.getOutputStream());
|
||||
// try {
|
||||
// final File file = new File(resourceURL.toURI());
|
||||
// response.setContentType(getServletContext().getMimeType(resourcePath));
|
||||
// IOUtils.copy(getServletContext().getResourceAsStream(resourcePath),
|
||||
// response.getOutputStream());
|
||||
//
|
||||
// final Path path = Paths.get(resourceURL.toURI());
|
||||
//
|
||||
// Files.copy(path, response.getOutputStream());
|
||||
// } catch (URISyntaxException ex) {
|
||||
// throw new ServletException(ex);
|
||||
// }
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>ccm-core.html</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>ccm-core.txt</h1>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
Dies ist ein Test.
|
||||
|
||||
Diese Datei liegt im Module
|
||||
|
||||
ccm-core
|
||||
|
||||
in
|
||||
|
||||
/themes/test/ccm-core.txt
|
||||
|
|
@ -160,3 +160,8 @@ ui.admin.tab.workflows.title=Workflows
|
|||
ui.admin.users_groups_roles.users.title=Users
|
||||
ui.admin.users_groups_roles.groups.title=Groups
|
||||
ui.admin.users_roles_roles.users.title=Roles
|
||||
ui.admin.users.table.screenname=Username
|
||||
ui.admin.users.table.givenname=Given name
|
||||
ui.admin.users.table.familyname=Family name
|
||||
ui.admin.users.table.primary_email=E-Mail
|
||||
ui.admin.users.table.banned=Banned
|
||||
|
|
|
|||
|
|
@ -160,3 +160,8 @@ ui.admin.tab.workflows.title=Arbeitsabl\u00e4ufe
|
|||
ui.admin.users_groups_roles.users.title=Benutzer
|
||||
ui.admin.users_groups_roles.groups.title=Gruppen
|
||||
ui.admin.users_roles_roles.users.title=Rollen
|
||||
ui.admin.users.table.screenname=Benutzername
|
||||
ui.admin.users.table.givenname=Vorname
|
||||
ui.admin.users.table.familyname=Familienname
|
||||
ui.admin.users.table.primary_email=E-Mail
|
||||
ui.admin.users.table.banned=Gesperrt
|
||||
|
|
|
|||
|
|
@ -133,3 +133,8 @@ ui.admin.user.userinfo.screenname=Username:
|
|||
ui.admin.users_groups_roles.users.title=Users
|
||||
ui.admin.users_groups_roles.groups.title=Groups
|
||||
ui.admin.users_roles_roles.users.title=Roles
|
||||
ui.admin.users.table.screenname=Username
|
||||
ui.admin.users.table.givenname=Given name
|
||||
ui.admin.users.table.familyname=Family name
|
||||
ui.admin.users.table.primary_email=E-Mail
|
||||
ui.admin.users.table.banned=Banned
|
||||
|
|
|
|||
|
|
@ -124,3 +124,8 @@ ui.admin.user.userinfo.screenname=Username:
|
|||
ui.admin.users_groups_roles.users.title=Users
|
||||
ui.admin.users_groups_roles.groups.title=Groups
|
||||
ui.admin.users_roles_roles.users.title=Roles
|
||||
ui.admin.users.table.screenname=Username
|
||||
ui.admin.users.table.givenname=Given name
|
||||
ui.admin.users.table.familyname=Family name
|
||||
ui.admin.users.table.primary_email=E-Mail
|
||||
ui.admin.users.table.banned=Banned
|
||||
|
|
|
|||
Loading…
Reference in New Issue