mod/follow/set/right/follow.rb
# The Right::Follow set configures follow preferences (`[Set]+[User]+:follow`)
# While the user follow dashboard ([User]+:follow`) is also in this Set, its
# customizations are handled in TypePlusRight::User::Follow
assign_type :list
event :cache_expired_for_new_preference, :integrate, when: :preference? do
Card.follow_caches_expired
end
def option_cards
Card::FollowOption.cards.compact
end
def options_card
Card.new(
name: "follow_options_card",
type: :list,
content: option_cards.map { |oc| "[[#{oc.name}]]" }.join("\n")
)
end
def add_follow_item? condition
new_card? || !include_item?(condition)
end
def ok_to_update?
permit :update
end
def ok_to_create?
permit :create
end
def ok_to_delete?
permit :delete
end
def raw_help_text
"Get notified about changes"
end
def permit action, verb=nil
if %i[create delete update].include?(action) && allowed_to_change_follow_status?
true
else
super action, verb
end
end
def allowed_to_change_follow_status?
Auth.signed_in? &&
((user = rule_user) && Auth.current_id == user.id) || Auth.always_ok?
end
format :html do
# shows a follow item link for each of the current follow options
view :follow_status, cache: :never do
wrap { haml :follow_status }
end
# interface to view/alter a specific rule option
view :follow_item, cache: :never do
follow_item Env.params[:condition]
end
def follow_item condition, button=true
condition ||= "*always"
wrap do
card_form action: :update, success: { view: :follow_item } do
[
follow_item_hidden_tags(condition),
(follow_item_button(condition) if button),
follow_item_link(condition)
].compact
end
end
end
def rule_form_args
super.merge "data-update-foreign-slot": ".card-slot.follow_section-view"
end
private
def follow_item_hidden_tags condition
condkey = card.add_follow_item?(condition) ? :add_item : :drop_item
hidden_tags condition: condition, condkey => condition
end
def follow_item_button condition
action = card.add_follow_item?(condition) ? :add : :delete
button_tag type: :submit, "aria-label": "Left Align",
class: "btn-sm btn-item #{follow_item_button_class action}" do
follow_item_icon action
end
end
def follow_item_button_class action
action == :add ? "btn-item-add" : "btn-item-delete btn-primary"
end
def follow_item_icon action
icon_tag(action == :add ? :add : :check)
end
def follow_item_link condition
link_to_card follow_item_link_target, follow_item_link_text(condition)
end
def follow_item_link_target
set = card.rule_set
setname = set.name
set.tag.codename == :self ? setname.left : setname.field("by name")
end
def follow_item_link_text condition
if (option_card = Card.fetch condition)
option_card.description card.rule_set
else
card.rule_set.follow_label
end
end
end