word/edit: preserve unknown json values
[sheet.git] / word / edit.plp
index 426fb5c281e577f9fbe9d0a458f345df9f341d7c..4a6daaad4a19ab503cd0680ec13479e11baa7934 100644 (file)
@@ -111,6 +111,7 @@ my %wordcol = (
        convert => {-label => 'Convert options', -json => 'image', -multiple => 1, -src => sub {
                return "data/word/32/$_[0]->{id}.jpg";
        }},
+       crop32  => {-json => 'image', type => 'hidden'}, # set by javascript interface
        story   => {-label => 'Story', type => 'textarea', hidden => 'hidden'},
 );
 
@@ -151,7 +152,6 @@ elsif (defined $post{form}) {{
                my @val = map { parseinput($_) } $post{'@'.$col}->@*;
                my $val = $colinfo->{-multiple} && @val ? \@val : $val[-1];
                if (my $jsoncol = $colinfo->{-json}) {
-                       defined $val and
                        $row->{$jsoncol}->{$col} = $val;  # hash will be encoded
                }
                else {
@@ -159,7 +159,13 @@ elsif (defined $post{form}) {{
                }
        }
        my $imagecol = $row->{image};  # backup image subcolumns
-       ref $_ eq 'HASH' and $_ = encode_json($_) for values %{$row};
+       while (my ($col, $val) = each %{$row}) {
+               # convert json subcolumns to database string
+               ref $val eq 'HASH' or next;
+               $val = { %{decode_json($_)}, %{$val} } for $replace->{$col} // ();  # preserve unknown
+               defined $val->{$_} or delete $val->{$_} for keys %{$val};  # delete emptied
+               $row->{$col} = encode_json($val);
+       }
 
        if (!$row->{form} and $row->{lang}) {
                if ($row->{ref} ne 'delete') {
@@ -218,7 +224,7 @@ elsif (defined $post{form}) {{
        $reimage++ if $fields{rethumb};  # force refresh
        if ($reimage) {
                eval {
-                       $image->generate($wordcol{convert}->{-src}->($row), $imagecol->{convert});
+                       $image->generate($wordcol{convert}->{-src}->($row), $imagecol);
                } or do {
                        my ($warn, @details) = ref $@ ? @{$@} : $@;
                        Alert([ "Thumbnail image not generated", $warn ], @details);
@@ -259,9 +265,12 @@ for my $col (@wordcols) {
                printf '<span class=inline>';
                print $row->input($col => $attr);
                if (my $imgsrc = $attr->{-src}) {
-                       printf('<img id="%spreview" src="/%s" alt="%s"%s />',
-                               $col, $_, $row->{form}, $col eq 'source' && ' hidden'
+                       my $hide = $col eq 'source';
+                       printf '<span id="%spreview">', $col unless $hide;
+                       printf('<img src="/%s" alt="%s"%s />',
+                               $_, $row->{form}, $hide && qq( id="${col}preview" hidden)
                        ) for grep { -e } $imgsrc->($row);
+                       printf '</span>' unless $hide;
                }
                print $row->input($_ => delete $wordcol{$_}) for @span;
                print '</span>';
@@ -325,6 +334,10 @@ while (my $ref = $children->hash) {
        <input type="submit" value="Add" />
 </form></li>
 </ul>
+
+<form id="search">
+       <input type="search" name="q" value="" placeholder="search" /><button type="submit">🔍</button>
+</form>
 </section>
 <:
 }