tramway-export 0.1.5 → 0.2.0.1

Sign up to get free protection for your applications and to get access to all the features.
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