trenni-formatters 2.10.0 → 2.13.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 73f7c57bec0e5a3a6a532780308ca6e15569b3f26772876cdd2442c4d9e88a9b
4
- data.tar.gz: 7e56a4f516c1306d708ad88716000eff4778023e3976ad9b44bced6fa5dacbf3
3
+ metadata.gz: a733cfc023aed3ce78ce8278b8d4ef57ee05215440d5bcf0304280115b002cc5
4
+ data.tar.gz: 374dade3208878129d786ef7917085ee5f05e5df50a62eb2d969ce970be944b3
5
5
  SHA512:
6
- metadata.gz: f0a149e19f9a21e00335da046d7721c102ee30c6a0bec7382e855058fa5ae28ff51318a917c28d8eee09c4192499fa9a5908d6e7b365843176d18e7392869d91
7
- data.tar.gz: ce08752246ea4f8529a9bd1adbbd008912a0b34ac1d8927a7cb43453dc45eee612a076ad01f5c39e0dc9696180562417d6338dd634a99c45ddbe5e2fb18d803c
6
+ metadata.gz: a6663a34484d4fdc67cc9771df53959941e8c514bf03b752bb2c63680ac1e041ee7da4c95a6d8bb45430dd230093cc9b5911c1fef394dc6d179fafd4e9632121
7
+ data.tar.gz: a469d0252fdf4dd7fecd68048350e68a938bb28bbfe3347b47d2c04c39cc40fd7f5fd6dc3477c05d7eb360190f58c526d9fc900930183868ff3cadc2538486b6
@@ -81,17 +81,17 @@ module Trenni
81
81
 
82
82
  attr :options
83
83
 
84
- def format_unspecified(object, options)
84
+ def format_unspecified(object, **options)
85
85
  object.to_s
86
86
  end
87
87
 
88
- def format(object, options = {})
88
+ def format(object, **options)
89
89
  method_name = self.method_for_mapping(object)
90
90
 
91
91
  if self.respond_to?(method_name)
92
- self.send(method_name, object, options)
92
+ self.send(method_name, object, **options)
93
93
  else
94
- format_unspecified(object, options)
94
+ format_unspecified(object, **options)
95
95
  end
96
96
  end
97
97
 
@@ -101,15 +101,15 @@ module Trenni
101
101
  @options[key]
102
102
  end
103
103
 
104
- map(String) do |object, options|
104
+ map(String) do |object, **options|
105
105
  object
106
106
  end
107
107
 
108
- map(NilClass) do |object, options|
108
+ map(NilClass) do |object, **options|
109
109
  options[:blank] || @options[:blank] || ""
110
110
  end
111
111
 
112
- map(TrueClass, FalseClass, *Mapping.lookup_descendants(Numeric)) do |object, options|
112
+ map(TrueClass, FalseClass, *Mapping.lookup_descendants(Numeric)) do |object, **options|
113
113
  object.to_s
114
114
  end
115
115
  end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+ require 'trenni/builder'
24
+
25
+ module Trenni
26
+ module Formatters
27
+ module HTML
28
+ class AcceptCheckbox
29
+ def self.call(formatter, builder, **options, &block)
30
+ instance = self.new(formatter, builder, **options)
31
+
32
+ instance.call(&block)
33
+ end
34
+
35
+ def initialize(formatter, builder, **options)
36
+ @formatter = formatter
37
+ @builder = builder
38
+ @options = options
39
+ end
40
+
41
+ def name_for(**options)
42
+ @formatter.name_for(**options)
43
+ end
44
+
45
+ def checkbox_attributes_for(**options)
46
+ @formatter.checkbox_attributes_for(**options)
47
+ end
48
+
49
+ def call(&block)
50
+ Builder.fragment(@builder) do |builder|
51
+ builder.inline('span') do
52
+ builder.inline :input, type: :hidden, name: name_for(**@options), value: 'false'
53
+
54
+ builder.tag :input, checkbox_attributes_for(**@options)
55
+
56
+ builder.text " "
57
+
58
+ builder.capture(self, &block)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -116,18 +116,17 @@ module Trenni
116
116
  builder.tag :input, submit_attributes_for(**options)
117
117
  end
118
118
  end
119
-
120
- def element(klass, options = {}, &block)
119
+
120
+ def element(klass, **options, &block)
121
121
  options = @options.merge(**options)
122
- buffer = Trenni::Template.buffer(block.binding)
123
122
 
124
- buffer << Builder.fragment do |builder|
123
+ Builder.fragment(block&.binding) do |builder|
125
124
  builder.inline(:dt) do
126
125
  builder.text title_for(**options)
127
126
  end
128
127
 
129
128
  builder.tag(:dd) do
130
- klass.call(self, options, builder, &block)
129
+ klass.call(self, builder, **options, &block)
131
130
 
132
131
  if details = details_for(**options)
133
132
  builder.inline(:small, class: 'details') {builder.text details}
@@ -138,7 +137,9 @@ module Trenni
138
137
 
139
138
  def fieldset(**options, &block)
140
139
  super do |builder|
141
- builder.tag(:dl, &block)
140
+ builder.tag(:dl) do
141
+ yield(builder)
142
+ end
142
143
  end
143
144
  end
144
145
  end
@@ -69,7 +69,7 @@ module Trenni
69
69
  # The value of the field.
70
70
  def value_for(**options)
71
71
  if value = raw_value_for(**options)
72
- self.format(value, options)
72
+ self.format(value, **options)
73
73
  end
74
74
  end
75
75
 
@@ -99,8 +99,6 @@ module Trenni
99
99
  builder.inline :input, :type => :hidden, :name => name_for(**options), :value => 'false'
100
100
 
101
101
  builder.inline(:span) do
102
- builder.text title_for(**options)
103
-
104
102
  if details = details_for(**options)
105
103
  builder.inline(:small) {builder.text details}
106
104
  end
@@ -108,7 +106,7 @@ module Trenni
108
106
 
109
107
  builder.tag :input, checkbox_attributes_for(**options)
110
108
 
111
- # We would like a little bit of whitespace between the checkbox and the title.
109
+ # We would like a little bit of whitespace between the checkbox and the title:
112
110
  builder.text " " + title_for(**options)
113
111
  end
114
112
  end
@@ -124,11 +122,11 @@ module Trenni
124
122
  end
125
123
  end
126
124
 
127
- def element(klass, options = {}, &block)
125
+ def element(klass, **options, &block)
128
126
  options = @options.merge(**options)
129
127
  buffer = Trenni::Template.buffer(block.binding)
130
128
 
131
- buffer << Builder.fragment do |builder|
129
+ Builder.fragment(buffer) do |builder|
132
130
  builder.inline(:label) do
133
131
  builder.inline(:span) do
134
132
  builder.text title_for(**options)
@@ -138,7 +136,7 @@ module Trenni
138
136
  end
139
137
  end
140
138
 
141
- klass.call(self, options, builder, &block)
139
+ klass.call(self, builder, **options, &block)
142
140
  end
143
141
  end
144
142
  end
@@ -27,22 +27,18 @@ module Trenni
27
27
  module HTML
28
28
  # Standard drop-down select box:
29
29
  class OptionSelect
30
- def self.call(formatter, options, builder, &block)
31
- instance = self.new(formatter, options, builder)
30
+ def self.call(formatter, builder, **options, &block)
31
+ instance = self.new(formatter, builder, **options)
32
32
 
33
- instance.call(options, &block)
33
+ instance.call(&block)
34
34
  end
35
35
 
36
- def initialize(formatter, options, builder)
36
+ def initialize(formatter, builder, **options)
37
37
  @formatter = formatter
38
- @object = formatter.object
39
- @field = options[:field]
40
-
41
- @options = options
42
-
43
38
  @builder = builder
39
+ @options = options
44
40
  end
45
-
41
+
46
42
  def name_for(**options)
47
43
  if name = @formatter.name_for(**options)
48
44
  if options[:multiple]
@@ -52,23 +48,23 @@ module Trenni
52
48
  return name
53
49
  end
54
50
  end
55
-
51
+
56
52
  def raw_value_for(**options)
57
53
  @formatter.raw_value_for(**options)
58
54
  end
59
-
55
+
60
56
  def raw_value
61
57
  @raw_value ||= raw_value_for(**@options)
62
58
  end
63
-
59
+
64
60
  def value_for(**options)
65
61
  @formatter.value_for(**options)
66
62
  end
67
-
63
+
68
64
  def title_for(**options)
69
65
  @formatter.title_for(**options)
70
66
  end
71
-
67
+
72
68
  def option_attributes_for(**options)
73
69
  return {
74
70
  :value => value_for(**options),
@@ -78,15 +74,21 @@ module Trenni
78
74
  :data => options[:data],
79
75
  }
80
76
  end
81
-
82
- def item(builder: nil, **options)
77
+
78
+ def item(**options, &block)
83
79
  options[:field] ||= 'id'
84
80
 
85
- Builder.fragment(builder) do |builder|
86
- builder.inline(:option, option_attributes_for(**options)) {builder.text title_for(**options)}
81
+ Builder.fragment(block&.binding || @builder) do |builder|
82
+ builder.inline(:option, option_attributes_for(**options)) do
83
+ if block_given?
84
+ builder.capture(self, &block)
85
+ else
86
+ builder.text title_for(**options)
87
+ end
88
+ end
87
89
  end
88
90
  end
89
-
91
+
90
92
  def optional_title_for(**options)
91
93
  if options[:optional] == true
92
94
  options[:blank] || ''
@@ -94,7 +96,7 @@ module Trenni
94
96
  options[:optional]
95
97
  end
96
98
  end
97
-
99
+
98
100
  def group_attributes_for(**options)
99
101
  return {
100
102
  :label => title_for(**options),
@@ -103,19 +105,17 @@ module Trenni
103
105
  :data => options[:data],
104
106
  }
105
107
  end
106
-
107
- def group(options = {}, &block)
108
- Builder.fragment(@builder) do |builder|
109
- builder.tag :optgroup, group_attributes_for(**options) do
110
- if options[:optional]
111
- item(:title => optional_title_for(**options), :value => nil, :builder => builder)
112
- end
113
-
114
- builder.capture(&block)
108
+
109
+ def group(**options, &block)
110
+ @builder.tag :optgroup, group_attributes_for(**options) do
111
+ if options[:optional]
112
+ item(title: optional_title_for(**options), value: nil)
115
113
  end
114
+
115
+ @builder.capture(&block)
116
116
  end
117
117
  end
118
-
118
+
119
119
  def select_attributes_for(**options)
120
120
  return {
121
121
  :name => name_for(**options),
@@ -123,14 +123,19 @@ module Trenni
123
123
  :class => options[:class],
124
124
  :multiple => options[:multiple],
125
125
  :data => options[:data],
126
+ :required => options[:required],
126
127
  }
127
128
  end
128
-
129
- def call(options = {}, &block)
129
+
130
+ def optional?
131
+ @options[:optional]
132
+ end
133
+
134
+ def call(&block)
130
135
  Builder.fragment(@builder) do |builder|
131
- builder.tag :select, select_attributes_for(**options) do
132
- if options[:optional]
133
- item(:title => optional_title_for(**options), :value => nil, :builder => builder)
136
+ builder.tag :select, select_attributes_for(**@options) do
137
+ if self.optional?
138
+ builder << item(title: optional_title_for(**@options), value: nil)
134
139
  end
135
140
 
136
141
  builder.capture(self, &block)
@@ -27,22 +27,20 @@ module Trenni
27
27
  module HTML
28
28
  # Table based select boxes using per-row checkboxes.
29
29
  class RadioSelect
30
- def self.call(formatter, options, builder, &block)
31
- instance = self.new(formatter, options, builder)
30
+ def self.call(formatter, builder, **options, &block)
31
+ instance = self.new(formatter, builder, **options)
32
32
 
33
- instance.call(options, &block)
33
+ instance.call(&block)
34
34
  end
35
35
 
36
- def initialize(formatter, options, builder)
36
+ def initialize(formatter, builder, **options)
37
37
  @formatter = formatter
38
- @object = formatter.object
39
-
38
+ @builder = builder
40
39
  @options = options
41
- @field = options[:field]
42
40
 
43
- @builder = builder
41
+ @field = options[:field]
44
42
  end
45
-
43
+
46
44
  def name_for(**options)
47
45
  @formatter.name_for(**options)
48
46
  end
@@ -50,19 +48,19 @@ module Trenni
50
48
  def raw_value_for(**options)
51
49
  @formatter.raw_value_for(**options)
52
50
  end
53
-
51
+
54
52
  def raw_value
55
53
  @raw_value ||= raw_value_for(**@options)
56
54
  end
57
-
55
+
58
56
  def value_for(**options)
59
57
  @formatter.value_for(**options)
60
58
  end
61
-
59
+
62
60
  def title_for(**options)
63
61
  @formatter.title_for(**options)
64
62
  end
65
-
63
+
66
64
  def radio_attributes_for(**options)
67
65
  return {
68
66
  :type => :radio,
@@ -73,9 +71,9 @@ module Trenni
73
71
  :data => options[:data],
74
72
  }
75
73
  end
76
-
77
- def item(builder: nil, **options, &block)
78
- Builder.fragment(builder) do |builder|
74
+
75
+ def item(**options, &block)
76
+ Builder.fragment do |builder|
79
77
  builder.tag :tr do
80
78
  builder.inline(:td, :class => :handle) do
81
79
  builder.tag :input, radio_attributes_for(**options)
@@ -89,7 +87,7 @@ module Trenni
89
87
  end
90
88
  end
91
89
  end
92
- end >> block
90
+ end
93
91
  end
94
92
 
95
93
  def optional_title_for(**options)
@@ -99,13 +97,17 @@ module Trenni
99
97
  options[:optional]
100
98
  end
101
99
  end
102
-
103
- def call(options = {}, &block)
100
+
101
+ def optional?
102
+ @options[:optional]
103
+ end
104
+
105
+ def call(&block)
104
106
  Builder.fragment(@builder) do |builder|
105
107
  builder.tag :table do
106
108
  builder.tag :tbody do
107
- if options[:optional]
108
- item(:title => optional_title_for(**options), :value => nil, :builder => builder)
109
+ if self.optional?
110
+ builder << item(title: optional_title_for(**@options), value: nil)
109
111
  end
110
112
 
111
113
  builder.capture(self, &block)
@@ -27,7 +27,7 @@ module Trenni
27
27
  module Formatters
28
28
  module RelativeTime
29
29
  def self.included(base)
30
- base.map(Time) do |object, options|
30
+ base.map(Time) do |object, **options|
31
31
  current_time = options.fetch(:current_time) {Time.now}
32
32
 
33
33
  # Ensure we display the time in localtime, and show the year if it is different:
@@ -26,28 +26,30 @@ require 'mapping/model'
26
26
  module Trenni
27
27
  module Formatters
28
28
  module TruncatedText
29
- def truncated_text(content, options = {})
29
+ def truncated_text(content, length: 30, **options)
30
30
  if content
31
- length = options.fetch(:length, 30)
32
-
33
- content = TruncatedText.truncate_text(content, length, options)
31
+ content = TruncatedText.truncate_text(content, length, **options)
34
32
 
35
33
  return self.format(content)
36
34
  end
37
35
  end
38
36
 
39
- def self.truncate_text(text, truncate_at, options = {})
37
+ def self.truncate_text(text, truncate_at, omission: nil, separator: nil, **options)
40
38
  return text.dup unless text.length > truncate_at
41
39
 
42
- options[:omission] ||= '...'
43
- length_with_room_for_omission = truncate_at - options[:omission].length
44
- stop = if options[:separator]
45
- text.rindex(options[:separator], length_with_room_for_omission) || length_with_room_for_omission
46
- else
47
- length_with_room_for_omission
40
+ omission ||= '...'
41
+
42
+ length_with_room_for_omission = truncate_at - omission.length
43
+
44
+ stop = nil
45
+
46
+ if separator
47
+ stop = text.rindex(separator, length_with_room_for_omission)
48
48
  end
49
49
 
50
- "#{text[0...stop]}#{options[:omission]}"
50
+ stop ||= length_with_room_for_omission
51
+
52
+ "#{text[0...stop]}#{omission}"
51
53
  end
52
54
  end
53
55
  end
@@ -22,6 +22,6 @@
22
22
 
23
23
  module Trenni
24
24
  module Formatters
25
- VERSION = "2.10.0"
25
+ VERSION = "2.13.0"
26
26
  end
27
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trenni-formatters
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.10.0
4
+ version: 2.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-31 00:00:00.000000000 Z
11
+ date: 2020-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mapping
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.4'
33
+ version: '3.12'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '3.4'
40
+ version: '3.12'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -122,14 +122,15 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
- description:
126
- email:
125
+ description:
126
+ email:
127
127
  executables: []
128
128
  extensions: []
129
129
  extra_rdoc_files: []
130
130
  files:
131
131
  - lib/trenni/formatters.rb
132
132
  - lib/trenni/formatters/formatter.rb
133
+ - lib/trenni/formatters/html/accept_checkbox.rb
133
134
  - lib/trenni/formatters/html/definition_list_form.rb
134
135
  - lib/trenni/formatters/html/form_formatter.rb
135
136
  - lib/trenni/formatters/html/label_form.rb
@@ -144,7 +145,7 @@ licenses:
144
145
  - MIT
145
146
  metadata:
146
147
  funding_uri: https://github.com/sponsors/ioquatix/
147
- post_install_message:
148
+ post_install_message:
148
149
  rdoc_options: []
149
150
  require_paths:
150
151
  - lib
@@ -160,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
160
161
  version: '0'
161
162
  requirements: []
162
163
  rubygems_version: 3.1.2
163
- signing_key:
164
+ signing_key:
164
165
  specification_version: 4
165
166
  summary: Formatters for Trenni, to assist with typical views and form based interfaces.
166
167
  test_files: []