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>