outpost-cms 0.0.3
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/MIT-LICENSE +20 -0
- data/README.md +295 -0
- data/Rakefile +26 -0
- data/app/assets/images/glyphicons-halflings-red.png +0 -0
- data/app/assets/javascripts/outpost/application.js +1 -0
- data/app/assets/javascripts/outpost/auto_slug_field.js.coffee +53 -0
- data/app/assets/javascripts/outpost/base.js.coffee +1 -0
- data/app/assets/javascripts/outpost/date_time_input.js.coffee +108 -0
- data/app/assets/javascripts/outpost/field_counter.js.coffee +93 -0
- data/app/assets/javascripts/outpost/field_manager.js.coffee +37 -0
- data/app/assets/javascripts/outpost/global_plugins.js.coffee +87 -0
- data/app/assets/javascripts/outpost/index_manager.js.coffee +88 -0
- data/app/assets/javascripts/outpost/notification.js.coffee +46 -0
- data/app/assets/javascripts/outpost/preview.js.coffee +60 -0
- data/app/assets/javascripts/outpost/templates/date_field.jst.eco +3 -0
- data/app/assets/javascripts/outpost/templates/loading.jst.eco +11 -0
- data/app/assets/javascripts/outpost/templates/slug_generate_button.jst.eco +1 -0
- data/app/assets/javascripts/outpost/templates/time_field.jst.eco +3 -0
- data/app/assets/javascripts/outpost/templates.js +1 -0
- data/app/assets/javascripts/outpost.js +32 -0
- data/app/assets/stylesheets/outpost/_base.css.scss +127 -0
- data/app/assets/stylesheets/outpost/_edit.css.scss +13 -0
- data/app/assets/stylesheets/outpost/_forms.css.scss +116 -0
- data/app/assets/stylesheets/outpost/_index.css.scss +68 -0
- data/app/assets/stylesheets/outpost/_utility.css.scss +16 -0
- data/app/assets/stylesheets/outpost/application.css.scss +1 -0
- data/app/assets/stylesheets/outpost/bootstrap/bootstrap.css.scss +49 -0
- data/app/assets/stylesheets/outpost/bootstrap/datepicker.css.scss +301 -0
- data/app/assets/stylesheets/outpost.css.scss +14 -0
- data/app/controllers/outpost/application_controller.rb +40 -0
- data/app/controllers/outpost/base_controller.rb +3 -0
- data/app/controllers/outpost/errors_controller.rb +9 -0
- data/app/controllers/outpost/home_controller.rb +2 -0
- data/app/controllers/outpost/resource_controller.rb +12 -0
- data/app/controllers/outpost/sessions_controller.rb +36 -0
- data/app/helpers/authorization_helper.rb +44 -0
- data/app/helpers/list_helper.rb +243 -0
- data/app/helpers/outpost_helper.rb +49 -0
- data/app/helpers/render_helper.rb +41 -0
- data/app/helpers/utility_helper.rb +136 -0
- data/app/inputs/date_time_input.rb +12 -0
- data/app/models/permission.rb +18 -0
- data/app/models/user_permission.rb +4 -0
- data/app/views/kaminari/bootstrap/_first_page.html.erb +3 -0
- data/app/views/kaminari/bootstrap/_gap.html.erb +3 -0
- data/app/views/kaminari/bootstrap/_last_page.html.erb +3 -0
- data/app/views/kaminari/bootstrap/_next_page.html.erb +3 -0
- data/app/views/kaminari/bootstrap/_page.html.erb +3 -0
- data/app/views/kaminari/bootstrap/_paginator.html.erb +17 -0
- data/app/views/kaminari/bootstrap/_prev_page.html.erb +3 -0
- data/app/views/layouts/outpost/application.html.erb +101 -0
- data/app/views/layouts/outpost/minimal.html.erb +26 -0
- data/app/views/outpost/errors/error_404.html.erb +1 -0
- data/app/views/outpost/errors/error_500.html.erb +8 -0
- data/app/views/outpost/home/dashboard.html.erb +1 -0
- data/app/views/outpost/resource/_errors.html.erb +11 -0
- data/app/views/outpost/resource/_extra_fields.html.erb +1 -0
- data/app/views/outpost/resource/_form_fields.html.erb +9 -0
- data/app/views/outpost/resource/edit.html.erb +44 -0
- data/app/views/outpost/resource/index.html.erb +22 -0
- data/app/views/outpost/resource/new.html.erb +21 -0
- data/app/views/outpost/resource/search.html.erb +1 -0
- data/app/views/outpost/resource/show.html.erb +1 -0
- data/app/views/outpost/sessions/new.html.erb +16 -0
- data/app/views/outpost/shared/_add_link.html.erb +1 -0
- data/app/views/outpost/shared/_breadcrumbs.html.erb +15 -0
- data/app/views/outpost/shared/_cancel_link.html.erb +1 -0
- data/app/views/outpost/shared/_columns.html.erb +5 -0
- data/app/views/outpost/shared/_filters.html.erb +16 -0
- data/app/views/outpost/shared/_flash_messages.html.erb +6 -0
- data/app/views/outpost/shared/_form_block.html.erb +18 -0
- data/app/views/outpost/shared/_form_nav.html.erb +12 -0
- data/app/views/outpost/shared/_headers.html.erb +16 -0
- data/app/views/outpost/shared/_index_header.html.erb +4 -0
- data/app/views/outpost/shared/_list_table.html.erb +7 -0
- data/app/views/outpost/shared/_modal.html.erb +16 -0
- data/app/views/outpost/shared/_navigation.html.erb +31 -0
- data/app/views/outpost/shared/_notice.html.erb +1 -0
- data/app/views/outpost/shared/_pagination.html.erb +2 -0
- data/app/views/outpost/shared/_preview_errors.html.erb +9 -0
- data/app/views/outpost/shared/_submit_row.html.erb +50 -0
- data/config/routes.rb +4 -0
- data/lib/action_view/helpers/form_builder.rb +71 -0
- data/lib/outpost/breadcrumbs.rb +73 -0
- data/lib/outpost/config.rb +63 -0
- data/lib/outpost/controller/actions.rb +72 -0
- data/lib/outpost/controller/authentication.rb +34 -0
- data/lib/outpost/controller/authorization.rb +28 -0
- data/lib/outpost/controller/callbacks.rb +14 -0
- data/lib/outpost/controller/custom_errors.rb +41 -0
- data/lib/outpost/controller/filtering.rb +22 -0
- data/lib/outpost/controller/helpers.rb +52 -0
- data/lib/outpost/controller/ordering.rb +46 -0
- data/lib/outpost/controller/preferences.rb +71 -0
- data/lib/outpost/controller.rb +123 -0
- data/lib/outpost/engine.rb +10 -0
- data/lib/outpost/helpers/naming.rb +22 -0
- data/lib/outpost/helpers.rb +6 -0
- data/lib/outpost/hook.rb +35 -0
- data/lib/outpost/list/base.rb +78 -0
- data/lib/outpost/list/column.rb +24 -0
- data/lib/outpost/list/filter.rb +37 -0
- data/lib/outpost/list.rb +15 -0
- data/lib/outpost/model/authentication.rb +34 -0
- data/lib/outpost/model/authorization.rb +32 -0
- data/lib/outpost/model/identifier.rb +39 -0
- data/lib/outpost/model/methods.rb +23 -0
- data/lib/outpost/model/naming.rb +63 -0
- data/lib/outpost/model/routing.rb +138 -0
- data/lib/outpost/model/serializer.rb +27 -0
- data/lib/outpost/model.rb +22 -0
- data/lib/outpost/test.rb +21 -0
- data/lib/outpost/version.rb +3 -0
- data/lib/outpost-cms.rb +2 -0
- data/lib/outpost.rb +80 -0
- data/lib/tasks/outpost_tasks.rake +7 -0
- data/spec/controllers/authentication_spec.rb +62 -0
- data/spec/controllers/sessions_controller_spec.rb +99 -0
- data/spec/factories.rb +31 -0
- data/spec/helpers/authorization_helper_spec.rb +47 -0
- data/spec/helpers/list_helper_spec.rb +74 -0
- data/spec/helpers/outpost_helper_spec.rb +5 -0
- data/spec/helpers/render_helper_spec.rb +19 -0
- data/spec/helpers/utility_helper_spec.rb +53 -0
- data/spec/internal/app/controllers/application_controller.rb +3 -0
- data/spec/internal/app/controllers/outpost/people_controller.rb +23 -0
- data/spec/internal/app/controllers/outpost/pidgeons_controller.rb +5 -0
- data/spec/internal/app/controllers/people_controller.rb +9 -0
- data/spec/internal/app/controllers/pidgeons_controller.rb +3 -0
- data/spec/internal/app/models/person.rb +10 -0
- data/spec/internal/app/models/pidgeon.rb +3 -0
- data/spec/internal/app/models/post.rb +4 -0
- data/spec/internal/app/models/user.rb +4 -0
- data/spec/internal/app/views/people/index.html.erb +7 -0
- data/spec/internal/app/views/people/show.html.erb +1 -0
- data/spec/internal/config/database.yml +3 -0
- data/spec/internal/config/initializers/configuration.rb +3 -0
- data/spec/internal/config/initializers/outpost.rb +6 -0
- data/spec/internal/config/routes.rb +16 -0
- data/spec/internal/db/combustion_test.sqlite +0 -0
- data/spec/internal/db/schema.rb +44 -0
- data/spec/internal/db/seeds.rb +14 -0
- data/spec/internal/log/test.log +59277 -0
- data/spec/internal/public/favicon.ico +0 -0
- data/spec/lib/breadcrumbs_spec.rb +54 -0
- data/spec/lib/config_spec.rb +76 -0
- data/spec/lib/controller/actions_spec.rb +5 -0
- data/spec/lib/controller/authorization_spec.rb +4 -0
- data/spec/lib/controller/callbacks_spec.rb +31 -0
- data/spec/lib/controller/helpers_spec.rb +33 -0
- data/spec/lib/controller_spec.rb +25 -0
- data/spec/lib/helpers/naming_spec.rb +10 -0
- data/spec/lib/hook_spec.rb +13 -0
- data/spec/lib/list/base_spec.rb +96 -0
- data/spec/lib/list/column_spec.rb +46 -0
- data/spec/lib/list/filter_spec.rb +44 -0
- data/spec/lib/model/authentication_spec.rb +29 -0
- data/spec/lib/model/authorization_spec.rb +66 -0
- data/spec/lib/model/identifier_spec.rb +51 -0
- data/spec/lib/model/methods_spec.rb +8 -0
- data/spec/lib/model/naming_spec.rb +55 -0
- data/spec/lib/model/routing_spec.rb +166 -0
- data/spec/lib/model/serializer_spec.rb +13 -0
- data/spec/lib/outpost_spec.rb +34 -0
- data/spec/models/permission_spec.rb +10 -0
- data/spec/models/user_permission_spec.rb +4 -0
- data/spec/spec_helper.rb +22 -0
- metadata +411 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Core variables and mixins
|
|
2
|
+
// Must be first
|
|
3
|
+
@import "bootstrap/variables"; // Modify this for custom colors, font-sizes, etc
|
|
4
|
+
@import "bootstrap/mixins";
|
|
5
|
+
|
|
6
|
+
// CSS Reset
|
|
7
|
+
@import "bootstrap/reset";
|
|
8
|
+
|
|
9
|
+
// Grid system and page structure
|
|
10
|
+
@import "bootstrap/scaffolding";
|
|
11
|
+
@import "bootstrap/grid";
|
|
12
|
+
@import "bootstrap/layouts";
|
|
13
|
+
|
|
14
|
+
// Base CSS
|
|
15
|
+
@import "bootstrap/type";
|
|
16
|
+
@import "bootstrap/code";
|
|
17
|
+
@import "bootstrap/forms";
|
|
18
|
+
@import "bootstrap/tables";
|
|
19
|
+
|
|
20
|
+
// Components: common
|
|
21
|
+
@import "bootstrap/sprites";
|
|
22
|
+
@import "bootstrap/dropdowns";
|
|
23
|
+
@import "bootstrap/wells";
|
|
24
|
+
@import "bootstrap/component-animations";
|
|
25
|
+
@import "bootstrap/close";
|
|
26
|
+
|
|
27
|
+
// Components: Buttons & Alerts
|
|
28
|
+
@import "bootstrap/buttons";
|
|
29
|
+
@import "bootstrap/button-groups";
|
|
30
|
+
@import "bootstrap/alerts"; // Note: alerts share common CSS with buttons and thus have styles in buttons
|
|
31
|
+
|
|
32
|
+
// Components: Nav
|
|
33
|
+
@import "bootstrap/navs";
|
|
34
|
+
@import "bootstrap/navbar";
|
|
35
|
+
@import "bootstrap/breadcrumbs";
|
|
36
|
+
@import "bootstrap/pagination";
|
|
37
|
+
@import "bootstrap/pager";
|
|
38
|
+
|
|
39
|
+
// Components: Popovers
|
|
40
|
+
@import "bootstrap/modals";
|
|
41
|
+
|
|
42
|
+
// Components: Misc
|
|
43
|
+
@import "bootstrap/labels-badges";
|
|
44
|
+
//@import "progress-bars";
|
|
45
|
+
|
|
46
|
+
// Utility classes
|
|
47
|
+
@import "bootstrap/utilities"; // Has to be last to override when necessary
|
|
48
|
+
|
|
49
|
+
@import "outpost/bootstrap/datepicker"
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Datepicker for Bootstrap
|
|
3
|
+
*
|
|
4
|
+
* Copyright 2012 Stefan Petre
|
|
5
|
+
* Improvements by Andrew Rowls
|
|
6
|
+
* Licensed under the Apache License v2.0
|
|
7
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
*
|
|
9
|
+
*/
|
|
10
|
+
.datepicker {
|
|
11
|
+
padding: 4px;
|
|
12
|
+
/* margin-top: 1px; */
|
|
13
|
+
-webkit-border-radius: 4px;
|
|
14
|
+
-moz-border-radius: 4px;
|
|
15
|
+
border-radius: 4px;
|
|
16
|
+
direction: ltr;
|
|
17
|
+
/*.dow {
|
|
18
|
+
border-top: 1px solid #ddd !important;
|
|
19
|
+
}*/
|
|
20
|
+
|
|
21
|
+
}
|
|
22
|
+
.datepicker-inline {
|
|
23
|
+
width: 220px;
|
|
24
|
+
}
|
|
25
|
+
.datepicker.datepicker-rtl {
|
|
26
|
+
direction: rtl;
|
|
27
|
+
}
|
|
28
|
+
.datepicker.datepicker-rtl table tr td span {
|
|
29
|
+
float: right;
|
|
30
|
+
}
|
|
31
|
+
.datepicker-dropdown {
|
|
32
|
+
top: 0;
|
|
33
|
+
left: 0;
|
|
34
|
+
}
|
|
35
|
+
.datepicker-dropdown:before {
|
|
36
|
+
content: '';
|
|
37
|
+
display: inline-block;
|
|
38
|
+
border-left: 7px solid transparent;
|
|
39
|
+
border-right: 7px solid transparent;
|
|
40
|
+
border-bottom: 7px solid #ccc;
|
|
41
|
+
border-bottom-color: rgba(0, 0, 0, 0.2);
|
|
42
|
+
position: absolute;
|
|
43
|
+
top: -7px;
|
|
44
|
+
left: 6px;
|
|
45
|
+
}
|
|
46
|
+
.datepicker-dropdown:after {
|
|
47
|
+
content: '';
|
|
48
|
+
display: inline-block;
|
|
49
|
+
border-left: 6px solid transparent;
|
|
50
|
+
border-right: 6px solid transparent;
|
|
51
|
+
border-bottom: 6px solid #ffffff;
|
|
52
|
+
position: absolute;
|
|
53
|
+
top: -6px;
|
|
54
|
+
left: 7px;
|
|
55
|
+
}
|
|
56
|
+
.datepicker > div {
|
|
57
|
+
display: none;
|
|
58
|
+
}
|
|
59
|
+
.datepicker.days div.datepicker-days {
|
|
60
|
+
display: block;
|
|
61
|
+
}
|
|
62
|
+
.datepicker.months div.datepicker-months {
|
|
63
|
+
display: block;
|
|
64
|
+
}
|
|
65
|
+
.datepicker.years div.datepicker-years {
|
|
66
|
+
display: block;
|
|
67
|
+
}
|
|
68
|
+
.datepicker table {
|
|
69
|
+
margin: 0;
|
|
70
|
+
}
|
|
71
|
+
.datepicker td,
|
|
72
|
+
.datepicker th {
|
|
73
|
+
text-align: center;
|
|
74
|
+
width: 20px;
|
|
75
|
+
height: 20px;
|
|
76
|
+
-webkit-border-radius: 4px;
|
|
77
|
+
-moz-border-radius: 4px;
|
|
78
|
+
border-radius: 4px;
|
|
79
|
+
border: none;
|
|
80
|
+
}
|
|
81
|
+
.table-striped .datepicker table tr td,
|
|
82
|
+
.table-striped .datepicker table tr th {
|
|
83
|
+
background-color: transparent;
|
|
84
|
+
}
|
|
85
|
+
.datepicker table tr td.day:hover {
|
|
86
|
+
background: #eeeeee;
|
|
87
|
+
cursor: pointer;
|
|
88
|
+
}
|
|
89
|
+
.datepicker table tr td.old,
|
|
90
|
+
.datepicker table tr td.new {
|
|
91
|
+
color: #999999;
|
|
92
|
+
}
|
|
93
|
+
.datepicker table tr td.disabled,
|
|
94
|
+
.datepicker table tr td.disabled:hover {
|
|
95
|
+
background: none;
|
|
96
|
+
color: #999999;
|
|
97
|
+
cursor: default;
|
|
98
|
+
}
|
|
99
|
+
.datepicker table tr td.today,
|
|
100
|
+
.datepicker table tr td.today:hover,
|
|
101
|
+
.datepicker table tr td.today.disabled,
|
|
102
|
+
.datepicker table tr td.today.disabled:hover {
|
|
103
|
+
background-color: #fde19a;
|
|
104
|
+
background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a);
|
|
105
|
+
background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a);
|
|
106
|
+
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
|
|
107
|
+
background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a);
|
|
108
|
+
background-image: -o-linear-gradient(top, #fdd49a, #fdf59a);
|
|
109
|
+
background-image: linear-gradient(top, #fdd49a, #fdf59a);
|
|
110
|
+
background-repeat: repeat-x;
|
|
111
|
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
|
|
112
|
+
border-color: #fdf59a #fdf59a #fbed50;
|
|
113
|
+
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
|
114
|
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
|
|
115
|
+
}
|
|
116
|
+
.datepicker table tr td.today:hover,
|
|
117
|
+
.datepicker table tr td.today:hover:hover,
|
|
118
|
+
.datepicker table tr td.today.disabled:hover,
|
|
119
|
+
.datepicker table tr td.today.disabled:hover:hover,
|
|
120
|
+
.datepicker table tr td.today:active,
|
|
121
|
+
.datepicker table tr td.today:hover:active,
|
|
122
|
+
.datepicker table tr td.today.disabled:active,
|
|
123
|
+
.datepicker table tr td.today.disabled:hover:active,
|
|
124
|
+
.datepicker table tr td.today.active,
|
|
125
|
+
.datepicker table tr td.today:hover.active,
|
|
126
|
+
.datepicker table tr td.today.disabled.active,
|
|
127
|
+
.datepicker table tr td.today.disabled:hover.active,
|
|
128
|
+
.datepicker table tr td.today.disabled,
|
|
129
|
+
.datepicker table tr td.today:hover.disabled,
|
|
130
|
+
.datepicker table tr td.today.disabled.disabled,
|
|
131
|
+
.datepicker table tr td.today.disabled:hover.disabled,
|
|
132
|
+
.datepicker table tr td.today[disabled],
|
|
133
|
+
.datepicker table tr td.today:hover[disabled],
|
|
134
|
+
.datepicker table tr td.today.disabled[disabled],
|
|
135
|
+
.datepicker table tr td.today.disabled:hover[disabled] {
|
|
136
|
+
background-color: #fdf59a;
|
|
137
|
+
}
|
|
138
|
+
.datepicker table tr td.today:active,
|
|
139
|
+
.datepicker table tr td.today:hover:active,
|
|
140
|
+
.datepicker table tr td.today.disabled:active,
|
|
141
|
+
.datepicker table tr td.today.disabled:hover:active,
|
|
142
|
+
.datepicker table tr td.today.active,
|
|
143
|
+
.datepicker table tr td.today:hover.active,
|
|
144
|
+
.datepicker table tr td.today.disabled.active,
|
|
145
|
+
.datepicker table tr td.today.disabled:hover.active {
|
|
146
|
+
background-color: #fbf069 \9;
|
|
147
|
+
}
|
|
148
|
+
.datepicker table tr td.active,
|
|
149
|
+
.datepicker table tr td.active:hover,
|
|
150
|
+
.datepicker table tr td.active.disabled,
|
|
151
|
+
.datepicker table tr td.active.disabled:hover {
|
|
152
|
+
background-color: #006dcc;
|
|
153
|
+
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
|
|
154
|
+
background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
|
|
155
|
+
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
|
|
156
|
+
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
|
|
157
|
+
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
|
|
158
|
+
background-image: linear-gradient(top, #0088cc, #0044cc);
|
|
159
|
+
background-repeat: repeat-x;
|
|
160
|
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
|
|
161
|
+
border-color: #0044cc #0044cc #002a80;
|
|
162
|
+
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
|
163
|
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
|
|
164
|
+
color: #fff;
|
|
165
|
+
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
|
166
|
+
}
|
|
167
|
+
.datepicker table tr td.active:hover,
|
|
168
|
+
.datepicker table tr td.active:hover:hover,
|
|
169
|
+
.datepicker table tr td.active.disabled:hover,
|
|
170
|
+
.datepicker table tr td.active.disabled:hover:hover,
|
|
171
|
+
.datepicker table tr td.active:active,
|
|
172
|
+
.datepicker table tr td.active:hover:active,
|
|
173
|
+
.datepicker table tr td.active.disabled:active,
|
|
174
|
+
.datepicker table tr td.active.disabled:hover:active,
|
|
175
|
+
.datepicker table tr td.active.active,
|
|
176
|
+
.datepicker table tr td.active:hover.active,
|
|
177
|
+
.datepicker table tr td.active.disabled.active,
|
|
178
|
+
.datepicker table tr td.active.disabled:hover.active,
|
|
179
|
+
.datepicker table tr td.active.disabled,
|
|
180
|
+
.datepicker table tr td.active:hover.disabled,
|
|
181
|
+
.datepicker table tr td.active.disabled.disabled,
|
|
182
|
+
.datepicker table tr td.active.disabled:hover.disabled,
|
|
183
|
+
.datepicker table tr td.active[disabled],
|
|
184
|
+
.datepicker table tr td.active:hover[disabled],
|
|
185
|
+
.datepicker table tr td.active.disabled[disabled],
|
|
186
|
+
.datepicker table tr td.active.disabled:hover[disabled] {
|
|
187
|
+
background-color: #0044cc;
|
|
188
|
+
}
|
|
189
|
+
.datepicker table tr td.active:active,
|
|
190
|
+
.datepicker table tr td.active:hover:active,
|
|
191
|
+
.datepicker table tr td.active.disabled:active,
|
|
192
|
+
.datepicker table tr td.active.disabled:hover:active,
|
|
193
|
+
.datepicker table tr td.active.active,
|
|
194
|
+
.datepicker table tr td.active:hover.active,
|
|
195
|
+
.datepicker table tr td.active.disabled.active,
|
|
196
|
+
.datepicker table tr td.active.disabled:hover.active {
|
|
197
|
+
background-color: #003399 \9;
|
|
198
|
+
}
|
|
199
|
+
.datepicker table tr td span {
|
|
200
|
+
display: block;
|
|
201
|
+
width: 23%;
|
|
202
|
+
height: 54px;
|
|
203
|
+
line-height: 54px;
|
|
204
|
+
float: left;
|
|
205
|
+
margin: 1%;
|
|
206
|
+
cursor: pointer;
|
|
207
|
+
-webkit-border-radius: 4px;
|
|
208
|
+
-moz-border-radius: 4px;
|
|
209
|
+
border-radius: 4px;
|
|
210
|
+
}
|
|
211
|
+
.datepicker table tr td span:hover {
|
|
212
|
+
background: #eeeeee;
|
|
213
|
+
}
|
|
214
|
+
.datepicker table tr td span.disabled,
|
|
215
|
+
.datepicker table tr td span.disabled:hover {
|
|
216
|
+
background: none;
|
|
217
|
+
color: #999999;
|
|
218
|
+
cursor: default;
|
|
219
|
+
}
|
|
220
|
+
.datepicker table tr td span.active,
|
|
221
|
+
.datepicker table tr td span.active:hover,
|
|
222
|
+
.datepicker table tr td span.active.disabled,
|
|
223
|
+
.datepicker table tr td span.active.disabled:hover {
|
|
224
|
+
background-color: #006dcc;
|
|
225
|
+
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
|
|
226
|
+
background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
|
|
227
|
+
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
|
|
228
|
+
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
|
|
229
|
+
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
|
|
230
|
+
background-image: linear-gradient(top, #0088cc, #0044cc);
|
|
231
|
+
background-repeat: repeat-x;
|
|
232
|
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
|
|
233
|
+
border-color: #0044cc #0044cc #002a80;
|
|
234
|
+
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
|
235
|
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
|
|
236
|
+
color: #fff;
|
|
237
|
+
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
|
238
|
+
}
|
|
239
|
+
.datepicker table tr td span.active:hover,
|
|
240
|
+
.datepicker table tr td span.active:hover:hover,
|
|
241
|
+
.datepicker table tr td span.active.disabled:hover,
|
|
242
|
+
.datepicker table tr td span.active.disabled:hover:hover,
|
|
243
|
+
.datepicker table tr td span.active:active,
|
|
244
|
+
.datepicker table tr td span.active:hover:active,
|
|
245
|
+
.datepicker table tr td span.active.disabled:active,
|
|
246
|
+
.datepicker table tr td span.active.disabled:hover:active,
|
|
247
|
+
.datepicker table tr td span.active.active,
|
|
248
|
+
.datepicker table tr td span.active:hover.active,
|
|
249
|
+
.datepicker table tr td span.active.disabled.active,
|
|
250
|
+
.datepicker table tr td span.active.disabled:hover.active,
|
|
251
|
+
.datepicker table tr td span.active.disabled,
|
|
252
|
+
.datepicker table tr td span.active:hover.disabled,
|
|
253
|
+
.datepicker table tr td span.active.disabled.disabled,
|
|
254
|
+
.datepicker table tr td span.active.disabled:hover.disabled,
|
|
255
|
+
.datepicker table tr td span.active[disabled],
|
|
256
|
+
.datepicker table tr td span.active:hover[disabled],
|
|
257
|
+
.datepicker table tr td span.active.disabled[disabled],
|
|
258
|
+
.datepicker table tr td span.active.disabled:hover[disabled] {
|
|
259
|
+
background-color: #0044cc;
|
|
260
|
+
}
|
|
261
|
+
.datepicker table tr td span.active:active,
|
|
262
|
+
.datepicker table tr td span.active:hover:active,
|
|
263
|
+
.datepicker table tr td span.active.disabled:active,
|
|
264
|
+
.datepicker table tr td span.active.disabled:hover:active,
|
|
265
|
+
.datepicker table tr td span.active.active,
|
|
266
|
+
.datepicker table tr td span.active:hover.active,
|
|
267
|
+
.datepicker table tr td span.active.disabled.active,
|
|
268
|
+
.datepicker table tr td span.active.disabled:hover.active {
|
|
269
|
+
background-color: #003399 \9;
|
|
270
|
+
}
|
|
271
|
+
.datepicker table tr td span.old {
|
|
272
|
+
color: #999999;
|
|
273
|
+
}
|
|
274
|
+
.datepicker th.switch {
|
|
275
|
+
width: 145px;
|
|
276
|
+
}
|
|
277
|
+
.datepicker thead tr:first-child th,
|
|
278
|
+
.datepicker tfoot tr:first-child th {
|
|
279
|
+
cursor: pointer;
|
|
280
|
+
}
|
|
281
|
+
.datepicker thead tr:first-child th:hover,
|
|
282
|
+
.datepicker tfoot tr:first-child th:hover {
|
|
283
|
+
background: #eeeeee;
|
|
284
|
+
}
|
|
285
|
+
.datepicker .cw {
|
|
286
|
+
font-size: 10px;
|
|
287
|
+
width: 12px;
|
|
288
|
+
padding: 0 2px 0 5px;
|
|
289
|
+
vertical-align: middle;
|
|
290
|
+
}
|
|
291
|
+
.datepicker thead tr:first-child th.cw {
|
|
292
|
+
cursor: default;
|
|
293
|
+
background-color: transparent;
|
|
294
|
+
}
|
|
295
|
+
.input-append.date .add-on i,
|
|
296
|
+
.input-prepend.date .add-on i {
|
|
297
|
+
display: block;
|
|
298
|
+
cursor: pointer;
|
|
299
|
+
width: 16px;
|
|
300
|
+
height: 16px;
|
|
301
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
$gridColumnWidth: 75px;
|
|
2
|
+
$navOffset: 40px;
|
|
3
|
+
$breadcrumbOffset: 36px;
|
|
4
|
+
$iconRedSpritePath: 'glyphicons-halflings-red.png';
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@import "outpost/bootstrap/bootstrap";
|
|
8
|
+
@import "select2";
|
|
9
|
+
|
|
10
|
+
@import "outpost/base";
|
|
11
|
+
@import "outpost/edit";
|
|
12
|
+
@import "outpost/forms";
|
|
13
|
+
@import "outpost/index";
|
|
14
|
+
@import "outpost/utility";
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Outpost
|
|
2
|
+
class ApplicationController < ActionController::Base
|
|
3
|
+
include Outpost::Breadcrumbs
|
|
4
|
+
include Outpost::Controller::Authorization
|
|
5
|
+
include Outpost::Controller::Authentication
|
|
6
|
+
include Outpost::Controller::CustomErrors
|
|
7
|
+
|
|
8
|
+
abstract!
|
|
9
|
+
protect_from_forgery
|
|
10
|
+
before_filter :root_breadcrumb
|
|
11
|
+
before_filter :set_sections
|
|
12
|
+
|
|
13
|
+
#------------------------
|
|
14
|
+
# Always want to add this link to the Breadcrumbs
|
|
15
|
+
def root_breadcrumb
|
|
16
|
+
breadcrumb "Outpost", outpost_root_path
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
#----------------------
|
|
20
|
+
|
|
21
|
+
def set_sections
|
|
22
|
+
@sections = {}
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
#----------------------
|
|
26
|
+
|
|
27
|
+
def with_rollback(object)
|
|
28
|
+
object.transaction do
|
|
29
|
+
yield if block_given?
|
|
30
|
+
raise ActiveRecord::Rollback
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
#----------------------
|
|
35
|
+
|
|
36
|
+
def render_preview_validation_errors(record)
|
|
37
|
+
render "/outpost/shared/_preview_errors", layout: "outpost/minimal", locals: { record: record }
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module Outpost
|
|
2
|
+
class ResourceController < Outpost::BaseController
|
|
3
|
+
before_filter :extend_breadcrumbs_with_resource_root
|
|
4
|
+
respond_to :html, :json, :js
|
|
5
|
+
|
|
6
|
+
#-----------------
|
|
7
|
+
|
|
8
|
+
def extend_breadcrumbs_with_resource_root
|
|
9
|
+
breadcrumb model.to_title.pluralize, model.admin_index_path
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module Outpost
|
|
2
|
+
class SessionsController < Outpost::BaseController
|
|
3
|
+
skip_before_filter :require_login
|
|
4
|
+
before_filter :get_authentication_attribute
|
|
5
|
+
|
|
6
|
+
respond_to :html
|
|
7
|
+
|
|
8
|
+
def new
|
|
9
|
+
redirect_to outpost_root_path if current_user
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def create
|
|
13
|
+
if user = Outpost.user_class.authenticate(params[@authentication_attribute], params[:password])
|
|
14
|
+
session[:user_id] = user.id
|
|
15
|
+
user.update_column(:last_login, Time.now)
|
|
16
|
+
redirect_to session[:return_to] || outpost_root_path, notice: "Logged in."
|
|
17
|
+
session[:return_to] = nil
|
|
18
|
+
else
|
|
19
|
+
flash.now[:alert] = "Invalid login information."
|
|
20
|
+
render :new
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def destroy
|
|
25
|
+
@current_user = nil
|
|
26
|
+
session[:user_id] = nil
|
|
27
|
+
redirect_to outpost_login_path, notice: "Logged Out."
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def get_authentication_attribute
|
|
33
|
+
@authentication_attribute = Outpost.config.authentication_attribute
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module AuthorizationHelper
|
|
2
|
+
# Public: Block out whole chunks of code based on permissions.
|
|
3
|
+
#
|
|
4
|
+
# resource - (Class) The model that the user must have permission
|
|
5
|
+
# to manage in order to see the block.
|
|
6
|
+
# message - (String) The message to display if the user isn't
|
|
7
|
+
# authorized (default: "").
|
|
8
|
+
# block - The block that will be captured if the user is authorized.
|
|
9
|
+
# Should return a String.
|
|
10
|
+
#
|
|
11
|
+
# Examples
|
|
12
|
+
#
|
|
13
|
+
# <%= guard Post, "You do not have permission to view this" do %>
|
|
14
|
+
# <%= @post.headline %>
|
|
15
|
+
# <% end %>
|
|
16
|
+
#
|
|
17
|
+
# Returns String of either the message or the captured block.
|
|
18
|
+
def guard(resource, message=nil, &block)
|
|
19
|
+
if current_user.can_manage?(resource)
|
|
20
|
+
capture(&block)
|
|
21
|
+
else
|
|
22
|
+
message.to_s
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Public: Conditionally link text based on permissions.
|
|
27
|
+
#
|
|
28
|
+
# resource - (Class) The model that the user must have permission
|
|
29
|
+
# to manage in order to see the link.
|
|
30
|
+
# args - Arguments to be passed directly to +link_to+ if necessary.
|
|
31
|
+
#
|
|
32
|
+
# Examples
|
|
33
|
+
#
|
|
34
|
+
# <%= guarded_link_to Post, @post.headline, edit_post_path(@post) %>
|
|
35
|
+
#
|
|
36
|
+
# Returns String of either a link tag, or just the link title.
|
|
37
|
+
def guarded_link_to(resource, *args)
|
|
38
|
+
if current_user.can_manage?(resource)
|
|
39
|
+
link_to *args
|
|
40
|
+
else
|
|
41
|
+
args[0] # Just the link title
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|