174 lines
4.2 KiB
Perl
174 lines
4.2 KiB
Perl
package WebGUI::ProgressTree;
|
|
|
|
use warnings;
|
|
use strict;
|
|
|
|
=head1 NAME
|
|
|
|
WebGUI::ProgressTree
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
Helper functions for maintaining a JSON represtentation of the progress of an
|
|
operation that modifies a tree of assets. See WebGUI::Fork::ProgressTree for a
|
|
status page that renders this.
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
my $tree = WebGUI::ProgressTree->new($session, \@assetIds);
|
|
$tree->success($assetId);
|
|
$tree->failure($assetId, $reason);
|
|
$tree->note($assetId, 'something about this one...');
|
|
|
|
=head1 LEGAL
|
|
|
|
-------------------------------------------------------------------
|
|
WebGUI is Copyright 2001-2012 Plain Black Corporation.
|
|
-------------------------------------------------------------------
|
|
Please read the legal notices (docs/legal.txt) and the license
|
|
(docs/license.txt) that came with this distribution before using
|
|
this software.
|
|
-------------------------------------------------------------------
|
|
http://www.plainblack.com info@plainblack.com
|
|
-------------------------------------------------------------------
|
|
|
|
=head1 METHODS
|
|
|
|
=cut
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 new ($session, $assetIds)
|
|
|
|
Constructs new tree object for tracking the progress of $assetIds.
|
|
|
|
=cut
|
|
|
|
sub new {
|
|
my ( $class, $session, $assetIds ) = @_;
|
|
my ( %flat, @roots );
|
|
if (@$assetIds) {
|
|
my $db = $session->db;
|
|
my $dbh = $db->dbh;
|
|
my $set = join( ',', map { $dbh->quote($_) } @$assetIds );
|
|
my $sql = qq{
|
|
SELECT a.assetId, a.parentId, d.url
|
|
FROM asset a INNER JOIN assetData d ON a.assetId = d.assetId
|
|
WHERE a.assetId IN ($set)
|
|
ORDER BY a.lineage ASC, d.revisionDate DESC
|
|
};
|
|
my $sth = $db->read($sql);
|
|
|
|
while ( my $asset = $sth->hashRef ) {
|
|
my ( $id, $parentId ) = delete @{$asset}{ 'assetId', 'parentId' };
|
|
|
|
# We'll get back multiple rows for each asset, but the first one
|
|
# is the latest. Skip the others.
|
|
next if $flat{$id};
|
|
$flat{$id} = $asset;
|
|
if ( my $parent = $flat{$parentId} ) {
|
|
push( @{ $parent->{children} }, $asset );
|
|
}
|
|
else {
|
|
push( @roots, $asset );
|
|
}
|
|
}
|
|
}
|
|
my $self = {
|
|
session => $session,
|
|
tree => \@roots,
|
|
flat => \%flat,
|
|
};
|
|
bless $self, $class;
|
|
} ## end sub new
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 success ($assetId)
|
|
|
|
Whatever we were doing to $assetId succeeded. Woohoo!
|
|
|
|
=cut
|
|
|
|
sub success {
|
|
my ( $self, $assetId ) = @_;
|
|
$self->{flat}->{$assetId}->{success} = 1;
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 failure ($assetId, $reason)
|
|
|
|
Whatever we were doing to $assetId didn't work for $reason. Aww.
|
|
|
|
=cut
|
|
|
|
sub failure {
|
|
my ( $self, $assetId, $reason ) = @_;
|
|
$self->{flat}->{$assetId}->{failure} = $reason;
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 note ($assetId, $note)
|
|
|
|
Add some extra text. WebGUI::Fork::ProgressTree displays these as paragraphs
|
|
under the node for this asset.
|
|
|
|
=cut
|
|
|
|
sub note {
|
|
my ( $self, $assetId, $note ) = @_;
|
|
push( @{ $self->{flat}->{$assetId}->{notes} }, $note );
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 focus ($assetId)
|
|
|
|
Make a note that this is the asset that we are currently doing something with.
|
|
|
|
=cut
|
|
|
|
sub focus {
|
|
my ( $self, $assetId ) = @_;
|
|
if ( my $last = delete $self->{last} ) {
|
|
delete $last->{focus};
|
|
}
|
|
if ($assetId) {
|
|
my $focus = $self->{last} = $self->{flat}->{$assetId};
|
|
$focus->{focus} = 1;
|
|
}
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 tree
|
|
|
|
A hashy representation of the status of this tree of assets.
|
|
|
|
=cut
|
|
|
|
sub tree { $_[0]->{tree} }
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 json
|
|
|
|
$self->tree encoded as json.
|
|
|
|
=cut
|
|
|
|
sub json { JSON::encode_json( $_[0]->tree ) }
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 session
|
|
|
|
The WebGUI::Session this progress tree is associated with.
|
|
|
|
=cut
|
|
|
|
sub session { $_[0]->{session} }
|
|
|
|
1;
|