the_role 1.5.1 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Bye_bye_CanCan_I_got_the_Role.png +0 -0
- data/README.md +82 -92
- data/app/assets/javascripts/admin_the_role.js +3 -0
- data/app/assets/javascripts/bootstrap-dropdown.js +100 -0
- data/app/assets/stylesheets/admin_the_role.css +7 -0
- data/app/assets/stylesheets/alerts.less +58 -0
- data/app/assets/stylesheets/button-groups.less +191 -0
- data/app/assets/stylesheets/buttons.less +191 -0
- data/app/assets/stylesheets/custom.scss +3 -0
- data/app/assets/stylesheets/dropdowns.less +143 -0
- data/app/assets/stylesheets/forms.less +583 -0
- data/app/assets/stylesheets/grid.less +5 -0
- data/app/assets/stylesheets/headers.scss +15 -0
- data/app/assets/stylesheets/layouts.less +17 -0
- data/app/assets/stylesheets/mix.scss +41 -0
- data/app/assets/stylesheets/mixins.less +646 -0
- data/app/assets/stylesheets/reset.css +117 -0
- data/app/assets/stylesheets/role_set.less +136 -0
- data/app/assets/stylesheets/scaffolding.less +29 -0
- data/app/assets/stylesheets/variables.less +206 -0
- data/app/assets/stylesheets/wells.less +27 -0
- data/app/controllers/admin/role_sections_controller.rb +40 -17
- data/app/controllers/admin/roles_controller.rb +8 -6
- data/app/views/admin/roles/_role.html.haml +53 -0
- data/app/views/admin/roles/_sidebar.html.haml +8 -0
- data/app/views/admin/roles/edit.html.haml +2 -42
- data/app/views/admin/roles/index.haml +2 -15
- data/app/views/admin/roles/new.html.haml +5 -4
- data/app/views/layouts/the_role.html.haml +24 -0
- data/config/routes.rb +5 -1
- data/lib/the_role/engine.rb +2 -2
- data/lib/the_role/hash.rb +50 -14
- data/lib/the_role/modules/base.rb +4 -4
- data/lib/the_role/modules/controller_requires.rb +4 -15
- data/lib/the_role/modules/role_model.rb +14 -13
- data/lib/the_role/param_helper.rb +15 -0
- data/lib/the_role/version.rb +1 -1
- data/lib/the_role.rb +13 -11
- data/pic.png +0 -0
- data/the_role.gemspec +5 -2
- metadata +58 -16
- data/app/assets/stylesheets/the_role/form.css +0 -57
- data/app/assets/stylesheets/the_role/headers.css.scss +0 -15
- data/app/assets/stylesheets/the_role/style.css.scss +0 -75
- data/lib/the_role/modules/param_helper.rb +0 -7
@@ -0,0 +1,117 @@
|
|
1
|
+
/*
|
2
|
+
zykin-ilya@ya.ru
|
3
|
+
github.com/the-teacher
|
4
|
+
Last modified: 19 mar 2012
|
5
|
+
|
6
|
+
GLOBAL font-size: 10px; (aka 62.5%)
|
7
|
+
provide identity of:
|
8
|
+
10px => 1em => 100%
|
9
|
+
15px => 1.5em => 150%
|
10
|
+
18px => 1.8em => 180%
|
11
|
+
*/
|
12
|
+
|
13
|
+
*{ margin: 0; padding: 0 }
|
14
|
+
|
15
|
+
/* all block elements */
|
16
|
+
article, aside, details, figcaption, figure, footer, header, hgroup,
|
17
|
+
menu, nav, section, html, head, body, address, blockquote, center, dir,
|
18
|
+
div, dl, fieldset, form, h1, h2, h3, h4, h5, h6, hr, isindex, menu, noframes, noscript,
|
19
|
+
ol, p, pre, table, ul{
|
20
|
+
border: 0;
|
21
|
+
outline: 0;
|
22
|
+
font-size: 10px;
|
23
|
+
line-height: 100%;
|
24
|
+
background: transparent;
|
25
|
+
vertical-align: baseline;
|
26
|
+
}
|
27
|
+
|
28
|
+
html{ background: white }
|
29
|
+
|
30
|
+
/* HTML5 INIT (experimental section) */
|
31
|
+
article, aside, details, figcaption, figure, footer,
|
32
|
+
header, hgroup, menu, nav, section{
|
33
|
+
display: block
|
34
|
+
}
|
35
|
+
canvas, video, audio[controls]{
|
36
|
+
display: inline-block;
|
37
|
+
*display: inline;
|
38
|
+
zoom: 1
|
39
|
+
}
|
40
|
+
audio{ display: none }
|
41
|
+
[hidden]{ display: none }
|
42
|
+
mark{ background: yellow; padding: 0 5px }
|
43
|
+
/* HTML5 INIT */
|
44
|
+
|
45
|
+
/* TABLES */
|
46
|
+
table, tr, th, td{
|
47
|
+
border-collapse: collapse;
|
48
|
+
vertical-align: top;
|
49
|
+
border-spacing: 0
|
50
|
+
}
|
51
|
+
th{ font-weight: bold }
|
52
|
+
/* TABLES */
|
53
|
+
|
54
|
+
/* LIST */
|
55
|
+
ol, ul{ list-style: none; margin: 0 }
|
56
|
+
li{ list-style-position: outside }
|
57
|
+
/* LIST */
|
58
|
+
|
59
|
+
img{ vertical-align: top }
|
60
|
+
|
61
|
+
a{ text-decoration: underline }
|
62
|
+
a:hover{ text-decoration: none }
|
63
|
+
a:hover, a:active { outline: 0 }
|
64
|
+
|
65
|
+
sup, sub{ font-size: 85%; zoom: 1 }
|
66
|
+
sup{ vertical-align: 40% }
|
67
|
+
sub{ vertical-align: -40% }
|
68
|
+
|
69
|
+
noscript{
|
70
|
+
background: red;
|
71
|
+
font-size: 2em;
|
72
|
+
padding: 5px;
|
73
|
+
color: white
|
74
|
+
}
|
75
|
+
|
76
|
+
/* CUSTOM */
|
77
|
+
p{ line-height: 1.35em }
|
78
|
+
label{ display: block }
|
79
|
+
|
80
|
+
.numered_list, .marked_list{ margin-left: 20px }
|
81
|
+
.numered_list li, .marked_list li{
|
82
|
+
list-style-position: outside;
|
83
|
+
margin-left: 15px;
|
84
|
+
padding-left: 5px
|
85
|
+
}
|
86
|
+
.numered_list li{ list-style-type: decimal }
|
87
|
+
.marked_list li{ list-style-type: disc }
|
88
|
+
|
89
|
+
.hidden { display: none }
|
90
|
+
.invisible{ visibility: hidden; height: 0 }
|
91
|
+
.visible { visibility: visible; height: auto }
|
92
|
+
|
93
|
+
/* Unbreakable */
|
94
|
+
.nobr{ white-space: nowrap }
|
95
|
+
|
96
|
+
/* For sliders building */
|
97
|
+
.nobr_item{
|
98
|
+
display: inline-block;
|
99
|
+
vertical-align: top;
|
100
|
+
*display: inline;
|
101
|
+
zoom: 1
|
102
|
+
}
|
103
|
+
|
104
|
+
:focus{ outline: 0 }
|
105
|
+
.u{ text-decoration: underline }
|
106
|
+
.overblock{ overflow: hidden; zoom: 1 }
|
107
|
+
.indicator, .stop_indicator{
|
108
|
+
position: absolute;
|
109
|
+
top: 0; left: 0;
|
110
|
+
z-index: 1000;
|
111
|
+
display: none
|
112
|
+
}
|
113
|
+
|
114
|
+
/* WebKit fixes */
|
115
|
+
@media screen and (-webkit-min-device-pixel-ratio:0){
|
116
|
+
/* display: inline-table; */
|
117
|
+
}
|
@@ -0,0 +1,136 @@
|
|
1
|
+
@import 'mixins';
|
2
|
+
@import 'variables';
|
3
|
+
|
4
|
+
@import 'buttons';
|
5
|
+
@import 'button-groups';
|
6
|
+
@import 'dropdowns';
|
7
|
+
|
8
|
+
@import "scaffolding.less";
|
9
|
+
@import "grid.less";
|
10
|
+
@import "layouts.less";
|
11
|
+
|
12
|
+
@import "forms.less";
|
13
|
+
@import "wells.less";
|
14
|
+
|
15
|
+
.well{
|
16
|
+
input{
|
17
|
+
margin-top: -4px;
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
.the_role{
|
22
|
+
width: 910px;
|
23
|
+
margin: auto;
|
24
|
+
margin-top: 10px;
|
25
|
+
h3{
|
26
|
+
margin-botoom: 0;
|
27
|
+
}
|
28
|
+
}
|
29
|
+
.sidebar, .content{
|
30
|
+
padding: 15px;
|
31
|
+
}
|
32
|
+
|
33
|
+
.sidebar{
|
34
|
+
p{
|
35
|
+
font-size: 1.5em;
|
36
|
+
margin-bottom: 10px;
|
37
|
+
.delete{
|
38
|
+
color: red;
|
39
|
+
margin-left: 10px;
|
40
|
+
}
|
41
|
+
}
|
42
|
+
p.new{
|
43
|
+
padding-top: 10px;
|
44
|
+
}
|
45
|
+
p.new a{
|
46
|
+
border-radius: 3px;
|
47
|
+
color: black;
|
48
|
+
padding: 3px 10px;
|
49
|
+
background: LightGreen;
|
50
|
+
}
|
51
|
+
p.new a:hover{
|
52
|
+
color: white;
|
53
|
+
padding: 3px 10px;
|
54
|
+
background: Green;
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
.content{
|
59
|
+
.well{
|
60
|
+
padding: 15px;
|
61
|
+
padding-bottom: 5px;
|
62
|
+
margin-bottom: 10px;
|
63
|
+
}
|
64
|
+
.description{
|
65
|
+
font-size: 1.5em;
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
.btn-group{
|
70
|
+
ul.dropdown-menu{
|
71
|
+
li.alert-success{
|
72
|
+
margin-bottom: 3px;
|
73
|
+
}
|
74
|
+
li.error a{
|
75
|
+
color: @errorText;
|
76
|
+
}
|
77
|
+
li.error a:hover{
|
78
|
+
color: @white;
|
79
|
+
background: @btnDangerBackgroundHighlight;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
.crusty{
|
85
|
+
border: 1px solid LightBlue;
|
86
|
+
margin-top: 15px;
|
87
|
+
margin-bottom: 30px;
|
88
|
+
padding: 10px;
|
89
|
+
|
90
|
+
.row [class*="span"]{
|
91
|
+
background: @white;
|
92
|
+
}
|
93
|
+
}
|
94
|
+
|
95
|
+
.dropdown-menu a{
|
96
|
+
font-size: 1.3em;
|
97
|
+
}
|
98
|
+
|
99
|
+
.section{
|
100
|
+
position: relative;
|
101
|
+
margin-bottom: 15px;
|
102
|
+
padding-bottom: 15px;
|
103
|
+
border-bottom: 1px solid Gray;
|
104
|
+
|
105
|
+
h3{
|
106
|
+
color: @grayDarker;
|
107
|
+
padding: 10px;
|
108
|
+
border-radius: 3px;
|
109
|
+
background: lighten(@btnInfoBackground, 18%);
|
110
|
+
}
|
111
|
+
.delete{
|
112
|
+
position: absolute;
|
113
|
+
top: 8px; right: 5px;
|
114
|
+
}
|
115
|
+
.rule{
|
116
|
+
background: red;
|
117
|
+
position: relative;
|
118
|
+
padding: 7px;
|
119
|
+
border-radius: 3px;
|
120
|
+
margin-bottom: 10px;
|
121
|
+
background: @tableBackgroundAccent;
|
122
|
+
|
123
|
+
h4{
|
124
|
+
margin-bottom: 0;
|
125
|
+
padding-left: 20px;
|
126
|
+
}
|
127
|
+
.controls{
|
128
|
+
position: absolute;
|
129
|
+
top: 2px; right: 0;
|
130
|
+
}
|
131
|
+
}
|
132
|
+
.rule:hover{
|
133
|
+
cursor: pointer;
|
134
|
+
background: darken(@tableBackgroundAccent, 15%);
|
135
|
+
}
|
136
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
// Scaffolding
|
2
|
+
// Basic and global styles for generating a grid system, structural layout, and page templates
|
3
|
+
// -------------------------------------------------------------------------------------------
|
4
|
+
|
5
|
+
|
6
|
+
// Body reset
|
7
|
+
// ----------
|
8
|
+
|
9
|
+
body {
|
10
|
+
margin: 0;
|
11
|
+
font-family: @baseFontFamily;
|
12
|
+
font-size: @baseFontSize;
|
13
|
+
line-height: @baseLineHeight;
|
14
|
+
color: @textColor;
|
15
|
+
background-color: @bodyBackground;
|
16
|
+
}
|
17
|
+
|
18
|
+
|
19
|
+
// Links
|
20
|
+
// -----
|
21
|
+
|
22
|
+
a {
|
23
|
+
color: @linkColor;
|
24
|
+
text-decoration: none;
|
25
|
+
}
|
26
|
+
a:hover {
|
27
|
+
color: @linkColorHover;
|
28
|
+
text-decoration: underline;
|
29
|
+
}
|
@@ -0,0 +1,206 @@
|
|
1
|
+
// Variables.less
|
2
|
+
// Variables to customize the look and feel of Bootstrap
|
3
|
+
// -----------------------------------------------------
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
// GLOBAL VALUES
|
8
|
+
// --------------------------------------------------
|
9
|
+
|
10
|
+
|
11
|
+
// Grays
|
12
|
+
// -------------------------
|
13
|
+
@black: #000;
|
14
|
+
@grayDarker: #222;
|
15
|
+
@grayDark: #333;
|
16
|
+
@gray: #555;
|
17
|
+
@grayLight: #999;
|
18
|
+
@grayLighter: #eee;
|
19
|
+
@white: #fff;
|
20
|
+
|
21
|
+
|
22
|
+
// Accent colors
|
23
|
+
// -------------------------
|
24
|
+
@blue: #049cdb;
|
25
|
+
@blueDark: #0064cd;
|
26
|
+
@green: #46a546;
|
27
|
+
@red: #9d261d;
|
28
|
+
@yellow: #ffc40d;
|
29
|
+
@orange: #f89406;
|
30
|
+
@pink: #c3325f;
|
31
|
+
@purple: #7a43b6;
|
32
|
+
|
33
|
+
|
34
|
+
// Scaffolding
|
35
|
+
// -------------------------
|
36
|
+
@bodyBackground: @white;
|
37
|
+
@textColor: @grayDark;
|
38
|
+
|
39
|
+
|
40
|
+
// Links
|
41
|
+
// -------------------------
|
42
|
+
@linkColor: #08c;
|
43
|
+
@linkColorHover: darken(@linkColor, 15%);
|
44
|
+
|
45
|
+
|
46
|
+
// Typography
|
47
|
+
// -------------------------
|
48
|
+
@sansFontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
49
|
+
@serifFontFamily: Georgia, "Times New Roman", Times, serif;
|
50
|
+
@monoFontFamily: Menlo, Monaco, Consolas, "Courier New", monospace;
|
51
|
+
|
52
|
+
@baseFontSize: 13px;
|
53
|
+
@baseFontFamily: @sansFontFamily;
|
54
|
+
@baseLineHeight: 18px;
|
55
|
+
@altFontFamily: @serifFontFamily;
|
56
|
+
|
57
|
+
@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily
|
58
|
+
@headingsFontWeight: bold; // instead of browser default, bold
|
59
|
+
@headingsColor: inherit; // empty to use BS default, @textColor
|
60
|
+
|
61
|
+
|
62
|
+
// Tables
|
63
|
+
// -------------------------
|
64
|
+
@tableBackground: transparent; // overall background-color
|
65
|
+
@tableBackgroundAccent: #f9f9f9; // for striping
|
66
|
+
@tableBackgroundHover: #f5f5f5; // for hover
|
67
|
+
@tableBorder: #ddd; // table and cell border
|
68
|
+
|
69
|
+
|
70
|
+
// Buttons
|
71
|
+
// -------------------------
|
72
|
+
@btnBackground: @white;
|
73
|
+
@btnBackgroundHighlight: darken(@white, 10%);
|
74
|
+
@btnBorder: #ccc;
|
75
|
+
|
76
|
+
@btnPrimaryBackground: @linkColor;
|
77
|
+
@btnPrimaryBackgroundHighlight: spin(@btnPrimaryBackground, 15%);
|
78
|
+
|
79
|
+
@btnInfoBackground: #5bc0de;
|
80
|
+
@btnInfoBackgroundHighlight: #2f96b4;
|
81
|
+
|
82
|
+
@btnSuccessBackground: #62c462;
|
83
|
+
@btnSuccessBackgroundHighlight: #51a351;
|
84
|
+
|
85
|
+
@btnWarningBackground: lighten(@orange, 15%);
|
86
|
+
@btnWarningBackgroundHighlight: @orange;
|
87
|
+
|
88
|
+
@btnDangerBackground: #ee5f5b;
|
89
|
+
@btnDangerBackgroundHighlight: #bd362f;
|
90
|
+
|
91
|
+
@btnInverseBackground: @gray;
|
92
|
+
@btnInverseBackgroundHighlight: @grayDarker;
|
93
|
+
|
94
|
+
|
95
|
+
// Forms
|
96
|
+
// -------------------------
|
97
|
+
@inputBackground: @white;
|
98
|
+
@inputBorder: #ccc;
|
99
|
+
@inputBorderRadius: 3px;
|
100
|
+
@inputDisabledBackground: @grayLighter;
|
101
|
+
@formActionsBackground: #f5f5f5;
|
102
|
+
|
103
|
+
// Dropdowns
|
104
|
+
// -------------------------
|
105
|
+
@dropdownBackground: @white;
|
106
|
+
@dropdownBorder: rgba(0,0,0,.2);
|
107
|
+
@dropdownLinkColor: @grayDark;
|
108
|
+
@dropdownLinkColorHover: @white;
|
109
|
+
@dropdownLinkBackgroundHover: @linkColor;
|
110
|
+
@dropdownDividerTop: #e5e5e5;
|
111
|
+
@dropdownDividerBottom: @white;
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
// COMPONENT VARIABLES
|
116
|
+
// --------------------------------------------------
|
117
|
+
|
118
|
+
// Z-index master list
|
119
|
+
// -------------------------
|
120
|
+
// Used for a bird's eye view of components dependent on the z-axis
|
121
|
+
// Try to avoid customizing these :)
|
122
|
+
@zindexDropdown: 1000;
|
123
|
+
@zindexPopover: 1010;
|
124
|
+
@zindexTooltip: 1020;
|
125
|
+
@zindexFixedNavbar: 1030;
|
126
|
+
@zindexModalBackdrop: 1040;
|
127
|
+
@zindexModal: 1050;
|
128
|
+
|
129
|
+
|
130
|
+
// Sprite icons path
|
131
|
+
// -------------------------
|
132
|
+
@iconSpritePath: "../img/glyphicons-halflings.png";
|
133
|
+
@iconWhiteSpritePath: "../img/glyphicons-halflings-white.png";
|
134
|
+
|
135
|
+
|
136
|
+
// Input placeholder text color
|
137
|
+
// -------------------------
|
138
|
+
@placeholderText: @grayLight;
|
139
|
+
|
140
|
+
|
141
|
+
// Hr border color
|
142
|
+
// -------------------------
|
143
|
+
@hrBorder: @grayLighter;
|
144
|
+
|
145
|
+
|
146
|
+
// Navbar
|
147
|
+
// -------------------------
|
148
|
+
@navbarHeight: 40px;
|
149
|
+
@navbarBackground: @grayDarker;
|
150
|
+
@navbarBackgroundHighlight: @grayDark;
|
151
|
+
|
152
|
+
@navbarText: @grayLight;
|
153
|
+
@navbarLinkColor: @grayLight;
|
154
|
+
@navbarLinkColorHover: @white;
|
155
|
+
@navbarLinkColorActive: @navbarLinkColorHover;
|
156
|
+
@navbarLinkBackgroundHover: transparent;
|
157
|
+
@navbarLinkBackgroundActive: @navbarBackground;
|
158
|
+
|
159
|
+
@navbarSearchBackground: lighten(@navbarBackground, 25%);
|
160
|
+
@navbarSearchBackgroundFocus: @white;
|
161
|
+
@navbarSearchBorder: darken(@navbarSearchBackground, 30%);
|
162
|
+
@navbarSearchPlaceholderColor: #ccc;
|
163
|
+
@navbarBrandColor: @navbarLinkColor;
|
164
|
+
|
165
|
+
|
166
|
+
// Hero unit
|
167
|
+
// -------------------------
|
168
|
+
@heroUnitBackground: @grayLighter;
|
169
|
+
@heroUnitHeadingColor: inherit;
|
170
|
+
@heroUnitLeadColor: inherit;
|
171
|
+
|
172
|
+
|
173
|
+
// Form states and alerts
|
174
|
+
// -------------------------
|
175
|
+
@warningText: #c09853;
|
176
|
+
@warningBackground: #fcf8e3;
|
177
|
+
@warningBorder: darken(spin(@warningBackground, -10), 3%);
|
178
|
+
|
179
|
+
@errorText: #b94a48;
|
180
|
+
@errorBackground: #f2dede;
|
181
|
+
@errorBorder: darken(spin(@errorBackground, -10), 3%);
|
182
|
+
|
183
|
+
@successText: #468847;
|
184
|
+
@successBackground: #dff0d8;
|
185
|
+
@successBorder: darken(spin(@successBackground, -10), 5%);
|
186
|
+
|
187
|
+
@infoText: #3a87ad;
|
188
|
+
@infoBackground: #d9edf7;
|
189
|
+
@infoBorder: darken(spin(@infoBackground, -10), 7%);
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
// GRID
|
194
|
+
// --------------------------------------------------
|
195
|
+
|
196
|
+
// Default 940px grid
|
197
|
+
// -------------------------
|
198
|
+
@gridColumns: 12;
|
199
|
+
@gridColumnWidth: 60px;
|
200
|
+
@gridGutterWidth: 20px;
|
201
|
+
@gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));
|
202
|
+
|
203
|
+
// Fluid grid
|
204
|
+
// -------------------------
|
205
|
+
@fluidGridColumnWidth: 6.382978723%;
|
206
|
+
@fluidGridGutterWidth: 2.127659574%;
|
@@ -0,0 +1,27 @@
|
|
1
|
+
// WELLS
|
2
|
+
// -----
|
3
|
+
|
4
|
+
.well {
|
5
|
+
min-height: 20px;
|
6
|
+
padding: 19px;
|
7
|
+
margin-bottom: 20px;
|
8
|
+
background-color: #f5f5f5;
|
9
|
+
border: 1px solid #eee;
|
10
|
+
border: 1px solid rgba(0,0,0,.05);
|
11
|
+
.border-radius(4px);
|
12
|
+
.box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
|
13
|
+
blockquote {
|
14
|
+
border-color: #ddd;
|
15
|
+
border-color: rgba(0,0,0,.15);
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
// Sizes
|
20
|
+
.well-large {
|
21
|
+
padding: 24px;
|
22
|
+
.border-radius(6px);
|
23
|
+
}
|
24
|
+
.well-small {
|
25
|
+
padding: 9px;
|
26
|
+
.border-radius(3px);
|
27
|
+
}
|
@@ -1,24 +1,48 @@
|
|
1
1
|
class Admin::RoleSectionsController < ApplicationController
|
2
2
|
include TheRole::Requires
|
3
|
+
layout 'the_role'
|
3
4
|
|
4
|
-
before_filter :
|
5
|
-
before_filter :
|
6
|
-
|
7
|
-
before_filter :
|
5
|
+
before_filter :login_required
|
6
|
+
before_filter :role_required
|
7
|
+
|
8
|
+
before_filter :role_find, :only => [:create, :create_rule, :rule_on, :rule_off, :destroy, :destroy_rule]
|
9
|
+
before_filter :owner_required, :only => [:create, :create_rule, :rule_on, :rule_off, :destroy, :destroy_rule]
|
8
10
|
|
9
11
|
def create
|
10
12
|
if @role.create_section params[:section_name]
|
11
|
-
flash[:notice] = t
|
12
|
-
redirect_to edit_admin_role_path
|
13
|
+
flash[:notice] = t 'the_role.section_created'
|
14
|
+
redirect_to edit_admin_role_path @role
|
13
15
|
else
|
14
16
|
render :action => :edit
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
18
20
|
def create_rule
|
19
|
-
if @role.create_rule
|
20
|
-
flash[:notice] = t
|
21
|
-
redirect_to edit_admin_role_path
|
21
|
+
if @role.create_rule params[:section_name], params[:rule_name]
|
22
|
+
flash[:notice] = t 'the_role.section_created'
|
23
|
+
redirect_to edit_admin_role_path @role
|
24
|
+
else
|
25
|
+
render :action => :edit
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def rule_on
|
30
|
+
section_name = params[:id]
|
31
|
+
rule_name = params[:name]
|
32
|
+
if @role.rule_on section_name, rule_name
|
33
|
+
flash[:notice] = t 'the_role.section_rule_on'
|
34
|
+
redirect_to edit_admin_role_path @role
|
35
|
+
else
|
36
|
+
render :action => :edit
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def rule_off
|
41
|
+
section_name = params[:id]
|
42
|
+
rule_name = params[:name]
|
43
|
+
if @role.rule_off section_name, rule_name
|
44
|
+
flash[:notice] = t 'the_role.section_rule_off'
|
45
|
+
redirect_to edit_admin_role_path @role
|
22
46
|
else
|
23
47
|
render :action => :edit
|
24
48
|
end
|
@@ -26,10 +50,9 @@ class Admin::RoleSectionsController < ApplicationController
|
|
26
50
|
|
27
51
|
def destroy
|
28
52
|
section_name = params[:id]
|
29
|
-
|
30
53
|
if @role.delete_section section_name
|
31
|
-
flash[:notice] = t
|
32
|
-
redirect_to edit_admin_role_path
|
54
|
+
flash[:notice] = t 'the_role.section_deleted'
|
55
|
+
redirect_to edit_admin_role_path @role
|
33
56
|
else
|
34
57
|
render :action => :edit
|
35
58
|
end
|
@@ -38,9 +61,9 @@ class Admin::RoleSectionsController < ApplicationController
|
|
38
61
|
def destroy_rule
|
39
62
|
section_name = params[:id]
|
40
63
|
rule_name = params[:name]
|
41
|
-
if @role.delete_rule
|
42
|
-
flash[:notice] = t
|
43
|
-
redirect_to edit_admin_role_path
|
64
|
+
if @role.delete_rule section_name, rule_name
|
65
|
+
flash[:notice] = t 'the_role.section_rule_deleted'
|
66
|
+
redirect_to edit_admin_role_path @role
|
44
67
|
else
|
45
68
|
render :action => :edit
|
46
69
|
end
|
@@ -50,6 +73,6 @@ class Admin::RoleSectionsController < ApplicationController
|
|
50
73
|
|
51
74
|
def role_find
|
52
75
|
@role = Role.find params[:role_id]
|
53
|
-
@
|
76
|
+
@ownership_checking_object = @role
|
54
77
|
end
|
55
|
-
end
|
78
|
+
end
|
@@ -1,10 +1,12 @@
|
|
1
1
|
class Admin::RolesController < ApplicationController
|
2
2
|
include TheRole::Requires
|
3
|
+
layout 'the_role'
|
3
4
|
|
4
|
-
before_filter :
|
5
|
-
before_filter :
|
6
|
-
|
7
|
-
before_filter :
|
5
|
+
before_filter :login_required
|
6
|
+
before_filter :role_required
|
7
|
+
|
8
|
+
before_filter :role_find, :only => [:edit, :update, :destroy]
|
9
|
+
before_filter :owner_required, :only => [:edit, :update, :destroy]
|
8
10
|
|
9
11
|
def index
|
10
12
|
@roles = Role.all(:order => "created_at ASC")
|
@@ -45,7 +47,7 @@ class Admin::RolesController < ApplicationController
|
|
45
47
|
|
46
48
|
def role_find
|
47
49
|
@role = Role.find params[:id]
|
48
|
-
@
|
50
|
+
@ownership_checking_object = @role
|
49
51
|
end
|
50
52
|
|
51
|
-
end
|
53
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
.well
|
2
|
+
%h3
|
3
|
+
%b Role name:
|
4
|
+
= role.name
|
5
|
+
|
6
|
+
%h5
|
7
|
+
%b Title:
|
8
|
+
= role.title
|
9
|
+
|
10
|
+
%p.description
|
11
|
+
%b Description of role:
|
12
|
+
= role.description
|
13
|
+
|
14
|
+
- role.to_hash.each_pair do |section, rules|
|
15
|
+
.section
|
16
|
+
%h3= section
|
17
|
+
.delete
|
18
|
+
.btn-group
|
19
|
+
= button_to 'Delete section', admin_role_section_path(role, section), :method => :delete, :class => 'btn btn-danger', :confirm => 'Are you sure?'
|
20
|
+
|
21
|
+
- rules.each_pair do |rule, value|
|
22
|
+
.rule
|
23
|
+
%h4
|
24
|
+
→
|
25
|
+
= rule
|
26
|
+
.controls
|
27
|
+
.btn-group
|
28
|
+
- klass = value ? :success : :info
|
29
|
+
- state = value ? :Enable : :Disable
|
30
|
+
%button{ :class => "btn btn-#{klass}" }= state
|
31
|
+
%button{ :class => "btn btn-#{klass} dropdown-toggle", 'data-toggle' => :dropdown }
|
32
|
+
%span.caret
|
33
|
+
%ul.dropdown-menu
|
34
|
+
%li.success= link_to 'Enable', rule_on_admin_role_section_path(role, section, :name => rule), :method => :put
|
35
|
+
%li.info= link_to 'Disable', rule_off_admin_role_section_path(role, section, :name => rule), :method => :put
|
36
|
+
%li.divider
|
37
|
+
%li.error= link_to 'Delete rule', destroy_rule_admin_role_section_path(role, section, :name => rule), :method => :delete, :confirm => 'Are you sure?'
|
38
|
+
|
39
|
+
%h4 Create new section
|
40
|
+
|
41
|
+
= form_tag admin_role_sections_path(role), :class => 'well form-inline' do |f|
|
42
|
+
= text_field_tag :section_name, '', :class => 'input-xlarge', :placeholder => "New Section Name"
|
43
|
+
= submit_tag 'Create Section', :class => :btn
|
44
|
+
|
45
|
+
%h4 Create new rule
|
46
|
+
|
47
|
+
= form_tag create_rule_admin_role_sections_path(role), :class => 'well form-inline' do |f|
|
48
|
+
%select.span3{ :name => :section_name }
|
49
|
+
- role.to_hash.each_pair do |section, rules|
|
50
|
+
%option{ :value => section }= section
|
51
|
+
|
52
|
+
= text_field_tag :rule_name, '', :class => 'input-large', :placeholder => "New Rule Name"
|
53
|
+
= submit_tag 'Create Rule', :class => :btn
|
@@ -0,0 +1,8 @@
|
|
1
|
+
- content_for :sidebar do
|
2
|
+
%h3= t '.roles_list'
|
3
|
+
- (@roles || Role.all).each do |role|
|
4
|
+
%p
|
5
|
+
= link_to role.title, edit_admin_role_url(role)
|
6
|
+
= link_to raw('×'), admin_role_url(role), :method => :delete, :title => role.title, :confirm => t('the_role.delete_role'), :class => :delete
|
7
|
+
|
8
|
+
%p.new= link_to t('.new_role'), new_admin_role_path
|