Changeset 3535
- Timestamp:
- Jun 28, 2007, 5:43:53 PM (16 years ago)
- Location:
- trunk
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/config/dist/extended-properties.xml
r2959 r3535 161 161 </property> 162 162 </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> 163 183 </extended-properties> 164 184 -
trunk/src/core/net/sf/basedb/core/User.java
r3471 r3535 703 703 checkPermission(Permission.RESTRICTED_WRITE); 704 704 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); 705 728 } 706 729 -
trunk/src/core/net/sf/basedb/core/data/UserData.java
r2962 r3535 41 41 public class UserData 42 42 extends BasicData 43 implements NameableData, RemovableData, SystemData 43 implements NameableData, RemovableData, SystemData, ExtendableData 44 44 { 45 45 … … 113 113 { 114 114 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); 115 130 } 116 131 // ------------------------------------------- -
trunk/www/admin/users/edit_user.jsp
r3467 r3535 39 39 import="net.sf.basedb.core.Role" 40 40 import="net.sf.basedb.core.Directory" 41 import="net.sf.basedb.core.ExtendedProperties" 42 import="net.sf.basedb.core.ExtendedProperty" 41 43 import="net.sf.basedb.core.QuotaType" 42 44 import="net.sf.basedb.core.Location" … … 56 58 import="net.sf.basedb.clients.web.formatter.FormatterSettings" 57 59 import="java.util.Date" 60 import="java.util.List" 58 61 %> 59 62 <%@ taglib prefix="base" uri="/WEB-INF/base.tld" %> … … 71 74 String title = null; 72 75 User user = null; 76 77 List<ExtendedProperty> extendedProperties = ExtendedProperties.getProperties("UserData"); 73 78 74 79 final QuotaType total = QuotaType.getById(dc, SystemItems.getId(QuotaType.TOTAL)); … … 234 239 } 235 240 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 236 298 // Validate the "Contact information" tab 237 299 function validateContact() … … 560 622 </td> 561 623 </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…" 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 %> 562 733 </table> 563 734 </t:tab> -
trunk/www/admin/users/index.jsp
r3467 r3535 38 38 import="net.sf.basedb.core.Permission" 39 39 import="net.sf.basedb.core.ItemContext" 40 import="net.sf.basedb.core.ExtendedProperties" 41 import="net.sf.basedb.core.ExtendedProperty" 40 42 import="net.sf.basedb.core.MultiPermissions" 41 43 import="net.sf.basedb.core.PermissionDeniedException" … … 210 212 user.setUrl(Values.getStringOrNull(request.getParameter("url"))); 211 213 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 } 212 226 213 227 // Membership -
trunk/www/admin/users/list_users.jsp
r3467 r3535 28 28 import="net.sf.basedb.core.SessionControl" 29 29 import="net.sf.basedb.core.DbControl" 30 import="net.sf.basedb.core.ExtendedProperty" 31 import="net.sf.basedb.core.ExtendedProperties" 30 32 import="net.sf.basedb.core.Item" 31 33 import="net.sf.basedb.core.User" … … 96 98 roleQuery.order(Orders.asc(Hql.property("name"))); 97 99 100 List<ExtendedProperty> extendedProperties = ExtendedProperties.getProperties("UserData"); 101 98 102 Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext); 99 103 try … … 350 354 exportable="true" 351 355 /> 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 %> 352 377 <tbl:columndef 353 378 id="quota" … … 377 402 exportable="true" 378 403 /> 404 379 405 <tbl:toolbar 380 406 visible="<%=mode.hasToolbar()%>" … … 607 633 <tbl:cell column="phone"><%=HTML.encodeTags(item.getPhone())%></tbl:cell> 608 634 <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 %> 610 647 <tbl:cell column="quota" 611 648 ><base:propertyvalue -
trunk/www/admin/users/view_user.jsp
r2978 r3535 37 37 import="net.sf.basedb.core.Role" 38 38 import="net.sf.basedb.core.Directory" 39 import="net.sf.basedb.core.ExtendedProperties" 40 import="net.sf.basedb.core.ExtendedProperty" 39 41 import="net.sf.basedb.core.PermissionDeniedException" 40 42 import="net.sf.basedb.core.PluginDefinition" … … 54 56 import="java.util.Map" 55 57 import="java.util.Date" 58 import="java.util.List" 56 59 %> 57 60 <%@ taglib prefix="base" uri="/WEB-INF/base.tld" %> … … 244 247 </tr> 245 248 </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> </td> 267 <%=needsTr ? "" : "</tr>"%> 268 <% 269 needsTr = !needsTr; 270 } 271 %> 272 <%=needsTr ? "" : "</tr>"%> 273 <% 274 } 275 %> 276 </table> 277 247 278 <% 248 279 ItemQuery<Group> groupQuery = user.getGroups(); -
trunk/www/my_base/user/settings.jsp
r2978 r3535 40 40 import="net.sf.basedb.clients.web.*" 41 41 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" 42 47 %> 43 48 <%@ taglib prefix="base" uri="/WEB-INF/base.tld" %> … … 49 54 final float scale = Base.getScale(sc); 50 55 final DbControl dc = sc.newDbControl(); 56 final ItemContext cc = Base.getAndSetCurrentContext(sc, Item.USER, null, null); 51 57 try 52 58 { … … 59 65 dc.detachItem(user); 60 66 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); 61 74 %> 62 75 … … 81 94 return true; 82 95 } 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 83 154 // Submit the form 84 155 function saveSettings() … … 137 208 </table> 138 209 </t:tab> 139 210 140 211 <t:tab id="password" title="Password" validate="validatePassword()" helpid="userpreferences.password"> 141 212 <% if (!Application.isUsingInternalAuthentication() && writePermission) … … 163 234 </t:tab> 164 235 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…" 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"> 168 343 <td class="prompt">Description</td> 169 344 <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> 171 346 <a href="javascript:Main.zoom('Description', 'user', 'description', <%=!writePermission%>)" title="Edit in larger window"><base:icon image="zoom.gif" /></a> 172 347 </td>
Note: See TracChangeset
for help on using the changeset viewer.