katalyst-tables 3.6.2 → 3.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 05aff6fc311793d266ae5a3761941285825a267ac012637cb78a8c388664f73d
4
- data.tar.gz: 86ceb51ecfa4ddbfc23a43851623c16b64f490655a02cb4730b0e31a4ed1043a
3
+ metadata.gz: 5362e93821945472e9bc8c20574ab9325d6273f6f28f673722746ae9fec38f25
4
+ data.tar.gz: 36035838a96c61dab64a945dcee186771f5f83e74b2e28692d0a7da1558b9ef5
5
5
  SHA512:
6
- metadata.gz: 1885b0cc4f4f63a2518aaf798af9711d0dd20fbc5bb1644207227c92980855d50fd6e327acade867296a6cd5abb6096b1756622c7d5b29ff8f293c9e1b1eb130
7
- data.tar.gz: 15e7961aceb65df747cfe8d65dd18bfeb6cbdc0cae5be03795d44495491188a4eabf1d1b6d57aa8e0ff34e67cc3d81ec13f6182460fe8b57a45da80436567ac6
6
+ metadata.gz: 576d8272e2a6d5c9c8a8d043e2550191d7fc989f763876287db925b07c9b7336a9044e155ded05d48410331cb37b2bfeddae25dbe0b6e4e244c94932559b80bf
7
+ data.tar.gz: 6e198574c8eecd43ee24d042a2ef23669142a8c434637285471a7aef6d71f079b27b26e095a9b227356c2c4bfdb6b7cef97e187cd6735fb5596e3f16568fd81f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ ## [3.7.0]
2
+
3
+ Adds support for generating filter expressions for self-referencing models.
4
+
5
+ ## [3.6.0]
6
+
7
+ Keyboard navigation for query suggestions.
8
+
9
+ ## [3.5.0]
10
+
11
+ Adds a new query input for creating text-based filtering expressions.
12
+ See [query](docs/developers/collections/query.md) for collection extensions and
13
+ [filtering](docs/developers/frontend/filtering.md) for frontend support.
14
+
15
+ ## [3.4.0]
16
+
17
+ Support for selection columns and bulk actions.
18
+ See [docs](docs/developers/frontend/bulk-actions.md).
19
+
1
20
  ## [3.3.0]
2
21
  - Custom types for collections which support extensions for filtering with ranges and arrays.
3
22
 
@@ -6,12 +6,10 @@ module Katalyst
6
6
  class ConstantValue < Base
7
7
  delegate :to_param, to: :@attribute_type
8
8
 
9
- def initialize(name:, type:, model:, column:, value:)
9
+ def initialize(name:, type:, value:)
10
10
  super(value)
11
11
 
12
12
  @attribute_type = type
13
- @model = model
14
- @column = column
15
13
  @name = name
16
14
  end
17
15
 
@@ -4,16 +4,12 @@ module Katalyst
4
4
  module Tables
5
5
  module Suggestions
6
6
  class DatabaseValue < Base
7
- attr_reader :model, :column
8
-
9
7
  delegate :to_param, to: :@attribute_type
10
8
 
11
- def initialize(name:, type:, model:, column:, value:)
9
+ def initialize(name:, type:, value:)
12
10
  super(value)
13
11
 
14
12
  @attribute_type = type
15
- @model = model
16
- @column = column
17
13
  @name = name
18
14
  end
19
15
 
@@ -22,16 +22,14 @@ module Katalyst
22
22
  end
23
23
  end
24
24
 
25
- def suggestions(scope, attribute)
26
- _, model, column = model_and_column_for(scope, attribute)
27
-
25
+ def suggestions(_scope, attribute)
28
26
  values = %w[true false]
29
27
 
30
28
  if attribute.value_before_type_cast.present?
31
29
  values = values.select { |value| value.include?(attribute.value_before_type_cast) }
32
30
  end
33
31
 
34
- values.map { |v| constant_suggestion(attribute:, model:, column:, value: deserialize(v)) }
32
+ values.map { |v| constant_suggestion(attribute:, value: deserialize(v)) }
35
33
  end
36
34
  end
37
35
  end
@@ -23,14 +23,12 @@ module Katalyst
23
23
  end
24
24
 
25
25
  def suggestions(scope, attribute)
26
- _, model, column = model_and_column_for(scope, attribute)
27
-
28
26
  [
29
27
  *super(scope, attribute, limit: 6, order: :desc),
30
- database_suggestion(attribute:, model:, column:, value: ::Date.current.beginning_of_week..),
31
- database_suggestion(attribute:, model:, column:, value: ::Date.current.beginning_of_month..),
32
- database_suggestion(attribute:, model:, column:, value: 1.month.ago.all_month),
33
- database_suggestion(attribute:, model:, column:, value: 1.year.ago.all_year),
28
+ database_suggestion(attribute:, value: ::Date.current.beginning_of_week..),
29
+ database_suggestion(attribute:, value: ::Date.current.beginning_of_month..),
30
+ database_suggestion(attribute:, value: 1.month.ago.all_month),
31
+ database_suggestion(attribute:, value: 1.year.ago.all_year),
34
32
  ]
35
33
  end
36
34
 
@@ -16,7 +16,15 @@ module Katalyst
16
16
  end
17
17
 
18
18
  def suggestions(scope, attribute)
19
- _, model, column = model_and_column_for(scope, attribute)
19
+ model = scope.model
20
+ column = attribute.name
21
+
22
+ if attribute.name.include?(".")
23
+ table_name, column = attribute.name.split(".")
24
+ model = scope.model.reflections[table_name].klass
25
+
26
+ raise(ArgumentError, "Unknown association '#{table_name}' for #{scope.model}") unless model
27
+ end
20
28
 
21
29
  raise ArgumentError, "Unknown enum #{column} for #{model}" unless model.defined_enums.has_key?(column)
22
30
 
@@ -26,7 +34,7 @@ module Katalyst
26
34
  values = values.select { |key| key.include?(attribute.value_before_type_cast) }
27
35
  end
28
36
 
29
- values.map { |value| constant_suggestion(attribute:, model:, column:, value:) }
37
+ values.map { |value| constant_suggestion(attribute:, value:) }
30
38
  end
31
39
 
32
40
  private
@@ -5,8 +5,6 @@ module Katalyst
5
5
  module Collection
6
6
  module Type
7
7
  class String < Value
8
- include ActiveRecord::Sanitization::ClassMethods
9
-
10
8
  attr_reader :exact
11
9
  alias_method :exact?, :exact
12
10
 
@@ -21,11 +19,32 @@ module Katalyst
21
19
 
22
20
  private
23
21
 
24
- def filter_condition(model, column, value)
25
- if exact? || scope
22
+ class Match
23
+ include ActiveRecord::Sanitization::ClassMethods
24
+
25
+ attr_reader :value
26
+
27
+ def initialize(value)
28
+ @value = value
29
+ end
30
+
31
+ def to_sql
32
+ "%#{sanitize_sql_like(value)}%"
33
+ end
34
+ end
35
+
36
+ class MatchHandler
37
+ def call(attribute, value)
38
+ attribute.matches(value.to_sql)
39
+ end
40
+ end
41
+
42
+ def apply_filter(scope, model, attribute, value)
43
+ if exact?
26
44
  super
27
45
  else
28
- model.where(model.arel_table[column].matches("%#{sanitize_sql_like(value)}%"))
46
+ model.predicate_builder.register_handler(Match, MatchHandler.new)
47
+ scope.where(attribute.name => Match.new(value))
29
48
  end
30
49
  end
31
50
  end
@@ -33,10 +33,18 @@ module Katalyst
33
33
  def filter(scope, attribute, value: filter_value(attribute))
34
34
  return scope unless filter?(attribute, value)
35
35
 
36
- scope, model, column = model_and_column_for(scope, attribute)
37
- condition = filter_condition(model, column, value)
36
+ if self.scope.present?
37
+ scope.public_send(self.scope, value)
38
+ elsif attribute.name.include?(".")
39
+ table_name, = attribute.name.split(".")
40
+ association = scope.model.reflections[table_name]
38
41
 
39
- scope.merge(condition)
42
+ raise(ArgumentError, "Unknown association '#{table_name}' for #{scope.model}") unless association
43
+
44
+ apply_filter(scope.joins(table_name.to_sym), association.klass, attribute, value)
45
+ else
46
+ apply_filter(scope, scope.model, attribute, value)
47
+ end
40
48
  end
41
49
 
42
50
  def to_param(value)
@@ -44,54 +52,51 @@ module Katalyst
44
52
  end
45
53
 
46
54
  def suggestions(scope, attribute, limit: 10, order: :asc)
47
- scope, model, column = model_and_column_for(scope, attribute)
55
+ model = scope.model
56
+ column = attribute.name
57
+
58
+ if attribute.name.include?(".")
59
+ table_name, column = attribute.name.split(".")
60
+ model = scope.model.reflections[table_name].klass
61
+
62
+ raise(ArgumentError, "Unknown association '#{table_name}' for #{scope.model}") unless model
63
+
64
+ scope = scope.joins(table_name.to_sym)
65
+ end
48
66
 
49
67
  unless model.attribute_types.has_key?(column)
50
68
  raise(ArgumentError, "Unknown column '#{column}' for #{model}. " \
51
69
  "Consider defining '#{attribute.name.parameterize.underscore}_suggestions'")
52
70
  end
53
71
 
54
- arel_column = model.arel_table[column]
55
-
56
72
  filter(scope, attribute)
57
- .group(arel_column)
73
+ .group(attribute.name)
58
74
  .distinct
59
75
  .limit(limit)
60
- .reorder(arel_column => order)
61
- .pluck(arel_column)
62
- .map { |v| database_suggestion(attribute:, model:, column:, value: deserialize(v)) }
76
+ .reorder(attribute.name => order)
77
+ .pluck(attribute.name)
78
+ .map { |v| database_suggestion(attribute:, value: deserialize(v)) }
63
79
  end
64
80
 
65
81
  private
66
82
 
67
- def constant_suggestion(attribute:, model:, column:, value:)
68
- Tables::Suggestions::ConstantValue.new(name: attribute.name, type: attribute.type, model:, column:, value:)
83
+ def constant_suggestion(attribute:, value:)
84
+ Tables::Suggestions::ConstantValue.new(name: attribute.name, type: attribute.type, value:)
69
85
  end
70
86
 
71
- def database_suggestion(attribute:, model:, column:, value:)
72
- Tables::Suggestions::DatabaseValue.new(name: attribute.name, type: attribute.type, model:, column:, value:)
87
+ def database_suggestion(attribute:, value:)
88
+ Tables::Suggestions::DatabaseValue.new(name: attribute.name, type: attribute.type, value:)
73
89
  end
74
90
 
75
91
  def filter_value(attribute)
76
92
  attribute.value
77
93
  end
78
94
 
79
- def filter_condition(model, column, value)
95
+ def apply_filter(scope, _model, attribute, value)
80
96
  if value.nil?
81
- model.none
82
- elsif scope
83
- model.public_send(scope, value)
84
- else
85
- model.where(column => serialize(value))
86
- end
87
- end
88
-
89
- def model_and_column_for(scope, attribute)
90
- if attribute.name.include?(".")
91
- table, column = attribute.name.split(".")
92
- [scope.joins(table.to_sym), scope.model.reflections[table].klass, column]
97
+ scope.none
93
98
  else
94
- [scope, scope.model, attribute.name]
99
+ scope.where(attribute.name => serialize(value))
95
100
  end
96
101
  end
97
102
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: katalyst-tables
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.6.2
4
+ version: 3.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katalyst Interactive
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-11-06 00:00:00.000000000 Z
10
+ date: 2025-01-13 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: katalyst-html-attributes
@@ -175,7 +174,6 @@ metadata:
175
174
  homepage_uri: https://github.com/katalyst/tables
176
175
  source_code_uri: https://github.com/katalyst/tables
177
176
  changelog_uri: https://github.com/katalyst/tables/blobs/main/CHANGELOG.md
178
- post_install_message:
179
177
  rdoc_options: []
180
178
  require_paths:
181
179
  - lib
@@ -190,8 +188,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
190
188
  - !ruby/object:Gem::Version
191
189
  version: '0'
192
190
  requirements: []
193
- rubygems_version: 3.5.16
194
- signing_key:
191
+ rubygems_version: 3.6.2
195
192
  specification_version: 4
196
193
  summary: HTML table generator for Rails views
197
194
  test_files: []