]> mj.ucw.cz Git - pciids.git/blobdiff - PciIds/Html/Changes.pm
Discuss link below discussion
[pciids.git] / PciIds / Html / Changes.pm
index ff5242b126f8fc048554075aa30ae48e1db3f5e4..57473544d65015e33f36402dbb3d2d146a8173dd 100644 (file)
@@ -6,21 +6,22 @@ use PciIds::Html::Util;
 use PciIds::Html::Forms;
 use PciIds::Notifications;
 use PciIds::Log;
+use PciIds::Address;
 use Apache2::Const qw(:common :http);
 
-sub genNewItemForm( $$$$$ ) {
-       my( $req, $args, $tables, $error, $values ) = @_;
-       my( $ok, $parent, $name, $description, $address ) = loadItem( $tables, $req->uri() );
+sub genNewItemForm( $$$$$$ ) {
+       my( $req, $args, $auth, $tables, $error, $values ) = @_;
+       my( $ok, $parent, $name, $note, $address ) = loadItem( $tables, $req->uri() );
        return NOT_FOUND unless( $ok );
        my $prettyAddr = encode( $address->pretty() );
        genHtmlHead( $req, "$prettyAddr - add new item", undef );
-       print "<h1>$prettyAddr - add new item</h1>\n";
+       genCustomHead( $req, $args, $address, "$prettyAddr - add new item", [ $address->canDiscuss() ? [ 'Discuss', 'newhistory' ] : (), [ 'Help', 'help', 'newitem' ], [ 'ID syntax', 'help', $address->helpName() ] ], [ logItem( $auth ), [ 'Notifications', 'notifications' ] ] );
        print "<div class='error'>$error</div>\n" if( defined $error );
-       print "<form name='newitem' id='newitem' method='POST' action='".setAddrPrefix( $req->uri(), "mods" ).buildExcept( 'action', $args )."?action=newitem'>\n<table>";
+       print "<form name='newitem' id='newitem' method='POST' action='".( $args->{'full_links'} ? 'http://'.$req->hostname().$req->uri().buildExcept( 'action', $args ).'?action=newitem' : '' )."'>\n<table>";
        genFormEx( [ [ 'input', 'Id:', 'text', 'id', 'maxlength="50"' ],
                [ 'input', 'Name:', 'text', 'name', 'maxlength="200"' ],
-               [ 'input', 'Description*:', 'text', 'description', 'maxlength="1024"' ],
-               [ 'textarea', 'Text*:', undef, 'text', 'rows="5" cols="50"' ],
+               [ 'input', 'Note*:', 'text', 'note', 'maxlength="1024"' ],
+               [ 'textarea', 'Discussion*:', undef, 'discussion', 'rows="5" cols="50"' ],
                [ 'input', '', 'submit', 'submit', 'value="Submit"' ] ], $values );
        print '</table></form>';
        print '<p>Items marked with * are optional.';
@@ -31,7 +32,7 @@ sub genNewItemForm( $$$$$ ) {
 sub newItemForm( $$$$ ) {
        my( $req, $args, $tables, $auth ) = @_;
        if( defined $auth->{'authid'} ) {#Logged in alright
-               return genNewItemForm( $req, $args, $tables, undef, {} );
+               return genNewItemForm( $req, $args, $auth, $tables, undef, {} );
        } else {
                return notLoggedComplaint( $req, $args, $auth );
        }
@@ -40,7 +41,7 @@ sub newItemForm( $$$$ ) {
 sub newItemSubmit( $$$$ ) {
        my( $req, $args, $tables, $auth ) = @_;
        if( defined $auth->{'authid'} ) {
-               my( $pok, $parent, $pname, $pdescription, $paddress ) = loadItem( $tables, $req->uri() );
+               my( $pok, $parent, $pname, $pnote, $paddress ) = loadItem( $tables, $req->uri() );
                return NOT_FOUND unless( $pok );
                my( $data, $error ) = getForm( {
                        'id' => sub{ return ( length shift ) ? undef : 'Please, provide the ID'; }, #Checked at the bottom and added as address
@@ -50,83 +51,95 @@ sub newItemSubmit( $$$$ ) {
                                return 'Lenght limit of the name is 200 characters' if( length $name > 200 );
                                return undef;
                        },
-                       'description' => sub { return ( length shift > 1024 ) ? 'Description can not be longer than 1024 characters' : undef; },
-                       'text' => sub { return ( length shift > 1024 ) ? 'Text can not be longer than 1024 characters' : undef; }
+                       'note' => sub { return ( length shift > 1024 ) ? 'Note can not be longer than 1024 characters' : undef; },
+                       'discussion' => sub { return ( length shift > 1024 ) ? 'Discussion can not be longer than 1024 characters' : undef; }
                }, [ sub { my( $data ) = @_;
                        my $errstr;
                        return undef unless( length $data->{'id'} );#No address, so let it for the first check
                        ( $data->{'address'}, $errstr ) = $paddress->append( $data->{'id'} );
                        return $errstr;
                }, sub { return $paddress->canAddItem() ? undef : 'Can not add items here'; } ] );
-               return genNewItemForm( $req, $args, $tables, $error, $data ) if( defined $error );
+               return genNewItemForm( $req, $args, $auth, $tables, $error, $data ) if( defined $error );
                my( $result, $comName ) = $tables->submitItem( $data, $auth );
                if( $result eq 'exists' ) {
                        genHtmlHead( $req, 'ID collision', undef );
-                       print '<h1>ID collision</h1>';
-                       print '<p>This ID already exists. Have a look <a href="/read/'.$data->{'address'}->get().'?action=list">at it</a>';
+                       my $addr = PciIds::Address::new( $req->uri() );
+                       genCustomHead( $req, $args, $addr, 'ID collision', [ [ 'Add other item', 'newitem' ], $addr->canDiscuss() ? [ 'Discuss', 'newhistory' ] : () ], [ logItem( $auth ) ] );
+                       print '<p>Sorry, this ID already exists.';
                        genHtmlTail();
                        return OK;
                } elsif( $result ) {
-                       die "Failed to submit new item: $result\n";
+                       return genNewItemForm( $req, $args, $auth, $tables, $result, $data );
                }
                notify( $tables, $data->{'address'}->get(), $comName, 2, 0 );
-               tulog( $auth->{'authid'}, "Item created ".$data->{'address'}->get()." ".logEscape( $data->{'name'} )." ".logEscape( $data->{'description'} )." ".logEscape( $data->{'text'} )." $comName" );
+               tulog( $auth->{'authid'}, "Item created ".$data->{'address'}->get()." ".logEscape( $data->{'name'} )." ".logEscape( $data->{'note'} )." ".logEscape( $data->{'discussion'} )." $comName" );
                return HTTPRedirect( $req, '/read/'.$data->{'address'}->get().'?action=list' );
        } else {
                return notLoggedComplaint( $req, $args, $auth );
        }
 }
 
-sub genNewCommentForm( $$$$$ ) {
-       my( $req, $args, $tables, $error, $values ) = @_;
-       my( $ok, $parent, $name, $description, $address ) = loadItem( $tables, $req->uri() );
+sub genNewHistoryForm( $$$$$$ ) {
+       my( $req, $args, $tables, $auth, $error, $values ) = @_;
+       my( $ok, $parent, $name, $note, $address ) = loadItem( $tables, $req->uri() );
        return NOT_FOUND unless( $ok );
        my $prettyAddr = encode( $address->pretty() );
-       genHtmlHead( $req, "$prettyAddr - add a comment to discussion", undef );
-       print "<h1>$prettyAddr - add a comment to discussion</h1>\n";
+       genHtmlHead( $req, "$prettyAddr - discuss", undef );
+       genCustomHead( $req, $args, $address, "$prettyAddr - discuss", [ $address->canAddItem() ? [ 'Add item', 'newitem' ] : (), [ 'Help', 'help', 'newhistory' ] ], [ logItem( $auth ),  [ 'Notifications', 'notifications' ] ] );
        print "<div class='error'>$error</div>\n" if( defined $error );
-       print "<form name='newcomment' id='newitem' method='POST' action='".setAddrPrefix( $req->uri(), "mods" ).buildExcept( 'action', $args )."?action=newcomment'>\n<table>";
+       print "<form name='newhistory' id='newhistory' method='POST' action='".( $args->{'full_links'} ? 'http://'.$req->hostname().$req->uri().buildExcept( 'action', $args ).'?action=newhistory' : '' )."'>\n<table>";
        genFormEx( [ [ 'textarea', 'Text:', undef, 'text', 'rows="5" cols="50"' ],
-               [ 'input', 'Name*:', 'text', 'name', 'maxlength="200"' ],
-               [ 'input', 'Description*:', 'text', 'description', 'maxlength="1024"' ],
+               [ 'input', 'Request deletion', 'checkbox', 'delete', 'value="delete"' ],
+               [ 'input', 'Name:', 'text', 'name', 'maxlength="200"' ],
+               [ 'input', 'Note:', 'text', 'note', 'maxlength="1024"' ],
                [ 'input', '', 'submit', 'submit', 'value="Submit"' ] ], $values );
        print '</table></form>';
-       print '<p>Items marked with * are optional, use them only if you want to change the name and description.';
-       print '<p>If you specify description must include name too.';
        genHtmlTail();
        return OK;
 }
 
-sub newCommentForm( $$$$ ) {
+sub newHistoryForm( $$$$ ) {
        my( $req, $args, $tables, $auth ) = @_;
        if( defined $auth->{'authid'} ) {
-               return genNewCommentForm( $req, $args, $tables, undef, {} );
+               return genNewHistoryForm( $req, $args, $tables, $auth, undef, {} );
        } else {
                return notLoggedComplaint( $req, $args, $auth );
        }
 }
 
-sub newCommentSubmit( $$$$ ) {
+sub newHistorySubmit( $$$$ ) {
        my( $req, $args, $tables, $auth ) = @_;
        if( defined $auth->{'authid'} ) {
-               my( $ok, $parent, $name, $description, $address ) = loadItem( $tables, $req->uri() );
+               my( $ok, $parent, $name, $note, $address ) = loadItem( $tables, $req->uri() );
                return NOT_FOUND unless( $ok );
                my( $data, $error ) = getForm( {
                        'name' => sub { return ( length shift > 200 ) ? 'Lenght limit of the name is 200 characters' : undef; },
-                       'description' => sub { return ( length shift > 1024 ) ? 'Description can not be longer than 1024 characters' : undef; },
+                       'note' => sub { return ( length shift > 1024 ) ? 'Note can not be longer than 1024 characters' : undef; },
                        'text' => sub {
                                my( $expl ) = @_;
                                return 'Text can not be longer than 1024 characters' if ( length $expl > 1024 );
-                               return 'You must provide the text of comment' unless( length $expl );
+                               return undef;
+                       },
+                       'delete' => sub {
+                               my( $delete ) = @_;
+                               return ( undef, '0' ) unless defined $delete;
+                               return undef if $delete eq 'delete';
+                               return 'Invalid form value';
                                return undef;
                        }
                }, [ sub { my( $data ) = @_;
-                       return 'You must provide name too' if( ( length $data->{'description'} ) && ( ! length $data->{'name'} ) );
+                       return 'You must provide either name, text or request a deletion' if( ! length $data->{'name'} && ! length $data->{'text'} && ! $data->{'delete'} );
+                       return undef;
+               }, sub { my( $data ) = @_;
+                       return 'You can not set name and request deletion at the same time' if( length $data->{'name'} && $data->{'delete'} );
+                       return undef;
+               }, sub { my( $data ) = @_;
+                       return 'You must provide name too' if( ( length $data->{'note'} ) && ( ! length $data->{'name'} ) );
                        return undef;
-               }, sub { return $address->canAddComment() ? undef : 'You can not discuss this item'; } ] );
-               return genNewCommentForm( $req, $args, $tables, $error, $data ) if( defined $error );
-               my $hid = $tables->submitComment( $data, $auth, $address );
-               tulog( $auth->{'authid'}, "Comment created $hid ".$address->get()." ".logEscape( $data->{'name'} )." ".logEscape( $data->{'description'} )." ".logEscape( $data->{'text'} ) );
+               }, sub { return $address->canDiscuss() ? undef : 'You can not discuss this item'; } ] );
+               return genNewHistoryForm( $req, $args, $tables, $auth, $error, $data ) if( defined $error );
+               my $hid = $tables->submitHistory( $data, $auth, $address );
+               tulog( $auth->{'authid'}, "Discussion created $hid ".$address->get()." ".logEscape( $data->{'name'} )." ".logEscape( $data->{'description'} )." ".logEscape( $data->{'text'} ) );
                notify( $tables, $address->get(), $hid, ( defined $name && ( $name ne '' ) ) ? 1 : 0, 1 );
                return HTTPRedirect( $req, '/read/'.$address->get().'?action=list' );
        } else {