package WebGUI::Asset::Wobject::InOutBoard; use strict; use WebGUI::FormBuilder; use WebGUI::International; use WebGUI::Paginator; use WebGUI::SQL; use Tie::IxHash; use Moose; use WebGUI::Definition::Asset; extends 'WebGUI::Asset::Wobject'; define tableName => 'InOutBoard'; define assetName => ['assetName', 'Asset_MapPoint']; define icon => 'iob.gif'; property statusList => ( tab => 'properties', fieldType => "textarea", builder => '_statusList_builder', lazy => 1, label => [1, 'Asset_InOutBoard'], hoverHelp => ['1 description', 'Asset_InOutBoard'], subtext => [2, 'Asset_InOutBoard'], ); sub _statusList_builder { my $self = shift; my $session = $self->session; my $i18n = WebGUI::International->new($session, 'Asset_InOutBoard'); return $i18n->get(10)."\n".$i18n->get(11)."\n"; } property reportViewerGroup => ( tab => 'security', default => 3, fieldType => "group", label => [3, 'Asset_InOutBoard'], hoverHelp => ["3 description", 'Asset_InOutBoard'], ); property inOutGroup => ( tab => 'security', default => 2, fieldType => "group", label => ['inOutGroup', 'Asset_InOutBoard'], hoverHelp => ['inOutGroup description', 'Asset_InOutBoard'], ); property inOutTemplateId => ( tab => 'display', fieldType => "template", namespace => "InOutBoard", label => ["In Out Template", 'Asset_InOutBoard'], hoverHelp => ["In Out Template description", 'Asset_InOutBoard'], default => 'IOB0000000000000000001', ); property reportTemplateId => ( tab => 'display', fieldType => "template", default => 'IOB0000000000000000002', label => [13, 'Asset_InOutBoard'], hoverHelp => ["13 description", 'Asset_InOutBoard'], namespace => "InOutBoard/Report" ); property paginateAfter => ( tab => 'display', fieldType => "integer", default => 50, label => [12, 'Asset_InOutBoard'], hoverHelp => ['12 description', 'Asset_InOutBoard'], ); #See line 285 if you wish to change the users visible in the delegate select list #------------------------------------------------------------------- sub _defineUsername { my $data = shift; if ($data->{firstName} ne "" && $data->{lastName} ne "") { return join ' ', $data->{firstName}, $data->{lastName}; } else { return $data->{username}; } } #------------------------------------------------------------------- sub _fetchNames { my $self = shift; my @userIds = @_; my %nameHash; my $sql = "SELECT users.username, users.userId, firstName, lastName FROM users WHERE users.userId=?"; my $sth = $self->session->db->prepare($sql); foreach my $userId (@userIds) { $sth->execute([ $userId ]); $nameHash{ $userId } = _defineUsername($sth->hashRef); } $sth->finish; return %nameHash; } #------------------------------------------------------------------- sub _fetchDepartments { my $self = shift; return $self->session->db->buildArray("SELECT department FROM userProfileData GROUP BY department"); } #------------------------------------------------------------------- =head2 getStatusList Returns the statusList property as an array =cut sub getStatusList { my $self = shift; my $text = $self->get('statusList'); return grep { $_ } # no empty lines map { s/^\s+//; s/\s+$//; $_ } # trim split(/\r\n|\r|\n/, $text); # seperated by any kind of newline } #------------------------------------------------------------------- =head2 prepareView ( ) See WebGUI::Asset::prepareView() for details. =cut sub prepareView { my $self = shift; $self->SUPER::prepareView(); my $template = WebGUI::Asset::Template->newById($self->session, $self->inOutTemplateId); if (!$template) { WebGUI::Error::ObjectNotFound::Template->throw( error => qq{Template not found}, templateId => $self->inOutTemplateId, assetId => $self->getId, ); } $template->prepare($self->getMetaDataAsTemplateVariables); $self->{_viewTemplate} = $template; } #------------------------------------------------------------------- =head2 purge ( ) Extend the base method to cleanup the status and statusLog tables. =cut override purge => sub { my $self = shift; my $session = $self->session; $session->db->write('delete from InOutBoard_status where assetId=?', [$self->getId]); $session->db->write('delete from InOutBoard_statusLog where assetId=?', [$self->getId]); super(); }; #------------------------------------------------------------------- =head2 view Render the viewing screen, which displays In/Out status and a form to change status. =cut sub view { my $self = shift; my $session = $self->session; my %var; my $url = $self->getUrl('func=view'); my $i18n = WebGUI::International->new($self->session, "Asset_InOutBoard"); if ($session->user->isInGroup($self->reportViewerGroup)) { $var{'viewReportURL'} = $self->getUrl("func=viewReport"); $var{'viewReportLabel'} = $i18n->get('view report label'); $var{canViewReport} = 1; } else { $var{canViewReport} = 0; } my $statusUserId = $self->session->scratch->get("userId") || $self->session->user->userId; tie my %statusOptions, 'Tie::IxHash', ( map { $_ => $_ } $self->getStatusList ); #$self->session->log->warn("VIEW: userId: ".$statusUserId."\n" ); my ($status) = $session->db->quickArray( "select status from InOutBoard_status where userId=? and assetId=?", [ $statusUserId, $self->getId] ); ##Find all the users for which I am a delegate my @users = $session->db->buildArray( "select userId from InOutBoard_delegates where assetId=? and delegateUserId=?", [ $self->getId, $session->user->userId ] ); my $f = WebGUI::FormBuilder->new($session,-action=>$self->getUrl); if (@users) { my %names = ( $self->_fetchNames(@users), "" => $i18n->get('myself'), ); my @options = map { @$_ } sort { $a->[1] cmp $b->[1] } map { [ $_, $names{$_} ] } keys %names ; $f->addField( "selectBox", -name=>"delegate", -options=>\@options, -value=>[ $session->scratch->get("userId") ], -label=>$i18n->get('delegate'), -hoverHelp=>$i18n->get('delegate description'), -extras=>q|onchange="this.form.submit();"|, ); } $f->addField( "radioList", -name=>"status", -value=>$status, -options=>\%statusOptions, -label=>$i18n->get(5), -hoverHelp=>$i18n->get('5 description'), ); $f->addField( "text", -name=>"message", -label=>$i18n->get(6), -hoverHelp=>$i18n->get('6 description'), ); $f->addField( "hidden", -name=>"func", -value=>"setStatus" ); $f->addField( "submit", name => "submit" ); my ($isInGroup) = $session->db->quickArray( "select count(*) from groupings where userId=? and groupId=?", [ $session->user->userId, $self->inOutGroup ] ); if ($isInGroup) { $var{displayForm} = 1; $var{'form'} = $f->toHtml; $var{'selectDelegatesURL'} = $self->getUrl("func=selectDelegates"); $var{'selectDelegatesLabel'} = $i18n->get('select delegates label'); } else { $var{displayForm} = 0; } my $lastDepartment = "_nothing_"; my $p = WebGUI::Paginator->new($session, $url, $self->paginateAfter); my $sql = "select users.username, users.userId, firstName, InOutBoard_status.message, lastName, InOutBoard_status.status, InOutBoard_status.dateStamp, department, groupings.groupId from users left join groupings on groupings.userId=users.userId left join InOutBoard on groupings.groupId=InOutBoard.inOutGroup left join userProfileData on users.userId=userProfileData.userId left join InOutBoard_status on users.userId=InOutBoard_status.userId and InOutBoard_status.assetId=? where users.userId<>'1' and InOutBoard.inOutGroup=? group by userId order by department, lastName, firstName"; $p->setDataByQuery($sql, undef, 0, [ $self->getId, $self->inOutGroup ], ); my $rowdata = $p->getPageData(); my @rows; foreach my $data (@$rowdata) { my %row; if ($lastDepartment ne $data->{department}) { $row{deptHasChanged} = 1; $row{'department'} = ($data->{department}||$i18n->get(7)); $lastDepartment = $data->{department}; } else { $row{deptHasChanged} = 0; } if ($data->{firstName} ne "" && $data->{lastName} ne "") { $row{'username'} = $data->{firstName}." ".$data->{lastName}; } else { $row{'username'} = $data->{username}; } $row{'status'} = ($data->{status} || $i18n->get(15)); $row{'dateStamp'} = $data->{status} ? $self->session->datetime->epochToHuman($data->{dateStamp}) : " "; $row{'message'} = ($data->{message} || " "); push (@rows, \%row); } $var{rows_loop} = \@rows; $var{'paginateBar'} = $p->getBarTraditional(); $p->appendTemplateVars(\%var); return $self->processTemplate(\%var,undef,$self->{_viewTemplate}); } #------------------------------------------------------------------- =head2 www_selectDelegates Form where a user can select delegates, other users who are allowed to change their status. =cut sub www_selectDelegates { my $self = shift; my %userNames = (); my $sth = $self->session->db->read( "select users.username, users.userId, firstName, lastName from users left join groupings on users.userId=groupings.userId left join InOutBoard on groupings.groupId=InOutBoard.inOutGroup left join InOutBoard_status on users.userId=InOutBoard_status.userId and InOutBoard_status.assetId=? where users.userId<>'1' and users.status='Active' and users.userId <> ? and InOutBoard.inOutGroup=? group by userId ",[$self->getId, $self->session->user->userId, $self->inOutGroup]); while (my $data = $sth->hashRef) { $userNames{ $data->{userId} } = _defineUsername($data); } $sth->finish; my $sql = sprintf "select delegateUserId from InOutBoard_delegates where userId=%s and assetId=%s", $self->session->db->quote($self->session->user->userId), $self->session->db->quote($self->getId); my $delegates = $self->session->db->buildArrayRef($sql); my $i18n = WebGUI::International->new($self->session,"Asset_InOutBoard"); my $f = WebGUI::FormBuilder->new($self->session,action=>$self->getUrl); $f->addField( "hidden", name => "func", value => "selectDelegatesEditSave" ); $f->addField( "selectList", name => "delegates", label => $i18n->get('in/out status delegates'), hoverHelp => $i18n->get('in/out status delegates description','Asset_InOutBoard'), options => \%userNames, multiple => 1, ##Multiple select size => 10, ##Multiple select sortByValue => 1, value => $delegates, ##My current delegates, if any subtext => $i18n->get('in/out status delegates subtext'), ); $f->addField( "submit", name => "submit" ); return '