cssmenu 0.0.0 → 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.
data/README.rdoc CHANGED
@@ -1,9 +1,50 @@
1
- = cssmenu
1
+ = Css Menu System
2
2
 
3
- Description goes here.
3
+ This set of functions makes adding a CSS configured menu as simple as
4
+ possible. Because it uses CSS for all formatting, it will work even if
5
+ javascript is turned off. If there is no styling, it will degrade
6
+ gracefully to a simple unordered list. That means it will work even with
7
+ a text based browser.
8
+
9
+ === A note about images in the menus
10
+
11
+ This will search the /public/images and /public/images/icons directories for
12
+ image files of type .png, .gif, and .jpg, so any image that is of one of those
13
+ types and located in those directories will be found automatically. You do not
14
+ need to supply any more than the file base name. If you want to use a file that
15
+ does not meet those assumptions, you may still supply the full file
16
+ specification.
17
+
18
+ === Typical Example:
19
+
20
+ <%= menubar do -%>
21
+ <%= menu_item('Back to Home', 'house', root_path()) %>
22
+ <%= menu_item('New Registration', 'user_add', new_registration_path) %>
23
+ <%- end -%>
24
+
25
+ === Extended Example:
26
+
27
+ <%= menubar do -%>
28
+ <%= menu_item('Back to Home', 'house', root_path()) %>
29
+ <%= sub_menu('Tagged Actions', 'tag') do -%>
30
+ <%= menu_item('Send Mail', 'email', nil, nil, :onclick => js_submit('email')) %>
31
+ <%= menu_item('Delete', 'delete', nil, nil, {:onclick => js_submit('delete', :confirm => "Are you sure you want to delete the tagged registrations?"}) ) %>
32
+ <%- end -%>
33
+ <%= sub_menu('Tools', 'cog') do -%>
34
+ <%= menu_item('Export as CSV', 'report_disk', url_for(:controller=>:registrations, :action=>:index, :format=>:csv)) %>
35
+ <%= menu_item('Manage Statuses', 'application_view_list', statuses_path) %>
36
+ <%= menu_item('Manage Documents', 'page_copy', documents_path) %>
37
+ <%= sub_menu('Sub Item 2', 'add') do -%>
38
+ <%= menu_item('Sub Sub Item 1', 'add', '#') %>
39
+ <%= menu_item('Sub Sub Item 2', 'add', '#') %>
40
+ <%- end -%>
41
+ <%= menu_item('Sub Item 4', 'add') %>
42
+ <%- end -%>
43
+ <%= menu_item('New Registration', 'user_add', new_registration_path) %>
44
+ <%- end -%>
4
45
 
5
46
  == Note on Patches/Pull Requests
6
-
47
+
7
48
  * Fork the project.
8
49
  * Make your feature addition or bug fix.
9
50
  * Add tests for it. This is important so I don't break it in a
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.0
1
+ 0.1.0
data/cssmenu.gemspec ADDED
@@ -0,0 +1,56 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{cssmenu}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["wmerrell"]
12
+ s.date = %q{2010-11-12}
13
+ s.description = %q{This is a set of functions to simplify management of a CSS based menu system.}
14
+ s.email = %q{will@morelandsolutions.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "cssmenu-0.1.0.gem",
27
+ "cssmenu.gemspec",
28
+ "lib/cssmenu.rb",
29
+ "lib/cssmenu/engine.rb",
30
+ "test/helper.rb",
31
+ "test/test_cssmenu.rb"
32
+ ]
33
+ s.homepage = %q{http://github.com/wmerrell/cssmenu}
34
+ s.rdoc_options = ["--charset=UTF-8"]
35
+ s.require_paths = ["lib"]
36
+ s.rubygems_version = %q{1.3.7}
37
+ s.summary = %q{A CSS based menu system for Rails pages.}
38
+ s.test_files = [
39
+ "test/test_cssmenu.rb",
40
+ "test/helper.rb"
41
+ ]
42
+
43
+ if s.respond_to? :specification_version then
44
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
45
+ s.specification_version = 3
46
+
47
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
48
+ s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
49
+ else
50
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
51
+ end
52
+ else
53
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
54
+ end
55
+ end
56
+
data/lib/cssmenu.rb CHANGED
@@ -0,0 +1,253 @@
1
+ require 'cssmenu/engine' if defined?(Rails) && Rails::VERSION::MAJOR == 3
2
+
3
+ # == Css Menu System
4
+ #
5
+ # This set of functions makes adding a CSS configured menu as simple as
6
+ # possible. Because it uses CSS for all formatting, it will work even if
7
+ # javascript is turned off. If there is no styling, it will degrade
8
+ # gracefully to a simple unordered list.
9
+ #
10
+ # === Typical Example:
11
+ #
12
+ # <%= menubar do -%>
13
+ # <%= menu_item('Back to Home', 'house', root_path()) %>
14
+ # <%= menu_item('New Registration', 'user_add', new_registration_path) %>
15
+ # <%- end -%>
16
+ #
17
+ # === Extended Example:
18
+ #
19
+ # <%= menubar do -%>
20
+ # <%= menu_item('Back to Home', 'house', root_path()) %>
21
+ # <%= sub_menu('Tagged Actions', 'tag') do -%>
22
+ # <%= menu_item('Send Mail', 'email', nil, nil, :onclick => js_submit('email')) %>
23
+ # <%= menu_item('Delete', 'delete', nil, nil, {:onclick => js_submit('delete', :confirm => "Are you sure you want to delete the tagged registrations?"}) ) %>
24
+ # <%- end -%>
25
+ # <%= sub_menu('Tools', 'cog') do -%>
26
+ # <%= menu_item('Export as CSV', 'report_disk', url_for(:controller=>:registrations, :action=>:index, :format=>:csv)) %>
27
+ # <%= menu_item('Manage Statuses', 'application_view_list', statuses_path) %>
28
+ # <%= menu_item('Manage Documents', 'page_copy', documents_path) %>
29
+ # <%= sub_menu('Sub Item 2', 'add') do -%>
30
+ # <%= menu_item('Sub Sub Item 1', 'add', '#') %>
31
+ # <%= menu_item('Sub Sub Item 2', 'add', '#') %>
32
+ # <%- end -%>
33
+ # <%= menu_item('Sub Item 4', 'add') %>
34
+ # <%- end -%>
35
+ # <%= menu_item('New Registration', 'user_add', new_registration_path) %>
36
+ # <%- end -%>
37
+ #
38
+ module CssMenu
39
+
40
+ # Creates a menu bar
41
+ #
42
+ # This function creates a menu bar by creating an unordered list with a
43
+ # class of "cssMenu". The menu items will be li items within the list.
44
+ # It is expected that the "cssMenu" class will be styled to resemble a
45
+ # horizontal bar that will contain the item buttons.
46
+ #
47
+ # *Parameters*
48
+ #
49
+ # *permission* If the permission argument is supplied, it is expected to
50
+ # evaluate to true or false. If permissions is true or nil the menu is
51
+ # displayed. If it is false, the menu is not displayed.
52
+ #
53
+ # *block* This function expects a block consisting of the menu items to
54
+ # display. If no block is supplied, then no output is returned.
55
+ #
56
+ # === Usage:
57
+ # <%= menubar(permission) do -%>
58
+ # <%- end -%>
59
+ #
60
+ def menubar(permission=nil, &block)
61
+ if block_given?
62
+ content = capture(&block)
63
+ if permission.nil? || permission
64
+ raw("\n <!-- cssMenu -->\n <ul class=\"cssMenu\">\n" + content + " </ul>\n")
65
+ end
66
+ end
67
+ end
68
+
69
+ # Creates a menu item
70
+ #
71
+ # This function creates a menu item by creating an +li+ element, with a
72
+ # link element inside it. It is assumed that this will be used inside
73
+ # an unordered list with a class of "cssMenu" created by menubar. It is
74
+ # expected that the +li+ element, and the link within it, will be
75
+ # formatted with css to resemble a button.
76
+ #
77
+ # *Parameters*
78
+ #
79
+ # *text* is the text that will be used in the link. It may be blank.
80
+ #
81
+ # *image* is the image that will be used in the link. It may be blank.
82
+ # If an image name is supplied, it will create the link with an embedded
83
+ # image along with text.
84
+ #
85
+ # *url* is the url that will be used in the link. It takes the same
86
+ # arguments as url_for.
87
+ #
88
+ # *permission* If the permission argument is supplied, it is expected to
89
+ # evaluate to true or false. If permissions is true or nil the item is
90
+ # displayed. If it is false, the item is not displayed.
91
+ #
92
+ # *html_options* are any options that will be used in the link. It may be
93
+ # blank and takes the same arguments as +html_options+ in the
94
+ # +link_to+ command.
95
+ #
96
+ # === Usage:
97
+ # <%= menubar do -%>
98
+ # <%= menu_item('Back to Home', 'house', root_path()) %>
99
+ # <%- end -%>
100
+ #
101
+ def menu_item(text='', image='', url='', permission=nil, html_options = {})
102
+ text = text.blank? ? "" : text
103
+ image = image.blank? ? "" : image_tag(cssmenu_clean_imagefile_name(image), :alt=>'')
104
+ url = url.blank? ? "#" : url
105
+ html_options = html_options.stringify_keys
106
+ if permission.nil? || permission
107
+ raw("<li>" + link_to( image + text, url, html_options ) + "</li>")
108
+ end
109
+ end
110
+
111
+ # Creates a submenu
112
+ #
113
+ # This function creates a submenu item by creating an unordered list
114
+ # inside a li element. It is expected that an unordered list within a
115
+ # +cssMenu+ will be formatted with css to resemble a drop down box.
116
+ #
117
+ # *Parameters*
118
+ #
119
+ # *text* is the text that will be used in the link. It may be blank.
120
+ #
121
+ # *image* is the image that will be used in the link. It may be blank.
122
+ # If an image name is supplied, it will create the link with an embedded
123
+ # image along with text.
124
+ #
125
+ # *url* is the url that will be used in the link. It takes the same
126
+ # arguments as url_for. This will usually be blank.
127
+ #
128
+ # *permission* If the permission argument is supplied, it is expected to
129
+ # evaluate to true or false. If permissions is true or nil the item and
130
+ # the submenu will be displayed. If it is false, then neither the item nor
131
+ # the submenu is displayed.
132
+ #
133
+ # *html_options* are any options that will be used in the link. It may be
134
+ # blank and takes the same arguments as +html_options+ in the
135
+ # +link_to+ command. This will usually be blank.
136
+ #
137
+ # *block* This function expects a block consisting of the menu items to
138
+ # display. If no block is supplied, then no output is returned.
139
+ #
140
+ # === Usage:
141
+ # <%= menubar do -%>
142
+ # <%= sub_menu('Sub Item 2', 'add') do -%>
143
+ # <%= menu_item('Sub Sub Item 1', 'add', item1_path) %>
144
+ # <%= menu_item('Sub Sub Item 2', 'add', item2_path) %>
145
+ # <%- end -%>
146
+ # <%- end -%>
147
+ #
148
+ def sub_menu(text='', image='', url='', permission=nil, html_options = {}, &block)
149
+ if block_given?
150
+ content = capture(&block)
151
+ text = text.blank? ? "" : text
152
+ image = image.blank? ? "" : image_tag(cssmenu_clean_imagefile_name(image), :alt=>'')
153
+ url = url.blank? ? "#" : url
154
+ html_options = html_options.stringify_keys
155
+ if permission.nil? || permission
156
+ raw(" <li>" + link_to( "<span>" + image + text + "</span>", url, html_options ) + "\n <ul>\n" + content + " </ul></li>\n")
157
+ end
158
+ end
159
+ end
160
+
161
+ # Makes a menu item into a submit button.
162
+ #
163
+ # This function is a convienience function to aid in using menu items
164
+ # inside a form. It adds javascript to the menu item to turn it into a
165
+ # submit button.
166
+ #
167
+ # The intent is to use menu items to manipulate data sets within a form.
168
+ # Typically you would display a dataset with checkboxes and use the menu
169
+ # items to issue commands against the checked data items.
170
+ #
171
+ # *Parameters*
172
+ #
173
+ # *command* is the command that will be submitted.
174
+ #
175
+ # *options* is hash of options. The following options are supported.
176
+ #
177
+ # _form_name_ The +name+ of the form. Defaults to +taglist+.
178
+ #
179
+ # _tag_name_ The name of the form's submit tag. Defauts to +commit+.
180
+ #
181
+ # _confirm_ If present, a confirm dialog will be generated using this text.
182
+ #
183
+ # === Usage:
184
+ # <%= form_tag('/posts')do -%>
185
+ # <%= menubar do -%>
186
+ # <%= sub_menu('Tagged Actions', 'tag') do -%>
187
+ # <%= menu_item('Touch', 'finger', nil, nil, :onclick => js_submit('touch')) %>
188
+ # <%= menu_item('Delete', 'delete', nil, nil, {:onclick => js_submit('delete', :confirm => "Are you sure you want to delete the tagged registrations?"}) ) %>
189
+ # <%- end -%>
190
+ # <%- end -%>
191
+ # <div><%= check_box_tag 'post_1' -%>Post 1</div>
192
+ # <div><%= check_box_tag 'post_2' -%>Post 2</div>
193
+ # <div><%= check_box_tag 'post_3' -%>Post 3</div>
194
+ # <div><%= submit_tag 'Save' -%></div>
195
+ # <%- end -%>
196
+ #
197
+ def js_submit(command='', options={})
198
+ options.to_options!
199
+ form_name = options.delete(:form_name) || 'taglist'
200
+ tag_name = options.delete(:tag_name) || 'commit'
201
+ submit_str = "document.#{form_name}['#{tag_name}'].value='#{command}'; document.#{form_name}.submit(); return false;"
202
+ if confirm_str = options.delete(:confirm)
203
+ output = "if (confirm('#{confirm_str}')) { #{submit_str} } else { return false; }"
204
+ else
205
+ output = submit_str
206
+ end
207
+ output.html_safe
208
+ end
209
+
210
+ private
211
+
212
+ # Normalizes image file names
213
+ #
214
+ # This function tries to find the file based on the name supplied. In
215
+ # normal use you will only need to supply the image file name without
216
+ # any extention. It will check for the supplied name as is, and with
217
+ # .png, .gif, or .jpg extentions added to the supplied name, in the
218
+ # public, public/images, and public/images/icons directories. If the
219
+ # file is found, it's normalized path name is returned. Note: It will
220
+ # also match any file that is explictly specified.
221
+ #
222
+ # This version is used internally, and should not be used by users.
223
+ #
224
+ def cssmenu_clean_imagefile_name(name='')
225
+ root = Rails.public_path
226
+ filename = ""
227
+ # Shortcut to handle the most common cases.
228
+ if FileTest.exist?( File.join( root, "/images/#{name}.png" ) )
229
+ filename = "/images/#{name}.png"
230
+ elsif FileTest.exist?( File.join( root, "/images/icons/#{name}.png" ) )
231
+ filename = "/images/icons/#{name}.png"
232
+ else
233
+ # If not, check all
234
+ ["", ".png", ".gif", ".jpg"].each do |ext|
235
+ # Check if full path has been specified
236
+ if FileTest.exist?( File.join( root, name + ext ) )
237
+ filename = name + ext
238
+ elsif FileTest.exist?( File.join( root, "/images/", name + ext ) )
239
+ filename = File.join( "/images/", name + ext )
240
+ elsif FileTest.exist?( File.join( root, "/images/icons/", name + ext ) )
241
+ filename = File.join( "/images/icons/", name + ext )
242
+ end
243
+ end
244
+ end
245
+ if filename.blank?
246
+ filename = "/images/broken.png"
247
+ end
248
+ filename
249
+ end
250
+
251
+ end
252
+
253
+ ActionView::Base.send :include, CssMenu
@@ -0,0 +1,7 @@
1
+ require "cssmenu"
2
+ require "rails"
3
+
4
+ module CssMenu
5
+ class Engine < Rails::Engine
6
+ end
7
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cssmenu
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 0
10
- version: 0.0.0
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - wmerrell
@@ -48,7 +48,10 @@ files:
48
48
  - README.rdoc
49
49
  - Rakefile
50
50
  - VERSION
51
+ - cssmenu-0.1.0.gem
52
+ - cssmenu.gemspec
51
53
  - lib/cssmenu.rb
54
+ - lib/cssmenu/engine.rb
52
55
  - test/helper.rb
53
56
  - test/test_cssmenu.rb
54
57
  has_rdoc: true