allow for fuzzy search, for use with, say, activeadmin

This commit is contained in:
John Bintz 2012-08-29 14:28:15 -04:00
parent ec9eb1ee18
commit b23ad87ad8
6 changed files with 100 additions and 24 deletions

View File

@ -33,6 +33,7 @@ becomes `admin/users`).
Then, in `application.js`: Then, in `application.js`:
``` javascript ``` javascript
//= require jquery
//= require bullseye //= require bullseye
``` ```
@ -61,6 +62,24 @@ Want to target that page in your Sass? Use a little string interpolation and a f
Piece of cake. Piece of cake.
### Fuzzy search
Plugging Bullseye into an existing app may require making Bullseye work a little harder to target pages.
For instance, you can use Bullseye with ActiveAdmin to target particular actions on models.
However, you can't really add your own `body` tag to their templates. Luckily, they do put in both
the action and controller names in the `class` attribute of the `body` tag.
Create an initializer, like `config/initializers/bullseye.rb` and add the following:
``` ruby
Bullseye.configure do |config|
config.fuzzy_search = %{$('body').get(0).classNames.split(/\\s+/)}
config.css_selector = 'body.:action.:controller'
end
```
Then you can make your `controller/action.bullseye` files and everything should just work.
## Hacking ## Hacking
_You'll need to install [Penchant](http://github.com/johnbintz/penchant) to mess with the Gemfile _You'll need to install [Penchant](http://github.com/johnbintz/penchant) to mess with the Gemfile

View File

@ -1,22 +0,0 @@
#= require jquery
this.Bullseye = {
target: function(controller, action, callback) {
this.targets[controller] = (this.targets[controller] || {});
this.targets[controller][action] = callback;
},
targets: {},
exec: function(controller, action) {
if (this.targets[controller] && this.targets[controller][action]) {
this.targets[controller][action].apply(this.context);
}
}
};
Bullseye.context = this;
$(function() {
Bullseye.exec($('body').data('controller'), $('body').data('action'));
});

View File

@ -0,0 +1,54 @@
this.Bullseye = {
target: function(controller, action, callback) {
this.targets[controller] = (this.targets[controller] || {});
this.targets[controller][action] = callback;
},
targets: {},
exec: function() {
var controller, action;
switch (arguments.length) {
case 2:
controller = arguments[0];
action = arguments[1];
break;
case 1:
choices = arguments[0];
choice_loop:
for (controller_i = 0; controller_i < choices.length; ++controller_i) {
controller = choices[controller_i];
if (this.targets[controller]) {
for (action_i = 0; action_i < choices.length; ++action_i) {
action = choices[action_i];
if (this.targets[controller][action]) {
break choice_loop;
}
}
}
}
break;
}
if (this.targets[controller] && this.targets[controller][action]) {
this.targets[controller][action].apply(this.context);
}
}
};
Bullseye.context = this;
$(function() {
Bullseye.exec(
<% if Bullseye.config.fuzzy_search %>
<%= Bullseye.config.fuzzy_search %>
<% else %>
<%= Bullseye.config.js_controller_search %>,
<%= Bullseye.config.js_action_search %>
<% end %>
);
});

View File

@ -2,3 +2,28 @@ require "bullseye/version"
require 'bullseye/engine' if defined?(Rails::Engine) require 'bullseye/engine' if defined?(Rails::Engine)
require 'bullseye/tilt/bullseye_template' require 'bullseye/tilt/bullseye_template'
require 'bullseye/sass/bullseye_functions' require 'bullseye/sass/bullseye_functions'
module Bullseye
class Configuration
attr_accessor :js_controller_search, :js_action_search, :css_selector, :fuzzy_search
def initialize
@js_controller_search = %{$('body').data('controller')}
@js_action_search = %{$('body').data('action')}
@css_selector = %{body[data-action=':action'][data-controller=':controller']}
@fuzzy_search = false
end
end
class << self
def config
@config ||= Configuration.new
end
def configure
block_given? ? yield(config) : config
end
end
end

View File

@ -8,7 +8,7 @@ module Sass::Script::Functions
action = parts.pop action = parts.pop
controller = parts.join('/') controller = parts.join('/')
Sass::Script::String.new("body[data-action='#{action}'][data-controller='#{controller}']") Sass::Script::String.new(Bullseye.config.css_selector.gsub(':action', action).gsub(':controller', controller))
end end
end end

View File

@ -1,3 +1,3 @@
module Bullseye module Bullseye
VERSION = "0.0.3" VERSION = "0.0.4"
end end