activeadmin_batched_export 0.1.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 (32) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +9 -0
  3. data/CODE_OF_CONDUCT.md +38 -0
  4. data/CONTRIBUTING.md +29 -0
  5. data/GOVERNANCE.md +32 -0
  6. data/LICENSE.md +21 -0
  7. data/README.md +208 -0
  8. data/SECURITY.md +28 -0
  9. data/activeadmin_batched_export.gemspec +67 -0
  10. data/app/assets/controllers/activeadmin_batched_export/batched_export_controller.js +188 -0
  11. data/app/views/active_admin/batched_export/_actions.html.erb +25 -0
  12. data/app/views/active_admin/batched_export/_columns.html.erb +21 -0
  13. data/app/views/active_admin/batched_export/_filters.html.erb +11 -0
  14. data/app/views/active_admin/batched_export/_progress.html.erb +14 -0
  15. data/app/views/active_admin/batched_export/_summary.html.erb +40 -0
  16. data/app/views/active_admin/batched_export/workspace.html.erb +22 -0
  17. data/app/views/active_admin/shared/_download_format_links.html.erb +7 -0
  18. data/config/locales/activeadmin_batched_export.en.yml +29 -0
  19. data/config/polyrun_coverage.yml +7 -0
  20. data/lib/activeadmin/batched_export/configuration.rb +37 -0
  21. data/lib/activeadmin/batched_export/controller_methods.rb +276 -0
  22. data/lib/activeadmin/batched_export/engine.rb +45 -0
  23. data/lib/activeadmin/batched_export/export_macro_catalog.rb +77 -0
  24. data/lib/activeadmin/batched_export/export_macro_resolver.rb +73 -0
  25. data/lib/activeadmin/batched_export/install.rb +33 -0
  26. data/lib/activeadmin/batched_export/resource_extension.rb +65 -0
  27. data/lib/activeadmin/batched_export/styles.rb +45 -0
  28. data/lib/activeadmin/batched_export/version.rb +7 -0
  29. data/lib/activeadmin/batched_export.rb +25 -0
  30. data/lib/activeadmin_batched_export.rb +5 -0
  31. data/sig/activeadmin/batched_export.rbs +5 -0
  32. metadata +377 -0
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveAdmin
4
+ module BatchedExport
5
+ module Install
6
+ module_function
7
+
8
+ def call
9
+ ActiveAdmin.application.namespaces.each do |namespace|
10
+ namespace.resources.each do |config|
11
+ next if config.is_a?(ActiveAdmin::Page)
12
+ next unless config.batched_export_enabled?
13
+ next unless config.controller.action_methods.include?("index")
14
+
15
+ changed = false
16
+ unless config.collection_actions.any? { |action| action.name.to_sym == :batched_export }
17
+ config.collection_actions << ActiveAdmin::ControllerAction.new(:batched_export, method: :get)
18
+ changed = true
19
+ end
20
+
21
+ controller = config.controller
22
+ unless controller.included_modules.include?(ControllerMethods)
23
+ controller.include(ControllerMethods)
24
+ changed = true
25
+ end
26
+
27
+ controller.clear_action_methods! if changed
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveAdmin
4
+ module BatchedExport
5
+ module ResourceSettings
6
+ def batched_export_settings
7
+ @batched_export_settings ||= {}
8
+ end
9
+
10
+ def batched_export_settings=(value)
11
+ @batched_export_settings = value || {}
12
+ end
13
+
14
+ def batched_export_enabled?
15
+ settings = batched_export_settings
16
+ if settings.key?(:enabled) || settings.key?("enabled")
17
+ return settings[:enabled] != false && settings["enabled"] != false
18
+ end
19
+
20
+ BatchedExport.config.default_enabled
21
+ end
22
+
23
+ def batched_export_column_selection?
24
+ settings = batched_export_settings
25
+ if settings.key?(:column_selection) || settings.key?("column_selection")
26
+ return settings[:column_selection] != false && settings["column_selection"] != false
27
+ end
28
+
29
+ BatchedExport.config.default_column_selection
30
+ end
31
+
32
+ def batched_export_batch_size
33
+ batched_export_settings[:batch_size] ||
34
+ batched_export_settings["batch_size"] ||
35
+ BatchedExport.config.batch_size
36
+ end
37
+
38
+ def batched_export_effective_batch_size
39
+ requested = batched_export_batch_size
40
+ maximum = BatchedExport.config.max_batch_size
41
+ [requested, maximum].min
42
+ end
43
+
44
+ def batched_export_includes
45
+ settings = batched_export_settings
46
+ settings[:includes] || settings["includes"]
47
+ end
48
+
49
+ def batched_export_filename_proc
50
+ batched_export_settings[:filename] ||
51
+ batched_export_settings["filename"] ||
52
+ BatchedExport.config.filename_proc
53
+ end
54
+ end
55
+
56
+ module ResourceDSL
57
+ def batched_export(**options)
58
+ config.batched_export_settings = options
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ ActiveAdmin::Resource.include(ActiveAdmin::BatchedExport::ResourceSettings)
65
+ ActiveAdmin::ResourceDSL.include(ActiveAdmin::BatchedExport::ResourceDSL)
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveAdmin
4
+ module BatchedExport
5
+ class Styles
6
+ DEFAULTS = {
7
+ workspace: "mx-auto max-w-2xl space-y-6 py-8",
8
+ card: "space-y-2 rounded border border-gray-200 bg-white p-4 dark:border-gray-700 dark:bg-gray-900/40",
9
+ card_title: "text-base font-semibold text-gray-900 dark:text-gray-100",
10
+ table: "w-full border-collapse text-sm",
11
+ table_body: "align-top",
12
+ table_row: "border-b border-gray-100 dark:border-gray-800",
13
+ table_header: "w-44 py-2 pr-4 text-left font-medium text-gray-600 dark:text-gray-400",
14
+ table_cell: "py-2 text-gray-900 dark:text-gray-100",
15
+ table_cell_mono: "py-2 font-mono text-sm text-gray-900 dark:text-gray-100",
16
+ hint: "text-sm text-gray-600 dark:text-gray-400",
17
+ column_grid: "grid max-h-[min(70vh,48rem)] grid-cols-1 gap-2 overflow-y-auto sm:grid-cols-2",
18
+ column_label: "flex cursor-pointer items-start gap-2 text-sm text-gray-900 dark:text-gray-100",
19
+ column_checkbox: "mt-0.5",
20
+ heading: "text-lg font-semibold",
21
+ progress_wrap: "hidden space-y-3 rounded border border-gray-200 p-4 dark:border-gray-700",
22
+ progress_bar: "h-2 w-full",
23
+ progress_status_row: "flex justify-between text-sm",
24
+ error: "hidden text-sm text-red-600",
25
+ warning: "text-sm text-amber-800 dark:text-amber-300",
26
+ actions: "flex flex-wrap gap-3",
27
+ primary_button: "rounded bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700 disabled:opacity-50",
28
+ secondary_button: "hidden rounded border border-gray-300 px-4 py-2 text-sm font-medium hover:bg-gray-50 disabled:opacity-50 dark:border-gray-600 dark:hover:bg-gray-800",
29
+ back_link: "inline-flex items-center text-sm text-blue-600 hover:underline"
30
+ }.freeze
31
+
32
+ def initialize(overrides = {})
33
+ @classes = DEFAULTS.merge(overrides)
34
+ end
35
+
36
+ def [](key)
37
+ @classes.fetch(key)
38
+ end
39
+
40
+ def merge(overrides)
41
+ self.class.new(@classes.merge(overrides))
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveAdmin
4
+ module BatchedExport
5
+ VERSION = "0.1.0"
6
+ end
7
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveAdmin
4
+ module BatchedExport
5
+ class << self
6
+ def config
7
+ require "activeadmin/batched_export/configuration"
8
+ @config ||= Configuration.new
9
+ end
10
+
11
+ def configure
12
+ yield config
13
+ end
14
+
15
+ def styles
16
+ config.styles
17
+ end
18
+
19
+ def install!
20
+ require "activeadmin/batched_export/install"
21
+ Install.call
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "activeadmin/batched_export/version"
4
+ require "activeadmin/batched_export"
5
+ require "activeadmin/batched_export/engine"
@@ -0,0 +1,5 @@
1
+ module ActiveAdmin
2
+ module BatchedExport
3
+ VERSION: String
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,377 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: activeadmin_batched_export
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Andrei Makarov
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: activeadmin
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: 4.0.0.beta13
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '5'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: 4.0.0.beta13
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '5'
32
+ - !ruby/object:Gem::Dependency
33
+ name: importmap-rails
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rails
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '7.1'
53
+ type: :runtime
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '7.1'
60
+ - !ruby/object:Gem::Dependency
61
+ name: appraisal
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '2'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '2'
74
+ - !ruby/object:Gem::Dependency
75
+ name: bundler
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '2'
81
+ type: :development
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '2'
88
+ - !ruby/object:Gem::Dependency
89
+ name: polyrun
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 2.2.0
95
+ type: :development
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: 2.2.0
102
+ - !ruby/object:Gem::Dependency
103
+ name: prosopite
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '2.0'
109
+ type: :development
110
+ prerelease: false
111
+ version_requirements: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '2.0'
116
+ - !ruby/object:Gem::Dependency
117
+ name: rake
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '13'
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '13'
130
+ - !ruby/object:Gem::Dependency
131
+ name: rspec
132
+ requirement: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: '3'
137
+ type: :development
138
+ prerelease: false
139
+ version_requirements: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - "~>"
142
+ - !ruby/object:Gem::Version
143
+ version: '3'
144
+ - !ruby/object:Gem::Dependency
145
+ name: rspec-rails
146
+ requirement: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '6'
151
+ type: :development
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '6'
158
+ - !ruby/object:Gem::Dependency
159
+ name: propshaft
160
+ requirement: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '1.0'
165
+ type: :development
166
+ prerelease: false
167
+ version_requirements: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '1.0'
172
+ - !ruby/object:Gem::Dependency
173
+ name: sqlite3
174
+ requirement: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: '1'
179
+ type: :development
180
+ prerelease: false
181
+ version_requirements: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: '1'
186
+ - !ruby/object:Gem::Dependency
187
+ name: rubocop-rails
188
+ requirement: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: '2.34'
193
+ type: :development
194
+ prerelease: false
195
+ version_requirements: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - "~>"
198
+ - !ruby/object:Gem::Version
199
+ version: '2.34'
200
+ - !ruby/object:Gem::Dependency
201
+ name: rubocop-rspec
202
+ requirement: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - "~>"
205
+ - !ruby/object:Gem::Version
206
+ version: '3.8'
207
+ type: :development
208
+ prerelease: false
209
+ version_requirements: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - "~>"
212
+ - !ruby/object:Gem::Version
213
+ version: '3.8'
214
+ - !ruby/object:Gem::Dependency
215
+ name: rubocop-thread_safety
216
+ requirement: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - "~>"
219
+ - !ruby/object:Gem::Version
220
+ version: '0.7'
221
+ type: :development
222
+ prerelease: false
223
+ version_requirements: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - "~>"
226
+ - !ruby/object:Gem::Version
227
+ version: '0.7'
228
+ - !ruby/object:Gem::Dependency
229
+ name: standard
230
+ requirement: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - "~>"
233
+ - !ruby/object:Gem::Version
234
+ version: '1.52'
235
+ type: :development
236
+ prerelease: false
237
+ version_requirements: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - "~>"
240
+ - !ruby/object:Gem::Version
241
+ version: '1.52'
242
+ - !ruby/object:Gem::Dependency
243
+ name: standard-custom
244
+ requirement: !ruby/object:Gem::Requirement
245
+ requirements:
246
+ - - "~>"
247
+ - !ruby/object:Gem::Version
248
+ version: '1.0'
249
+ type: :development
250
+ prerelease: false
251
+ version_requirements: !ruby/object:Gem::Requirement
252
+ requirements:
253
+ - - "~>"
254
+ - !ruby/object:Gem::Version
255
+ version: '1.0'
256
+ - !ruby/object:Gem::Dependency
257
+ name: standard-performance
258
+ requirement: !ruby/object:Gem::Requirement
259
+ requirements:
260
+ - - "~>"
261
+ - !ruby/object:Gem::Version
262
+ version: '1.8'
263
+ type: :development
264
+ prerelease: false
265
+ version_requirements: !ruby/object:Gem::Requirement
266
+ requirements:
267
+ - - "~>"
268
+ - !ruby/object:Gem::Version
269
+ version: '1.8'
270
+ - !ruby/object:Gem::Dependency
271
+ name: standard-rails
272
+ requirement: !ruby/object:Gem::Requirement
273
+ requirements:
274
+ - - "~>"
275
+ - !ruby/object:Gem::Version
276
+ version: '1.5'
277
+ type: :development
278
+ prerelease: false
279
+ version_requirements: !ruby/object:Gem::Requirement
280
+ requirements:
281
+ - - "~>"
282
+ - !ruby/object:Gem::Version
283
+ version: '1.5'
284
+ - !ruby/object:Gem::Dependency
285
+ name: standard-rspec
286
+ requirement: !ruby/object:Gem::Requirement
287
+ requirements:
288
+ - - "~>"
289
+ - !ruby/object:Gem::Version
290
+ version: '0.3'
291
+ type: :development
292
+ prerelease: false
293
+ version_requirements: !ruby/object:Gem::Requirement
294
+ requirements:
295
+ - - "~>"
296
+ - !ruby/object:Gem::Version
297
+ version: '0.3'
298
+ - !ruby/object:Gem::Dependency
299
+ name: rbs
300
+ requirement: !ruby/object:Gem::Requirement
301
+ requirements:
302
+ - - "~>"
303
+ - !ruby/object:Gem::Version
304
+ version: '3'
305
+ type: :development
306
+ prerelease: false
307
+ version_requirements: !ruby/object:Gem::Requirement
308
+ requirements:
309
+ - - "~>"
310
+ - !ruby/object:Gem::Version
311
+ version: '3'
312
+ description: Replaces long-lived ActiveAdmin index downloads with a batched export
313
+ workspace, customizable views, and export column macros.
314
+ email:
315
+ - contact@kiskolabs.com
316
+ executables: []
317
+ extensions: []
318
+ extra_rdoc_files: []
319
+ files:
320
+ - CHANGELOG.md
321
+ - CODE_OF_CONDUCT.md
322
+ - CONTRIBUTING.md
323
+ - GOVERNANCE.md
324
+ - LICENSE.md
325
+ - README.md
326
+ - SECURITY.md
327
+ - activeadmin_batched_export.gemspec
328
+ - app/assets/controllers/activeadmin_batched_export/batched_export_controller.js
329
+ - app/views/active_admin/batched_export/_actions.html.erb
330
+ - app/views/active_admin/batched_export/_columns.html.erb
331
+ - app/views/active_admin/batched_export/_filters.html.erb
332
+ - app/views/active_admin/batched_export/_progress.html.erb
333
+ - app/views/active_admin/batched_export/_summary.html.erb
334
+ - app/views/active_admin/batched_export/workspace.html.erb
335
+ - app/views/active_admin/shared/_download_format_links.html.erb
336
+ - config/locales/activeadmin_batched_export.en.yml
337
+ - config/polyrun_coverage.yml
338
+ - lib/activeadmin/batched_export.rb
339
+ - lib/activeadmin/batched_export/configuration.rb
340
+ - lib/activeadmin/batched_export/controller_methods.rb
341
+ - lib/activeadmin/batched_export/engine.rb
342
+ - lib/activeadmin/batched_export/export_macro_catalog.rb
343
+ - lib/activeadmin/batched_export/export_macro_resolver.rb
344
+ - lib/activeadmin/batched_export/install.rb
345
+ - lib/activeadmin/batched_export/resource_extension.rb
346
+ - lib/activeadmin/batched_export/styles.rb
347
+ - lib/activeadmin/batched_export/version.rb
348
+ - lib/activeadmin_batched_export.rb
349
+ - sig/activeadmin/batched_export.rbs
350
+ homepage: https://github.com/amkisko/activeadmin_batched_export.rb
351
+ licenses:
352
+ - MIT
353
+ metadata:
354
+ homepage_uri: https://github.com/amkisko/activeadmin_batched_export.rb
355
+ source_code_uri: https://github.com/amkisko/activeadmin_batched_export.rb/tree/main
356
+ changelog_uri: https://github.com/amkisko/activeadmin_batched_export.rb/blob/main/CHANGELOG.md
357
+ bug_tracker_uri: https://github.com/amkisko/activeadmin_batched_export.rb/issues
358
+ documentation_uri: https://github.com/amkisko/activeadmin_batched_export.rb#readme
359
+ rubygems_mfa_required: 'true'
360
+ rdoc_options: []
361
+ require_paths:
362
+ - lib
363
+ required_ruby_version: !ruby/object:Gem::Requirement
364
+ requirements:
365
+ - - ">="
366
+ - !ruby/object:Gem::Version
367
+ version: 3.2.0
368
+ required_rubygems_version: !ruby/object:Gem::Requirement
369
+ requirements:
370
+ - - ">="
371
+ - !ruby/object:Gem::Version
372
+ version: '0'
373
+ requirements: []
374
+ rubygems_version: 4.0.3
375
+ specification_version: 4
376
+ summary: Batched CSV, JSON, and XML export workspace for ActiveAdmin 4
377
+ test_files: []