1 <:# see preload.pod for documentation -:>
2 <:.set dist_image_uri = cfg.entryIfVar("uri", "dist_images", "/images") -:>
3 <:# utility definitions :>
4 <:-.define make_select; groups: 0, grouplabel: "label", groupid: "id",
5 itemgroupid: "groupid" -:>
6 <:-.if !default.defined -:>
7 <:-.set default = "" -:>
9 <select name="<:= name | html :>">
12 <:.if i.$itemgroupid eq "" -:>
13 <option value="<:= i.$id | html :>"
14 <:- .if i.$id eq default :> selected="selected"<:.end if -:>
16 <:-= i.$desc | html -:>
19 <:-.for g in groups -:>
20 <optgroup label="<:= g.$grouplabel | html -:>">
22 <:.if i.$itemgroupid == g.$groupid -:>
23 <option value="<:= i.$id | html :>"
24 <:- .if i.$id eq default :> selected="selected"<:.end if -:>
26 <:-= i.$desc | html -:>
33 <option value="<:= i.$id | html :>"
34 <:- .if i.$id eq default :> selected="selected"<:.end if -:>
36 <:-= i.$desc | html -:>
42 make_multicheck expects:
43 values - list of hashes
44 default - a list of ids of checks to be checked
45 id - the name of the id field
46 desc - the name of the description field.
47 name - the name of the input elements
48 readonly - true to make it readonly
50 <:-.define make_multicheck; readonly: 0-:>
52 <input type="hidden" name="_save_<:= name -:>" value="1">
54 <:-.if !default.defined -:>
55 <:-.set default = [] -:>
57 <:.set checked = {} -:>
58 <:.for v in default -:>
59 <:% checked.set(v, 1) -:>
62 <:-.for i in values -:>
64 <:.set element_id = name _ "-" _ i.$id -:>
65 <input type="checkbox" name="<:= name :>" <:= checked[i.$id] ? 'checked ' : '' -:>
66 id="<:= element_id -:>" value="<:= i.$id :>"
67 <:-# readonly attribute isn't valid for checkboxes -:>
68 <:-= readonly ? " disabled" : "" -:>
70 <label for="<:= element_id :>"><:= i.$desc -:></label>
77 base - base url for links
78 pages - the result of the bse.pages call
80 <:-.define page_list-:>
81 <:.set sep = base =~ /\?/ ? "&" : "?" -:>
82 <:.set base = base _ sep :>
83 <div class="pagelist">
84 Page <:= pages.page :> of <:= pages.pagecount :>
85 <:.if pages.previous_page -:>
86 <a href="<:= base |html:><:= pages.pname | uri :>=1&<:= pages.ppname | uri :>=<:= pages.pp | uri :>"><<</a>
87 <a href="<:= base |html:><:= pages.pname | uri :>=<:= pages.previous_page |uri:>&<:= pages.ppname | uri :>=<:= pages.pp | uri :>"><</a>
92 <:.for p in pages.pages :>
94 <a href="<:= base |html :><:= pages.pname | uri:>=<:= p.page | uri :>&<:=pages.ppname | uri :>=<:= pages.pp | uri :>"><:= p.page |html :></a>
96 <span><:= p.page |html:></span>
99 <:.if pages.next_page -:>
100 <a href="<:= base |html:><:= pages.pname | uri :>=<:= pages.next_page |uri:>&<:= pages.ppname | uri :>=<:= pages.pp | uri :>">></a>
101 <a href="<:= base |html:><:= pages.pname | uri :>=<:= pages.pagecount |uri:>&<:= pages.ppname | uri :>=<:= pages.pp | uri :>">>></a>
109 <:.define old; default: "", index: 0 -:>
110 <:# parameters: field, default, index -:>
111 <: .set vals = [ cgi.param(field) ] -:>
112 <: .if index < vals.size -:>
115 <:= default | html -:>
119 <:.define error_img_n -:>
121 field - name of field
122 index - index of field
123 errors - hash of error messages (should be set by code)
125 <:.if errors.$field -:>
126 <:.set msg = errors.$field -:>
127 <:.set msg = msg.is_list ? msg[index] : msg -:>
128 <:.if msg.defined -:>
129 <:.set image = cfg.entry("error_img", "image", dist_image_uri _ "/admin/error.gif") -:>
130 <:.set width = cfg.entry("error_img", "width", 16) -:>
131 <:.set height = cfg.entry("error_img", "height", 16) -:>
132 <img src="<:= image -:>" alt="<:= msg :>" title="<:= msg :>" width="<:= width :>" height="<:= height :>" class="error_img">
137 <:.define error_img -:>
138 <:.call "error_img_n", index:0 -:>
141 <:.define input; options: {} -:>
144 field - entry from fields
145 object - source for defaults in edit mode
147 <: .set default = options.default -:>
148 <: .if !default.defined -:>
150 <: .set default = object.$name -:>
151 <: .elsif field.default -:>
152 <: .set default = field.default -:>
154 <: .set default = "" -:>
157 <: .if field.type and field.type eq "date" and default ne "" -:>
158 <: .set default = default.replace(/(\d+)\D+(\d+)\D+(\d+)/, "$3/$2/$1") -:>
159 <: .elsif field.type and field.type eq "time" and default ne "" -:>
160 <: .set default = bse.date(default =~ /:00$/ ? "%I:%M%p" : "%I:%M:%S%p", default).replace(/^0/, "").lower() -:>
162 <: .if cgi.param(name).defined -:>
163 <: .set default = cgi.param(name) -:>
165 <: .if field.htmltype eq "textarea" -:>
166 <textarea id="<:= name | html :>" name="<:= name | html :>" rows="<:= field.height ? field.height : cfg.entry("forms", "textarea_rows", 10) :>" cols=<:= field.width ? field.width : cfg.entry("forms", "textarea_cols", 60) | html :>>
167 <:-= default | html -:>
169 <: .elsif field.htmltype eq "checkbox" -:>
170 <:.set is_checked = cgi.param("_save_" _ name) ? cgi.param(name).defined : default -:>
171 <input type="hidden" name="_save_<:= name -:>" value="1">
172 <input id="<:= name | html :>" type="checkbox" name="<:= name | html :>"<:= is_checked ? ' checked="checked"' : '' :> value="<:= field.value ? field.value : 1 | html :>" />
173 <: .elsif field.htmltype eq "multicheck" -:>
174 <:# we expect default to be a list of selected checks -:>
175 <:.set values = field.select["values"] -:>
176 <:.set values = values.is_code ? values() : values -:>
177 <:.set default = cgi.param("_save_" _ name) ? [ cgi.param(name) ] : default -:>
178 <:.call "make_multicheck",
180 desc:field.select.label -:>
181 <: .elsif field.htmltype eq "select" -:>
182 <:.set values = field.select["values"] -:>
183 <:.set values = values.is_code ? values() : values -:>
184 <:.call "make_select",
189 desc: field.select.label,
190 groupid : (field.select.groupid or "id"),
191 itemgroupid: (field.select.itemgroupid or "groupid"),
192 groups: field.select.groups ? (field.select.groups.is_code ? (field.select.groups)() : field.select.groups ) : 0,
193 grouplabel: (field.select.grouplabel or "label")
195 <: .elsif field.htmltype eq 'file' -:>
196 <: .if default.length -:>
197 <span class="filename"><:= default :></span>
199 <input id="<:= name :>" type="file" name="<:= name :>" />
201 <input id="<:= name | html :>" type="text" name="<:= name | html :>" value="<:= default | html :>"
202 <:-= field.maxlength ? ' maxlength="' _ field.maxlength _ '"' : '' |raw:>
203 <:-= field.width ? ' size="' _ field.width _ '"' : '' | raw :> />
207 <:.define field; options: {} -:>
210 fields - hash of fields (may be set by page instead)
211 object - object containing defaults (can be set globally instead)
212 default - a default value not dependent on object (overrides object)
214 <:.if fields.is_hash -:>
215 <:.set f = fields[name] -:>
217 <:.call "inlinefield", field:f, name:name, options: options -:>
219 <p>Unknown field id '<b><:= name :></b>', available fields are '<:= fields.keys.join("', '") :>'</p>
222 <p>fields isn't a hash, something is wrong.</p>
226 <:.define inlinefield; options: {} -:>
228 name - the field name
229 field - a field, as an entry in fields
230 options - various options, including:
231 note - display this text as a note below the field
232 delete - add a delete checkbox
233 default - a custom default value, overrides object
235 <:.if field.is_hash -:>
237 <label for="<:= name :>"><:= field.nolabel ? "" : field.description | html :>:</label>
239 <:-.if field.readonly -:>
240 <:-.call "display", name:name, options: options -:>
242 <:-.call "input", name:name, options: options -:><:.call "error_img", field:name :>
244 <:-.if field.units -:>
245 <:-= field.units | html -:>
247 <:-.if options.note -:>
248 <br /><:= options.note | raw :>
250 <:-.if options["delete"] -:>
251 <br /><input type="checkbox" name="delete_<:= name :>" value="1" id="delete_<:= name :>"><label for="delete_<:= name :>">Delete</label>
258 <:.define fieldset -:>
259 <:# like field, but wrap in a per-field field set.
262 fields - hash of fields (may be set by page instead)
264 <:.set f = fields[name] -:>
268 <legend><:= f.description :></legend>
270 <:.call "input", name: name, field: f -:>
272 <:.elsif fields.is_hash -:>
273 <p>Unknown field id '<b><:= name :></b>', available fields are '<:= fields.keys.join("', '") :>'</p>
275 <p>fields isn't a hash, something is wrong.</p>
279 <:.define display -:>
282 field - entry from fields
283 object - source for defaults in edit mode
286 <: .set default = object.$name -:>
288 <: .if field.type and field.type eq "date" and default ne "" -:>
289 <: .set default = default.replace(/(\d+)\D+(\d+)\D+(\d+)/, "$3/$2/$1") -:>
290 <: .elsif field.type and field.type eq "time" and default ne "" -:>
291 <: .set default = bse.date(default =~ /:00$/ ? "%I:%M%p" : "%I:%M:%S%p", default).replace(/^0/, "").lower() -:>
293 <: .if field.htmltype eq "textarea" -:>
294 <textarea id="<:= name | html :>" name="<:= name | html :>" rows="<:= field.height ? field.height : cfg.entry("forms", "textarea_rows", 10) :>" cols=<:= field.width ? field.width : cfg.entry("textarea_cols", 60) | html :> readonly>
295 <:-= default | html -:>
297 <: .elsif field.htmltype eq "checkbox" -:>
298 <input id="<:= name | html :>" type="checkbox" name="<:= name | html :>"<:= is_checked ? ' checked="checked"' : '' :> value="<:= field.value ? field.value : 1 | html :>" readonly>
299 <: .elsif field.htmltype eq "multicheck" -:>
300 <:# we expect default to be a list of selected checks -:>
301 <:.set values = field.select["values"] -:>
302 <:.set values = values.is_code ? values() : values -:>
303 <:.call "make_multicheck",
305 desc: field.select.label,
307 <: .elsif field.htmltype eq "select" -:>
308 <:.set values = field.select["values"] -:>
309 <:.set values = values.is_code ? values() : values -:>
310 <:# find the selected value and display it's label -:>
311 <:.set sid = field.select.id -:>
312 <:.set sdesc = field.select.label -:>
313 <:.for value in values -:>
314 <:.if value.$id eq default -:>
319 <input id="<:= name :>" type="text" name="<:= name :>" value="<:= default :>"
320 <:-= field.width ? ' size="' _ field.width _ '"' : '' | raw :> readonly>
324 <:.define inlinefieldro -:>
326 name - the field name
327 field - a field, as an entry in fields
329 <:.if field.is_hash -:>
331 <label for="<:= name :>"><:= field.nolabel ? "" : field.description :>:</label>
332 <span><:.call "display", name:name -:>
333 <:-.if field.units -:>
341 <:.define fieldro -:>
342 <:# like field, but for display, not editing -:>
343 <:.if fields.is_hash -:>
344 <:.set f = fields[name] -:>
346 <:.call "inlinefieldro", field:f, name:name -:>
348 <p>Unknown field id '<b><:= name :></b>', available fields are '<:= fields.keys.join("', '") :>'</p>
351 <p>fields isn't a hash, something is wrong.</p>
355 <:.define fieldsetro -:>
356 <:# like fieldro, but wrap in a per-field field set.
359 fields - hash of fields (may be set by page instead)
361 <:.set f = fields[name] -:>
365 <legend><:= f.description :></legend>
367 <:.call "display", "name":name, "field":f -:>
369 <:.elsif fields.is_hash -:>
370 <p>Unknown field id '<b><:= name :></b>', available fields are '<:= fields.keys.join("', '") :>'</p>
372 <p>fields isn't a hash, something is wrong.</p>
376 <:.define messages -:>
377 <: .if request.messages.size -:>
378 <div class="messages">
379 <: .for m in request.messages -:>
380 <div class="<:= m.class :>"><:= m.html |raw :></div>
387 <:# expects loop, request, parent
388 which in most cases means you can just supply parent
390 <:.if request.user_can("bse_edit_reorder_children", parent) -:>
391 <:.set down_url = loop.next ? cfg.admin_url("move", { "stepparent":parent.id, "d":"swap", "id":loop.current.id, "other":loop.next.id, "r":top.admin }) : 0 -:>
392 <:.set up_url = loop.prev ? cfg.admin_url("move", { "stepparent":parent.id, "d":"swap", "id":loop.current.id, "other":loop.prev.id, "r":top.admin }) : 0 -:>
393 <:.set class = cfg.entry("arrows", "class", "bse_arrows") -:>
394 <span class="<:= m.class :>">
395 <:-.call "make_arrows", "down_url":down_url, "up_url":up_url -:>
400 <:.define make_arrows -:>
401 <:# expects down_url, up_url
403 <:.set width = cfg.entry("arrows", "image_width", 17) -:>
404 <:.set height = cfg.entry("arrows", "image_height", 13) -:>
405 <:.set extras = 'width="' _ width _ '" height="' _ height _ '"' -:>
406 <:.set blank_img = '<img src="' _ (dist_image_uri _ "/trans_pixel.gif").escape("html") _ '" alt="" ' _ extras _ ' />' -:>
407 <:.set down_img = '<img src="' _ cfg.entry("arrows", "downimg", dist_image_uri _ "/admin/move_down.gif").escape("html") _ '" alt="Down" ' _ extras _ ' />' -:>
408 <:.set up_img = '<img src="' _ cfg.entry("arrows", "upimg", dist_image_uri _ "/admin/move_up.gif").escape("html") _ '" alt="Up" ' _ extras _ ' />' -:>
410 <a href="<:= down_url :>"><:= down_img |raw:></a>
415 <a href="<:= up_url :>"><:= up_img |raw:></a>
422 <:.define word_wrap; text: @undef, prefix:"", noncontin: "", contin:"", escape1: "", escape2: "", width: 70 -:>
423 <:# Word wrap "text" at width columns, following settings:
424 width - word wrap width (default 70)
425 prefix - prefix to add to all lines
426 noncontin - prefix to additionally add to first line of each paragraph
427 contin - prefix to additionally add to lines that have been wrapped
428 escape1 - suffix to add to lines wrapped on a non-word
429 escape2 - suffix to add to lines wrapped on a word boundary
431 <:.set re = "^.{1," _ width _ "}\\s+" -:>
432 <:.set paras = text.split(/\n/) -:>
433 <:.for para in paras -:>
434 <: .set work = para -:>
435 <: .set first = 1 -:>
436 <: .while work.length -:>
438 <: .set work = work.replace(/^\s+/, "") -:>
440 <: .if work.length < 70 -:>
441 <: .set line = work -:>
442 <: .set work = "" -:>
444 <: .set m = work.match(re) -:>
446 <: .set line = work.substring(0, m.length).replace(/\s+$/, "") _ escape2 -:>
447 <: .set work = work.substring(m.length) -:>
449 <: .set line = work.substring(0, width) _ escape1 -:>
450 <: .set work = work.substring(width) -:>
453 <:= prefix _ (first ? noncontin : contin) _ line.replace(/\s+$/, "") |raw:>
454 <: .set first = 0 -:>
459 <:- include includes/custom/preload.tmpl optional -:>