%# Real Users never know what they want, but they always know when your
%# program doesn't deliver it.
<& /Edit/Elements/104Header,
Buttons => [
Add => "?Queue=$Queue&Action-Add=1&Entry=$Entry",
Save => ($Entry ? "javascript:document.getElementById('mainform').submit()" : ''),
Delete => ($Entry ? "?Queue=$Queue&Entry=$Entry&Parent=$Parent&Action-Delete=1" : ''),
Copy => '',
Search => '',
Import => $m->scomp('/Edit/Elements/NewWindow', "Import.html?Queue=$Queue", 650, 290),
Export => $m->scomp('/Edit/Elements/NewWindow', "Export.html?Queue=$Queue", 650, 290),
],
Method => 'POST',
&>
% if ($Queue) { $m->print($m->content) } else {
<& /Edit/Elements/Tab, Text => 'Global' &> |
<& /Edit/Elements/Tabs, Map => $ARGS{Map}, URL => '../Workflow/' &> |
% }
<& Top, List => $List, Item => $Item, ParentItem => $ParentItem, QueueObj => $QueueObj, Queue => $Queue &>
|
% $m->print($ListHTML);
|
|
|
|
|
|
|
<%INIT>
require RT::Workflow;
my $Scrips = RT::Scrips->new($session{'CurrentUser'});
my $Workflows = RT::Templates->new($session{'CurrentUser'});
my $QueueObj = RT::Queue->new($session{'CurrentUser'});
$QueueObj->Load($Queue) if $Queue;
if ($QueueObj->Id) {
$Workflows->LimitToQueue($Queue);
$Scrips->LimitToQueue($Queue);
}
else {
$Workflows->LimitToGlobal();
$Scrips->LimitToGlobal();
}
$Workflows->Limit( FIELD => 'Content', VALUE => '%===Create-Ticket:%', OPERATOR => 'LIKE' );
my $List = RT::Workflow->new($session{'CurrentUser'});
if ( $Workflows->Count ) {
$List->Load( $Workflows->First->Id );
eval { $List->TemplateObj->_expire( $List->TemplateObj->_gen_primary_cache_key()) };
}
else {
$List->Create( Queue => $Queue, Name => 'Default Approval' );
}
# now check for activation scrips
my $HasFlow;
while (my $Scrip = $Scrips->Next) {
next unless $Scrip->ScripActionObj and $Scrip->ScripActionObj->Name eq 'Create Tickets';
$HasFlow = 1;
last;
}
if (!$HasFlow) {
my $Item = RT::Scrip->new($session{'CurrentUser'});
my ($val, $msg) = $Item->Create(
Queue => $Queue,
Description => ($Queue ? 'Default Approval' : 'Global Approval'),
ScripAction => 'Create Tickets',
ScripCondition => 'On Create',
Template => $List->TemplateObj->Id,
CustomPrepareCode => '',
CustomCommitCode => '',
CustomIsApplicableCode => '',
);
Abort(loc("Could not create Scrip", $msg)) unless ($val);
}
$m->comp('/Edit/Elements/CreateApprovalsQueue');
my $Item = $List->Entries->{$Entry} if $Entry;
my $ParentItem = $Parent ? $List->Entries->{$Parent} : $List;
if ($Action eq 'Delete') {
# do major magic here.
$Entry = $Parent;
$ParentItem->DeleteChild($Item->Id);
if ($Entry) {
$Item = $List->Entries->{$Entry};
$Parent = $Entry;
$Parent =~ s/(?:^|\.)\d+$//;
$ParentItem = $List->Entries->{$Parent} || $List;
}
$List->Save;
}
elsif ($Action eq 'Add') {
$ParentItem = $Item;
$Item = RT::Workflow::Entry->new($session{CurrentUser});
$Item->SetType('approval');
$Item->SetOwnerClass('owner');
my $rand = rand();
$Item->SetSubject($rand);
$Item->{Id} = 'new';
if ($ParentItem) {
$ParentItem->{NextStates} .= ",new";
$Parent = $ParentItem->Id;
}
else {
$ParentItem = $List;
$Parent = undef;
}
$List->Entries->{new} = $Item;
$List->Parse($List->Dump);
$Item = (grep { $_->Subject eq $rand } values %{$List->Entries})[0];
$Item->SetSubject('new');
$Entry = $Item->Id;
$List->Save;
}
elsif ($Action eq 'Save' and $r->method eq 'POST') {
$ARGS{SetActionFields} ||= '';
foreach my $method (grep /^Set/, keys %ARGS) {
$Item->{substr($method, 3)} = $ARGS{$method};
}
my %Field;
foreach my $method (grep /^FieldSet/, keys %ARGS) {
if (length($ARGS{$method})) {
$Field{substr($method, 8)} = $ARGS{$method};
}
else {
delete $Field{substr($method, 8)};
}
}
$Field{fields} = join(',', @{$Field{fields}})
if UNIVERSAL::isa($Field{fields}, 'ARRAY');
$Item->SetConditionFields(join(',', map { s/,/./g; $_ } %Field));
$Item->SetActionFields(
join(',',
UNIVERSAL::isa($Item->{ActionFields}, 'ARRAY')
? @{$Item->{ActionFields}} : $Item->{ActionFields}
)
);
if (my $Alias = $List->Entries->{$Item->{AliasFor}}) {
delete $List->Entries->{$Item->Id} unless $Item->Parents > 1;
$ParentItem->{NextStates} = join(',',
$Alias->Id,
grep { $_ ne $Item->Id } split(/,/, ($ParentItem->{NextStates} || ''))
);
my $rand = rand();
my $alias_subj = $Alias->Subject;
my $parent_subj = $ParentItem->Subject;
$Alias->SetSubject($rand) if $Alias;
$ParentItem->SetSubject("p$rand");
$List->Parse($List->Dump);
$Item = (grep { $_->Subject eq $rand } values %{$List->Entries})[0];
$Item->SetSubject($alias_subj);
$ParentItem = (grep { $_->Subject eq "p$rand" } values %{$List->Entries})[0];
$ParentItem->SetSubject($parent_subj) if $ParentItem;
$Parent = $ParentItem->Id if $ParentItem;
$Entry = $Item->Id if $Item;
}
$List->Save;
}
else {
undef $Action; # display only
}
return $m->comp('/Edit/Elements/Redirect', Args => "?Queue=$Queue;Entry=$Entry;Parent=$Parent") if $Action;
my $ListHTML = $m->scomp('List', List => $List, Item => $Item, ParentItem => $ParentItem, Queue => $Queue);
%INIT>
<%ARGS>
$Entry => undef
$Parent => undef
$Queue => 0
$Action => ''
%ARGS>