card/lib/card/format/nesting/mode.rb
class Card
class Format
module Nesting
# Nest modes are states that can alter a nest's view
module Mode
# A nest can be rendered in one of four modes: normal, compact, edit, or template.
# In _normal_ mode nests are rendered in the requested view without alteration.
# In _compact_ mode nest rendering is altered to fit within a single line
# In _edit_ mode, a nest's view is replaced (where applicable) with a form
# element to edit content
# In _template_ mode, the view is replaced with a link to a nest editor to edit
# rules and options for that nest
# current nest mode
# @return [Symbol] :normal, :compact, :edit, or :template
def nest_mode
@nest_mode ||= parent ? parent.nest_mode : :normal
end
# run block with new_mode as nest_mode, then return to prior mode
# @param new_mode [Symbol] :normal, :compact, :edit, or :template
# @return block result
def with_nest_mode new_mode, &block
if new_mode == @nest_mode
yield
else
with_altered_nest_mode new_mode, &block
end
end
def with_altered_nest_mode new_mode
old_mode = nest_mode
@nest_mode = new_mode
yield
ensure
@nest_mode = old_mode
end
# view to be rendered in current mode
# @param view [Symbol]
# @return [Symbol ] viewname
def modal_nest_view view
# NOTE: the subformat always has the same nest_mode as its parent format
case nest_mode
when :edit then view_in_edit_mode(view)
when :template then :template_nest
when :compact then view_in_compact_mode(view)
else view
end
end
# Returns the view that the card should use when nested in edit mode
# @param view [Symbol]
# @return [Symbol] viewname
def view_in_edit_mode view
hide_view_in_edit_mode?(view) ? :blank : :edit_in_form
end
# @param view [Symbol]
# @return [True/False]
def hide_view_in_edit_mode? view
view_setting(:perms, view) == :none || # view never edited
card.structure || # not yet nesting structures
card.key.blank? # eg {{_self|type}} on new cards
end
# the view that should be used when nested in compact mode
# @param view [Symbol]
# @return [Symbol] viewname
def view_in_compact_mode view
configured_view_in_compact_mode(view) ||
(card.known? ? :one_line_content : :compact_missing)
end
# the view configured in view definition for use when nested in compact mode
# @param view [Symbol]
# @return [Symbol] viewname
def configured_view_in_compact_mode view
compact_config = view_setting(:compact, view)
return view if compact_config == true
compact_config
end
end
end
end
end