helmsman 0.0.1
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/.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
|
+
[](https://travis-ci.org/xijo/helmsman) [](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
|