grape-listing 1.2.1 → 1.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ba00678e6ce8506dd80ac31e49dda56058cbb7ad385f2264018e18e9d9279632
4
- data.tar.gz: a622910e11b063da43d43edcde6a76d40e66affeb53b3ce490ef0900d6012c54
3
+ metadata.gz: 91c1e4c2304b5a8918099f9d66fe17adb0867d70dc3e31c4e1d8ddd4f4763bb2
4
+ data.tar.gz: 43c297e7791da7cc815f893f1ed8e920047799f35633f4facf174911874c6c88
5
5
  SHA512:
6
- metadata.gz: e2acc4de1f0cfd8406ffd4aa237df70b3058fba8a3d30ce0397aa4b617d6280a9a780c91f77c5d0f3e852f41bbf87b0875ef8582796ab1916d4f65eda4134d86
7
- data.tar.gz: ccb7b6dfe1251b06760f39a7de49da40aed8ab31960d481536ec7b7cd59df32b5d21b173a7bb374a8247295c33a286e31e093090c9e1a8049b81dabfa090b155
6
+ metadata.gz: 38e71d0a6b5b79d13923c4e1950fd6fe9d51732eb57fcf7efe87546a473b93be40994f131beeadd7db0d24ed5b77612997676e472e0e993ccac4d0056f7891a3
7
+ data.tar.gz: b24ea490f428720e199ffb8029bcfc96abd0f13d471dbc68c8125fe6455b14f19be3d17a7040f7b2cf488199040961586f55ffc258b6a0d57b7469c9b03a643c
data/README.md CHANGED
@@ -43,6 +43,8 @@ end
43
43
 
44
44
  `search: %w[...]` - список полей, по которым должна осуществляться фильтрация (поиск).
45
45
 
46
+ `sortable: %w[...]` - список полей, по которым может осуществляться сортировка.
47
+
46
48
  `paginate: false` - отдавать результат без пагинации, сразу всей коллекцией (по умолчанию - с пагинацией)
47
49
 
48
50
  ## Параметры HTTP запроса
data/lib/grape/dsl.rb CHANGED
@@ -4,13 +4,13 @@ module Grape
4
4
  module DSL
5
5
  module InsideRoute
6
6
 
7
- def listing(model:, entity:, scopes: nil, search: nil, paginate: true, caching: false)
7
+ def listing(model:, entity:, scopes: nil, search: nil, sortable: nil, paginate: true, caching: false)
8
8
  # параметры запроса API
9
9
  request_method = request.env['REQUEST_METHOD']
10
10
  request_uri = request.env['REQUEST_URI']
11
11
 
12
12
  # опции для сервиса
13
- opts = listing_opts(model, entity, scopes, search, caching, request_method, request_uri)
13
+ opts = listing_opts(model, entity, scopes, search, sortable, caching, request_method, request_uri)
14
14
 
15
15
  if params[:spreadsheet]
16
16
  listing_spreadsheet(**opts)
@@ -23,9 +23,20 @@ module Grape
23
23
 
24
24
  private
25
25
 
26
- def listing_opts(model, entity, scopes, search, caching, request_method, request_uri)
26
+ def listing_opts(model, entity, scopes, search, sortable, caching, request_method, request_uri)
27
27
  # стандартные опции
28
- opts = { model:, entity:, scopes:, search:, params:, current_user:, caching:, request_method:, request_uri: }
28
+ opts = {
29
+ model:,
30
+ entity:,
31
+ scopes:,
32
+ search:,
33
+ sortable:,
34
+ params:,
35
+ current_user:,
36
+ caching:,
37
+ request_method:,
38
+ request_uri:
39
+ }
29
40
 
30
41
  # требуемый список полей (+стандартные) для фильтрации в Grape Entity
31
42
  if params[:columns]
@@ -38,8 +38,7 @@ module GrapeListing
38
38
  @only_columns = args[:only_columns]
39
39
 
40
40
  # сортировка
41
- @sort_by = @params['sort_by'] || :id
42
- @sort_order = @params['sort_order'] || :desc
41
+ @sortable = args[:sortable]
43
42
 
44
43
  # подсчет кол-ва записей
45
44
  @objects_count = records_count
@@ -4,8 +4,25 @@ module GrapeListing
4
4
  private
5
5
 
6
6
  def sort_proc
7
- query = Arel.sql("#{@sort_by} #{@sort_order} NULLS LAST")
8
- proc { order(query) }
7
+ # проверка необходимости нестандартной сортировки
8
+ unless custom_sorting_field
9
+ return proc { order('id DESC NULLS LAST') }
10
+ end
11
+
12
+ sort_order = @params['sort_order'] || 'DESC'
13
+ sorting_scope = custom_sorting_field.split('|')[1]
14
+
15
+ if sorting_scope
16
+ proc { send(sorting_scope, sort_order) }
17
+ else
18
+ query = Arel.sql("#{custom_sorting_field} #{sort_order} NULLS LAST")
19
+ proc { order(query) }
20
+ end
21
+ end
22
+
23
+ # поиск поля для индивидуальной сортировки среди допустимых
24
+ def custom_sorting_field
25
+ @custom_sorting_field ||= @sortable.select { |i| i.split('|')[0] == @params['sort_by'] }[0]
9
26
  end
10
27
 
11
28
  end
@@ -3,6 +3,13 @@ require 'fast_excel'
3
3
  module GrapeListing
4
4
  module Spreadsheet
5
5
 
6
+ EXCLUDED_COLUMNS = %i[
7
+ created_at
8
+ updated_at
9
+ deleted_at
10
+ global_id
11
+ ].freeze
12
+
6
13
  def spreadsheet
7
14
  # поиск и фильтрация
8
15
  search
@@ -68,7 +75,7 @@ module GrapeListing
68
75
 
69
76
  def grape_entity_columns
70
77
  @grape_entity.root_exposures.map do |exposure|
71
- unless exposure.key == :deleted_at
78
+ if EXCLUDED_COLUMNS.exclude?(exposure.key)
72
79
  exposure.key
73
80
  end
74
81
  end.compact
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-listing
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Павел Бабин
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-10 00:00:00.000000000 Z
11
+ date: 2024-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack