helmsman 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +11 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +13 -0
- data/README.md +140 -0
- data/Rakefile +1 -0
- data/helmsman.gemspec +27 -0
- data/lib/helmsman/helm.rb +64 -0
- data/lib/helmsman/railtie.rb +9 -0
- data/lib/helmsman/version.rb +3 -0
- data/lib/helmsman/view_helper.rb +36 -0
- data/lib/helmsman.rb +11 -0
- data/spec/lib/helmsman/view_helper_spec.rb +84 -0
- data/spec/spec_helper.rb +13 -0
- metadata +132 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 17ffb3e2f06409546207afd53827fa0cb5e58dc8
|
4
|
+
data.tar.gz: 70366137bfc394958f7cdfefa7c2ab6ee2af2fec
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 659c202d87b8e499766eb522c8aa48c2ba9b34ea6cad192c10b620904cf3a25be422c3113574fd4e1ac7626d71f8265616ccd2726390753fbe9e81f8bcdb7f2f
|
7
|
+
data.tar.gz: 15fa8c66a2d2d7a99cf1ffa86c42338f5b9019dcaae91886bae62e8a70ba9ff76ec0abcc8efb5775872e3cc9f5807906ea67dbde2e5910f4ccc81b7b35fe0597
|
data/.gitignore
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
helmsman
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
2
|
+
Version 2, December 2004
|
3
|
+
|
4
|
+
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
5
|
+
|
6
|
+
Everyone is permitted to copy and distribute verbatim or modified
|
7
|
+
copies of this license document, and changing it is allowed as long
|
8
|
+
as the name is changed.
|
9
|
+
|
10
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
11
|
+
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
12
|
+
|
13
|
+
0. You just DO WHAT THE FUCK YOU WANT TO.
|
data/README.md
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
# Helmsman
|
2
|
+
|
3
|
+
[![Build Status](https://secure.travis-ci.org/xijo/helmsman.png?branch=master)](https://travis-ci.org/xijo/helmsman) [![Gem Version](https://badge.fury.io/rb/helmsman.png)](http://badge.fury.io/rb/helmsman)
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'helmsman'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
Helmsman adds the `helm` helper to your rails application views. Here is how you use it:
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
helm :pictures, url: 'http://defiant.ncc/pictures'
|
21
|
+
```
|
22
|
+
|
23
|
+
The above call will produce the following html output
|
24
|
+
|
25
|
+
```html
|
26
|
+
<li>
|
27
|
+
<a href='http://defiant.ncc/pictures'>Pictures</a>
|
28
|
+
</li>
|
29
|
+
```
|
30
|
+
|
31
|
+
### Building the link
|
32
|
+
|
33
|
+
There are multiple ways to build the link:
|
34
|
+
|
35
|
+
1. provide the url parameter. The link will then be build by using the translation and that url.
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
helm :pictures, url: 'http://randompictures.com'
|
39
|
+
```
|
40
|
+
|
41
|
+
2. set helm values in a block.
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
helm :pictures do |entry|
|
45
|
+
entry.name = 'Some pictures'
|
46
|
+
entry.url = 'http://randompictures.com'
|
47
|
+
end
|
48
|
+
```
|
49
|
+
|
50
|
+
3. build everything manually
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
helm :pictures do |_|
|
54
|
+
link_to 'Some pictures', 'http://randompictures.com'
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
58
|
+
### Translation lookup
|
59
|
+
|
60
|
+
The first parameter will be used to lookup the translations.
|
61
|
+
|
62
|
+
e.g. `helm :edit` called from `app/views/pictures/_menu.html.*` uses the following translations
|
63
|
+
|
64
|
+
- en.pictures.menu.edit
|
65
|
+
- en.pictures.menu.edit_disabled
|
66
|
+
|
67
|
+
### Highlight current
|
68
|
+
|
69
|
+
Helmsman will highlight the current entry by using the controller and action name.
|
70
|
+
|
71
|
+
Per default the first parameter will be treated as the controller name: `helm :pictures, url: pictures_url` highlights on every controller action of the pictures_controller.
|
72
|
+
|
73
|
+
You may customize the highlight options by providing a set of controller and/or action names. Here are some examples:
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
helm :bridge, controllers: :screens # on any screens controller action
|
77
|
+
helm :bridge, controllers: [:screens, :sensors] # on any screens and sensors controller action
|
78
|
+
helm :bridge, actions: :show # on bridges controller show action
|
79
|
+
helm :bridge, controllers: :screens, actions: [:show, :index] # only on screens controller #show and #index
|
80
|
+
```
|
81
|
+
|
82
|
+
Anyway you are not forced to use that mechanism, you can also set `current` by hand:
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
helm :bridge, current: true
|
86
|
+
```
|
87
|
+
|
88
|
+
### Disabling and visibility
|
89
|
+
|
90
|
+
To set a helm disabled you may use the `disabled` option. It will then add a tooltip to that entry to explain why it was disabled.
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
admin_sidebar_entry :pictures, url: pictures_url, disabled: user_signed_in?
|
94
|
+
```
|
95
|
+
|
96
|
+
If you want it to not be visible at all set the `visible` option to false.
|
97
|
+
|
98
|
+
```ruby
|
99
|
+
admin_sidebar_entry :pictures, url: pictures_url, visible: user_signed_in?
|
100
|
+
```
|
101
|
+
|
102
|
+
### Additional content and nesting
|
103
|
+
|
104
|
+
As mentioned above you may additional content and nest helms into each other by using its yield feature. Here is a SLIM example:
|
105
|
+
|
106
|
+
```slim
|
107
|
+
- helm :pictures, url: 'http://allpictures.com' do
|
108
|
+
ul
|
109
|
+
= helm :architecture
|
110
|
+
= helm :nature
|
111
|
+
```
|
112
|
+
|
113
|
+
You can always use the current helm during that yield, so finding out whether it is disabled, current or anything is trivial:
|
114
|
+
|
115
|
+
|
116
|
+
```ruby
|
117
|
+
admin_sidebar_entry :pictures, disabled: true, current: false do |entry|
|
118
|
+
puts entry.enabled? # false
|
119
|
+
puts entry.disabled? # true
|
120
|
+
puts entry.visible? # true
|
121
|
+
puts entry.current? # false
|
122
|
+
end
|
123
|
+
```
|
124
|
+
|
125
|
+
## Compatibility
|
126
|
+
|
127
|
+
Helmsman is working for rails 3 & 4 and for any ruby >= 1.9.3
|
128
|
+
|
129
|
+
## Contributing
|
130
|
+
|
131
|
+
1. Fork it
|
132
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
133
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
134
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
135
|
+
5. Create new Pull Request
|
136
|
+
|
137
|
+
## TODO
|
138
|
+
|
139
|
+
1. configure helper name
|
140
|
+
2. configure current/disabled class
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/helmsman.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'helmsman/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "helmsman"
|
8
|
+
spec.version = Helmsman::VERSION
|
9
|
+
spec.authors = ["Johannes Opper"]
|
10
|
+
spec.email = ["johannes.opper@gmail.com"]
|
11
|
+
spec.description = %q{Steers your navigation through the ocean of your application}
|
12
|
+
spec.summary = %q{Steers your navigation through the ocean of your application}
|
13
|
+
spec.homepage = "http://github.com/xijo/helmsman"
|
14
|
+
spec.license = "WTFPL"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency 'actionpack'
|
22
|
+
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
24
|
+
spec.add_development_dependency 'rake'
|
25
|
+
spec.add_development_dependency 'rspec'
|
26
|
+
spec.add_development_dependency 'simplecov'
|
27
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Helmsman
|
2
|
+
class Helm
|
3
|
+
attr_accessor :name, :url, :additional, :i18n_key
|
4
|
+
include ActionView::Helpers::TagHelper
|
5
|
+
include ActionView::Helpers::UrlHelper
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
@disabled = options.fetch(:disabled)
|
9
|
+
@visible = options.fetch(:visible)
|
10
|
+
@current = options.fetch(:current)
|
11
|
+
@i18n_key = options.fetch(:i18n_key)
|
12
|
+
@url = options[:url]
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
visible? ? content_tag(:li, li_content, li_options) : ''.html_safe
|
17
|
+
end
|
18
|
+
|
19
|
+
def html_safe?
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_str
|
24
|
+
to_s
|
25
|
+
end
|
26
|
+
|
27
|
+
def li_content
|
28
|
+
link = link_to_if(enabled?, name, url) if url
|
29
|
+
disabled? ? link : "#{link}#{additional}".html_safe
|
30
|
+
end
|
31
|
+
|
32
|
+
def li_options
|
33
|
+
if enabled?
|
34
|
+
{ class: ('current-menu-item' if current?) }
|
35
|
+
else
|
36
|
+
{ rel: 'tooltip', title: disabled_title, class: 'disabled-menu-item', data: { placement: 'bottom' } }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def name
|
41
|
+
I18n.translate(i18n_key)
|
42
|
+
end
|
43
|
+
|
44
|
+
def disabled_title
|
45
|
+
I18n.translate("#{i18n_key}_disabled")
|
46
|
+
end
|
47
|
+
|
48
|
+
def disabled?
|
49
|
+
@disabled
|
50
|
+
end
|
51
|
+
|
52
|
+
def visible?
|
53
|
+
@visible
|
54
|
+
end
|
55
|
+
|
56
|
+
def enabled?
|
57
|
+
!@disabled
|
58
|
+
end
|
59
|
+
|
60
|
+
def current?
|
61
|
+
@current
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Helmsman
|
2
|
+
module ViewHelper
|
3
|
+
# Returns true if one of the given controllers match the actual one.
|
4
|
+
# If actions are set they are taken into account.
|
5
|
+
def current_state_by_controller(*given_controller_names, actions: [])
|
6
|
+
if given_controller_names.any? { |name| name == controller_name.to_sym }
|
7
|
+
if actions.present?
|
8
|
+
Array(actions).include?(action_name.to_sym)
|
9
|
+
else
|
10
|
+
true
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Private part of actionpack/lib/action_view/helpers/translation_helper.rb
|
16
|
+
# Wrapped for clarification what that does.
|
17
|
+
def expand_i18n_key(key)
|
18
|
+
scope_key_by_partial(key)
|
19
|
+
end
|
20
|
+
|
21
|
+
def helm(key, options = {}, &block)
|
22
|
+
actions = options.fetch(:actions) { [] }
|
23
|
+
controllers = options.fetch(:controllers) { [key] }
|
24
|
+
disabled = options.fetch(:disabled) { false }
|
25
|
+
current = options.fetch(:current) { current_state_by_controller(*controllers, actions: actions) }
|
26
|
+
visible = options.fetch(:visible) { true }
|
27
|
+
url = options[:url]
|
28
|
+
i18n_key = expand_i18n_key(".#{key}")
|
29
|
+
|
30
|
+
entry = Helm.new(disabled: disabled, current: current, visible: visible, i18n_key: i18n_key, url: url)
|
31
|
+
|
32
|
+
entry.additional = capture(entry, &block) if block_given?
|
33
|
+
entry
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/helmsman.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class FakeHelper
|
4
|
+
include Helmsman::ViewHelper
|
5
|
+
include ActionView::Context
|
6
|
+
include ActionView::Helpers::CaptureHelper
|
7
|
+
include ActionView::Helpers::TranslationHelper
|
8
|
+
include ActionView::Helpers::TagHelper
|
9
|
+
include ActionView::Helpers::UrlHelper
|
10
|
+
|
11
|
+
def controller_name
|
12
|
+
'pictures'
|
13
|
+
end
|
14
|
+
|
15
|
+
def action_name
|
16
|
+
'index'
|
17
|
+
end
|
18
|
+
|
19
|
+
def scope_key_by_partial(_)
|
20
|
+
'i18n_path'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe Helmsman::ViewHelper do
|
25
|
+
let(:helper) { FakeHelper.new }
|
26
|
+
|
27
|
+
describe '#helm' do
|
28
|
+
it 'highlights per class name on a given controller name' do
|
29
|
+
result = helper.helm(:pictures)
|
30
|
+
result.should be_current
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'is possible to override the current state' do
|
34
|
+
result = helper.helm(:not_pictures, current: true)
|
35
|
+
result.should be_current
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'highlights by action name as well' do
|
39
|
+
result = helper.helm(:pictures, actions: :show)
|
40
|
+
result.should_not be_current
|
41
|
+
result = helper.helm(:pictures, actions: :index)
|
42
|
+
result.should be_current
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'passing disabled option disables the link' do
|
46
|
+
result = helper.helm(:pictures, disabled: true)
|
47
|
+
result.to_s.should_not include '<a href'
|
48
|
+
result.to_s.should include 'disabled-menu-item'
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'adds block results to the result' do
|
52
|
+
result = helper.helm(:pictures) { |entry| 'jambalaia' }
|
53
|
+
result.to_s.should include 'jambalaia'
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'generates a link if it got a url' do
|
57
|
+
result = helper.helm(:pictures, url: 'hellofoo.com')
|
58
|
+
result.to_s.should include '<a href="hellofoo.com">'
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'generates html_safe output' do
|
62
|
+
result = helper.helm(:pictures)
|
63
|
+
result.to_s.should be_html_safe
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'setting visible to false will output nothing' do
|
67
|
+
result = helper.helm(:pictures, url: 'http://defiant.ncc/pictures', visible: false)
|
68
|
+
result.to_s.should eq ''
|
69
|
+
end
|
70
|
+
|
71
|
+
describe 'yield the entry' do
|
72
|
+
it 'knows if its the current' do
|
73
|
+
helper.helm(:foo, current: true) { |e| e.should be_current }
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'knows if it is disabled' do
|
77
|
+
helper.helm(:foo, disabled: true) do |entry|
|
78
|
+
entry.should be_disabled
|
79
|
+
entry.should_not be_enabled
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: helmsman
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Johannes Opper
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-09-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: actionpack
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: Steers your navigation through the ocean of your application
|
84
|
+
email:
|
85
|
+
- johannes.opper@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- .gitignore
|
91
|
+
- .ruby-gemset
|
92
|
+
- .ruby-version
|
93
|
+
- .travis.yml
|
94
|
+
- Gemfile
|
95
|
+
- LICENSE.txt
|
96
|
+
- README.md
|
97
|
+
- Rakefile
|
98
|
+
- helmsman.gemspec
|
99
|
+
- lib/helmsman.rb
|
100
|
+
- lib/helmsman/helm.rb
|
101
|
+
- lib/helmsman/railtie.rb
|
102
|
+
- lib/helmsman/version.rb
|
103
|
+
- lib/helmsman/view_helper.rb
|
104
|
+
- spec/lib/helmsman/view_helper_spec.rb
|
105
|
+
- spec/spec_helper.rb
|
106
|
+
homepage: http://github.com/xijo/helmsman
|
107
|
+
licenses:
|
108
|
+
- WTFPL
|
109
|
+
metadata: {}
|
110
|
+
post_install_message:
|
111
|
+
rdoc_options: []
|
112
|
+
require_paths:
|
113
|
+
- lib
|
114
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - '>='
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
requirements: []
|
125
|
+
rubyforge_project:
|
126
|
+
rubygems_version: 2.0.3
|
127
|
+
signing_key:
|
128
|
+
specification_version: 4
|
129
|
+
summary: Steers your navigation through the ocean of your application
|
130
|
+
test_files:
|
131
|
+
- spec/lib/helmsman/view_helper_spec.rb
|
132
|
+
- spec/spec_helper.rb
|