Skip to content

Instantly share code, notes, and snippets.

@chanwit
Created June 8, 2009 19:13
Show Gist options
  • Save chanwit/126002 to your computer and use it in GitHub Desktop.
Save chanwit/126002 to your computer and use it in GitHub Desktop.
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