tramway-export 0.1.5 → 0.2.0.1

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: ecc59e6b00eec57ba2ef824370f701dd3cb5fe60fb963e86898f955c9c229b9d
4
- data.tar.gz: 0d104b8a1e7f833b139341d8de591e58d301119162428a5c5b377fba8e80dd08
3
+ metadata.gz: 6ceedd09b6899e510458720d4cfcd454c2cd970af2c477a30fd7bee276f12e36
4
+ data.tar.gz: 885bfb4371357484d7f6b4ce25a8b0e9c0a62310b8ba15cdeb8dbda04acf3ead
5
5
  SHA512:
6
- metadata.gz: f3372a266fc875feb286b7cbec715d3dc9af4461dbe218d055566921598411160f87f211f003be82d924e9b496f2ef5afdee67ef177bd53a0b19f5f878286f97
7
- data.tar.gz: ed404df571acff6bb5ed52f031154d6e173634fbe4ffd5881482150e7260dd2142b725936f738d7d369c747048d584969146ba3de451af5fd32e9a1b567b3875
6
+ metadata.gz: d5b762e42be643c3b72bd1f95965e0bf26882a3082ed6f6c2e627ad7cc998abf8e66bbf4892a1f0eca381dcacfd92916e45a38c4b5423b416421220b371c1f10
7
+ data.tar.gz: 68343c6e8fb3315e50ccec2310a1fcd3e54ea6f765da688585b8b60af5c2ca85abc1f9fcca7f915b5e9e7619809f6a67f8c575d2ab6b63555ebfd7914994e3d2
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,8 +55,7 @@ class YourModelXlsDecorator < Tramway::Export::Xls::ApplicationDecorator
54
55
  end
55
56
  end
56
57
  ```
57
-
58
- #### 5. You can set flexible columns for each record. Just use `flexible_columns` method in object area
58
+ **If you don't have constant list of columns, use `flexible_columns` this way**
59
59
 
60
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
61
 
@@ -64,13 +64,13 @@ Just imagine: our model contains method `values` and we want to have columns acc
64
64
  class YourModelXlsDecorator < Tramway::Export::Xls::ApplicationDecorator
65
65
  def flexible_columns
66
66
  object.values.keys.map do |key|
67
- { key.to_sym => -> { values.dig(key) } }
67
+ { key.to_sym => -> { object.values.dig(key) } }
68
68
  end
69
69
  end
70
70
  end
71
71
  ```
72
72
 
73
- #### 6. Restart your server and visit index page of models in your admin panel
73
+ #### 5. Restart your server and visit index page of models in your admin panel
74
74
 
75
75
  ### User instructions
76
76
 
@@ -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|
@@ -28,9 +28,48 @@ class Tramway::Export::ExportsController < Tramway::Admin::ApplicationController
28
28
  send_data stream.string, content_type: 'application/xls', filename: xls_decorator_class.filename
29
29
  end
30
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
+
31
56
  private
32
57
 
33
58
  def xls_decorator_class_name(model_name)
34
59
  "#{model_name}XlsDecorator".constantize
35
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
36
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,17 +7,20 @@ 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
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)
18
23
  end
19
-
20
- attr_reader :exportable_models
21
24
  end
22
25
  end
23
26
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Tramway
4
4
  module Export
5
- VERSION = '0.1.5'
5
+ VERSION = '0.2.0.1'
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.5
4
+ version: 0.2.0.1
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-08 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
@@ -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.1.2
72
+ rubygems_version: 3.1.4
73
73
  signing_key:
74
74
  specification_version: 4
75
75
  summary: Rails engine for exporting data