terrazzo 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +101 -0
- data/Rakefile +1 -0
- data/app/controllers/terrazzo/application_controller.rb +63 -14
- data/app/helpers/terrazzo/collection_actions_helper.rb +38 -13
- data/app/helpers/terrazzo/resource_paths_helper.rb +55 -0
- data/app/views/terrazzo/application/_edit_base.json.props +7 -4
- data/app/views/terrazzo/application/_index_base.json.props +83 -7
- data/app/views/terrazzo/application/_navigation.json.props +7 -4
- data/app/views/terrazzo/application/_new_base.json.props +6 -3
- data/app/views/terrazzo/application/_show_base.json.props +7 -5
- data/lib/generators/terrazzo/dashboard/dashboard_generator.rb +48 -24
- data/lib/generators/terrazzo/dashboard/templates/controller.rb.erb +8 -4
- data/lib/generators/terrazzo/dashboard/templates/dashboard.rb.erb +33 -25
- data/lib/generators/terrazzo/eject/eject_generator.rb +223 -113
- data/lib/generators/terrazzo/field/field_generator.rb +51 -7
- data/lib/generators/terrazzo/field/templates/FormField.jsx.erb +2 -3
- data/lib/generators/terrazzo/install/install_generator.rb +641 -4
- data/lib/generators/terrazzo/install/templates/admin.css +2 -0
- data/lib/generators/terrazzo/install/templates/application.js.erb +3 -0
- data/lib/generators/terrazzo/install/templates/components.json.erb +17 -0
- data/lib/generators/terrazzo/install/templates/custom_page_mapping.js.erb +5 -0
- data/lib/generators/terrazzo/install/templates/generated_page_mapping.js.erb +10 -0
- data/lib/generators/terrazzo/install/templates/jsconfig.json +8 -0
- data/lib/generators/terrazzo/install/templates/page_to_page_mapping.js.erb +9 -1
- data/lib/generators/terrazzo/install/templates/superglue.html.erb.erb +2 -2
- data/lib/generators/terrazzo/routes/routes_generator.rb +55 -20
- data/lib/generators/terrazzo/views/edit_generator.rb +16 -10
- data/lib/generators/terrazzo/views/eject_compatibility.rb +19 -0
- data/lib/generators/terrazzo/views/field_generator.rb +18 -6
- data/lib/generators/terrazzo/views/generated_defaults_helper.rb +110 -0
- data/lib/generators/terrazzo/views/index_generator.rb +9 -8
- data/lib/generators/terrazzo/views/layout_generator.rb +4 -3
- data/lib/generators/terrazzo/views/navigation_generator.rb +5 -1
- data/lib/generators/terrazzo/views/new_generator.rb +16 -10
- data/lib/generators/terrazzo/views/page_mapping_helper.rb +131 -8
- data/lib/generators/terrazzo/views/show_generator.rb +7 -6
- data/lib/generators/terrazzo/views/templates/components/CollectionFilters.jsx +25 -0
- data/lib/generators/terrazzo/views/templates/components/CollectionItemActions.jsx +68 -0
- data/lib/generators/terrazzo/views/templates/components/CollectionToolbarActions.jsx +60 -0
- data/lib/generators/terrazzo/views/templates/components/HasManyPagination.jsx +36 -0
- data/lib/generators/terrazzo/views/templates/components/Layout.jsx +9 -4
- data/lib/generators/terrazzo/views/templates/components/Pagination.jsx +32 -24
- data/lib/generators/terrazzo/views/templates/components/ResourceTable.jsx +172 -0
- data/lib/generators/terrazzo/views/templates/components/SearchBar.jsx +14 -6
- data/lib/generators/terrazzo/views/templates/components/SortableHeader.jsx +7 -5
- data/lib/generators/terrazzo/views/templates/components/app-sidebar.jsx +1 -1
- data/lib/generators/terrazzo/views/templates/components/site-header.jsx +2 -2
- data/lib/generators/terrazzo/views/templates/fields/asset/FormField.jsx +15 -0
- data/lib/generators/terrazzo/views/templates/fields/asset/IndexField.jsx +5 -0
- data/lib/generators/terrazzo/views/templates/fields/asset/ShowField.jsx +13 -0
- data/lib/generators/terrazzo/views/templates/fields/belongs_to/FormField.jsx +1 -1
- data/lib/generators/terrazzo/views/templates/fields/boolean/FormField.jsx +1 -1
- data/lib/generators/terrazzo/views/templates/fields/boolean/IndexField.jsx +1 -1
- data/lib/generators/terrazzo/views/templates/fields/has_many/FormField.jsx +3 -3
- data/lib/generators/terrazzo/views/templates/fields/has_many/IndexField.jsx +4 -3
- data/lib/generators/terrazzo/views/templates/fields/has_many/ShowField.jsx +21 -35
- data/lib/generators/terrazzo/views/templates/fields/has_one/FormField.jsx +1 -1
- data/lib/generators/terrazzo/views/templates/fields/hstore/FormField.jsx +5 -5
- data/lib/generators/terrazzo/views/templates/fields/hstore/IndexField.jsx +0 -2
- data/lib/generators/terrazzo/views/templates/fields/hstore/ShowField.jsx +1 -1
- data/lib/generators/terrazzo/views/templates/fields/number/IndexField.jsx +1 -1
- data/lib/generators/terrazzo/views/templates/fields/number/ShowField.jsx +1 -1
- data/lib/generators/terrazzo/views/templates/fields/polymorphic/FormField.jsx +3 -2
- data/lib/generators/terrazzo/views/templates/fields/rich_text/FormField.jsx +2 -2
- data/lib/generators/terrazzo/views/templates/fields/select/FormField.jsx +1 -1
- data/lib/generators/terrazzo/views/templates/fields/select/IndexField.jsx +1 -1
- data/lib/generators/terrazzo/views/templates/fields/shared/TextInputFormField.jsx +2 -2
- data/lib/generators/terrazzo/views/templates/fields/text/FormField.jsx +2 -2
- data/lib/generators/terrazzo/views/templates/pages/_collection.jsx +5 -3
- data/lib/generators/terrazzo/views/templates/pages/_form.jsx +37 -30
- data/lib/generators/terrazzo/views/templates/pages/_navigation.json.props +14 -4
- data/lib/generators/terrazzo/views/templates/pages/edit.jsx +6 -4
- data/lib/generators/terrazzo/views/templates/pages/index.jsx +20 -8
- data/lib/generators/terrazzo/views/templates/pages/new.jsx +8 -4
- data/lib/generators/terrazzo/views/templates/pages/show.jsx +30 -32
- data/lib/generators/terrazzo/views/views_generator.rb +9 -5
- data/lib/terrazzo/base_dashboard.rb +167 -5
- data/lib/terrazzo/csv_export.rb +38 -0
- data/lib/terrazzo/field/associative.rb +16 -4
- data/lib/terrazzo/field/base.rb +4 -0
- data/lib/terrazzo/field/belongs_to.rb +1 -2
- data/lib/terrazzo/field/deferred.rb +4 -0
- data/lib/terrazzo/field/has_many.rb +79 -11
- data/lib/terrazzo/field/password.rb +6 -0
- data/lib/terrazzo/field/rich_text.rb +13 -0
- data/lib/terrazzo/generator_helpers.rb +1 -1
- data/lib/terrazzo/has_many_pagination.rb +9 -1
- data/lib/terrazzo/namespace/resource.rb +30 -0
- data/lib/terrazzo/namespace.rb +26 -1
- data/lib/terrazzo/search.rb +29 -9
- data/lib/terrazzo/version.rb +1 -1
- data/lib/terrazzo.rb +1 -0
- data/terrazzo.gemspec +11 -1
- metadata +40 -6
- data/lib/generators/terrazzo/install/templates/application.json.props.erb +0 -17
- data/lib/generators/terrazzo/views/templates/fields/FieldRenderer.jsx +0 -103
- data/lib/generators/terrazzo/views/templates/fields/index.js +0 -81
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
module Terrazzo
|
|
2
2
|
module Field
|
|
3
3
|
class HasMany < Associative
|
|
4
|
+
DEFAULT_PER_PAGE = 5
|
|
5
|
+
|
|
4
6
|
def serialize_value(mode)
|
|
5
7
|
return nil if data.nil?
|
|
6
8
|
|
|
@@ -45,7 +47,8 @@ module Terrazzo
|
|
|
45
47
|
end
|
|
46
48
|
|
|
47
49
|
def per_page
|
|
48
|
-
(options[:per_page] || options[:limit] ||
|
|
50
|
+
requested = (options[:per_page] || options[:limit] || DEFAULT_PER_PAGE).to_i
|
|
51
|
+
requested.positive? ? requested : DEFAULT_PER_PAGE
|
|
49
52
|
end
|
|
50
53
|
|
|
51
54
|
def current_page
|
|
@@ -62,7 +65,11 @@ module Terrazzo
|
|
|
62
65
|
end
|
|
63
66
|
|
|
64
67
|
def page_records
|
|
65
|
-
|
|
68
|
+
@page_records ||= begin
|
|
69
|
+
records = paginated.to_a
|
|
70
|
+
preload_record_associations(records)
|
|
71
|
+
records
|
|
72
|
+
end
|
|
66
73
|
end
|
|
67
74
|
|
|
68
75
|
private
|
|
@@ -75,8 +82,15 @@ module Terrazzo
|
|
|
75
82
|
end
|
|
76
83
|
end
|
|
77
84
|
|
|
85
|
+
def preload_record_associations(records, associations = options[:preload])
|
|
86
|
+
return unless associations.present? && records.any?
|
|
87
|
+
|
|
88
|
+
ActiveRecord::Associations::Preloader.new(records: records, associations: associations).call
|
|
89
|
+
end
|
|
90
|
+
|
|
78
91
|
def serialize_show_value
|
|
79
92
|
col_attrs = options[:collection_attributes] || resolve_default_collection_attributes
|
|
93
|
+
records = page_records
|
|
80
94
|
|
|
81
95
|
meta = {
|
|
82
96
|
total: total_count,
|
|
@@ -86,10 +100,11 @@ module Terrazzo
|
|
|
86
100
|
}
|
|
87
101
|
|
|
88
102
|
if col_attrs
|
|
89
|
-
|
|
103
|
+
preload_record_associations(records, collection_includes_for(col_attrs))
|
|
104
|
+
{ **serialize_with_collection_attributes(records, col_attrs), **meta }
|
|
90
105
|
else
|
|
91
106
|
{
|
|
92
|
-
items:
|
|
107
|
+
items: records.map { |r| { id: r.id.to_s, display: display_name(r) } },
|
|
93
108
|
**meta,
|
|
94
109
|
}
|
|
95
110
|
end
|
|
@@ -103,27 +118,75 @@ module Terrazzo
|
|
|
103
118
|
end
|
|
104
119
|
|
|
105
120
|
def serialize_with_collection_attributes(records, col_attrs)
|
|
106
|
-
|
|
121
|
+
dashboard = find_associated_dashboard.new
|
|
107
122
|
|
|
108
123
|
headers = col_attrs.map do |attr|
|
|
109
|
-
{ attribute: attr.to_s, label: attr
|
|
124
|
+
header = { attribute: attr.to_s, label: dashboard.attribute_label(attr, :index) }
|
|
125
|
+
header_options = serialized_header_options(dashboard, attr)
|
|
126
|
+
header[:headerOptions] = header_options if header_options.present?
|
|
127
|
+
header
|
|
110
128
|
end
|
|
111
129
|
|
|
112
130
|
rows = records.map do |record|
|
|
113
131
|
cells = col_attrs.map do |attr|
|
|
114
|
-
field =
|
|
115
|
-
{
|
|
132
|
+
field = dashboard.attribute_type_for(attr).new(attr, nil, :index, resource: record)
|
|
133
|
+
cell = {
|
|
116
134
|
attribute: attr.to_s,
|
|
117
135
|
fieldType: field.field_type,
|
|
118
136
|
value: field.serialize_value(:index)
|
|
119
137
|
}
|
|
138
|
+
cell_options = serialized_cell_options(dashboard, attr, record)
|
|
139
|
+
cell[:cellOptions] = cell_options if cell_options.present?
|
|
140
|
+
cell
|
|
120
141
|
end
|
|
121
|
-
{ id: record.id.to_s, cells: cells }
|
|
142
|
+
row = { id: record.id.to_s, cells: cells }
|
|
143
|
+
row_options = serialized_row_options(dashboard, record)
|
|
144
|
+
row[:rowOptions] = row_options if row_options.present?
|
|
145
|
+
row
|
|
122
146
|
end
|
|
123
147
|
|
|
124
148
|
{ headers: headers, rows: rows }
|
|
125
149
|
end
|
|
126
150
|
|
|
151
|
+
def serialized_header_options(dashboard, attribute)
|
|
152
|
+
options = (dashboard.collection_header_options(attribute) || {}).to_h
|
|
153
|
+
class_name = options.delete(:class_name) ||
|
|
154
|
+
options.delete("class_name") ||
|
|
155
|
+
options.delete(:className) ||
|
|
156
|
+
options.delete("className")
|
|
157
|
+
|
|
158
|
+
{
|
|
159
|
+
className: class_name,
|
|
160
|
+
meta: options.presence,
|
|
161
|
+
}.compact
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def serialized_row_options(dashboard, resource)
|
|
165
|
+
options = (dashboard.collection_row_options(resource) || {}).to_h
|
|
166
|
+
class_name = options.delete(:class_name) ||
|
|
167
|
+
options.delete("class_name") ||
|
|
168
|
+
options.delete(:className) ||
|
|
169
|
+
options.delete("className")
|
|
170
|
+
|
|
171
|
+
{
|
|
172
|
+
className: class_name,
|
|
173
|
+
meta: options.presence,
|
|
174
|
+
}.compact
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def serialized_cell_options(dashboard, attribute, resource)
|
|
178
|
+
options = (dashboard.collection_cell_options(attribute, resource) || {}).to_h
|
|
179
|
+
class_name = options.delete(:class_name) ||
|
|
180
|
+
options.delete("class_name") ||
|
|
181
|
+
options.delete(:className) ||
|
|
182
|
+
options.delete("className")
|
|
183
|
+
|
|
184
|
+
{
|
|
185
|
+
className: class_name,
|
|
186
|
+
meta: options.presence,
|
|
187
|
+
}.compact
|
|
188
|
+
end
|
|
189
|
+
|
|
127
190
|
def resource_options
|
|
128
191
|
return [] unless associated_class
|
|
129
192
|
scope = if options[:scope].is_a?(Proc)
|
|
@@ -135,8 +198,7 @@ module Terrazzo
|
|
|
135
198
|
end
|
|
136
199
|
scope = scope.includes(*options[:includes]) if options.key?(:includes)
|
|
137
200
|
pk = association_primary_key
|
|
138
|
-
|
|
139
|
-
scope.map { |r| [dashboard ? dashboard.display_resource(r) : display_name(r), r.public_send(pk).to_s] }
|
|
201
|
+
scope.map { |r| [display_name(r), r.public_send(pk).to_s] }
|
|
140
202
|
end
|
|
141
203
|
|
|
142
204
|
def apply_sorting(records)
|
|
@@ -157,6 +219,12 @@ module Terrazzo
|
|
|
157
219
|
klass = associated_class
|
|
158
220
|
"#{klass.name}Dashboard".constantize
|
|
159
221
|
end
|
|
222
|
+
|
|
223
|
+
def collection_includes_for(col_attrs)
|
|
224
|
+
find_associated_dashboard.new.includes_for_attributes(col_attrs)
|
|
225
|
+
rescue NameError
|
|
226
|
+
[]
|
|
227
|
+
end
|
|
160
228
|
end
|
|
161
229
|
end
|
|
162
230
|
end
|
|
@@ -17,10 +17,23 @@ module Terrazzo
|
|
|
17
17
|
false
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
+
def sortable?
|
|
21
|
+
false
|
|
22
|
+
end
|
|
23
|
+
|
|
20
24
|
def eager_load?
|
|
21
25
|
true
|
|
22
26
|
end
|
|
23
27
|
|
|
28
|
+
def eager_load_association(attr, model_class = nil)
|
|
29
|
+
rich_text_association = :"rich_text_#{attr}"
|
|
30
|
+
if model_class&.reflect_on_association(rich_text_association)
|
|
31
|
+
rich_text_association
|
|
32
|
+
else
|
|
33
|
+
attr.to_sym
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
24
37
|
def default_options
|
|
25
38
|
{ truncate: 100 }
|
|
26
39
|
end
|
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
module Terrazzo
|
|
2
2
|
module HasManyPagination
|
|
3
|
+
PARAM_PREFIX = "hm_".freeze
|
|
3
4
|
PARAM_SUFFIX = "_page".freeze
|
|
4
5
|
|
|
5
6
|
module_function
|
|
6
7
|
|
|
7
8
|
def extract(params, attributes)
|
|
8
9
|
attributes.each_with_object({}) do |attr, result|
|
|
9
|
-
value = params[param_key(attr)] ||
|
|
10
|
+
value = params[param_key(attr)] ||
|
|
11
|
+
params[param_key(attr).to_sym] ||
|
|
12
|
+
params[legacy_param_key(attr)] ||
|
|
13
|
+
params[legacy_param_key(attr).to_sym]
|
|
10
14
|
next if value.nil?
|
|
11
15
|
result[attr.to_sym] = { _page: value.to_i }
|
|
12
16
|
end
|
|
13
17
|
end
|
|
14
18
|
|
|
15
19
|
def param_key(attribute)
|
|
20
|
+
"#{PARAM_PREFIX}#{attribute}#{PARAM_SUFFIX}"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def legacy_param_key(attribute)
|
|
16
24
|
"#{attribute}#{PARAM_SUFFIX}"
|
|
17
25
|
end
|
|
18
26
|
end
|
|
@@ -23,6 +23,36 @@ module Terrazzo
|
|
|
23
23
|
resource_name.to_sym
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
+
def dashboard
|
|
27
|
+
@dashboard ||= dashboard_class&.new
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def dashboard_class
|
|
31
|
+
Terrazzo::ResourceResolver.new(controller_path).dashboard_class
|
|
32
|
+
rescue NameError
|
|
33
|
+
nil
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def navigation_label
|
|
37
|
+
dashboard&.navigation_label || resource_name.humanize.pluralize
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def navigation_group
|
|
41
|
+
dashboard&.navigation_group || "Resources"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def navigation_order
|
|
45
|
+
dashboard&.navigation_order || navigation_label
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def navigation_group_order
|
|
49
|
+
dashboard&.navigation_group_order || navigation_group
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def show_in_navigation?
|
|
53
|
+
dashboard.nil? || dashboard.show_in_navigation?
|
|
54
|
+
end
|
|
55
|
+
|
|
26
56
|
def ==(other)
|
|
27
57
|
resource_name == other.resource_name
|
|
28
58
|
end
|
data/lib/terrazzo/namespace.rb
CHANGED
|
@@ -21,14 +21,39 @@ module Terrazzo
|
|
|
21
21
|
end.map { |route| Resource.new(route) }.uniq(&:controller_path)
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
+
def navigation_resources
|
|
25
|
+
resources_with_index_route
|
|
26
|
+
.select(&:show_in_navigation?)
|
|
27
|
+
.sort_by do |resource|
|
|
28
|
+
[
|
|
29
|
+
navigation_sort_value(resource.navigation_group_order),
|
|
30
|
+
navigation_sort_value(resource.navigation_group),
|
|
31
|
+
navigation_sort_value(resource.navigation_order),
|
|
32
|
+
navigation_sort_value(resource.navigation_label),
|
|
33
|
+
]
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
24
37
|
private
|
|
25
38
|
|
|
26
39
|
def routes_for_namespace
|
|
27
|
-
|
|
40
|
+
namespace_routes.select do |route|
|
|
28
41
|
path = route.defaults[:controller].to_s
|
|
29
42
|
path.start_with?("#{name}/") &&
|
|
30
43
|
route.defaults[:action].present?
|
|
31
44
|
end
|
|
32
45
|
end
|
|
46
|
+
|
|
47
|
+
def namespace_routes
|
|
48
|
+
if router.respond_to?(:routes) && !router.equal?(Rails.application.routes.router)
|
|
49
|
+
router.routes
|
|
50
|
+
else
|
|
51
|
+
Rails.application.routes.routes
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def navigation_sort_value(value)
|
|
56
|
+
value.is_a?(Numeric) ? [0, value] : [1, value.to_s]
|
|
57
|
+
end
|
|
33
58
|
end
|
|
34
59
|
end
|
data/lib/terrazzo/search.rb
CHANGED
|
@@ -18,7 +18,10 @@ module Terrazzo
|
|
|
18
18
|
|
|
19
19
|
private
|
|
20
20
|
|
|
21
|
+
LIKE_ESCAPE = "\\"
|
|
22
|
+
|
|
21
23
|
def search_results
|
|
24
|
+
@association_search_joined = false
|
|
22
25
|
searchable_attributes = dashboard.search_attributes
|
|
23
26
|
return scoped_resource if searchable_attributes.empty?
|
|
24
27
|
|
|
@@ -26,31 +29,48 @@ module Terrazzo
|
|
|
26
29
|
type = dashboard.attribute_type_for(attr)
|
|
27
30
|
|
|
28
31
|
if type.respond_to?(:associative?) && type.associative?
|
|
29
|
-
build_association_search(attr)
|
|
32
|
+
build_association_search(attr, type)
|
|
30
33
|
else
|
|
31
34
|
table = scoped_resource.model.arel_table
|
|
32
|
-
table[attr].matches(
|
|
35
|
+
table[attr].matches(search_pattern, LIKE_ESCAPE)
|
|
33
36
|
end
|
|
34
37
|
end.compact
|
|
35
38
|
|
|
39
|
+
return scoped_resource if conditions.empty?
|
|
40
|
+
|
|
36
41
|
combined = conditions.reduce(:or)
|
|
37
|
-
scoped_resource.where(combined)
|
|
42
|
+
results = scoped_resource.where(combined)
|
|
43
|
+
@association_search_joined ? results.distinct : results
|
|
38
44
|
end
|
|
39
45
|
|
|
40
|
-
def build_association_search(attr)
|
|
46
|
+
def build_association_search(attr, type)
|
|
41
47
|
reflection = scoped_resource.model.reflect_on_association(attr)
|
|
42
48
|
return nil unless reflection
|
|
43
49
|
|
|
44
50
|
assoc_table = reflection.klass.arel_table
|
|
45
|
-
|
|
46
|
-
return nil
|
|
51
|
+
columns = association_search_columns(type, reflection.klass)
|
|
52
|
+
return nil if columns.empty?
|
|
47
53
|
|
|
48
54
|
@scoped_resource = scoped_resource.left_joins(attr)
|
|
49
|
-
|
|
55
|
+
@association_search_joined = true
|
|
56
|
+
columns
|
|
57
|
+
.map { |column| assoc_table[column].matches(search_pattern, LIKE_ESCAPE) }
|
|
58
|
+
.reduce(:or)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def association_search_columns(type, associated_class)
|
|
62
|
+
configured = type.respond_to?(:options) ? Array(type.options[:searchable_fields]) : []
|
|
63
|
+
candidates = configured.presence || [:name, :title, :email]
|
|
64
|
+
column_names = associated_class.column_names
|
|
65
|
+
|
|
66
|
+
candidates
|
|
67
|
+
.map(&:to_s)
|
|
68
|
+
.select { |column| column_names.include?(column) }
|
|
69
|
+
.map(&:to_sym)
|
|
50
70
|
end
|
|
51
71
|
|
|
52
|
-
def
|
|
53
|
-
term.
|
|
72
|
+
def search_pattern
|
|
73
|
+
"%#{ActiveRecord::Base.sanitize_sql_like(term.to_s, LIKE_ESCAPE)}%"
|
|
54
74
|
end
|
|
55
75
|
end
|
|
56
76
|
end
|
data/lib/terrazzo/version.rb
CHANGED
data/lib/terrazzo.rb
CHANGED
|
@@ -11,6 +11,7 @@ module Terrazzo
|
|
|
11
11
|
autoload :Search, "terrazzo/search"
|
|
12
12
|
autoload :Order, "terrazzo/order"
|
|
13
13
|
autoload :Filter, "terrazzo/filter"
|
|
14
|
+
autoload :CsvExport, "terrazzo/csv_export"
|
|
14
15
|
autoload :Namespace, "terrazzo/namespace"
|
|
15
16
|
autoload :GeneratorHelpers, "terrazzo/generator_helpers"
|
|
16
17
|
autoload :HasManyPagination, "terrazzo/has_many_pagination"
|
data/terrazzo.gemspec
CHANGED
|
@@ -7,15 +7,24 @@ Gem::Specification.new do |spec|
|
|
|
7
7
|
spec.email = []
|
|
8
8
|
spec.summary = "A Rails admin framework powered by Superglue and React"
|
|
9
9
|
spec.description = "Drop-in admin panel for Rails apps using the Administrate dashboard DSL with a React SPA frontend powered by Superglue."
|
|
10
|
-
spec.homepage = "https://github.
|
|
10
|
+
spec.homepage = "https://gohypelab.github.io/terrazzo/"
|
|
11
11
|
spec.license = "MIT"
|
|
12
12
|
spec.required_ruby_version = ">= 3.1"
|
|
13
|
+
spec.metadata = {
|
|
14
|
+
"homepage_uri" => spec.homepage,
|
|
15
|
+
"source_code_uri" => "https://github.com/gohypelab/terrazzo",
|
|
16
|
+
"documentation_uri" => "https://gohypelab.github.io/terrazzo/getting-started",
|
|
17
|
+
"changelog_uri" => "https://github.com/gohypelab/terrazzo/releases",
|
|
18
|
+
"bug_tracker_uri" => "https://github.com/gohypelab/terrazzo/issues",
|
|
19
|
+
"rubygems_mfa_required" => "true",
|
|
20
|
+
}
|
|
13
21
|
|
|
14
22
|
spec.files = Dir[
|
|
15
23
|
"app/**/*",
|
|
16
24
|
"config/**/*",
|
|
17
25
|
"lib/**/*",
|
|
18
26
|
"LICENSE",
|
|
27
|
+
"README.md",
|
|
19
28
|
"Rakefile",
|
|
20
29
|
"terrazzo.gemspec"
|
|
21
30
|
]
|
|
@@ -25,6 +34,7 @@ Gem::Specification.new do |spec|
|
|
|
25
34
|
spec.add_dependency "kaminari", "~> 1.2"
|
|
26
35
|
spec.add_dependency "superglue", "~> 1.1"
|
|
27
36
|
spec.add_dependency "form_props", ">= 0.0.6"
|
|
37
|
+
spec.add_dependency "csv", ">= 3.3"
|
|
28
38
|
|
|
29
39
|
spec.add_development_dependency "rspec-rails", "~> 7.0"
|
|
30
40
|
spec.add_development_dependency "factory_bot_rails", "~> 6.0"
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: terrazzo
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Terrazzo Contributors
|
|
@@ -65,6 +65,20 @@ dependencies:
|
|
|
65
65
|
- - ">="
|
|
66
66
|
- !ruby/object:Gem::Version
|
|
67
67
|
version: 0.0.6
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: csv
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - ">="
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '3.3'
|
|
75
|
+
type: :runtime
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - ">="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '3.3'
|
|
68
82
|
- !ruby/object:Gem::Dependency
|
|
69
83
|
name: rspec-rails
|
|
70
84
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -115,9 +129,11 @@ extensions: []
|
|
|
115
129
|
extra_rdoc_files: []
|
|
116
130
|
files:
|
|
117
131
|
- LICENSE
|
|
132
|
+
- README.md
|
|
118
133
|
- Rakefile
|
|
119
134
|
- app/controllers/terrazzo/application_controller.rb
|
|
120
135
|
- app/helpers/terrazzo/collection_actions_helper.rb
|
|
136
|
+
- app/helpers/terrazzo/resource_paths_helper.rb
|
|
121
137
|
- app/views/terrazzo/application/_edit_base.json.props
|
|
122
138
|
- app/views/terrazzo/application/_index_base.json.props
|
|
123
139
|
- app/views/terrazzo/application/_navigation.json.props
|
|
@@ -141,26 +157,36 @@ files:
|
|
|
141
157
|
- lib/generators/terrazzo/install/install_generator.rb
|
|
142
158
|
- lib/generators/terrazzo/install/templates/admin.css
|
|
143
159
|
- lib/generators/terrazzo/install/templates/application.js.erb
|
|
144
|
-
- lib/generators/terrazzo/install/templates/application.json.props.erb
|
|
145
160
|
- lib/generators/terrazzo/install/templates/application.json.props.tt
|
|
146
161
|
- lib/generators/terrazzo/install/templates/application_controller.rb.erb
|
|
147
162
|
- lib/generators/terrazzo/install/templates/application_visit.js.erb
|
|
163
|
+
- lib/generators/terrazzo/install/templates/components.json.erb
|
|
164
|
+
- lib/generators/terrazzo/install/templates/custom_page_mapping.js.erb
|
|
148
165
|
- lib/generators/terrazzo/install/templates/flash_slice.js.erb
|
|
166
|
+
- lib/generators/terrazzo/install/templates/generated_page_mapping.js.erb
|
|
167
|
+
- lib/generators/terrazzo/install/templates/jsconfig.json
|
|
149
168
|
- lib/generators/terrazzo/install/templates/page_to_page_mapping.js.erb
|
|
150
169
|
- lib/generators/terrazzo/install/templates/store.js.erb
|
|
151
170
|
- lib/generators/terrazzo/install/templates/superglue.html.erb.erb
|
|
152
171
|
- lib/generators/terrazzo/routes/routes_generator.rb
|
|
153
172
|
- lib/generators/terrazzo/views/edit_generator.rb
|
|
173
|
+
- lib/generators/terrazzo/views/eject_compatibility.rb
|
|
154
174
|
- lib/generators/terrazzo/views/field_generator.rb
|
|
175
|
+
- lib/generators/terrazzo/views/generated_defaults_helper.rb
|
|
155
176
|
- lib/generators/terrazzo/views/index_generator.rb
|
|
156
177
|
- lib/generators/terrazzo/views/layout_generator.rb
|
|
157
178
|
- lib/generators/terrazzo/views/navigation_generator.rb
|
|
158
179
|
- lib/generators/terrazzo/views/new_generator.rb
|
|
159
180
|
- lib/generators/terrazzo/views/page_mapping_helper.rb
|
|
160
181
|
- lib/generators/terrazzo/views/show_generator.rb
|
|
182
|
+
- lib/generators/terrazzo/views/templates/components/CollectionFilters.jsx
|
|
183
|
+
- lib/generators/terrazzo/views/templates/components/CollectionItemActions.jsx
|
|
184
|
+
- lib/generators/terrazzo/views/templates/components/CollectionToolbarActions.jsx
|
|
161
185
|
- lib/generators/terrazzo/views/templates/components/FlashMessages.jsx
|
|
186
|
+
- lib/generators/terrazzo/views/templates/components/HasManyPagination.jsx
|
|
162
187
|
- lib/generators/terrazzo/views/templates/components/Layout.jsx
|
|
163
188
|
- lib/generators/terrazzo/views/templates/components/Pagination.jsx
|
|
189
|
+
- lib/generators/terrazzo/views/templates/components/ResourceTable.jsx
|
|
164
190
|
- lib/generators/terrazzo/views/templates/components/SearchBar.jsx
|
|
165
191
|
- lib/generators/terrazzo/views/templates/components/SortableHeader.jsx
|
|
166
192
|
- lib/generators/terrazzo/views/templates/components/app-sidebar.jsx
|
|
@@ -184,7 +210,9 @@ files:
|
|
|
184
210
|
- lib/generators/terrazzo/views/templates/components/ui/table.jsx
|
|
185
211
|
- lib/generators/terrazzo/views/templates/components/ui/textarea.jsx
|
|
186
212
|
- lib/generators/terrazzo/views/templates/components/ui/tooltip.jsx
|
|
187
|
-
- lib/generators/terrazzo/views/templates/fields/
|
|
213
|
+
- lib/generators/terrazzo/views/templates/fields/asset/FormField.jsx
|
|
214
|
+
- lib/generators/terrazzo/views/templates/fields/asset/IndexField.jsx
|
|
215
|
+
- lib/generators/terrazzo/views/templates/fields/asset/ShowField.jsx
|
|
188
216
|
- lib/generators/terrazzo/views/templates/fields/belongs_to/FormField.jsx
|
|
189
217
|
- lib/generators/terrazzo/views/templates/fields/belongs_to/IndexField.jsx
|
|
190
218
|
- lib/generators/terrazzo/views/templates/fields/belongs_to/ShowField.jsx
|
|
@@ -209,7 +237,6 @@ files:
|
|
|
209
237
|
- lib/generators/terrazzo/views/templates/fields/hstore/FormField.jsx
|
|
210
238
|
- lib/generators/terrazzo/views/templates/fields/hstore/IndexField.jsx
|
|
211
239
|
- lib/generators/terrazzo/views/templates/fields/hstore/ShowField.jsx
|
|
212
|
-
- lib/generators/terrazzo/views/templates/fields/index.js
|
|
213
240
|
- lib/generators/terrazzo/views/templates/fields/number/FormField.jsx
|
|
214
241
|
- lib/generators/terrazzo/views/templates/fields/number/IndexField.jsx
|
|
215
242
|
- lib/generators/terrazzo/views/templates/fields/number/ShowField.jsx
|
|
@@ -248,6 +275,7 @@ files:
|
|
|
248
275
|
- lib/generators/terrazzo/views/views_generator.rb
|
|
249
276
|
- lib/terrazzo.rb
|
|
250
277
|
- lib/terrazzo/base_dashboard.rb
|
|
278
|
+
- lib/terrazzo/csv_export.rb
|
|
251
279
|
- lib/terrazzo/engine.rb
|
|
252
280
|
- lib/terrazzo/field/asset.rb
|
|
253
281
|
- lib/terrazzo/field/associative.rb
|
|
@@ -287,10 +315,16 @@ files:
|
|
|
287
315
|
- lib/terrazzo/uses_superglue.rb
|
|
288
316
|
- lib/terrazzo/version.rb
|
|
289
317
|
- terrazzo.gemspec
|
|
290
|
-
homepage: https://github.
|
|
318
|
+
homepage: https://gohypelab.github.io/terrazzo/
|
|
291
319
|
licenses:
|
|
292
320
|
- MIT
|
|
293
|
-
metadata:
|
|
321
|
+
metadata:
|
|
322
|
+
homepage_uri: https://gohypelab.github.io/terrazzo/
|
|
323
|
+
source_code_uri: https://github.com/gohypelab/terrazzo
|
|
324
|
+
documentation_uri: https://gohypelab.github.io/terrazzo/getting-started
|
|
325
|
+
changelog_uri: https://github.com/gohypelab/terrazzo/releases
|
|
326
|
+
bug_tracker_uri: https://github.com/gohypelab/terrazzo/issues
|
|
327
|
+
rubygems_mfa_required: 'true'
|
|
294
328
|
rdoc_options: []
|
|
295
329
|
require_paths:
|
|
296
330
|
- lib
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
json.data(search: request.path) do
|
|
2
|
-
yield
|
|
3
|
-
end
|
|
4
|
-
|
|
5
|
-
json.componentIdentifier local_assigns[:virtual_path_of_template]
|
|
6
|
-
json.assets do
|
|
7
|
-
json.array! []
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
json.csrfToken form_authenticity_token
|
|
11
|
-
json.restoreStrategy "fromCacheAndRevisitInBackground"
|
|
12
|
-
|
|
13
|
-
json.flash do
|
|
14
|
-
flash.each do |type, message|
|
|
15
|
-
json.set!(type, message)
|
|
16
|
-
end
|
|
17
|
-
end
|