summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/VNDB/Handler/Releases.pm42
-rw-r--r--lib/VNDB/Util/CommonHTML.pm20
-rw-r--r--lib/VNDB/Util/FormHTML.pm1
3 files changed, 44 insertions, 19 deletions
diff --git a/lib/VNDB/Handler/Releases.pm b/lib/VNDB/Handler/Releases.pm
index ba46d19f..6b9de1f0 100644
--- a/lib/VNDB/Handler/Releases.pm
+++ b/lib/VNDB/Handler/Releases.pm
@@ -11,7 +11,7 @@ YAWF::register(
qr{r([1-9]\d*)(?:\.([1-9]\d*))?} => \&page,
qr{(v)([1-9]\d*)/add} => \&edit,
qr{r} => \&browse,
- qr{r(?:([1-9]\d*)(?:\.([1-9]\d*))?/edit)}
+ qr{r(?:([1-9]\d*)(?:\.([1-9]\d*))?/(edit|copy))}
=> \&edit,
);
@@ -260,12 +260,14 @@ sub _infotable {
}
-# rid = \d -> edit release
+# rid = \d -> edit/copy release
# rid = 'v' -> add release to VN with id $rev
sub edit {
- my($self, $rid, $rev) = @_;
+ my($self, $rid, $rev, $copy) = @_;
my $vid = 0;
+ $copy = $rev && $rev eq 'copy' || $copy && $copy eq 'copy';
+ $rev = undef if defined $rev && $rev !~ /^\d+$/;
if($rid eq 'v') {
$vid = $rev;
$rev = undef;
@@ -318,23 +320,28 @@ sub edit {
{ name => 'vn', maxlength => 5000 },
{ name => 'editsum', maxlength => 5000 },
);
+
+ my($media, $producers, $new_vn);
if(!$frm->{_err}) {
# de-serialize
- my $media = [ map [ split / / ], split /,/, $frm->{media} ];
- my $producers = [ map { /^([0-9]+)/ ? $1 : () } split /\|\|\|/, $frm->{producers} ];
- my $new_vn = [ map { /^([0-9]+)/ ? $1 : () } split /\|\|\|/, $frm->{vn} ];
+ $media = [ map [ split / / ], split /,/, $frm->{media} ];
+ $producers = [ map { /^([0-9]+)/ ? $1 : () } split /\|\|\|/, $frm->{producers} ];
+ $new_vn = [ map { /^([0-9]+)/ ? $1 : () } split /\|\|\|/, $frm->{vn} ];
$frm->{platforms} = [ grep $_, @{$frm->{platforms}} ];
$frm->{$_} = $frm->{$_} ? 1 : 0 for (qw|patch freeware doujin|);
$frm->{doujin} = 0 if $frm->{patch};
- return $self->resRedirect("/r$rid", 'post')
- if $rid &&
+ my $same = $rid &&
(join(',', sort @{$b4{platforms}}) eq join(',', sort @{$frm->{platforms}})) &&
(join(',', sort @$producers) eq join(',', sort map $_->{id}, @{$r->{producers}})) &&
(join(',', sort @$new_vn) eq join(',', sort map $_->{vid}, @$vn)) &&
(join(',', sort @{$b4{languages}}) eq join(',', sort @{$frm->{languages}})) &&
!grep !/^(platforms|producers|vn|languages)$/ && $frm->{$_} ne $b4{$_}, keys %b4;
+ return $self->resRedirect("/r$rid", 'post') if !$copy && $same;
+ $frm->{_err} = [ 'nochanges' ] if $copy && $same;
+ }
+ if(!$frm->{_err}) {
my %opts = (
(map { $_ => $frm->{$_} } qw| type title original gtin catalog languages website released
notes minage platforms resolution editsum patch voiced freeware doujin ani_story ani_ero|),
@@ -344,8 +351,8 @@ sub edit {
);
$rev = 1;
- ($rev) = $self->dbReleaseEdit($rid, %opts) if $rid;
- ($rid) = $self->dbReleaseAdd(%opts) if !$rid;
+ ($rev) = $self->dbReleaseEdit($rid, %opts) if !$copy && $rid;
+ ($rid) = $self->dbReleaseAdd(%opts) if $copy || !$rid;
$self->multiCmd("ircnotify r$rid.$rev");
$self->vnCacheUpdate(@$new_vn, map $_->{vid}, @$vn);
@@ -356,21 +363,22 @@ sub edit {
!defined $frm->{$_} && ($frm->{$_} = $b4{$_}) for keys %b4;
$frm->{languages} = ['ja'] if !$rid && !defined $frm->{languages};
- $frm->{editsum} = sprintf 'Reverted to revision r%d.%d', $rid, $rev if $rev && !defined $frm->{editsum};
+ $frm->{editsum} = sprintf 'Reverted to revision r%d.%d', $rid, $rev if !$copy && $rev && !defined $frm->{editsum};
+ $frm->{editsum} = sprintf 'New release based on r%d.%d', $rid, $r->{rev} if $copy && !defined $frm->{editsum};
- $self->htmlHeader(js => 'forms', title => $rid ? 'Edit '.$r->{title} : 'Add release to '.$v->{title}, noindex => 1);
- $self->htmlMainTabs('r', $r, 'edit') if $rid;
+ $self->htmlHeader(js => 'forms', title => $rid ? ''.($copy ? 'Copy ':'Edit ').$r->{title} : 'Add release to '.$v->{title}, noindex => 1);
+ $self->htmlMainTabs('r', $r, $copy ? 'copy' : 'edit') if $rid;
$self->htmlMainTabs('v', $v, 'edit') if $vid;
- $self->htmlEditMessage('r', $r);
- _form($self, $r, $v, $frm);
+ $self->htmlEditMessage('r', $r, $copy);
+ _form($self, $r, $v, $frm, $copy);
$self->htmlFooter;
}
sub _form {
- my($self, $r, $v, $frm) = @_;
+ my($self, $r, $v, $frm, $copy) = @_;
- $self->htmlForm({ frm => $frm, action => $r ? "/r$r->{id}/edit" : "/v$v->{id}/add", editsum => 1 },
+ $self->htmlForm({ frm => $frm, action => $r ? "/r$r->{id}/".($copy ? 'copy' : 'edit') : "/v$v->{id}/add", editsum => 1 },
"General info" => [
[ select => short => 'type', name => 'Type',
options => [ map [ $_, $self->{release_types}[$_] ], 0..$#{$self->{release_types}} ] ],
diff --git a/lib/VNDB/Util/CommonHTML.pm b/lib/VNDB/Util/CommonHTML.pm
index cbb84dd8..2f0a3274 100644
--- a/lib/VNDB/Util/CommonHTML.pm
+++ b/lib/VNDB/Util/CommonHTML.pm
@@ -69,6 +69,12 @@ sub htmlMainTabs {
end;
}
+ if($type eq 'r' && $self->authCan('edit')) {
+ li $sel eq 'copy' ? (class => 'tabselected') : ();
+ a href => "/$id/copy", 'copy';
+ end;
+ }
+
if($type =~ /[vrp]/ && $self->authCan('del')) {
li;
a href => "/$id/hide", $obj->{hidden} ? 'unhide' : 'hide';
@@ -358,12 +364,22 @@ sub revdiff {
# Generates a generic message to show as the header of the edit forms
# Arguments: v/r/p, obj
sub htmlEditMessage {
- my($self, $type, $obj) = @_;
+ my($self, $type, $obj, $copy) = @_;
my $full = {v => 'visual novel', r => 'release', p => 'producer'}->{$type};
my $guidelines = {v => 2, r => 3, p => 4}->{$type};
div class => 'mainbox';
- h1 $obj ? 'Edit '.($obj->{name}||$obj->{title}) : "Add new $full";
+ h1 $obj ? ''.($copy ? 'Copy ':'Edit ').($obj->{name}||$obj->{title}) : "Add new $full";
+ if($copy) {
+ div class => 'warning';
+ h2 "You're not editing a release!";
+ p;
+ txt "You're about to insert a new release into the database with information based on ";
+ a href => "/$type$obj->{id}", $obj->{title};
+ txt ". Hit the 'edit' tab on the right-top if you intended to edit the release instead of creating a new one.";
+ end;
+ end;
+ }
div class => 'notice';
h2 'Before editing:';
ul;
diff --git a/lib/VNDB/Util/FormHTML.pm b/lib/VNDB/Util/FormHTML.pm
index e841fa65..b37d6ba8 100644
--- a/lib/VNDB/Util/FormHTML.pm
+++ b/lib/VNDB/Util/FormHTML.pm
@@ -53,6 +53,7 @@ my %formerr_exeptions = (
noimage => 'Image must be in JPEG or PNG format',
toolarge => 'Image is too large, only 500kB allowed',
oneaday => 'You can only register one account from the same IP within 24 hours',
+ nochanges => 'No changes, please don\'t create an entry that is fully -identical- to another',
);