156 lines
3.4 KiB
Ruby
156 lines
3.4 KiB
Ruby
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
|
|
|
|
class Taskbar < ApplicationModel
|
|
include ChecksClientNotification
|
|
include ::Taskbar::HasAttachments
|
|
|
|
store :state
|
|
store :params
|
|
store :preferences
|
|
|
|
belongs_to :user
|
|
|
|
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
|
|
|
|
association_attributes_ignored :user
|
|
|
|
client_notification_events_ignored :create, :update, :touch
|
|
|
|
client_notification_send_to :user_id
|
|
|
|
attr_accessor :local_update
|
|
|
|
def state_changed?
|
|
return false if state.blank?
|
|
|
|
state.each_value do |value|
|
|
if value.is_a? Hash
|
|
value.each do |key1, value1|
|
|
next if value1.blank?
|
|
next if key1 == 'form_id'
|
|
|
|
return true
|
|
end
|
|
else
|
|
next if value.blank?
|
|
|
|
return true
|
|
end
|
|
end
|
|
false
|
|
end
|
|
|
|
def attributes_with_association_names(empty_keys: false)
|
|
add_attachments_to_attributes(super)
|
|
end
|
|
|
|
def attributes_with_association_ids
|
|
add_attachments_to_attributes(super)
|
|
end
|
|
|
|
def as_json(options = {})
|
|
add_attachments_to_attributes(super)
|
|
end
|
|
|
|
private
|
|
|
|
def update_last_contact
|
|
return true if local_update
|
|
return true if changes.blank?
|
|
|
|
if changes['notify']
|
|
count = 0
|
|
changes.each_key do |attribute|
|
|
next if attribute == 'updated_at'
|
|
next if attribute == 'created_at'
|
|
|
|
count += 1
|
|
end
|
|
return true if count <= 1
|
|
end
|
|
self.last_contact = Time.zone.now
|
|
end
|
|
|
|
def set_user
|
|
return true if local_update
|
|
return true if !UserInfo.current_user_id
|
|
|
|
self.user_id = UserInfo.current_user_id
|
|
end
|
|
|
|
def update_preferences_infos
|
|
return true if key == 'Search'
|
|
return true if local_update
|
|
|
|
# find other same open tasks
|
|
if !preferences
|
|
self.preferences = {}
|
|
end
|
|
preferences[:tasks] = []
|
|
Taskbar.where(key: key).order(:created_at, :id).each do |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
|
|
end
|
|
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, :id).each do |taskbar|
|
|
next if taskbar.id == id
|
|
|
|
taskbar.with_lock do
|
|
taskbar.preferences = preferences
|
|
taskbar.local_update = true
|
|
taskbar.save!
|
|
end
|
|
end
|
|
|
|
return true if destroyed?
|
|
|
|
# remember preferences for current taskbar
|
|
self.preferences = preferences
|
|
|
|
true
|
|
end
|
|
|
|
def notify_clients
|
|
return true if !saved_change_to_attribute?('preferences')
|
|
|
|
data = {
|
|
event: 'taskbar:preferences',
|
|
data: {
|
|
id: id,
|
|
key: key,
|
|
preferences: preferences,
|
|
},
|
|
}
|
|
PushMessages.send_to(
|
|
user_id,
|
|
data,
|
|
)
|
|
end
|
|
|
|
end
|