andy_admin 0.0.2

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.
@@ -0,0 +1,65 @@
1
+ require 'rails/generators'
2
+
3
+ class AndyAdminGenerator < Rails::Generators::Base
4
+ argument :name, :type => :string, :banner => "name of your site", :default => "Your Site"
5
+ argument :hue, :type => :numeric, :banner => "colour hue, 0-255", :default => 92
6
+
7
+ source_root File.expand_path("templates", File.dirname(__FILE__))
8
+
9
+ def copy_files
10
+ template 'admin.html.erb', "app/views/layouts/admin.html.erb"
11
+ template "admin.css", "public/stylesheets/admin.css"
12
+ copy_file "alert-overlay.png", "public/images/admin-alert-overlay.png"
13
+ copy_file "admin.js", "public/javascripts/admin.js"
14
+ template "login.html.erb", "app/views/layouts/login.html.erb"
15
+ template "login.css", "public/stylesheets/login.css"
16
+ copy_file "login.js", "public/javascripts/login.js"
17
+ copy_file "andy_admin_menu.rb", "config/initializers/andy_admin_menu.rb"
18
+ copy_file "andy_admin_helper.rb", "app/helpers/andy_admin_helper.rb"
19
+ # copy_file "lib/andy_admin"
20
+ copy_file "menu.rb", "lib/andy_admin/menu.rb"
21
+ copy_file "form_builder.rb", "lib/andy_admin/form_builder.rb"
22
+ end
23
+
24
+ private
25
+
26
+ def dark_colour
27
+ hsvToRGB(hue, 0.83, 0.35)
28
+ end
29
+
30
+ def light_colour
31
+ hsvToRGB(hue, 0.79, 0.50)
32
+ end
33
+
34
+ def highlight_colour
35
+ hsvToRGB(hue, 0.06, 0.99)
36
+ end
37
+
38
+ def rgbToHex(rgb)
39
+ "#%02x%02x%02x" % [(rgb[0] * 255), (rgb[1] * 255), (rgb[2] * 255)]
40
+ end
41
+
42
+ def hsvToRGB(h, s, v)
43
+ hi = (h/60.0).floor % 6
44
+ f = h/60.0 - (h/60.0).floor
45
+ p = v * (1 - s)
46
+ q = v * (1 - f * s)
47
+ t = v * (1 - (1 - f) * s)
48
+ @rgb = []
49
+ case hi
50
+ when 0
51
+ rgb = [v, t, p]
52
+ when 1
53
+ rgb = [q, v, p]
54
+ when 2
55
+ rgb = [p, v, t]
56
+ when 3
57
+ rgb = [p, q, v]
58
+ when 4
59
+ rgb = [t, p, v]
60
+ when 5
61
+ rgb = [v, p, t]
62
+ end
63
+ return rgbToHex(rgb)
64
+ end
65
+ end
@@ -0,0 +1,382 @@
1
+ /*
2
+
3
+ Colours used are:
4
+
5
+ Hue : <%= hue %>
6
+ Dark/Header : <%= dark_colour %>
7
+ Light/Tabs/links : <%= light_colour %>
8
+ Highlight/Headings : <%= highlight_colour %>
9
+
10
+ Search and replace these values to change them after installation
11
+
12
+ */
13
+
14
+ /* ***************** GENERAL DEFINITIONS ***************** */
15
+
16
+ html, body {
17
+ background-color: #e5e5e5;
18
+ }
19
+
20
+ * {
21
+ font-size: 10pt;
22
+ text-align: left;
23
+ line-height: 1.2em;
24
+ }
25
+
26
+ a {
27
+ color: <%= light_colour %>;
28
+ text-decoration: none;
29
+ }
30
+
31
+ a:hover {
32
+ text-decoration: underline;
33
+ }
34
+
35
+ strong {
36
+ font-weight: bold;
37
+ }
38
+
39
+ em {
40
+ font-style: italic;
41
+ }
42
+
43
+ /* ***************** FLASH DEFINITIONS ***************** */
44
+
45
+ div.flash_error, div.flash_notice, div.flash_warning {
46
+ margin: 20px;
47
+ padding: 10px;
48
+ color: white;
49
+ font-weight: bold;
50
+ }
51
+
52
+ div.flash_error {
53
+ background: #b72c23;
54
+ }
55
+
56
+ div.flash_notice {
57
+ background: #2bb723;
58
+ }
59
+
60
+ div.flash_warning {
61
+ color: black;
62
+ background: #e8ed2d;
63
+ }
64
+
65
+ div.flash_error span, div.flash_notice span, div.flash_warning span {
66
+ float: right;
67
+ font-size: 80%;
68
+ cursor: pointer;
69
+ }
70
+
71
+ /* ***************** AWESOME BUTTONS ***************** */
72
+
73
+ /* From: http://www.zurb.com/ */
74
+ .awesome, .awesome:visited {
75
+ background: #222 url(/images/admin-alert-overlay.png) repeat-x;
76
+ display: inline-block;
77
+ padding: 5px 10px 6px;
78
+ color: #fff;
79
+ text-decoration: none;
80
+ -moz-border-radius: 18px;
81
+ -webkit-border-radius: 18px;
82
+ -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.5);
83
+ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.5);
84
+ text-shadow: 0 -1px 1px rgba(0,0,0,0.25);
85
+ border: 0px;
86
+ border-bottom: 1px solid rgba(0,0,0,0.25);
87
+ position: relative;
88
+ cursor: pointer;
89
+ }
90
+
91
+ .awesome:hover { background-color: #111; color: #fff; }
92
+ .awesome:active { top: 1px; }
93
+ .small.awesome, .small.awesome:visited { font-size: 11px; padding: ; }
94
+ .awesome, .awesome:visited,
95
+ .medium.awesome, .medium.awesome:visited { font-size: 13px; font-weight: bold; line-height: 1; text-shadow: 0 -1px 1px rgba(0,0,0,0.25); }
96
+ .large.awesome, .large.awesome:visited { font-size: 14px; padding: 8px 14px 9px; }
97
+
98
+ .green.awesome, .green.awesome:visited { background-color: #91bd09; }
99
+ .green.awesome:hover { background-color: #749a02; }
100
+ .blue.awesome, .blue.awesome:visited { background-color: #2daebf; }
101
+ .blue.awesome:hover { background-color: #007d9a; }
102
+ .red.awesome, .red.awesome:visited { background-color: #e33100; }
103
+ .red.awesome:hover { background-color: #872300; }
104
+ .magenta.awesome, .magenta.awesome:visited { background-color: #a9014b; }
105
+ .magenta.awesome:hover { background-color: #630030; }
106
+ .orange.awesome, .orange.awesome:visited { background-color: #ff5c00; }
107
+ .orange.awesome:hover { background-color: #d45500; }
108
+ .yellow.awesome, .yellow.awesome:visited { background-color: #ffb515; }
109
+ .yellow.awesome:hover { background-color: #fc9200; }
110
+
111
+ a.awesome:hover {
112
+ text-decoration: none;
113
+ }
114
+
115
+ /* ***************** HEADER ***************** */
116
+
117
+ div#header {
118
+ background-color: <%= dark_colour %>;
119
+ height: 92px;
120
+ padding: 2px 2px 0px 2px;
121
+ position: relative;
122
+ text-align: left;
123
+ }
124
+
125
+ div#header div#logged_in_summary {
126
+ position: absolute;
127
+ right: 20px;
128
+ top: 10px;
129
+ color: white;
130
+ font-size: 80%;
131
+ }
132
+
133
+ div#header div#logged_in_summary strong {
134
+ font-weight: bold;
135
+ font-size: 100%;
136
+ }
137
+
138
+ div#header h1 {
139
+ font-size: 18pt;
140
+ color: white;
141
+ font-weight: bold;
142
+ padding-top: 18px;
143
+ margin-left: 20px;
144
+ }
145
+
146
+ div#header h1 span {
147
+ color: <%= highlight_colour %>;
148
+ font-size: 80%;
149
+ }
150
+
151
+ /* ***************** MAIN NAVIGATION ***************** */
152
+
153
+ div#header ul#navigation {
154
+ margin: 0px;
155
+ padding: 0px;
156
+ position: absolute;
157
+ bottom: 0px;
158
+ left: 20px;
159
+ }
160
+
161
+ div#header ul#navigation li {
162
+ display: inline-block;
163
+ background-color: <%= light_colour %>;
164
+ }
165
+
166
+ div#header ul#navigation li a {
167
+ text-decoration: none;
168
+ display: inline-block;
169
+ padding: 4px;
170
+ color: <%= highlight_colour %>;
171
+ font-weight: bold;
172
+ }
173
+
174
+ div#header ul#navigation li.active a, div#header ul#navigation li a:hover {
175
+ background: #e5e5e5;
176
+ background: -webkit-gradient(linear, top left, bottom right, from(#fdfdfd), to(#e5e5e5));
177
+ background: -moz-linear-gradient(top left, #fdfdfd, #e5e5e5);
178
+ color: black;
179
+ }
180
+
181
+ /* ***************** SUB NAVIGATION ***************** */
182
+
183
+ div#header ul#subnavigation {
184
+ margin: 0px;
185
+ padding: 0px;
186
+ position: absolute;
187
+ bottom: 0px;
188
+ right: 20px;
189
+ }
190
+
191
+ div#header ul#subnavigation li {
192
+ display: inline-block;
193
+ background-color: <%= light_colour %>;
194
+ }
195
+
196
+ div#header ul#subnavigation li a {
197
+ text-decoration: none;
198
+ display: inline-block;
199
+ padding: 3px;
200
+ color: <%= highlight_colour %>;
201
+ font-weight: bold;
202
+ font-size: 90%;
203
+ }
204
+
205
+ div#header ul#subnavigation li.active a, div#header ul#subnavigation li a:hover {
206
+ background: #e5e5e5;
207
+ background: -webkit-gradient(linear, top left, bottom right, from(#fdfdfd), to(#e5e5e5));
208
+ background: -moz-linear-gradient(top left, #fdfdfd, #e5e5e5);
209
+ color: black;
210
+ }
211
+
212
+ /* ***************** SIDEBAR ***************** */
213
+
214
+ div#sidebar {
215
+ float: right;
216
+ width: 360px;
217
+ margin: 0px 20px 20px 20px;
218
+ }
219
+
220
+ div#sidebar div.card {
221
+ background: white;
222
+ box-shadow: 2px 2px 2px #888;
223
+ -moz-box-shadow:2px 2px 2px #888;
224
+ -webkit-box-shadow: 2px 2px 2px #888;
225
+ margin-top: 20px;
226
+ padding-bottom: 8px;
227
+ }
228
+
229
+ div#sidebar h2 {
230
+ background-color: <%= highlight_colour %>;
231
+ padding: 8px;
232
+ color: black;
233
+ font-weight: bold;
234
+ margin-top: 20px;
235
+ }
236
+
237
+ div#sidebar p {
238
+ padding: 8px 8px 0px 8px;
239
+ color: #333;
240
+ }
241
+
242
+ /* ***************** CONTENT ***************** */
243
+
244
+ div#content {
245
+ margin: 20px;
246
+ margin-right: 400px;
247
+ background: white;
248
+ padding: 20px;
249
+ box-shadow: 5px 5px 5px #888;
250
+ -moz-box-shadow:5px 5px 5px #888;
251
+ -webkit-box-shadow: 5px 5px 5px #888;
252
+ border-radius: 5px;
253
+ -moz-border-radius: 5px;
254
+ -webkit-border-radius: 5px;
255
+ }
256
+
257
+ div#content h1 {
258
+ margin: -20px -20px 20px -20px;
259
+ background: <%= highlight_colour %>;
260
+ padding: 10px 20px;
261
+ font-size: 15pt;
262
+ font-weight: bold;
263
+ color: black;
264
+ position: relative;
265
+ border-radius-topleft: 5px;
266
+ border-radius-topright: 5px;
267
+ -moz-border-radius-topleft: 5px;
268
+ -moz-border-radius-topright: 5px;
269
+ -webkit-border-top-left-radius: 5px;
270
+ -webkit-border-top-right-radius: 5px;
271
+ }
272
+
273
+ div#content h1 span {
274
+ position: absolute;
275
+ right: 20px;
276
+ top: 13px;
277
+ font-size: 80%;
278
+ font-weight: normal;
279
+ color: #d0d8eb;
280
+ }
281
+
282
+ div#content h2 {
283
+ font-weight: bold;
284
+ font-size: 120%;
285
+ color: black;
286
+ display: inline;
287
+ }
288
+
289
+ div#content p {
290
+ margin-bottom: 8px;
291
+ }
292
+
293
+ div.date_breakout {
294
+ margin-left: -20px;
295
+ padding-left: 20px;
296
+ color: #666666;
297
+ border-bottom: 1px solid #cccccc;
298
+ width: 150px;
299
+ text-transform: uppercase;
300
+ font-size: 8px;
301
+ font-weight: bold;
302
+ margin-bottom: 4px;
303
+ margin-top: 20px;
304
+ }
305
+
306
+ div.item {
307
+ border-bottom: 1px solid #efefef;
308
+ padding: 6px 0px;
309
+ }
310
+
311
+ div.summary {
312
+ float: right;
313
+ color: #999;
314
+ font-size: 80%;
315
+ }
316
+
317
+ div.summary strong {
318
+ color: #000;
319
+ font-size: 100%;
320
+ }
321
+
322
+
323
+ /* ***************** FORM ELEMENTS ***************** */
324
+
325
+ a.link_to_site {
326
+ border: 1px solid #ccc;
327
+ background-color: #f0f0f0;
328
+ color: #555;
329
+ padding: 5px;
330
+ color: #555;
331
+ display: block;
332
+ margin-bottom: 20px;
333
+ font-weight: bold;
334
+ }
335
+
336
+ a.link_to_site:hover {
337
+ background-color: #ccc;
338
+ color: white;
339
+ text-decoration: none;
340
+ }
341
+
342
+ form span.error {
343
+ color: #b72c23;
344
+ }
345
+
346
+ form div.formError {
347
+ color: #b72c23;
348
+ display: inline;
349
+ margin-left: 0.5em;
350
+ font-size: 110%;
351
+ }
352
+
353
+ form div.description {
354
+ color: #666666;
355
+ }
356
+
357
+ form div.input {
358
+ background-color: #f0f0f0;
359
+ padding: 6px;
360
+ margin-bottom: 20px;
361
+ }
362
+
363
+ form div.fieldWithErrors {
364
+ background-color: #b72c23;
365
+ margin: -6px;
366
+ padding: 6px;
367
+ }
368
+
369
+ form textarea {
370
+ width: 100%;
371
+ }
372
+
373
+ form input[type='text'] {
374
+ width: 99%;
375
+ }
376
+
377
+ /* ***************** FOOTER ***************** */
378
+
379
+ div#footer {
380
+ margin: 20px;
381
+ color: #aaa;
382
+ }
@@ -0,0 +1,46 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html>
4
+ <head>
5
+ <title><%%= @page_title || "Untitled" %> : <%= name %></title>
6
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
7
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.7.0/build/reset-fonts-grids/reset-fonts-grids.css">
8
+ <%%= javascript_include_tag 'admin' %>
9
+ <%%= stylesheet_link_tag 'admin' %>
10
+ </head>
11
+ <body>
12
+ <div id="header">
13
+ <%% if @current_user_name %>
14
+ <div id='logged_in_summary'>
15
+ Logged in as <strong><%%= @current_user_name %></strong>
16
+ <%% if @last_login_time %>
17
+ <br />Last login at <strong><%%= @last_login_time %></strong>
18
+ <%% end %>
19
+ </div>
20
+ <%% end %>
21
+ <h1><%= name %> <span><%%= @page_title %></h1>
22
+ <ul id='navigation'>
23
+ <%% ANDY_ADMIN_MENU.main_items_each(@current_section_id) do |name, link, section_id, css_class| %>
24
+ <li class='<%%= css_class %>'><a href='<%%= link %>' id='<%%= section_id %>'><%%= name %></a></li>
25
+ <%% end %>
26
+ </ul>
27
+ <ul id='subnavigation'>
28
+ <%% ANDY_ADMIN_MENU.sub_items_each(@current_section_id) do |name, link, section_id, css_class| %>
29
+ <li class='<%%= css_class %>'><a href='<%%= link %>' id='<%%= section_id %>'><%%= name %></a></li>
30
+ <%% end %>
31
+ </ul>
32
+ </div>
33
+ <%%= content_tag(:div, "<span>close</span>" + flash[:notice], :class => "flash_notice") if flash[:notice] %>
34
+ <%%= content_tag(:div, "<span>close</span>" + flash[:error], :class => "flash_error") if flash[:error] %>
35
+ <%%= content_tag(:div, "<span>close</span>" + flash[:warning], :class => "flash_warning") if flash[:warning] %>
36
+ <div id='sidebar'>
37
+ <%%= yield(:sidebar) %>
38
+ </div>
39
+ <div id='content'>
40
+ <%%= yield %>
41
+ </div>
42
+ <div id='footer'>
43
+ Designed and developed by Your Name. Copyright &copy; <%%= Time.now.year %>, all rights reserved.
44
+ </div>
45
+ </body>
46
+ </html>
@@ -0,0 +1,5 @@
1
+ $(function() {
2
+ $('div.flash_error span, div.flash_notice span, div.flash_warning span').live("click", function(){
3
+ $(this).parent().slideUp()
4
+ });
5
+ });
@@ -0,0 +1,10 @@
1
+ module AndyAdminHelper
2
+ def date_breakout(value)
3
+ @last_date ||= nil
4
+ date = value.strftime("%A, %e %B %Y")
5
+ if date != @last_date
6
+ @last_date = date
7
+ "<div class='date_breakout'>#{date}</div>"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require 'andy_admin/menu'
2
+ require 'andy_admin/form_builder'
3
+
4
+ ANDY_ADMIN_MENU = AndyAdmin::Menu.build do
5
+ main :test1, "Test 1", '/'
6
+ main :test2, "Test 2", '#'
7
+ main :test3, "Test 3", "/"
8
+ sub :test4, "Test 4 S"
9
+ sub :logout, "Logout"
10
+ end
@@ -0,0 +1,44 @@
1
+ class AndyAdmin::FormBuilder < ActionView::Helpers::FormBuilder
2
+ helpers = field_helpers +
3
+ %w{date_select datetime_select time_select check_box} +
4
+ %w{collection_select select country_select time_zone_select} -
5
+ %w{hidden_field label fields_for} # Don't decorate these
6
+
7
+ helpers.each do |name|
8
+ define_method(name) do |field_name, *args|
9
+ options = args.extract_options!
10
+ options[:title] ||= field_name.to_s.humanize
11
+ heading = "<h2>" + options[:title] + "</h2>"
12
+ heading += error_message_on(field_name, args)
13
+ description = if options[:description]
14
+ @template.content_tag(:div, options[:description], :class => "description")
15
+ else
16
+ ""
17
+ end
18
+ options.merge!({:class => name})
19
+ if name == "check_box"
20
+ label = label(field_name, options[:label])
21
+ input = @template.content_tag(:div, super(field_name, options) + " " + label, :class => 'input')
22
+ elsif name == "select"
23
+ input = @template.content_tag(:div, super(field_name, args[0], options), :class => 'input')
24
+ else
25
+ input = @template.content_tag(:div, super(field_name, options), :class => 'input')
26
+ end
27
+ @template.content_tag(:div, heading + description + input)
28
+ end
29
+ end
30
+
31
+ def actions
32
+ @template.concat @template.content_tag(:div, yield, :class => "actions")
33
+ end
34
+
35
+ def submit(label, *args)
36
+ options = args.extract_options!
37
+ options[:colour] ||= "green"
38
+ @template.content_tag(:button, label, :class => "awesome #{options[:colour]}", :type => "submit")
39
+ end
40
+
41
+ def cancel(label, link)
42
+ @template.content_tag(:a, label, :href => link)
43
+ end
44
+ end
@@ -0,0 +1,158 @@
1
+ /* ***************** GENERAL DEFINITIONS ***************** */
2
+
3
+ html, body {
4
+ background-color: #e5e5e5;
5
+ }
6
+
7
+ * {
8
+ font-size: 10pt;
9
+ text-align: left;
10
+ line-height: 1.2em;
11
+ }
12
+
13
+ a {
14
+ color: <%= light_colour %>;
15
+ text-decoration: none;
16
+ }
17
+
18
+ a:hover {
19
+ text-decoration: underline;
20
+ }
21
+
22
+ /* ***************** FLASH DEFINITIONS ***************** */
23
+
24
+ div.flash_error, div.flash_notice, div.flash_warning {
25
+ margin: -20px -20px 20px -20px;
26
+ padding: 10px;
27
+ color: white;
28
+ font-weight: bold;
29
+ }
30
+
31
+ div.flash_error {
32
+ background: #b72c23;
33
+ }
34
+
35
+ div.flash_notice {
36
+ background: #2bb723;
37
+ }
38
+
39
+ div.flash_warning {
40
+ color: black;
41
+ background: #e8ed2d;
42
+ }
43
+
44
+ /* ***************** AWESOME BUTTONS ***************** */
45
+
46
+ /* From: http://www.zurb.com/ */
47
+ .awesome, .awesome:visited {
48
+ background: #222 url(/images/admin-alert-overlay.png) repeat-x;
49
+ display: inline-block;
50
+ padding: 5px 10px 6px;
51
+ color: #fff;
52
+ text-decoration: none;
53
+ -moz-border-radius: 18px;
54
+ -webkit-border-radius: 18px;
55
+ -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.5);
56
+ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.5);
57
+ text-shadow: 0 -1px 1px rgba(0,0,0,0.25);
58
+ border: 0px;
59
+ border-bottom: 1px solid rgba(0,0,0,0.25);
60
+ position: relative;
61
+ cursor: pointer;
62
+ }
63
+
64
+ .awesome:hover { background-color: #111; color: #fff; }
65
+ .awesome:active { top: 1px; }
66
+ .small.awesome, .small.awesome:visited { font-size: 11px; padding: ; }
67
+ .awesome, .awesome:visited,
68
+ .medium.awesome, .medium.awesome:visited { font-size: 13px; font-weight: bold; line-height: 1; text-shadow: 0 -1px 1px rgba(0,0,0,0.25); }
69
+ .large.awesome, .large.awesome:visited { font-size: 14px; padding: 8px 14px 9px; }
70
+
71
+ .green.awesome, .green.awesome:visited { background-color: #91bd09; }
72
+ .green.awesome:hover { background-color: #749a02; }
73
+ .blue.awesome, .blue.awesome:visited { background-color: #2daebf; }
74
+ .blue.awesome:hover { background-color: #007d9a; }
75
+ .red.awesome, .red.awesome:visited { background-color: #e33100; }
76
+ .red.awesome:hover { background-color: #872300; }
77
+ .magenta.awesome, .magenta.awesome:visited { background-color: #a9014b; }
78
+ .magenta.awesome:hover { background-color: #630030; }
79
+ .orange.awesome, .orange.awesome:visited { background-color: #ff5c00; }
80
+ .orange.awesome:hover { background-color: #d45500; }
81
+ .yellow.awesome, .yellow.awesome:visited { background-color: #ffb515; }
82
+ .yellow.awesome:hover { background-color: #fc9200; }
83
+
84
+ a.awesome:hover {
85
+ text-decoration: none;
86
+ }
87
+
88
+ /* ***************** LOGIN FORM ***************** */
89
+
90
+ div#login {
91
+ width: 250px;
92
+ margin: 100px auto 50px auto;
93
+ background: white;
94
+ padding: 20px;
95
+ box-shadow: 5px 5px 5px #888;
96
+ -moz-box-shadow:5px 5px 5px #888;
97
+ -webkit-box-shadow: 5px 5px 5px #888;
98
+ border-radius: 5px;
99
+ -moz-border-radius: 5px;
100
+ -webkit-border-radius: 5px;
101
+ }
102
+
103
+ div#login h1 {
104
+ margin: -20px -20px 20px -20px;
105
+ background: <%= highlight_colour %>;
106
+ padding: 10px 20px;
107
+ font-size: 15pt;
108
+ font-weight: bold;
109
+ color: black;
110
+ position: relative;
111
+ border-radius-topleft: 5px;
112
+ border-radius-topright: 5px;
113
+ -moz-border-radius-topleft: 5px;
114
+ -moz-border-radius-topright: 5px;
115
+ -webkit-border-top-left-radius: 5px;
116
+ -webkit-border-top-right-radius: 5px;
117
+ }
118
+
119
+ /* ***************** FORM ELEMENTS ***************** */
120
+
121
+ form h2 {
122
+ font-weight: bold;
123
+ font-size: 120%;
124
+ color: black;
125
+ display: inline;
126
+ }
127
+
128
+ form span.error {
129
+ color: red;
130
+ }
131
+
132
+ form div.description {
133
+ color: #666666;
134
+ }
135
+
136
+ form div.input {
137
+ margin-bottom: 10px;
138
+ }
139
+
140
+ form textarea {
141
+ width: 100%;
142
+ }
143
+
144
+ form input[type='text'] {
145
+ width: 99%;
146
+ }
147
+
148
+ form div.actions {
149
+ margin-top: 20px;
150
+ }
151
+
152
+ /* ***************** FOOTER ***************** */
153
+
154
+ div#footer {
155
+ margin: 20px;
156
+ color: #aaa;
157
+ text-align: center;
158
+ }
@@ -0,0 +1,44 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html>
4
+ <head>
5
+ <title>Login : <%= name %></title>
6
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
7
+ <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.7.0/build/reset-fonts-grids/reset-fonts-grids.css">
8
+ <%%= javascript_include_tag 'login' %>
9
+ <%%= stylesheet_link_tag 'login' %>
10
+ </head>
11
+ <body>
12
+ <div id="login">
13
+ <h1><%= name %></h1>
14
+ <%%= content_tag(:div, flash[:notice], :class => "flash_notice") if flash[:notice] %>
15
+ <%%= content_tag(:div, flash[:error], :class => "flash_error") if flash[:error] %>
16
+ <%%= content_tag(:div, flash[:warning], :class => "flash_warning") if flash[:warning] %>
17
+ <div id='content'>
18
+ <!-- Extract from here to the yield to a view -->
19
+ <form action='/login' method='post'>
20
+ <input type='hidden' name='authenticity_token' value='<%%= form_authenticity_token %>' />
21
+ <h2>User name</h2>
22
+ <div class='input'>
23
+ <input type='text' name='user_name' />
24
+ </div>
25
+ <h2>Password</h2>
26
+ <div class='input'>
27
+ <input type='password' name='password' />
28
+ </div>
29
+ <div class='input'>
30
+ <input type='checkbox' name='remember_me' id='remember_me' /> <label for="remember_me">Remember me on this computer</label>
31
+ </div>
32
+
33
+ <div class='actions'>
34
+ <button class='awesome green' type='login'>Login</button>
35
+ </div>
36
+ </form>
37
+ <%%#= yield %>
38
+ </div>
39
+ </div>
40
+ <div id='footer'>
41
+ Designed and developed by Your Name. Copyright &copy; <%%= Time.now.year %>, all rights reserved.
42
+ </div>
43
+ </body>
44
+ </html>
File without changes
@@ -0,0 +1,38 @@
1
+ module AndyAdmin
2
+ class Menu
3
+ include Singleton
4
+
5
+ def self.build(&block)
6
+ instance.instance_eval(&block)
7
+ instance
8
+ end
9
+
10
+ def initialize
11
+ @main_items = []
12
+ @sub_items = []
13
+ end
14
+
15
+ def main(id, name, link=nil)
16
+ @main_items << {:name => name, :link => link, :id => id}
17
+ end
18
+
19
+ def sub(id, name, link=nil)
20
+ @sub_items << {:name => name, :link => link, :id => id}
21
+ end
22
+
23
+ def main_items_each(current)
24
+ @main_items.each do |item|
25
+ css_class = (item[:id] == current ? "active" : "")
26
+ yield(item[:name], item[:link], item[:id], css_class)
27
+ end
28
+ end
29
+
30
+ def sub_items_each(current)
31
+ @sub_items.each do |item|
32
+ css_class = (item[:id] == current ? "active" : "")
33
+ yield(item[:name], item[:link], item[:id], css_class)
34
+ end
35
+ end
36
+
37
+ end
38
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: andy_admin
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 2
9
+ version: 0.0.2
10
+ platform: ruby
11
+ authors:
12
+ - Andy Jeffries
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-08-11 00:00:00 +01:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rails
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 3
30
+ - 0
31
+ - rc
32
+ version: 3.0.rc
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ description: A generator for a nice admin style, like many other popular Rails-based sites
36
+ email: andy@andyjeffries.co.uk
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - lib/generators/andy_admin/andy_admin_generator.rb
45
+ - lib/generators/andy_admin/templates/admin.css
46
+ - lib/generators/andy_admin/templates/admin.html.erb
47
+ - lib/generators/andy_admin/templates/admin.js
48
+ - lib/generators/andy_admin/templates/alert-overlay.png
49
+ - lib/generators/andy_admin/templates/andy_admin_helper.rb
50
+ - lib/generators/andy_admin/templates/andy_admin_menu.rb
51
+ - lib/generators/andy_admin/templates/form_builder.rb
52
+ - lib/generators/andy_admin/templates/login.css
53
+ - lib/generators/andy_admin/templates/login.html.erb
54
+ - lib/generators/andy_admin/templates/login.js
55
+ - lib/generators/andy_admin/templates/menu.rb
56
+ has_rdoc: true
57
+ homepage: http://andyjeffries.co.uk
58
+ licenses: []
59
+
60
+ post_install_message:
61
+ rdoc_options: []
62
+
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ segments:
71
+ - 0
72
+ version: "0"
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ segments:
79
+ - 0
80
+ version: "0"
81
+ requirements: []
82
+
83
+ rubyforge_project:
84
+ rubygems_version: 1.3.7
85
+ signing_key:
86
+ specification_version: 3
87
+ summary: A generator for a nice admin style
88
+ test_files: []
89
+