phlexi-table 0.0.1 → 0.0.2
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/lib/phlexi/table/base.rb +343 -74
- data/lib/phlexi/table/components/actions_column.rb +49 -0
- data/lib/phlexi/table/components/base.rb +23 -18
- data/lib/phlexi/table/components/column.rb +24 -0
- data/lib/phlexi/table/components/column_group.rb +23 -0
- data/lib/phlexi/table/components/concerns/displays_data.rb +66 -0
- data/lib/phlexi/table/components/concerns/displays_header.rb +114 -0
- data/lib/phlexi/table/components/concerns/groups_columns.rb +36 -0
- data/lib/phlexi/table/components/options/alignment.rb +31 -0
- data/lib/phlexi/table/components/options/associations.rb +23 -0
- data/lib/phlexi/table/components/options/attachments.rb +23 -0
- data/lib/phlexi/table/components/options/labels.rb +30 -0
- data/lib/phlexi/table/components/options/types.rb +140 -0
- data/lib/phlexi/table/html.rb +13 -0
- data/lib/phlexi/table/table_options/captions.rb +22 -0
- data/lib/phlexi/table/{field_options/description.rb → table_options/descriptions.rb} +5 -5
- data/lib/phlexi/table/theme.rb +29 -0
- data/lib/phlexi/table/version.rb +1 -1
- data/lib/phlexi/table/wrapped_object.rb +20 -0
- data/lib/phlexi/table.rb +3 -5
- metadata +32 -25
- data/lib/phlexi/table/components/concerns/displays_value.rb +0 -54
- data/lib/phlexi/table/components/date_time.rb +0 -49
- data/lib/phlexi/table/components/description.rb +0 -21
- data/lib/phlexi/table/components/hint.rb +0 -21
- data/lib/phlexi/table/components/label.rb +0 -15
- data/lib/phlexi/table/components/number.rb +0 -37
- data/lib/phlexi/table/components/placeholder.rb +0 -15
- data/lib/phlexi/table/components/string.rb +0 -17
- data/lib/phlexi/table/components/wrapper.rb +0 -17
- data/lib/phlexi/table/field_options/associations.rb +0 -21
- data/lib/phlexi/table/field_options/attachments.rb +0 -21
- data/lib/phlexi/table/field_options/hints.rb +0 -22
- data/lib/phlexi/table/field_options/inferred_types.rb +0 -129
- data/lib/phlexi/table/field_options/labels.rb +0 -28
- data/lib/phlexi/table/field_options/placeholders.rb +0 -18
- data/lib/phlexi/table/field_options/themes.rb +0 -132
- data/lib/phlexi/table/structure/dom.rb +0 -42
- data/lib/phlexi/table/structure/field_builder.rb +0 -158
- data/lib/phlexi/table/structure/field_collection.rb +0 -39
- data/lib/phlexi/table/structure/namespace.rb +0 -123
- data/lib/phlexi/table/structure/namespace_collection.rb +0 -40
- data/lib/phlexi/table/structure/node.rb +0 -24
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phlexi-table
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Froelich
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-08
|
11
|
+
date: 2024-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: phlex
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: phlexi-field
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rake
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -185,31 +199,24 @@ files:
|
|
185
199
|
- lib/phlexi-table.rb
|
186
200
|
- lib/phlexi/table.rb
|
187
201
|
- lib/phlexi/table/base.rb
|
202
|
+
- lib/phlexi/table/components/actions_column.rb
|
188
203
|
- lib/phlexi/table/components/base.rb
|
189
|
-
- lib/phlexi/table/components/
|
190
|
-
- lib/phlexi/table/components/
|
191
|
-
- lib/phlexi/table/components/
|
192
|
-
- lib/phlexi/table/components/
|
193
|
-
- lib/phlexi/table/components/
|
194
|
-
- lib/phlexi/table/components/
|
195
|
-
- lib/phlexi/table/components/
|
196
|
-
- lib/phlexi/table/components/
|
197
|
-
- lib/phlexi/table/components/
|
198
|
-
- lib/phlexi/table/
|
199
|
-
- lib/phlexi/table/
|
200
|
-
- lib/phlexi/table/
|
201
|
-
- lib/phlexi/table/
|
202
|
-
- lib/phlexi/table/
|
203
|
-
- lib/phlexi/table/field_options/labels.rb
|
204
|
-
- lib/phlexi/table/field_options/placeholders.rb
|
205
|
-
- lib/phlexi/table/field_options/themes.rb
|
206
|
-
- lib/phlexi/table/structure/dom.rb
|
207
|
-
- lib/phlexi/table/structure/field_builder.rb
|
208
|
-
- lib/phlexi/table/structure/field_collection.rb
|
209
|
-
- lib/phlexi/table/structure/namespace.rb
|
210
|
-
- lib/phlexi/table/structure/namespace_collection.rb
|
211
|
-
- lib/phlexi/table/structure/node.rb
|
204
|
+
- lib/phlexi/table/components/column.rb
|
205
|
+
- lib/phlexi/table/components/column_group.rb
|
206
|
+
- lib/phlexi/table/components/concerns/displays_data.rb
|
207
|
+
- lib/phlexi/table/components/concerns/displays_header.rb
|
208
|
+
- lib/phlexi/table/components/concerns/groups_columns.rb
|
209
|
+
- lib/phlexi/table/components/options/alignment.rb
|
210
|
+
- lib/phlexi/table/components/options/associations.rb
|
211
|
+
- lib/phlexi/table/components/options/attachments.rb
|
212
|
+
- lib/phlexi/table/components/options/labels.rb
|
213
|
+
- lib/phlexi/table/components/options/types.rb
|
214
|
+
- lib/phlexi/table/html.rb
|
215
|
+
- lib/phlexi/table/table_options/captions.rb
|
216
|
+
- lib/phlexi/table/table_options/descriptions.rb
|
217
|
+
- lib/phlexi/table/theme.rb
|
212
218
|
- lib/phlexi/table/version.rb
|
219
|
+
- lib/phlexi/table/wrapped_object.rb
|
213
220
|
- sig/phlexi/table.rbs
|
214
221
|
homepage: https://github.com/radioactive-labs/phlexi-table
|
215
222
|
licenses:
|
@@ -1,54 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlexi
|
4
|
-
module Table
|
5
|
-
module Components
|
6
|
-
module Concerns
|
7
|
-
module TablesValue
|
8
|
-
def view_template
|
9
|
-
value = normalize_value(field.value)
|
10
|
-
if value.blank?
|
11
|
-
render field.placeholder_tag(**@placeholder_attributes)
|
12
|
-
else
|
13
|
-
render_value(value)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
# Renders the field value for display.
|
18
|
-
#
|
19
|
-
# @return [String] the formatted field value for display.
|
20
|
-
def render_value(value)
|
21
|
-
raise NotImplementedError, "#{self.class}#render_value"
|
22
|
-
# format_value()
|
23
|
-
end
|
24
|
-
|
25
|
-
protected
|
26
|
-
|
27
|
-
def build_attributes
|
28
|
-
super
|
29
|
-
|
30
|
-
@placeholder_attributes = attributes.delete(:placeholder_attributes) || {}
|
31
|
-
attributes[:id] = field.dom.id if attributes[:id] == "#{field.dom.id}_#{component_name}"
|
32
|
-
end
|
33
|
-
|
34
|
-
# def format_value(value)
|
35
|
-
# case value
|
36
|
-
# when Array
|
37
|
-
# format_array_value(value)
|
38
|
-
# else
|
39
|
-
# format_single_value(value)
|
40
|
-
# end
|
41
|
-
# end
|
42
|
-
|
43
|
-
# def format_array_value(array)
|
44
|
-
# array.map { |item| format_single_value(item) }.join(", ")
|
45
|
-
# end
|
46
|
-
|
47
|
-
def normalize_value(value)
|
48
|
-
value.to_s
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlexi
|
4
|
-
module Table
|
5
|
-
module Components
|
6
|
-
class DateTime < Base
|
7
|
-
include Concerns::TablesValue
|
8
|
-
|
9
|
-
# Renders the date time value
|
10
|
-
#
|
11
|
-
# @param value [String, Date, Time, DateTime] The value to be rendered
|
12
|
-
# @return [void]
|
13
|
-
def render_value(value)
|
14
|
-
formatted_value = format_date_time(value)
|
15
|
-
p(**attributes) { formatted_value }
|
16
|
-
end
|
17
|
-
|
18
|
-
protected
|
19
|
-
|
20
|
-
def build_attributes
|
21
|
-
super
|
22
|
-
|
23
|
-
@options = {
|
24
|
-
format: default_format
|
25
|
-
}.merge(attributes.delete(:options) || {}).compact
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def format_date_time(value)
|
31
|
-
I18n.l(value, **@options)
|
32
|
-
end
|
33
|
-
|
34
|
-
def default_format
|
35
|
-
:long
|
36
|
-
end
|
37
|
-
|
38
|
-
def normalize_value(value)
|
39
|
-
case value
|
40
|
-
when Date, DateTime, Time, nil
|
41
|
-
value
|
42
|
-
else
|
43
|
-
raise ArgumentError, "Value must be a Date, DateTime or Time object. #{value.inspect} given."
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlexi
|
4
|
-
module Table
|
5
|
-
module Components
|
6
|
-
class Description < Base
|
7
|
-
def view_template
|
8
|
-
p(**attributes) {
|
9
|
-
field.description
|
10
|
-
}
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def render?
|
16
|
-
field.has_description?
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlexi
|
4
|
-
module Table
|
5
|
-
module Components
|
6
|
-
class Hint < Base
|
7
|
-
def view_template
|
8
|
-
p(**attributes) do
|
9
|
-
field.hint
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def render?
|
16
|
-
field.has_hint?
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "active_support/number_helper"
|
4
|
-
|
5
|
-
module Phlexi
|
6
|
-
module Table
|
7
|
-
module Components
|
8
|
-
class Number < Base
|
9
|
-
include Concerns::TablesValue
|
10
|
-
|
11
|
-
def render_value(value)
|
12
|
-
p(**attributes) {
|
13
|
-
format_number(value)
|
14
|
-
}
|
15
|
-
end
|
16
|
-
|
17
|
-
protected
|
18
|
-
|
19
|
-
def build_attributes
|
20
|
-
super
|
21
|
-
|
22
|
-
@options = attributes.delete(:options) || {}
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def format_number(value)
|
28
|
-
ActiveSupport::NumberHelper.number_to_delimited(value, **@options)
|
29
|
-
end
|
30
|
-
|
31
|
-
def normalize_value(value)
|
32
|
-
Float(value.to_s)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlexi
|
4
|
-
module Table
|
5
|
-
module Components
|
6
|
-
class Wrapper < Base
|
7
|
-
def view_template
|
8
|
-
div(**attributes) {
|
9
|
-
render field.label_tag
|
10
|
-
yield field if block_given?
|
11
|
-
render field.description_tag
|
12
|
-
}
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlexi
|
4
|
-
module Table
|
5
|
-
module FieldOptions
|
6
|
-
module Associations
|
7
|
-
protected
|
8
|
-
|
9
|
-
def association_reflection
|
10
|
-
@association_reflection ||= find_association_reflection
|
11
|
-
end
|
12
|
-
|
13
|
-
def find_association_reflection
|
14
|
-
if object.class.respond_to?(:reflect_on_association)
|
15
|
-
object.class.reflect_on_association(key)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlexi
|
4
|
-
module Table
|
5
|
-
module FieldOptions
|
6
|
-
module Attachments
|
7
|
-
protected
|
8
|
-
|
9
|
-
def attachment_reflection
|
10
|
-
@attachment_reflection ||= find_attachment_reflection
|
11
|
-
end
|
12
|
-
|
13
|
-
def find_attachment_reflection
|
14
|
-
if object.class.respond_to?(:reflect_on_attachment)
|
15
|
-
object.class.reflect_on_attachment(key)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlexi
|
4
|
-
module Table
|
5
|
-
module FieldOptions
|
6
|
-
module Hints
|
7
|
-
def hint(hint = nil)
|
8
|
-
if hint.nil?
|
9
|
-
options[:hint]
|
10
|
-
else
|
11
|
-
options[:hint] = hint
|
12
|
-
self
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def has_hint?
|
17
|
-
hint.present?
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,129 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "bigdecimal"
|
4
|
-
|
5
|
-
module Phlexi
|
6
|
-
module Table
|
7
|
-
module FieldOptions
|
8
|
-
module InferredTypes
|
9
|
-
def inferred_db_type
|
10
|
-
@inferred_db_type ||= infer_db_type
|
11
|
-
end
|
12
|
-
|
13
|
-
def inferred_display_component
|
14
|
-
@inferred_display_component ||= infer_display_component
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def infer_display_component
|
20
|
-
case inferred_db_type
|
21
|
-
when :string, :text
|
22
|
-
infer_string_display_type(key)
|
23
|
-
when :integer, :float, :decimal
|
24
|
-
:number
|
25
|
-
when :date, :datetime, :time
|
26
|
-
:date
|
27
|
-
when :boolean
|
28
|
-
:boolean
|
29
|
-
when :json, :jsonb, :hstore
|
30
|
-
:code
|
31
|
-
else
|
32
|
-
if association_reflection
|
33
|
-
:association
|
34
|
-
elsif attachment_reflection
|
35
|
-
:attachment
|
36
|
-
else
|
37
|
-
:text
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def infer_db_type
|
43
|
-
if object.class.respond_to?(:columns_hash)
|
44
|
-
# ActiveRecord object
|
45
|
-
column = object.class.columns_hash[key.to_s]
|
46
|
-
return column.type if column
|
47
|
-
end
|
48
|
-
|
49
|
-
if object.class.respond_to?(:attribute_types)
|
50
|
-
# ActiveModel::Attributes
|
51
|
-
custom_type = object.class.attribute_types[key.to_s]
|
52
|
-
return custom_type.type if custom_type
|
53
|
-
end
|
54
|
-
|
55
|
-
# Check if object responds to the key
|
56
|
-
if object.respond_to?(key)
|
57
|
-
# Fallback to inferring type from the value
|
58
|
-
return infer_db_type_from_value(object.send(key))
|
59
|
-
end
|
60
|
-
|
61
|
-
# Default to string if we can't determine the type
|
62
|
-
:string
|
63
|
-
end
|
64
|
-
|
65
|
-
def infer_db_type_from_value(value)
|
66
|
-
case value
|
67
|
-
when Integer
|
68
|
-
:integer
|
69
|
-
when Float
|
70
|
-
:float
|
71
|
-
when BigDecimal
|
72
|
-
:decimal
|
73
|
-
when TrueClass, FalseClass
|
74
|
-
:boolean
|
75
|
-
when Date
|
76
|
-
:date
|
77
|
-
when Time, DateTime
|
78
|
-
:datetime
|
79
|
-
when Hash
|
80
|
-
:json
|
81
|
-
else
|
82
|
-
:string
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def infer_string_display_type(key)
|
87
|
-
key = key.to_s.downcase
|
88
|
-
|
89
|
-
return :password if is_password_field?
|
90
|
-
|
91
|
-
custom_type = custom_string_display_type(key)
|
92
|
-
return custom_type if custom_type
|
93
|
-
|
94
|
-
:text
|
95
|
-
end
|
96
|
-
|
97
|
-
def custom_string_display_type(key)
|
98
|
-
custom_mappings = {
|
99
|
-
/url$|^link|^site/ => :url,
|
100
|
-
/^email/ => :email,
|
101
|
-
/phone|tel(ephone)?/ => :phone,
|
102
|
-
/^time/ => :time,
|
103
|
-
/^date/ => :date,
|
104
|
-
/^number|_count$|_amount$/ => :number,
|
105
|
-
/^color/ => :color
|
106
|
-
}
|
107
|
-
|
108
|
-
custom_mappings.each do |pattern, type|
|
109
|
-
return type if key.match?(pattern)
|
110
|
-
end
|
111
|
-
|
112
|
-
nil
|
113
|
-
end
|
114
|
-
|
115
|
-
def is_password_field?
|
116
|
-
key = self.key.to_s.downcase
|
117
|
-
|
118
|
-
exact_matches = ["password"]
|
119
|
-
prefixes = ["encrypted_"]
|
120
|
-
suffixes = ["_password", "_digest", "_hash"]
|
121
|
-
|
122
|
-
exact_matches.include?(key) ||
|
123
|
-
prefixes.any? { |prefix| key.start_with?(prefix) } ||
|
124
|
-
suffixes.any? { |suffix| key.end_with?(suffix) }
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlexi
|
4
|
-
module Table
|
5
|
-
module FieldOptions
|
6
|
-
module Labels
|
7
|
-
def label(label = nil)
|
8
|
-
if label.nil?
|
9
|
-
options[:label] = options.fetch(:label) { calculate_label }
|
10
|
-
else
|
11
|
-
options[:label] = label
|
12
|
-
self
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def calculate_label
|
19
|
-
if object.class.respond_to?(:human_attribute_name)
|
20
|
-
object.class.human_attribute_name(key.to_s, {base: object})
|
21
|
-
else
|
22
|
-
key.to_s.humanize
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlexi
|
4
|
-
module Table
|
5
|
-
module FieldOptions
|
6
|
-
module Placeholders
|
7
|
-
def placeholder(placeholder = nil)
|
8
|
-
if placeholder.nil?
|
9
|
-
options[:placeholder] || "-"
|
10
|
-
else
|
11
|
-
options[:placeholder] = placeholder
|
12
|
-
self
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|