Class: Decidim::DecidimAwesome::Config

Inherits:
Object
  • Object
show all
Defined in:
lib/decidim/decidim_awesome/config.rb

Overview

The current awesome config for the organization.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(organization) ⇒ Config



7
8
9
10
11
12
13
14
15
16
17
# File 'lib/decidim/decidim_awesome/config.rb', line 7

def initialize(organization)
  @organization = organization
  @vars = AwesomeConfig.for_organization(organization).includes(:constraints)
  @context = {
    participatory_space_manifest: nil,
    participatory_space_slug: nil,
    component_id: nil,
    component_manifest: nil
  }
  @sub_configs = {}
end

Instance Attribute Details

#contextObject

Returns the value of attribute context.



19
20
21
# File 'lib/decidim/decidim_awesome/config.rb', line 19

def context
  @context
end

#defaultsObject



22
23
24
# File 'lib/decidim/decidim_awesome/config.rb', line 22

def defaults
  @defaults || Decidim::DecidimAwesome.config
end

#organizationObject (readonly)

Returns the value of attribute organization.



19
20
21
# File 'lib/decidim/decidim_awesome/config.rb', line 19

def organization
  @organization
end

#varsObject (readonly)

Returns the value of attribute vars.



19
20
21
# File 'lib/decidim/decidim_awesome/config.rb', line 19

def vars
  @vars
end

Instance Method Details

#collect_sub_configs_values(singular_key) ⇒ Object

Merges all subconfigs values for custom_styles or any other scoped confs by default filtered according to the current scope, a block can be passed for custom filtering ie, collect everything:

collect_sub_configs_values("scoped_style") { true }


116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/decidim/decidim_awesome/config.rb', line 116

def collect_sub_configs_values(singular_key)
  plural_key = singular_key.pluralize.to_sym
  return [] unless config[plural_key].respond_to?(:filter)

  fields = config[plural_key]&.filter do |key, _value|
    subconfig = sub_configs_for(singular_key)[key]
    # allow custom filtering if block given
    if block_given?
      yield subconfig
    else
      valid_in_context?(subconfig&.all_constraints)
    end
  end
  fields.values
end

#configObject

config processed in context



50
51
52
# File 'lib/decidim/decidim_awesome/config.rb', line 50

def config
  @config ||= calculate_config
end

#context_from_component(component) ⇒ Object

convert component to manifest, slug and id



38
39
40
41
# File 'lib/decidim/decidim_awesome/config.rb', line 38

def context_from_component(component)
  @config = nil
  @context = Decidim::DecidimAwesome::ContextAnalyzers::ComponentAnalyzer.context_for component
end

#context_from_participatory_space(space) ⇒ Object

convert participatory space to manifest, slug and id



44
45
46
47
# File 'lib/decidim/decidim_awesome/config.rb', line 44

def context_from_participatory_space(space)
  @config = nil
  @context = Decidim::DecidimAwesome::ContextAnalyzers::ParticipatorySpaceAnalyzer.context_for space
end

#context_from_request(request) ⇒ Object

convert context to manifest, slug and id



32
33
34
35
# File 'lib/decidim/decidim_awesome/config.rb', line 32

def context_from_request(request)
  @config = nil
  @context = Decidim::DecidimAwesome::ContextAnalyzers::RequestAnalyzer.context_for request
end

#enabled_for?(setting) ⇒ Boolean

Checks if some config option es enabled in a certain context



79
80
81
# File 'lib/decidim/decidim_awesome/config.rb', line 79

def enabled_for?(setting)
  config[setting]
end

#inject_sub_config_constraints(singular_key, subkey, constraints) ⇒ Object

adds some custom constraints for the instance that can be generated dynamically



108
109
110
# File 'lib/decidim/decidim_awesome/config.rb', line 108

def inject_sub_config_constraints(singular_key, subkey, constraints)
  sub_configs_for(singular_key)[subkey.to_sym]&.add_constraints constraints
end

#organization_configObject

config processed for the organization config, without context



55
56
57
58
59
60
# File 'lib/decidim/decidim_awesome/config.rb', line 55

def organization_config
  @organization_config ||= unfiltered_config.map do |key, value|
    value = defaults[key] unless enabled_for_organization? key
    [key, value]
  end.to_h
end

#setting_for(var) ⇒ Object



71
72
73
74
75
76
# File 'lib/decidim/decidim_awesome/config.rb', line 71

def setting_for(var)
  @vars.find_or_initialize_by(
    organization: @organization,
    var: var
  )
end

#sub_configs_for(singular_key) ⇒ Object



132
133
134
135
136
137
138
139
140
141
# File 'lib/decidim/decidim_awesome/config.rb', line 132

def sub_configs_for(singular_key)
  return @sub_configs[singular_key] if @sub_configs[singular_key]

  plural_key = singular_key.pluralize.to_sym
  return {} unless config[plural_key]

  @sub_configs[singular_key] = config[plural_key].map do |key, _value|
    [key, AwesomeConfig.find_by(var: "#{singular_key}_#{key}", organization: @organization)]
  end.to_h
end

#unfiltered_configObject

config normalized according default values, without context, without organization config



63
64
65
66
67
68
69
# File 'lib/decidim/decidim_awesome/config.rb', line 63

def unfiltered_config
  valid = @vars.map { |v| [v.var.to_sym, v.value] }.to_h

  map_defaults do |key|
    valid[key].presence
  end
end

#valid_in_context?(constraints) ⇒ Boolean

checks if some constraint blocks the validity fot the current context



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/decidim/decidim_awesome/config.rb', line 84

def valid_in_context?(constraints)
  # if no constraints defined, applies to everything
  return true if constraints.blank?

  # if containts the "none" constraints, deactivate everything else
  return false if constraints.detect { |c| c.settings["participatory_space_manifest"] == "none" }

  # check if current context matches some constraint
  constraints.detect do |constraint|
    settings = constraint.settings.symbolize_keys
    match_method = settings.delete(:match)
    if match_method == "exclusive"
      # all keys must match
      settings == context
    else
      # constraints keys can match the context partially (ie: if slug is not specified, any space matches in the same manifest)
      # if some setting is different, rejects
      invalid = constraint.settings.detect { |key, val| context[key.to_sym].to_s != val.to_s }
      invalid.blank?
    end
  end
end