Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add textarea #3

Merged
merged 1 commit into from
Jan 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ There is currently only one template file for all the currently supported templa
<option value="{{$option.Id}}">{{$option.Name}}</option>
{{ end }}
</select>
{{ else if eq .Field.Type "textarea" }}
<textarea {{with .Field.Id}}id="{{.}}"{{end}} name="{{.Field.Name}}" {{with .Field.Id}}rows="{{.}}"{{end}} {{with .Field.Cols}}cols="{{.}}"{{end}} placeholder="{{.Field.Placeholder}}" {{ if eq .Field.Required true }}required{{end}} class="block w-full shadow-sm sm:text-sm border-gray-300 rounded-md"></textarea>
{{ else if eq .Field.Type "dropdownmapped" }}
<select {{with .Field.Id}}id="{{.}}"{{end}} name="{{.Field.Name}}" class="text-gray-700 dark:text-gray-200 dark:bg-gray-700 bg-white block w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-indigo-500 sm:text-sm">
{{ $value := .Field.Value }}
Expand Down Expand Up @@ -152,6 +154,9 @@ supported tags
- placeholder
- name
- required
- cols
- rows
- step


## TODO
Expand Down
5 changes: 3 additions & 2 deletions fields.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const (
FieldTypeDropdown FieldType = "dropdown"
FieldTypeDropdownMapped FieldType = "dropdownmapped"
FieldTypeSubmit FieldType = "submit"
FieldTypeTextArea FieldType = "textArea"
FieldTypeTextArea FieldType = "textarea"
)

type InputFieldType string
Expand All @@ -23,7 +23,6 @@ const (
InputFieldTypeEmail InputFieldType = "email"
InputFieldTypeTel InputFieldType = "tel"
InputFieldTypeNumber InputFieldType = "number"
InputFieldTypeDate InputFieldType = "date"
InputFieldTypeNone InputFieldType = ""
)

Expand Down Expand Up @@ -56,6 +55,8 @@ type FormField struct {
InputType InputFieldType `json:"inputType,omitempty"`
Label string `json:"label,omitempty"`
Step string `json:"step,omitempty"`
Rows string `json:"rows,omitempty"`
Cols string `json:"cols,omitempty"`
Values []FieldValue `json:"values,omitempty"`
Required bool `json:"required"`
Fields []FormField `json:"fields,omitempty"`
Expand Down
64 changes: 46 additions & 18 deletions transformer.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,19 @@ import (
"strings"
)

const (
tagName = "name"
tagLabel = "label"
tagPlaceholder = "placeholder"
tagRequired = "required"
tagInputType = "inputType"
tagLegend = "legend"
tagType = "type"
tagStep = "step"
tagRows = "rows"
tagCols = "cols"
)

type (
Enumerator interface{ Enum() []any }
Mapper interface {
Expand Down Expand Up @@ -56,6 +69,8 @@ func NewTransformer(model interface{}) (*Transformer, error) {

tr.Fields = fields

fmt.Printf("tr: %+v\n", tr.Fields)

return tr, nil
}

Expand All @@ -72,16 +87,16 @@ func (t *Transformer) scanModel(rValue reflect.Value, rType reflect.Type, names
for i := 0; i < rType.NumField(); i++ {
tags := rType.Field(i).Tag

name := tags.Get("name")
name := tags.Get(tagName)
if name == "" {
name = rType.Field(i).Name
}

nname := append(names, name)

field := FormField{
Label: tags.Get("label"),
Placeholder: tags.Get("placeholder"),
Label: tags.Get(tagLabel),
Placeholder: tags.Get(tagPlaceholder),
Name: strings.Join(nname, "."),
Value: rValue.Field(i).Interface(),
}
Expand All @@ -90,7 +105,7 @@ func (t *Transformer) scanModel(rValue reflect.Value, rType reflect.Type, names
field.Label = name
}

if tags.Get("required") == "true" {
if tags.Get(tagRequired) == "true" {
field.Required = true
}

Expand Down Expand Up @@ -150,7 +165,7 @@ func (t *Transformer) scanModel(rValue reflect.Value, rType reflect.Type, names
continue
}

inputType := InputFieldType(tags.Get("inputType"))
inputType := InputFieldType(tags.Get(tagInputType))

fType := rType.Field(i).Type
fValue := rValue.Field(i)
Expand All @@ -167,14 +182,23 @@ func (t *Transformer) scanModel(rValue reflect.Value, rType reflect.Type, names

switch fType.Kind() {
case reflect.String:

if inputType == "" {
inputType = InputFieldTypeText
}

field.Type = FieldTypeInput
field.InputType = inputType
typ := FieldType(tags.Get(tagType))
if typ == "" {
typ = FieldTypeInput
}

field.Type = typ
field.InputType = inputType
if tags.Get(tagRows) != "" {
field.Rows = tags.Get(tagRows)
}
if tags.Get(tagCols) != "" {
field.Cols = tags.Get(tagCols)
}
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:

Expand All @@ -184,36 +208,40 @@ func (t *Transformer) scanModel(rValue reflect.Value, rType reflect.Type, names

field.Type = FieldTypeInput
field.InputType = inputType
field.Step = "1"

if tags.Get(tagStep) != "" {
field.Step = tags.Get(tagStep)
} else {
field.Step = "1"
}
case reflect.Float32, reflect.Float64:
if inputType == "" {
inputType = InputFieldTypeNumber
}

field.Type = FieldTypeInput
field.InputType = inputType
field.Step = "any"

case reflect.Bool:
fieldType := FieldTypeCheckbox
if len(names) > 0 && names[len(names)-1] == name {
// radio-options use the same 'name' as their parent for grouping
fieldType = FieldTypeRadios
if tags.Get(tagStep) != "" {
field.Step = tags.Get(tagStep)
} else {
field.Step = "any"
}

field.Type = fieldType
case reflect.Bool:
field.Type = FieldTypeCheckbox
case reflect.Slice, reflect.Array:
case reflect.Map:
case reflect.Struct:
field.Type = FieldTypeGroup
field.Legend = tags.Get("legend")
field.Legend = tags.Get(tagLegend)

var err error
field.Fields, err = t.scanModel(fValue, fType, nname...)
if err != nil {
return nil, err
}
default:
return nil, fmt.Errorf("unsupported type: %s", fType.Kind())
}

fields = append(fields, field)
Expand Down