+my $title = $row->{id} ? "entry <small>#$row->{id}</small>" : 'new entry';
+
+package Shiar_Sheet::FormRow {
+ sub input {
+ my ($row, $col, $type, $label) = @_;
+ my $val = $row->{$col} // '';
+ $val = '{'.join(',', map {s/,/\\,/gr} @{$val}).'}' if ref $val eq 'ARRAY';
+ if (ref $type eq 'ARRAY') {
+ return (
+ sprintf('<select id="%s" name="%1$s">', $col),
+ (map { sprintf('<option value="%s"%s>%s</option>',
+ $_, $val eq $_ && ' selected', $type->[$_]
+ ) } 0 .. $#{$type}),
+ '</select>',
+ );
+ }
+ elsif ($type eq 'checkbox') {
+ return sprintf(
+ join('',
+ '<label>',
+ '<input id="%1$s" name="%1$s" value="0" type="hidden" />',
+ '<input id="%s" name="%1$s" value="1" type="%s"%s>',
+ ' %s</label>',
+ ), $col, $type, !!$val && ' checked', $label
+ );
+ }
+ else {
+ my $html = '';
+ $html .= qq( $_="$type->{$_}") for sort keys %{$type // {}};
+ return (
+ $label ? sprintf('<label for="%s">%s</label>', $col, $label) : (),
+ sprintf('<input id="%s" name="%1$s" value="%s"%s />',
+ $col, PLP::Functions::EscapeHTML($val), $html
+ ),
+ );
+ }
+ }
+}
+bless $row, 'Shiar_Sheet::FormRow';