Skip to content

Commit

Permalink
added the scaffolding templates, was an error in production when I di…
Browse files Browse the repository at this point in the history
…d not do this
  • Loading branch information
jettro committed Nov 17, 2009
1 parent 58cb6c8 commit 4a62589
Show file tree
Hide file tree
Showing 15 changed files with 847 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/templates/artifacts/Controller.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@artifact.package@class @artifact.name@ {

def index = { }
}
5 changes: 5 additions & 0 deletions src/templates/artifacts/DomainClass.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@artifact.package@class @artifact.name@ {

static constraints = {
}
}
17 changes: 17 additions & 0 deletions src/templates/artifacts/Filters.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
@artifact.package@class @artifact.name@ {

def filters = {
all(controller:'*', action:'*') {
before = {

}
after = {

}
afterView = {

}
}
}

}
7 changes: 7 additions & 0 deletions src/templates/artifacts/Script.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
includeTargets << grailsScript("Init")

target(main: "The description of the script goes here!") {
// TODO: Implement script here
}

setDefaultTarget(main)
8 changes: 8 additions & 0 deletions src/templates/artifacts/Service.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
@artifact.package@class @artifact.name@ {

boolean transactional = true

def serviceMethod() {

}
}
3 changes: 3 additions & 0 deletions src/templates/artifacts/TagLib.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
@artifact.package@class @artifact.name@ {

}
15 changes: 15 additions & 0 deletions src/templates/artifacts/Tests.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
@artifact.package@import grails.test.*

class @artifact.name@ extends @artifact.superclass@ {
protected void setUp() {
super.setUp()
}

protected void tearDown() {
super.tearDown()
}

void testSomething() {

}
}
54 changes: 54 additions & 0 deletions src/templates/artifacts/WebTest.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
class @webtest.name.caps@Test extends grails.util.WebTest {

// Unlike unit tests, functional tests are often sequence dependent.
// Specify that sequence here.
void suite() {
test@webtest.name.caps@ListNewDelete()
// add tests for more operations here
}

def test@webtest.name.caps@ListNewDelete() {
webtest('@webtest.name.caps@ basic operations: view list, create new entry, view, edit, delete, view') {
invoke(url:'@webtest.name.lower@')
verifyText(text:'Home')

verifyListPage(0)

clickLink(label:'New @webtest.name.caps@')
verifyText(text:'Create @webtest.name.caps@')
clickButton(label:'Create')
verifyText(text:'Show @webtest.name.caps@', description:'Detail page')
clickLink(label:'List', description:'Back to list view')

verifyListPage(1)

group(description:'edit the one element') {
clickLink(label:'Show', description:'go to detail view')
clickButton(label:'Edit')
verifyText(text:'Edit @webtest.name.caps@')
clickButton(label:'Update')
verifyText(text:'Show @webtest.name.caps@')
clickLink(label:'List', description:'Back to list view')
}

verifyListPage(1)

group(description:'delete the only element') {
clickLink(label:'Show', description:'go to detail view')
clickButton(label:'Delete')
verifyXPath(xpath:"//div[@class='message']", text:/@webtest.name.caps@.*deleted./, regex:true)
}

verifyListPage(0)
}
}

String ROW_COUNT_XPATH = "count(//td[@class='actionButtons']/..)"

def verifyListPage(int count) {
ant.group(description:"verify @webtest.name.caps@ list view with $count row(s)") {
verifyText(text:'@webtest.name.caps@ List')
verifyXPath(xpath:ROW_COUNT_XPATH, text:count, description:"$count row(s) of data expected")
}
}
}
99 changes: 99 additions & 0 deletions src/templates/scaffolding/Controller.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@


<%=packageName ? "package ${packageName}\n\n" : ''%>class ${className}Controller {

def index = { redirect(action:list,params:params) }

// the delete, save and update actions only accept POST requests
static allowedMethods = [delete:'POST', save:'POST', update:'POST']

def list = {
params.max = Math.min( params.max ? params.max.toInteger() : 10, 100)
[ ${propertyName}List: ${className}.list( params ), ${propertyName}Total: ${className}.count() ]
}

def show = {
def ${propertyName} = ${className}.get( params.id )

if(!${propertyName}) {
flash.message = "${className} not found with id \${params.id}"
redirect(action:list)
}
else { return [ ${propertyName} : ${propertyName} ] }
}

def delete = {
def ${propertyName} = ${className}.get( params.id )
if(${propertyName}) {
try {
${propertyName}.delete(flush:true)
flash.message = "${className} \${params.id} deleted"
redirect(action:list)
}
catch(org.springframework.dao.DataIntegrityViolationException e) {
flash.message = "${className} \${params.id} could not be deleted"
redirect(action:show,id:params.id)
}
}
else {
flash.message = "${className} not found with id \${params.id}"
redirect(action:list)
}
}

def edit = {
def ${propertyName} = ${className}.get( params.id )

if(!${propertyName}) {
flash.message = "${className} not found with id \${params.id}"
redirect(action:list)
}
else {
return [ ${propertyName} : ${propertyName} ]
}
}

def update = {
def ${propertyName} = ${className}.get( params.id )
if(${propertyName}) {
if(params.version) {
def version = params.version.toLong()
if(${propertyName}.version > version) {
<%def lowerCaseName = grails.util.GrailsNameUtils.getPropertyName(className)%>
${propertyName}.errors.rejectValue("version", "${lowerCaseName}.optimistic.locking.failure", "Another user has updated this ${className} while you were editing.")
render(view:'edit',model:[${propertyName}:${propertyName}])
return
}
}
${propertyName}.properties = params
if(!${propertyName}.hasErrors() && ${propertyName}.save()) {
flash.message = "${className} \${params.id} updated"
redirect(action:show,id:${propertyName}.id)
}
else {
render(view:'edit',model:[${propertyName}:${propertyName}])
}
}
else {
flash.message = "${className} not found with id \${params.id}"
redirect(action:list)
}
}

def create = {
def ${propertyName} = new ${className}()
${propertyName}.properties = params
return ['${propertyName}':${propertyName}]
}

def save = {
def ${propertyName} = new ${className}(params)
if(!${propertyName}.hasErrors() && ${propertyName}.save()) {
flash.message = "${className} \${${propertyName}.id} created"
redirect(action:show,id:${propertyName}.id)
}
else {
render(view:'create',model:[${propertyName}:${propertyName}])
}
}
}
62 changes: 62 additions & 0 deletions src/templates/scaffolding/create.gsp
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<% import org.codehaus.groovy.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor as Events %>
<%=packageName%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="layout" content="main" />
<title>Create ${className}</title>
</head>
<body>
<div class="nav">
<span class="menuButton"><a class="home" href="\${resource(dir:'')}">Home</a></span>
<span class="menuButton"><g:link class="list" action="list">${className} List</g:link></span>
</div>
<div class="body">
<h1>Create ${className}</h1>
<g:if test="\${flash.message}">
<div class="message">\${flash.message}</div>
</g:if>
<g:hasErrors bean="\${${propertyName}}">
<div class="errors">
<g:renderErrors bean="\${${propertyName}}" as="list" />
</div>
</g:hasErrors>
<g:form action="save" method="post" <%= multiPart ? ' enctype="multipart/form-data"' : '' %>>
<div class="dialog">
<table>
<tbody>
<%
excludedProps = ['version',
'id',
Events.ONLOAD_EVENT,
Events.BEFORE_DELETE_EVENT,
Events.BEFORE_INSERT_EVENT,
Events.BEFORE_UPDATE_EVENT]
props = domainClass.properties.findAll { !excludedProps.contains(it.name) }
Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[]))
props.each { p ->
if(!Collection.class.isAssignableFrom(p.type)) {
cp = domainClass.constrainedProperties[p.name]
display = (cp ? cp.display : true)
if(display) { %>
<tr class="prop">
<td valign="top" class="name">
<label for="${p.name}">${p.naturalName}:</label>
</td>
<td valign="top" class="value \${hasErrors(bean:${propertyName},field:'${p.name}','errors')}">
${renderEditor(p)}
</td>
</tr>
<% } } } %>
</tbody>
</table>
</div>
<div class="buttons">
<span class="button"><input class="save" type="submit" value="Create" /></span>
</div>
</g:form>
</div>
</body>
</html>
64 changes: 64 additions & 0 deletions src/templates/scaffolding/edit.gsp
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<% import org.codehaus.groovy.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor as Events %>
<%=packageName%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="layout" content="main" />
<title>Edit ${className}</title>
</head>
<body>
<div class="nav">
<span class="menuButton"><a class="home" href="\${resource(dir:'')}">Home</a></span>
<span class="menuButton"><g:link class="list" action="list">${className} List</g:link></span>
<span class="menuButton"><g:link class="create" action="create">New ${className}</g:link></span>
</div>
<div class="body">
<h1>Edit ${className}</h1>
<g:if test="\${flash.message}">
<div class="message">\${flash.message}</div>
</g:if>
<g:hasErrors bean="\${${propertyName}}">
<div class="errors">
<g:renderErrors bean="\${${propertyName}}" as="list" />
</div>
</g:hasErrors>
<g:form method="post" <%= multiPart ? ' enctype="multipart/form-data"' : '' %>>
<input type="hidden" name="id" value="\${${propertyName}?.id}" />
<input type="hidden" name="version" value="\${${propertyName}?.version}" />
<div class="dialog">
<table>
<tbody>
<%
excludedProps = ['version',
'id',
Events.ONLOAD_EVENT,
Events.BEFORE_DELETE_EVENT,
Events.BEFORE_INSERT_EVENT,
Events.BEFORE_UPDATE_EVENT]
props = domainClass.properties.findAll { !excludedProps.contains(it.name) }
Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[]))
props.each { p ->
cp = domainClass.constrainedProperties[p.name]
display = (cp ? cp.display : true)
if(display) { %>
<tr class="prop">
<td valign="top" class="name">
<label for="${p.name}">${p.naturalName}:</label>
</td>
<td valign="top" class="value \${hasErrors(bean:${propertyName},field:'${p.name}','errors')}">
${renderEditor(p)}
</td>
</tr>
<% } } %>
</tbody>
</table>
</div>
<div class="buttons">
<span class="button"><g:actionSubmit class="save" value="Update" /></span>
<span class="button"><g:actionSubmit class="delete" onclick="return confirm('Are you sure?');" value="Delete" /></span>
</div>
</g:form>
</div>
</body>
</html>
Loading

0 comments on commit 4a62589

Please sign in to comment.