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.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +101 -0
  3. data/Rakefile +1 -0
  4. data/app/controllers/terrazzo/application_controller.rb +63 -14
  5. data/app/helpers/terrazzo/collection_actions_helper.rb +38 -13
  6. data/app/helpers/terrazzo/resource_paths_helper.rb +55 -0
  7. data/app/views/terrazzo/application/_edit_base.json.props +7 -4
  8. data/app/views/terrazzo/application/_index_base.json.props +83 -7
  9. data/app/views/terrazzo/application/_navigation.json.props +7 -4
  10. data/app/views/terrazzo/application/_new_base.json.props +6 -3
  11. data/app/views/terrazzo/application/_show_base.json.props +7 -5
  12. data/lib/generators/terrazzo/dashboard/dashboard_generator.rb +48 -24
  13. data/lib/generators/terrazzo/dashboard/templates/controller.rb.erb +8 -4
  14. data/lib/generators/terrazzo/dashboard/templates/dashboard.rb.erb +33 -25
  15. data/lib/generators/terrazzo/eject/eject_generator.rb +223 -113
  16. data/lib/generators/terrazzo/field/field_generator.rb +51 -7
  17. data/lib/generators/terrazzo/field/templates/FormField.jsx.erb +2 -3
  18. data/lib/generators/terrazzo/install/install_generator.rb +641 -4
  19. data/lib/generators/terrazzo/install/templates/admin.css +2 -0
  20. data/lib/generators/terrazzo/install/templates/application.js.erb +3 -0
  21. data/lib/generators/terrazzo/install/templates/components.json.erb +17 -0
  22. data/lib/generators/terrazzo/install/templates/custom_page_mapping.js.erb +5 -0
  23. data/lib/generators/terrazzo/install/templates/generated_page_mapping.js.erb +10 -0
  24. data/lib/generators/terrazzo/install/templates/jsconfig.json +8 -0
  25. data/lib/generators/terrazzo/install/templates/page_to_page_mapping.js.erb +9 -1
  26. data/lib/generators/terrazzo/install/templates/superglue.html.erb.erb +2 -2
  27. data/lib/generators/terrazzo/routes/routes_generator.rb +55 -20
  28. data/lib/generators/terrazzo/views/edit_generator.rb +16 -10
  29. data/lib/generators/terrazzo/views/eject_compatibility.rb +19 -0
  30. data/lib/generators/terrazzo/views/field_generator.rb +18 -6
  31. data/lib/generators/terrazzo/views/generated_defaults_helper.rb +110 -0
  32. data/lib/generators/terrazzo/views/index_generator.rb +9 -8
  33. data/lib/generators/terrazzo/views/layout_generator.rb +4 -3
  34. data/lib/generators/terrazzo/views/navigation_generator.rb +5 -1
  35. data/lib/generators/terrazzo/views/new_generator.rb +16 -10
  36. data/lib/generators/terrazzo/views/page_mapping_helper.rb +131 -8
  37. data/lib/generators/terrazzo/views/show_generator.rb +7 -6
  38. data/lib/generators/terrazzo/views/templates/components/CollectionFilters.jsx +25 -0
  39. data/lib/generators/terrazzo/views/templates/components/CollectionItemActions.jsx +68 -0
  40. data/lib/generators/terrazzo/views/templates/components/CollectionToolbarActions.jsx +60 -0
  41. data/lib/generators/terrazzo/views/templates/components/HasManyPagination.jsx +36 -0
  42. data/lib/generators/terrazzo/views/templates/components/Layout.jsx +9 -4
  43. data/lib/generators/terrazzo/views/templates/components/Pagination.jsx +32 -24
  44. data/lib/generators/terrazzo/views/templates/components/ResourceTable.jsx +172 -0
  45. data/lib/generators/terrazzo/views/templates/components/SearchBar.jsx +14 -6
  46. data/lib/generators/terrazzo/views/templates/components/SortableHeader.jsx +7 -5
  47. data/lib/generators/terrazzo/views/templates/components/app-sidebar.jsx +1 -1
  48. data/lib/generators/terrazzo/views/templates/components/site-header.jsx +2 -2
  49. data/lib/generators/terrazzo/views/templates/fields/asset/FormField.jsx +15 -0
  50. data/lib/generators/terrazzo/views/templates/fields/asset/IndexField.jsx +5 -0
  51. data/lib/generators/terrazzo/views/templates/fields/asset/ShowField.jsx +13 -0
  52. data/lib/generators/terrazzo/views/templates/fields/belongs_to/FormField.jsx +1 -1
  53. data/lib/generators/terrazzo/views/templates/fields/boolean/FormField.jsx +1 -1
  54. data/lib/generators/terrazzo/views/templates/fields/boolean/IndexField.jsx +1 -1
  55. data/lib/generators/terrazzo/views/templates/fields/has_many/FormField.jsx +3 -3
  56. data/lib/generators/terrazzo/views/templates/fields/has_many/IndexField.jsx +4 -3
  57. data/lib/generators/terrazzo/views/templates/fields/has_many/ShowField.jsx +21 -35
  58. data/lib/generators/terrazzo/views/templates/fields/has_one/FormField.jsx +1 -1
  59. data/lib/generators/terrazzo/views/templates/fields/hstore/FormField.jsx +5 -5
  60. data/lib/generators/terrazzo/views/templates/fields/hstore/IndexField.jsx +0 -2
  61. data/lib/generators/terrazzo/views/templates/fields/hstore/ShowField.jsx +1 -1
  62. data/lib/generators/terrazzo/views/templates/fields/number/IndexField.jsx +1 -1
  63. data/lib/generators/terrazzo/views/templates/fields/number/ShowField.jsx +1 -1
  64. data/lib/generators/terrazzo/views/templates/fields/polymorphic/FormField.jsx +3 -2
  65. data/lib/generators/terrazzo/views/templates/fields/rich_text/FormField.jsx +2 -2
  66. data/lib/generators/terrazzo/views/templates/fields/select/FormField.jsx +1 -1
  67. data/lib/generators/terrazzo/views/templates/fields/select/IndexField.jsx +1 -1
  68. data/lib/generators/terrazzo/views/templates/fields/shared/TextInputFormField.jsx +2 -2
  69. data/lib/generators/terrazzo/views/templates/fields/text/FormField.jsx +2 -2
  70. data/lib/generators/terrazzo/views/templates/pages/_collection.jsx +5 -3
  71. data/lib/generators/terrazzo/views/templates/pages/_form.jsx +37 -30
  72. data/lib/generators/terrazzo/views/templates/pages/_navigation.json.props +14 -4
  73. data/lib/generators/terrazzo/views/templates/pages/edit.jsx +6 -4
  74. data/lib/generators/terrazzo/views/templates/pages/index.jsx +20 -8
  75. data/lib/generators/terrazzo/views/templates/pages/new.jsx +8 -4
  76. data/lib/generators/terrazzo/views/templates/pages/show.jsx +30 -32
  77. data/lib/generators/terrazzo/views/views_generator.rb +9 -5
  78. data/lib/terrazzo/base_dashboard.rb +167 -5
  79. data/lib/terrazzo/csv_export.rb +38 -0
  80. data/lib/terrazzo/field/associative.rb +16 -4
  81. data/lib/terrazzo/field/base.rb +4 -0
  82. data/lib/terrazzo/field/belongs_to.rb +1 -2
  83. data/lib/terrazzo/field/deferred.rb +4 -0
  84. data/lib/terrazzo/field/has_many.rb +79 -11
  85. data/lib/terrazzo/field/password.rb +6 -0
  86. data/lib/terrazzo/field/rich_text.rb +13 -0
  87. data/lib/terrazzo/generator_helpers.rb +1 -1
  88. data/lib/terrazzo/has_many_pagination.rb +9 -1
  89. data/lib/terrazzo/namespace/resource.rb +30 -0
  90. data/lib/terrazzo/namespace.rb +26 -1
  91. data/lib/terrazzo/search.rb +29 -9
  92. data/lib/terrazzo/version.rb +1 -1
  93. data/lib/terrazzo.rb +1 -0
  94. data/terrazzo.gemspec +11 -1
  95. metadata +40 -6
  96. data/lib/generators/terrazzo/install/templates/application.json.props.erb +0 -17
  97. data/lib/generators/terrazzo/views/templates/fields/FieldRenderer.jsx +0 -103
  98. 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] || 5).to_i
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
- paginated.to_a
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
- { **serialize_with_collection_attributes(page_records, col_attrs), **meta }
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: page_records.map { |r| { id: r.id.to_s, display: display_name(r) } },
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
- dashboard_class = find_associated_dashboard
121
+ dashboard = find_associated_dashboard.new
107
122
 
108
123
  headers = col_attrs.map do |attr|
109
- { attribute: attr.to_s, label: attr.to_s.humanize }
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 = dashboard_class.new.attribute_type_for(attr).new(attr, nil, :index, resource: record)
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
- dashboard = associated_dashboard
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
@@ -11,6 +11,12 @@ module Terrazzo
11
11
  data.present? ? MASKED : nil
12
12
  end
13
13
  end
14
+
15
+ class << self
16
+ def sortable?
17
+ false
18
+ end
19
+ end
14
20
  end
15
21
  end
16
22
  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
@@ -12,7 +12,7 @@ module Terrazzo
12
12
  case column.type
13
13
  when :string
14
14
  if column.name.end_with?("_id")
15
- "Field::Number"
15
+ "Field::String"
16
16
  elsif column.name.include?("email")
17
17
  "Field::Email"
18
18
  elsif column.name.include?("url") || column.name.include?("link")
@@ -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)] || params[param_key(attr).to_sym]
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
@@ -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
- Rails.application.routes.routes.select do |route|
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
@@ -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("%#{sanitize(term)}%")
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
- name_column = [:name, :title, :email].find { |col| reflection.klass.column_names.include?(col.to_s) }
46
- return nil unless name_column
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
- assoc_table[name_column].matches("%#{sanitize(term)}%")
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 sanitize(term)
53
- term.gsub(/[%_\\]/) { |m| "\\#{m}" }
72
+ def search_pattern
73
+ "%#{ActiveRecord::Base.sanitize_sql_like(term.to_s, LIKE_ESCAPE)}%"
54
74
  end
55
75
  end
56
76
  end
@@ -1,3 +1,3 @@
1
1
  module Terrazzo
2
- VERSION = "0.6.0"
2
+ VERSION = "0.7.0"
3
3
  end
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.com/gohypelab/terrazzo"
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.6.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/FieldRenderer.jsx
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.com/gohypelab/terrazzo
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