tramway-admin 1.31.0.1 → 1.32.1.1

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: 8e527df685599efb7b14fa1ff445ae7f61aea669a1edd406d7a5d127fe2026f6
4
- data.tar.gz: 41a7ee8ab8836d19122a094784fa3fa3c162e469a005b5f2b7a174f178bc3897
3
+ metadata.gz: 8a1bea8f2efa7d5814d01ecbc9b1be1e0ce806a23e4d30468efed48977da8a39
4
+ data.tar.gz: 521deb526b82adb0bf8e12e637bd5110f43319e226647cead7782e3fff2690b1
5
5
  SHA512:
6
- metadata.gz: c6a8ba79872d5a473f77e1fe69e5d7c5d3d710890fd0293d3afbab411a347254c3dc25da2201cc6ad1ea48d9d50146356c2b1b7b5244c2483ff255b088473ea7
7
- data.tar.gz: 96cc001da48f111185dcd722ca4f61f16f4f08f1668512a6a8aa43d36b24bbeed6f13fc70a4a95bfce0644332ac5f5c30781f486447cee6d57b3c6497a5066c2
6
+ metadata.gz: 8af70fa074a7859b0f393b47c0e256a16d02f3b33146a9cd61220d2fe3a7b33d811debcc7aa1b066f46ef027e7497d758359dc9d1b558a3036852ff6b0eb0e48
7
+ data.tar.gz: 14debf20343bd4b96d7e157c93bd40f7a633fd6cadf674b4b9c712bf821dc9659db61e4121cd018b0ca0570626d7b892ad37ff23cf592540253a710e35b0a420
data/README.md CHANGED
@@ -1,13 +1,6 @@
1
1
  # Tramway::Admin
2
- Short description and motivation.
3
2
 
4
- ## English readme
5
-
6
- *If you need translation of this Readme, please message us kalashnikov@ulmic.ru. We'll translate for you and post to this page*
7
-
8
- ## Russian readme
9
-
10
- Готовая админка для проекта. Она подготовлена для работы со всеми tramway плагинами, а также поддерживает и ваши модели тоже.
3
+ Create admin panel for your application FAST!
11
4
 
12
5
  ## Usage
13
6
  How to use my plugin.
@@ -106,13 +99,61 @@ class YourModelDecorator < Tramway::Core::ApplicationDecorator
106
99
  def collections
107
100
  [ :all, :scope1, :scope2 ]
108
101
  end
102
+
103
+ def list_filters
104
+ {
105
+ filter_name: {
106
+ type: :select,
107
+ select_collection: filter_collection,
108
+ query: lambda do |list, value|
109
+ list.where some_attribute: value
110
+ end
111
+ },
112
+ date_filter_name: {
113
+ type: :dates,
114
+ query: lambda do |list, begin_date, end_date|
115
+ list.where 'created_at > ? AND created_at < ?', begin_date, end_date
116
+ end
117
+ }
118
+ }
119
+ end
109
120
  end
110
121
 
111
122
  delegate :title, to: :object
112
123
  end
113
124
  ```
114
125
 
115
- **NOTE:** `collections` methods must return array of scopes of `YourModel`. Every collection will be a tab in a list of your model in admin panel.
126
+ **NOTES:**
127
+ * `collections` method must return array of scopes of `YourModel`. Every collection will be a tab in a list of your model in admin panel
128
+ * `list_filters` method returns hash of filters where:
129
+ * select_collection - collection which will be in the select of filter. It must be compatible with [options_for_select](https://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_for_select) method
130
+ * query - some Active Record query which be used as a filter of records
131
+
132
+ Filters naming:
133
+
134
+ *Select filters*
135
+
136
+ ```yaml
137
+ en:
138
+ tramway:
139
+ admin:
140
+ filters:
141
+ model_name:
142
+ filter_name: Your Filter
143
+ ```
144
+
145
+ *Date filters*
146
+
147
+ ```yaml
148
+ en:
149
+ tramway:
150
+ admin:
151
+ filters:
152
+ model_name:
153
+ date_filter_name:
154
+ begin_date: Your Begin date filter
155
+ end_date Your end date filter
156
+ ```
116
157
 
117
158
  #### 10. Add inheritance to YourModel
118
159
 
@@ -140,6 +181,24 @@ class Admin::YourModelForm < Tramway::Core::ApplicationForm
140
181
  end
141
182
  end
142
183
  ```
184
+
185
+ ### 12. You can add search to your index page
186
+
187
+ Tramway use gem [PgSearch](https://github.com/Casecommons/pg_search`) as search engine
188
+
189
+ Just add `search` method to `YourModel` like this
190
+
191
+ ```ruby
192
+ search_by *attributes, **associations # `attributes` and `associations` should be the same syntax as in PgSearch
193
+ ```
194
+
195
+ Example:
196
+
197
+ ```ruby
198
+ class YourModel < Tramway::Core::ApplicationRecord
199
+ search_by :my_attribute, :another_attribute, my_association: [ :my_association_attribute, :another_my_association_attribute ]
200
+ ```
201
+
143
202
  #### 12. Run server `rails s`
144
203
  #### 13. Launch `localhost:3000/admin`
145
204
 
data/Rakefile CHANGED
@@ -1,34 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- begin
4
- require 'bundler/setup'
5
- rescue LoadError
6
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
- end
8
-
9
- require 'rdoc/task'
3
+ require 'rake'
4
+ require 'rspec/core/rake_task'
10
5
 
11
- RDoc::Task.new(:rdoc) do |rdoc|
12
- rdoc.rdoc_dir = 'rdoc'
13
- rdoc.title = 'Tramway::Admin'
14
- rdoc.options << '--line-numbers'
15
- rdoc.rdoc_files.include('README.md')
16
- rdoc.rdoc_files.include('lib/**/*.rb')
6
+ RSpec::Core::RakeTask.new(:spec) do |t|
7
+ t.pattern = Dir.glob('spec/**/*_spec.rb')
8
+ t.rspec_opts = '--format documentation'
17
9
  end
18
-
19
- APP_RAKEFILE = File.expand_path('test/dummy/Rakefile', __dir__)
20
- load 'rails/tasks/engine.rake'
21
-
22
- load 'rails/tasks/statistics.rake'
23
-
24
- require 'bundler/gem_tasks'
25
-
26
- require 'rake/testtask'
27
-
28
- Rake::TestTask.new(:test) do |t|
29
- t.libs << 'test'
30
- t.pattern = 'test/**/*_test.rb'
31
- t.verbose = false
32
- end
33
-
34
- task default: :test
10
+ task default: :spec
@@ -31,3 +31,18 @@ td.actions
31
31
  height: auto
32
32
  max-height: 30em
33
33
  overflow-x: hidden
34
+
35
+ .row-fluid.filters
36
+ width: 100%
37
+ display: flex
38
+
39
+ select
40
+ width: 100%
41
+
42
+ .submit
43
+ display: flex
44
+ flex-direction: row-reverse
45
+
46
+ .dates_filter
47
+ display: flex
48
+ flex-direction: row
@@ -34,8 +34,17 @@ module Tramway
34
34
  records = records.send "#{current_admin.role}_scope", current_admin.id
35
35
  records = records.ransack(params[:filter]).result if params[:filter].present?
36
36
  params[:list_filters]&.each do |filter, value|
37
- if value.present?
38
- records = decorator_class.list_filters[filter.to_sym][:query].call(records, value)
37
+ case decorator_class.list_filters[filter.to_sym][:type]
38
+ when :select
39
+ records = decorator_class.list_filters[filter.to_sym][:query].call(records, value) if value.present?
40
+ when :dates
41
+ begin_date = params[:list_filters][filter.to_sym][:begin_date]
42
+ end_date = params[:list_filters][filter.to_sym][:end_date]
43
+ if begin_date.present? && end_date.present?
44
+ if value.present?
45
+ records = decorator_class.list_filters[filter.to_sym][:query].call(records, begin_date, end_date)
46
+ end
47
+ end
39
48
  end
40
49
  end
41
50
  hash.merge! collection => records.count
@@ -97,7 +106,9 @@ module Tramway
97
106
  # model: params[:model]
98
107
  # )
99
108
  # raise "Looks like model #{params[:model]} is not included to tramway-admin for `#{current_admin.role}` role. Add it in the `config/initializers/tramway.rb`. This way `Tramway::Admin.set_available_models(#{params[:model]})`"
100
- Tramway::Admin.forms.include? params[:form].underscore.sub(%r{^admin/}, '').sub(/_form$/, '')
109
+ if params[:form].present?
110
+ Tramway::Admin.forms.include? params[:form].underscore.sub(%r{^admin/}, '').sub(/_form$/, '')
111
+ end
101
112
  end
102
113
 
103
114
  def available_scope_given?
@@ -7,8 +7,17 @@ class Tramway::Admin::RecordsController < ::Tramway::Admin::ApplicationControlle
7
7
  records = records.full_text_search params[:search] if params[:search].present?
8
8
  records = records.ransack(params[:filter]).result if params[:filter].present?
9
9
  params[:list_filters]&.each do |filter, value|
10
- if value.present?
11
- records = decorator_class.list_filters[filter.to_sym][:query].call(records, value)
10
+ case decorator_class.list_filters[filter.to_sym][:type]
11
+ when :select
12
+ records = decorator_class.list_filters[filter.to_sym][:query].call(records, value) if value.present?
13
+ when :dates
14
+ begin_date = params[:list_filters][filter.to_sym][:begin_date]
15
+ end_date = params[:list_filters][filter.to_sym][:end_date]
16
+ if begin_date.present? && end_date.present?
17
+ if value.present?
18
+ records = decorator_class.list_filters[filter.to_sym][:query].call(records, begin_date, end_date)
19
+ end
20
+ end
12
21
  end
13
22
  end
14
23
  records = records.send "#{current_admin.role}_scope", current_admin.id
@@ -1,15 +1,35 @@
1
1
  - if searchable_model?(model_class) || decorator_class(model_class).list_filters.any?
2
- .col-md-6
2
+ .col-md-8
3
3
  .search
4
- = form_tag records_path, method: :get do |f|
5
- .form-group.text
6
- .input-group
7
- - if searchable_model?(model_class)
8
- = text_field_tag :search, params[:search], class: 'text form-control'
9
- = hidden_field_tag :model, params[:model]
10
- = hidden_field_tag :scope, params[:scope]
11
- = hidden_field_tag :filter, params[:filter]
12
- - decorator_class(model_class).list_filters.each do |filter|
13
- = select_tag "list_filters[#{filter[0]}]", build_options_for_select(filter[0], filter[1][:select_collection]), include_blank: true, class: 'form-control'
14
- .input-group-append
15
- = submit_tag t('helpers.actions.search'), class: 'btn btn-primary'
4
+ = form_tag records_path, class: 'form-inline', method: :get do |f|
5
+ - if searchable_model?(model_class)
6
+ = text_field_tag :search, params[:search], class: 'text form-control'
7
+ = hidden_field_tag :model, params[:model]
8
+ = hidden_field_tag :scope, params[:scope]
9
+ = hidden_field_tag :filter, params[:filter]
10
+ - decorator_class(model_class).list_filters.each_slice(3) do |slice|
11
+ .row-fluid.filters
12
+ - slice.each do |filter|
13
+ - case filter[1][:type]
14
+ - when :select
15
+ .col-md-4
16
+ = label_tag t("admin.filters.#{model_class.to_s.underscore}.#{filter[0]}")
17
+ = select_tag "list_filters[#{filter[0]}]", build_options_for_select(filter[0], filter[1][:select_collection]), include_blank: true, class: 'form-control'
18
+ - when :dates
19
+ .col-md-8.dates_filter
20
+ .begin_date
21
+ = label_tag t("admin.filters.#{model_class.to_s.underscore}.#{filter[0]}.begin_date")
22
+ = text_field_tag "list_filters[#{filter[0]}][begin_date]", '', class: 'form-control', id: 'filter_datepicker_begin_date', value: params.dig(:list_filters, filter[0], :begin_date)
23
+ %span
24
+ \ -
25
+ .end_date
26
+ = label_tag t("admin.filters.#{model_class.to_s.underscore}.#{filter[0]}.end_date")
27
+ = text_field_tag "list_filters[#{filter[0]}][end_date]", '', class: 'form-control', id: 'filter_datepicker_end_date', value: params.dig(:list_filters, filter[0], :end_date)
28
+ :javascript
29
+ $(function () {
30
+ $('#filter_datepicker_begin_date').datepicker();
31
+ $('#filter_datepicker_end_date').datepicker();
32
+ });
33
+ .row-fluid.filters
34
+ .col-md-4.offset-md-8.submit
35
+ = submit_tag t('helpers.actions.search'), class: 'btn btn-primary'
@@ -5,7 +5,8 @@
5
5
  - tabs = get_collection
6
6
  .page-header
7
7
  .row
8
- .col-md-6
8
+ - search_render_show = searchable_model?(model_class) || decorator_class(model_class).list_filters.any?
9
+ %div{ class: "col-md-#{search_render_show ? 4 : 12}" }
9
10
  %h1
10
11
  = current_title
11
12
  = link_to fa_icon(:plus), new_current_model_record_path, class: 'btn btn-primary'
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'tramway/core'
3
4
  require 'tramway/admin/engine'
4
5
  require 'tramway/admin/singleton_models'
5
6
  require 'tramway/admin/records_models'
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Tramway
4
4
  module Admin
5
- VERSION = '1.31.0.1'
5
+ VERSION = '1.32.1.1'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,15 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tramway-admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.31.0.1
4
+ version: 1.32.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Kalashnikov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-05 00:00:00.000000000 Z
11
+ date: 2020-08-26 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: tramway-core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.18.3.4
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.18.3.4
27
+ - !ruby/object:Gem::Dependency
28
+ name: tramway-auth
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.0.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 2.0.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: tramway-user
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 2.1.3.2
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 2.1.3.2
13
55
  - !ruby/object:Gem::Dependency
14
56
  name: bootstrap-kaminari-views
15
57
  requirement: !ruby/object:Gem::Requirement
@@ -154,6 +196,20 @@ dependencies:
154
196
  - - '='
155
197
  - !ruby/object:Gem::Version
156
198
  version: '3.0'
199
+ - !ruby/object:Gem::Dependency
200
+ name: pg
201
+ requirement: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ type: :development
207
+ prerelease: false
208
+ version_requirements: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: '0'
157
213
  description: Engine for admin
158
214
  email:
159
215
  - kalashnikovisme@gmail.com