active_element 0.0.12 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +3 -3
- data/app/assets/javascripts/active_element/highlight.js +311 -0
- data/app/assets/javascripts/active_element/json_field.js +51 -20
- data/app/assets/javascripts/active_element/popover.js +6 -4
- data/app/assets/stylesheets/active_element/_dark.scss +1 -1
- data/app/assets/stylesheets/active_element/application.scss +39 -1
- data/app/controllers/concerns/active_element/default_controller_actions.rb +7 -7
- data/app/views/active_element/components/fields/_json.html.erb +3 -2
- data/app/views/active_element/components/form/_field.html.erb +2 -1
- data/app/views/active_element/components/form/_json.html.erb +2 -0
- data/app/views/active_element/components/form/_label.html.erb +7 -0
- data/app/views/active_element/components/form.html.erb +2 -2
- data/app/views/layouts/active_element.html.erb +25 -4
- data/example_app/Gemfile.lock +1 -1
- data/lib/active_element/components/form.rb +1 -8
- data/lib/active_element/components/util/display_value_mapping.rb +0 -2
- data/lib/active_element/components/util/form_field_mapping.rb +2 -1
- data/lib/active_element/components/util.rb +7 -0
- data/lib/active_element/controller_interface.rb +2 -1
- data/lib/active_element/controller_state.rb +1 -1
- data/lib/active_element/default_controller/actions.rb +3 -0
- data/lib/active_element/default_controller/controller.rb +145 -0
- data/lib/active_element/default_controller/json_params.rb +48 -0
- data/lib/active_element/default_controller/params.rb +97 -0
- data/lib/active_element/default_controller/search.rb +112 -0
- data/lib/active_element/default_controller.rb +10 -132
- data/lib/active_element/version.rb +1 -1
- data/lib/active_element.rb +0 -2
- data/rspec-documentation/_head.html.erb +2 -0
- data/rspec-documentation/pages/000-Introduction.md +8 -5
- data/rspec-documentation/pages/005-Setup.md +21 -28
- data/rspec-documentation/pages/010-Components/Form Fields.md +35 -0
- data/rspec-documentation/pages/015-Custom Controllers.md +32 -0
- data/rspec-documentation/pages/016-Default Controller.md +132 -0
- data/rspec-documentation/pages/Themes.md +3 -0
- metadata +11 -4
- data/lib/active_element/default_record_params.rb +0 -62
- data/lib/active_element/default_search.rb +0 -110
@@ -1,62 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ActiveElement
|
4
|
-
# Provides params for ActiveRecord models when using the default boilerplate controller
|
5
|
-
# actions. Navigates input parameters and maps them to appropriate relations as needed.
|
6
|
-
class DefaultRecordParams
|
7
|
-
def initialize(controller:, model:)
|
8
|
-
@controller = controller
|
9
|
-
@model = model
|
10
|
-
end
|
11
|
-
|
12
|
-
def params
|
13
|
-
with_transformed_relations(
|
14
|
-
controller.params.require(controller.controller_name.singularize)
|
15
|
-
.permit(controller.active_element.state.editable_fields)
|
16
|
-
)
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
attr_reader :controller, :model
|
22
|
-
|
23
|
-
def with_transformed_relations(params)
|
24
|
-
params.to_h.to_h do |key, value|
|
25
|
-
next [key, value] unless relation?(key)
|
26
|
-
|
27
|
-
relation_param(key, value)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def relation_param(key, value)
|
32
|
-
case relation(key).macro
|
33
|
-
when :belongs_to
|
34
|
-
belongs_to_param(key, value)
|
35
|
-
when :has_one
|
36
|
-
has_one_param(key, value)
|
37
|
-
when :has_many
|
38
|
-
has_many_param(key, value)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def belongs_to_param(key, value)
|
43
|
-
[relation(key).foreign_key, value]
|
44
|
-
end
|
45
|
-
|
46
|
-
def has_one_param(key, value) # rubocop:disable Naming/PredicateName
|
47
|
-
[relation(key).name, relation(key).klass.find_by(relation(key).klass.primary_key => value)]
|
48
|
-
end
|
49
|
-
|
50
|
-
def has_many_param(key, _value) # rubocop:disable Naming/PredicateName
|
51
|
-
[relation(key).name, relation(key).klass.where(relation(key).klass.primary_key => relation(key).value)]
|
52
|
-
end
|
53
|
-
|
54
|
-
def relation?(attribute)
|
55
|
-
relation(attribute.to_sym).present?
|
56
|
-
end
|
57
|
-
|
58
|
-
def relation(attribute)
|
59
|
-
model.reflect_on_association(attribute.to_sym)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,110 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ActiveElement
|
4
|
-
# Full text search and datetime querying for DefaultController, provides full text search
|
5
|
-
# filters for all controllers with configured searchable fields. Includes support for querying
|
6
|
-
# across relations.
|
7
|
-
class DefaultSearch
|
8
|
-
def initialize(controller:, model:)
|
9
|
-
@controller = controller
|
10
|
-
@model = model
|
11
|
-
end
|
12
|
-
|
13
|
-
def search_filters
|
14
|
-
@search_filters ||= controller.params.permit(*searchable_fields).transform_values do |value|
|
15
|
-
value.try(:compact_blank) || value
|
16
|
-
end.compact_blank
|
17
|
-
end
|
18
|
-
|
19
|
-
def text_search?
|
20
|
-
search_filters.present?
|
21
|
-
end
|
22
|
-
|
23
|
-
def text_search
|
24
|
-
conditions = search_filters.to_h.map do |key, value|
|
25
|
-
next relation_matches(key, value) if relation?(key)
|
26
|
-
next datetime_between(key, value) if datetime?(key)
|
27
|
-
|
28
|
-
model.arel_table[key].matches("#{value}%")
|
29
|
-
end
|
30
|
-
conditions[1..].reduce(conditions.first) do |accumulated, condition|
|
31
|
-
accumulated.and(condition)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def search_relations
|
36
|
-
search_filters.to_h.keys.map { |key| relation?(key) ? key.to_sym : nil }.compact
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
attr_reader :controller, :model
|
42
|
-
|
43
|
-
def searchable_fields
|
44
|
-
controller.active_element.state.searchable_fields.map do |field|
|
45
|
-
next field unless field.to_s.end_with?('_at')
|
46
|
-
|
47
|
-
{ field => %i[from to] }
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def noop
|
52
|
-
Arel::Nodes::True.new.eq(Arel::Nodes::True.new)
|
53
|
-
end
|
54
|
-
|
55
|
-
def datetime?(key)
|
56
|
-
model.columns.find { |column| column.name.to_s == key.to_s }&.type == :datetime
|
57
|
-
end
|
58
|
-
|
59
|
-
def datetime_between(key, value)
|
60
|
-
return noop if value[:from].blank? && value[:to].blank?
|
61
|
-
|
62
|
-
model.arel_table[key].between(range_begin(value)...range_end(value))
|
63
|
-
end
|
64
|
-
|
65
|
-
def range_begin(value)
|
66
|
-
value[:from].present? ? Time.zone.parse(value[:from]) + timezone_offset : -Float::INFINITY
|
67
|
-
end
|
68
|
-
|
69
|
-
def range_end(value)
|
70
|
-
value[:to].present? ? Time.zone.parse(value[:to]) + timezone_offset : Float::INFINITY
|
71
|
-
end
|
72
|
-
|
73
|
-
def timezone_offset
|
74
|
-
controller.request.cookies['timezone_offset'].to_i.minutes
|
75
|
-
end
|
76
|
-
|
77
|
-
def relation_matches(key, value)
|
78
|
-
fields = searchable_relation_fields(key)
|
79
|
-
relation_model = relation(key).klass
|
80
|
-
fields.select! do |field|
|
81
|
-
relation_model.columns.find { |column| column.name.to_s == field.to_s }&.type == :string
|
82
|
-
end
|
83
|
-
|
84
|
-
return noop if fields.empty?
|
85
|
-
|
86
|
-
relation_conditions(fields, value, relation_model)
|
87
|
-
end
|
88
|
-
|
89
|
-
def relation_conditions(fields, value, relation_model)
|
90
|
-
fields[1..].reduce(relation_model.arel_table[fields.first].matches("#{value}%")) do |condition, field|
|
91
|
-
condition.or(relation_model.arel_table[field].matches("#{value}%"))
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def searchable_relation_fields(key)
|
96
|
-
Components::Util.relation_controller(model, controller, key)
|
97
|
-
&.active_element
|
98
|
-
&.state
|
99
|
-
&.fetch(:searchable_fields, []) || []
|
100
|
-
end
|
101
|
-
|
102
|
-
def relation?(attribute)
|
103
|
-
relation(attribute.to_sym).present?
|
104
|
-
end
|
105
|
-
|
106
|
-
def relation(attribute)
|
107
|
-
model.reflect_on_association(attribute.to_sym)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|