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