- Timestamp:
- Apr 4, 2009, 6:41:25 PM (16 years ago)
- Location:
- trunk/src
- Files:
-
- 11 added
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/application.properties
r74 r98 1 1 #utf-8 2 #Sun Mar 15 21:57:51 EST 2009 2 #Fri Apr 03 23:02:58 EST 2009 3 plugins.help-balloons=1.2 3 4 app.version=0.1 4 5 plugins.acegi=0.5.1 -
trunk/src/grails-app/conf/SecurityConfig.groovy
r73 r98 36 36 '/css/*': ['IS_AUTHENTICATED_ANONYMOUSLY'], 37 37 '/images/**': ['IS_AUTHENTICATED_ANONYMOUSLY'], 38 '/js/**': ['IS_AUTHENTICATED_ANONYMOUSLY'], 39 '/plugins/help-balloons-1.2/**': ['IS_AUTHENTICATED_ANONYMOUSLY'], 38 40 '/login*': ['IS_AUTHENTICATED_ANONYMOUSLY'], 39 41 '/login/**': ['IS_AUTHENTICATED_ANONYMOUSLY'], -
trunk/src/grails-app/controllers/AppCoreController.groovy
r91 r98 27 27 if (request.method == 'POST') { 28 28 def personInstance = Person.get(authenticateService.userDomain().id) 29 30 personInstance.pass = params.pass31 personInstance.password = authenticateService.encodePassword(personInstance.pass)32 29 33 if (!personInstance.hasErrors() && personInstance.save()) { 34 //userCache.removeUserFromCache(personInstance.loginName) 35 flash.message = "Password changed successfully." 36 redirect(action:options) 30 if(params.repeatPass == params.pass) { 31 personInstance.pass = params.pass 32 personInstance.password = authenticateService.encodePassword(personInstance.pass) 33 34 if (!personInstance.hasErrors() && personInstance.save()) { 35 //userCache.removeUserFromCache(personInstance.loginName) 36 flash.message = "Password changed successfully." 37 redirect(action:options) 38 } 39 else { 40 render(view:'changePassword',model:[personInstance:personInstance]) 41 } 37 42 } 38 43 else { 44 flash.message = "Passwords must match." 45 // personInstance.addToErrors("Passwords must match.") 39 46 render(view:'changePassword',model:[personInstance:personInstance]) 40 } 47 } 48 41 49 } 42 50 } -
trunk/src/grails-app/controllers/EntryDetailedController.groovy
r91 r98 28 28 def entryInstance = Entry.get( params.id ) 29 29 if(entryInstance) { 30 entryInstance.delete() 31 flash.message = "Entry ${params.id} deleted" 32 redirect(action:list) 30 if(entryInstance.enteredBy.loginName == authenticateService.userDomain().loginName) { 31 entryInstance.delete() 32 flash.message = "Entry ${params.id} deleted" 33 redirect(action:list) 34 } 35 else { 36 flash.message = "You may only delete your own entries." 37 redirect(action:show,id:entryInstance.id) 38 } 39 33 40 } 34 41 else { … … 40 47 def edit = { 41 48 def entryInstance = Entry.get( params.id ) 42 43 49 if(!entryInstance) { 44 flash.message = "Entry not found with id ${params.id}"45 redirect(action:list)50 flash.message = "Entry not found with id ${params.id}" 51 redirect(action:list) 46 52 } 47 53 else { 48 return [ entryInstance : entryInstance ] 54 55 if(entryInstance.enteredBy.loginName == authenticateService.userDomain().loginName) { 56 return [ entryInstance : entryInstance ] 57 } 58 else { 59 flash.message = "You may only edit your own entries." 60 redirect(action:show,id:entryInstance.id) 61 } 62 49 63 } 50 64 } … … 69 83 70 84 def create = { 71 def entryInstance = new Entry() 72 entryInstance.properties = params 73 return ['entryInstance':entryInstance] 85 try { 86 def taskInstance = Task.get(params.taskInstance.id) 87 def entryInstance = new Entry() 88 entryInstance.task = taskInstance 89 return ['entryInstance':entryInstance] 90 } 91 catch(Exception e) { 92 flash.message = "Please select a task, then 'Add Entry'" 93 redirect(controller:"taskDetailed", action:"list") 94 } 74 95 } 75 96 -
trunk/src/grails-app/domain/Entry.groovy
r66 r98 15 15 comment(blank:false,maxSize:500) 16 16 dateDone() 17 durationHour(min:0 )17 durationHour(min:0,max:16) 18 18 durationMinute(min:0,max:59) 19 19 -
trunk/src/grails-app/i18n/messages.properties
r73 r98 1 1 person.pass.minSize.notmet=Password is less than the minimum size of [{3}] 2 2 person.pass.blank=Password cannot be blank 3 4 entry.duration=Duration 5 entry.duration.help=The time (hh:mm) booked against this entry for date done. 3 6 4 7 default.doesnt.match.message=Property [{0}] of class [{1}] with value [{2}] does not match the required pattern [{3}] -
trunk/src/grails-app/views/appCore/changePassword.gsp
r79 r98 37 37 </tr> 38 38 39 <tr class="prop"> 40 <td valign="top" class="name"><label for="repeatPass">Repeat password:</label></td> 41 <td valign="top" class="value"> 42 <input type="password" id="repeatPass" name="repeatPass" /> 43 </td> 44 </tr> 45 39 46 </tbody> 40 47 </table> -
trunk/src/grails-app/views/entryDetailed/create.gsp
r92 r98 42 42 </td> 43 43 <td valign="top" class="value ${hasErrors(bean:entryInstance,field:'comment','errors')}"> 44 <textarea style="width:450px"rows="5" cols="40" name="comment">${fieldValue(bean:entryInstance, field:'comment')}</textarea>44 <textarea rows="5" cols="40" name="comment">${fieldValue(bean:entryInstance, field:'comment')}</textarea> 45 45 </td> 46 46 </tr> … … 57 57 <tr class="prop"> 58 58 <td valign="top" class="name"> 59 <label for="durationHour">Duration Hour:</label>59 <label for="durationHour">Duration:</label> 60 60 </td> 61 <td valign="top" class="value ${hasErrors(bean:entryInstance,field:'durationHour','errors')}">62 <input type="text" id="durationHour" name="durationHour" value="${fieldValue(bean:entryInstance,field:'durationHour')}" />63 </td>64 </tr>65 66 <tr class="prop">67 <td valign="top" class="name">68 <label for="durationMinute">Duration Minute:</label>69 </td>70 <td valign="top" class="value ${hasErrors(bean:entryInstance,field:'durationMinute','errors')}">71 <input type="text" id="durationMinute" name="durationMinute" value="${fieldValue(bean:entryInstance,field:'durationMinute')}" />72 </td>73 </tr>74 61 75 62 <td valign="top" class="value"> 63 <input class="duration ${hasErrors(bean:entryInstance,field:'durationHour','errors')}" 64 type="text" id="durationHour" name="durationHour" 65 value="${fieldValue(bean:entryInstance,field:'durationHour')}" /> 66 : 67 <input class="duration ${hasErrors(bean:entryInstance,field:'durationMinute','errors')}" 68 type="text" id="durationMinute" name="durationMinute" 69 value="${fieldValue(bean:entryInstance,field:'durationMinute')}" /> 70 <g:helpBalloon code="entry.duration" /> 71 </td> 72 </tr> 73 76 74 <tr class="prop"> 77 75 <td valign="top" class="name"> -
trunk/src/grails-app/views/entryDetailed/edit.gsp
r92 r98 52 52 </td> 53 53 <td valign="top" class="value ${hasErrors(bean:entryInstance,field:'dateDone','errors')}"> 54 <g:datePicker name="dateDone" value="${entryInstance?.dateDone}" ></g:datePicker>54 <g:datePicker name="dateDone" value="${entryInstance?.dateDone}" precision="day"></g:datePicker> 55 55 </td> 56 56 </tr> … … 58 58 <tr class="prop"> 59 59 <td valign="top" class="name"> 60 <label for="durationHour">Duration Hour:</label>60 <label for="durationHour">Duration:</label> 61 61 </td> 62 <td valign="top" class="value ${hasErrors(bean:entryInstance,field:'durationHour','errors')}"> 63 <input type="text" id="durationHour" name="durationHour" value="${fieldValue(bean:entryInstance,field:'durationHour')}" /> 64 </td> 65 </tr> 66 67 <tr class="prop"> 68 <td valign="top" class="name"> 69 <label for="durationMinute">Duration Minute:</label> 70 </td> 71 <td valign="top" class="value ${hasErrors(bean:entryInstance,field:'durationMinute','errors')}"> 72 <input type="text" id="durationMinute" name="durationMinute" value="${fieldValue(bean:entryInstance,field:'durationMinute')}" /> 73 </td> 74 </tr> 62 63 <td valign="top" class="value"> 64 <input class="duration ${hasErrors(bean:entryInstance,field:'durationHour','errors')}" 65 type="text" id="durationHour" name="durationHour" 66 value="${fieldValue(bean:entryInstance,field:'durationHour')}" /> 67 : 68 <input class="duration ${hasErrors(bean:entryInstance,field:'durationMinute','errors')}" 69 type="text" id="durationMinute" name="durationMinute" 70 value="${fieldValue(bean:entryInstance,field:'durationMinute')}" /> 71 <g:helpBalloon code="entry.duration" /> 72 </td> 73 </tr> 75 74 76 75 <tr class="prop"> … … 78 77 <label for="dateEntered">Date Entered:</label> 79 78 </td> 80 <td valign="top" class="value ${hasErrors(bean:entryInstance,field:'dateEntered','errors')}">81 <g: datePicker name="dateEntered" value="${entryInstance?.dateEntered}" ></g:datePicker>79 <td valign="top" class="value"> 80 <g:formatDate date="${entryInstance?.dateEntered}" format="EEE, dd MMM yyyy @ HH:mm"/> 82 81 </td> 83 82 </tr> … … 87 86 <label for="enteredBy">Entered By:</label> 88 87 </td> 89 <td valign="top" class="value ${hasErrors(bean:entryInstance,field:'enteredBy','errors')}">90 <g:select optionKey="id" from="${Person.list()}" name="enteredBy.id" value="${entryInstance?.enteredBy?.id}" ></g:select>88 <td valign="top" class="value"> 89 ${entryInstance?.enteredBy?.toString()} 91 90 </td> 92 91 </tr> -
trunk/src/grails-app/views/entryDetailed/list.gsp
r92 r98 30 30 <g:sortableColumn property="dateDone" title="Date Done" /> 31 31 32 <g:sortableColumn property="durationHour" title="Duration Hour" /> 33 34 <g:sortableColumn property="durationMinute" title="Duration Minute" /> 35 32 <g:sortableColumn property="enteredBy" title="Entered By" /> 33 34 <th>Edit</th> 35 36 <th>Show</th> 37 36 38 </tr> 37 39 </thead> … … 40 42 <tr class="${(i % 2) == 0 ? 'odd' : 'even'}"> 41 43 42 <td> <g:link action="show" id="${entryInstance.id}">${fieldValue(bean:entryInstance, field:'id')}</g:link></td>44 <td>${fieldValue(bean:entryInstance, field:'id')}</td> 43 45 44 46 <td>${fieldValue(bean:entryInstance, field:'task')}</td> … … 48 50 <td>${fieldValue(bean:entryInstance, field:'dateDone')}</td> 49 51 50 <td>${fieldValue(bean:entryInstance, field:'durationHour')}</td> 51 52 <td>${fieldValue(bean:entryInstance, field:'durationMinute')}</td> 52 <td>${fieldValue(bean:entryInstance, field:'enteredBy')}</td> 53 54 <td><g:link action="edit" id="${entryInstance.id}">Edit</g:link></td> 55 56 <td><g:link action="show" id="${entryInstance.id}">Show</g:link></td> 53 57 54 58 </tr> -
trunk/src/grails-app/views/entryDetailed/show.gsp
r92 r98 33 33 <td valign="top" class="name">Task:</td> 34 34 35 <td valign="top" class="value"><g:link controller="task " action="show" id="${entryInstance?.task?.id}">${entryInstance?.task?.encodeAsHTML()}</g:link></td>35 <td valign="top" class="value"><g:link controller="taskDetailed" action="show" id="${entryInstance?.task?.id}">${entryInstance?.task?.encodeAsHTML()}</g:link></td> 36 36 37 37 </tr> … … 75 75 <td valign="top" class="name">Entered By:</td> 76 76 77 <td valign="top" class="value"> <g:link controller="person" action="show" id="${entryInstance?.enteredBy?.id}">${entryInstance?.enteredBy?.encodeAsHTML()}</g:link></td>77 <td valign="top" class="value">${entryInstance?.enteredBy?.encodeAsHTML()}</td> 78 78 79 79 </tr> … … 82 82 <td valign="top" class="name">Entry Type:</td> 83 83 84 <td valign="top" class="value"> <g:link controller="entryType" action="show" id="${entryInstance?.entryType?.id}">${entryInstance?.entryType?.encodeAsHTML()}</g:link></td>84 <td valign="top" class="value">${entryInstance?.entryType?.encodeAsHTML()}</td> 85 85 86 86 </tr> -
trunk/src/grails-app/views/layouts/main.gsp
r80 r98 5 5 <link rel="shortcut icon" href="${createLinkTo(dir:'images',file:'gnuMimsIcon.ico')}" type="image/x-icon" /> 6 6 <g:layoutHead /> 7 <g:helpBalloons/> 7 8 <g:javascript library="application" /> 8 9 </head> … … 10 11 <!-- Added g:pageProperty so that onload in each page works --> 11 12 <body onload="<g:pageProperty name='body.onload'/>"> 12 <div id="wrapper" style="height: 100%;"> 13 <div id="top"> 14 </div> 15 <div id="content" align="center"> 16 <div id="spinner" class="spinner" style="display:none;"> 17 <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" alt="Spinner" /> 18 </div> 19 <!-- <div class="logo" style="text-align: center; width: 980px; height: 220px"> 20 <img src="${createLinkTo(dir:'images',file:'logo.png')}" 21 alt="gnuMims" /> 22 <g:render template="/adminmenubar" /> 23 24 </div> --> 25 <div id="Header"> 26 <a href="http://www.gnumims.org" id=HeaderLink></a> 13 <div id="wrapper" style="height: 100%;"> 14 <div id="top"> 15 </div> 16 <div id="content" align="center"> 17 <div id="spinner" class="spinner" style="display:none;"> 18 <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" alt="Spinner" /> 19 </div> 20 <!-- <div class="logo" style="text-align: center; width: 980px; height: 220px"> 21 <img src="${createLinkTo(dir:'images',file:'logo.png')}" 22 alt="gnuMims" /> 23 <g:render template="/adminmenubar" /> 24 25 </div> --> 26 <div id="Header"> 27 <a href="http://www.gnumims.org" id=HeaderLink></a> 28 </div> 29 <div class="appControl"> 30 <g:render template="/adminmenubar" /> 31 </div> 32 <!-- Body wrapper div for IE --> 33 <div style="text-align: center; width: 980px"> 34 <g:layoutBody /> 35 </div><!--IE wrapper--> 36 </div><!--content--> 37 <div id="bottom"> 38 </div> 27 39 </div> 28 <div class="appControl">29 <g:render template="/adminmenubar" />30 </div>31 <!-- Body wrapper div for IE -->32 <div style="text-align: center; width: 980px">33 <g:layoutBody />34 </div>35 </div>36 <div id="bottom">37 </div>38 </div>39 40 </body> 40 41 </html> -
trunk/src/grails-app/views/taskDetailed/show.gsp
r96 r98 163 163 <th style="color:Black">Comment</th> 164 164 <th style="color:Black">Date Done</th> 165 <th style="color:Black">Duration</th> 165 166 <th style="color:Black">Entered By</th> 167 <th style="color:Black">Edit</th> 168 166 169 <!-- <g:sortableColumn property="comment" title="Comment" /> 167 170 … … 177 180 178 181 <td width="65%">${entry.comment}</td> 179 180 182 <td><g:formatDate date="${entry.dateDone}" format="EEE, dd MMM yyyy"/></td> 181 183 <td>${entry.durationHour}:${entry.durationMinute}</td> 182 184 <td>${entry.enteredBy}</td> 185 <td><g:link controller="entryDetailed" action="edit" id="${entry.id}">Edit</g:link></td> 186 183 187 </g:if> 184 188 … … 196 200 <th style="color:Black">Comment</th> 197 201 <th style="color:Black">Date Done</th> 202 <th style="color:Black">Duration</th> 198 203 <th style="color:Black">Entered By</th> 204 <th style="color:Black">Edit</th> 199 205 <!-- <g:sortableColumn property="commentW" title="Comment" /> 200 206 … … 210 216 211 217 <td width="65%">${entry.comment}</td> 212 213 218 <td><g:formatDate date="${entry.dateDone}" format="EEE, dd MMM yyyy"/></td> 214 219 <td>${entry.durationHour}:${entry.durationMinute}</td> 215 220 <td>${entry.enteredBy}</td> 221 <td><g:link controller="entryDetailed" action="edit" id="${entry.id}">Edit</g:link></td> 216 222 </g:if> 217 223 … … 225 231 226 232 <div class="buttons"> 227 <span class="menuButton" style="height:50px"> 228 <g:link controller="entryDetailed" params="['task.id':taskInstance.id]" action="create">Add Entry</g:link> 229 </span> 233 <g:form controller="entryDetailed"> 234 <input type="hidden" name="taskInstance.id" value="${taskInstance?.id}" /> 235 <span class="button"> 236 <g:actionSubmit value="Add Entry" action="create" class="edit"/> 237 </span> 238 </g:form> 230 239 </div> 231 240 -
trunk/src/web-app/css/main.css
r84 r98 18 18 background: #fff; 19 19 color: #333; 20 font: 1 1px verdana, arial, helvetica, sans-serif;20 font: 14px verdana, arial, helvetica, sans-serif; 21 21 background: transparent url("../images/brushed_metal.png") repeat fixed center; 22 22 } … … 60 60 color: #006dba; 61 61 font-weight: normal; 62 font-size: 1 6px;62 font-size: 17px; 63 63 margin: 0 0 .3em 0; 64 64 } … … 71 71 background-color: #fcfcfc; 72 72 border: 1px solid #ccc; 73 font: 1 1px verdana, arial, helvetica, sans-serif;73 font: 14px verdana, arial, helvetica, sans-serif; 74 74 margin: 2px 0; 75 75 padding: 2px 4px; … … 79 79 } 80 80 textarea { 81 width: 250px;81 width: 450px; 82 82 height: 150px; 83 83 vertical-align: top; … … 102 102 103 103 .appcontrolButton { 104 font-size: 1 0px;104 font-size: 14px; 105 105 padding: 5px 5px; 106 106 } … … 127 127 128 128 .menuButton { 129 font-size: 1 0px;129 font-size: 14px; 130 130 padding: 0 5px; 131 131 } … … 183 183 border: 1px solid red; 184 184 } 185 td.errors textarea { 186 border: 1px solid red; 187 } 188 189 input.duration { 190 width:40px; 191 } 192 input.duration.errors { 193 border: 1px solid red; 194 } 185 195 186 196 /* TABLES */ … … 194 204 } 195 205 td, th { 196 font: 1 1px verdana, arial, helvetica, sans-serif;197 line-height: 1 2px;206 font: 14px verdana, arial, helvetica, sans-serif; 207 line-height: 17px; 198 208 padding: 5px 6px; 199 209 text-align: left; … … 203 213 background: #fff url(../images/skin/shadow.jpg); 204 214 color: #666; 205 font-size: 1 1px;215 font-size: 14px; 206 216 font-weight: bold; 207 217 line-height: 17px; … … 211 221 color: #333; 212 222 display: block; 213 font-size: 1 0px;223 font-size: 14px; 214 224 text-decoration: none; 215 225 width: 100%; … … 252 262 border-top: 0; 253 263 color: #666; 254 font-size: 1 0px;264 font-size: 14px; 255 265 overflow: hidden; 256 266 padding: 10px 3px; … … 293 303 border: 1px solid #ccc; 294 304 color: #666; 295 font-size: 1 0px;305 font-size: 14px; 296 306 margin-top: -1px; 297 307 margin-bottom: 5px; … … 305 315 color: #333; 306 316 cursor: pointer; 307 font-size: 1 0px;317 font-size: 14px; 308 318 font-weight: bold; 309 319 margin-left: 3px;
Note: See TracChangeset
for help on using the changeset viewer.