summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/js/main.js5
-rw-r--r--data/js/relmedia.js68
-rw-r--r--data/js/relprod.js105
-rw-r--r--data/js/relvns.js88
-rw-r--r--data/style.css19
-rw-r--r--lib/VNDB/DB/Misc.pm1
-rw-r--r--lib/VNDB/DB/Releases.pm49
-rw-r--r--lib/VNDB/Handler/Releases.pm321
-rw-r--r--lib/VNWeb/HTML.pm9
9 files changed, 3 insertions, 662 deletions
diff --git a/data/js/main.js b/data/js/main.js
index 75161598..fdb6a813 100644
--- a/data/js/main.js
+++ b/data/js/main.js
@@ -39,11 +39,6 @@ VARS = /*VARS*/;
//include vnstaff.js
//include vncast.js
-// Release editing (/r+/edit)
-//include relmedia.js
-//include relvns.js
-//include relprod.js
-
// Producer editing (/p+/edit)
//include prodrel.js
diff --git a/data/js/relmedia.js b/data/js/relmedia.js
deleted file mode 100644
index 4068d499..00000000
--- a/data/js/relmedia.js
+++ /dev/null
@@ -1,68 +0,0 @@
-function medLoad() {
- // load the selected media
- var med = byId('media').value.split(',');
- for(var i=0; i<med.length && med[i].length > 1; i++)
- medAdd(med[i].split(' ')[0], Math.floor(med[i].split(' ')[1]));
-
- medAdd('', 0);
-}
-
-function medAdd(med, qty) {
- var qsel = tag('select', {'class':'qty', onchange:medSerialize}, tag('option', {value:0}, '-quantity-'));
- for(var i=1; i<=20; i++)
- qsel.appendChild(tag('option', {value:i, selected: qty==i}, i));
-
- var msel = tag('select', {'class':'medium', onchange: med == '' ? medFormAdd : medSerialize});
- if(med == '')
- msel.appendChild(tag('option', {value:''}, '-medium-'));
- for(var i=0; i<VARS.media.length; i++)
- msel.appendChild(tag('option', {value:VARS.media[i][0], selected: med==VARS.media[i][0]}, VARS.media[i][1]));
-
- byId('media_div').appendChild(tag('span', qsel, msel,
- med != '' ? tag('input', {type: 'button', 'class':'submit', onclick:medDel, value:'remove'}) : null
- ));
-}
-
-function medDel() {
- var span = this;
- while(span.nodeName.toLowerCase() != 'span')
- span = span.parentNode;
- byId('media_div').removeChild(span);
- medSerialize();
- return false;
-}
-
-function medFormAdd() {
- var span = this;
- while(span.nodeName.toLowerCase() != 'span')
- span = span.parentNode;
- var med = byClass(span, 'select', 'medium')[0];
- var qty = byClass(span, 'select', 'qty')[0];
- if(!med.selectedIndex)
- return;
- medAdd(med.options[med.selectedIndex].value, qty.options[qty.selectedIndex].value);
- byId('media_div').removeChild(span);
- medAdd('', 0);
- medSerialize();
-}
-
-function medSerialize() {
- var r = [];
- var meds = byName(byId('media_div'), 'span');
- for(var i=0; i<meds.length-1; i++) {
- var med = byClass(meds[i], 'select', 'medium')[0];
- var qty = byClass(meds[i], 'select', 'qty')[0];
-
- /* correct quantity if necessary */
- if(VARS.media[med.selectedIndex][2] && !qty.selectedIndex)
- qty.selectedIndex = 1;
- if(!VARS.media[med.selectedIndex][2] && qty.selectedIndex)
- qty.selectedIndex = 0;
-
- r[r.length] = VARS.media[med.selectedIndex][0] + ' ' + qty.selectedIndex;
- }
- byId('media').value = r.join(',');
-}
-
-if(byId('jt_box_rel_format'))
- medLoad();
diff --git a/data/js/relprod.js b/data/js/relprod.js
deleted file mode 100644
index 3292ca0f..00000000
--- a/data/js/relprod.js
+++ /dev/null
@@ -1,105 +0,0 @@
-function rprLoad() {
- var ps = byId('producers').value.split('|||');
- for(var i=0; i<ps.length && ps[i].length>1; i++) {
- var val = ps[i].split(',',3);
- rprAdd(val[0], val[1], val[2]);
- }
- rprEmpty();
-
- dsInit(byId('producer_input'), '/xml/producers.xml?q=',
- function(item, tr) {
- tr.appendChild(tag('td', {style:'text-align: right; padding-right: 5px'}, 'p'+item.getAttribute('id')));
- tr.appendChild(tag('td', shorten(item.firstChild.nodeValue, 40)));
- }, function(item) {
- return 'p'+item.getAttribute('id')+':'+item.firstChild.nodeValue;
- },
- rprFormAdd
- );
- byId('producer_add').onclick = rprFormAdd;
-}
-
-function rprAdd(id, role, name) {
- var roles = byId('producer_role').options;
- var rl = tag('select', {onchange:rprSerialize});
- for(var i=0; i<roles.length; i++)
- rl.appendChild(tag('option', {value: roles[i].value, selected:role==roles[i].value}, getText(roles[i])));
-
- byId('producer_tbl').appendChild(tag('tr', {id:'rpr_'+id, rpr_id:id},
- tag('td', {'class':'tc_name'}, 'p'+id+':', tag('a', {href:'/p'+id}, shorten(name, 40))),
- tag('td', {'class':'tc_role'}, rl),
- tag('td', {'class':'tc_rm'}, tag('a', {href:'#', onclick:rprDel}, 'remove'))
- ));
- rprEmpty();
-}
-
-function rprDel() {
- var tr = this;
- while(tr.nodeName.toLowerCase() != 'tr')
- tr = tr.parentNode;
- tr.parentNode.removeChild(tr);
- rprEmpty();
- rprSerialize();
- return false;
-}
-
-function rprEmpty() {
- var tbl = byId('producer_tbl');
- if(byName(tbl, 'tr').length < 1)
- tbl.appendChild(tag('tr', {id:'rpr_tr_none'}, tag('td', {colspan:2}, 'Nothing selected.')));
- else if(byId('rpr_tr_none'))
- tbl.removeChild(byId('rpr_tr_none'));
-}
-
-function rprFormAdd() {
- var txt = byId('producer_input');
- var lnk = byId('producer_add');
- var val = txt.value;
-
- if(!val.match(/^p[0-9]+/)) {
- alert('Producer textbox must start with an ID (e.g. p17)');
- return false;
- }
-
- txt.disabled = true;
- txt.value = 'Loading...';
- setText(lnk, 'Loading...');
-
- ajax('/xml/producers.xml?q='+encodeURIComponent(val), function(hr) {
- txt.disabled = false;
- txt.value = '';
- setText(lnk, 'add');
-
- var items = hr.responseXML.getElementsByTagName('item');
- if(items.length < 1)
- return alert('Producer not found!');
-
- var id = items[0].getAttribute('id');
- if(byId('rpr_'+id))
- return alert('Producer already selected!');
-
- var role = byId('producer_role');
- role = role[role.selectedIndex].value;
-
- rprAdd(id, role, items[0].firstChild.nodeValue);
- rprSerialize();
- });
- return false;
-}
-
-function rprSerialize() {
- var r = [];
- var l = byName(byId('producer_tbl'), 'tr');
- for(var i=0; i<l.length; i++)
- if(l[i].rpr_id) {
- var role = byName(byClass(l[i], 'td', 'tc_role')[0], 'select')[0];
- r[r.length] = [
- l[i].rpr_id,
- role.options[role.selectedIndex].value,
- getText(byName(byClass(l[i], 'td', 'tc_name')[0], 'a')[0])
- ].join(',');
- }
- byId('producers').value = r.join('|||');
-}
-
-if(byId('jt_box_rel_prod'))
- rprLoad();
diff --git a/data/js/relvns.js b/data/js/relvns.js
deleted file mode 100644
index f27e530b..00000000
--- a/data/js/relvns.js
+++ /dev/null
@@ -1,88 +0,0 @@
-function rvnLoad() {
- var vns = byId('vn').value.split('|||');
- for(var i=0; i<vns.length && vns[i].length>1; i++)
- rvnAdd(vns[i].split(',',2)[0], vns[i].split(',',2)[1]);
- rvnEmpty();
-
- dsInit(byId('vn_input'), '/xml/vn.xml?q=',
- function(item, tr) {
- tr.appendChild(tag('td', {style:'text-align: right; padding-right: 5px'}, 'v'+item.getAttribute('id')));
- tr.appendChild(tag('td', shorten(item.firstChild.nodeValue, 40)));
- }, function(item) {
- return 'v'+item.getAttribute('id')+':'+item.firstChild.nodeValue;
- },
- rvnFormAdd
- );
- byId('vn_add').onclick = rvnFormAdd;
-}
-
-function rvnAdd(id, title) {
- byId('vn_tbl').appendChild(tag('tr', {id:'rvn_'+id, rvn_id:id},
- tag('td', {'class':'tc_title'}, 'v'+id+':', tag('a', {href:'/v'+id}, shorten(title, 40))),
- tag('td', {'class':'tc_rm'}, tag('a', {href:'#', onclick:rvnDel}, 'remove'))
- ));
- rvnEmpty();
-}
-
-function rvnDel() {
- var tr = this;
- while(tr.nodeName.toLowerCase() != 'tr')
- tr = tr.parentNode;
- tr.parentNode.removeChild(tr);
- rvnEmpty();
- rvnSerialize();
- return false;
-}
-
-function rvnEmpty() {
- var tbl = byId('vn_tbl');
- if(byName(tbl, 'tr').length < 1)
- tbl.appendChild(tag('tr', {id:'rvn_tr_none'}, tag('td', {colspan:2}, 'Nothing selected.')));
- else if(byId('rvn_tr_none'))
- tbl.removeChild(byId('rvn_tr_none'));
-}
-
-function rvnFormAdd() {
- var txt = byId('vn_input');
- var lnk = byId('vn_add');
- var val = txt.value;
-
- if(!val.match(/^v[0-9]+/)) {
- alert('Visual novel textbox must start with an ID (e.g. v17)');
- return false;
- }
-
- txt.disabled = true;
- txt.value = 'Loading...';
- setText(lnk, 'Loading...');
-
- ajax('/xml/vn.xml?q='+encodeURIComponent(val), function(hr) {
- txt.disabled = false;
- txt.value = '';
- setText(lnk, 'add');
-
- var items = hr.responseXML.getElementsByTagName('item');
- if(items.length < 1)
- return alert('Visual novel not found!');
-
- var id = items[0].getAttribute('id');
- if(byId('rvn_'+id))
- return alert('VN already selected!');
-
- rvnAdd(id, items[0].firstChild.nodeValue);
- rvnSerialize();
- });
- return false;
-}
-
-function rvnSerialize() {
- var r = [];
- var l = byName(byId('vn_tbl'), 'tr');
- for(var i=0; i<l.length; i++)
- if(l[i].rvn_id)
- r[r.length] = l[i].rvn_id + ',' + getText(byName(byClass(l[i], 'td', 'tc_title')[0], 'a')[0]);
- byId('vn').value = r.join('|||');
-}
-
-if(byId('jt_box_rel_vn'))
- rvnLoad();
diff --git a/data/style.css b/data/style.css
index df687020..d15a4106 100644
--- a/data/style.css
+++ b/data/style.css
@@ -624,25 +624,6 @@ div.producerbrowse { padding-bottom: 10px }
.release .key { width: 90px; }
-/* Release edit */
-
-.platforms { padding-left: 20px; }
-.platforms span { display: block; float: left; width: 150px; }
-
-#jt_box_rel_format h2 { clear: left; padding-top: 10px; }
-#media_div select.qty { width: 90px; }
-#media_div select.medium { width: 150px }
-#media_div { padding-left: 20px; }
-#media_div span { display: block }
-
-#jt_box_rel_vn h2, #jt_box_rel_prod h2 { clear: left; padding-top: 10px; }
-#jt_box_rel_vn div, #jt_box_rel_vn table,
-#jt_box_rel_prod div, #jt_box_rel_prod table { margin-left: 20px }
-#jt_box_rel_vn input, #jt_box_rel_prod input { margin-right: 10px; width: 295px }
-#jt_box_rel_vn .tc_title, #jt_box_rel_prod .tc_name { width: 310px; padding: 2px }
-#jt_box_rel_prod .tc_role select { width: 100px; margin-right: 10px; }
-
-
/***** Release browser *****/
diff --git a/lib/VNDB/DB/Misc.pm b/lib/VNDB/DB/Misc.pm
index 73e3e71f..4f630cbd 100644
--- a/lib/VNDB/DB/Misc.pm
+++ b/lib/VNDB/DB/Misc.pm
@@ -38,7 +38,6 @@ sub dbItemEdit {
$self->dbVNRevisionInsert( \%o) if $type eq 'v';
$self->dbProducerRevisionInsert(\%o) if $type eq 'p';
- $self->dbReleaseRevisionInsert( \%o) if $type eq 'r';
$self->dbCharRevisionInsert( \%o) if $type eq 'c';
return $self->dbRow('SELECT * FROM edit_!s_commit()', $type);
diff --git a/lib/VNDB/DB/Releases.pm b/lib/VNDB/DB/Releases.pm
index 9813029d..944a72c0 100644
--- a/lib/VNDB/DB/Releases.pm
+++ b/lib/VNDB/DB/Releases.pm
@@ -7,7 +7,7 @@ use POSIX 'strftime';
use Exporter 'import';
use VNDB::Func 'gtintype';
-our @EXPORT = qw|dbReleaseFilters dbReleaseGet dbReleaseGetRev dbReleaseRevisionInsert dbReleaseEngines|;
+our @EXPORT = qw|dbReleaseFilters dbReleaseGet dbReleaseGetRev dbReleaseEngines|;
# Release filters shared by dbReleaseGet and dbVNGet
@@ -214,53 +214,6 @@ sub _enrich {
}
-# Updates the edit_* tables, used from dbItemEdit()
-# Arguments: { columns in releases_rev + languages + vn + producers + media + platforms }
-sub dbReleaseRevisionInsert {
- my($self, $o) = @_;
-
- my %set = map exists($o->{$_}) ? ("$_ = ?", $o->{$_}) : (),
- qw|title original gtin catalog website released notes minage type
- l_steam l_dlsite l_dlsiteen l_gog l_denpa l_jlist l_digiket l_melon l_mg l_getchu l_getchudl l_itch l_jastusa l_egs l_erotrail
- patch resolution voiced freeware doujin uncensored ani_story ani_ero engine|;
- $set{'l_dmm = ARRAY[!l]::text[]'} = [ $o->{l_dmm} ] if exists $o->{l_dmm};
- $set{'l_gyutto = ARRAY[!l]::integer[]'} = [ $o->{l_gyutto} ] if exists $o->{l_gyutto};
- $self->dbExec('UPDATE edit_releases !H', \%set) if keys %set;
-
- if($o->{languages}) {
- $self->dbExec('DELETE FROM edit_releases_lang');
- my $q = join ',', map '(?)', @{$o->{languages}};
- $self->dbExec("INSERT INTO edit_releases_lang (lang) VALUES $q", @{$o->{languages}}) if @{$o->{languages}};
- }
-
- if($o->{producers}) {
- $self->dbExec('DELETE FROM edit_releases_producers');
- my $q = join ',', map '(?,?,?)', @{$o->{producers}};
- my @q = map +($_->[0], $_->[1]?1:0, $_->[2]?1:0), @{$o->{producers}};
- $self->dbExec("INSERT INTO edit_releases_producers (pid, developer, publisher) VALUES $q", @q) if @q;
- }
-
- if($o->{platforms}) {
- $self->dbExec('DELETE FROM edit_releases_platforms');
- my $q = join ',', map '(?)', @{$o->{platforms}};
- $self->dbExec("INSERT INTO edit_releases_platforms (platform) VALUES $q", @{$o->{platforms}}) if @{$o->{platforms}};
- }
-
- if($o->{vn}) {
- $self->dbExec('DELETE FROM edit_releases_vn');
- my $q = join ',', map '(?)', @{$o->{vn}};
- $self->dbExec("INSERT INTO edit_releases_vn (vid) VALUES $q", @{$o->{vn}}) if @{$o->{vn}};
- }
-
- if($o->{media}) {
- $self->dbExec('DELETE FROM edit_releases_media');
- my $q = join ',', map '(?,?)', @{$o->{media}};
- my @q = map +($_->[0], $_->[1]), @{$o->{media}};
- $self->dbExec("INSERT INTO edit_releases_media (medium, qty) VALUES $q", @q) if @q;
- }
-}
-
-
sub dbReleaseEngines {
shift->dbAll(q{SELECT engine, count(*) as cnt FROM releases WHERE engine <> '' GROUP BY engine ORDER BY COUNT(*) desc, engine});
}
diff --git a/lib/VNDB/Handler/Releases.pm b/lib/VNDB/Handler/Releases.pm
index ef277f15..0e7c8933 100644
--- a/lib/VNDB/Handler/Releases.pm
+++ b/lib/VNDB/Handler/Releases.pm
@@ -12,334 +12,13 @@ our @EXPORT = ('releaseExtLinks');
TUWF::register(
- qr{old/(v)([1-9]\d*)/add} => \&edit,
qr{r} => \&browse,
- qr{old/r(?:([1-9]\d*)(?:\.([1-9]\d*))?/(edit|copy))}
- => \&edit,
qr{r/engines} => \&engines,
qr{xml/releases.xml} => \&relxml,
qr{xml/engines.xml} => \&enginexml,
);
-# rid = \d -> edit/copy release
-# rid = 'v' -> add release to VN with id $rev
-sub edit {
- 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;
- $rid = 0;
- }
-
- my $r = $rid && $self->dbReleaseGetRev(id => $rid, what => 'vn extended links producers platforms media', $rev ? (rev => $rev) : ())->[0];
- return $self->resNotFound if $rid && !$r->{id};
- $rev = undef if !$r || $r->{lastrev};
-
- my $v = $vid && $self->dbVNGet(id => $vid)->[0];
- return $self->resNotFound if $vid && !$v->{id};
-
- return $self->htmlDenied if !$self->authCan('edit')
- || $rid && (($r->{locked} || $r->{hidden}) && !$self->authCan('dbmod'));
-
- my $vn = $rid ? $r->{vn} : [{ vid => $vid, title => $v->{title} }];
- my %b4 = !$rid ? () : (
- (map { $_ => $r->{$_} } (qw|type title original languages website released minage
- notes platforms patch resolution voiced freeware doujin uncensored ani_story ani_ero engine ihid ilock|,
- $copy ? () : (qw|
- gtin catalog l_steam l_dlsite l_dlsiteen l_gog l_denpa l_jlist l_digiket l_melon l_mg l_getchu l_getchudl l_itch l_jastusa l_egs l_erotrail
- |)
- )),
- $copy ? () : (
- l_gyutto => join(' ', sort @{$r->{l_gyutto}}),
- l_dmm => join(' ', sort @{$r->{l_dmm}}),
- ),
- media => join(',', sort map "$_->{medium} $_->{qty}", @{$r->{media}}),
- producers => join('|||', map
- sprintf('%d,%d,%s', $_->{id}, ($_->{developer}?1:0)+($_->{publisher}?2:0), $_->{name}),
- sort { $a->{id} <=> $b->{id} } @{$r->{producers}}
- ),
- );
- gtintype($b4{gtin}) if $b4{gtin}; # normalize gtin code
- $b4{vn} = join('|||', map "$_->{vid},$_->{title}", @$vn);
- my $frm;
-
- if($self->reqMethod eq 'POST') {
- return if !$self->authCheckCode;
- my $dmm_re = qr{(?:https?://)?(?:www|dlsoft)\.dmm\.(?:com|co\.jp)/[^\s]+};
- $frm = $self->formValidate(
- { post => 'type', enum => [ keys %RELEASE_TYPE ] },
- { post => 'patch', required => 0, default => 0 },
- { post => 'freeware', required => 0, default => 0 },
- { post => 'doujin', required => 0, default => 0 },
- { post => 'uncensored',required => 0, default => 0 },
- { post => 'title', maxlength => 250 },
- { post => 'original', required => 0, default => '', maxlength => 250 },
- { post => 'gtin', required => 0, default => '0', template => 'gtin' },
- { post => 'catalog', required => 0, default => '', maxlength => 50 },
- { post => 'languages', multi => 1, enum => [ keys %LANGUAGE ] },
- { post => 'website', required => 0, default => '', maxlength => 250, template => 'weburl' },
- { post => 'l_steam', required => 0, default => 0, template => 'uint' },
- { post => 'l_dlsite', required => 0, default => '', regex => [ qr/^[VR]J[0-9]{6}$/, 'Invalid DLsite ID' ] },
- { post => 'l_dlsiteen',required => 0, default => '', regex => [ qr/^[VR]E[0-9]{6}$/, 'Invalid DLsite ID' ] },
- { post => 'l_gog', required => 0, default => '', regex => [ qr/^[a-z0-9_]+$/, 'Invalid GOG.com ID' ] },
- { post => 'l_denpa', required => 0, default => '', regex => [ qr/^[a-z0-9-]+$/, 'Invalid Denpasoft ID' ] },
- { post => 'l_jlist', required => 0, default => '', regex => [ qr/^[a-z0-9-]+$/, 'Invalid J-List ID' ] },
- { post => 'l_gyutto', required => 0, default => '', regex => [ qr/^([0-9]+(\s+[0-9]+)*)?$/, 'Invalid Gyutto id' ] },
- { post => 'l_digiket', required => 0, default => 0, func => [ sub { $_[0] =~ s/^(?:ITM)?0+//; $_[0] =~ /^[0-9]+$/ }, 'Invalid Digiket ID' ] },
- { post => 'l_melon', required => 0, default => 0, func => [ sub { $_[0] =~ s/^(?:IT)?0+//; $_[0] =~ /^[0-9]+$/ }, 'Invalid Melonbooks.com ID' ] },
- { post => 'l_mg', required => 0, default => 0, template => 'uint' },
- { post => 'l_getchu', required => 0, default => 0, template => 'uint' },
- { post => 'l_getchudl',required => 0, default => 0, template => 'uint' },
- { post => 'l_dmm', required => 0, default => '', regex => [ qr/^($dmm_re(\s+$dmm_re)*)?$/, 'Invalid DMM URL' ] },
- { post => 'l_itch', required => 0, default => '', regex => [ qr{^(?:https?://)?([a-z0-9_-]+)\.itch\.io/([a-z0-9_-]+)$}, 'Invalid Itch.io URL' ] },
- { post => 'l_jastusa', required => 0, default => '', regex => [ qr/^[a-z0-9-]+$/, 'Invalid JAST USA ID' ] },
- { post => 'l_egs', required => 0, default => 0, template => 'uint' },
- { post => 'l_erotrail',required => 0, default => 0, template => 'uint' },
- { post => 'released', required => 0, default => 0, template => 'rdate' },
- { post => 'minage' , required => 0, default => -1, enum => [ keys %AGE_RATING ] },
- { post => 'notes', required => 0, default => '', maxlength => 10240 },
- { post => 'platforms', required => 0, default => '', multi => 1, enum => [ keys %PLATFORM ] },
- { post => 'media', required => 0, default => '' },
- { post => 'resolution',required => 0, default => 0, enum => [ keys %RESOLUTION ] },
- { post => 'voiced', required => 0, default => 0, enum => [ keys %VOICED ] },
- { post => 'ani_story', required => 0, default => 0, enum => [ keys %ANIMATED ] },
- { post => 'ani_ero', required => 0, default => 0, enum => [ keys %ANIMATED ] },
- { post => 'engine', required => 0, default => '', maxlength => 50 },
- { post => 'engine_oth',required => 0, default => '', maxlength => 50 },
- { post => 'producers', required => 0, default => '' },
- { post => 'vn', maxlength => 50000 },
- { post => 'editsum', template => 'editsum' },
- { post => 'ihid', required => 0 },
- { post => 'ilock', required => 0 },
- );
-
- $frm->{engine} = $frm->{engine_oth} if $frm->{engine} eq '_other_';
- delete $frm->{engine_oth};
-
- my $l_dmm = [ split /\s+/, $frm->{l_dmm} ];
- my $l_gyutto = [ split /\s+/, $frm->{l_gyutto} ];
-
- $frm->{original} = '' if $frm->{original} eq $frm->{title};
- $_ =~ s{^https?://}{} for @$l_dmm;
- $frm->{l_itch} =~ s{^https?://}{};
-
- push @{$frm->{_err}}, [ 'released', 'required', 1 ] if !$frm->{released};
-
- my($media, $producers, $new_vn);
- if(!$frm->{_err}) {
- # de-serialize
- $media = [ map [ split / / ], split /,/, $frm->{media} ];
- $producers = [ map { /^([0-9]+),([1-3])/ ? [ $1, $2&1?1:0, $2&2?1:0] : () } 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 uncensored ihid ilock|);
-
- # reset some fields when the patch flag is set
- if($frm->{patch}) {
- $frm->{doujin} = $frm->{voiced} = $frm->{ani_story} = $frm->{ani_ero} = 0;
- $frm->{resolution} = 'unknown';
- $frm->{engine} = '';
- }
- $frm->{uncensored} = 0 if $frm->{minage} != 18;
- $frm->{l_dmm} = join ' ', sort @$l_dmm;
- $frm->{l_gyutto} = join ' ', sort @$l_gyutto;
-
- my $same = $rid &&
- (join(',', sort @{$b4{platforms}}) eq join(',', sort @{$frm->{platforms}})) &&
- (join(',', map join(' ', @$_), sort { $a->[0] <=> $b->[0] } @$producers) eq join(',', map sprintf('%d %d %d',$_->{id}, $_->{developer}?1:0, $_->{publisher}?1:0), sort { $a->{id} <=> $b->{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} = [ "No changes, please don't create an entry that is fully identical to another" ] if $copy && $same;
- }
-
- if(!$frm->{_err}) {
- my $nrev = $self->dbItemEdit(r => !$copy && $rid ? ($r->{id}, $r->{rev}) : (undef, undef),
- (map { $_ => $frm->{$_} } qw| type title original gtin catalog languages website released minage
- l_steam l_dlsite l_dlsiteen l_gog l_denpa l_jlist l_digiket l_melon l_mg l_getchu l_getchudl l_itch l_jastusa l_egs l_erotrail
- notes platforms resolution editsum patch voiced freeware doujin uncensored ani_story ani_ero engine ihid ilock|),
- l_gyutto => $l_gyutto,
- l_dmm => $l_dmm,
- vn => $new_vn,
- producers => $producers,
- media => $media,
- );
-
- return $self->resRedirect("/r$nrev->{itemid}.$nrev->{rev}", 'post');
- }
- }
-
- !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 !$copy && $rev && !defined $frm->{editsum};
- $frm->{editsum} = sprintf 'New release based on r%d.%d', $rid, $r->{rev} if $copy && !defined $frm->{editsum};
- $frm->{title} = $v->{title} if !defined $frm->{title} && !$r;
- $frm->{original} = $v->{original} if !defined $frm->{original} && !$r;
-
- my $title = !$rid ? "Add release to $v->{title}" : $copy ? "Copy $r->{title}" : "Edit $r->{title}";
- $self->htmlHeader(title => $title, noindex => 1);
- $self->htmlMainTabs('r', $r, $copy ? 'copy' : 'edit') if $rid;
- $self->htmlMainTabs('v', $v, 'edit') if $vid;
- $self->htmlEditMessage('r', $r, $title, $copy);
- _listrel($self, $vid) if $vid && $self->reqMethod ne 'POST';
- _form($self, $r, $v, $frm, $copy);
- $self->htmlFooter;
-}
-
-
-sub _form {
- my($self, $r, $v, $frm, $copy) = @_;
-
- $self->htmlForm({ frm => $frm, action => $r ? "/old/r$r->{id}/".($copy ? 'copy' : 'edit') : "/old/v$v->{id}/add", editsum => 1 },
- rel_geninfo => [ 'General info',
- [ select => short => 'type', name => 'Type',
- options => [ map [ $_, $RELEASE_TYPE{$_} ], keys %RELEASE_TYPE ] ],
- [ check => short => 'patch', name => 'This release is a patch to another release.' ],
- [ check => short => 'freeware', name => 'Freeware (i.e. available at no cost)' ],
- [ check => short => 'doujin', name => 'Doujin (self-published, not by a company)' ],
- [ input => short => 'title', name => 'Title (romaji)', width => 450 ],
- [ input => short => 'original', name => 'Original title', width => 450 ],
- [ static => content => 'The original title of this release, leave blank if it already is in the Latin alphabet.' ],
- [ select => short => 'languages', name => 'Language(s)', multi => 1, size => 10,
- options => [ map [ $_, "$LANGUAGE{$_} ($_)" ], sort { $LANGUAGE{$a} cmp $LANGUAGE{$b} } keys %LANGUAGE ] ],
- [ input => short => 'gtin', name => 'JAN/UPC/EAN' ],
- [ input => short => 'catalog', name => 'Catalog number' ],
- [ input => short => 'website', name => 'Official website' ],
- [ date => short => 'released', name => 'Release date' ],
- [ static => content => 'Leave month or day blank if they are unknown' ],
- [ select => short => 'minage', name => 'Age rating',
- options => [ map [ $_, minage $_, 1 ], keys %AGE_RATING ] ],
- [ check => short => 'uncensored',name => 'No mosaic or other optical censoring (only check if this release has erotic content)' ],
-
- [ static => nolabel => 1, content => '<br><b>Links</b>' ],
- [ input => short => 'l_egs', name => 'ErogameScape', pre => 'erogamescape.dyndns.org/..?game=', width => 100 ],
- [ input => short => 'l_erotrail',name => 'ErogeTrailers', pre => 'erogetrailers.com/soft/', width => 100 ],
- [ input => short => 'l_steam', name => 'Steam AppID', pre => 'store.steampowered.com/app/', width => 100 ],
- [ input => short => 'l_jlist', name => 'J-List', pre => 'www.jlist.com/', post => ' (the last part of the URL, e.g. "np004")', width => 100 ],
- [ input => short => 'l_jastusa', name => 'JAST USA', pre => 'jastusa.com/' ],
- [ input => short => 'l_mg', name => 'MangaGamer', pre => 'mangagamer.com/..&product_code=', width => 100 ],
- [ input => short => 'l_denpa', name => 'Denpasoft', pre => 'denpasoft.com/products/' ],
- [ input => short => 'l_gog', name => 'GOG.com', pre => 'www.gog.com/game/' ],
- [ input => short => 'l_itch', name => 'Itch.io', post => ' (e.g. "author.itch.io/title")', width => 300 ],
- [ input => short => 'l_dlsiteen',name => 'DLsite (eng)', pre => 'www.dlsite.com/../product_id/', post => ' e.g. "RE083922"', width => 100 ],
- [ input => short => 'l_dlsite', name => 'DLsite (jpn)', pre => 'www.dlsite.com/../product_id/', post => ' e.g. "RJ083922"', width => 100 ],
- [ input => short => 'l_digiket', name => 'Digiket', pre => 'www.digiket.com/work/show/_data/ID=ITM', width => 100 ],
- [ input => short => 'l_gyutto', name => 'Gyutto', pre => 'gyutto.com/i/item', post => ' (item number, space separated)', width => 100 ],
- [ input => short => 'l_getchudl',name => 'DL.Getchu', pre => 'dl.getchu.com/i/item', post => ' (item number)', width => 100 ],
- [ input => short => 'l_getchu', name => 'Getchu', pre => 'www.getchu.com/soft.phtml?id=', width => 100 ],
- [ input => short => 'l_melon', name => 'Melonbooks.com', pre => 'www.melonbooks.com/..&products_id=IT', width => 100 ],
- [ input => short => 'l_dmm', name => 'DMM', post => ' (full URL, space separated)', width => 400 ],
-
- [ static => nolabel => 1, content => '<br>' ],
- [ textarea => short => 'notes', name => 'Notes<br /><b class="standout">English please!</b>' ],
- [ static => content =>
- 'Miscellaneous notes/comments, information that does not fit in the above fields.'
- .' E.g.: Types of censoring or for which releases this patch applies.' ],
- ],
-
- rel_format => [ 'Format',
- [ select => short => 'resolution', name => 'Resolution', options => [
- map [ $_, $RESOLUTION{$_}{txt}, $RESOLUTION{$_}{cat} ], keys %RESOLUTION ] ],
- [ static => label => 'Engine', content => sub {
- my $other = $frm->{engine} && !grep($_ eq $frm->{engine}, @{$self->{engines}});
- Select name => 'engine', id => 'engine', tabindex => 10;
- option value => $_, ($frm->{engine}||'') eq $_ ? (selected => 'selected') : (), $_ || 'Unknown'
- for ('', @{$self->{engines}});
- option value => '_other_', $other ? (selected => 'selected') : (), 'Other';
- end;
- input type => 'text', name => 'engine_oth', id => 'engine_oth', tabindex => 10, class => 'text '.($other ? '' : 'hidden'), value => $frm->{engine}||'';
- } ],
- [ static => content => 'Try to use a name from the <a href="/r/engines">engine list</a>.' ],
- [ select => short => 'voiced', name => 'Voiced', options => [
- map [ $_, $VOICED{$_}{txt} ], keys %VOICED ] ],
- [ select => short => 'ani_story', name => 'Story animation', options => [
- map [ $_, $ANIMATED{$_}{txt} ], keys %ANIMATED ] ],
- [ select => short => 'ani_ero', name => 'Ero animation', options => [
- map [ $_, $_ ? $ANIMATED{$_}{txt} : 'Unknown / no ero scenes' ], keys %ANIMATED ] ],
- [ static => content => 'Animation in erotic scenes, leave to unknown if there are no ero scenes.' ],
- [ hidden => short => 'media' ],
- [ static => nolabel => 1, content => sub {
- h2 'Platforms';
- div class => 'platforms';
- for my $p (sort keys %PLATFORM) {
- span;
- input type => 'checkbox', name => 'platforms', value => $p, id => $p,
- $frm->{platforms} && grep($_ eq $p, @{$frm->{platforms}}) ? (checked => 'checked') : ();
- label for => $p;
- cssicon $p, $PLATFORM{$p};
- txt ' '.$PLATFORM{$p};;
- end;
- end;
- }
- end;
-
- h2 'Media';
- div id => 'media_div', '';
- }],
- ],
-
- rel_prod => [ 'Producers',
- [ hidden => short => 'producers' ],
- [ static => nolabel => 1, content => sub {
- h2 'Selected producers';
- table; tbody id => 'producer_tbl'; end; end;
- h2 'Add producer';
- table; Tr;
- td class => 'tc_name'; input id => 'producer_input', type => 'text', class => 'text'; end;
- td class => 'tc_role'; Select id => 'producer_role';
- option value => 1, 'Developer';
- option value => 2, selected => 'selected', 'Publisher';
- option value => 3, 'Both';
- end; end;
- td class => 'tc_add'; a id => 'producer_add', href => '#', 'add'; end;
- end; end 'table';
- }],
- ],
-
- rel_vn => [ 'Visual novels',
- [ hidden => short => 'vn' ],
- [ static => nolabel => 1, content => sub {
- h2 'Selected visual novels';
- table class => 'stripe'; tbody id => 'vn_tbl'; end; end;
- h2 'Add visual novel';
- div;
- input id => 'vn_input', type => 'text', class => 'text';
- a href => '#', id => 'vn_add', 'add';
- end;
- }],
- ],
- );
-}
-
-sub _listrel {
- my($self, $vid) = @_;
- my $l = $self->dbReleaseGet(vid => $vid, hidden_only => 1, results => 50);
- return if !@$l;
- div class => 'mainbox';
- h1 'Deleted releases';
- div class => 'warning';
- p q{This visual novel has releases that have been deleted before. Please
- review this list to make sure you're not adding a release that has already
- been deleted before.};
- br;
- ul;
- for(@$l) {
- li;
- txt '['.join(',', @{$_->{languages}}).'] ';
- a href => "/r$_->{id}", title => $_->{original}||$_->{title}, "$_->{title} (r$_->{id})";
- end;
- }
- end;
- end;
- end;
-}
-
sub browse {
my $self = shift;
diff --git a/lib/VNWeb/HTML.pm b/lib/VNWeb/HTML.pm
index e63c5f3b..9ab7630d 100644
--- a/lib/VNWeb/HTML.pm
+++ b/lib/VNWeb/HTML.pm
@@ -817,13 +817,8 @@ sub editmsg_ {
}
li_ 'Fields marked with (*) may cause other fields to become (un)available depending on the selection.' if $type eq 'r';
}
- };
- p_ class => 'center', sub {
- txt_ "If you're having trouble using this new form, the ";
- a_ href => '/old'.tuwf->reqPath().tuwf->reqQuery(), 'old form';
- txt_ ' is still available.';
- } if $type eq 'r' && tuwf->reqPath() !~ m{^/old/};
- }
+ }
+ }
}
1;