diff options
-rw-r--r-- | data/js/main.js | 5 | ||||
-rw-r--r-- | data/js/relmedia.js | 68 | ||||
-rw-r--r-- | data/js/relprod.js | 105 | ||||
-rw-r--r-- | data/js/relvns.js | 88 | ||||
-rw-r--r-- | data/style.css | 19 | ||||
-rw-r--r-- | lib/VNDB/DB/Misc.pm | 1 | ||||
-rw-r--r-- | lib/VNDB/DB/Releases.pm | 49 | ||||
-rw-r--r-- | lib/VNDB/Handler/Releases.pm | 321 | ||||
-rw-r--r-- | lib/VNWeb/HTML.pm | 9 |
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; |