word edit: multiinput styling for configured columns
[sheet.git] / writer.plp
index 62d26d762d0f27f78f12fbd7981a56b797f75a2d..3f9ed98bc647c1e7b2a909a6f920c3fdf8568c93 100644 (file)
@@ -28,9 +28,10 @@ form > ul > li > label {
 }
 form > ul > li > label + * {
        /* td */
-       width: 32em;
+       width: 40em;
 }
 
+.multiinput,
 input,select {
        box-sizing: border-box;
        flex-grow: 1;
@@ -48,6 +49,7 @@ select {
 #thumbpreview {
        width: 300px;
        align-self: start;
+       flex-shrink: 0;
 }
 
 ul.popup {
@@ -78,6 +80,13 @@ h1 {
 }
 .inline .inline {
        display: flex;
+       margin: 0;
+}
+.inline.multiinput {
+       flex-wrap: wrap;
+}
+.multiinput > input {
+       width: 10em;
 }
 
 #nav > ul,
@@ -145,12 +154,18 @@ if (exists $get{copy}) {
        $row = {%{$row}{ qw(prio lang cat) }};
 }
 elsif ($ENV{REQUEST_METHOD} eq 'POST') {{
+       sub parseinput {
+               return if not length $_[0];
+               require Encode;
+               return Encode::decode_utf8($_[0]);
+       }
+
        my $replace = $row;
-       $row = {%post{keys %wordcol}};
-       $row->{$_} = [grep {length} @{ $post{"\@$_"} }] for grep {
-               ref $wordcol{$_} eq 'HASH' and $wordcol{$_}->{-multiple}
-       } keys %wordcol;
-       $_ = length ? $_ : undef for values %{$row};
+       $row = {map { $_ =>
+               ref $wordcol{$_} eq 'HASH' && $wordcol{$_}->{-multiple} ?
+                       [ map { parseinput($_) } $post{'@'.$_}->@* ] :
+               scalar parseinput($post{$_})
+       } keys %wordcol};
 
        if (!$row->{form}) {
                if ($row->{ref} ne 'delete') {
@@ -182,8 +197,8 @@ elsif ($ENV{REQUEST_METHOD} eq 'POST') {{
                        $db->insert(word => {
                                ref   => $row->{id},
                                lang  => $lang,
-                               form  => $val,
-                       });
+                               form  => $_,
+                       }) for parseinput($val);
                        delete $fields{$field};
                }
                return 1;
@@ -291,16 +306,19 @@ package Shiar_Sheet::FormRow {
                        );
                }
                else {
+                       my $multiple = ref $val eq 'ARRAY' || $attr->{-multiple};
                        return (
                                (map {
                                        sprintf('<label for="%s">%s</label>', $col, $_)
                                } $attr->{-label} // ()),
+                               $multiple ? '<span class="inline multiinput">' : (),
                                (map {
                                        sprintf('<input name="%s" value="%s" />', $col, EscapeHTML($_))
                                } ref $val eq 'ARRAY' ? @{$val} : ()),
                                sprintf('<input id="%s" name="%1$s" value="%s"%s />',
-                                       $col, ref $val eq 'ARRAY' ? '' : EscapeHTML($val), $html
+                                       $col, $multiple ? '' : EscapeHTML($val), $html
                                ),
+                               $multiple ? '</span>' : (),
                                (map {
                                        sprintf '<img id="%spreview" src="/%s" alt="%s"%s />',
                                                $col, $_, $row->{form}, $col eq 'source' ? ' hidden' : '';