phlexi-table 0.0.1 → 0.0.2

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