agilibox 1.5.13 → 1.6.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/CHANGELOG.md +11 -0
- data/app/assets/stylesheets/agilibox/filters.sass +1 -0
- data/app/helpers/agilibox/bootstrap_helper.rb +58 -0
- data/app/helpers/agilibox/text_helper.rb +5 -4
- data/app/models/concerns/agilibox/tap_methods.rb +23 -0
- data/app/serializers/agilibox/serializers/axlsx.rb +21 -0
- data/app/serializers/agilibox/serializers/base.rb +6 -0
- data/app/serializers/agilibox/serializers/xlsx.rb +3 -14
- data/app/views/agilibox/_flash.html.slim +2 -1
- data/lib/agilibox/version.rb +1 -1
- metadata +4 -3
- data/app/libs/agilibox/get_http.rb +0 -55
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 21f228e7863e5274343cddda10e487d18fe613c5dc6bc520e2db03f0475cf7fa
|
|
4
|
+
data.tar.gz: b981d9c578d42bca6253c38bbb31690c3f0b417d1f43cbd23ed3a5ffac2e2bbd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cf9b9f217b374801aa1cff551b27dbe0454c82acd8608437918f9b3b301541bcddc40b8bc4d5d4353ba1d833a82ea3eca561c0a3111919836aafcc49e0144aef
|
|
7
|
+
data.tar.gz: 3559c5cc114505be9fac3391222f29bdde5fbe2c4f75fe385b80fc6c8713332dff084a60e73a0a45596c9d8b67e4fbf8ab532a6d341ac5a6a22f029dba9a717d
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
## Next version
|
|
4
4
|
|
|
5
|
+
## 1.6.0
|
|
6
|
+
- Remove `GetHTTP`
|
|
7
|
+
- I18n fixes
|
|
8
|
+
- Add `Agilibox::TapMethods`
|
|
9
|
+
- Filters CSS : add flex-wrap
|
|
10
|
+
- Add `bs_card` helper
|
|
11
|
+
- Add `:br` separator to `info` helper
|
|
12
|
+
- TextHelper refactors
|
|
13
|
+
- Update dummy app to Rails 5.2
|
|
14
|
+
- Replace AXLSX by SpreadsheetArchitect
|
|
15
|
+
|
|
5
16
|
## 1.5.13
|
|
6
17
|
- Fix `info` helper with nested blank value
|
|
7
18
|
|
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
module Agilibox::BootstrapHelper
|
|
2
|
+
class << self
|
|
3
|
+
attr_writer :card_classes
|
|
4
|
+
|
|
5
|
+
# rubocop:disable Rails/HelperInstanceVariable
|
|
6
|
+
def card_classes
|
|
7
|
+
@card_classes ||= {
|
|
8
|
+
:card => "card",
|
|
9
|
+
:header => "card-header",
|
|
10
|
+
:body => "card-body",
|
|
11
|
+
:footer => "card-footer",
|
|
12
|
+
}
|
|
13
|
+
end
|
|
14
|
+
# rubocop:enable Rails/HelperInstanceVariable
|
|
15
|
+
end
|
|
16
|
+
|
|
2
17
|
def bs_progress_bar(percentage)
|
|
3
18
|
content_tag(:div, class: "progress") do
|
|
4
19
|
content_tag(:div, class: "progress-bar", style: "width:#{percentage}%") do
|
|
@@ -6,4 +21,47 @@ module Agilibox::BootstrapHelper
|
|
|
6
21
|
end
|
|
7
22
|
end
|
|
8
23
|
end
|
|
24
|
+
|
|
25
|
+
def bs_card( # rubocop:disable Metrics/ParameterLists
|
|
26
|
+
header: nil,
|
|
27
|
+
body: true,
|
|
28
|
+
footer: nil,
|
|
29
|
+
card_tag: :div,
|
|
30
|
+
header_tag: :div,
|
|
31
|
+
body_tag: :div,
|
|
32
|
+
footer_tag: :div,
|
|
33
|
+
card_class: nil,
|
|
34
|
+
header_class: nil,
|
|
35
|
+
body_class: nil,
|
|
36
|
+
footer_class: nil,
|
|
37
|
+
&block
|
|
38
|
+
)
|
|
39
|
+
global_classes = Agilibox::BootstrapHelper.card_classes
|
|
40
|
+
card_classes = ([global_classes[:card]] + card_class.to_s.split(" ")).compact.sort
|
|
41
|
+
header_classes = ([global_classes[:header]] + header_class.to_s.split(" ")).compact.sort
|
|
42
|
+
body_classes = ([global_classes[:body]] + body_class.to_s.split(" ")).compact.sort
|
|
43
|
+
footer_classes = ([global_classes[:footer]] + footer_class.to_s.split(" ")).compact.sort
|
|
44
|
+
|
|
45
|
+
if header
|
|
46
|
+
header_html = content_tag(header_tag, class: header_classes) { header }
|
|
47
|
+
else
|
|
48
|
+
header_html = "".html_safe
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
if body
|
|
52
|
+
body_html = content_tag(body_tag, class: body_classes) { capture(&block) }
|
|
53
|
+
else
|
|
54
|
+
body_html = capture(&block)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
if footer
|
|
58
|
+
footer_html = content_tag(footer_tag, class: footer_classes) { footer }
|
|
59
|
+
else
|
|
60
|
+
footer_html = "".html_safe
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
content_tag(card_tag, class: card_classes) do
|
|
64
|
+
header_html + body_html + footer_html
|
|
65
|
+
end
|
|
66
|
+
end
|
|
9
67
|
end
|
|
@@ -5,7 +5,7 @@ module Agilibox::TextHelper
|
|
|
5
5
|
|
|
6
6
|
def nbsp(text = :no_argument)
|
|
7
7
|
if text == :no_argument
|
|
8
|
-
"
|
|
8
|
+
"\u00A0"
|
|
9
9
|
else
|
|
10
10
|
text.to_s.gsub(" ", nbsp)
|
|
11
11
|
end
|
|
@@ -21,13 +21,13 @@ module Agilibox::TextHelper
|
|
|
21
21
|
I18n.t("number.currency.format.format")
|
|
22
22
|
.gsub("%n", number(n))
|
|
23
23
|
.gsub("%u", u)
|
|
24
|
-
.tr(" ",
|
|
24
|
+
.tr(" ", nbsp)
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def percentage(n)
|
|
28
28
|
return if n.nil?
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
number(n) + nbsp + "%"
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def number(n)
|
|
@@ -44,7 +44,7 @@ module Agilibox::TextHelper
|
|
|
44
44
|
opts[:delimiter] = I18n.t("number.format.delimiter")
|
|
45
45
|
opts[:separator] = I18n.t("number.format.separator")
|
|
46
46
|
|
|
47
|
-
number_with_precision(n, opts).tr(" ",
|
|
47
|
+
number_with_precision(n, opts).tr(" ", nbsp)
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
def date(d, *args)
|
|
@@ -101,6 +101,7 @@ module Agilibox::TextHelper
|
|
|
101
101
|
label = options[:label] || object.t(attribute)
|
|
102
102
|
tag = options[:tag] || :div
|
|
103
103
|
separator = options[:separator] || " : "
|
|
104
|
+
separator = " :<br/>".html_safe if separator == :br
|
|
104
105
|
helper = options[:helper]
|
|
105
106
|
i18n_key = "#{object.class.to_s.tableize.singularize}/#{attribute}"
|
|
106
107
|
nested = I18n.t("activerecord.attributes.#{i18n_key}", default: "").is_a?(Hash)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Agilibox::TapMethods
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
def tap_save!(options = {})
|
|
5
|
+
save!(options)
|
|
6
|
+
self
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def tap_update!(attributes)
|
|
10
|
+
update!(attributes)
|
|
11
|
+
self
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def tap_validate(context = nil)
|
|
15
|
+
validate(context)
|
|
16
|
+
self
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def tap_validate!(context = nil)
|
|
20
|
+
validate!(context)
|
|
21
|
+
self
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
class Agilibox::Serializers::AXLSX < Agilibox::Serializers::Base
|
|
2
|
+
def render_inline
|
|
3
|
+
xlsx.to_stream.read.force_encoding("BINARY")
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def render_file(file_path)
|
|
7
|
+
xlsx.serialize(file_path)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def xlsx
|
|
11
|
+
@xlsx ||= Axlsx::Package.new do |p|
|
|
12
|
+
p.workbook.add_worksheet do |sheet|
|
|
13
|
+
formatted_data.each do |line|
|
|
14
|
+
sheet.add_row(line)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
p.use_shared_strings = true
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -1,22 +1,11 @@
|
|
|
1
1
|
class Agilibox::Serializers::XLSX < Agilibox::Serializers::Base
|
|
2
2
|
def render_inline
|
|
3
|
-
|
|
3
|
+
SpreadsheetArchitect.to_xlsx(data: formatted_data)
|
|
4
4
|
end
|
|
5
5
|
|
|
6
6
|
def render_file(file_path)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def xlsx
|
|
11
|
-
@xlsx ||= Axlsx::Package.new do |p|
|
|
12
|
-
p.workbook.add_worksheet do |sheet|
|
|
13
|
-
data.each do |line|
|
|
14
|
-
values = line.map { |value| self.class.format(value) }
|
|
15
|
-
sheet.add_row(values)
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
p.use_shared_strings = true
|
|
7
|
+
File.open(file_path, "w+b") do |f|
|
|
8
|
+
f.write(render_inline)
|
|
20
9
|
end
|
|
21
10
|
end
|
|
22
11
|
end
|
data/lib/agilibox/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: agilibox
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- agilidée
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-
|
|
11
|
+
date: 2019-08-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails-i18n
|
|
@@ -115,7 +115,6 @@ files:
|
|
|
115
115
|
- app/libs/agilibox/collection_update.rb
|
|
116
116
|
- app/libs/agilibox/fcm/notifier.rb
|
|
117
117
|
- app/libs/agilibox/fcm/request.rb
|
|
118
|
-
- app/libs/agilibox/get_http.rb
|
|
119
118
|
- app/libs/agilibox/initialize_with.rb
|
|
120
119
|
- app/libs/agilibox/mini_model_serializer/serialize.rb
|
|
121
120
|
- app/libs/agilibox/mini_model_serializer/serializer.rb
|
|
@@ -133,8 +132,10 @@ files:
|
|
|
133
132
|
- app/models/concerns/agilibox/pluck_to_hash.rb
|
|
134
133
|
- app/models/concerns/agilibox/polymorphic_id.rb
|
|
135
134
|
- app/models/concerns/agilibox/search.rb
|
|
135
|
+
- app/models/concerns/agilibox/tap_methods.rb
|
|
136
136
|
- app/models/concerns/agilibox/timestamp_helpers.rb
|
|
137
137
|
- app/serializers/agilibox/serializers.rb
|
|
138
|
+
- app/serializers/agilibox/serializers/axlsx.rb
|
|
138
139
|
- app/serializers/agilibox/serializers/base.rb
|
|
139
140
|
- app/serializers/agilibox/serializers/xlsx.rb
|
|
140
141
|
- app/services/agilibox/service.rb
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
class Agilibox::GetHTTP < Agilibox::Service
|
|
2
|
-
class Error < StandardError
|
|
3
|
-
end
|
|
4
|
-
|
|
5
|
-
EXCEPTIONS_TO_RERAISE = [
|
|
6
|
-
IOError,
|
|
7
|
-
Net::HTTPBadResponse,
|
|
8
|
-
Net::HTTPExceptions,
|
|
9
|
-
Net::HTTPHeaderSyntaxError,
|
|
10
|
-
OpenSSL::SSL::SSLError,
|
|
11
|
-
SocketError,
|
|
12
|
-
SystemCallError,
|
|
13
|
-
Timeout::Error,
|
|
14
|
-
Zlib::Error,
|
|
15
|
-
]
|
|
16
|
-
|
|
17
|
-
TIMEOUT = 10
|
|
18
|
-
|
|
19
|
-
initialize_with :url
|
|
20
|
-
|
|
21
|
-
def uri
|
|
22
|
-
uri = URI(url.to_s)
|
|
23
|
-
raise Error, "invalid URI type : #{uri.class}" unless uri.is_a?(URI::HTTP)
|
|
24
|
-
uri
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def response
|
|
28
|
-
@response ||= fetch_response
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def call
|
|
32
|
-
response.body
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
private
|
|
36
|
-
|
|
37
|
-
def fetch_response
|
|
38
|
-
http_response = Timeout.timeout(TIMEOUT) do
|
|
39
|
-
Net::HTTP.get_response(uri)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
if http_response.code.start_with?("3")
|
|
43
|
-
@url = http_response["Location"]
|
|
44
|
-
return fetch_response
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
unless http_response.code.start_with?("2")
|
|
48
|
-
raise Error, "invalid response code : #{http_response.code}"
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
http_response
|
|
52
|
-
rescue *EXCEPTIONS_TO_RERAISE => e
|
|
53
|
-
raise Error, e.message
|
|
54
|
-
end
|
|
55
|
-
end
|