package EnsEMBL::Web::Component::Account::ManageGroup; ### Module to create list of groups that a user is an admin of use strict; use warnings; no warnings "uninitialized"; use base qw(EnsEMBL::Web::Component::Account); use EnsEMBL::Web::Form; use EnsEMBL::Web::RegObj; #use EnsEMBL::Web::Data::Membership; sub _init { my $self = shift; $self->cacheable( 0 ); $self->ajaxable( 0 ); } sub caption { my $self = shift; return undef; } sub content { my $self = shift; my $object = $self->object; my $html; my $user = $ENSEMBL_WEB_REGISTRY->get_user; my $sitename = $self->site_name; ## Control panel fixes my $referer = '_referer='.$self->object->param('_referer').';x_requested_with='.$self->object->param('x_requested_with'); return '' unless $object->param('id') && int($object->param('id')); my $ok_id = $user->is_administrator_of($object->param('id')) ? $object->param('id') : undef; if ($ok_id) { my $group = EnsEMBL::Web::Data::Group->new($ok_id); $html .= '<h2>'.$group->name.'</h2>'; ## Error messages from invitation module if ($object->param('active') || $object->param('pending')) { my $caption = 'Invitations'; my $text; my @active = $object->param('active'); foreach my $email (@active) { next unless $email; $text .= qq(<p>$email is already a member of this group.</p>); } my @pending = $object->param('pending'); foreach my $email (@pending) { next unless $email; $text .= qq(<p>$email has already been invited to join this group.</p>); } $html .= $self->_error($caption, $text, '100%'); } ## List of current members $html .= qq(<h3 style="margin-bottom:0px">Current members</h3>); my @members = $group->members; if (@members) { my $table = new EnsEMBL::Web::Document::SpreadSheet( [], [], {'margin' => '0.5em 0px'} ); $table->add_columns( { 'key' => 'name', 'title' => 'Name', 'width' => '25%', 'align' => 'left' }, { 'key' => 'status', 'title' => 'Status', 'width' => '25%', 'align' => 'left' }, { 'key' => 'remove', 'title' => '', 'width' => '25%', 'align' => 'left' }, { 'key' => 'promote', 'title' => '', 'width' => '25%', 'align' => 'left' }, ); my $show_all = $object->param('show_all') ? 1 : 0; my $inactive = 0; foreach my $m (@members) { my $row = {}; $inactive++ if $m->member_status eq 'inactive'; next unless ($show_all || $m->member_status eq 'active'); my $status = ucfirst($m->level); if ($show_all) { $status .= ' ('.$m->member_status.')'; } my ($remove, $promote); if ($m->id == $user->id) { $remove = qq(<a href="/Account/Unsubscribe?id=$ok_id;$referer" class="modal_link">Unsubscribe</a> (N.B. You will no longer have any access to this group!)); } else { if ($m->member_status eq 'inactive') { $remove = sprintf(qq(<a href="/Account/RemoveMember?id=$ok_id;user_id=%s;$referer" class="modal_link">Remove from group</a>), $m->user_id); } else { $remove = sprintf(qq(<a href="/Account/ChangeStatus?id=$ok_id;new_status=inactive;user_id=%s;$referer" class="modal_link">Deactivate membership</a>), $m->user_id); } } if ($status eq 'Administrator') { $promote = sprintf(qq(<a href="/Account/ChangeLevel?id=$ok_id;new_level=member;user_id=%s;$referer" class="modal_link">Demote to standard member</a>), $m->user_id); } elsif ($m->member_status ne 'active') { $promote = sprintf(qq(<a href="/Account/ChangeLevel?id=$ok_id;new_level=administrator;user_id=%s;$referer" class="modal_link">Promote to administrator</a>), $m->user_id); } $table->add_row({'name' => $m->name, 'status' => $status, 'remove' => $remove, 'promote' => $promote}); #$table->add_row({'name' => 'name', 'status' => $status, 'remove' => $remove, 'promote' => $promote}); } $html .= $table->render; if ($show_all) { $html .= qq(<p><a href="/Account/ManageGroup?id=$ok_id;$referer" class="modal_link">Hide non-active members</a> (if any)</p>); } elsif ($inactive) { $html .= qq(<p><a href="/Account/ManageGroup?id=$ok_id;show_all=yes;$referer" class="modal_link">Show $inactive non-active members</a></p>); } } else { $html .= "<p>This group has no members</p>"; ## Unlikely, since it must have a creator! } ## Pending invitations $html .= qq(<h3 style="margin-bottom:0px">Pending invitations</h3>); my @invites = $group->invites; if (@invites) { my $table = new EnsEMBL::Web::Document::SpreadSheet( [], [], {'margin' => '0.5em 0px'} ); $table->add_columns( { 'key' => 'email', 'title' => 'Email', 'width' => '50%', 'align' => 'left' }, { 'key' => 'remove', 'title' => '', 'width' => '50%', 'align' => 'left' }, ); foreach my $invitation (@invites) { $table->add_row({'email' => $invitation->email, 'remove' => qq(<a href="/Account/RemoveInvitation?id=).$invitation->id.';group_id='.$group->id.qq(;$referer" class="modal_link">Cancel invitation</a>)}); } $html .= $table->render; } else { $html .= "<p>This group has no invitations pending acceptance.</p>"; } ## Invitation form $html .= qq(<h3>Invite new members</h3> <p>To invite new members into this group, enter one email address per person. Users not already registered with this website will be asked to do so before accepting your invitation.</p>); my $form = EnsEMBL::Web::Form->new('invitations', "/Account/Invite", 'post', 'std check narrow-labels'); $form->add_element(type => 'Text', name=>'emails', label => 'Email addresses', 'notes' => 'Multiple email addresses should be separated by commas'); $form->add_element(type => 'Hidden', name => 'id', value => $group->id); $form->add_element(type => 'Hidden', name => '_referer', value => $object->param('_referer')); $form->add_element(type => 'Hidden', name => 'x_requested_with', value => $object->param('x_requested_with')); $form->add_element(type => 'Submit', name => 'submit', value => 'Send'); $html .= $form->render; } return $html; } 1;