word edit: translation entry in referrer form
authorMischa POSLAWSKY <perl@shiar.org>
Sat, 30 May 2020 22:21:42 +0000 (00:21 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Sat, 6 Jun 2020 01:49:20 +0000 (03:49 +0200)
writer.js
writer.plp

index e00f99e2b888cc9d0fad050d4150f7c25551997b..714884d242525d16591ce767952d38a32ead77c4 100644 (file)
--- a/writer.js
+++ b/writer.js
@@ -44,4 +44,30 @@ document.addEventListener('DOMContentLoaded', () => {
                        imgpreview.hidden = !imgpreview.hidden;
                };
        }
+
+       let translist = document.getElementById('trans');
+       if (translist) {
+               let transadd = translist.appendChild(document.createElement('li'));
+               let transselect = transadd.appendChild(document.createElement('select'));
+               transselect.appendChild(document.createElement('option'));
+               for (let langoption of document.getElementById('lang').options) {
+                       if (document.getElementById('trans-'+langoption.value)) continue;
+                       let transoption = document.createElement('option');
+                       transoption.value = langoption.value;
+                       transoption.append(langoption.label);
+                       transselect.appendChild(transoption);
+               }
+               transselect.onchange = e => {
+                       let inputlang = e.target.selectedOptions[0];
+                       let transadded = translist.insertBefore(document.createElement('li'), transadd);
+                       let translabel = transadded.appendChild(document.createElement('label'));
+                       translabel.append(inputlang.label.replace(/ (.+)/, ' ')); //TODO title = $1
+                       let transinput = transadded.appendChild(document.createElement('input'));
+                       transinput.name = 'trans-'+inputlang.value;
+                       translabel.setAttribute('for', transinput.id = transinput.name);
+                       inputlang.remove();
+                       if (e.target.length <= 1) e.target.remove();
+                       transinput.focus();
+               };
+       }
 });
index ef377a0afb0db329026956ff5548ed68c012e4ba..f954ba05563e9627c128f2bf9d3a7d881eade753 100644 (file)
@@ -157,6 +157,20 @@ elsif ($ENV{REQUEST_METHOD} eq 'POST') {{
                next;
        };
 
+       eval {
+               while (my ($lang, $val) = each %post) {
+                       my $field = $lang;
+                       $lang =~ s/^trans-// or next;
+                       $db->insert(word => {
+                               ref   => $row->{id},
+                               lang  => $lang,
+                               form  => $val,
+                       });
+                       delete $fields{$field};
+               }
+               return 1;
+       } or Alert('Error creating translation entries', $@);
+
        my $imgpath = Shiar_Sheet::FormRow::imagepath($row, 'source');
        my $reimage = eval {
                ($row->{source} // '') ne ($replace->{source} // '') or return;
@@ -289,15 +303,23 @@ for my $col (@wordcols) {
        say '</p></li>';
 }
 
-if ($row->{id}) {
-       my $children = $db->select(word => '*', {ref => $row->{id}}, 'lang, id');
-       printf '<li><label>%s</label><div><ul class="inline">', 'Translations';
-       while (my $row = $children->hash) {
+if ($row->{id} and not $row->{ref}) {
+       printf '<li><label for="%s">%s</label><div><ul class="inline" id="%1$s">',
+               'trans', 'Translations';
+       my @children = $db->select(word => '*', {ref => $row->{id}}, 'lang, id')->hashes;
+       while (my ($lang, $val) = each %fields) {
+               $lang =~ s/^trans-// or next;
+               push @children, { lang => $lang, form => $val };
+       }
+       for my $ref (@children) {
+               printf(
+                       '<li><label for="%s" title="%3$s">%s </label>',
+                       "trans-$ref->{lang}", @{$lang{ $ref->{lang} }}, # flag, name
+               );
                printf(
-                       '<li><label for="%1$s" title="%5$s">%4$s</label>' .
-                               ' <a id="%s" href="%s">%s</a></li>',
-                       "trans-$row->{lang}", "/writer/$row->{id}", Entity($row->{form}),
-                       @{$lang{ $row->{lang} }}, # flag, name
+                       $ref->{id} ? '<a id="%s" href="%s">%s</a></li>' :
+                       '<input id="%s" name="%1$s" value="%3$s" />',
+                       "trans-$ref->{lang}", "/writer/$ref->{id}", Entity($ref->{form}),
                );
        }
        say '</ul></div></li>';
@@ -318,12 +340,12 @@ if ($row->{id}) {
 
 <:
 say '<ul>';
-my $parents = $db->select(word => '*', {id => $row->{cat}});
+my $parents = $db->select(word => '*', [{id => $row->{cat}}, {id => $row->{ref}}]);
 while (my $ref = $parents->hash) {
        printf '<li><a href="/writer/%d">%s</a></li>', $ref->{id}, Entity($ref->{form});
 }
 say "<li><strong>$row->{form}</strong></li>";
-my $children = $db->select(word => '*', {cat => $row->{id}}, 'grade, id');
+my $children = $db->select(word => '*', {cat => $row->{id}, ref => undef}, 'grade, id');
 while (my $ref = $children->hash) {
        printf '<li><a href="/writer/%d">%s</a></li>', $ref->{id}, Entity($ref->{form});
 }