tramway-export 0.1.4 → 0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: af9b78d49eec7bcdbcf6b11f6c173748d889c209dee386ec33f318b643436fa8
4
- data.tar.gz: 3c1546aed1ee45a57546ecc5f32a2161c306fdf580227ade54425f3afd895957
3
+ metadata.gz: 8629ca9795a930ddd76a2838536e4dca3d116a21fded0978ad8278b366e0d9d3
4
+ data.tar.gz: 178e67ebb1b2cce89b9ab863190151dedb5e93aa8924c019c0e0fc1042d96a81
5
5
  SHA512:
6
- metadata.gz: 633a6472e18d8142213e8c4cbe64dc8959a05cf8ac1ef38ac2853df4d200cc651f33feaf24b3625e3ba9dfdbda7a114840ed67697ad9f4a769caf030192ee46b
7
- data.tar.gz: 9cc083bf8bf268bb4512b4ea103624ca52b55eb2321fa329b3ef2bf358ae9e46da63ecf6e742179744a495c6be4606e458caa98f8dbfa4ed339c057f08892a9c
6
+ metadata.gz: b6501955c42631a2607883c0a6ddd44443646ce35f090d4dface449d496906bf045ef7fdae7bd227b81c95230cea6c4e0088c3a1906c0bfdc16a1adac1e7d033
7
+ data.tar.gz: b8ec8841c5c3a493a54509030ed17c9b063c7922f58c4aad2900de771a82a26bcf1ebee6ace7acd39fd42aab55114e6f710d5c7215f61a44e211f4ac2ead63c2
data/README.md CHANGED
@@ -26,6 +26,7 @@ Tramway::Export.set_exportable_models YourModel, project: :your_project_name
26
26
 
27
27
  #### 4. Create decorator that describes, how your model should be exported. You need to create exactly decorator name `app/decorators/#{your_model_name}_xls_decorator.rb`
28
28
 
29
+ **If you have constant list of columns just use `columns` method this way**
29
30
 
30
31
  *app/decorators/your_model_xls_decorator.rb*
31
32
 
@@ -54,6 +55,20 @@ class YourModelXlsDecorator < Tramway::Export::Xls::ApplicationDecorator
54
55
  end
55
56
  end
56
57
  ```
58
+ **If you don't have constant list of columns, use `flexible_columns` this way**
59
+
60
+ Just imagine: our model contains method `values` and we want to have columns according to `values` keys. You shouldn't create methods for every column. Just use `Proc`. It's provided by gem `xls_exporter`. You can read more about [here](https://github.com/kalashnikovisme/xls-exporter).
61
+
62
+ *app/decorators/your_model_xls_decorator.rb*
63
+ ```ruby
64
+ class YourModelXlsDecorator < Tramway::Export::Xls::ApplicationDecorator
65
+ def flexible_columns
66
+ object.values.keys.map do |key|
67
+ { key.to_sym => -> { object.values.dig(key) } }
68
+ end
69
+ end
70
+ end
71
+ ```
57
72
 
58
73
  #### 5. Restart your server and visit index page of models in your admin panel
59
74
 
@@ -3,13 +3,13 @@
3
3
  require 'xls_exporter'
4
4
 
5
5
  class Tramway::Export::ExportsController < Tramway::Admin::ApplicationController
6
- def show
6
+ def index
7
7
  scope = params[:scope].present? ? params[:scope] : :all
8
8
  model_class = model_class_name(params[:model])
9
9
  xls_decorator_class = xls_decorator_class_name(params[:model])
10
10
  records = model_class.active.order(id: :desc).send scope
11
11
  records = records.ransack(params[:filter]).result if params[:filter].present?
12
- records = records.send "#{current_user.role}_scope", current_user.id
12
+ records = records.send "#{current_admin.role}_scope", current_admin.id
13
13
  records = xls_decorator_class.decorate records
14
14
 
15
15
  columns = xls_decorator_class.columns + records.map(&:flexible_columns).flatten.uniq do |hash|
@@ -17,6 +17,8 @@ class Tramway::Export::ExportsController < Tramway::Admin::ApplicationController
17
17
  end
18
18
 
19
19
  book = ::XlsExporter.export do
20
+ default_style horizontal_align: :center, vertical_align: :center, text_wrap: true
21
+
20
22
  add_sheet 'List'
21
23
 
22
24
  export_models records, *columns
@@ -26,9 +28,48 @@ class Tramway::Export::ExportsController < Tramway::Admin::ApplicationController
26
28
  send_data stream.string, content_type: 'application/xls', filename: xls_decorator_class.filename
27
29
  end
28
30
 
31
+ def show
32
+ head(:unprocessable_entity) && return unless available?
33
+
34
+ model_class = model_class_name(params[:model])
35
+ xls_collection_decorator_class = xls_collection_decorator_class_name(params[:model], params[:collection])
36
+ records = model_class.find(params[:id]).send(params[:collection]).active.order(id: :desc)
37
+ records = records.send "#{current_admin.role}_scope", current_admin.id
38
+ records = xls_collection_decorator_class.decorate records
39
+
40
+ columns = xls_collection_decorator_class.columns + records.map(&:flexible_columns).flatten.uniq do |hash|
41
+ hash&.keys&.first
42
+ end
43
+
44
+ book = ::XlsExporter.export do
45
+ default_style horizontal_align: :center, vertical_align: :center, text_wrap: true
46
+
47
+ add_sheet xls_collection_decorator_class.sheet_name
48
+
49
+ export_models records, *columns
50
+ end
51
+ stream = StringIO.new
52
+ book.write stream
53
+ send_data stream.string, content_type: 'application/xls', filename: xls_collection_decorator_class.filename
54
+ end
55
+
29
56
  private
30
57
 
31
58
  def xls_decorator_class_name(model_name)
32
59
  "#{model_name}XlsDecorator".constantize
33
60
  end
61
+
62
+ def xls_collection_decorator_class_name(model_name, collection)
63
+ "#{model_name}::#{collection.camelize}XlsDecorator".constantize
64
+ end
65
+
66
+ def available?
67
+ if params[:collection].present?
68
+ ::Tramway::Export.exportable_model?(params[:model], project: @application.name) && Tramway::Export.exportable_models(project: @application.name)&.map do |config|
69
+ config.is_a?(Hash) && config.values.first.map(&:to_s).include?(params[:collection])
70
+ end&.include?(true)
71
+ else
72
+ ::Tramway::Export.exportable_model?(params[:model], project: @application.name)
73
+ end
74
+ end
34
75
  end
@@ -6,6 +6,8 @@ class Tramway::Export::ApplicationDecorator
6
6
  end
7
7
 
8
8
  class << self
9
+ include Tramway::Core::Delegating::ClassHelper
10
+
9
11
  def columns
10
12
  []
11
13
  end
@@ -4,6 +4,9 @@ module Tramway
4
4
  module Export
5
5
  module Xls
6
6
  class ApplicationDecorator < Tramway::Export::ApplicationDecorator
7
+ def flexible_columns
8
+ []
9
+ end
7
10
  end
8
11
  end
9
12
  end
@@ -6,4 +6,4 @@
6
6
  = fa_icon(:download)
7
7
  .dropdown-menu{ aria: { labelledby: id } }
8
8
  - decorator_class.collections.each do |collection|
9
- = link_to collection_human_name(model_name: model_name, collection_name: collection), Tramway::Export::Engine.routes.url_helpers.exports_path(model: model_class, scope: collection, filter: params[:filter]&.permit!), class: 'dropdown-item'
9
+ = link_to collection_human_name(model_name: model_name, collection_name: collection), Tramway::Export::Engine.routes.url_helpers.exports_path(model: model_class, scope: collection, filter: params[:filter].present? ? params[:filter].permit! : nil), class: 'dropdown-item'
data/config/routes.rb CHANGED
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Tramway::Export::Engine.routes.draw do
4
- resources :exports, only: [] do
5
- collection do
6
- get :show
7
- end
8
- end
4
+ resources :exports, only: [ :show, :index ]
9
5
  end
@@ -7,18 +7,19 @@ module Tramway
7
7
  class << self
8
8
  def set_exportable_models(*models, project:)
9
9
  @exportable_models ||= {}
10
- @exportable_models[project] ||= []
11
- @exportable_models[project] += models
10
+ @exportable_models[project.to_sym] ||= []
11
+ @exportable_models[project.to_sym] += models
12
+ end
13
+
14
+ def exportable_models(project:)
15
+ @exportable_models[project.to_sym]
12
16
  end
13
17
 
14
18
  def exportable_model?(model_class, project:)
15
19
  return false unless project.present?
16
20
 
17
- @exportable_models[project.to_sym]&.include? model_class
18
- end
19
-
20
- def exportable_models
21
- @exportable_models
21
+ @exportable_models[project.to_sym]&.include?(model_class) ||
22
+ @exportable_models[project.to_sym].map { |config| config.is_a?(Hash) && config.keys.first.to_s == model_class.to_s }.include?(true)
22
23
  end
23
24
  end
24
25
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Tramway
4
4
  module Export
5
- VERSION = '0.1.4'
5
+ VERSION = '0.2'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tramway-export
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: '0.2'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Kalashnikov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-03 00:00:00.000000000 Z
11
+ date: 2021-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: xls_exporter
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '1.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '1.2'
27
27
  description: Rails engine for exporting data
28
28
  email:
29
29
  - kalashnikovisme@gmail.com
@@ -69,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
69
  - !ruby/object:Gem::Version
70
70
  version: '0'
71
71
  requirements: []
72
- rubygems_version: 3.0.3
72
+ rubygems_version: 3.1.4
73
73
  signing_key:
74
74
  specification_version: 4
75
75
  summary: Rails engine for exporting data