ntq_excelsior 1.0.3 → 1.2.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/Gemfile.lock +1 -1
- data/README.md +32 -6
- data/lib/ntq_excelsior/exporter.rb +24 -4
- data/lib/ntq_excelsior/multi_workbook_exporter.rb +28 -0
- data/lib/ntq_excelsior/version.rb +1 -1
- data/lib/ntq_excelsior.rb +1 -0
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf457474e835aa5716abbdf7004f795ca97d1796cf49c9528ca59b3a7b233d10
|
4
|
+
data.tar.gz: 71af4c5b26604522ee93d68013f238095d3f086091ae34c6e97e32749bec42d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e07c0aba24f0369cfdfe20635b78a61f9a2a9eded12bf116e698cda59b69345d1ef5cbf94149f4e1810ab2cbd88174beba3f43f2eff34525d8674c9899eb8239
|
7
|
+
data.tar.gz: f08ef0e18a77235445888759cb0d57c86d8885b215920960b75299978c1be91acf4602135eaa5d11e95a0cee5a72975658be1457a3b6916694154ea8c4412163
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# NtqExcelsior
|
2
2
|
|
3
|
+
[](https://codeclimate.com/github/9troisquarts/ntq-excelsior/maintainability)
|
4
|
+
|
3
5
|
Ntq excelsior simplifie l'import et l'export de vos données.
|
4
6
|
|
5
7
|
## Installation
|
@@ -32,7 +34,8 @@ class UserExporter < NtqExcelsior::Exporter
|
|
32
34
|
[
|
33
35
|
{
|
34
36
|
title: "Utilisateurs",
|
35
|
-
width: 4
|
37
|
+
width: -> (context) { context[:current_user].can?(:access_to_email, User) ? 4 : 3 }
|
38
|
+
# width: 4,
|
36
39
|
styles: [:bold]
|
37
40
|
}
|
38
41
|
],
|
@@ -46,11 +49,13 @@ class UserExporter < NtqExcelsior::Exporter
|
|
46
49
|
{
|
47
50
|
title: 'Email',
|
48
51
|
header_styles: [:blue],
|
49
|
-
resolve: 'email'
|
52
|
+
resolve: 'email',
|
53
|
+
visible: -> (record, context) { context[:current_user].can?(:access_to_email, User) }
|
50
54
|
},
|
51
55
|
{
|
52
56
|
title: 'Birthdate',
|
53
|
-
resolve: 'birthdate'
|
57
|
+
resolve: 'birthdate',
|
58
|
+
visible: true # Optional
|
54
59
|
}
|
55
60
|
{
|
56
61
|
title: 'Address (nested)',
|
@@ -71,18 +76,39 @@ class UserExporter < NtqExcelsior::Exporter
|
|
71
76
|
end
|
72
77
|
|
73
78
|
exporter = UserExporter.new(@users)
|
79
|
+
# Optional : Context can be passed to exporter
|
80
|
+
exporter.context = { current_user: current_user }
|
74
81
|
stream = exporter.export.to_stream.read
|
75
82
|
|
76
83
|
# In ruby file
|
77
|
-
File.open("export.xlsx", "w") do |
|
78
|
-
|
79
|
-
|
84
|
+
File.open("export.xlsx", "w") do |tmp|
|
85
|
+
tmp.binmode
|
86
|
+
tmp.write(stream)
|
80
87
|
end
|
81
88
|
|
82
89
|
# In Controller action
|
83
90
|
send_data stream, type: 'application/xlsx', filename: "filename.xlsx"
|
84
91
|
```
|
85
92
|
|
93
|
+
### Multiple workbooks export
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
user_exporter = UserExporter.new(@user_data)
|
97
|
+
product_exporter = ProductExporter.new(@product_data)
|
98
|
+
|
99
|
+
exporter = NtqExcelsior::MultiWorkbookExporter.new([user_exporter, product_exporter])
|
100
|
+
stream = exporter.export.to_stream.read
|
101
|
+
|
102
|
+
# In ruby file
|
103
|
+
File.open("export.xlsx", "w") do |tmp|
|
104
|
+
tmp.binmode
|
105
|
+
tmp.write(stream)
|
106
|
+
end
|
107
|
+
|
108
|
+
# In Controller action
|
109
|
+
send_data stream, type: 'application/xlsx', filename: "filename.xlsx"
|
110
|
+
```
|
111
|
+
|
86
112
|
### Import
|
87
113
|
|
88
114
|
```ruby
|
@@ -3,6 +3,7 @@ require 'caxlsx'
|
|
3
3
|
module NtqExcelsior
|
4
4
|
class Exporter
|
5
5
|
attr_accessor :data
|
6
|
+
attr_accessor :context
|
6
7
|
|
7
8
|
DEFAULT_STYLES = {
|
8
9
|
date_format: {
|
@@ -91,13 +92,28 @@ module NtqExcelsior
|
|
91
92
|
styles_hash
|
92
93
|
end
|
93
94
|
|
95
|
+
def column_is_visible?(column, record = nil)
|
96
|
+
return true if !column.key?(:visible)
|
97
|
+
return column[:visible].call(record, context) if column[:visible].is_a?(Proc)
|
98
|
+
|
99
|
+
column[:visible]
|
100
|
+
end
|
101
|
+
|
102
|
+
def column_width(column)
|
103
|
+
return column[:width].call(context) if column[:width] && column[:width].is_a?(Proc)
|
104
|
+
|
105
|
+
column[:width] || 1
|
106
|
+
end
|
107
|
+
|
94
108
|
def resolve_header_row(headers, index)
|
95
109
|
row = { values: [], styles: [], merge_cells: [], height: nil }
|
96
110
|
return row unless headers
|
97
|
-
|
111
|
+
|
98
112
|
col_index = 1
|
99
113
|
headers.each do |header|
|
100
|
-
|
114
|
+
next unless column_is_visible?(header)
|
115
|
+
|
116
|
+
width = column_width(header)
|
101
117
|
row[:values] << header[:title] || ''
|
102
118
|
row[:styles] << get_styles(header[:header_styles] || header[:styles])
|
103
119
|
if width > 1
|
@@ -116,6 +132,8 @@ module NtqExcelsior
|
|
116
132
|
v = value
|
117
133
|
return v unless accessors && accessors.length > 0
|
118
134
|
|
135
|
+
return v.dig(*accessors) if v.is_a?(Hash)
|
136
|
+
|
119
137
|
v = v.send(accessors[0])
|
120
138
|
return v if accessors.length == 1
|
121
139
|
return dig_value(v, accessors.slice(1..-1))
|
@@ -151,7 +169,9 @@ module NtqExcelsior
|
|
151
169
|
row = { values: [], styles: [], merge_cells: [], height: nil, types: [] }
|
152
170
|
col_index = 1
|
153
171
|
schema.each do |column|
|
154
|
-
|
172
|
+
next unless column_is_visible?(column, record)
|
173
|
+
|
174
|
+
width = column_width(column)
|
155
175
|
formatted_value = format_value(column[:resolve], record)
|
156
176
|
row[:values] << formatted_value[:value]
|
157
177
|
row[:types] << (column[:type] || formatted_value[:type])
|
@@ -211,7 +231,7 @@ module NtqExcelsior
|
|
211
231
|
end
|
212
232
|
end
|
213
233
|
|
214
|
-
sheet.column_widths *content[:col_widths] if content[:col_widths].present?
|
234
|
+
sheet.column_widths * content[:col_widths] if content[:col_widths].present?
|
215
235
|
end
|
216
236
|
|
217
237
|
sheet
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'caxlsx'
|
2
|
+
|
3
|
+
module NtqExcelsior
|
4
|
+
class MultiWorkbookExporter
|
5
|
+
|
6
|
+
attr_accessor :exporters
|
7
|
+
|
8
|
+
def initialize(exporters = [])
|
9
|
+
@exporters = exporters
|
10
|
+
end
|
11
|
+
|
12
|
+
def export
|
13
|
+
exports = exporters
|
14
|
+
exports = [exporters] if exporters && !exporters.is_a?(Array)
|
15
|
+
|
16
|
+
package = Axlsx::Package.new
|
17
|
+
wb = package.workbook
|
18
|
+
wb_styles = wb.styles
|
19
|
+
|
20
|
+
exports.each do |exporter|
|
21
|
+
exporter.generate_workbook(wb, wb_styles)
|
22
|
+
end
|
23
|
+
|
24
|
+
package
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
data/lib/ntq_excelsior.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ntq_excelsior
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: caxlsx
|
@@ -58,6 +58,7 @@ files:
|
|
58
58
|
- lib/ntq_excelsior.rb
|
59
59
|
- lib/ntq_excelsior/exporter.rb
|
60
60
|
- lib/ntq_excelsior/importer.rb
|
61
|
+
- lib/ntq_excelsior/multi_workbook_exporter.rb
|
61
62
|
- lib/ntq_excelsior/version.rb
|
62
63
|
- sig/ntq_excelsior.rbs
|
63
64
|
homepage: https://github.com/9troisquarts/ntq-excelsior
|
@@ -67,7 +68,7 @@ metadata:
|
|
67
68
|
homepage_uri: https://github.com/9troisquarts/ntq-excelsior
|
68
69
|
source_code_uri: https://github.com/9troisquarts/ntq-excelsior
|
69
70
|
changelog_uri: https://github.com/9troisquarts/ntq-excelsior/CHANGELOG.md
|
70
|
-
post_install_message:
|
71
|
+
post_install_message:
|
71
72
|
rdoc_options: []
|
72
73
|
require_paths:
|
73
74
|
- lib
|
@@ -83,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
84
|
version: '0'
|
84
85
|
requirements: []
|
85
86
|
rubygems_version: 3.3.7
|
86
|
-
signing_key:
|
87
|
+
signing_key:
|
87
88
|
specification_version: 4
|
88
89
|
summary: Library use by 9tq for import/export
|
89
90
|
test_files: []
|