Changeset 3535


Ignore:
Timestamp:
Jun 28, 2007, 5:43:53 PM (14 years ago)
Author:
Martin Svensson
Message:

References #191

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/config/dist/extended-properties.xml

    r2959 r3535  
    161161    </property>
    162162  </class>
     163   
     164  <!-- Extended properties for Users -->
     165  <class name="UserData">
     166    <property
     167      name="mobile"
     168      title="Mobile"
     169      description="The user's mobile number"
     170      column="mobile"
     171      type="string"
     172      length="255"
     173    />
     174    <property
     175      name="skype"
     176      title="Skype"
     177      description="The user's skype contact"
     178      column="skype"
     179      type="string"
     180      length="255"
     181    />   
     182  </class>
    163183</extended-properties>
    164184
  • trunk/src/core/net/sf/basedb/core/User.java

    r3471 r3535  
    703703    checkPermission(Permission.RESTRICTED_WRITE);
    704704    getData().setUrl(StringUtil.setNullableString(url, "url", MAX_URL_LENGTH));
     705  }
     706 
     707  /**
     708    Gets an extended property with a certain name
     709    @param name The name of the property
     710    @return An Object or
     711      null if no extended property exists with the name
     712  */
     713  public Object getExtended(String name)
     714  {
     715    return getData().getExtended(name);
     716  }
     717  /**
     718    Sets an extended property
     719    @param name The name to call the extended property by
     720    @param value The value the extended property should have
     721    @throws PermissionDeniedException If the logged in user doesn't
     722      have @link {Permission#WRITE} permission for the user.
     723  */
     724  public void setExtended(String name, Object value)
     725  {
     726    checkPermission(Permission.RESTRICTED_WRITE);
     727    getData().setExtended(name, value);
    705728  }
    706729
  • trunk/src/core/net/sf/basedb/core/data/UserData.java

    r2962 r3535  
    4141public class UserData
    4242  extends BasicData
    43   implements NameableData, RemovableData, SystemData
     43  implements NameableData, RemovableData, SystemData, ExtendableData
    4444{
    4545
     
    113113  {
    114114    this.systemId = systemId;
     115  }
     116  // -------------------------------------------
     117  /*
     118    From the ExtendableData interface
     119    -------------------------------------------
     120  */
     121  private Map<String, Object> extendedProperties;
     122  public Object getExtended(String name)
     123  {
     124    return extendedProperties == null ? null : extendedProperties.get(name);
     125  }
     126  public void setExtended(String name, Object value)
     127  {
     128    if (extendedProperties == null) extendedProperties = new HashMap<String, Object>();
     129    extendedProperties.put(name, value);
    115130  }
    116131  // -------------------------------------------
  • trunk/www/admin/users/edit_user.jsp

    r3467 r3535  
    3939  import="net.sf.basedb.core.Role"
    4040  import="net.sf.basedb.core.Directory"
     41  import="net.sf.basedb.core.ExtendedProperties"
     42  import="net.sf.basedb.core.ExtendedProperty" 
    4143  import="net.sf.basedb.core.QuotaType"
    4244  import="net.sf.basedb.core.Location"
     
    5658  import="net.sf.basedb.clients.web.formatter.FormatterSettings"
    5759  import="java.util.Date"
     60  import="java.util.List"
    5861%>
    5962<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
     
    7174  String title = null;
    7275  User user = null;
     76 
     77  List<ExtendedProperty> extendedProperties = ExtendedProperties.getProperties("UserData");
    7378
    7479  final QuotaType total = QuotaType.getById(dc, SystemItems.getId(QuotaType.TOTAL));
     
    234239    }
    235240   
     241    // Validate the "Extended properties" tab
     242    function validateExtendedProperties()
     243    {
     244      var frm = document.forms['user'];
     245      var field;
     246      <%
     247      if (extendedProperties != null)
     248      {
     249        for (ExtendedProperty ep : extendedProperties)
     250        {
     251          Type type = ep.getType();
     252          String name = ep.getName();
     253          %>
     254          field = frm['<%=name%>'];
     255          <%
     256          if (type == Type.DATE)
     257          {
     258            %>
     259            if (!Dates.isDate(field.value))
     260            {
     261              alert("'"+field.value+"' is not a valid date for '<%=HTML.javaScriptEncode(ep.getTitle())%>'");
     262              field.focus();
     263              return false;
     264            }
     265            <%
     266          }
     267          if (!ep.isNullable())
     268          {
     269            if (type == Type.BOOLEAN)
     270            {
     271              %>
     272              if (Forms.getCheckedRadio(field) == null)
     273              {
     274                alert("You must select a value for '<%=HTML.javaScriptEncode(ep.getTitle())%>'");
     275                field.focus();
     276                return false;
     277              }
     278              <%
     279            }
     280            else
     281            {
     282              %>
     283              if (Main.trimString(field.value) == '')
     284              {
     285                alert("You must enter a value for '<%=HTML.javaScriptEncode(ep.getTitle())%>'.");
     286                field.focus();
     287                return false;
     288              }
     289              <%
     290            }
     291          }
     292        }
     293      }
     294      %>
     295      return true;
     296    }
     297   
    236298    // Validate the "Contact information" tab
    237299    function validateContact()
     
    560622        </td>
    561623      </tr>
     624      </table>
     625    </t:tab>
     626   
     627    <t:tab id="extended" title="Additional info"
     628      validate="validateExtendedProperties()" helpid="user.edit.additional">
     629      <table class="form" cellspacing="0">
     630        <%
     631        if (extendedProperties != null)
     632        {
     633          for (ExtendedProperty ep : ExtendedProperties.getProperties("UserData"))
     634          {
     635            String name = ep.getName();
     636            Type type = ep.getType();
     637            boolean required = !ep.isNullable();
     638            Object value = user == null ? cc.getPropertyValue(name) : user.getExtended(name);
     639            String theClazz = required ? requiredClazz : clazz;
     640            %>
     641            <tr valign="top">
     642              <td class="prompt"><%=HTML.encodeTags(ep.getTitle())%></td>
     643              <td>
     644              <%
     645              if (type == Type.INT || type == Type.LONG)
     646              {
     647                %>
     648                <input <%=theClazz%> type="text" name="<%=name%>"
     649                  value="<%=value == null ? "" : value%>"
     650                  size="20" maxlength="20" onkeypress="return Numbers.integerOnly(event)"
     651                  >
     652                <%
     653              }
     654              else if (type == Type.FLOAT || type == Type.DOUBLE)
     655              {
     656                %>
     657                <input <%=theClazz%> type="text" name="<%=name%>"
     658                  value="<%=value == null ? "" : value%>"
     659                  size="20" maxlength="20" onkeypress="return Numbers.numberOnly(event)"
     660                  >
     661                <%
     662              }
     663              else if (type == Type.STRING)
     664              {
     665                %>
     666                <input <%=theClazz%> type="text" name="<%=name%>"
     667                  value="<%=HTML.encodeTags((String)value)%>"
     668                  size="40" maxlength="<%=ep.getLength()%>"
     669                  >
     670                <%
     671              }
     672              else if (type == Type.TEXT)
     673              {
     674                %>
     675                <textarea <%=theClazz%> name="<%=name%>" rows="6" cols="40"
     676                  ><%=HTML.encodeTags((String)value)%></textarea>
     677                <a href="javascript:Main.zoom(
     678                  '<%=HTML.javaScriptEncode(ep.getTitle())%>',
     679                  'reporter', '<%=name%>')"
     680                  title="Edit in larger window"><base:icon image="zoom.gif" /></a>
     681                <%
     682              }
     683              else if (type == Type.BOOLEAN)
     684              {
     685                Boolean b = (Boolean)value;
     686                if (!required)
     687                {
     688                  %>
     689                  <input type="radio" name="<%=name%>" value=""
     690                    <%=b == null ? "checked" : ""%>
     691                    ><i>- not specified -</i><br>
     692                  <%
     693                }
     694                %>
     695                <input type="radio" name="<%=name%>" value="true"
     696                  <%=b != null && b == true ? "checked" : ""%>
     697                  >true<br>
     698                <input type="radio" name="<%=name%>" value="false"
     699                  <%=b != null && b == false ? "checked" : ""%>
     700                  >false
     701                <%
     702              }
     703              else if (type == Type.DATE)
     704              {
     705                %>
     706                <table>
     707                <tr>
     708                <td>
     709                  <input <%=theClazz%> type="text" name="<%=name%>"
     710                    value="<%=dateFormatter.format((Date)value)%>"
     711                    size="20" maxlength="20" title="Enter date in format: <%=htmlDateFormat%>"
     712                    >
     713                </td>
     714                <td>
     715                  <base:button
     716                    onclick="<%="Dates.selectDate('"+HTML.javaScriptEncode(ep.getTitle())+"', 'reporter', '"+name+"', null, '"+jsDateFormat +"')"%>"
     717                    image="calendar.png"
     718                    title="Calendar&hellip;"
     719                    tooltip="Select a date from a calendar"
     720                  />
     721                </td>
     722                </tr>
     723                </table>
     724                <%
     725              }
     726              %>
     727              </td>
     728            </tr>
     729            <%
     730          }
     731        }
     732        %>
    562733      </table>
    563734    </t:tab>
  • trunk/www/admin/users/index.jsp

    r3467 r3535  
    3838  import="net.sf.basedb.core.Permission"
    3939  import="net.sf.basedb.core.ItemContext"
     40  import="net.sf.basedb.core.ExtendedProperties"
     41  import="net.sf.basedb.core.ExtendedProperty" 
    4042  import="net.sf.basedb.core.MultiPermissions"
    4143  import="net.sf.basedb.core.PermissionDeniedException"
     
    210212    user.setUrl(Values.getStringOrNull(request.getParameter("url")));
    211213    user.setDescription(Values.getStringOrNull(request.getParameter("description")));
     214   
     215    // Extended properties
     216    List<ExtendedProperty> extendedProperties = ExtendedProperties.getProperties("UserData");
     217    if (extendedProperties != null)
     218    {
     219      for (ExtendedProperty ep : extendedProperties)
     220      {
     221        String name = ep.getName();
     222        Object value = ep.getType().parseString(Values.getStringOrNull(request.getParameter(name)));
     223        user.setExtended(name, value);
     224      }
     225    }
    212226
    213227    // Membership
  • trunk/www/admin/users/list_users.jsp

    r3467 r3535  
    2828  import="net.sf.basedb.core.SessionControl"
    2929  import="net.sf.basedb.core.DbControl"
     30  import="net.sf.basedb.core.ExtendedProperty"
     31  import="net.sf.basedb.core.ExtendedProperties" 
    3032  import="net.sf.basedb.core.Item"
    3133  import="net.sf.basedb.core.User"
     
    9698  roleQuery.order(Orders.asc(Hql.property("name")));
    9799 
     100  List<ExtendedProperty> extendedProperties = ExtendedProperties.getProperties("UserData");
     101 
    98102  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
    99103  try
     
    350354        exportable="true"
    351355      />
     356      <%
     357      if (extendedProperties != null)
     358      {
     359        for (ExtendedProperty ep : extendedProperties)
     360        {
     361          String name = ep.getName();
     362          %>
     363          <tbl:columndef
     364            id="<%=name%>"
     365            property="<%=name%>"
     366            datatype="<%=ep.getType().getStringValue()%>"
     367            title="<%=HTML.encodeTags(ep.getTitle())%>"
     368            sortable="true"
     369            filterable="true"
     370            exportable="true"
     371            formatter="<%=FormatterFactory.getExtendedPropertyFormatter(sc, ep)%>"
     372          />
     373          <%
     374        }
     375      }
     376      %>
    352377      <tbl:columndef
    353378        id="quota"
     
    377402        exportable="true"
    378403      />
     404     
    379405      <tbl:toolbar
    380406        visible="<%=mode.hasToolbar()%>"
     
    607633                <tbl:cell column="phone"><%=HTML.encodeTags(item.getPhone())%></tbl:cell>
    608634                <tbl:cell column="fax"><%=HTML.encodeTags(item.getFax())%></tbl:cell>
    609                 <tbl:cell column="url"><%=HTML.encodeTags(item.getUrl())%></tbl:cell>
     635                <tbl:cell column="url"><%=HTML.encodeTags(item.getUrl())%></tbl:cell><%
     636                if (extendedProperties != null)
     637                {
     638                  for (ExtendedProperty ep : extendedProperties)
     639                  {
     640                    name = ep.getName();
     641                    %>
     642                    <tbl:cell column="<%=name%>"><tbl:cellvalue value="<%=item.getExtended(name)%>" /></tbl:cell>
     643                    <%
     644                  }
     645                }
     646                %>
    610647                <tbl:cell column="quota"
    611648                  ><base:propertyvalue
  • trunk/www/admin/users/view_user.jsp

    r2978 r3535  
    3737  import="net.sf.basedb.core.Role"
    3838  import="net.sf.basedb.core.Directory"
     39  import="net.sf.basedb.core.ExtendedProperties"
     40  import="net.sf.basedb.core.ExtendedProperty"
    3941  import="net.sf.basedb.core.PermissionDeniedException"
    4042  import="net.sf.basedb.core.PluginDefinition"
     
    5456  import="java.util.Map"
    5557  import="java.util.Date"
     58  import="java.util.List"
    5659%>
    5760<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
     
    244247        </tr>
    245248        </table>
    246      
     249       
     250        <h4>Additional information</h4>
     251        <table class="form" cellspacing="0">
     252          <%
     253          List<ExtendedProperty> extendedProperties = ExtendedProperties.getProperties("UserData");
     254          if (extendedProperties != null)
     255          {
     256            boolean needsTr = true;
     257            for (ExtendedProperty ep : extendedProperties)
     258            {
     259              String name = ep.getName();
     260              Formatter f = FormatterFactory.getExtendedPropertyFormatter(sc, ep);
     261              String value = f.format(user.getExtended(name));
     262              %>
     263                <%=needsTr ? "<tr valign=\"top\">" : "" %>
     264                <td class="prompt" width="10%"><%=HTML.encodeTags(ep.getTitle())%></td>
     265                <td width="40%"><%=value%></td>
     266                <td>&nbsp;</td>
     267                <%=needsTr ? "" : "</tr>"%>
     268              <%
     269              needsTr = !needsTr;
     270            }
     271            %>
     272            <%=needsTr ? "" : "</tr>"%>
     273            <%
     274          }
     275          %>
     276        </table>
     277       
    247278      <%
    248279      ItemQuery<Group> groupQuery = user.getGroups();
  • trunk/www/my_base/user/settings.jsp

    r2978 r3535  
    4040  import="net.sf.basedb.clients.web.*"
    4141  import="net.sf.basedb.clients.web.util.HTML"
     42  import="net.sf.basedb.util.formatter.Formatter"
     43  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
     44  import="net.sf.basedb.clients.web.formatter.FormatterSettings"
     45  import="java.util.Date"
     46  import="java.util.List"   
    4247%>
    4348<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
     
    4954final float scale = Base.getScale(sc);
    5055final DbControl dc = sc.newDbControl();
     56final ItemContext cc = Base.getAndSetCurrentContext(sc, Item.USER, null, null);
    5157try
    5258{
     
    5965  dc.detachItem(user);
    6066  sc.setSessionSetting("user", user);
     67 
     68  List<ExtendedProperty> extendedProperties = ExtendedProperties.getProperties("UserData");
     69 
     70  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
     71  String dateFormat = FormatterSettings.getDateFormat(sc);
     72  String jsDateFormat = HTML.javaScriptEncode(dateFormat);
     73  String htmlDateFormat = HTML.encodeTags(dateFormat);
    6174  %>
    6275
     
    8194      return true;
    8295    }
     96   
     97    // Validate the "Extended properties" tab
     98    function validateExtendedProperties()
     99    {
     100      var frm = document.forms['user'];
     101      var field;
     102      <%
     103      if (extendedProperties != null)
     104      {
     105        for (ExtendedProperty ep : extendedProperties)
     106        {
     107          Type type = ep.getType();
     108          String name = ep.getName();
     109          %>
     110          field = frm['<%=name%>'];
     111          <%
     112          if (type == Type.DATE)
     113          {
     114            %>
     115            if (!Dates.isDate(field.value))
     116            {
     117              alert("'"+field.value+"' is not a valid date for '<%=HTML.javaScriptEncode(ep.getTitle())%>'");
     118              field.focus();
     119              return false;
     120            }
     121            <%
     122          }
     123          if (!ep.isNullable())
     124          {
     125            if (type == Type.BOOLEAN)
     126            {
     127              %>
     128              if (Forms.getCheckedRadio(field) == null)
     129              {
     130                alert("You must select a value for '<%=HTML.javaScriptEncode(ep.getTitle())%>'");
     131                field.focus();
     132                return false;
     133              }
     134              <%
     135            }
     136            else
     137            {
     138              %>
     139              if (Main.trimString(field.value) == '')
     140              {
     141                alert("You must enter a value for '<%=HTML.javaScriptEncode(ep.getTitle())%>'.");
     142                field.focus();
     143                return false;
     144              }
     145              <%
     146            }
     147          }
     148        }
     149      }
     150      %>
     151      return true;
     152    }
     153   
    83154    // Submit the form
    84155    function saveSettings()
     
    137208    </table>
    138209  </t:tab>
    139 
     210 
    140211  <t:tab id="password" title="Password" validate="validatePassword()" helpid="userpreferences.password">
    141212    <% if (!Application.isUsingInternalAuthentication() && writePermission)
     
    163234  </t:tab>
    164235
    165   <t:tab id="other" title="Other information" helpid="userpreferences.other">
    166     <table class="form" cellspacing=0>
    167     <tr valign=top>
     236  <t:tab id="other" title="Other information"
     237    validate="validateExtendedProperties()" helpid="userpreferences.other">
     238    <table class="form" cellspacing="0">
     239    <%
     240    if (extendedProperties != null)
     241    {
     242      for (ExtendedProperty ep : ExtendedProperties.getProperties("UserData"))
     243      {
     244        String name = ep.getName();
     245        Type type = ep.getType();
     246        boolean required = !ep.isNullable();
     247        Object value = user == null ? cc.getPropertyValue(name) : user.getExtended(name);
     248        String theClazz = required ? requiredClazz : clazz;
     249        %>
     250        <tr valign="top">
     251          <td class="prompt"><%=HTML.encodeTags(ep.getTitle())%></td>
     252          <td>
     253          <%
     254          if (type == Type.INT || type == Type.LONG)
     255          {
     256            %>
     257            <input <%=theClazz%> type="text" name="<%=name%>"
     258              value="<%=value == null ? "" : value%>"
     259              size="20" maxlength="20" onkeypress="return Numbers.integerOnly(event)"
     260              >
     261            <%
     262          }
     263          else if (type == Type.FLOAT || type == Type.DOUBLE)
     264          {
     265            %>
     266            <input <%=theClazz%> type="text" name="<%=name%>"
     267              value="<%=value == null ? "" : value%>"
     268              size="20" maxlength="20" onkeypress="return Numbers.numberOnly(event)"
     269              >
     270            <%
     271          }
     272          else if (type == Type.STRING)
     273          {
     274            %>
     275            <input <%=theClazz%> type="text" name="<%=name%>"
     276              value="<%=HTML.encodeTags((String)value)%>"
     277              size="40" maxlength="<%=ep.getLength()%>"
     278              >
     279            <%
     280          }
     281          else if (type == Type.TEXT)
     282          {
     283            %>
     284            <textarea <%=theClazz%> name="<%=name%>" rows="6" cols="40"
     285              ><%=HTML.encodeTags((String)value)%></textarea>
     286            <a href="javascript:Main.zoom(
     287              '<%=HTML.javaScriptEncode(ep.getTitle())%>',
     288              'reporter', '<%=name%>')"
     289              title="Edit in larger window"><base:icon image="zoom.gif" /></a>
     290            <%
     291          }
     292          else if (type == Type.BOOLEAN)
     293          {
     294            Boolean b = (Boolean)value;
     295            if (!required)
     296            {
     297              %>
     298              <input type="radio" name="<%=name%>" value=""
     299                <%=b == null ? "checked" : ""%>
     300                ><i>- not specified -</i><br>
     301              <%
     302            }
     303            %>
     304            <input type="radio" name="<%=name%>" value="true"
     305              <%=b != null && b == true ? "checked" : ""%>
     306              >true<br>
     307            <input type="radio" name="<%=name%>" value="false"
     308              <%=b != null && b == false ? "checked" : ""%>
     309              >false
     310            <%
     311          }
     312          else if (type == Type.DATE)
     313          {
     314            %>
     315            <table>
     316            <tr>
     317            <td>
     318              <input <%=theClazz%> type="text" name="<%=name%>"
     319                value="<%=dateFormatter.format((Date)value)%>"
     320                size="20" maxlength="20" title="Enter date in format: <%=htmlDateFormat%>"
     321                >
     322            </td>
     323            <td>
     324              <base:button
     325                onclick="<%="Dates.selectDate('"+HTML.javaScriptEncode(ep.getTitle())+"', 'reporter', '"+name+"', null, '"+jsDateFormat +"')"%>"
     326                image="calendar.png"
     327                title="Calendar&hellip;"
     328                tooltip="Select a date from a calendar"
     329              />
     330            </td>
     331            </tr>
     332            </table>
     333            <%
     334          }
     335          %>
     336          </td>
     337        </tr>
     338        <%
     339      }
     340    }
     341    %>
     342    <tr valign="top">
    168343      <td class="prompt">Description</td>
    169344      <td>
    170         <textarea <%=clazz%> rows="10" cols="40" name="description" wrap="virtual"><%=HTML.encodeTags(user.getDescription())%></textarea>
     345        <textarea <%=clazz%> rows="5" cols="40" name="description" wrap="virtual"><%=HTML.encodeTags(user.getDescription())%></textarea>
    171346        <a href="javascript:Main.zoom('Description', 'user', 'description', <%=!writePermission%>)" title="Edit in larger window"><base:icon image="zoom.gif" /></a>
    172347      </td>
Note: See TracChangeset for help on using the changeset viewer.