ransack_advanced_search 0.1.0
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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +6 -0
- data/Rakefile +40 -0
- data/app/assets/javascripts/ransack_advanced_search/application.js +13 -0
- data/app/assets/javascripts/ransack_advanced_search/ransack_advanced_search.js +34 -0
- data/app/assets/stylesheets/ransack_advanced_search/application.css +17 -0
- data/app/controllers/concerns/ransack_advanced_search/saved_search_utils.rb +59 -0
- data/app/controllers/ransack_advanced_search/application_controller.rb +5 -0
- data/app/helpers/ransack_advanced_search_helper.rb +39 -0
- data/app/models/saved_search.rb +5 -0
- data/app/views/ransack_advanced_search/_advanced_search.html.erb +73 -0
- data/app/views/ransack_advanced_search/_attribute_fields.erb +3 -0
- data/app/views/ransack_advanced_search/_condition_fields.erb +21 -0
- data/app/views/ransack_advanced_search/_grouping_fields.erb +20 -0
- data/app/views/ransack_advanced_search/_sort_fields.erb +3 -0
- data/app/views/ransack_advanced_search/_value_fields.erb +2 -0
- data/config/initializers/ransack_advanced_search.rb +1 -0
- data/config/locales/ransack.en.yml +94 -0
- data/config/locales/ransack.pt-BR.yml +93 -0
- data/config/routes.rb +2 -0
- data/lib/generators/ransack_advanced_search/saved_search_generator.rb +29 -0
- data/lib/generators/templates/create_ransack_advanced_search_saved_search.rb +11 -0
- data/lib/ransack_advanced_search/engine.rb +4 -0
- data/lib/ransack_advanced_search/version.rb +3 -0
- data/lib/ransack_advanced_search.rb +7 -0
- data/lib/tasks/ransack_advanced_search_tasks.rake +4 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/ransack_advanced_search_test.rb +7 -0
- data/test/test_helper.rb +15 -0
- metadata +199 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 58cff2d8f37ca95aca53690bf22a9268395b0187
|
4
|
+
data.tar.gz: c4686f564b1c1b45d981ecc29c97b6367bec2399
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 31acaca1592e2d482bc0e65d922c5db0c06a432aa8d5fa36537a0597f4fae9f906535154bf324f9e0323d2b79cd6c8f92397a7cb61b6b3e35d20ab55b108b2c8
|
7
|
+
data.tar.gz: 92d0c9a03397df1a6edf0673288ad324f6c45ba7132d99f996b6def7bdd015238ab3c72b2b758b414754fa2a85ce6aa9405b39a5590ee6b1ee94dbb35d9b5e5b
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2016 David Brusius
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'rdoc/task'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rdoc/rdoc'
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
RDoc::Task = Rake::RDocTask
|
13
|
+
end
|
14
|
+
|
15
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
17
|
+
rdoc.title = 'RansackAdvancedSearch'
|
18
|
+
rdoc.options << '--line-numbers'
|
19
|
+
rdoc.rdoc_files.include('README.rdoc')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
24
|
+
load 'rails/tasks/engine.rake'
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
Bundler::GemHelper.install_tasks
|
29
|
+
|
30
|
+
require 'rake/testtask'
|
31
|
+
|
32
|
+
Rake::TestTask.new(:test) do |t|
|
33
|
+
t.libs << 'lib'
|
34
|
+
t.libs << 'test'
|
35
|
+
t.pattern = 'test/**/*_test.rb'
|
36
|
+
t.verbose = false
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
task :default => :test
|
@@ -0,0 +1,13 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// the compiled file.
|
9
|
+
//
|
10
|
+
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
|
11
|
+
// GO AFTER THE REQUIRES BELOW.
|
12
|
+
//
|
13
|
+
//= require_tree .
|
@@ -0,0 +1,34 @@
|
|
1
|
+
(function() {
|
2
|
+
this.Search = (function() {
|
3
|
+
function Search(templates) {
|
4
|
+
this.templates = templates != null ? templates : {};
|
5
|
+
}
|
6
|
+
|
7
|
+
Search.prototype.remove_fields = function(button) {
|
8
|
+
return $(button).closest('.fields').remove();
|
9
|
+
};
|
10
|
+
|
11
|
+
Search.prototype.add_fields = function(button, type, content) {
|
12
|
+
var new_id, regexp;
|
13
|
+
new_id = new Date().getTime();
|
14
|
+
regexp = new RegExp('new_' + type, 'g');
|
15
|
+
return $(button).before(content.replace(regexp, new_id));
|
16
|
+
};
|
17
|
+
|
18
|
+
Search.prototype.nest_fields = function(button, type) {
|
19
|
+
var id_regexp, new_id, object_name, sanitized_object_name, template;
|
20
|
+
new_id = new Date().getTime();
|
21
|
+
id_regexp = new RegExp('new_' + type, 'g');
|
22
|
+
template = this.templates[type];
|
23
|
+
object_name = $(button).closest('.fields').attr('data-object-name');
|
24
|
+
sanitized_object_name = object_name.replace(/\]\[|[^-a-zA-Z0-9:.]/g, '_').replace(/_$/, '');
|
25
|
+
template = template.replace(/new_object_name\[/g, object_name + "[");
|
26
|
+
template = template.replace(/new_object_name_/, sanitized_object_name + '_');
|
27
|
+
return $(button).before(template.replace(id_regexp, new_id));
|
28
|
+
};
|
29
|
+
|
30
|
+
return Search;
|
31
|
+
|
32
|
+
})();
|
33
|
+
|
34
|
+
}).call(this);
|
@@ -0,0 +1,17 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
9
|
+
* compiled file, but it's generally better to create a new file per style scope.
|
10
|
+
*
|
11
|
+
*= require_self
|
12
|
+
*= require_tree .
|
13
|
+
*/
|
14
|
+
|
15
|
+
.ransack-advanced-search i.remove_fields {
|
16
|
+
cursor: pointer;
|
17
|
+
}
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module RansackAdvancedSearch
|
2
|
+
module SavedSearchUtils
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
# Perform saved searches actions to provide full functionality with one method
|
6
|
+
def perform_saved_searches_actions(context, params={})
|
7
|
+
get_saved_searches(context)
|
8
|
+
save_or_update_saved_search(params.merge(context: context))
|
9
|
+
get_params_to_search(context)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Get list of Saved Search by context
|
13
|
+
def get_saved_searches(context)
|
14
|
+
@saved_searches = SavedSearch.where(context: context)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Return params of Saved Search or search form params
|
18
|
+
def get_params_to_search(context)
|
19
|
+
if params[:saved_search].present?
|
20
|
+
@saved_search = SavedSearch.find_by(id: params[:saved_search], context: context)
|
21
|
+
end
|
22
|
+
return params[:q] if params[:use_search_params].present?
|
23
|
+
params[:q] = @saved_search.try(:search_params) || params[:q]
|
24
|
+
end
|
25
|
+
|
26
|
+
# Save or update Saved Search
|
27
|
+
def save_or_update_saved_search(params)
|
28
|
+
if params[:save_new_search].present? || params[:save_search].present?
|
29
|
+
if params[:save_new_search].present?
|
30
|
+
@saved_search = new_saved_search(params)
|
31
|
+
elsif params[:save_search].present? && params[:saved_search].present?
|
32
|
+
@saved_search = update_saved_search(params)
|
33
|
+
elsif params[:save_search].present?
|
34
|
+
@saved_search = new_saved_search(params)
|
35
|
+
end
|
36
|
+
|
37
|
+
if @saved_search.save
|
38
|
+
flash[:notice] = t('ransack.saved_search.save.success')
|
39
|
+
else
|
40
|
+
flash[:error] = t('ransack.saved_search.save.error')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def new_saved_search(params)
|
46
|
+
SavedSearch.new(
|
47
|
+
context: params[:context], description: params[:description],
|
48
|
+
search_params: params[:q]
|
49
|
+
)
|
50
|
+
end
|
51
|
+
|
52
|
+
def update_saved_search(params)
|
53
|
+
saved_search = SavedSearch.find_by(id: params[:saved_search], context: params[:context])
|
54
|
+
saved_search.description = params[:description]
|
55
|
+
saved_search.search_params = params[:q]
|
56
|
+
saved_search
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module RansackAdvancedSearchHelper
|
2
|
+
def setup_search_form(builder)
|
3
|
+
fields = builder.grouping_fields builder.object.new_grouping,
|
4
|
+
object_name: 'new_object_name', child_index: "new_grouping" do |f|
|
5
|
+
render('ransack_advanced_search/grouping_fields', f: f)
|
6
|
+
end
|
7
|
+
content_for :ransack_setup, %Q{
|
8
|
+
var search = new Search({grouping: "#{escape_javascript(fields)}"});
|
9
|
+
$(document).on("click", "button.add_fields", function() {
|
10
|
+
search.add_fields(this, $(this).data('fieldType'), $(this).data('content'));
|
11
|
+
return false;
|
12
|
+
});
|
13
|
+
$(document).on("click", "i.remove_fields", function() {
|
14
|
+
search.remove_fields(this);
|
15
|
+
return false;
|
16
|
+
});
|
17
|
+
$(document).on("click", "button.nest_fields", function() {
|
18
|
+
search.nest_fields(this, $(this).data('fieldType'));
|
19
|
+
return false;
|
20
|
+
});
|
21
|
+
}.html_safe
|
22
|
+
end
|
23
|
+
|
24
|
+
def button_to_remove_fields
|
25
|
+
content_tag :i, nil, class: 'remove_fields glyphicon glyphicon-remove text-danger'
|
26
|
+
end
|
27
|
+
|
28
|
+
def button_to_add_fields(name, f, type)
|
29
|
+
new_object = f.object.send "build_#{type}"
|
30
|
+
fields = f.send("#{type}_fields", new_object, child_index: "new_#{type}") do |builder|
|
31
|
+
render('ransack_advanced_search/' + type.to_s + "_fields", f: builder)
|
32
|
+
end
|
33
|
+
content_tag :button, name, :class => 'add_fields btn btn-default btn-sm', :type => 'button', 'data-field-type' => type, 'data-content' => "#{fields}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def button_to_nest_fields(name, type)
|
37
|
+
content_tag :button, name, :class => 'nest_fields', 'data-field-type' => type
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
<div class="ransack-advanced-search">
|
2
|
+
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-md-4">
|
5
|
+
<div class="panel panel-primary">
|
6
|
+
<div class="panel-heading"><%= t('ransack.saved_search.title') %></div>
|
7
|
+
<div class="list-group lista-buscas">
|
8
|
+
<% @saved_searches.each do |saved_search| %>
|
9
|
+
<%= link_to url_for(saved_search: saved_search.id), method: :post, class: 'list-group-item' do %>
|
10
|
+
<%= saved_search.description %>
|
11
|
+
<% end %>
|
12
|
+
<% end %>
|
13
|
+
<% if @saved_searches.empty? %>
|
14
|
+
<%= link_to '#', class: 'list-group-item' do %>
|
15
|
+
<em><%= t('ransack.saved_search.empty_list') %></em>
|
16
|
+
<% end %>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
<div class="col-md-8">
|
22
|
+
<%= search_form_for(@search, url: search_url, html: { method: :post, class: 'form-vertical', role: 'form' }) do |f| %>
|
23
|
+
|
24
|
+
<% setup_search_form f %>
|
25
|
+
|
26
|
+
<div class="form-group">
|
27
|
+
<%= label_tag 'Descrição da Busca (necessária para salvar a busca)' %>
|
28
|
+
<%= text_field_tag :description, @saved_search.try(:description), class: 'form-control input-sm' %>
|
29
|
+
<% if @saved_search %>
|
30
|
+
<%= hidden_field_tag :saved_search, @saved_search.id %>
|
31
|
+
<%= hidden_field_tag :use_search_params, true %>
|
32
|
+
<% end %>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<h4><%= t('ransack.advanced_search.sort.title') %></h4>
|
36
|
+
<div class="form-group">
|
37
|
+
<%= f.sort_fields do |s| %>
|
38
|
+
<%= render 'ransack_advanced_search/sort_fields', f: s %>
|
39
|
+
<% end %>
|
40
|
+
<%= button_to_add_fields t('ransack.advanced_search.sort.add'), f, :sort %>
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<h4><%= t('ransack.advanced_search.condition_group.title') %></h4>
|
44
|
+
<div class="form-group">
|
45
|
+
<%= f.grouping_fields do |g| %>
|
46
|
+
<%= render 'ransack_advanced_search/grouping_fields', f: g %>
|
47
|
+
<% end %>
|
48
|
+
<%= button_to_add_fields t('ransack.advanced_search.condition_group.add'),
|
49
|
+
f, :grouping %>
|
50
|
+
</div>
|
51
|
+
|
52
|
+
<!-- <%= label_tag :distinct, 'Return distinct records?' %> -->
|
53
|
+
<!-- <%= check_box_tag :distinct, '1', params[:distinct].to_i == 1 %> -->
|
54
|
+
<div class="form-group">
|
55
|
+
<%= f.submit t('ransack.advanced_search.form.submit_text'), class: 'btn btn-primary' %>
|
56
|
+
<%= f.submit t('ransack.advanced_search.form.save_submit_text'), name: 'save_search', class: 'btn btn-primary' %>
|
57
|
+
<%= f.submit t('ransack.advanced_search.form.save_new_submit_text'), name: 'save_new_search', class: 'btn btn-primary' %>
|
58
|
+
</div>
|
59
|
+
<% end %>
|
60
|
+
</div>
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
|
64
|
+
<% content_for(:ransack_advanced_search_setup) do %>
|
65
|
+
<%= stylesheet_link_tag 'ransack_advanced_search/application', media: 'all' %>
|
66
|
+
<%= javascript_include_tag 'ransack_advanced_search/application' %>
|
67
|
+
|
68
|
+
<script>
|
69
|
+
$(document).ready(function () {
|
70
|
+
<%= yield(:ransack_setup) %>
|
71
|
+
});
|
72
|
+
</script>
|
73
|
+
<% end %>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%= content_tag :div, {
|
2
|
+
class: 'fields condition', 'data-object-name' => f.object_name
|
3
|
+
} do %>
|
4
|
+
|
5
|
+
<%= content_tag(:span, button_to_remove_fields,
|
6
|
+
nil, false) %>
|
7
|
+
|
8
|
+
<%= f.attribute_fields do |a| %>
|
9
|
+
<%= render 'ransack_advanced_search/attribute_fields', f: a %>
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
<%= f.predicate_select({}, {class: 'form-control input-sm'}) %>
|
13
|
+
|
14
|
+
<%= f.value_fields do |v| %>
|
15
|
+
<%= render 'ransack_advanced_search/value_fields', f: v %>
|
16
|
+
<% end %>
|
17
|
+
|
18
|
+
<%= button_to_add_fields t('ransack.advanced_search.attribute_value.add'),
|
19
|
+
f, :value %>
|
20
|
+
|
21
|
+
<% end %>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<%= content_tag :div, { class: 'fields',
|
2
|
+
'data-object-name' => f.object_name } do %>
|
3
|
+
|
4
|
+
|
5
|
+
<%= content_tag(:span, "#{t('ransack.advanced_search.condition_group.match')}
|
6
|
+
#{f.combinator_select} #{t('ransack.advanced_search.condition_group.match_condition')}
|
7
|
+
#{button_to_remove_fields}", nil, false) %>
|
8
|
+
|
9
|
+
<%= f.condition_fields do |c| %>
|
10
|
+
<%= render 'ransack_advanced_search/condition_fields', f: c %>
|
11
|
+
<% end %>
|
12
|
+
|
13
|
+
<%= button_to_add_fields t('ransack.advanced_search.attribute_field.add'),
|
14
|
+
f, :condition %>
|
15
|
+
|
16
|
+
<%= f.grouping_fields do |g| %>
|
17
|
+
<%= render 'ransack_advanced_search/grouping_fields', f: g %>
|
18
|
+
<% end %>
|
19
|
+
|
20
|
+
<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
Rails.application.config.i18n.fallbacks = [:en]
|
@@ -0,0 +1,94 @@
|
|
1
|
+
en:
|
2
|
+
ransack:
|
3
|
+
advanced_search:
|
4
|
+
form:
|
5
|
+
submit_text: Search
|
6
|
+
save_submit_text: Save and Search
|
7
|
+
save_new_submit_text: Save as new and Search
|
8
|
+
sort:
|
9
|
+
title: Sort
|
10
|
+
label_title: Sort by
|
11
|
+
add: Add Sort
|
12
|
+
condition_group:
|
13
|
+
title: Condition Groups
|
14
|
+
add: Add Condition Group
|
15
|
+
match: Match
|
16
|
+
match_condition: conditions
|
17
|
+
attribute_field:
|
18
|
+
add: Add Condition
|
19
|
+
attribute_value:
|
20
|
+
add: Add Value
|
21
|
+
saved_search:
|
22
|
+
title: Saved Searches
|
23
|
+
empty_list: There are no saved searches in this context.
|
24
|
+
save:
|
25
|
+
success: Search saved successfully.
|
26
|
+
error: Error while saving the search. You must enter a description of the search and at least one filter.
|
27
|
+
search: "search"
|
28
|
+
predicate: "predicate"
|
29
|
+
and: "and"
|
30
|
+
or: "or"
|
31
|
+
any: "any"
|
32
|
+
all: "all"
|
33
|
+
combinator: "combinator"
|
34
|
+
attribute: "attribute"
|
35
|
+
value: "value"
|
36
|
+
condition: "condition"
|
37
|
+
sort: "sort"
|
38
|
+
asc: "ascending"
|
39
|
+
desc: "descending"
|
40
|
+
predicates:
|
41
|
+
eq: "equals"
|
42
|
+
eq_any: "equals any"
|
43
|
+
eq_all: "equals all"
|
44
|
+
not_eq: "not equal to"
|
45
|
+
not_eq_any: "not equal to any"
|
46
|
+
not_eq_all: "not equal to all"
|
47
|
+
matches: "matches"
|
48
|
+
matches_any: "matches any"
|
49
|
+
matches_all: "matches all"
|
50
|
+
does_not_match: "doesn't match"
|
51
|
+
does_not_match_any: "doesn't match any"
|
52
|
+
does_not_match_all: "doesn't match all"
|
53
|
+
lt: "less than"
|
54
|
+
lt_any: "less than any"
|
55
|
+
lt_all: "less than all"
|
56
|
+
lteq: "less than or equal to"
|
57
|
+
lteq_any: "less than or equal to any"
|
58
|
+
lteq_all: "less than or equal to all"
|
59
|
+
gt: "greater than"
|
60
|
+
gt_any: "greater than any"
|
61
|
+
gt_all: "greater than all"
|
62
|
+
gteq: "greater than or equal to"
|
63
|
+
gteq_any: "greater than or equal to any"
|
64
|
+
gteq_all: "greater than or equal to all"
|
65
|
+
in: "in"
|
66
|
+
in_any: "in any"
|
67
|
+
in_all: "in all"
|
68
|
+
not_in: "not in"
|
69
|
+
not_in_any: "not in any"
|
70
|
+
not_in_all: "not in all"
|
71
|
+
cont: "contains"
|
72
|
+
cont_any: "contains any"
|
73
|
+
cont_all: "contains all"
|
74
|
+
not_cont: "doesn't contain"
|
75
|
+
not_cont_any: "doesn't contain any"
|
76
|
+
not_cont_all: "doesn't contain all"
|
77
|
+
start: "starts with"
|
78
|
+
start_any: "starts with any"
|
79
|
+
start_all: "starts with all"
|
80
|
+
not_start: "doesn't start with"
|
81
|
+
not_start_any: "doesn't start with any"
|
82
|
+
not_start_all: "doesn't start with all"
|
83
|
+
end: "ends with"
|
84
|
+
end_any: "ends with any"
|
85
|
+
end_all: "ends with all"
|
86
|
+
not_end: "doesn't end with"
|
87
|
+
not_end_any: "doesn't end with any"
|
88
|
+
not_end_all: "doesn't end with all"
|
89
|
+
'true': "is true"
|
90
|
+
'false': "is false"
|
91
|
+
present: "is present"
|
92
|
+
blank: "is blank"
|
93
|
+
'null': "is null"
|
94
|
+
not_null: "is not null"
|
@@ -0,0 +1,93 @@
|
|
1
|
+
pt-BR:
|
2
|
+
ransack:
|
3
|
+
advanced_search:
|
4
|
+
form:
|
5
|
+
submit_text: Pesquisar
|
6
|
+
save_submit_text: Salvar e Pesquisar
|
7
|
+
save_new_submit_text: Salvar nova e Pesquisar
|
8
|
+
sort:
|
9
|
+
title: Ordenação
|
10
|
+
add: Adicionar ordenação
|
11
|
+
condition_group:
|
12
|
+
title: Grupos de filtros
|
13
|
+
add: Adicionar grupo
|
14
|
+
match: Filtrar
|
15
|
+
match_condition: condições
|
16
|
+
attribute_field:
|
17
|
+
add: Adicionar filtro
|
18
|
+
attribute_value:
|
19
|
+
add: Adicionar valor
|
20
|
+
saved_search:
|
21
|
+
title: Buscas Salvas
|
22
|
+
empty_list: Não existem buscas salvas para este contexto.
|
23
|
+
save:
|
24
|
+
success: Busca salva com sucesso.
|
25
|
+
error: Erro ao salvar a busca. Você precisa informar a descrição da busca e pelo menos um filtro.
|
26
|
+
search: "pesquisar"
|
27
|
+
predicate: "predicado"
|
28
|
+
and: "e"
|
29
|
+
or: "ou"
|
30
|
+
any: "alguma das"
|
31
|
+
all: "todas as"
|
32
|
+
combinator: "combinador"
|
33
|
+
attribute: "atributo"
|
34
|
+
value: "valor"
|
35
|
+
condition: "condição"
|
36
|
+
sort: "classificar"
|
37
|
+
asc: "ascendente"
|
38
|
+
desc: "descendente"
|
39
|
+
predicates:
|
40
|
+
eq: "igual"
|
41
|
+
eq_any: "igual a algum"
|
42
|
+
eq_all: "igual a todos"
|
43
|
+
not_eq: "não é igual a"
|
44
|
+
not_eq_any: "não é igual a algum"
|
45
|
+
not_eq_all: "não é igual a todos"
|
46
|
+
matches: "corresponde"
|
47
|
+
matches_any: "corresponde a algum"
|
48
|
+
matches_all: "corresponde a todos"
|
49
|
+
does_not_match: "não corresponde"
|
50
|
+
does_not_match_any: "não corresponde a algum"
|
51
|
+
does_not_match_all: "não corresponde a todos"
|
52
|
+
lt: "menor que"
|
53
|
+
lt_any: "menor que algum"
|
54
|
+
lt_all: "menor que todos"
|
55
|
+
lteq: "menor ou igual a"
|
56
|
+
lteq_any: "menor ou igual a algum"
|
57
|
+
lteq_all: "menor ou igual a todos"
|
58
|
+
gt: "maior que"
|
59
|
+
gt_any: "maior que algum"
|
60
|
+
gt_all: "maior que todos"
|
61
|
+
gteq: "maior que ou igual a"
|
62
|
+
gteq_any: "maior que ou igual a algum"
|
63
|
+
gteq_all: "maior que ou igual a todos"
|
64
|
+
in: "em"
|
65
|
+
in_any: "em algum"
|
66
|
+
in_all: "em todos"
|
67
|
+
not_in: "não em"
|
68
|
+
not_in_any: "não em algum"
|
69
|
+
not_in_all: "não em todos"
|
70
|
+
cont: "contém"
|
71
|
+
cont_any: "contém algum"
|
72
|
+
cont_all: "contém todos"
|
73
|
+
not_cont: "não contém"
|
74
|
+
not_cont_any: "não contém algum"
|
75
|
+
not_cont_all: "não contém todos"
|
76
|
+
start: "começa com"
|
77
|
+
start_any: "começa com algum"
|
78
|
+
start_all: "começa com todos"
|
79
|
+
not_start: "não começa com"
|
80
|
+
not_start_any: "não começa com algum"
|
81
|
+
not_start_all: "não começa com algum"
|
82
|
+
end: "termina com"
|
83
|
+
end_any: "termina com algum"
|
84
|
+
end_all: "termina com todos"
|
85
|
+
not_end: "não termina com"
|
86
|
+
not_end_any: "não termina com algum"
|
87
|
+
not_end_all: "não termina com todos"
|
88
|
+
'true': "é verdadeiro"
|
89
|
+
'false': "é falso"
|
90
|
+
present: "está presente"
|
91
|
+
blank: "está em branco"
|
92
|
+
'null': "é nullo"
|
93
|
+
not_null: "não é nulo"
|
data/config/routes.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'rails/generators/base'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
|
4
|
+
module RansackAdvancedSearch
|
5
|
+
module Generators
|
6
|
+
class SavedSearchGenerator < Rails::Generators::Base
|
7
|
+
source_root File.expand_path("../../templates", __FILE__)
|
8
|
+
include Rails::Generators::Migration
|
9
|
+
desc "Creates a Saved Search model and migrations to save advanced searches made with Ransack."
|
10
|
+
class_option :orm
|
11
|
+
|
12
|
+
desc 'add the migrations'
|
13
|
+
def self.next_migration_number(path)
|
14
|
+
unless @prev_migration_nr
|
15
|
+
@prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
|
16
|
+
else
|
17
|
+
@prev_migration_nr += 1
|
18
|
+
end
|
19
|
+
@prev_migration_nr.to_s
|
20
|
+
end
|
21
|
+
|
22
|
+
def copy_migrations
|
23
|
+
migration_template "create_ransack_advanced_search_saved_search.rb", "db/migrate/create_ransack_advanced_search_saved_search.rb"
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class CreateRansackAdvancedSearchSavedSearch < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :saved_searches do |t|
|
4
|
+
t.string :context, null: false
|
5
|
+
t.string :description, null: false
|
6
|
+
t.text :search_params, null: false
|
7
|
+
|
8
|
+
t.timestamps null: false
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|