word/edit: preserve unknown json values
authorMischa POSLAWSKY <perl@shiar.org>
Sun, 22 May 2022 18:28:20 +0000 (20:28 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Wed, 1 Jun 2022 18:05:15 +0000 (20:05 +0200)
Replace only submitted input, keep existing experimental properties.

word/edit.plp

index e4428519f3c09afb06fb372ed211f0bd094fdd5f..4a6daaad4a19ab503cd0680ec13479e11baa7934 100644 (file)
@@ -152,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 {
@@ -160,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') {