Created
June 8, 2009 19:13
-
-
Save chanwit/126002 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.zkoss.zkgrails.* | |
import org.codehaus.groovy.grails.scaffolding.* | |
import org.zkoss.zkplus.databind.DataBinder | |
import org.zkoss.zk.ui.event.ForwardEvent | |
class ScaffoldComposer extends GrailsComposer { | |
static scaffold = Event | |
def grailsApplication | |
def lblTitle | |
def boxMain | |
def binder = new DataBinder() | |
def scaffoldPaging | |
def scaffoldListbox | |
def scaffoldProps | |
def selected | |
def onClick_btnHello() { | |
lstResult.clear() | |
lstResult.append { | |
listitem { listcell { label(value: "Hello, ${txtName.value} !") } } | |
} | |
} | |
def getTagFromType(type) { | |
def tag = "textbox" | |
switch(type) { | |
case Boolean.class: tag = "checkbox"; break | |
case Integer.class: tag = "intbox"; break | |
case Long.class: tag = "longbox"; break | |
case Double.class: | |
case Float.class: tag = "doublebox"; break | |
case java.util.Date.class: | |
tag = "datebox"; break | |
} | |
return tag | |
} | |
def redrawForm() { | |
binder.bindBean("selected", selected) | |
binder.loadAll() | |
} | |
def redraw(page=0) { | |
def list = scaffold.list( | |
offset: page * scaffoldPaging.pageSize, | |
max: scaffoldPaging.pageSize | |
) | |
scaffoldListbox.clear() | |
scaffoldListbox.append { | |
list.each { e -> | |
listitem(value: e) { | |
scaffoldProps.each { p -> | |
listcell(label: e[p.name]) | |
} | |
} | |
} | |
} | |
} | |
// TODO | |
// 1. wire events | |
// 2. add paginate | |
// 3. add annotation (if possible) | |
// 4. refactor it to another class, | |
// probably in to org.zkoss.zkgrails.scaffolding.DefaultScaffoldingTemplate | |
// x. name to Name, createdDate to Created Date | |
// 6. i18n | |
// x. type mapping | |
def afterCompose = { window -> | |
def dc = grailsApplication.getDomainClass(scaffold.name) | |
binder.bindBean("selected", selected) | |
scaffoldProps = (dc.properties as Object[]).findAll { | |
it.name != "id" && it.name != "version" | |
} | |
scaffoldProps = scaffoldProps.sort(new DomainClassPropertyComparator(dc)) | |
if(scaffoldProps.size() > 6) scaffoldProps = scaffoldProps[0..5] | |
boxMain.append { | |
scaffoldListbox = listbox(id: "lst${scaffold.name}", multiple:true, rows: 10) { | |
listhead { | |
scaffoldProps.each { p -> | |
listheader(label:"${p.naturalName}") | |
} | |
} | |
} | |
scaffoldListbox.onSelect = { e -> | |
selected = scaffoldListbox.selectedItem.value | |
redrawForm() | |
} | |
scaffoldPaging = paging(id:"pag${scaffold.name}", pageSize: 10, onPaging:{ e -> | |
redraw(e.activePage) | |
}) | |
groupbox { | |
caption(label: "${scaffold.name}") | |
hbox { | |
def w="65px" | |
button(id:"btnAdd", label:"Add", width:w, onClick: { e -> | |
// add new object - with default value | |
// redraw last page | |
// | |
}) | |
button(id:"btnUpdate", label:"Update", width:w) | |
button(id:"btnDelete", label:"Delete", width:w, onClick: { e -> | |
selected?.delete(flush:true) | |
selected = null | |
redrawForm() | |
scaffoldPaging.totalSize = scaffold.count() | |
redraw(scaffoldPaging.activePage) | |
}) | |
button(id:"btnRefresh", label:"Refresh", width:w, onClick: { e -> | |
redraw(scaffoldPaging.activePage) | |
}) | |
} | |
separator(bar: true) | |
grid { | |
rows { | |
scaffoldProps.each { p -> | |
row { | |
def tag = getTagFromType(p.type) | |
label(value:"${p.naturalName}:") | |
def editor | |
if(tag!="checkbox") { | |
editor = "$tag"(id: "fd${p.name}", cols: 25) | |
binder.addBinding(editor, "value", "selected.${p.name}") | |
} else { | |
editor = "$tag"(id: "fd${p.name}") | |
binder.addBinding(editor, "checked", "selected.${p.name}") | |
} | |
// println p.properties | |
}} | |
} | |
} | |
} | |
} | |
scaffoldPaging.totalSize = scaffold.count() | |
redraw() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment