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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/lib/phlexi/table/base.rb +343 -74
  3. data/lib/phlexi/table/components/actions_column.rb +49 -0
  4. data/lib/phlexi/table/components/base.rb +23 -18
  5. data/lib/phlexi/table/components/column.rb +24 -0
  6. data/lib/phlexi/table/components/column_group.rb +23 -0
  7. data/lib/phlexi/table/components/concerns/displays_data.rb +66 -0
  8. data/lib/phlexi/table/components/concerns/displays_header.rb +114 -0
  9. data/lib/phlexi/table/components/concerns/groups_columns.rb +36 -0
  10. data/lib/phlexi/table/components/options/alignment.rb +31 -0
  11. data/lib/phlexi/table/components/options/associations.rb +23 -0
  12. data/lib/phlexi/table/components/options/attachments.rb +23 -0
  13. data/lib/phlexi/table/components/options/labels.rb +30 -0
  14. data/lib/phlexi/table/components/options/types.rb +140 -0
  15. data/lib/phlexi/table/html.rb +13 -0
  16. data/lib/phlexi/table/table_options/captions.rb +22 -0
  17. data/lib/phlexi/table/{field_options/description.rb → table_options/descriptions.rb} +5 -5
  18. data/lib/phlexi/table/theme.rb +29 -0
  19. data/lib/phlexi/table/version.rb +1 -1
  20. data/lib/phlexi/table/wrapped_object.rb +20 -0
  21. data/lib/phlexi/table.rb +3 -5
  22. metadata +32 -25
  23. data/lib/phlexi/table/components/concerns/displays_value.rb +0 -54
  24. data/lib/phlexi/table/components/date_time.rb +0 -49
  25. data/lib/phlexi/table/components/description.rb +0 -21
  26. data/lib/phlexi/table/components/hint.rb +0 -21
  27. data/lib/phlexi/table/components/label.rb +0 -15
  28. data/lib/phlexi/table/components/number.rb +0 -37
  29. data/lib/phlexi/table/components/placeholder.rb +0 -15
  30. data/lib/phlexi/table/components/string.rb +0 -17
  31. data/lib/phlexi/table/components/wrapper.rb +0 -17
  32. data/lib/phlexi/table/field_options/associations.rb +0 -21
  33. data/lib/phlexi/table/field_options/attachments.rb +0 -21
  34. data/lib/phlexi/table/field_options/hints.rb +0 -22
  35. data/lib/phlexi/table/field_options/inferred_types.rb +0 -129
  36. data/lib/phlexi/table/field_options/labels.rb +0 -28
  37. data/lib/phlexi/table/field_options/placeholders.rb +0 -18
  38. data/lib/phlexi/table/field_options/themes.rb +0 -132
  39. data/lib/phlexi/table/structure/dom.rb +0 -42
  40. data/lib/phlexi/table/structure/field_builder.rb +0 -158
  41. data/lib/phlexi/table/structure/field_collection.rb +0 -39
  42. data/lib/phlexi/table/structure/namespace.rb +0 -123
  43. data/lib/phlexi/table/structure/namespace_collection.rb +0 -40
  44. 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.1
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-26 00:00:00.000000000 Z
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/concerns/displays_value.rb
190
- - lib/phlexi/table/components/date_time.rb
191
- - lib/phlexi/table/components/description.rb
192
- - lib/phlexi/table/components/hint.rb
193
- - lib/phlexi/table/components/label.rb
194
- - lib/phlexi/table/components/number.rb
195
- - lib/phlexi/table/components/placeholder.rb
196
- - lib/phlexi/table/components/string.rb
197
- - lib/phlexi/table/components/wrapper.rb
198
- - lib/phlexi/table/field_options/associations.rb
199
- - lib/phlexi/table/field_options/attachments.rb
200
- - lib/phlexi/table/field_options/description.rb
201
- - lib/phlexi/table/field_options/hints.rb
202
- - lib/phlexi/table/field_options/inferred_types.rb
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,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Phlexi
4
- module Table
5
- module Components
6
- class Label < Base
7
- def view_template
8
- h5(**attributes) {
9
- field.label
10
- }
11
- end
12
- end
13
- end
14
- end
15
- 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,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Phlexi
4
- module Table
5
- module Components
6
- class Placeholder < Base
7
- def view_template
8
- p(**attributes) {
9
- field.placeholder
10
- }
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Phlexi
4
- module Table
5
- module Components
6
- class String < Base
7
- include Concerns::TablesValue
8
-
9
- def render_value(value)
10
- p(**attributes) {
11
- value
12
- }
13
- end
14
- end
15
- end
16
- end
17
- 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