diff --git a/app/assets/javascripts/app/controllers/agent_ticket_zoom.js.coffee b/app/assets/javascripts/app/controllers/agent_ticket_zoom.js.coffee index 426a7727d..70bfb12b6 100644 --- a/app/assets/javascripts/app/controllers/agent_ticket_zoom.js.coffee +++ b/app/assets/javascripts/app/controllers/agent_ticket_zoom.js.coffee @@ -207,6 +207,13 @@ class Index extends App.Controller ticket: @ticket, ) + # start link info controller + new App.LinkInfo( + el: @el.find('#link_info'), + object_type: 'Ticket', + object: @ticket, + ) + # scrall to article if given if @article_id offset = document.getElementById( 'article-' + @article_id ).offsetTop diff --git a/app/assets/javascripts/app/controllers/link_info.js.coffee b/app/assets/javascripts/app/controllers/link_info.js.coffee new file mode 100644 index 000000000..91a092369 --- /dev/null +++ b/app/assets/javascripts/app/controllers/link_info.js.coffee @@ -0,0 +1,62 @@ +$ = jQuery.sub() + +class App.LinkInfo extends App.Controller + events: + 'focusout [data-type=edit]': 'update', + + constructor: -> + super + + # fetch item on demand + # get data + App.Com.ajax( + id: 'links_' + @object_id + '_' + @object, + type: 'GET', + url: '/links', + data: { + link_object: @object_type, + link_object_value: @object.id, + } + processData: true, + success: (data, status, xhr) => + @links = data.links + + # load user collection + @loadCollection( type: 'User', data: data.users ) + + # load ticket collection + @loadCollection( type: 'Ticket', data: data.tickets ) + + @render() + ) + + render: () -> + + list = {} + for item in @links + if !list[ item['link_type'] ] + list[ item['link_type'] ] = [] + + if item['link_object'] is 'Ticket' + list[ item['link_type'] ].push App.Ticket.find( item['link_object_value'] ) + + return if _.isEmpty( @links ) + + # insert data + @html App.view('link_info')( + links: list, + ) + +# @ticketPopups( +# selector: '.user-tickets', +# user_id: user_id, +# ) + + update: (e) => + + # update changes + note = $(e.target).parent().find('[data-type=edit]').val() + user = App.User.find(@user_id) + if user.note isnt note + user.updateAttributes( note: note ) + @log 'update', e, note, user diff --git a/app/assets/javascripts/app/views/agent_ticket_zoom.jst.eco b/app/assets/javascripts/app/views/agent_ticket_zoom.jst.eco index 34ee66247..09addc333 100644 --- a/app/assets/javascripts/app/views/agent_ticket_zoom.jst.eco +++ b/app/assets/javascripts/app/views/agent_ticket_zoom.jst.eco @@ -106,17 +106,9 @@ - + + + diff --git a/app/assets/javascripts/app/views/link_info.jst.eco b/app/assets/javascripts/app/views/link_info.jst.eco new file mode 100644 index 000000000..274ef6e2d --- /dev/null +++ b/app/assets/javascripts/app/views/link_info.jst.eco @@ -0,0 +1,13 @@ +
+

<%- T('Linked Objects') %>

+ + <% for type of @links: %> + <%- T( type ) %> + + <% end %> + +
diff --git a/app/controllers/links_controller.rb b/app/controllers/links_controller.rb new file mode 100644 index 000000000..5f5a6ab04 --- /dev/null +++ b/app/controllers/links_controller.rb @@ -0,0 +1,69 @@ +class LinksController < ApplicationController + before_filter :authentication_check + + # GET /links + def index + links = Link.list( + :link_object => params[:link_object], + :link_object_value => params[:link_object_value], + ) + + # + tickets = [] + users = {} + link_list = [] + links.each { |item| + link_list.push item + if item['link_object'] == 'Ticket' + data = Ticket.full_data( item['link_object_value'] ) + tickets.push data + if !users[ data['owner_id'] ] + users[ data['owner_id'] ] = User.user_data_full( data['owner_id'] ) + end + if !users[ data['customer_id'] ] + users[ data['customer_id'] ] = User.user_data_full( data['customer_id'] ) + end + if !users[ data['created_by_id'] ] + users[ data['created_by_id'] ] = User.user_data_full( data['created_by_id'] ) + end + end + } + + # return result + render :json => { + :links => link_list, + :tickets => tickets, + :users => users, + } + end + + # POST /links/add + def add +# @template.created_by_id = current_user.id + link = Link.add( + :link_type => params[:link_type], + :link_object_source => params[:link_object_source], + :link_object_source_value => params[:link_object_source_value], + :link_object_target => params[:link_object_target], + :link_object_target_value => params[:link_object_target_value] + ) + + if link + render :json => link, :status => :created + else + render :json => link.errors, :status => :unprocessable_entity + end + end + + # DELETE /links/delete + def delete + @template = Template.find(params[:id]) + + if @template.update_attributes(params[:template]) + render :json => @template, :status => :ok + else + render :json => @template.errors, :status => :unprocessable_entity + end + end + +end diff --git a/app/models/link.rb b/app/models/link.rb index 35e82ea07..619df21b0 100644 --- a/app/models/link.rb +++ b/app/models/link.rb @@ -1,27 +1,33 @@ class Link < ActiveRecord::Base - has_many :link_types + belongs_to :link_type, :class_name => 'Link::Type' + belongs_to :link_object, :class_name => 'Link::Object' - #before_create :check_object - #after_create :after_create, :cache_delete - #after_update :cache_delete - #after_destroy :cache_delete + #before_create :check_object + #after_create :after_create, :cache_delete + #after_update :cache_delete + #after_destroy :cache_delete =begin Link.add( - :link_types_id => 12, + :link_type => 'normal', :link_object_source => 'Ticket', - :link_object_source_value => 1, + :link_object_source_value => 6, :link_object_target => 'Ticket', - :link_object_target_value => 1 + :link_object_target_value => 31 ) Link.add( :link_types_id => 12, - :link_object_source_id => '1', + :link_object_source_id => 1, :link_object_source_value => 1, - :link_object_target_id => '1', - :link_object_target_value => 1, + :link_object_target_id => 1, + :link_object_target_value => 1 + ) + + Link.list( + :link_object => 'Ticket', + :link_object_value => 1 ) Link.get_links_for_source_object( @@ -41,34 +47,73 @@ class Link < ActiveRecord::Base Link.delete_all_links_by_value( :object_value => 1 ) =end + def self.list(data) + linkobject = self.link_object_get( :name => data[:link_object] ) + return if !linkobject + list = Link.where( + 'link_object_source_id = ? AND link_object_source_value = ?', linkobject.id, data[:link_object_value] + ) + + map = { + 'normal' => 'normal', + 'parent' => 'child', + 'child' => 'parent', + } + + items = [] + list.each { |item| + link = {} + link['link_type'] = map[ Link::Type.find( item.link_type_id ).name ] + link['link_object'] = Link::Object.find( item.link_object_target_id ).name + link['link_object_value'] = item.link_object_target_value + items.push link + } + + list = Link.where( + 'link_object_target_id = ? AND link_object_target_value = ?', linkobject.id, data[:link_object_value] + ) + list.each { |item| + link = {} + link['link_type'] = Link::Type.find( item.link_type_id ).name + link['link_object'] = Link::Object.find( item.link_object_source_id ).name + link['link_object_value'] = item.link_object_source_value + items.push link + } + + return items + end def self.get_links_for_source_object(data) linkobject_id = self.get_linktype_by_name( :name => data[:link_object] ) if linkobject_id - where( :link_object_source_id => linkobject_id, :link_object_source_value => data[:link_object_value] ) + Link.where( :link_object_source_id => linkobject_id, :link_object_source_value => data[:link_object_value] ) end end def self.get_links_for_target_object(data) linkobject_id = self.get_linktype_by_name( :name => data[:link_object] ) if linkobject_id - where( :link_object_target_id => linkobject_id, :link_object_target_value => data[:link_object_value] ) + Link.where( :link_object_target_id => linkobject_id, :link_object_target_value => data[:link_object_value] ) end end def self.add(data) - if data.has_key?(:link_object_source) - # it exists we have to delete it - linkobject_id = self.get_linktype_by_name( :name => data[:link_object_source] ) - data[:link_object_source_id] = linkobject_id + if data.has_key?(:link_type) + linktype = self.link_type_get( :name => data[:link_type] ) + data[:link_type_id] = linktype.id + data.delete( :link_type ) + end + + if data.has_key?(:link_object_source) + linkobject = self.link_object_get( :name => data[:link_object_source] ) + data[:link_object_source_id] = linkobject.id data.delete( :link_object_source ) end - + if data.has_key?(:link_object_target) - # it exists we have to delete it - linkobject_id = self.get_linktype_by_name( :name => data[:link_object_target] ) - data[:link_object_target_id] = linkobject_id + linkobject = self.link_object_get( :name => data[:link_object_target] ) + data[:link_object_target_id] = linkobject.id data.delete( :link_object_target ) end @@ -87,16 +132,29 @@ class Link < ActiveRecord::Base Link.where( ["link_object_source_value = ? or link_object_target_value = ?", data[:object_value], data[:object_value]] ).destroy_all end - private - def self.get_linktype_by_name(data) - linkid = Link::Object.where(:name=>data[:name]).first - if linkid - return linkid.id - else - return nil + def self.link_type_get(data) + linktype = Link::Type.where( :name => data[:name] ).first + if !linktype + linktype = Link::Type.create( + :name => data[:name] + ) end - return linkid + return linktype + end + + def self.link_object_get(data) + linkobject = Link::Object.where( :name => data[:name] ).first + if !linkobject + linkobject = Link::Object.create( + :name => data[:name] + ) + end + return linkobject + end + + def self.get_linktype_by_name(data) + linkid = Link::Object.where( :name => data[:name] ).first end #checks for a valid link type diff --git a/app/models/ticket.rb b/app/models/ticket.rb index 62429021a..7071e49e8 100644 --- a/app/models/ticket.rb +++ b/app/models/ticket.rb @@ -64,12 +64,19 @@ class Ticket < ApplicationModel # add history to both # link tickets + Link.add( + :link_type => 'parent', + :link_object_source => 'Ticket', + :link_object_source_value => data[:ticket_id], + :link_object_target => 'Ticket', + :link_object_target_value => self.id + ) # set state to 'merged' self.ticket_state_id = Ticket::State.where( :name => 'merged' ).first.id # rest owner - self.owner_id = User.where(:login => '-').first.id + self.owner_id = User.where( :login => '-' ).first.id # save ticket self.save diff --git a/config/routes/base.rb b/config/routes/base.rb index 5ed18d907..8eb25456e 100644 --- a/config/routes/base.rb +++ b/config/routes/base.rb @@ -20,13 +20,18 @@ module ExtraRoutes # templates map.resources :templates - + + # links + map.match '/links', :to => 'links#index' + map.match '/links/add', :to => 'links#add' + map.match '/links/delete', :to => 'links#delete' + # overviews map.resources :overviews - + # getting_started map.match '/getting_started', :to => 'getting_started#index' - + # rss map.match '/rss_fetch', :to => 'rss#fetch' end diff --git a/db/migrate/20120101000010_create_ticket.rb b/db/migrate/20120101000010_create_ticket.rb index 41f876a32..9a479d9ac 100644 --- a/db/migrate/20120101000010_create_ticket.rb +++ b/db/migrate/20120101000010_create_ticket.rb @@ -103,6 +103,7 @@ class CreateTicket < ActiveRecord::Migration t.column :to, :string, :limit => 3000, :null => true t.column :cc, :string, :limit => 3000, :null => true t.column :subject, :string, :limit => 3000, :null => true +# t.column :reply_to, :string, :limit => 3000, :null => true t.column :message_id, :string, :limit => 3000, :null => true t.column :message_id_md5, :string, :limit => 32, :null => true t.column :in_reply_to, :string, :limit => 3000, :null => true @@ -186,7 +187,7 @@ class CreateTicket < ActiveRecord::Migration add_index :link_objects, [:name], :unique => true create_table :links do |t| - t.references :link_types, :null => false + t.references :link_type, :null => false t.column :link_object_source_id, :integer, :null => false t.column :link_object_source_value, :integer, :null => false t.column :link_object_target_id, :integer, :null => false