# frozen_string_literal: true
module Axlsx
# Conditional formatting allows styling of ranges based on functions
#
# @note The recommended way to manage conditional formatting is via Worksheet#add_conditional_formatting
# @see Worksheet#add_conditional_formatting
# @see ConditionalFormattingRule
class ConditionalFormatting
include Axlsx::OptionsParser
# Creates a new {ConditionalFormatting} object
# @option options [Array] rules The rules to apply
# @option options [String] sqref The range to apply the rules to
def initialize(options = {})
@rules = []
parse_options options
end
# Range over which the formatting is applied, in "A1:B2" format
# @return [String]
attr_reader :sqref
# Rules to apply the formatting to. Can be either a hash of
# options to create a {ConditionalFormattingRule}, an array of hashes
# for multiple ConditionalFormattingRules, or an array of already
# created ConditionalFormattingRules.
# @see ConditionalFormattingRule#initialize
# @return [Array]
attr_reader :rules
# Add Conditional Formatting Rules to this object. Rules can either
# be already created {ConditionalFormattingRule} elements or
# hashes of options for automatic creation. If rules is a hash
# instead of an array, assume only one rule being added.
#
# @example This would apply formatting "1" to cells > 20, and formatting "2" to cells < 1
# conditional_formatting.add_rules [
# { :type => :cellIs, :operator => :greaterThan, :formula => "20", :dxfId => 1, :priority=> 1 },
# { :type => :cellIs, :operator => :lessThan, :formula => "10", :dxfId => 2, :priority=> 2 } ]
#
# @param [Array|Hash] rules the rules to apply, can be just one in hash form
# @see ConditionalFormattingRule#initialize
def add_rules(rules)
rules = [rules] if rules.is_a? Hash
rules.each do |rule|
add_rule rule
end
end
# Add a ConditionalFormattingRule. If a hash of options is passed
# in create a rule on the fly.
# @param [ConditionalFormattingRule|Hash] rule A rule to use, or the options necessary to create one.
# @see ConditionalFormattingRule#initialize
def add_rule(rule)
if rule.is_a? Axlsx::ConditionalFormattingRule
@rules << rule
elsif rule.is_a? Hash
@rules << ConditionalFormattingRule.new(rule)
end
end
# @see rules
def rules=(v); @rules = v end
# @see sqref
def sqref=(v); Axlsx.validate_string(v); @sqref = v end
# Serializes the conditional formatting element
# @example Conditional Formatting XML looks like:
#
#
# 0.5
#
#
# @param [String] str
# @return [String]
def to_xml_string(str = +'')
str << ''
rules.each_with_index do |rule, index|
str << ' ' unless index.zero?
rule.to_xml_string(str)
end
str << ''
end
end
end