Revision 635 (by ahitrov, 2016/12/21 10:19:32) |
Ajax tag manager now updates tags field in object if exists.
|
<% $json %>
<%once>
use JSON::XS;
</%once>
<%args>
$action => undef
$id => undef
$class => undef
$tag => undef
</%args>
<%init>
my %result;
warn Dumper \%ARGS;
my $doc = $keeper->get_document_by_id( $id, class => $class );
if ( ref $doc && $ARGS{tag} ) {
my @links = $keeper->get_links(
class => 'tag::Cloud',
dest_id => $id,
dest_class => $class,
);
my @tags;
if ( @links ) {
my %ids = map { $_->source_id => 1 } @links;
my @ids = keys %ids;
@tags = $keeper->get_documents(
id => \@ids,
class => 'tag::Tag',
) if @ids;
}
my ($tobj) = $keeper->get_documents(
class => 'tag::Tag',
name => $ARGS{tag},
ilike => 1,
limit => 1,
);
if ( $action eq 'add' ) {
unless ( ref $tobj ) {
$tobj = tag::Tag->new( $keeper );
$tobj->name( $ARGS{tag} );
$tobj->status( 1 );
$tobj->store;
}
my $exists = (grep { $_->id == $tobj->id } @tags) ? 1 : 0;
if ( ref $tobj && !$exists ) {
my $link = tag::Cloud->new( $keeper );
$link->source_id( $tobj->id );
$link->source_class( $tobj->class );
$link->dest_id( $id );
$link->dest_class( $class );
$link->status( 1 );
$link->store;
} else {
$result{fallback} = 1;
}
} elsif ( $action eq 'remove' ) {
if ( ref $tobj ) {
my @delete = grep { $_->source_id == $tobj->id } @links;
foreach my $obj ( @delete ) {
$obj->delete;
}
my $count = $keeper->get_links(
class => 'tag::Cloud',
count => 1,
source_id => $tobj->id,
);
$tobj->delete unless $count;
} else {
$result{fallback} = 1;
}
}
my ($prop) = grep { $_->{type} eq 'tagset' } $doc->structure;
if ( ref $prop && !(exists $prop->{virtual} && $prop->{virtual}) ) {
my $class = $doc->class;
my $name = $prop->{attr};
my $is_extra = scalar( grep { ref $_ && $_->{attr} eq $name } $class->class_table->required_properties ) ? 0 : 1;
my $result;
my @tags;
if ( $doc->id ) {
@tags = $keeper->get_documents(
class => 'tag::Tag',
lclass => 'tag::Cloud',
ldest => $doc->id,
ldestclass => $doc->class,
);
if ( @tags ) {
$result = [];
foreach my $tag ( @tags ) {
push @$result, { id => $tag->id, name => $is_extra ? $tag->name : Encode::decode('utf-8', $tag->name) };
}
unless ( $is_extra ) {
$result = Encode::encode('utf-8', JSON::XS->new->encode( $result ));
}
}
warn Dumper $result if $DEBUG;
$doc->$name( $result );
$doc->store;
}
}
}
$result{ok} = 1 unless exists $result{fallback};
my $json = encode_json \%result;
</%init>