Class: Decidim::Toggle::SettingsTabRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/decidim/toggle/settings_tab_registry.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name) ⇒ SettingsTabRegistry

Returns a new instance of SettingsTabRegistry.



36
37
38
39
40
41
42
43
# File 'lib/decidim/toggle/settings_tab_registry.rb', line 36

def initialize(name)
  @registry_name = name.to_sym
  @configurations = []
  @form_tabs = {}
  @module_configs = {}
  @tab_to_module_name = {}
  @configurations_applied = false
end

Instance Attribute Details

#configurationsObject (readonly)

Returns the value of attribute configurations.



34
35
36
# File 'lib/decidim/toggle/settings_tab_registry.rb', line 34

def configurations
  @configurations
end

#form_tabsObject (readonly)

Returns the value of attribute form_tabs.



34
35
36
# File 'lib/decidim/toggle/settings_tab_registry.rb', line 34

def form_tabs
  @form_tabs
end

#module_configsObject (readonly)

Returns the value of attribute module_configs.



34
35
36
# File 'lib/decidim/toggle/settings_tab_registry.rb', line 34

def module_configs
  @module_configs
end

#registry_nameObject (readonly)

Returns the value of attribute registry_name.



34
35
36
# File 'lib/decidim/toggle/settings_tab_registry.rb', line 34

def registry_name
  @registry_name
end

Class Method Details

.create(name) ⇒ Object



19
20
21
# File 'lib/decidim/toggle/settings_tab_registry.rb', line 19

def create(name)
  all[name.to_sym] = new(name)
end

.destroy(name) ⇒ Object



23
24
25
# File 'lib/decidim/toggle/settings_tab_registry.rb', line 23

def destroy(name)
  all[name.to_sym] = nil
end

.find(name) ⇒ Object



15
16
17
# File 'lib/decidim/toggle/settings_tab_registry.rb', line 15

def find(name)
  all[name.to_sym]
end

.register(name, &block) ⇒ Object



9
10
11
12
13
# File 'lib/decidim/toggle/settings_tab_registry.rb', line 9

def register(name, &block)
  registry = find(name) || create(name)
  registry.configurations << block
  registry
end

Instance Method Details

#ensure_configurations_applied!Object

Runs registered settings_tabs blocks so register_form_tab / module_configs are populated (e.g. for Decidim::Toggle.config_for before any HTTP request builds tabs).



51
52
53
54
55
56
57
# File 'lib/decidim/toggle/settings_tab_registry.rb', line 51

def ensure_configurations_applied!
  return if @configurations_applied

  ctx = Object.new
  ctx.define_singleton_method(:t) { |key, **kw| I18n.t(key, **kw) }
  SettingsTabs.new(@registry_name).build_for(ctx)
end

#form_tab(identifier) ⇒ Object



88
89
90
# File 'lib/decidim/toggle/settings_tab_registry.rb', line 88

def form_tab(identifier)
  form_tabs[identifier.to_sym]
end

#form_tab_for_module(module_name) ⇒ Hash?

Returns :form, :command, :tab_identifier when an add_tab registered this module_name.

Returns:

  • (Hash, nil)

    :form, :command, :tab_identifier when an add_tab registered this module_name



93
94
95
96
# File 'lib/decidim/toggle/settings_tab_registry.rb', line 93

def form_tab_for_module(module_name)
  ensure_configurations_applied!
  module_configs[module_name.to_s]
end

#mark_configurations_applied!Object



45
46
47
# File 'lib/decidim/toggle/settings_tab_registry.rb', line 45

def mark_configurations_applied!
  @configurations_applied = true
end

#register_form_tab(identifier, form_class, command_class, module_name: nil) ⇒ Object

Last registration for a given identifier wins (used when an extension replaces a tab). When module_name is set, last registration for that module name wins (same as tab id).



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/decidim/toggle/settings_tab_registry.rb', line 61

def register_form_tab(identifier, form_class, command_class, module_name: nil)
  tid = identifier.to_sym
  if (previous = @tab_to_module_name[tid])
    @module_configs.delete(previous)
  end

  if duplicate_tab_registration?(tid, form_class, command_class)
    raise DuplicateTabRegistrationError,
          "Tab :#{tid} is already registered with form #{@form_tabs[tid][:form]} " \
          "and command #{@form_tabs[tid][:command]}; attempted #{form_class} / #{command_class}"
  end

  @form_tabs[tid] = { form: form_class, command: command_class }
  if module_name.blank?
    @tab_to_module_name.delete(tid)
    return
  end

  key = module_name.to_s
  @module_configs[key] = {
    form: form_class,
    command: command_class,
    tab_identifier: tid
  }
  @tab_to_module_name[tid] = key
end