Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
very basic working list
  • Loading branch information
robfletcher committed Jun 11, 2012
1 parent 1ca62c8 commit 60ff321
Show file tree
Hide file tree
Showing 10 changed files with 127 additions and 24 deletions.
2 changes: 2 additions & 0 deletions EmberScaffoldingGrailsPlugin.groovy
Expand Up @@ -4,6 +4,8 @@ class EmberScaffoldingGrailsPlugin {
def grailsVersion = '2.0 > *'
def dependsOn = [ember: '0.9.8.1 > *']
def pluginExcludes = [
'grails-app/conf/BootStrap.groovy',
'grails-app/views/layouts/main.gsp',
'grails-app/views/error.gsp'
]

Expand Down
15 changes: 15 additions & 0 deletions grails-app/conf/BootStrap.groovy
@@ -0,0 +1,15 @@
import grails.plugin.emberscaffolding.test.*
import java.text.SimpleDateFormat

class BootStrap {

def init = { servletContext ->
def date = new SimpleDateFormat('yyyy-MM-dd')

new Pirate(name: 'Edward Teach', nickname: 'Blackbeard').save(failOnError: true )
new Pirate(name: 'Jack Rackham', nickname: 'Calico Jack', dateOfBirth: date.parse('1682-12-21')).save(failOnError: true)
}

def destroy = {
}
}
6 changes: 6 additions & 0 deletions grails-app/conf/EmberScaffoldingResources.groovy
@@ -0,0 +1,6 @@
modules = {
'ember-scaffolding' {
dependsOn 'ember'
resource id: 'js', url: [plugin: 'ember-scaffolding', dir: 'js', file: "ember-scaffolding.js"]
}
}
@@ -0,0 +1,14 @@
package grails.plugin.emberscaffolding.test

class Pirate {

String name
String nickname
Date dateOfBirth

static constraints = {
name blank: false
dateOfBirth nullable: true
}

}
27 changes: 27 additions & 0 deletions grails-app/views/layouts/main.gsp
@@ -0,0 +1,27 @@
<!doctype html>
<!--[if lt IE 7 ]> <html lang="en" class="no-js ie6"> <![endif]-->
<!--[if IE 7 ]> <html lang="en" class="no-js ie7"> <![endif]-->
<!--[if IE 8 ]> <html lang="en" class="no-js ie8"> <![endif]-->
<!--[if IE 9 ]> <html lang="en" class="no-js ie9"> <![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--> <html lang="en" class="no-js"><!--<![endif]-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title><g:layoutTitle default="Grails"/></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="${resource(dir: 'images', file: 'favicon.ico')}" type="image/x-icon">
<link rel="apple-touch-icon" href="${resource(dir: 'images', file: 'apple-touch-icon.png')}">
<link rel="apple-touch-icon" sizes="114x114" href="${resource(dir: 'images', file: 'apple-touch-icon-retina.png')}">
<link rel="stylesheet" href="${resource(dir: 'css', file: 'main.css')}" type="text/css">
<link rel="stylesheet" href="${resource(dir: 'css', file: 'mobile.css')}" type="text/css">
<g:layoutHead/>
<r:layoutResources />
</head>
<body>
<div id="grailsLogo" role="banner"><a href="http://grails.org"><img src="${resource(dir: 'images', file: 'grails_logo.png')}" alt="Grails"/></a></div>
<g:layoutBody/>
<div class="footer" role="contentinfo"></div>
<div id="spinner" class="spinner" style="display:none;"><g:message code="spinner.alt" default="Loading&hellip;"/></div>
<r:layoutResources />
</body>
</html>
@@ -1,12 +1,21 @@
package grails.plugin.emberscaffolding

import org.codehaus.groovy.grails.web.binding.DefaultASTDatabindingHelper
import org.codehaus.groovy.grails.commons.GrailsDomainClass
import org.codehaus.groovy.grails.commons.GrailsDomainClassProperty

class ScaffoldingHelper {

static List<String> getBindableProperties(Class domainClass) {
domainClass."$DefaultASTDatabindingHelper.DEFAULT_DATABINDING_WHITELIST".findAll {
!it.endsWith('_*')
!it.endsWith('*')
}
}

static List<GrailsDomainClassProperty> getBindableProperties(GrailsDomainClass domainClass) {
def propertyNames = getBindableProperties(domainClass.clazz)
propertyNames.collect {
domainClass.getPropertyByName(it)
}
}

Expand Down
3 changes: 2 additions & 1 deletion src/templates/scaffolding/Controller.groovy
Expand Up @@ -12,7 +12,8 @@ class ${className}Controller {

def list() {
params.max = Math.min(params.max ? params.int('max') : 10, 100)
render ScaffoldingHelper.getBindablePropertyValues(${className}.list(params)) as JSON
def ${propertyName}List = ScaffoldingHelper.getBindablePropertyValues(${className}.list(params))
render ${propertyName}List as JSON
}

// def create() {
Expand Down
24 changes: 20 additions & 4 deletions src/templates/scaffolding/index.gsp
@@ -1,12 +1,13 @@
<% import grails.persistence.Event %>
<% import grails.plugin.emberscaffolding.ScaffoldingHelper %>
<%=packageName%>
<!doctype html>
<html>
<head>
<meta name="layout" content="main">
<g:set var="entityName" value="\${message(code: '${domainClass.propertyName}.label', default: '${className}')}" />
<title>\${entityName}</title>
<r:require module="ember"/>
<r:require module="ember-scaffolding"/>
</head>
<body>
<div class="nav" role="navigation">
Expand All @@ -16,10 +17,25 @@
<li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li>
</ul>
</div>
<div class="content" role="main">
<div id="content" role="main">
</div>
<script type="text/x-handlebars" data-template-name="\${entityName}-list">
<g:include view="list.handlebars"/>
<script type="text/x-handlebars" data-template-name="list">
<h1><g:message code="default.list.label" args="[entityName]" /></h1>
<table>
<thead>
<tr><% props = ScaffoldingHelper.getBindableProperties(domainClass)
for (p in props) { %>
<th><g:message code="${domainClass.propertyName}.${p.name}.label" default="${p.naturalName}" /></th>
<% } %></tr>
</thead>
<tbody>
{{#each App.listController}}
<tr><% for (p in props) { %>
<td>{{${p.name}}}</td>
<% } %></tr>
{{/each}}
</tbody>
</table>
</script>
</body>
</html>
18 changes: 0 additions & 18 deletions src/templates/scaffolding/list.handlebars

This file was deleted.

31 changes: 31 additions & 0 deletions web-app/js/ember-scaffolding.js
@@ -0,0 +1,31 @@
var App = Ember.Application.create();

App.List = Ember.Object.extend({});

App.ListController = Ember.ArrayController.extend({});

App.ListView = Ember.View.extend({
controller: App.ListController,
templateName: 'list'
});

App.listController = App.ListController.create();
App.ListView.create({controller: App.listController}).appendTo('#content');
jQuery.getJSON("list", function(data) {
App.listController.set('content', data);
});

//App.Router = Ember.Router.extend({
// root: Ember.State.extend({
// index: Ember.State.extend({
// route: '/',
// redirectsTo: 'list'
// }),
// list: Ember.State.extend({
// route: '/list',
// connectOutlets: function(router) {
// router.get('applicationController').connectOutlet(App.ListView, App.List.find());
// }
// })
// })
//});

0 comments on commit 60ff321

Please sign in to comment.