Committer: gprochaev
LJSUP-7455. Add ability to add/remove sub-category, sub-sub-categoryU trunk/bin/upgrading/en.dat U trunk/cgi-bin/LJ/Browse.pm U trunk/cgi-bin/LJ/Vertical.pm U trunk/htdocs/admin/browse/add_category.bml U trunk/htdocs/admin/browse/add_community.bml U trunk/htdocs/admin/browse/edit_community.bml U trunk/htdocs/admin/browse/remove_category.bml U trunk/htdocs/admin/browse/remove_community.bml
Modified: trunk/bin/upgrading/en.dat =================================================================== --- trunk/bin/upgrading/en.dat 2010-12-10 07:32:48 UTC (rev 17897) +++ trunk/bin/upgrading/en.dat 2010-12-10 08:26:09 UTC (rev 17898) @@ -4570,6 +4570,8 @@ vertical.nav.explore.technology|staleness=1 vertical.nav.explore.technology=Technology +vertical.admin.add_category.btn=Add Category + vgift..anon= vgift..fromuser= Modified: trunk/cgi-bin/LJ/Browse.pm =================================================================== --- trunk/cgi-bin/LJ/Browse.pm 2010-12-10 07:32:48 UTC (rev 17897) +++ trunk/cgi-bin/LJ/Browse.pm 2010-12-10 08:26:09 UTC (rev 17898) @@ -127,6 +127,7 @@ } $self = $class->new( catid => $catid ); + $self->clear_memcache; return $self; } @@ -535,6 +536,7 @@ LJ::MemCache::delete($self->memkey_catid); LJ::MemCache::delete($self->memkey_caturi($uri)); + LJ::MemCache::delete($self->memkey_catall(vertical => $self->vertical ? $self->vertical : undef)); return; } @@ -1079,6 +1081,61 @@ return 1; } +## Return "path" for selected category +## catobj -> par_catobj -> par_par_catobj -> etc... (array) +## Param: arrayref to save "path" +sub get_parent_path { + my $c = shift; + my $cat_path = shift; + + my $parent = $c->parent; + + push @$cat_path, $c; + + return 0 unless $parent; + + return $parent->get_parent_path ($cat_path); +} + +sub build_select_tree { + my ($class, $parent, $cats_ref, $selected_cat, $text, $i, $n) = @_; + + $i ||= 0; + + return $text unless $cats_ref; + + my @categories = @$cats_ref; + @categories = grep { ($_->parent == $parent) } grep { $_ } @categories; + + return $text unless scalar @categories; + + my @path_ = (); + $selected_cat->get_parent_path (\@path_) if $selected_cat; + my %path = map { $_->catid => 1 } @path_; + my @sel_cat = grep { $path{$_->catid} } @categories; + + my @caturls = map { { text => $_->{pretty_name}, value => $_->catid } } @categories; + @caturls = sort { $a->{text} cmp $b->{text} } @caturls; + + $text .= "<tr><td>Category</td>"; + $text .= "<td>" . LJ::html_select({ + name => "catid$i\_$n", style => "width:100%;", + selected => $sel_cat[0] ? $sel_cat[0]->catid : '' }, + { text => LJ::Lang::ml('vertical.admin.add_category.btn'), + value => '' }, + @caturls + ) . "</td>"; + $text .= "<td>" . LJ::html_submit('select_c', 'Select Category') . "</td>"; + $text .= "</tr>"; + + if ($sel_cat[0]) { + my @children = $sel_cat[0]->children; + $text = $class->build_select_tree($sel_cat[0], \@children, $selected_cat, $text, ++$i, $n); + } + + return $text; +} + # get the typemap for categoryprop sub typemap { my $self = shift; Modified: trunk/cgi-bin/LJ/Vertical.pm =================================================================== --- trunk/cgi-bin/LJ/Vertical.pm 2010-12-10 07:32:48 UTC (rev 17897) +++ trunk/cgi-bin/LJ/Vertical.pm 2010-12-10 08:26:09 UTC (rev 17898) @@ -453,7 +453,7 @@ my $v = $class->new( vert_id => shift ); $v->preload_rows; - return $v; + return $v->vert_id ? $v : undef; } # returns a vertical object of the vertical with the given name, Modified: trunk/htdocs/admin/browse/add_category.bml =================================================================== --- trunk/htdocs/admin/browse/add_category.bml 2010-12-10 07:32:48 UTC (rev 17897) +++ trunk/htdocs/admin/browse/add_category.bml 2010-12-10 08:26:09 UTC (rev 17898) @@ -20,15 +20,19 @@ my $parentcaturl; my $newcat; my $newcaturl; - my $vert_url; + my $vert_id; + my @ids = sort { $b cmp $a } grep { $_ =~ /^catid\d+\_0$/ } keys %POST; + my $cat_id = $POST{$ids[0]}; + my $category = $cat_id ? LJ::Browse->load_by_id ($cat_id) : undef; + if (LJ::did_post() and $POST{'add'}) { $parentcaturl = $POST{'parentcaturl'}; $newcat = $POST{'newcat'}; $newcaturl = $POST{'newcaturl'}; - $vert_url = $POST{'vert_url_add'}; + $vert_id = $POST{'vert_id_add'} + 0; - my $vertical = LJ::Vertical->load_by_url("/vertical" . $vert_url); + my $vertical = LJ::Vertical->load_by_id($vert_id); push @errors, "Invalid form submission" unless LJ::check_form_auth(); { @@ -78,38 +82,39 @@ $ret .= "<p>"; my $vertical = undef; - if (LJ::did_post() && $POST{'select'}) { - $vert_url = $POST{'vert_url'}; - $vertical = LJ::Vertical->load_by_url("/vertical" . $vert_url); + if (LJ::did_post()) { + $vert_id = $POST{'vert_id'} + 0; + $vertical = LJ::Vertical->load_by_id($vert_id); } + $ret .= "<table>"; my @verticals = LJ::Vertical->load_all(); - @verticals = map { { text => $_->{name}, value => $_->{url} } } @verticals; + if (!$LJ::DISABLED{'verticals_menu'}) { + $ret .= "<tr><td valign='top'><!-- -->Vertical</td>"; + @verticals = map { { text => $_->{name}, value => $_->{vert_id} } } @verticals; - $ret .= "<p>".LJ::html_select({ - name => 'vert_url', - selected => $vert_url, - }, - { text => 'Community Directory', - value => '',}, - @verticals - ); - $ret .= " \n"; + $ret .= "<td>".LJ::html_select({ + name => "vert_id", style => "", + selected => $vertical ? $vertical->vert_id : 0, + }, + { text => 'Community Directory', + value => '',}, + @verticals + ); + $ret .= "</td><td>\n"; - $ret .= LJ::html_submit('select', 'Select Vertical') . "</p>"; + $ret .= LJ::html_submit('select', 'Select Vertical') . "</td></tr>"; + } + my @children = $category ? $category->children : (); # Get the full list of categories my @categories = LJ::Browse->load_all($vertical); - my @caturls = map { { text => $_->{pretty_name}, value => $_->url_path } } @categories; - $ret .= "<p>"; - $ret .= LJ::html_select({ - name => 'parentcaturl', - selected => $parentcaturl }, - { text => 'Select Category', - value => '' }, - @caturls - ); + $ret .= LJ::Browse->build_select_tree (0, \@categories, $category, undef, undef, 0); + if ($category) { + $ret .= "<tr><td colspan='2'>New category will be add in '".$category->display_name."'</td></tr>"; + } + $ret .= "</table>\n"; $ret .= "</p>\n"; $ret .= "<h2>New Category Details</h2>"; @@ -135,7 +140,8 @@ $ret .= "<p>" . LJ::html_submit('add', 'Add') . "</p>"; - $ret .= LJ::html_hidden("vert_url_add", $vertical ? $vertical->uri : ''); + $ret .= LJ::html_hidden("vert_id_add", $vertical ? $vertical->vert_id : ''); + $ret .= LJ::html_hidden("parentcaturl", $category->url_path) if $category; $ret .= "</form>"; $ret .= "<p><a href='/admin/browse/'>Back to main page</a></p>"; Modified: trunk/htdocs/admin/browse/add_community.bml =================================================================== --- trunk/htdocs/admin/browse/add_community.bml 2010-12-10 07:32:48 UTC (rev 17897) +++ trunk/htdocs/admin/browse/add_community.bml 2010-12-10 08:26:09 UTC (rev 17898) @@ -18,20 +18,27 @@ my $ret = ""; my $caturl = $POST{'caturl'}; - my $vert_url = $POST{'vert_url'}; + my $vert_id = $POST{'vert_id'}; my $journal = $POST{'journal'}; my $tags = $POST{'tags'}; + my @ids = sort { $b cmp $a } grep { $_ =~ /^catid\d+\_0$/ } keys %POST; + my $cat_id = $POST{$ids[0]}; + my $category = $cat_id ? LJ::Browse->load_by_id ($cat_id) : undef; + my $vertical = undef; - if (LJ::did_post() && $vert_url) { - $vertical = LJ::Vertical->load_by_url ("/vertical" . $vert_url); + if (LJ::did_post() && $vert_id) { + $vertical = LJ::Vertical->load_by_id ($vert_id); } if (LJ::did_post() and $POST{'add'}) { + my @ids = sort { $b cmp $a } grep { $_ =~ /^catid\d+\_0$/ && $POST{$_} } keys %POST; + my $cat_id = $POST{$ids[0]}; + push @errors, "Invalid form submission" unless LJ::check_form_auth(); { # Check for required data - unless ($caturl) { + unless ($cat_id) { push @errors, "Please select a category"; next; } @@ -41,7 +48,7 @@ } # Has a valid category been chosen - my $category = LJ::Browse->load_by_url("/browse" . $caturl, $vertical); + my $category = LJ::Browse->load_by_id($cat_id); push @errors, "Invalid category" unless $category; # Extract usernames and get userids @@ -65,53 +72,54 @@ $ret .= "<form method='POST'>\n"; $ret .= LJ::form_auth(); + $ret .= "<p>"; + $ret .= "<table>"; my @verticals = LJ::Vertical->load_all(); - @verticals = map { { text => $_->{name}, value => $_->{url} } } @verticals; + if (!$LJ::DISABLED{'verticals_menu'}) { + $ret .= "<tr><td valign='top'><!-- -->Vertical</td>"; + @verticals = map { { text => $_->{name}, value => $_->{vert_id} } } @verticals; - $ret .= "<p>".LJ::html_select({ - name => 'vert_url', - selected => $vert_url, - }, - { text => 'Community Directory', - value => '',}, - @verticals - ); - $ret .= " \n"; + $ret .= "<td>".LJ::html_select({ + name => "vert_id", style => "", + selected => $vertical ? $vertical->vert_id : 0, + }, + { text => 'Community Directory', + value => '',}, + @verticals + ); + $ret .= "</td><td>\n"; - $ret .= LJ::html_submit('select', 'Select Vertical') . "</p>"; + $ret .= LJ::html_submit('select', 'Select Vertical') . "</td></tr>"; + } + my @children = $category ? $category->children : (); # Get the full list of categories my @categories = LJ::Browse->load_all($vertical); - # Don't include the top level categories and get the unique URI for each - @categories = grep { $_->{parentcatid} } @categories unless $vertical; - my @caturls = map { { text => $_->{pretty_name}, value => $_->url_path } } @categories; - @caturls = sort { $a cmp $b } @caturls; - $ret .= "<p>Add to Category:<br />"; - $ret .= LJ::html_select({ - name => 'caturl', - selected => $caturl }, - { text => 'Select Category', - value => '' }, - @caturls - ); + $ret .= LJ::Browse->build_select_tree (0, \@categories, $category, undef, undef, 0); + if ($category) { + $ret .= "<tr><td colspan='2'>New community will be add in '".$category->display_name."'</td></tr>"; + } + $ret .= "</table>\n"; $ret .= "</p>\n"; - $ret .= "<p>the following journal:<br />"; - $ret .= LJ::html_text( { - name => 'journal', - size => 40, - } - ); + if ($category) { + $ret .= "<p>the following journal:<br />"; + $ret .= LJ::html_text( { + name => 'journal', + size => 40, + } + ); - $ret .= "<p>with tags:<br />"; - $ret .= LJ::html_text( { - name => 'tags', - size => 60, - } - ); + $ret .= "<p>with tags:<br />"; + $ret .= LJ::html_text( { + name => 'tags', + size => 60, + } + ); - $ret .= "<p>" . LJ::html_submit('add', 'Add') . "</p>"; + $ret .= "<p>" . LJ::html_submit('add', 'Add') . "</p>"; + } $ret .= "</form>"; $ret .= "<p><a href='/admin/browse/'>Back to main page</a></p>"; Modified: trunk/htdocs/admin/browse/edit_community.bml =================================================================== --- trunk/htdocs/admin/browse/edit_community.bml 2010-12-10 07:32:48 UTC (rev 17897) +++ trunk/htdocs/admin/browse/edit_community.bml 2010-12-10 08:26:09 UTC (rev 17898) @@ -9,62 +9,8 @@ return "This page is not available." unless LJ::is_enabled("browse"); - my $ret; + my $ret = ''; -sub get_parent_path { - my $cat_path = shift; - my $c = shift; - - return undef unless $c; - - my $parent = $c->parent; - - push @$cat_path, $c; - - return 0 unless $parent; - - return get_parent_path ($cat_path, $c->parent); -} - -sub _build_tree { - my ($parent, $cats_ref, $selected_cat, $text, $i, $n) = @_; - - $i ||= 0; - - return $text unless $cats_ref; - - my @categories = @$cats_ref; - @categories = grep { ($_->parent == $parent) } grep { $_ } @categories; - - return $text unless scalar @categories; - - my @path_ = (); - get_parent_path (\@path_, $selected_cat); - my %path = map { $_->catid => 1 } @path_; - my @sel_cat = grep { $path{$_->catid} } @categories; - - my @caturls = map { { text => $_->{pretty_name}, value => $_->catid } } @categories; - @caturls = sort { $a->{text} cmp $b->{text} } @caturls; - - $text .= "<tr><td>Category</td>"; - $text .= "<td>" . LJ::html_select({ - name => "catid$i\_$n", style => "width:100%;", - selected => $sel_cat[0] ? $sel_cat[0]->catid : '' }, - { text => $ML{'.add'}, - value => '' }, - @caturls - ) . "</td>"; - $text .= "<td>" . LJ::html_submit('select_c', 'Select Category') . "</td>"; - $text .= "</tr>"; - - if ($sel_cat[0]) { - my @children = $sel_cat[0]->children; - $text = _build_tree($sel_cat[0], \@children, $selected_cat, $text, ++$i, $n); - } - - return $text; -} - # get remote my $remote = LJ::get_remote(); unless ($remote) { @@ -134,7 +80,7 @@ # Get the full list of categories my @categories = LJ::Browse->load_all($vert_[$j]); - $ret .= _build_tree (0, \@categories, $cat_[$j], undef, undef, $i); + $ret .= LJ::Browse->build_select_tree (0, \@categories, $cat_[$j], undef, undef, $i); if ($cat_[$j]) { $ret .= "<tr><td valign='top'>Communities from category:</td><tr><td colspan='3'>"; if ($cat_[$j]->communities) { Modified: trunk/htdocs/admin/browse/remove_category.bml =================================================================== --- trunk/htdocs/admin/browse/remove_category.bml 2010-12-10 07:32:48 UTC (rev 17897) +++ trunk/htdocs/admin/browse/remove_category.bml 2010-12-10 08:26:09 UTC (rev 17898) @@ -18,26 +18,31 @@ my $ret = ""; my $caturl; - my $vert_url = $POST{'vert_url'}; + my $vert_id = $POST{'vert_id'}; + my @ids = sort { $b cmp $a } grep { $_ =~ /^catid\d+\_0$/ } keys %POST; + my $cat_id = $POST{$ids[0]}; + my $category = $cat_id ? LJ::Browse->load_by_id ($cat_id) : undef; + my $vertical = undef; - if (LJ::did_post() && $POST{'vert_url'}) { - $vertical = LJ::Vertical->load_by_url("/vertical" . $vert_url); + if (LJ::did_post() && $POST{'vert_id'}) { + $vertical = LJ::Vertical->load_by_id($vert_id); } if (LJ::did_post() and $POST{'remove'}) { - $caturl = $POST{'caturl'}; + my @ids = sort { $b cmp $a } grep { $_ =~ /^catid\d+\_0$/ && $POST{$_} } keys %POST; + my $cat_id = $POST{$ids[0]}; push @errors, "Invalid form submission" unless LJ::check_form_auth(); { # Check for required data - unless ($caturl) { + unless ($cat_id) { push @errors, "Please select a category to remove"; next; } # Has a valid category been chosen - my $category = LJ::Browse->load_by_url("/browse" . $caturl, $vertical); + my $category = LJ::Browse->load_by_id($cat_id); push @errors, "Invalid category" unless $category; my @children = $category->children; @@ -64,37 +69,37 @@ my @verticals = LJ::Vertical->load_all(); @verticals = map { { text => $_->{name}, value => $_->{url} } } @verticals; - $ret .= "<p>".LJ::html_select({ - name => 'vert_url', - selected => $vert_url, - }, - { text => 'Community Directory', - value => '',}, - @verticals - ); - $ret .= " \n"; + $ret .= "<p>"; + $ret .= "<table>"; + my @verticals = LJ::Vertical->load_all(); + if (!$LJ::DISABLED{'verticals_menu'}) { + $ret .= "<tr><td valign='top'><!-- -->Vertical</td>"; + @verticals = map { { text => $_->{name}, value => $_->{vert_id} } } @verticals; - $ret .= LJ::html_submit('selectv', 'Select Vertical') . "</p>"; + $ret .= "<td>".LJ::html_select({ + name => "vert_id", style => "", + selected => $vertical ? $vertical->vert_id : 0, + }, + { text => 'Community Directory', + value => '',}, + @verticals + ); + $ret .= "</td><td>\n"; + $ret .= LJ::html_submit('select', 'Select Vertical') . "</td></tr>"; + } + + my @children = $category ? $category->children : (); # Get the full list of categories my @categories = LJ::Browse->load_all($vertical); - # Get the unique URI for each - #@categories = grep { $_->parent } @categories unless $vertical; - my @caturls = map { { text => $_->{pretty_name}, value => $_->url_path } } @categories; - @caturls = sort { $a cmp $b } @caturls; - $ret .= "<p>Remove Category:<br />"; - $ret .= LJ::html_select({ - name => 'caturl', - selected => $caturl }, - { text => 'Select Category', - value => '' }, - @caturls - ); + $ret .= LJ::Browse->build_select_tree (0, \@categories, $category, undef, undef, 0); + if ($category) { + $ret .= "<tr><td colspan='2'>Selected category: ".$category->display_name."</td></tr>"; + } + $ret .= "</table>\n"; $ret .= "</p>\n"; - $ret .= "</table></p>\n"; - $ret .= "<p>" . LJ::html_submit('remove', 'Remove') . "</p>"; $ret .= "</form>"; Modified: trunk/htdocs/admin/browse/remove_community.bml =================================================================== --- trunk/htdocs/admin/browse/remove_community.bml 2010-12-10 07:32:48 UTC (rev 17897) +++ trunk/htdocs/admin/browse/remove_community.bml 2010-12-10 08:26:09 UTC (rev 17898) @@ -24,19 +24,26 @@ my $ret = ""; my $caturl = $POST{'caturl'}; - my $vert_url = $POST{'vert_url'}; + my $vert_id = $POST{'vert_id'}; my $journals = $POST{'journals'}; + my @ids = sort { $b cmp $a } grep { $_ =~ /^catid\d+\_0$/ } keys %POST; + my $cat_id = $POST{$ids[0]}; + my $category = $cat_id ? LJ::Browse->load_by_id ($cat_id) : undef; + my $vertical = undef; - if (LJ::did_post() && $POST{'vert_url'}) { - $vertical = LJ::Vertical->load_by_url("/vertical" . $vert_url); + if (LJ::did_post() && $POST{'vert_id'}) { + $vertical = LJ::Vertical->load_by_id($vert_id); } if (LJ::did_post() and $POST{'remove'}) { + my @ids = sort { $b cmp $a } grep { $_ =~ /^catid\d+\_0$/ && $POST{$_} } keys %POST; + my $cat_id = $POST{$ids[0]}; + push @errors, "Invalid form submission" unless LJ::check_form_auth(); { # Check for required data - unless ($caturl) { + unless ($cat_id) { push @errors, "Please select a category"; next; } @@ -46,7 +53,7 @@ } # Has a valid category been chosen - my $category = LJ::Browse->load_by_url("/browse" . $caturl, $vertical); + my $category = LJ::Browse->load_by_id($cat_id); push @errors, "Invalid category" unless $category; # Extract usernames and get userids @@ -78,43 +85,38 @@ $ret .= "<form method='POST'>\n"; $ret .= LJ::form_auth(); + $ret .= "<p>"; + $ret .= "<table>"; my @verticals = LJ::Vertical->load_all(); - @verticals = map { { text => $_->{name}, value => $_->{url} } } @verticals; + if (!$LJ::DISABLED{'verticals_menu'}) { + $ret .= "<tr><td valign='top'><!-- -->Vertical</td>"; + @verticals = map { { text => $_->{name}, value => $_->{vert_id} } } @verticals; - $ret .= "<p>".LJ::html_select({ - name => 'vert_url', - selected => $vert_url, - }, - { text => 'Community Directory', - value => '',}, - @verticals - ); - $ret .= " \n"; + $ret .= "<td>".LJ::html_select({ + name => "vert_id", style => "", + selected => $vertical ? $vertical->vert_id : 0, + }, + { text => 'Community Directory', + value => '',}, + @verticals + ); + $ret .= "</td><td>\n"; - $ret .= LJ::html_submit('selectv', 'Select Vertical') . "</p>"; + $ret .= LJ::html_submit('select', 'Select Vertical') . "</td></tr>"; + } + my @children = $category ? $category->children : (); # Get the full list of categories my @categories = LJ::Browse->load_all($vertical); - # Don't include the top level categories and get the unique URI for each - @categories = grep { $_->parent } @categories unless $vertical; - my @caturls = map { { text => $_->{pretty_name}, value => $_->url_path } } @categories; - @caturls = sort { $a cmp $b } @caturls; - $ret .= "<p>Remove from Category:<br />"; - $ret .= LJ::html_select({ - name => 'caturl', - selected => $caturl }, - { text => 'Select Category', - value => '' }, - @caturls - ); - $ret .= "\n"; - $ret .= LJ::html_submit('select', 'Select Category') . "</p>"; + $ret .= LJ::Browse->build_select_tree (0, \@categories, $category, undef, undef, 0); + $ret .= "</table>\n"; + $ret .= "</p>\n"; # Selected a category OR tried a remove and got an error - if ( LJ::did_post() && $POST{'select'} ) { + if ( LJ::did_post() && $category ) { # Has a valid category been chosen - my $category = LJ::Browse->load_by_url("/browse" . $caturl, $vertical); + my $category = LJ::Browse->load_by_id($cat_id); push @errors, "Invalid category" unless $category; if ($category) {