| [128] | 1 | <%  if(property.type == Boolean.class || property.type == boolean.class) | 
|---|
 | 2 |         out << renderBooleanEditor(domainClass,property)         | 
|---|
 | 3 |     else if(Number.class.isAssignableFrom(property.type) || (property.type.isPrimitive() && property.type != boolean.class)) | 
|---|
 | 4 |         out << renderNumberEditor(domainClass,property) | 
|---|
 | 5 |     else if(property.type == String.class) | 
|---|
 | 6 |         out << renderStringEditor(domainClass,property) | 
|---|
 | 7 |     else if(property.type == Date.class || property.type == java.sql.Date.class || property.type == java.sql.Time.class) | 
|---|
 | 8 |         out << renderDateEditor(domainClass,property) | 
|---|
 | 9 |     else if(property.type == Calendar.class) | 
|---|
 | 10 |         out << renderDateEditor(domainClass,property)   | 
|---|
 | 11 |     else if(property.type == URL.class)  | 
|---|
 | 12 |         out << renderStringEditor(domainClass,property) | 
|---|
 | 13 |     else if(property.isEnum()) | 
|---|
 | 14 |         out << renderEnumEditor(domainClass,property) | 
|---|
 | 15 |     else if(property.type == TimeZone.class) | 
|---|
 | 16 |         out << renderSelectTypeEditor("timeZone",domainClass,property) | 
|---|
 | 17 |     else if(property.type == Locale.class) | 
|---|
 | 18 |         out << renderSelectTypeEditor("locale",domainClass,property) | 
|---|
 | 19 |     else if(property.type == Currency.class) | 
|---|
 | 20 |         out << renderSelectTypeEditor("currency",domainClass,property) | 
|---|
 | 21 |     else if(property.type==([] as Byte[]).class) //TODO: Bug in groovy means i have to do this :( | 
|---|
 | 22 |         out << renderByteArrayEditor(domainClass,property) | 
|---|
 | 23 |     else if(property.type==([] as byte[]).class) //TODO: Bug in groovy means i have to do this :( | 
|---|
 | 24 |         out << renderByteArrayEditor(domainClass,property)                 | 
|---|
 | 25 |     else if(property.manyToOne || property.oneToOne) | 
|---|
 | 26 |         out << renderManyToOne(domainClass,property) | 
|---|
 | 27 |     else if((property.oneToMany && !property.bidirectional) || (property.manyToMany && property.isOwningSide())) | 
|---|
 | 28 |         out << renderManyToMany(domainClass, property) | 
|---|
 | 29 |     else if(property.oneToMany) | 
|---|
 | 30 |         out << renderOneToMany(domainClass,property) | 
|---|
 | 31 |  | 
|---|
 | 32 |     private renderEnumEditor(domainClass,property) { | 
|---|
 | 33 |         if(property.isEnum()) { | 
|---|
 | 34 |             return "<g:select  from=\"\${${property.type.name}?.values()}\" value=\"\${${domainInstance}?.${property.name}}\" name=\"${property.name}\" ${renderNoSelection(property)}></g:select>" | 
|---|
 | 35 |         } | 
|---|
 | 36 |     } | 
|---|
 | 37 |  | 
|---|
 | 38 |     private renderStringEditor(domainClass, property) { | 
|---|
 | 39 |         if(!cp) { | 
|---|
 | 40 |             return "<input type=\"text\" name=\"${property.name}\" id=\"${property.name}\" value=\"\${fieldValue(bean:${domainInstance},field:'${property.name}')}\" />" | 
|---|
 | 41 |         } | 
|---|
 | 42 |         else { | 
|---|
 | 43 |             if("textarea" == cp.widget || (cp.maxSize > 250 && !cp.password && !cp.inList)) { | 
|---|
 | 44 |                 return "<textarea rows=\"5\" cols=\"40\" name=\"${property.name}\">\${fieldValue(bean:${domainInstance}, field:'${property.name}')}</textarea>" | 
|---|
 | 45 |             } | 
|---|
 | 46 |              else { | 
|---|
 | 47 |                 if(cp.inList) { | 
|---|
 | 48 |                     def sb = new StringBuffer('<g:select ') | 
|---|
 | 49 |                     sb << "id=\"${property.name}\" name=\"${property.name}\" from=\"\${${domainInstance}.constraints.${property.name}.inList}\" value=\"\${${domainInstance}.${property?.name}}\" ${renderNoSelection(property)}>" | 
|---|
 | 50 |                     sb << '</g:select>' | 
|---|
 | 51 |                     return sb.toString() | 
|---|
 | 52 |                 } | 
|---|
 | 53 |                 else { | 
|---|
 | 54 |                     def sb = new StringBuffer('<input ') | 
|---|
 | 55 |                     cp.password ? sb << 'type="password" ' : sb << 'type="text" ' | 
|---|
 | 56 |                     if(!cp.editable) sb << 'readonly="readonly" ' | 
|---|
 | 57 |                     if(cp.maxSize) sb << "maxlength=\"${cp.maxSize}\" " | 
|---|
 | 58 |                     sb << "id=\"${property.name}\" name=\"${property.name}\" value=\"\${fieldValue(bean:${domainInstance},field:'${property.name}')}\"/>" | 
|---|
 | 59 |                     return sb.toString() | 
|---|
 | 60 |                 } | 
|---|
 | 61 |             } | 
|---|
 | 62 |         } | 
|---|
 | 63 |     } | 
|---|
 | 64 |  | 
|---|
 | 65 |     private renderByteArrayEditor(domainClass,property) { | 
|---|
 | 66 |         return "<input type=\"file\" id=\"${property.name}\" name=\"${property.name}\" />" | 
|---|
 | 67 |     } | 
|---|
 | 68 |  | 
|---|
 | 69 |     private renderManyToOne(domainClass,property) { | 
|---|
 | 70 |         if(property.association) { | 
|---|
 | 71 |             return "<g:select optionKey=\"id\" from=\"\${${property.type.name}.list()}\" name=\"${property.name}.id\" value=\"\${${domainInstance}?.${property.name}?.id}\" ${renderNoSelection(property)}></g:select>" | 
|---|
 | 72 |         } | 
|---|
 | 73 |     } | 
|---|
 | 74 |  | 
|---|
 | 75 |     private renderManyToMany(domainClass,property) { | 
|---|
 | 76 |         def sw = new StringWriter() | 
|---|
 | 77 |         def pw = new PrintWriter(sw) | 
|---|
 | 78 |  | 
|---|
 | 79 |         pw.println "<g:select name=\"${property.name}\"" | 
|---|
 | 80 |         pw.println "from=\"\${${property.referencedDomainClass.fullName}.list()}\"" | 
|---|
 | 81 |         pw.println "size=\"5\" multiple=\"yes\" optionKey=\"id\"" | 
|---|
 | 82 |         pw.println "value=\"\${${domainInstance}?.${property.name}}\" />" | 
|---|
 | 83 |  | 
|---|
 | 84 |         return sw.toString()          | 
|---|
 | 85 |     } | 
|---|
 | 86 |  | 
|---|
 | 87 |     private renderOneToMany(domainClass,property) { | 
|---|
 | 88 |         def sw = new StringWriter() | 
|---|
 | 89 |         def pw = new PrintWriter(sw) | 
|---|
 | 90 |         pw.println() | 
|---|
 | 91 |         pw.println "<ul>" | 
|---|
 | 92 |         pw.println "<g:each var=\"${property.name[0]}\" in=\"\${${domainInstance}?.${property.name}?}\">" | 
|---|
 | 93 |         pw.println "    <li><g:link controller=\"${property.referencedDomainClass.propertyName}\" action=\"show\" id=\"\${${property.name[0]}.id}\">\${${property.name[0]}?.encodeAsHTML()}</g:link></li>" | 
|---|
 | 94 |         pw.println "</g:each>" | 
|---|
 | 95 |         pw.println "</ul>" | 
|---|
| [411] | 96 |         pw.println "<g:link controller=\"${property.referencedDomainClass.propertyName}\" params=\"['${domainClass.propertyName}.id':${domainInstance}?.id]\" action=\"create\">+Add ${property.referencedDomainClass.shortName}</g:link>" | 
|---|
| [128] | 97 |         return sw.toString() | 
|---|
 | 98 |     } | 
|---|
 | 99 |  | 
|---|
 | 100 |     private renderNumberEditor(domainClass,property) { | 
|---|
 | 101 |         if(!cp) { | 
|---|
 | 102 |             if(property.type == Byte.class) { | 
|---|
 | 103 |                 return "<g:select from=\"\${-128..127}\" name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\"></g:select>" | 
|---|
 | 104 |             } | 
|---|
 | 105 |             else { | 
|---|
 | 106 |                 return "<input type=\"text\" id=\"${property.name}\" name=\"${property.name}\" value=\"\${fieldValue(bean:${domainInstance},field:'${property.name}')}\" />" | 
|---|
 | 107 |             } | 
|---|
 | 108 |         } | 
|---|
 | 109 |         else { | 
|---|
 | 110 |             if(cp.range) { | 
|---|
 | 111 |                 return "<g:select from=\"\${${cp.range.from}..${cp.range.to}}\" id=\"${property.name}\" name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\" ${renderNoSelection(property)}></g:select>" | 
|---|
 | 112 |             } | 
|---|
 | 113 |             else if(cp.inList) { | 
|---|
 | 114 |                 def sb = new StringBuffer('<g:select ') | 
|---|
 | 115 |                 sb << "id=\"${property.name}\" name=\"${property.name}\" from=\"\${${domainClass.propertyName}.constraints.${property.name}.inList}\" value=\"\${${domainClass.propertyName}.${property?.name}}\" ${renderNoSelection(property)}>" | 
|---|
 | 116 |                 sb << '</g:select>' | 
|---|
 | 117 |                 return sb.toString() | 
|---|
 | 118 |             }             | 
|---|
 | 119 |             else { | 
|---|
 | 120 |                 return "<input type=\"text\" id=\"${property.name}\" name=\"${property.name}\" value=\"\${fieldValue(bean:${domainInstance},field:'${property.name}')}\" />" | 
|---|
 | 121 |             } | 
|---|
 | 122 |         } | 
|---|
 | 123 |      } | 
|---|
 | 124 |  | 
|---|
 | 125 |     private renderBooleanEditor(domainClass,property) { | 
|---|
 | 126 |         if(!cp) { | 
|---|
 | 127 |             return "<g:checkBox name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\"></g:checkBox>" | 
|---|
 | 128 |         } | 
|---|
 | 129 |         else { | 
|---|
 | 130 |             def buf = new StringBuffer('<g:checkBox ') | 
|---|
 | 131 |             if(cp.widget) buf << "widget=\"${cp.widget}\""; | 
|---|
 | 132 |  | 
|---|
 | 133 |             buf << "name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\" " | 
|---|
 | 134 |             cp.attributes.each { k,v -> | 
|---|
 | 135 |                 buf << "${k}=\"${v}\" " | 
|---|
 | 136 |             } | 
|---|
 | 137 |             buf << '></g:checkBox>' | 
|---|
 | 138 |             return buf.toString() | 
|---|
 | 139 |         } | 
|---|
 | 140 |     } | 
|---|
 | 141 |  | 
|---|
 | 142 |     private renderDateEditor(domainClass,property) { | 
|---|
| [158] | 143 |         def precision = property.type == java.sql.Date ? 'day' : 'minute'; | 
|---|
| [128] | 144 |         if(!cp) { | 
|---|
| [158] | 145 |             return "<g:datePicker name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\" precision=\"${precision}\"></g:datePicker>" | 
|---|
| [128] | 146 |         } | 
|---|
 | 147 |         else { | 
|---|
 | 148 |             if(!cp.editable) { | 
|---|
 | 149 |                 return "\${${domainInstance}?.${property.name}?.toString()}" | 
|---|
 | 150 |             } | 
|---|
 | 151 |             else { | 
|---|
 | 152 |                 def buf = new StringBuffer('<g:datePicker ') | 
|---|
 | 153 |                 if(cp.widget) buf << "widget=\"${cp.widget}\" " | 
|---|
 | 154 |                 if(cp.format) buf << "format=\"${cp.format}\" " | 
|---|
 | 155 |                 cp.attributes.each { k,v -> | 
|---|
 | 156 |                     buf << "${k}=\"${v}\" " | 
|---|
 | 157 |                 } | 
|---|
| [158] | 158 |                 buf << "name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\" precision=\"${precision}\" ${renderNoSelection(property)}></g:datePicker>" | 
|---|
| [128] | 159 |                 return buf.toString() | 
|---|
 | 160 |             } | 
|---|
 | 161 |         } | 
|---|
 | 162 |     } | 
|---|
 | 163 |  | 
|---|
 | 164 |     private renderSelectTypeEditor(type,domainClass,property) { | 
|---|
 | 165 |         if(!cp) { | 
|---|
 | 166 |             return "<g:${type}Select name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\"></g:${type}Select>" | 
|---|
 | 167 |         } | 
|---|
 | 168 |         else { | 
|---|
 | 169 |             def buf = new StringBuffer("<g:${type}Select ") | 
|---|
 | 170 |             if(cp.widget) buf << "widget=\"${cp.widget}\" "; | 
|---|
 | 171 |             cp.attributes.each { k,v -> | 
|---|
 | 172 |                 buf << "${k}=\"${v}\" " | 
|---|
 | 173 |             } | 
|---|
 | 174 |             buf << "name=\"${property.name}\" value=\"\${${domainInstance}?.${property.name}}\" ${renderNoSelection(property)}></g:${type}Select>" | 
|---|
 | 175 |             return buf.toString() | 
|---|
 | 176 |         } | 
|---|
 | 177 |     } | 
|---|
 | 178 |  | 
|---|
 | 179 |     private renderNoSelection(property) { | 
|---|
 | 180 |         if(property.optional) { | 
|---|
 | 181 |             if(property.manyToOne || property.oneToOne) { | 
|---|
 | 182 |                 return "noSelection=\"['null':'']\""                             | 
|---|
 | 183 |             } | 
|---|
 | 184 |             else { | 
|---|
 | 185 |                 return "noSelection=\"['':'']\"" | 
|---|
 | 186 |             } | 
|---|
 | 187 |         } | 
|---|
 | 188 |         return "" | 
|---|
 | 189 |     } | 
|---|
 | 190 | %> | 
|---|