# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/ class Taskbar < ApplicationModel store :state store :params store :preferences before_create :update_last_contact, :set_user, :update_preferences_infos before_update :update_last_contact, :set_user, :update_preferences_infos after_update :notify_clients after_destroy :update_preferences_infos, :notify_clients attr_accessor :local_update def state_changed? return false if !state return false if state.empty? state.each { |_key, value| if value.class == Hash || value.class == ActiveSupport::HashWithIndifferentAccess value.each { |_key1, value1| next if value1 && value1.empty? return true } else next if value && value.empty? return true end } false end private def update_last_contact return true if local_update return true if changes.empty? if changes['notify'] count = 0 changes.each { |attribute, _value| next if attribute == 'updated_at' next if attribute == 'created_at' count += 1 } return true if count <= 1 end self.last_contact = Time.zone.now end def set_user return true if local_update self.user_id = UserInfo.current_user_id end def update_preferences_infos return true if local_update # find other same open tasks if !preferences self.preferences = {} end preferences[:tasks] = [] Taskbar.where(key: key).order(:created_at).each { |taskbar| if taskbar.id == id local_changed = state_changed? local_last_contact = last_contact else local_changed = taskbar.state_changed? local_last_contact = taskbar.last_contact end task = { id: taskbar.id, user_id: taskbar.user_id, last_contact: local_last_contact, changed: local_changed, } preferences[:tasks].push task } if !id changed = state_changed? task = { user_id: user_id, last_contact: last_contact, changed: changed, } preferences[:tasks].push task end # update other taskbars Taskbar.where(key: key).order(:created_at).each { |taskbar| next if taskbar.id == id taskbar.preferences = preferences taskbar.local_update = true taskbar.save! } return true if destroyed? # remember preferences for current taskbar self.preferences = preferences true end def notify_clients return true if !changes['preferences'] data = { event: 'taskbar:preferences', data: { id: id, key: key, preferences: preferences, }, } PushMessages.send_to( user_id, data, ) end end