1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
|
title: HTML Input Elements for Ponzu Editor Forms
Ponzu provides a number of helpful HTML Inputs to create forms which CMS admins
use to manage content. The input functions are typically used inside a Content
type's `MarshalEditor()` func from within an `editor.Form()` - for example:
```go
// MarshalEditor writes a buffer of html to edit a Post within the CMS
// and implements editor.Editable
func (p *Post) MarshalEditor() ([]byte, error) {
view, err := editor.Form(p,
editor.Field{ // <- editor.Fields contain input-like funcs
View: editor.Input("Title", p, map[string]string{ // <- makes a text input
"label": "Title",
"type": "text",
"placeholder": "Enter the Title here",
}),
},
editor.Field{
View: editor.Richtext("Body", p, map[string]string{ // <- makes a WYSIWIG editor
"label": "Body",
"placeholder": "Enter the Body here",
}),
},
editor.Field{
View: editor.Input("Author", p, map[string]string{
"label": "Author",
"type": "text",
"placeholder": "Enter the Author here",
}),
},
)
if err != nil {
return nil, fmt.Errorf("Failed to render Post editor view: %s", err.Error())
}
return view, nil
}
```
---
## Field Input Functions
There are many of these input-like HTML view funcs exported from Ponzu's
`management/editor` package. Below is a list of the built-in options:
### `editor.Input`
The `editor.Input` function produces a standard text input.
##### Screenshot

##### Function Signature
```go
Input(fieldName string, p interface{}, attrs, options map[string]string) []byte
```
##### Example
```go
...
editor.Field{
View: editor.Input("Title", s, map[string]string{
"label": "Title",
"type": "text",
"placeholder": "Enter the Title here",
}),
},
...
```
---
### `editor.InputRepeater`
The `editor.InputRepeater` function applies a controller UI to the `editor.Input`
view so any arbitrary number of inputs can be added for your field.
!!! warning "Using Repeaters"
When using the `editor.InputRepeater` make sure it's corresponding field is a **slice `[]T`**
type. You will experience errors if it is not.
##### Screenshot

##### Function Signature
```go
InputRepeater(fieldName string, p interface{}, attrs, options map[string]string) []byte
```
##### Example
```go
...
editor.Field{
View: editor.InputRepeater("Title", s, map[string]string{
"label": "Titles",
"type": "text",
"placeholder": "Enter the Title here",
}),
},
...
```
---
### `editor.Checkbox`
The `editor.Checkbox` function returns any number of checkboxes in a collection,
defined by the value:name map of options.
##### Screenshot

##### Function Signature
```go
Checkbox(fieldName string, p interface{}, attrs, options map[string]string) []byte
```
##### Example
```go
...
editor.Field{
View: editor.Checkbox("Options", s, map[string]string{
"label": "Options",
}, map[string]string{
// "value": "Display Name",
"1": "First",
"2": "Second",
"3": "Third",
}),
},
...
```
---
### `editor.Richtext`
The `editor.Richetext` function displays an HTML5 rich text / WYSYWIG editor which
supports text formatting and styling, images, quotes, arbitrary HTML, and more.
The rich text editor is a modified version of [Summernote](http://summernote.org/)
using a theme called [MaterialNote](https://github.com/Cerealkillerway/materialNote)
##### Screenshot

##### Function Signature
```go
Richtext(fieldName string, p interface{}, attrs map[string]string) []byte
```
##### Example
```go
...
editor.Field{
View: editor.Richtext("Opinion", s, map[string]string{
"label": "Rich Text Editor",
"placeholder": "Enter the Opinion here",
}),
},
...
```
---
### `editor.Tags`
The `editor.Tags` function returns a container input element for lists of arbitrary
bits of information.
##### Screenshot

##### Function Signature
```go
Tags(fieldName string, p interface{}, attrs map[string]string) []byte
```
##### Example
```go
...
editor.Field{
View: editor.Tags("Category", s, map[string]string{
"label": "Tags",
"placeholder": "+Category",
}),
},
...
```
---
### `editor.File`
The `editor.File` function returns an HTML file upload element, which saves files
into the `/uploads` directory, and can be viewed from the "Uploads" section in the
Admin dashboard. See also the [File Metadata API](/HTTP-APIs/File-Metadata.md).
!!! warning "Field Type"
When using the `editor.File` function, its corresponding field type must be
a **`string`**, as files will be stored as URL paths in the database.
##### Screenshot

##### Function Signature
```go
File(fieldName string, p interface{}, attrs map[string]string) []byte
```
##### Example
```go
...
editor.Field{
View: editor.File("Photo", s, map[string]string{
"label": "File Upload",
"placeholder": "Upload the Photo here",
}),
},
...
```
---
### `editor.FileRepeater`
The `editor.FileRepeater` function applies a controller UI to the `editor.File`
view so any arbitrary number of uploads can be added for your field.
!!! warning "Using Repeaters"
When using the `editor.FileRepeater` make sure it's corresponding field is a **slice `[]string`**
type. You will experience errors if it is not.
##### Screenshot

##### Function Signature
```go
FileRepeater(fieldName string, p interface{}, attrs map[string]string) []byte
```
##### Example
```go
...
editor.Field{
View: editor.FileRepeater("Photo", s, map[string]string{
"label": "File Upload Repeater",
"placeholder": "Upload the Photo here",
}),
},
...
```
---
### `editor.Select`
The `editor.Select` function returns a single HTML select input with options
as defined in the `options map[string]string` parameter of the function call.
##### Screenshot

##### Function Signature
```go
func Select(fieldName string, p interface{}, attrs, options map[string]string) []byte
```
##### Example
```go
...
editor.Field{
View: editor.Select("Rating", s, map[string]string{
"label": "Select Dropdown",
}, map[string]string{
// "value": "Display Name",
"G": "G",
"PG": "PG",
"PG-13": "PG-13",
"R": "R",
}),
},
...
```
---
### `editor.SelectRepeater`
The `editor.SelectRepeater` function applies a controller UI to the `editor.Select`
view so any arbitrary number of dropdowns can be added for your field.
##### Screenshot

##### Function Signature
```go
func SelectRepeater(fieldName string, p interface{}, attrs, options map[string]string) []byte
```
##### Example
```go
...
editor.Field{
View: editor.SelectRepeater("Rating", s, map[string]string{
"label": "Select Dropdown Repeater",
}, map[string]string{
// "value": "Display Name",
"G": "G",
"PG": "PG",
"PG-13": "PG-13",
"R": "R",
}),
},
...
```
---
### `editor.Textarea`
The `editor.Textarea` function returns an HTML textarea input to add unstyled text
blocks. Newlines in the textarea are preserved.
##### Screenshot

##### Function Signature
```go
Textarea(fieldName string, p interface{}, attrs map[string]string) []byte
```
##### Example
```go
...
editor.Field{
View: editor.Textarea("Readme", s, map[string]string{
"label": "Textarea",
"placeholder": "Enter the Readme here",
}),
},
...
```
---
## Data References
It is common to want to keep a reference from one Content type to another. To do
this in Ponzu, use the [`bosssauce/reference`](https://github.com/bosssauce/reference)
package. It comes pre-installed with Ponzu as an ["Addon"](/Ponzu-Addons/Using-Addons).
### `reference.Select`
##### Screenshot

##### Function Signature
```go
func Select(fieldName string, p interface{}, attrs map[string]string, contentType, tmplString string) []byte
```
##### Example
```go
...
editor.Field{
View: reference.Select("DirectedBy", s, map[string]string{
"label": "Select Dropdown",
}, "Director", `{{.last-name}}, {{.first_name}}`),
},
...
```
---
### `reference.SelectRepeater`
##### Screenshot

##### Function Signature
```go
func SelectRepeater(fieldName string, p interface{}, attrs map[string]string, contentType, tmplString string) []byte
```
##### Example
```go
...
editor.Field{
View: reference.SelectRepeater("PlacesFilmed", s, map[string]string{
"label": "Select Dropdown Repeater",
}, "Location", `{{.name}}, {{.region}}`),
},
...
```
---
|