Skip to content

Commit b81a9b1

Browse files
committed
bug fixed
1 parent f04e658 commit b81a9b1

File tree

6 files changed

+48
-57
lines changed

6 files changed

+48
-57
lines changed

fields/datetime.go

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,9 @@ func TimeField(name string) *Field {
5252
// DatetimeFieldFromInstance creates and initializes a datetime field based on its name, the reference object instance and field number.
5353
// This method looks for "form_min", "form_max" and "form_value" tags to add additional parameters to the field.
5454
// It also uses i object's [fieldNo]-th field content (if any) to override the "form_value" option and fill the HTML field.
55-
func DatetimeFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
55+
func DatetimeFieldFromInstance(val reflect.Value,t reflect.Type, fieldNo int, name string) *Field {
5656
ret := DatetimeField(name)
5757
// check tags
58-
t := reflect.TypeOf(i)
5958
if v := formcommon.Tag(t, fieldNo, "form_min"); v != "" {
6059
if !validateDatetime(v) {
6160
panic(errors.New(fmt.Sprintf("Invalid date value (min) for field: %s", name)))
@@ -71,7 +70,7 @@ func DatetimeFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
7170
if v := formcommon.Tag(t, fieldNo, "form_value"); v != "" {
7271
ret.SetValue(v)
7372
} else {
74-
if v := reflect.ValueOf(i).Field(fieldNo).Interface().(time.Time); !v.IsZero() {
73+
if v := val.Field(fieldNo).Interface().(time.Time); !v.IsZero() {
7574
ret.SetValue(v.Format(DATETIME_FORMAT))
7675
}
7776
}
@@ -81,10 +80,9 @@ func DatetimeFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
8180
// DateFieldFromInstance creates and initializes a date field based on its name, the reference object instance and field number.
8281
// This method looks for "form_min", "form_max" and "form_value" tags to add additional parameters to the field.
8382
// It also uses i object's [fieldNo]-th field content (if any) to override the "form_value" option and fill the HTML field.
84-
func DateFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
83+
func DateFieldFromInstance(val reflect.Value,t reflect.Type, fieldNo int, name string) *Field {
8584
ret := DateField(name)
8685
// check tags
87-
t := reflect.TypeOf(i)
8886
if v := formcommon.Tag(t, fieldNo, "form_min"); v != "" {
8987
if !validateDate(v) {
9088
panic(errors.New(fmt.Sprintf("Invalid date value (min) for field", name)))
@@ -100,7 +98,7 @@ func DateFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
10098
if v := formcommon.Tag(t, fieldNo, "form_value"); v != "" {
10199
ret.SetValue(v)
102100
} else {
103-
if v := reflect.ValueOf(i).Field(fieldNo).Interface().(time.Time); !v.IsZero() {
101+
if v := val.Field(fieldNo).Interface().(time.Time); !v.IsZero() {
104102
ret.SetValue(v.Format(DATE_FORMAT))
105103
}
106104
}
@@ -110,10 +108,9 @@ func DateFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
110108
// TimeFieldFromInstance creates and initializes a time field based on its name, the reference object instance and field number.
111109
// This method looks for "form_min", "form_max" and "form_value" tags to add additional parameters to the field.
112110
// It also uses i object's [fieldNo]-th field content (if any) to override the "form_value" option and fill the HTML field.
113-
func TimeFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
111+
func TimeFieldFromInstance(val reflect.Value,t reflect.Type, fieldNo int, name string) *Field {
114112
ret := TimeField(name)
115113
// check tags
116-
t := reflect.TypeOf(i)
117114
if v := formcommon.Tag(t, fieldNo, "form_min"); v != "" {
118115
if !validateTime(v) {
119116
panic(errors.New(fmt.Sprintf("Invalid time value (min) for field", name)))
@@ -129,7 +126,7 @@ func TimeFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
129126
if v := formcommon.Tag(t, fieldNo, "form_value"); v != "" {
130127
ret.SetValue(v)
131128
} else {
132-
if v := reflect.ValueOf(i).Field(fieldNo).Interface().(time.Time); !v.IsZero() {
129+
if v := val.Field(fieldNo).Interface().(time.Time); !v.IsZero() {
133130
ret.SetValue(v.Format(TIME_FORMAT))
134131
}
135132
}

fields/number.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,9 @@ func NumberField(name string) *Field {
3636
// NumberFieldFromInstance creates and initializes a number field based on its name, the reference object instance and field number.
3737
// This method looks for "form_min", "form_max" and "form_value" tags to add additional parameters to the field.
3838
// It also uses i object's [fieldNo]-th field content (if any) to override the "form_value" option and fill the HTML field.
39-
func NumberFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
39+
func NumberFieldFromInstance(val reflect.Value,t reflect.Type, fieldNo int, name string) *Field {
4040
ret := NumberField(name)
4141
// check tags
42-
t := reflect.TypeOf(i)
4342
if v := formcommon.Tag(t, fieldNo, "form_min"); v != "" {
4443
ret.SetParam("min", v)
4544
}
@@ -49,18 +48,17 @@ func NumberFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
4948
if v := formcommon.Tag(t, fieldNo, "form_value"); v != "" {
5049
ret.SetValue(v)
5150
} else {
52-
ret.SetValue(fmt.Sprintf("%v", reflect.ValueOf(i).Field(fieldNo).Interface()))
51+
ret.SetValue(fmt.Sprintf("%v", val.Field(fieldNo).Interface()))
5352
}
5453
return ret
5554
}
5655

5756
// RangeFieldFromInstance creates and initializes a range field based on its name, the reference object instance and field number.
5857
// This method looks for "form_min", "form_max", "form_step" and "form_value" tags to add additional parameters to the field.
5958
// It also uses i object's [fieldNo]-th field content (if any) to override the "form_value" option and fill the HTML field.
60-
func RangeFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
59+
func RangeFieldFromInstance(val reflect.Value,t reflect.Type, fieldNo int, name string) *Field {
6160
ret := RangeField(name, 0, 10, 1)
6261
// check tags
63-
t := reflect.TypeOf(i)
6462
if v := formcommon.Tag(t, fieldNo, "form_min"); v != "" {
6563
ret.SetParam("min", v)
6664
}
@@ -73,7 +71,7 @@ func RangeFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
7371
if v := formcommon.Tag(t, fieldNo, "form_value"); v != "" {
7472
ret.SetValue(v)
7573
} else {
76-
ret.SetValue(fmt.Sprintf("%v", reflect.ValueOf(i).Field(fieldNo).Interface()))
74+
ret.SetValue(fmt.Sprintf("%v", val.Field(fieldNo).Interface()))
7775
}
7876
return ret
7977
}

fields/options.go

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ func RadioField(name string, choices []InputChoice) *Field {
4848
// This method looks for "form_choices" and "form_value" tags to add additional parameters to the field. "form_choices" tag is a list
4949
// of <id>|<value> options, joined by "|" character; ex: "A|Option A|B|Option B" translates into 2 options: <A, Option A> and <B, Option B>.
5050
// It also uses i object's [fieldNo]-th field content (if any) to override the "form_value" option and fill the HTML field.
51-
func RadioFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
52-
t := reflect.TypeOf(i)
51+
func RadioFieldFromInstance(val reflect.Value,t reflect.Type, fieldNo int, name string) *Field {
5352
choices := strings.Split(formcommon.Tag(t, fieldNo, "form_choices"), "|")
5453
chArr := make([]InputChoice, 0)
5554
ret := RadioField(name, chArr)
@@ -62,7 +61,7 @@ func RadioFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
6261
ret.SetChoices(chArr)
6362
var v string = formcommon.Tag(t, fieldNo, "form_value")
6463
if v == "" {
65-
v = fmt.Sprintf("%s", reflect.ValueOf(i).Field(fieldNo).String())
64+
v = fmt.Sprintf("%s", val.Field(fieldNo).String())
6665
}
6766
if _, ok := chMap[v]; ok {
6867
ret.SetValue(v)
@@ -86,8 +85,7 @@ func SelectField(name string, choices map[string][]InputChoice) *Field {
8685
// of <group<|<id>|<value> options, joined by "|" character; ex: "G1|A|Option A|G1|B|Option B" translates into 2 options in the same group G1:
8786
// <A, Option A> and <B, Option B>. "" group is the default one.
8887
// It also uses i object's [fieldNo]-th field content (if any) to override the "form_value" option and fill the HTML field.
89-
func SelectFieldFromInstance(i interface{}, fieldNo int, name string, options map[string]struct{}) *Field {
90-
t := reflect.TypeOf(i)
88+
func SelectFieldFromInstance(val reflect.Value,t reflect.Type, fieldNo int, name string, options map[string]struct{}) *Field {
9189
choices := strings.Split(formcommon.Tag(t, fieldNo, "form_choices"), "|")
9290
chArr := make(map[string][]InputChoice)
9391
ret := SelectField(name, chArr)
@@ -108,7 +106,7 @@ func SelectFieldFromInstance(i interface{}, fieldNo int, name string, options ma
108106
ret.MultipleChoice()
109107
}
110108

111-
var v string = fmt.Sprintf("%s", reflect.ValueOf(i).Field(fieldNo).String())
109+
var v string = fmt.Sprintf("%s", val.Field(fieldNo).String())
112110
if v == "" {
113111
// TODO: multiple value parsing
114112
v = formcommon.Tag(t, fieldNo, "form_value")
@@ -131,8 +129,7 @@ func CheckboxField(name string, choices []InputChoice) *Field {
131129
return ret
132130
}
133131

134-
func CheckboxFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
135-
t := reflect.TypeOf(i)
132+
func CheckboxFieldFromInstance(val reflect.Value,t reflect.Type, fieldNo int, name string) *Field {
136133
choices := strings.Split(formcommon.Tag(t, fieldNo, "form_choices"), "|")
137134
chArr := make([]InputChoice, 0)
138135
ret := CheckboxField(name, chArr)
@@ -149,7 +146,7 @@ func CheckboxFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
149146

150147
var v string = formcommon.Tag(t, fieldNo, "form_value")
151148
if v == "" {
152-
v = fmt.Sprintf("%s", reflect.ValueOf(i).Field(fieldNo).String())
149+
v = fmt.Sprintf("%s", val.Field(fieldNo).String())
153150
}
154151
if _, ok := chMap[v]; ok {
155152
ret.SetValue(v)
@@ -169,14 +166,14 @@ func Checkbox(name string, checked bool) *Field {
169166

170167
// CheckboxFromInstance creates and initializes a checkbox field based on its name, the reference object instance, field number and field options.
171168
// It uses i object's [fieldNo]-th field content (if any) to override the "checked" option in the options map and check the field.
172-
func CheckboxFromInstance(i interface{}, fieldNo int, name string, options map[string]struct{}) *Field {
169+
func CheckboxFromInstance(val reflect.Value,t reflect.Type, fieldNo int, name string, options map[string]struct{}) *Field {
173170
ret := FieldWithType(name, formcommon.CHECKBOX)
174171

175172
if _, ok := options["checked"]; ok {
176173
ret.AddTag("checked")
177174
} else {
178-
val := reflect.ValueOf(i).Field(fieldNo).Bool()
179-
if val {
175+
v := val.Field(fieldNo).Bool()
176+
if v {
180177
ret.AddTag("checked")
181178
}
182179
}

fields/static.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func StaticField(name, content string) *Field {
2020

2121
// RadioFieldFromInstance creates and initializes a radio field based on its name, the reference object instance and field number.
2222
// It uses i object's [fieldNo]-th field content (if any) to set the field content.
23-
func StaticFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
24-
ret := StaticField(name, fmt.Sprintf("%s", reflect.ValueOf(i).Field(fieldNo).Interface()))
23+
func StaticFieldFromInstance(val reflect.Value,t reflect.Type, fieldNo int, name string) *Field {
24+
ret := StaticField(name, fmt.Sprintf("%s", val.Field(fieldNo).Interface()))
2525
return ret
2626
}

fields/text.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,25 +57,24 @@ func HiddenField(name string) *Field {
5757

5858
// TextFieldFromInstance creates and initializes a text field based on its name, the reference object instance and field number.
5959
// It uses i object's [fieldNo]-th field content to set the field content.
60-
func TextFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
60+
func TextFieldFromInstance(val reflect.Value,t reflect.Type, fieldNo int, name string) *Field {
6161
ret := TextField(name)
62-
ret.SetValue(fmt.Sprintf("%s", reflect.ValueOf(i).Field(fieldNo).String()))
62+
ret.SetValue(fmt.Sprintf("%s", val.Field(fieldNo).String()))
6363
return ret
6464
}
6565

6666
// PasswordFieldFromInstance creates and initializes a password field based on its name, the reference object instance and field number.
6767
// It uses i object's [fieldNo]-th field content to set the field content.
68-
func PasswordFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
68+
func PasswordFieldFromInstance(val reflect.Value,t reflect.Type, fieldNo int, name string) *Field {
6969
ret := PasswordField(name)
70-
ret.SetValue(fmt.Sprintf("%s", reflect.ValueOf(i).Field(fieldNo).String()))
70+
ret.SetValue(fmt.Sprintf("%s", val.Field(fieldNo).String()))
7171
return ret
7272
}
7373

7474
// TextFieldFromInstance creates and initializes a text field based on its name, the reference object instance and field number.
7575
// This method looks for "form_rows" and "form_cols" tags to add additional parameters to the field.
7676
// It also uses i object's [fieldNo]-th field content to set the field content.
77-
func TextAreaFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
78-
t := reflect.TypeOf(i)
77+
func TextAreaFieldFromInstance(val reflect.Value,t reflect.Type, fieldNo int, name string) *Field {
7978
var rows, cols int = 20, 50
8079
var err error
8180
if v := formcommon.Tag(t, fieldNo, "form_rows"); v != "" {
@@ -91,14 +90,14 @@ func TextAreaFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
9190
}
9291
}
9392
ret := TextAreaField(name, rows, cols)
94-
ret.SetText(fmt.Sprintf("%s", reflect.ValueOf(i).Field(fieldNo).String()))
93+
ret.SetText(fmt.Sprintf("%s", val.Field(fieldNo).String()))
9594
return ret
9695
}
9796

9897
// HiddenFieldFromInstance creates and initializes a hidden field based on its name, the reference object instance and field number.
9998
// It uses i object's [fieldNo]-th field content to set the field content.
100-
func HiddenFieldFromInstance(i interface{}, fieldNo int, name string) *Field {
99+
func HiddenFieldFromInstance(val reflect.Value,t reflect.Type, fieldNo int, name string) *Field {
101100
ret := HiddenField(name)
102-
ret.SetValue(fmt.Sprintf("%v", reflect.ValueOf(i).Field(fieldNo).Interface()))
101+
ret.SetValue(fmt.Sprintf("%v", val.Field(fieldNo).Interface()))
103102
return ret
104103
}

forms.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -130,43 +130,43 @@ func unWindStructure(m interface{}, baseName string) ([]interface{}, string) {
130130
//fmt.Println(fName, t.Field(i).Type.String(), t.Field(i).Type.Kind())
131131
switch widget {
132132
case "text":
133-
f = fields.TextFieldFromInstance(m, i, fName)
133+
f = fields.TextFieldFromInstance(v, t, i, fName)
134134
case "hidden":
135-
f = fields.HiddenFieldFromInstance(m, i, fName)
135+
f = fields.HiddenFieldFromInstance(v, t, i, fName)
136136
case "textarea":
137-
f = fields.TextAreaFieldFromInstance(m, i, fName)
137+
f = fields.TextAreaFieldFromInstance(v, t, i, fName)
138138
case "password":
139-
f = fields.PasswordFieldFromInstance(m, i, fName)
139+
f = fields.PasswordFieldFromInstance(v, t, i, fName)
140140
case "select":
141-
f = fields.SelectFieldFromInstance(m, i, fName, options)
141+
f = fields.SelectFieldFromInstance(v, t, i, fName, options)
142142
case "date":
143-
f = fields.DateFieldFromInstance(m, i, fName)
143+
f = fields.DateFieldFromInstance(v, t, i, fName)
144144
case "datetime":
145-
f = fields.DatetimeFieldFromInstance(m, i, fName)
145+
f = fields.DatetimeFieldFromInstance(v, t, i, fName)
146146
case "time":
147-
f = fields.TimeFieldFromInstance(m, i, fName)
147+
f = fields.TimeFieldFromInstance(v, t, i, fName)
148148
case "number":
149-
f = fields.NumberFieldFromInstance(m, i, fName)
149+
f = fields.NumberFieldFromInstance(v, t, i, fName)
150150
case "range":
151-
f = fields.RangeFieldFromInstance(m, i, fName)
151+
f = fields.RangeFieldFromInstance(v, t, i, fName)
152152
case "radio":
153-
f = fields.RadioFieldFromInstance(m, i, fName)
153+
f = fields.RadioFieldFromInstance(v, t, i, fName)
154154
case "checkbox":
155-
f = fields.CheckboxFieldFromInstance(m, i, fName)
155+
f = fields.CheckboxFieldFromInstance(v, t, i, fName)
156156
case "static":
157-
f = fields.StaticFieldFromInstance(m, i, fName)
157+
f = fields.StaticFieldFromInstance(v, t, i, fName)
158158
default:
159159
switch t.Field(i).Type.String() {
160160
case "string":
161-
f = fields.TextFieldFromInstance(m, i, fName)
161+
f = fields.TextFieldFromInstance(v, t, i, fName)
162162
case "bool":
163-
f = fields.CheckboxFromInstance(m, i, fName, options)
163+
f = fields.CheckboxFromInstance(v, t, i, fName, options)
164164
case "time.Time":
165-
f = fields.DatetimeFieldFromInstance(m, i, fName)
165+
f = fields.DatetimeFieldFromInstance(v, t, i, fName)
166166
case "int", "int64":
167-
f = fields.NumberFieldFromInstance(m, i, fName)
167+
f = fields.NumberFieldFromInstance(v, t, i, fName)
168168
case "float", "float64":
169-
f = fields.NumberFieldFromInstance(m, i, fName)
169+
f = fields.NumberFieldFromInstance(v, t, i, fName)
170170
case "struct":
171171
fl, fs := unWindStructure(v.Field(i).Interface(), fName)
172172
if fs != "" {
@@ -192,7 +192,7 @@ func unWindStructure(m interface{}, baseName string) ([]interface{}, string) {
192192
fieldList = append(fieldList, fl...)
193193
f = nil
194194
} else {
195-
f = fields.TextFieldFromInstance(m, i, fName)
195+
f = fields.TextFieldFromInstance(v, t, i, fName)
196196
}
197197
}
198198
}

0 commit comments

Comments
 (0)