[dw-free] Make editgroups.bml work
[commit: http://hg.dwscoalition.org/dw-free/rev/65640a046783]
http://bugs.dwscoalition.org/show_bug.cgi?id=289
Move editgroups to editfilters. Also update to work with WTF system.
Patch by
janinedog.
http://bugs.dwscoalition.org/show_bug.cgi?id=289
Move editgroups to editfilters. Also update to work with WTF system.
Patch by
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
-------------------------------------------------------------------------------- diff -r a51d9f8d4c7f -r 65640a046783 cgi-bin/LJ/Event/Befriended.pm --- a/cgi-bin/LJ/Event/Befriended.pm Fri Feb 20 09:39:32 2009 +0000 +++ b/cgi-bin/LJ/Event/Befriended.pm Fri Feb 20 09:46:36 2009 +0000 @@ -78,7 +78,7 @@ sub _as_email { $journal_url ], 'esn.view_profile' => [ 3, $journal_profile ], 'esn.edit_friends' => [ 4, "$LJ::SITEROOT/manage/circle/edit.bml" ], - 'esn.edit_groups' => [ 5, "$LJ::SITEROOT/manage/circle/editgroups.bml" ], + 'esn.edit_groups' => [ 5, "$LJ::SITEROOT/manage/circle/editfilters.bml" ], } ); } diff -r a51d9f8d4c7f -r 65640a046783 cgi-bin/LJ/Event/Defriended.pm --- a/cgi-bin/LJ/Event/Defriended.pm Fri Feb 20 09:39:32 2009 +0000 +++ b/cgi-bin/LJ/Event/Defriended.pm Fri Feb 20 09:46:36 2009 +0000 @@ -65,7 +65,7 @@ sub _as_email { "$LJ::SITEROOT/manage/circle/add.bml?user=$postername" ], 'esn.post_entry' => [ 3, "$LJ::SITEROOT/update.bml" ], 'esn.edit_friends' => [ 4, "$LJ::SITEROOT/manage/circle/edit.bml" ], - 'esn.edit_groups' => [ 5, "$LJ::SITEROOT/manage/circle/editgroups.bml" ], + 'esn.edit_groups' => [ 5, "$LJ::SITEROOT/manage/circle/editfilters.bml" ], } ); } diff -r a51d9f8d4c7f -r 65640a046783 cgi-bin/LJ/Portal/Box/FriendsPage.pm --- a/cgi-bin/LJ/Portal/Box/FriendsPage.pm Fri Feb 20 09:39:32 2009 +0000 +++ b/cgi-bin/LJ/Portal/Box/FriendsPage.pm Fri Feb 20 09:46:36 2009 +0000 @@ -213,7 +213,7 @@ sub generate_content { $content .= "You have no friend groups defined."; } - $content .= "<br />(<a href=\"$LJ::SITEROOT/manage/circle/editgroups.bml\">Edit Friend Groups</a>)"; + $content .= "<br />(<a href=\"$LJ::SITEROOT/manage/circle/editfilters.bml\">Edit Friend Groups</a>)"; $content .= '</div>'; } diff -r a51d9f8d4c7f -r 65640a046783 cgi-bin/LJ/Portal/Box/Manage.pm --- a/cgi-bin/LJ/Portal/Box/Manage.pm Fri Feb 20 09:39:32 2009 +0000 +++ b/cgi-bin/LJ/Portal/Box/Manage.pm Fri Feb 20 09:46:36 2009 +0000 @@ -51,7 +51,7 @@ our $linkinfo = { 'InviteFriend' => [ '/manage/circle/invite.bml', 'Invite a Friend', 0 ], 'TextMessage' => [ '/tools/textmessage.bml', 'Text Message Tool', 0 ], 'Memories' => [ '/tools/memories.bml', 'Memorable Posts', 0 ], - 'EditFriendGroups' => [ '/manage/circle/editgroups.bml', 'Edit Your Friends Groups', 0 ], + 'EditFriendGroups' => [ '/manage/circle/editfilters.bml', 'Edit Your Friends Groups', 0 ], 'FriendsFilter' => [ '/manage/circle/filter.bml', 'Friends Filter', 0 ], 'CommSearch' => [ '/community/search.bml', 'Community Search', 0 ], 'CommInvite' => [ '/manage/invites.bml', 'Community Invitations', 0 ], diff -r a51d9f8d4c7f -r 65640a046783 cgi-bin/crumbs.pl --- a/cgi-bin/crumbs.pl Fri Feb 20 09:39:32 2009 +0000 +++ b/cgi-bin/crumbs.pl Fri Feb 20 09:46:36 2009 +0000 @@ -52,7 +52,7 @@ use Errno qw(ENOENT); 'managecommentsettings' => [ 'Manage Comment Settings', '/manage/comments', 'manage'], 'managecommunities' => ['Manage Communities', '/community/manage.bml', 'manage'], 'managefriends' => ['Manage Circle', '/manage/circle/edit.bml', 'friends'], - 'managefriendgrps' => ['Manage Filters', '/manage/circle/editgroups.bml', 'friends'], + 'managefriendgrps' => ['Manage Filters', '/manage/circle/editfilters.bml', 'friends'], 'managetags' => ['Manage Tags', '/manage/tags.bml', 'manage'], 'managelogins' => ['Manage Your Login Sessions', '/manage/logins.bml', 'manage'], 'manageuserpics' => ['Manage Userpics', '/editpics.bml', 'manage'], diff -r a51d9f8d4c7f -r 65640a046783 htdocs/manage/circle/edit.bml --- a/htdocs/manage/circle/edit.bml Fri Feb 20 09:39:32 2009 +0000 +++ b/htdocs/manage/circle/edit.bml Fri Feb 20 09:46:36 2009 +0000 @@ -303,7 +303,7 @@ body<= $ret .= "<ul>"; $ret .= "<li><a href='" . $u->journal_base . "/read'>$ML{'.success.friendspage'}</a></li>"; $ret .= "<li><a href='$LJ::SITEROOT/manage/circle/edit.bml'>$ML{'.success.editfriends'}</a></li>"; - $ret .= "<li><a href='$LJ::SITEROOT/manage/circle/editgroups.bml'>$ML{'.success.editgroups'}</a></li>"; + $ret .= "<li><a href='$LJ::SITEROOT/manage/circle/editfilters.bml'>$ML{'.success.editgroups'}</a></li>"; $ret .= "</ul>"; return $ret; diff -r a51d9f8d4c7f -r 65640a046783 htdocs/manage/circle/editfilters.bml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/htdocs/manage/circle/editfilters.bml Fri Feb 20 09:46:36 2009 +0000 @@ -0,0 +1,469 @@ +<?_code +{ + use strict; + use vars qw(%GET %POST $title $body); + + LJ::set_active_crumb('managefriendgrps'); + + $title = $ML{'.title2'}; + $body = ""; + + my $print_with_ad = sub { + my $str = shift; + + my $ad_box = LJ::get_ads({ location => 'bml.friends.editgroups/error', ljadwrapper => 1 }); + return $ad_box . $str; + }; + + my $err = sub { + $title = $ML{'Error'}; + $body = $print_with_ad->(LJ::bad_input(@_)); + return; + }; + + # these are only used by the client-side for JS to play with. + # we delete them because they may contain embedded NULLs, which + # text_in won't like. + delete $POST{'list_in'}; + delete $POST{'list_out'}; + + unless (LJ::text_in(\%POST)) { + $body = $print_with_ad->("<?badinput?>"); + return; + } + + my $remote = LJ::get_remote(); + unless ($remote) { + $body = $print_with_ad->("<?needlogin?>"); + return; + } + + my $authas = $GET{'authas'} || $remote->{'user'}; + my $u = LJ::get_authas_user($authas); + return $print_with_ad->($err->($ML{'error.invalidauth'})) + unless $u; + + # extra arguments for get requests + my $getextra = $authas ne $remote->{'user'} ? "?authas=$authas" : ''; + + my $trust_groups = $u->trust_groups; + + if ( $POST{mode} eq 'save' ) { + unless (LJ::check_form_auth()) { + $body = $print_with_ad->("<?h1 $ML{'Error'} h1?><?p $ML{'error.invalidform'} p?>"); + return; + } + + # add/edit/delete groups + for ( my $i = 1; $i <= 60; $i++ ) { + if ( $POST{"efg_delete_$i"} ) { + # FIXME: delete the group! + } elsif ( $POST{"efg_set_${i}_name"} ) { + my $create = ref $trust_groups->{$i} eq 'HASH' ? 0 : 1; + my $name = $POST{"efg_set_${i}_name"}; + my $sort = $POST{"efg_set_${i}_sort"}; + my $public = $POST{"efg_set_${i}_public"} ? 1 : 0; + if ( $create ) { + $u->create_trust_group( id => $i, groupname => $name, sortorder => $sort, is_public => $public ); + } else { + $u->edit_trust_group( id => $i, groupname => $name, sortorder => $sort, is_public => $public ); + } + } + } + + # update users' trustmasks + foreach my $post_key ( keys %POST ) { + next unless $post_key =~ /^editfriend_groupmask_(\w+)$/; + + my $trusted_u = LJ::load_user( $1 ); + next unless $trusted_u; + my $groupmask = $POST{$post_key}; + + $u->add_edge( $trusted_u, trust => { mask => $groupmask } ); + } + + $body .= LJ::get_ads({ + location => 'bml.friends.editgroups/main', + ljadwrapper => 1, + below_ad => LJ::CProd->full_box_for($remote, width => 300) + }); + $body .= "<?h1 $ML{'.saved.header'} h1?><?p $ML{'.saved.text'} p?>"; + + return; + } + + my @trusted_userids = $u->trusted_userids; + my $trusted_us = LJ::load_userids( @trusted_userids ); + + # authas switcher form + $body .= "<form method='get' action='editfilters.bml'>\n"; + $body .= LJ::make_authas_select($remote, { 'authas' => $GET{'authas'} }) . "\n"; + $body .= "</form>\n\n"; + + $body .= "<?p $ML{'.text'} p?><?p $ML{'.text.sec'} p?><p>"; + $body .= "<form method='post' name='fg' action='editfilters.bml$getextra'>"; + $body .= LJ::form_auth(); + $body .= "<input type='hidden' name='mode' value='save' />"; + for ( my $i = 1; $i <= 60; $i++ ) { + my $sort = 255; + my $name = ""; + my $public = 0; + + if ( ref $trust_groups->{$i} eq 'HASH' ) { + $sort = $trust_groups->{$i}->{sortorder}+0; + $name = LJ::ehtml( $trust_groups->{$i}->{groupname} ); + $public = $trust_groups->{$i}->{is_public}+0; + } + + $body .= "<input type='hidden' name='efg_set_${i}_name' value='$name' />"; + $body .= "<input type='hidden' name='efg_set_${i}_sort' value='$sort' />"; + $body .= "<input type='hidden' name='efg_delete_${i}' value='0' />"; + $body .= "<input type='hidden' name='efg_set_${i}_public' value='$public' />"; + } + foreach my $uid ( @trusted_userids ) { + my $trusted_u = $trusted_us->{$uid}; + next unless LJ::isu( $trusted_u ); + + my $user = $trusted_u->user; + my $mask = $u->trustmask( $trusted_u ) || 1; + $body .= "<input type='hidden' name='editfriend_groupmask_$user' value='$mask' />"; + + if ( $trusted_u->is_identity ) { + my $dn = $trusted_u->display_name; + $body .= "<input type='hidden' name='nameremap_$user' id='nameremap_$user' value='$dn' />"; + } + } + + # escape strings for JavaScript + my %T = qw(public .group.public + rename .prompt.rename + newname .prompt.newname + delete .confirm.delete + max60 .error.max60 + ); + foreach (keys %T) { $T{$_} = LJ::ejs($ML{$T{$_}}); } + + $body .= <<"END_JS"; +<SCRIPT LANGUAGE="JavaScript"><!-- + + var selectedGroup = 0; + + function eraseList (list) + { + while (list.length) { + list.options[0] = null; + } + } + + function groupClicked () + { + var selIndex; + + var form = document.fg; + var grouplist = form.list_groups; + var inlist = form.list_in; + var outlist = form.list_out; + + // figure out what they clicked, and bring their focus up to first free blank + + selIndex = grouplist.selectedIndex; + if (selIndex == -1) { return; } + var groupname = grouplist.options[selIndex].text; + + var newSelGroup = grouplist.options[selIndex].value; + if (newSelGroup == selectedGroup) { return; } + selectedGroup = newSelGroup; + + // clears the other "not in" and "in" boxes + eraseList(inlist); + eraseList(outlist); + + // iterate over all friends, putting them in one group or the other + var i; + for (i=0; i<form.elements.length; i++) { + var name = form.elements[i].name; + var mask = form.elements[i].value; + if (name.substring(0, 21) == "editfriend_groupmask_") { + var user = name.substring(21, name.length); + + // see if we remap their display name + var display = user; + if (document.getElementById) { + display = document.getElementById('nameremap_' + user); + if (display) { + display = display.value; + } else { + display = user; + } + } + + var list = mask & (1 << selectedGroup) ? inlist : outlist; + var optionName = new Option(display, user, false, false) + list.options[list.length] = optionName; + } + } + } + + function moveItems (from, to, bitstatus) + { + var selindex; + while ((selindex=from.selectedIndex) != -1) + { + var i; + var item = new Option(from.options[selindex].text, + from.options[selindex].value, + false, true); + + from.options[selindex] = null; + //to.options[to.options.length] = item; + + // find spot to put new item + for (i=0; i<to.options.length && to.options[i].text < item.text; i++) { } + var newindex = i; + + // move everything else down + for (i=to.options.length; i>newindex; i--) { + to.options[i] = new Option(to.options[i-1].text, + to.options[i-1].value, + false, + to.options[i-1].selected); + } + to.options[newindex] = item; + + // turn the groupmask bit on or off + var user = item.value; + var element = document.fg["editfriend_groupmask_"+user]; + var mask = element.value; + if (bitstatus) { + mask |= (1 << selectedGroup); + } else { + mask &= ~(1 << selectedGroup); + } + element.value = mask; + } + } + + function moveIn () + { + if (! selectedGroup) { return; } + var form = document.fg; + var inlist = form.list_in; + var outlist = form.list_out; + moveItems(document.fg.list_out, document.fg.list_in, true); + } + function moveOut () + { + if (! selectedGroup) { return; } + moveItems(document.fg.list_in, document.fg.list_out, false); + } + + function moveGroup (dir) + { + var list = document.fg.list_groups; + var selindex = list.selectedIndex; + if (selindex==-1) { return; } + var toindex = selindex+dir; + if (toindex < 0 || toindex >= list.options.length) { return; } + var selopt = new Option(list.options[selindex].text, + list.options[selindex].value, + false, + list.options[selindex].selected); + var toopt = new Option(list.options[toindex].text, + list.options[toindex].value, + false, + list.options[toindex].selected); + list.options[toindex] = selopt; + list.options[selindex] = toopt; + + // stupid mozilla necessity: + list.selectedIndex = toindex; + + setSortOrders(); + } + + function setSortOrders () + { + var list = document.fg.list_groups; + + // set all their sort orders now + var i; + for (i=0; i<list.options.length; i++) { + var item = list.options[i]; + var key = "efg_set_"+item.value+"_sort"; + document.fg[key].value = (i+1)*5; + } + } + + function realName (name) + { + var rname = name; + var index = name.lastIndexOf(" $T{'public'}"); + if (index != -1) { + rname = name.substr(0, index); + } + return rname; + } + + function renameGroup () + { + var list = document.fg.list_groups; + var selindex = list.selectedIndex; + if (selindex==-1) { return; } + var item = list.options[selindex]; + + var newtext = realName(item.text); + newtext = prompt("$T{'rename'}", newtext); + if (newtext==null || newtext == "") { return; } + + var gnum = item.value; + document.fg["efg_set_"+gnum+"_name"].value = newtext; + if (document.fg["efg_set_"+gnum+"_public"].value == 1) { + newtext = newtext + " $T{'public'}"; + } + item.text = newtext; + } + + function deleteGroup () + { + var list = document.fg.list_groups; + var selindex = list.selectedIndex; + if (selindex==-1) { return; } + var item = list.options[selindex]; + + var conf = confirm("$T{'delete'}"); + if (!conf) { return; } + + // mark it to be deleted later + var gnum = item.value; + document.fg["efg_delete_"+gnum].value = "1"; + document.fg["efg_set_"+gnum+"_name"].value = ""; + + // as per the protocol documentation, unset bit on all friends + var i; + var form = document.fg; + for (i=0; i<form.elements.length; i++) { + var name = form.elements[i].name; + if (name.substring(0, 21) == "editfriend_groupmask_") { + var user = name.substring(21, name.length); + var mask = form.elements[i].value; + mask &= ~(1 << gnum); + form.elements[i].value = mask; + } + } + + // clean up the UI + list.options[selindex] = null; + eraseList(document.fg.list_in); + eraseList(document.fg.list_out); + } + + function makePublic () + { + var list = document.fg.list_groups; + var selindex = list.selectedIndex; + if (selindex==-1) { return; } + var item = list.options[selindex]; + + var name = realName(item.text); + item.text = name + " $T{'public'}"; + + var gnum = item.value; + document.fg["efg_set_"+gnum+"_public"].value = "1"; + } + + function makePrivate () + { + var list = document.fg.list_groups; + var selindex = list.selectedIndex; + if (selindex==-1) { return; } + var item = list.options[selindex]; + + var name = realName(item.text); + item.text = name; + + var gnum = item.value; + document.fg["efg_set_"+gnum+"_public"].value = "0"; + } + + function newGroup () + { + var form = document.fg; + var i; + var foundg = false; + for (i=1; i<=60; i++) { + if (form["efg_delete_"+i].value==1) { continue; } + if (form["efg_set_"+i+"_name"].value!="") { continue; } + foundg = true; + break; + } + if (! foundg) { + alert("$T{'max60'}"); + return; + } + var gnum = i; + var groupname = prompt("$T{'newname'}", ""); + if (groupname==null || groupname=="") { return; } + + form["efg_set_"+gnum+"_name"].value = groupname; + var item = new Option(groupname, gnum, false, true); + var list = form.list_groups; + list.options[list.options.length] = item; + list.options.selectedIndex = list.options.length-1; + setSortOrders(); + groupClicked(); + } + +// --></SCRIPT> +END_JS + + $body .= "<table class='editfilters'><tr style='vertical-align: bottom;'>"; + $body .= "<td nowrap='1' colspan='2'><strong>$ML{'.yourgroups'}</strong></td>"; + $body .= "<td nowrap='1' colspan='2'><strong>$ML{'.ingroup.not'}</strong></td>"; + $body .= "<td nowrap='1'><strong>$ML{'.ingroup'}</strong></td></tr>"; + + $body .= "<tr style='vertical-align: top;'>"; + $body .= "<td><select name='list_groups' style='width: 150px;' size='15' onchange='groupClicked();'>"; + foreach my $trustgroupid ( sort { $trust_groups->{$a}->{sortorder} <=> $trust_groups->{$b}->{sortorder} } keys %$trust_groups ) { + my $listname = $trust_groups->{$trustgroupid}->{groupname}; + $listname .= " $ML{'.group.public'}" if $trust_groups->{$trustgroupid}->{is_public}; + $body .= "<option value='$trustgroupid'>" . LJ::ehtml($listname); + } + $body .= "</select></td>"; + + $body .= "<td style='vertical-align: middle;'>"; + $body .= "<input type='button' value='$ML{'.btn.mv.up'}' onClick='moveGroup(-1);' /><br /><br />"; + $body .= "<input type='button' value='$ML{'.btn.mv.down'}' onClick='moveGroup(1);' /></td>"; + + $body .= "<td><select name='list_out' multiple='1' size='15'>"; + $body .= "<option value=''>---------------</option></select></td>"; + + $body .= "<td style='vertical-align: middle;'>"; + $body .= "<input type='button' onClick='moveIn();' value='>>' /><br /><br />"; + $body .= "<input type='button' onClick='moveOut();' value='<<' /></td>"; + + $body .= "<td><select name='list_in' multiple='1' size='15'>"; + $body .= "<option value=''>---------------</option></select></td>"; + + $body .= "</tr><tr><td colspan='2'>"; + $body .= "<nobr>"; + $body .= "<input type='button' value='$ML{'.btn.ge.new'}' onClick='newGroup();' /> "; + $body .= "<input type='button' value='$ML{'.btn.ge.del'}' onClick='deleteGroup();' /> "; + $body .= "<input type='button' value='$ML{'.btn.ge.ren'}' onClick='renameGroup();' />"; + $body .= "</nobr></td><td></td><td></td><td></td>"; + + $body .= "</tr></table>"; + + $body .= "<?h1 $ML{'.done.header'} h1?><?p $ML{'.done.text'} p?>"; + $body .= "<?p <input type='submit' value='$ML{'.done.btn'}' /> p?>"; + $body .= "</form>"; + + $body = $print_with_ad->($body); + return; +} +_code?><?page +title=><?_code return $title; _code?> +body=><?_code return $body; _code?> +page?><?_c <LJDEP> +link: htdocs/login.bml +post: htdocs/manage/circle/editfilters.bml +</LJDEP> _c?> diff -r a51d9f8d4c7f -r 65640a046783 htdocs/manage/circle/editfilters.bml.text --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/htdocs/manage/circle/editfilters.bml.text Fri Feb 20 09:46:36 2009 +0000 @@ -0,0 +1,48 @@ +;; -*- coding: utf-8 -*- +.btn.ge.del=Delete + +.btn.ge.new=New + +.btn.ge.ren=Rename + +.btn.gs.private=Private + +.btn.gs.public=Public + +.btn.mv.down=Move down + +.btn.mv.up=Move up + +.confirm.delete=Are you sure you wish to delete this access filter? + +.done.btn=Save Changes + +.done.header=Done? + +.done.text=When you are done, press the button below to save your changes. + +.error.max60=You have reached the maximum limit of 60 access filters. If you have deleted one or more access filters but have not saved the changes yet, do so now, then come back to this page and reload it. You will then be able to create new access filters. + +.error.text=The server returned the following error message: + +.group.public=(public) + +.ingroup=In access filter: + +.ingroup.not=Not in access filter: + +.prompt.newname=Enter the name for the new access filter: + +.prompt.rename=Rename this access filter to: + +.saved.header=Saved + +.saved.text=Your access filters are now saved. + +.text=This page allows you to edit your filters. Currently, you can only edit your access filters, which are used for setting security on items. Reading filters, which are used for filtering your reading page, are not yet currently supported. This page requires JavaScript to work. + +.text.sec=<strong>Security note:</strong> If you wish to delete an access filter and make a new access filter, do <strong>not</strong> do this by renaming one access filter and then editing it. If you do this, all your old entries which are accessible to the old access filter will then be accessible to the new access filter. + +.title2=Manage Filters + +.yourgroups=Your access filters: diff -r a51d9f8d4c7f -r 65640a046783 htdocs/manage/circle/editgroups.bml --- a/htdocs/manage/circle/editgroups.bml Fri Feb 20 09:39:32 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,464 +0,0 @@ -<?_code -{ - use strict; - use vars qw(%GET %POST $title $body); - - LJ::set_active_crumb('managefriendgrps'); - - $title = $ML{'.title2'}; - $body = ""; - - my $print_with_ad = sub { - my $str = shift; - - my $ad_box = LJ::get_ads({ location => 'bml.friends.editgroups/error', ljadwrapper => 1 }); - return $ad_box . $str; - }; - - my $err = sub { - $title = $ML{'Error'}; - $body = $print_with_ad->(LJ::bad_input(@_)); - return; - }; - - # these are only used by the client-side for JS to play with. - # we delete them because they may contain embedded NULLs, which - # text_in won't like. - delete $POST{'list_in'}; - delete $POST{'list_out'}; - - unless (LJ::text_in(\%POST)) { - $body = $print_with_ad->("<?badinput?>"); - return; - } - - my $remote = LJ::get_remote(); - unless ($remote) { - $body = $print_with_ad->("<?needlogin?>"); - return; - } - - my $authas = $GET{'authas'} || $remote->{'user'}; - my $u = LJ::get_authas_user($authas); - return $print_with_ad->($err->($ML{'error.invalidauth'})) - unless $u; - - # extra arguments for get requests - my $getextra = $authas ne $remote->{'user'} ? "?authas=$authas" : ''; - - if ($POST{'mode'} eq "save") { - unless (LJ::check_form_auth()) { - $body = $print_with_ad->("<?h1 $ML{'Error'} h1?><?p $ML{'error.invalidform'} p?>"); - return; - } - - my %res; - $POST{'mode'} = "editfriendgroups"; - $POST{'user'} = $u->{'user'}; - $POST{'ver'} = $LJ::PROTOCOL_VER; - LJ::do_request(\%POST, \%res, { - 'u' => $u, - 'noauth' => 1, - }); - - if ($res{'success'} eq "OK") { - $body .= LJ::get_ads({ - location => 'bml.friends.editgroups/main', - ljadwrapper => 1, - below_ad => LJ::CProd->full_box_for($remote, width => 300) - }); - $body .= "<?h1 $ML{'.saved.header'} h1?><?p $ML{'.saved.text'} p?>"; - } else { - $body .= "<?h1 $ML{'Error'} h1?><?p $ML{'.error.text'} p?><?p $res{'errmsg'} p?>"; - $body = $print_with_ad->($body); - } - return; - } - - my %res; - LJ::do_request({ 'mode' => 'getfriends', - 'user' => $u->{'user'}, - 'ver' => $LJ::PROTOCOL_VER, - 'includegroups' => 1 }, - \%res, { 'u' => $u, - 'noauth' => 1, }); - my @num_used; - my @num_free; - - # authas switcher form - $body .= "<form method='get' action='editgroups.bml'>\n"; - $body .= LJ::make_authas_select($remote, { 'authas' => $GET{'authas'} }) . "\n"; - $body .= "</form>\n\n"; - - $body .= "<?h1 $ML{'.title'} h1?><?p $ML{'.text'} p?><?p $ML{'.text.sec'} p?><p>"; - $body .= "<form method='post' name='fg' action='editgroups.bml$getextra'>"; - $body .= LJ::form_auth(); - $body .= "<input type='hidden' name='mode' value='save' />"; - for (my $i=1; $i<=60; $i++) { - my $sort = 255; - my $name = ""; - my $public = 0; - if ($res{"frgrp_${i}_name"}) { - $sort = $res{"frgrp_${i}_sortorder"}+0; - $name = LJ::ehtml($res{"frgrp_${i}_name"}); - $public = $res{"frgrp_${i}_public"}+0; - push @num_used, $i; - } else { - push @num_free, $i; - } - $body .= "<input type='hidden' name='efg_set_${i}_name' value='$name' />"; - $body .= "<input type='hidden' name='efg_set_${i}_sort' value='$sort' />"; - $body .= "<input type='hidden' name='efg_delete_${i}' value='0' />"; - $body .= "<input type='hidden' name='efg_set_${i}_public' value='$public' />"; - } - for (my $i=1; $i<=$res{'friend_count'}; $i++) { - my $user = $res{"friend_${i}_user"}; - - my $mask = $res{"friend_${i}_groupmask"} || 1; - $body .= "<input type='hidden' name='editfriend_groupmask_$user' value='$mask' />"; - - if ($res{"friend_${i}_type"} eq 'identity') { - my $dn = $res{"friend_${i}_identity_display"}; - $body .= "<input type='hidden' name='nameremap_$user' id='nameremap_$user' value='$dn' />"; - } - } - - # escape strings for JavaScript - my %T = qw(public .group.public - rename .prompt.rename - newname .prompt.newname - delete .confirm.delete - max60 .error.max60 - ); - foreach (keys %T) { $T{$_} = LJ::ejs($ML{$T{$_}}); } - - $body .= <<"END_JS"; -<SCRIPT LANGUAGE="JavaScript"><!-- - - var selectedGroup = 0; - - function eraseList (list) - { - while (list.length) { - list.options[0] = null; - } - } - - function groupClicked () - { - var selIndex; - - var form = document.fg; - var grouplist = form.list_groups; - var inlist = form.list_in; - var outlist = form.list_out; - - // figure out what they clicked, and bring their focus up to first free blank - - selIndex = grouplist.selectedIndex; - if (selIndex == -1) { return; } - var groupname = grouplist.options[selIndex].text; - - var newSelGroup = grouplist.options[selIndex].value; - if (newSelGroup == selectedGroup) { return; } - selectedGroup = newSelGroup; - - // clears the other "not in" and "in" boxes - eraseList(inlist); - eraseList(outlist); - - // iterate over all friends, putting them in one group or the other - var i; - for (i=0; i<form.elements.length; i++) { - var name = form.elements[i].name; - var mask = form.elements[i].value; - if (name.substring(0, 21) == "editfriend_groupmask_") { - var user = name.substring(21, name.length); - - // see if we remap their display name - var display = user; - if (document.getElementById) { - display = document.getElementById('nameremap_' + user); - if (display) { - display = display.value; - } else { - display = user; - } - } - - var list = mask & (1 << selectedGroup) ? inlist : outlist; - var optionName = new Option(display, user, false, false) - list.options[list.length] = optionName; - } - } - } - - function moveItems (from, to, bitstatus) - { - var selindex; - while ((selindex=from.selectedIndex) != -1) - { - var i; - var item = new Option(from.options[selindex].text, - from.options[selindex].value, - false, true); - - from.options[selindex] = null; - //to.options[to.options.length] = item; - - // find spot to put new item - for (i=0; i<to.options.length && to.options[i].text < item.text; i++) { } - var newindex = i; - - // move everything else down - for (i=to.options.length; i>newindex; i--) { - to.options[i] = new Option(to.options[i-1].text, - to.options[i-1].value, - false, - to.options[i-1].selected); - } - to.options[newindex] = item; - - // turn the groupmask bit on or off - var user = item.value; - var element = document.fg["editfriend_groupmask_"+user]; - var mask = element.value; - if (bitstatus) { - mask |= (1 << selectedGroup); - } else { - mask &= ~(1 << selectedGroup); - } - element.value = mask; - } - } - - function moveIn () - { - if (! selectedGroup) { return; } - var form = document.fg; - var inlist = form.list_in; - var outlist = form.list_out; - moveItems(document.fg.list_out, document.fg.list_in, true); - } - function moveOut () - { - if (! selectedGroup) { return; } - moveItems(document.fg.list_in, document.fg.list_out, false); - } - - function moveGroup (dir) - { - var list = document.fg.list_groups; - var selindex = list.selectedIndex; - if (selindex==-1) { return; } - var toindex = selindex+dir; - if (toindex < 0 || toindex >= list.options.length) { return; } - var selopt = new Option(list.options[selindex].text, - list.options[selindex].value, - false, - list.options[selindex].selected); - var toopt = new Option(list.options[toindex].text, - list.options[toindex].value, - false, - list.options[toindex].selected); - list.options[toindex] = selopt; - list.options[selindex] = toopt; - - // stupid mozilla necessity: - list.selectedIndex = toindex; - - setSortOrders(); - } - - function setSortOrders () - { - var list = document.fg.list_groups; - - // set all their sort orders now - var i; - for (i=0; i<list.options.length; i++) { - var item = list.options[i]; - var key = "efg_set_"+item.value+"_sort"; - document.fg[key].value = (i+1)*5; - } - } - - function realName (name) - { - var rname = name; - var index = name.lastIndexOf(" $T{'public'}"); - if (index != -1) { - rname = name.substr(0, index); - } - return rname; - } - - function renameGroup () - { - var list = document.fg.list_groups; - var selindex = list.selectedIndex; - if (selindex==-1) { return; } - var item = list.options[selindex]; - - var newtext = realName(item.text); - newtext = prompt("$T{'rename'}", newtext); - if (newtext==null || newtext == "") { return; } - - var gnum = item.value; - document.fg["efg_set_"+gnum+"_name"].value = newtext; - if (document.fg["efg_set_"+gnum+"_public"].value == 1) { - newtext = newtext + " $T{'public'}"; - } - item.text = newtext; - } - - function deleteGroup () - { - var list = document.fg.list_groups; - var selindex = list.selectedIndex; - if (selindex==-1) { return; } - var item = list.options[selindex]; - - var conf = confirm("$T{'delete'}"); - if (!conf) { return; } - - // mark it to be deleted later - var gnum = item.value; - document.fg["efg_delete_"+gnum].value = "1"; - document.fg["efg_set_"+gnum+"_name"].value = ""; - - // as per the protocol documentation, unset bit on all friends - var i; - var form = document.fg; - for (i=0; i<form.elements.length; i++) { - var name = form.elements[i].name; - if (name.substring(0, 21) == "editfriend_groupmask_") { - var user = name.substring(21, name.length); - var mask = form.elements[i].value; - mask &= ~(1 << gnum); - form.elements[i].value = mask; - } - } - - // clean up the UI - list.options[selindex] = null; - eraseList(document.fg.list_in); - eraseList(document.fg.list_out); - } - - function makePublic () - { - var list = document.fg.list_groups; - var selindex = list.selectedIndex; - if (selindex==-1) { return; } - var item = list.options[selindex]; - - var name = realName(item.text); - item.text = name + " $T{'public'}"; - - var gnum = item.value; - document.fg["efg_set_"+gnum+"_public"].value = "1"; - } - - function makePrivate () - { - var list = document.fg.list_groups; - var selindex = list.selectedIndex; - if (selindex==-1) { return; } - var item = list.options[selindex]; - - var name = realName(item.text); - item.text = name; - - var gnum = item.value; - document.fg["efg_set_"+gnum+"_public"].value = "0"; - } - - function newGroup () - { - var form = document.fg; - var i; - var foundg = false; - for (i=1; i<=60; i++) { - if (form["efg_delete_"+i].value==1) { continue; } - if (form["efg_set_"+i+"_name"].value!="") { continue; } - foundg = true; - break; - } - if (! foundg) { - alert("$T{'max60'}"); - return; - } - var gnum = i; - var groupname = prompt("$T{'newname'}", ""); - if (groupname==null || groupname=="") { return; } - - form["efg_set_"+gnum+"_name"].value = groupname; - var item = new Option(groupname, gnum, false, true); - var list = form.list_groups; - list.options[list.options.length] = item; - list.options.selectedIndex = list.options.length-1; - setSortOrders(); - groupClicked(); - } - -// --></SCRIPT> -END_JS - - $body .= "<table cellspacing='5'><tr valign='bottom'>"; - $body .= "<td nowrap='1' colspan='2'><strong>$ML{'.yourgroups'}</strong></td>"; - $body .= "<td nowrap='1' colspan='2'><strong>$ML{'.ingroup.not'}</strong></td>"; - $body .= "<td nowrap='1'><strong>$ML{'.ingroup'}</strong></td></tr>"; - - $body .= "<tr valign='top'>"; - $body .= "<td><select name='list_groups' style='width: 150px;' size='15' onchange='groupClicked();'>"; - foreach my $num (sort { $res{"frgrp_${a}_sortorder"} <=> - $res{"frgrp_${b}_sortorder"} } @num_used) { - - my $listname = $res{"frgrp_${num}_name"}; - $listname .= " $ML{'.group.public'}" if $res{"frgrp_${num}_public"}; - $body .= "<option value='$num'>" . LJ::ehtml($listname); - } - - $body .= "</select></td>"; - - $body .= "<td valign='middle'>"; - $body .= "<input type='button' value='$ML{'.btn.mv.up'}' onClick='moveGroup(-1);' /><br /><br />"; - $body .= "<input type='button' value='$ML{'.btn.mv.down'}' onClick='moveGroup(1);' /></td>"; - - $body .= "<td><select name='list_out' multiple='1' size='15'>"; - $body .= "<option value=''>---------------</option></select></td>"; - - $body .= "<td valign='middle'>"; - $body .= "<input type='button' onClick='moveIn();' value='>>' /><br /><br />"; - $body .= "<input type='button' onClick='moveOut();' value='<<' /></td>"; - - $body .= "<td><select name='list_in' multiple='1' size='15'>"; - $body .= "<option value=''>---------------</option></select></td>"; - - $body .= "</tr><tr><td colspan='2'>"; - $body .= "<nobr>"; - $body .= "<input type='button' value='$ML{'.btn.ge.new'}' onClick='newGroup();' /> "; - $body .= "<input type='button' value='$ML{'.btn.ge.del'}' onClick='deleteGroup();' /> "; - $body .= "<input type='button' value='$ML{'.btn.ge.ren'}' onClick='renameGroup();' />"; - $body .= "</nobr><br /><nobr>"; - $body .= "<input type='button' value='$ML{'.btn.gs.public'}' onClick='makePublic();' /> "; - $body .= "<input type='button' value='$ML{'.btn.gs.private'}' onClick='makePrivate();' />"; - $body .= "</nobr></td><td></td><td></td><td></td>"; - - $body .= "</tr></table>"; - - $body .= "<?h1 $ML{'.done.header'} h1?><?p $ML{'.done.text'} p?>"; - $body .= "<?p <input type='submit' value='$ML{'.done.btn'}' /> p?>"; - $body .= "</form>"; - - $body = $print_with_ad->($body); - return; -} -_code?><?page -title=><?_code return $title; _code?> -body=><?_code return $body; _code?> -page?><?_c <LJDEP> -link: htdocs/login.bml -post: htdocs/manage/circle/editgroups.bml -</LJDEP> _c?> diff -r a51d9f8d4c7f -r 65640a046783 htdocs/manage/circle/editgroups.bml.text --- a/htdocs/manage/circle/editgroups.bml.text Fri Feb 20 09:39:32 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -;; -*- coding: utf-8 -*- -.btn.ge.del=Delete - -.btn.ge.new=New - -.btn.ge.ren=Rename - -.btn.gs.private=Private - -.btn.gs.public=Public - -.btn.mv.down=Move down - -.btn.mv.up=Move up - -.confirm.delete=Are you sure you wish to delete this custom friends group? - -.done.btn=Save Changes - -.done.header=Done? - -.done.text=When you are done, press the button below to save your changes. - -.error.max60=You have reached the maximum limit of 60 custom friends groups. If you have deleted one or more groups but have not saved the changes yet, do so now, then come back to this page and reload it. You will then be able to create new custom friends groups. - -.error.text=The server returned the following error message: - -.group.public=(public) - -.ingroup=In group: - -.ingroup.not=Not in group: - -.prompt.newname=Enter the name for the new custom friends group: - -.prompt.rename=Rename this custom friends group to: - -.saved.header=Saved - -.saved.text=Your custom friends groups are now saved. - -.text<< -This page allows you to edit your custom friends groups. Custom friends groups are used -for setting security on items and for filtering your friends page. -This page requires JavaScript to work. -. - -.text.sec<< -<strong>Security note:</strong> If you wish to delete a group and make a new group, -do <strong>not</strong> do this by renaming one group and then editing it. -If you do this, all your old entries which are accessible to the old group will -then be accessible to the new group. -. - -.title2=Manage Custom Friends Groups - -.yourgroups=Your custom friends groups: - diff -r a51d9f8d4c7f -r 65640a046783 htdocs/manage/circle/filter.bml --- a/htdocs/manage/circle/filter.bml Fri Feb 20 09:39:32 2009 +0000 +++ b/htdocs/manage/circle/filter.bml Fri Feb 20 09:46:36 2009 +0000 @@ -50,7 +50,7 @@ unless ($res{'frgrp_maxnum'}) { - $body = "<?h1 $ML{'.error.nogroups.header'} h1?><?p " . BML::ml('.error.nogroups2', {'aopts' => "href='$LJ::SITEROOT/manage/circle/editgroups.bml'"}) . " p?>"; + $body = "<?h1 $ML{'.error.nogroups.header'} h1?><?p " . BML::ml('.error.nogroups2', {'aopts' => "href='$LJ::SITEROOT/manage/circle/editfilters.bml'"}) . " p?>"; return; } @@ -79,7 +79,7 @@ $body .= LJ::html_submit($ML{'.submit'}); $body .= " <input type='reset' value=\"$ML{'.reset'}\"></div>"; - $body .= "<?p " . BML::ml('.editgroups', { 'link' => "<a href='editgroups.bml'>$ML{'/manage/circle/editgroups.bml.title'}</a>" }) . " p?>"; + $body .= "<?p " . BML::ml('.editgroups', { 'link' => "<a href='editfilters.bml'>$ML{'/manage/circle/editfilters.bml.title'}</a>" }) . " p?>"; $body .= "</form>"; return; @@ -88,6 +88,6 @@ title=><?_code return $title; _code?> title=><?_code return $title; _code?> body=><?_code return $body; _code?> page?><?_c <LJDEP> -link: htdocs/users, htdocs/manage/circle/editgroups.bml +link: htdocs/users, htdocs/manage/circle/editfilters.bml post: htdocs/manage/circle/filter.bml </LJDEP> _c?> diff -r a51d9f8d4c7f -r 65640a046783 htdocs/manage/circle/index.bml --- a/htdocs/manage/circle/index.bml Fri Feb 20 09:39:32 2009 +0000 +++ b/htdocs/manage/circle/index.bml Fri Feb 20 09:46:36 2009 +0000 @@ -28,7 +28,7 @@ _code?> <td><?_ml .edit.about _ml?></td> </tr> <tr> - <td class='name'><a href="<?siteroot?>/manage/circle/editgroups.bml"><?_ml /manage/circle/editgroups.bml.title _ml?></a></td> + <td class='name'><a href="<?siteroot?>/manage/circle/editfilters.bml"><?_ml /manage/circle/editfilters.bml.title _ml?></a></td> <td><?_ml .editgroups.about _ml?> <?_ml .filter _ml?></td> </tr> <tr> @@ -45,6 +45,6 @@ _code?> </ul> <=body page?><?_c <LJDEP> -link: htdocs/manage/circle/edit.bml, htdocs/manage/circle/editgroups.bml +link: htdocs/manage/circle/edit.bml, htdocs/manage/circle/editfilters.bml link: htdocs/manage/circle/filter.bml, htdocs/download/index.bml </LJDEP> _c?> diff -r a51d9f8d4c7f -r 65640a046783 htdocs/manage/index.bml --- a/htdocs/manage/index.bml Fri Feb 20 09:39:32 2009 +0000 +++ b/htdocs/manage/index.bml Fri Feb 20 09:46:36 2009 +0000 @@ -225,7 +225,7 @@ about=><?_ml .friends _ml?> about=><?_ml .friends _ml?> list<= <li><a href="/manage/circle/edit.bml" title="<?_ml .friends.edit.about _ml?>"><?_ml /manage/circle/edit.bml.title2 _ml?></a></li> -<li><a href="/manage/circle/editgroups.bml" title="<?_ml .friends.groups.about _ml?>"><?_ml /manage/circle/editgroups.bml.title2 _ml?></a></li> +<li><a href="/manage/circle/editfilters.bml" title="<?_ml .friends.groups.about _ml?>"><?_ml /manage/circle/editfilters.bml.title2 _ml?></a></li> <li><a href="/manage/circle/filter.bml" title="<?_ml .friends.filter.about _ml?>"><?_ml .friends.filter _ml?></a></li> <=list block?> diff -r a51d9f8d4c7f -r 65640a046783 htdocs/site/index.bml --- a/htdocs/site/index.bml Fri Feb 20 09:39:32 2009 +0000 +++ b/htdocs/site/index.bml Fri Feb 20 09:46:36 2009 +0000 @@ -48,7 +48,7 @@ body<= <dt><?_code return BML::ml('.maplinks.manage-readlist-title', { sitename => $LJ::SITENAMESHORT }); _code?></dt> <dd><ul> <li><a href='/manage/circle/'><?_ml .maplinks.manage-readlist _ml?></a></li> - <li><a href='/manage/circle/editgroups.bml'><?_ml .maplinks.manage-groups _ml?></a></li> + <li><a href='/manage/circle/editfilters.bml'><?_ml .maplinks.manage-groups _ml?></a></li> <li><a href='/manage/circle/filter.bml'><?_ml .maplinks.filter-readlist _ml?></a></li> <li><a href='/syn'><?_ml .maplinks.synfeeds _ml?></a></li> </ul></dd> diff -r a51d9f8d4c7f -r 65640a046783 htdocs/support/encodings.bml --- a/htdocs/support/encodings.bml Fri Feb 20 09:39:32 2009 +0000 +++ b/htdocs/support/encodings.bml Fri Feb 20 09:46:36 2009 +0000 @@ -8,7 +8,7 @@ $body .= "<?h1 $ML{'.overview.header'} h1?>$ML{'.overview.text'}"; $body .= "<?h1 $ML{'.edit.header'} h1?>" . BML::ml('.edit.text2', {'aopts1' => "href='$LJ::SITEROOT/settings/'", 'aopts2' => "href='$LJ::SITEROOT/support/'"}); $body .= "<?h1 $ML{'.editcl.header'} h1?>$ML{'.editcl.text'}"; - $body .= "<?h1 $ML{'.groups.header'} h1?>" . BML::ml('.groups.text2', {'aopts' => "href='$LJ::SITEROOT/manage/circle/editgroups.bml'"}); + $body .= "<?h1 $ML{'.groups.header'} h1?>" . BML::ml('.groups.text2', {'aopts' => "href='$LJ::SITEROOT/manage/circle/editfilters.bml'"}); $body .= "<?h1 $ML{'.still.header'} h1?>" . BML::ml('.still.text2', {'aopts' => "href='$LJ::SITEROOT/support/'"}); return; --------------------------------------------------------------------------------