diff options
Diffstat (limited to 'lib/VN3/Producer')
-rw-r--r-- | lib/VN3/Producer/Edit.pm | 136 | ||||
-rw-r--r-- | lib/VN3/Producer/JS.pm | 47 | ||||
-rw-r--r-- | lib/VN3/Producer/Page.pm | 117 |
3 files changed, 0 insertions, 300 deletions
diff --git a/lib/VN3/Producer/Edit.pm b/lib/VN3/Producer/Edit.pm deleted file mode 100644 index 3643d771..00000000 --- a/lib/VN3/Producer/Edit.pm +++ /dev/null @@ -1,136 +0,0 @@ -package VN3::Producer::Edit; - -use VN3::Prelude; - - -my $FORM = { - alias => { required => 0, default => '', maxlength => 500 }, - desc => { required => 0, default => '', maxlength => 5000 }, - hidden => { anybool => 1 }, - l_wp => { required => 0, default => '', maxlength => 150 }, - lang => { language => 1 }, - locked => { anybool => 1 }, - original => { required => 0, default => '', maxlength => 200 }, - name => { maxlength => 200 }, - ptype => { enum => \%PRODUCER_TYPE }, # This is 'type' in the database, but renamed for Elm compat - relations => { maxlength => 50, sort_keys => 'pid', aoh => { - pid => { id => 1 }, # X - relation => { producer_relation => 1 }, - name => { _when => 'out' }, - } }, - website => { required => 0, default => '', weburl => 1 }, - - id => { _when => 'out', required => 0, id => 1 }, - authmod => { _when => 'out', anybool => 1 }, - editsum => { _when => 'in out', editsum => 1 }, -}; - -my $FORM_OUT = form_compile out => $FORM; -my $FORM_IN = form_compile in => $FORM; -my $FORM_CMP = form_compile cmp => $FORM; - -elm_form ProdEdit => $FORM_OUT, $FORM_IN; - - -TUWF::get qr{/$PREV_RE/edit} => sub { - my $p = entry p => tuwf->capture('id'), tuwf->capture('rev') or return tuwf->resNotFound; - return tuwf->resDenied if !can_edit p => $p; - - enrich pid => q{SELECT id AS pid, name FROM producers WHERE id IN} => $p->{relations}; - - $p->{l_wp} //= ''; # TODO: The DB currently uses NULL when no wp link is provided, this should be an empty string instead to be consistent with most other fields. - $p->{ptype} = delete $p->{type}; - $p->{authmod} = auth->permDbmod; - $p->{editsum} = $p->{chrev} == $p->{maxrev} ? '' : "Reverted to revision p$p->{id}.$p->{chrev}"; - - Framework index => 0, title => "Edit $p->{name}", - top => sub { - Div class => 'col-md', sub { - EntryEdit p => $p; - Div class => 'detail-page-title', sub { - Txt $p->{name}; - Debug $p; - }; - }; - }, sub { - FullPageForm module => 'ProdEdit.Main', data => $p, schema => $FORM_OUT, sections => [ - general => 'General info', - relations => 'Relations', - ]; - }; -}; - - -TUWF::get '/p/add', sub { - return tuwf->resDenied if !auth->permEdit; - Framework index => 0, title => 'Add a new producer', narrow => 1, sub { - Div class => 'row', sub { - Div class => 'col-md col-md--1', sub { Div 'data-elm-module' => 'ProdEdit.New', '' }; - }; - }; -}; - - -json_api qr{/(?:$PID_RE/edit|p/add)}, $FORM_IN, sub { - my $data = shift; - my $new = !tuwf->capture('id'); - my $p = $new ? { id => 0 } : entry p => tuwf->capture('id') or return tuwf->resNotFound; - - return $elm_Unauth->() if !can_edit p => $p; - - $data->{l_wp} ||= undef; - if(!auth->permDbmod) { - $data->{hidden} = $p->{hidden}||0; - $data->{locked} = $p->{locked}||0; - } - $data->{relations} = [] if $data->{hidden}; - - die "Relation with self" if grep $_->{pid} == $p->{id}, @{$data->{relations}}; - validate_dbid 'SELECT id FROM producers WHERE id IN', map $_->{pid}, @{$data->{relations}}; - - $data->{desc} = bb_subst_links $data->{desc}; - - $p->{ptype} = delete $p->{type}; - return $elm_Unchanged->() if !$new && !form_changed $FORM_CMP, $data, $p; - $data->{type} = delete $data->{ptype}; - - my($id,undef,$rev) = update_entry p => $p->{id}, $data; - - update_reverse($id, $rev, $p, $data); - - $elm_Changed->($id, $rev); -}; - - -sub update_reverse { - my($id, $rev, $old, $new) = @_; - - my %old = map +($_->{pid}, $_), $old->{relations} ? @{$old->{relations}} : (); - my %new = map +($_->{pid}, $_), @{$new->{relations}}; - - # Updates to be performed, pid => { pid => x, relation => y } or undef if the relation should be removed. - my %upd; - - for my $i (keys %old, keys %new) { - if($old{$i} && !$new{$i}) { - $upd{$i} = undef; - } elsif(!$old{$i} || $old{$i}{relation} ne $new{$i}{relation}) { - $upd{$i} = { - pid => $id, - relation => producer_relation_reverse($new{$i}{relation}), - }; - } - } - - for my $i (keys %upd) { - my $p = entry p => $i; - $p->{relations} = [ - $upd{$i} ? $upd{$i} : (), - grep $_->{pid} != $id, @{$p->{relations}} - ]; - $p->{editsum} = "Reverse relation update caused by revision p$id.$rev"; - update_entry p => $i, $p, 1; - } -} - -1; diff --git a/lib/VN3/Producer/JS.pm b/lib/VN3/Producer/JS.pm deleted file mode 100644 index 50161ce5..00000000 --- a/lib/VN3/Producer/JS.pm +++ /dev/null @@ -1,47 +0,0 @@ -package VN3::Producer::JS; - -use VN3::Prelude; - - -my $elm_ProducerResult = elm_api ProducerResult => { aoh => { - id => { id => 1 }, - name => {}, - original => {}, - hidden => { anybool => 1 }, -}}; - - -json_api '/js/producer.json', { - search => { type => 'array', scalar => 1, minlength => 1, values => { maxlength => 500 } }, - hidden => { anybool => 1 } -}, sub { - my $data = shift; - - my $r = tuwf->dbAlli( - 'SELECT p.id, p.name, p.original, p.hidden', - 'FROM (', (sql_join 'UNION ALL', map { - my $q = $_; - my $qs = s/[%_]//gr; - +( - # ID search - /^$PID_RE$/ ? (sql 'SELECT 1, id FROM producers WHERE id =', \"$1") : (), - # exact match - sql('SELECT 2, id FROM producers WHERE lower(name) = lower(', \$q, ") OR lower(translate(original,' ', '')) = lower(", \($q =~ s/\s//gr), ')'), - # prefix match - sql('SELECT 3, id FROM producers WHERE name ILIKE', \"$qs%", ' OR original ILIKE', \"$qs%"), - # substring match - sql('SELECT 4, id FROM producers WHERE name ILIKE', \"%$qs%", ' OR original ILIKE', \"%$qs%", ' OR alias ILIKE', \"%$qs%") - ) - } @{$data->{search}}), - ') AS pt (ord, id)', - 'JOIN producers p ON p.id = pt.id', - $data->{hidden} ? () : ('WHERE NOT p.hidden'), - 'GROUP BY p.id', - 'ORDER BY MIN(pt.ord), p.name', - 'LIMIT 20' - ); - - $elm_ProducerResult->($r); -}; - -1; diff --git a/lib/VN3/Producer/Page.pm b/lib/VN3/Producer/Page.pm deleted file mode 100644 index 89cd9dd8..00000000 --- a/lib/VN3/Producer/Page.pm +++ /dev/null @@ -1,117 +0,0 @@ -package VN3::Producer::Page; - -use VN3::Prelude; - -# TODO: Releases/VNs -# TODO: Relation graph - -sub Notes { - my $e = shift; - - Div class => 'row', sub { - Div class => 'fixed-size-left-sidebar-md', sub { - H2 class => 'detail-page-sidebar-section-header', 'Notes'; - }; - Div class => 'col-md', sub { - Div class => 'description serif mb-5', sub { - P sub { Lit bb2html $e->{desc} }; - }; - }; - } if $e->{desc}; -} - - -sub DetailsTable { - my $e = shift; - - my @links = ( - $e->{website} ? [ 'Official website', $e->{website} ] : (), - $e->{l_wp} ? [ 'Wikipedia', "https://en.wikipedia.org/wiki/$e->{l_wp}" ] : (), - ); - - my %rel; - push @{$rel{$_->{relation}}}, $_ for (sort { $a->{name} cmp $b->{name} } @{$e->{relations}}); - - my @list = ( - $e->{alias} ? sub { - Dt $e->{alias} =~ /\n/ ? 'Aliases' : 'Alias'; - Dd $e->{alias} =~ s/\n/, /gr; - } : (), - - sub { - Dt 'Type'; - Dd $PRODUCER_TYPE{$e->{type}}; - }, - - sub { - Dt 'Language'; - Dd sub { - Lang $e->{lang}; - Txt " $LANGUAGE{$e->{lang}}"; - } - }, - - @links ? sub { - Dt 'Links'; - Dd sub { - Join ', ', sub { A href => $_[0][1], rel => 'nofollow', $_[0][0] }, @links; - }; - } : (), - - (map { - my $r = $_; - sub { - Dt producer_relation_display $r; - Dd sub { - Join ', ', sub { - A href => "/p$_[0]{pid}", title => $_[0]{original}||$_[0]{name}, $_[0]{name}; - }, @{$rel{$r}} - } - } - } grep $rel{$_}, keys %PRODUCER_RELATION) - ); - - Div class => 'row', sub { - Div class => 'fixed-size-left-sidebar-md', sub { - H2 class => 'detail-page-sidebar-section-header', 'Details'; - }; - Div class => 'col-md', sub { - Div class => 'card card--white mb-5', sub { - Div class => 'card__section fs-medium', sub { - Div class => 'row', sub { - Dl class => 'col-md dl--horizontal', sub { $_->() for @list[0..$#list/2] }; - Dl class => 'col-md dl--horizontal', sub { $_->() for @list[$#list/2+1..$#list] }; - } - } - } - } - } if @list; -} - - -TUWF::get qr{/$PREV_RE}, sub { - my $e = entry p => tuwf->capture('id'), tuwf->capture('rev') or return tuwf->resNotFound; - return tuwf->resNotFound if !$e->{id} || $e->{hidden}; - - enrich pid => q{SELECT id AS pid, name, original FROM producers WHERE id IN}, $e->{relations}; - - Framework - title => $e->{name}, - top => sub { - Div class => 'col-md', sub { - EntryEdit p => $e; - Div class => 'detail-page-title', sub { - Txt $e->{name}; - Debug $e; - }; - Div class => 'detail-page-subtitle', $e->{original} if $e->{original}; - # TODO: link to discussions page. Prolly needs a TopNav - } - }, - sub { - DetailsTable $e; - Notes $e; - }; -}; - -1; |