lotus_admin 0.3.1 → 0.4.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/app/controllers/concerns/lotus_admin/file_streamer.rb +74 -0
- data/app/controllers/concerns/lotus_admin/resourceful_controller.rb +8 -0
- data/app/controllers/lotus_admin/authenticated_controller.rb +1 -0
- data/app/services/lotus_admin/exporter.rb +113 -0
- data/app/views/lotus_admin/shared/_collection_pagination.html.haml +6 -2
- data/lib/lotus_admin/version.rb +1 -1
- data/lib/lotus_admin.rb +2 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a9240be9d5d6c8e2984eae7a3fc3f059fd6b853
|
4
|
+
data.tar.gz: f728a8239f07eb2e08708903031b2fbb542dcc4b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0393e4130d668a2e614404a5c95f46831a113649e5d3d5280e6ba73c6ef2cc1bbbc986f8ddff75457581bb43f723deae40ca546bca7637263dc38fbf2b33667
|
7
|
+
data.tar.gz: 3a7f73827b2a68988937535df3aeba48234f5e9efc68ee2ecf75344a2b1998b772202af5df257dbc4df8c6cd28c5c1b1f3160339f916e683a2d9efa1779a8cad
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module LotusAdmin
|
2
|
+
module FileStreamer
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
include ActionController::Live
|
7
|
+
|
8
|
+
class_attribute :_exporter_class, instance_accessor: false
|
9
|
+
class_attribute :_exporter_filename, instance_accessor: false
|
10
|
+
|
11
|
+
let(:exporter) { self.class._exporter_class }
|
12
|
+
end
|
13
|
+
|
14
|
+
# Usage
|
15
|
+
#
|
16
|
+
# class LotusAdmin::OrganizationsController < LotusAdmin::AuthenticatedController
|
17
|
+
# exporter OrganizationExporter
|
18
|
+
#
|
19
|
+
# # optional filename customization in context of controller
|
20
|
+
# exports_filename { "organizations-#{ params[:parent_id] }" }
|
21
|
+
# end
|
22
|
+
class_methods do
|
23
|
+
def exporter(exporter_class)
|
24
|
+
self._exporter_class = exporter_class
|
25
|
+
end
|
26
|
+
|
27
|
+
def exports_filename(&block)
|
28
|
+
self._exporter_filename = block
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Usage
|
33
|
+
#
|
34
|
+
# def index
|
35
|
+
# super do |format|
|
36
|
+
# format.pdf { ... }
|
37
|
+
# end
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# Will automatically stream CSV from configured exporter
|
41
|
+
def index(&block)
|
42
|
+
super do |format|
|
43
|
+
if self.class._exporter_class.present?
|
44
|
+
format.csv do
|
45
|
+
if self.class._exporter_filename.present?
|
46
|
+
filename = instance_exec(&self.class._exporter_filename)
|
47
|
+
end
|
48
|
+
|
49
|
+
filename = "#{ resource_class.model_name.human(count: 2) }-exports-#{ SecureRandom.uuid }" if filename.blank?
|
50
|
+
|
51
|
+
stream_file filename.parameterize, 'csv' do |stream|
|
52
|
+
self.class._exporter_class.stream(ransack_object.result, stream) # full query, not just paginated
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
block.call(format) if block.present?
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def stream_file(filename, extension, &block)
|
64
|
+
response.headers["Content-Type"] = "application/octet-stream"
|
65
|
+
response.headers["Content-Disposition"] = "attachment; filename=#{filename}.#{extension}"
|
66
|
+
|
67
|
+
begin
|
68
|
+
yield response.stream
|
69
|
+
ensure
|
70
|
+
response.stream.close
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -2,6 +2,7 @@ class LotusAdmin::AuthenticatedController < LotusAdmin::ApplicationController
|
|
2
2
|
include LotusAdmin::PermittedParams
|
3
3
|
include LotusAdmin::FilterableController
|
4
4
|
include LotusAdmin::ResourcefulController
|
5
|
+
include LotusAdmin::FileStreamer
|
5
6
|
|
6
7
|
before_action :authenticate_administrator!
|
7
8
|
around_action :use_user_time_zone, if: :administrator_signed_in?
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module LotusAdmin
|
2
|
+
class Exporter
|
3
|
+
class_attribute :_columns, instance_accessor: false
|
4
|
+
class_attribute :_decorates, instance_accessor: false
|
5
|
+
class_attribute :_resource_class, instance_accessor: false
|
6
|
+
|
7
|
+
self._columns = []
|
8
|
+
self._decorates = false
|
9
|
+
|
10
|
+
# reset so that each subclass has it's own collection
|
11
|
+
def self.inherited(other)
|
12
|
+
other._columns = []
|
13
|
+
end
|
14
|
+
|
15
|
+
class Column
|
16
|
+
attr_reader :attribute_name, :title, :block
|
17
|
+
def initialize(attribute_name, title, &block)
|
18
|
+
@attribute_name = attribute_name
|
19
|
+
@title = title
|
20
|
+
@block = block || ->(model){ model.public_send(attribute_name) }
|
21
|
+
end
|
22
|
+
|
23
|
+
def data(model)
|
24
|
+
block.call(model)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class << self
|
29
|
+
def stream(*args)
|
30
|
+
new.stream(*args)
|
31
|
+
end
|
32
|
+
|
33
|
+
def generate(*args)
|
34
|
+
new.generate(*args)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def column(attribute_name, title = nil, &block)
|
40
|
+
self._columns << Column.new(attribute_name, title, &block)
|
41
|
+
end
|
42
|
+
|
43
|
+
def decorates(boolean)
|
44
|
+
self._decorates = boolean
|
45
|
+
end
|
46
|
+
|
47
|
+
def model(resource_class)
|
48
|
+
self._resource_class = resource_class
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def generate(collection)
|
53
|
+
@collection = collection
|
54
|
+
|
55
|
+
CSV.generate do |csv|
|
56
|
+
csv << headers
|
57
|
+
|
58
|
+
content.each do |row|
|
59
|
+
csv << row
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def stream(collection, stream)
|
65
|
+
stream.write CSV.generate_line(headers)
|
66
|
+
|
67
|
+
@collection = collection
|
68
|
+
|
69
|
+
content.each do |row|
|
70
|
+
stream.write CSV.generate_line(row)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def view_context
|
77
|
+
@view_context ||= begin
|
78
|
+
ActionView::Base.new(ActionController::Base.view_paths).tap do |view|
|
79
|
+
view.class_eval do
|
80
|
+
include Rails.application.routes.url_helpers
|
81
|
+
include ::ApplicationHelper if defined?(::ApplicationHelper)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def headers
|
88
|
+
self.class._columns.map do |column|
|
89
|
+
column.title.presence || self.class._resource_class.human_attribute_name(column.attribute_name)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def content
|
94
|
+
each_item.map do |record|
|
95
|
+
record = record.decorate(view_context) if decorator?
|
96
|
+
|
97
|
+
self.class._columns.map do |column|
|
98
|
+
column.data(record)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def each_item(&block)
|
104
|
+
return @collection.each.lazy unless @collection.respond_to?(:find_each)
|
105
|
+
|
106
|
+
@collection.find_each(batch_size: 500).lazy
|
107
|
+
end
|
108
|
+
|
109
|
+
def decorator?
|
110
|
+
self.class._decorates == true
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -1,7 +1,11 @@
|
|
1
1
|
.row
|
2
|
-
.col-sm-
|
2
|
+
.col-sm-5
|
3
3
|
= paginate(collection, theme: 'lotus_admin')
|
4
4
|
|
5
|
-
.col-sm-
|
5
|
+
.col-sm-2.text-center
|
6
|
+
- if exporter.present?
|
7
|
+
= link_to 'CSV', url_for(params: { q: params[:q]&.to_unsafe_h }, format: :csv)
|
8
|
+
|
9
|
+
.col-sm-5
|
6
10
|
.pagination-info
|
7
11
|
%small= page_entries_info(collection)
|
data/lib/lotus_admin/version.rb
CHANGED
data/lib/lotus_admin.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lotus_admin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Millsaps-Brewer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-03-
|
11
|
+
date: 2018-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -344,6 +344,7 @@ files:
|
|
344
344
|
- app/assets/stylesheets/lotus_admin/components/_tables.scss
|
345
345
|
- app/controllers/concerns/lotus_admin/devise_controllers.rb
|
346
346
|
- app/controllers/concerns/lotus_admin/exposure.rb
|
347
|
+
- app/controllers/concerns/lotus_admin/file_streamer.rb
|
347
348
|
- app/controllers/concerns/lotus_admin/filterable_controller.rb
|
348
349
|
- app/controllers/concerns/lotus_admin/permitted_params.rb
|
349
350
|
- app/controllers/concerns/lotus_admin/resourceful_controller.rb
|
@@ -370,6 +371,7 @@ files:
|
|
370
371
|
- app/models/lotus_admin/application_record.rb
|
371
372
|
- app/models/lotus_admin/filters/configuration.rb
|
372
373
|
- app/models/lotus_admin/user.rb
|
374
|
+
- app/services/lotus_admin/exporter.rb
|
373
375
|
- app/views/administrators/_links.html.haml
|
374
376
|
- app/views/administrators/confirmations/new.html.haml
|
375
377
|
- app/views/administrators/passwords/edit.html.haml
|