migrate attachments to JsonTable
This commit is contained in:
parent
0853a95873
commit
129016325d
1 changed files with 36 additions and 137 deletions
|
|
@ -112,6 +112,9 @@ sub definition {
|
||||||
storageIdExample => {
|
storageIdExample => {
|
||||||
fieldType => 'image',
|
fieldType => 'image',
|
||||||
},
|
},
|
||||||
|
attachmentsJson => {
|
||||||
|
fieldType => 'JsonTable',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
return $class->SUPER::definition($session,$definition);
|
return $class->SUPER::definition($session,$definition);
|
||||||
|
|
@ -119,33 +122,6 @@ sub definition {
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
=head2 addAttachments ( attachments )
|
|
||||||
|
|
||||||
Adds attachments to this template. Attachments is an arrayref of hashrefs,
|
|
||||||
where each hashref should have at least url, type, and sequence as keys.
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
sub addAttachments {
|
|
||||||
my ($self, $attachments) = @_;
|
|
||||||
|
|
||||||
my $db = $self->session->db;
|
|
||||||
|
|
||||||
foreach my $a (@$attachments) {
|
|
||||||
my %params = (
|
|
||||||
templateId => $self->getId,
|
|
||||||
revisionDate => $self->get('revisionDate'),
|
|
||||||
url => $a->{url},
|
|
||||||
type => $a->{type},
|
|
||||||
sequence => $a->{sequence},
|
|
||||||
attachId => 'new',
|
|
||||||
);
|
|
||||||
$db->setRow('template_attachments', 'attachId', \%params);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
|
|
||||||
=head2 addRevision ( )
|
=head2 addRevision ( )
|
||||||
|
|
||||||
Override the master addRevision to copy attachments
|
Override the master addRevision to copy attachments
|
||||||
|
|
@ -156,7 +132,6 @@ sub addRevision {
|
||||||
my ( $self, $properties, @args ) = @_;
|
my ( $self, $properties, @args ) = @_;
|
||||||
my $asset = $self->SUPER::addRevision($properties, @args);
|
my $asset = $self->SUPER::addRevision($properties, @args);
|
||||||
delete $properties->{templatePacked};
|
delete $properties->{templatePacked};
|
||||||
$asset->addAttachments($self->getAttachments);
|
|
||||||
return $asset;
|
return $asset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -192,7 +167,6 @@ sub duplicate {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $newTemplate = $self->SUPER::duplicate;
|
my $newTemplate = $self->SUPER::duplicate;
|
||||||
$newTemplate->update({isDefault => 0});
|
$newTemplate->update({isDefault => 0});
|
||||||
$newTemplate->addAttachments($self->getAttachments);
|
|
||||||
if ( my $storageId = $self->get('storageIdExample') ) {
|
if ( my $storageId = $self->get('storageIdExample') ) {
|
||||||
my $newStorage = WebGUI::Storage->get( $self->session, $storageId )->copy;
|
my $newStorage = WebGUI::Storage->get( $self->session, $storageId )->copy;
|
||||||
$newTemplate->update({ storageIdExample => $newStorage->getId });
|
$newTemplate->update({ storageIdExample => $newStorage->getId });
|
||||||
|
|
@ -211,7 +185,6 @@ Override to add attachments to package data
|
||||||
sub exportAssetData {
|
sub exportAssetData {
|
||||||
my ( $self ) = @_;
|
my ( $self ) = @_;
|
||||||
my $data = $self->SUPER::exportAssetData;
|
my $data = $self->SUPER::exportAssetData;
|
||||||
$data->{template_attachments} = $self->getAttachments;
|
|
||||||
if ( $self->get('storageIdExample') ) {
|
if ( $self->get('storageIdExample') ) {
|
||||||
push @{$data->{storage}}, $self->get('storageIdExample');
|
push @{$data->{storage}}, $self->get('storageIdExample');
|
||||||
}
|
}
|
||||||
|
|
@ -234,27 +207,18 @@ If defined, will limit the attachments to this type; e.g., passing
|
||||||
|
|
||||||
sub getAttachments {
|
sub getAttachments {
|
||||||
my ( $self, $type ) = @_;
|
my ( $self, $type ) = @_;
|
||||||
my @params = ($self->getId, $self->get('revisionDate'));
|
if ( !$self->{_attachments} ) {
|
||||||
my $typeString;
|
$self->{_attachments} = JSON->new->decode( $self->get('attachmentsJson') );
|
||||||
|
}
|
||||||
|
|
||||||
if ($type) {
|
my $output = [];
|
||||||
$typeString = 'AND type = ?';
|
for my $attach ( @{$self->{_attachments}} ) {
|
||||||
push(@params, $type);
|
if ( $attach->{type} eq $type ) {
|
||||||
}
|
push @{$output}, $attach;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
my $sql = qq{
|
return $output;
|
||||||
SELECT
|
|
||||||
*
|
|
||||||
FROM
|
|
||||||
template_attachments
|
|
||||||
WHERE
|
|
||||||
templateId = ?
|
|
||||||
AND revisionDate = ?
|
|
||||||
$typeString
|
|
||||||
ORDER BY
|
|
||||||
type, sequence ASC
|
|
||||||
};
|
|
||||||
return $self->session->db->buildArrayRefOfHashRefs($sql, \@params);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
@ -329,74 +293,30 @@ sub getEditForm {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
### Template attachments
|
$properties->jsonTable(
|
||||||
my $session = $self->session;
|
name => 'attachmentsJson',
|
||||||
my @headers = map { '<th>' . $i18n->get("attachment header $_") . '</th>' }
|
value => $self->get('attachmentsJson'),
|
||||||
qw(index type url remove);
|
label => $i18n->get("attachments display label"),
|
||||||
|
fields => [
|
||||||
tie my %attachmentTypeNames, 'Tie::IxHash' => (
|
{
|
||||||
stylesheet => $i18n->get('css label'),
|
type => "text",
|
||||||
headScript => $i18n->get('js head label'),
|
name => "url",
|
||||||
bodyScript => $i18n->get('js body label'),
|
label => $i18n->get('attachment header url'),
|
||||||
|
size => '48',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type => "select",
|
||||||
|
name => "type",
|
||||||
|
label => $i18n->get('attachment header type'),
|
||||||
|
options => [
|
||||||
|
stylesheet => $i18n->get('css label'),
|
||||||
|
headScript => $i18n->get('js head label'),
|
||||||
|
bodyScript => $i18n->get('js body label'),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
my $table = '<table id="attachmentDisplay">';
|
|
||||||
$table .= "<thead><tr>@headers</tr></thead><tbody id='addAnchor'>";
|
|
||||||
foreach my $a ( @{ $self->getAttachments } ) {
|
|
||||||
my ($seq, $type, $url) = @{$a}{qw(sequence type url)};
|
|
||||||
# escape macros in the url so they don't get processed
|
|
||||||
$url =~ s/\^/^/g;
|
|
||||||
my $del = WebGUI::Form::checkbox(
|
|
||||||
$session, {
|
|
||||||
name => 'removeAttachment',
|
|
||||||
value => $url,
|
|
||||||
extras => 'class="id"',
|
|
||||||
}
|
|
||||||
);
|
|
||||||
my @data = (
|
|
||||||
"<td class='index'>$seq</td>",
|
|
||||||
"<td class='type'>$type</td>",
|
|
||||||
"<td class='url'>$url</td>",
|
|
||||||
"<td>$del</td>",
|
|
||||||
);
|
|
||||||
$table .= "<tr class='existingAttachment'>@data</tr>";
|
|
||||||
}
|
|
||||||
$table .= '</tbody></table>';
|
|
||||||
my $properties = $tabform->getTab('properties');
|
|
||||||
my $label = $i18n->get('attachment display label');
|
|
||||||
$properties->raw("<tr><td>$label</td><td>$table</td></tr>");
|
|
||||||
|
|
||||||
my @data = map { "<td>$_</td>" } (
|
|
||||||
WebGUI::Form::integer(
|
|
||||||
$session, { size => '2', id => 'addBoxIndex' }
|
|
||||||
),
|
|
||||||
WebGUI::Form::selectBox(
|
|
||||||
$session, { options => \%attachmentTypeNames, id => 'addBoxType' }
|
|
||||||
),
|
|
||||||
WebGUI::Form::text($session, { id => 'addBoxUrl', size => 40 }),
|
|
||||||
WebGUI::Form::button(
|
|
||||||
$session, {
|
|
||||||
value => $i18n->get('attachment add button'),
|
|
||||||
extras => 'onclick="addClick()"'
|
|
||||||
}
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
my ($style, $url) = $self->session->quick(qw(style url));
|
|
||||||
$style->setScript($url->extras('yui/build/yahoo/yahoo-min.js'), {type => 'text/javascript'});
|
|
||||||
$style->setScript($url->extras('yui/build/json/json-min.js'), {type => 'text/javascript'});
|
|
||||||
$style->setScript($url->extras('yui/build/dom/dom-min.js'), {type => 'text/javascript'});
|
|
||||||
$style->setScript($url->extras('yui/build/event/event-min.js'), {type => 'text/javascript'});
|
|
||||||
$style->setScript($url->extras('yui/build/connection/connection-min.js'), {type => 'text/javascript'});
|
|
||||||
$style->setScript($url->extras('yui-webgui/build/i18n/i18n.js'), {type => 'text/javascript'});
|
|
||||||
|
|
||||||
pop(@headers);
|
|
||||||
my $scriptUrl = $url->extras('templateAttachments.js');
|
|
||||||
$table = "<table id='addBox'><tr>@headers</tr><tr>@data</tr></table>";
|
|
||||||
$table .= qq(<script type="text/javascript" src="$scriptUrl"></script>);
|
|
||||||
$label = $i18n->get('attachment add field label');
|
|
||||||
$properties->raw("<tr><td>$label</td><td>$table</td></tr>");
|
|
||||||
|
|
||||||
$properties->image(
|
$properties->image(
|
||||||
name => 'storageIdExample',
|
name => 'storageIdExample',
|
||||||
value => $self->getValue('storageIdExample'),
|
value => $self->getValue('storageIdExample'),
|
||||||
|
|
@ -690,28 +610,7 @@ sub processPropertiesFromFormPost {
|
||||||
}
|
}
|
||||||
|
|
||||||
### Template attachments
|
### Template attachments
|
||||||
my $f = $self->session->form;
|
$self->update({ attachmentsJson => $f->process( 'attachmentsJson', 'JsonTable' ), });
|
||||||
my $p = $f->paramsHashRef;
|
|
||||||
my @nums = grep {$_} map { my ($i) = /^attachmentUrl(\d+)$/; $i } keys %$p;
|
|
||||||
my @add;
|
|
||||||
|
|
||||||
# Remove all attachments first, then re-add whatever's left in the form
|
|
||||||
$self->removeAttachments;
|
|
||||||
|
|
||||||
foreach my $n (@nums) {
|
|
||||||
my ($index, $type, $url) =
|
|
||||||
map { $f->process('attachment' . $_ . $n) }
|
|
||||||
qw(Index Type Url);
|
|
||||||
|
|
||||||
push(
|
|
||||||
@add, {
|
|
||||||
sequence => $index,
|
|
||||||
url => $url,
|
|
||||||
type => $type,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
$self->addAttachments(\@add);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue