cl-admin 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +34 -0
- data/app/assets/javascripts/cl_admin/application.js +16 -0
- data/app/assets/javascripts/cl_admin/datatables.js +3 -0
- data/app/assets/javascripts/cl_admin/vendor/jquery.dataTables.js +14839 -0
- data/app/assets/stylesheets/cl_admin/application.scss +16 -0
- data/app/assets/stylesheets/cl_admin/bootstrap-dashboard.scss +63 -0
- data/app/assets/stylesheets/cl_admin/bootstrap_overrides.scss +10 -0
- data/app/assets/stylesheets/cl_admin/buttons.scss +14 -0
- data/app/assets/stylesheets/cl_admin/dataTables.scss +476 -0
- data/app/assets/stylesheets/cl_admin/sidebar.scss +47 -0
- data/app/assets/stylesheets/cl_admin/utility.scss +0 -0
- data/app/assets/stylesheets/cl_admin/variables.scss +19 -0
- data/app/controllers/cl_admin/application_controller.rb +5 -0
- data/app/controllers/cl_admin/dashboard_controller.rb +7 -0
- data/app/controllers/cl_admin/resources_controller.rb +50 -0
- data/app/helpers/cl_admin/application_helper.rb +4 -0
- data/app/helpers/cl_admin/resources_helper.rb +4 -0
- data/app/views/cl_admin/dashboard/index.html.erb +23 -0
- data/app/views/cl_admin/resources/_form.html.erb +6 -0
- data/app/views/cl_admin/resources/index.html.erb +30 -0
- data/app/views/cl_admin/resources/new.html.erb +9 -0
- data/app/views/cl_admin/resources/show.html.erb +20 -0
- data/app/views/layouts/cl_admin/application.html.erb +74 -0
- data/config/routes.rb +7 -0
- data/lib/cl_admin.rb +18 -0
- data/lib/cl_admin/configuration.rb +13 -0
- data/lib/cl_admin/engine.rb +5 -0
- data/lib/cl_admin/resource.rb +77 -0
- data/lib/cl_admin/resource/field.rb +32 -0
- data/lib/cl_admin/simple_form.rb +168 -0
- data/lib/cl_admin/version.rb +3 -0
- data/lib/tasks/cl_admin_tasks.rake +4 -0
- data/test/cl_admin_test.rb +7 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/assets/stylesheets/scaffold.css +56 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/thing.rb +2 -0
- data/test/dummy/app/models/widget.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +23 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +78 -0
- data/test/dummy/config/environments/test.rb +39 -0
- data/test/dummy/config/initializers/assets.rb +8 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cl_admin.rb +15 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +3 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20150128203934_create_widgets.rb +11 -0
- data/test/dummy/db/migrate/20150128221526_create_things.rb +10 -0
- data/test/dummy/db/schema.rb +31 -0
- data/test/dummy/log/development.log +35213 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/test/fixtures/things.yml +9 -0
- data/test/dummy/test/fixtures/widgets.yml +11 -0
- data/test/dummy/test/models/thing_test.rb +7 -0
- data/test/dummy/test/models/widget_test.rb +7 -0
- data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/application.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/bootstrap-dashboard.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/bootstrap_overrides.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/buttons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/dataTables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/nav-sidebar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/sidebar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/utility.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/variables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_alerts.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_badges.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_breadcrumbs.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_button-groups.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_carousel.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_close.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_code.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_component-animations.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_dropdowns.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_glyphicons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_input-groups.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_jumbotron.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_labels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_list-group.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_media.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_mixins.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_modals.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_navbar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_navs.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_normalize.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_pager.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_panels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_popovers.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_print.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_progress-bars.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_responsive-embed.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_responsive-utilities.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_scaffolding.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_tables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_thumbnails.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_tooltip.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_type.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_utilities.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_variables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_wells.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/b92dbf189012ed16682faff674922d38a147d711/_bootstrap-sprockets.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/b92dbf189012ed16682faff674922d38a147d711/_bootstrap.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_alerts.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_background-variant.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_border-radius.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_center-block.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_clearfix.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_gradients.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_grid-framework.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_hide-text.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_image.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_labels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_list-group.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_nav-divider.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_nav-vertical-align.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_opacity.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_panels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_progress-bar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_reset-filter.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_resize.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_responsive-visibility.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_size.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_tab-focus.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_table-row.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_text-emphasis.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_text-overflow.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_vendor-prefixes.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/eaf2b3ba15346b0c73619d2ad3ae7fcdaf0aa56a/bootstrap-dashboard.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/0682d76393eff7c31b20bbd3eba49fc8 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/1fac683c0f668a2a7fd4ea1062b39fbf +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/20b34331df4be4854889a3c23377f45e +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3553ed1f1b382b6b9bcc518b810b271b +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/36f8ae187aff06bd327a0da82211ee0d +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3ddfe27fc34861ca04ca66a0c208c22c +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/45171cfb63e99073564e0b228ac28041 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/50483055a8f88061f7d914fa626c5352 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/59d3c4356501b88041da3f30a13e79b6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5e5f5b6a9fadf420dcf484d703d04112 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5f31826a3e67ae3c19ad896764e142f2 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/67ab6ab97c6f1be9661cec5fb1fe1bdc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/6b48cbb5b69311776bf647f5441b8261 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/73076af09d2cc309d096d788850449d6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7dcfdb7c49f7e376d6f39367b09fbf5b +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/855025ccf2d78ca8086c71dbd05ddb80 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/860a9b5297964d6c08619dad24f8cad0 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/8ac30b42f441d7367b119073c8906c78 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/93d5e5770edc2798869f9b91fdf3d4b6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/9a36c88175eb86f93cfc7fc7735e0043 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a1d20140ba285327c174b822dc148de2 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a25f613a8ecc416a21920d5066359695 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ac73d5c7b73b96c8bcaac0821ac18c89 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b28ce637ebd1a320b66c1f8df1c38b96 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b5e5faf9bf347d0e0a85cf07fe8222a3 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/bb9a1e25b5312dc605a09b6789849fdf +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/bbd03989b5854f9ac01c0fe45267492c +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/c219a250b8b465cb233748d3c4bb7288 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/cbe8158164315b4f1d1b81ff224c0ef4 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d5a89fee789601bd5eefc3a114a80745 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d659ac88af9b82c8f1f5d6188aa9e71a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d6c1da9ef1be9fb5132d4dc6a04f95eb +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/db41ba23a87bb0501594066bbe6306d6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ead728b75839b122c1534a25c900d55c +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ee6cfea76b27b0352119a739b66636ad +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/eef986a2fcad7c282086103c05fcf9a7 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f32f682108ad3b7c90921211cfedf112 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f403f6c6e97ccddaf5687f4d36860635 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f56098ce403bc1978064a814465248d4 +0 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/test_helper.rb +19 -0
- metadata +513 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
.sidebar {
|
2
|
+
}
|
3
|
+
|
4
|
+
/* Hide for mobile, show later */
|
5
|
+
.sidebar {
|
6
|
+
display: none;
|
7
|
+
}
|
8
|
+
@media (min-width: 768px) {
|
9
|
+
.sidebar {
|
10
|
+
background-color: $gray-dark;
|
11
|
+
color: $gray-light;
|
12
|
+
position: fixed;
|
13
|
+
top: 50px;
|
14
|
+
bottom: 0;
|
15
|
+
left: 0;
|
16
|
+
z-index: 1000;
|
17
|
+
display: block;
|
18
|
+
padding: 20px;
|
19
|
+
overflow-x: hidden;
|
20
|
+
overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
|
21
|
+
border-right: 1px solid #eee;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
/* Sidebar navigation */
|
26
|
+
.nav-sidebar {
|
27
|
+
margin-right: -21px; /* 20px padding + 1px border */
|
28
|
+
margin-bottom: 20px;
|
29
|
+
margin-left: -20px;
|
30
|
+
}
|
31
|
+
.nav-sidebar > li > a {
|
32
|
+
padding-right: 20px;
|
33
|
+
padding-left: 20px;
|
34
|
+
color: $gray-light;
|
35
|
+
|
36
|
+
&:hover {
|
37
|
+
color: $gray-light;
|
38
|
+
background-color: rgba(0,0,0,.2);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
.nav-sidebar > .active > a,
|
42
|
+
.nav-sidebar > .active > a:hover,
|
43
|
+
.nav-sidebar > .active > a:focus {
|
44
|
+
color: $gray-light;
|
45
|
+
background-color: rgba(0,0,0,.4);
|
46
|
+
}
|
47
|
+
|
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
$gray-light: #89949B;
|
2
|
+
$gray-med: #B4B7B9;
|
3
|
+
$gray-dark: #273135;
|
4
|
+
|
5
|
+
$green-med: #55C9A6;
|
6
|
+
$green-dark: #5cb85c;
|
7
|
+
|
8
|
+
$red-med: #EA7882;
|
9
|
+
$red-dark: #d9534f;
|
10
|
+
|
11
|
+
$blue-light: #5bc0de;
|
12
|
+
$blue-med: #79B0EC;
|
13
|
+
$blue-dark: #428bca;
|
14
|
+
|
15
|
+
$purple-med: #B4A1DD;
|
16
|
+
|
17
|
+
$pink-med: #E394B3;
|
18
|
+
|
19
|
+
$orange-dark: #f0ad4e;
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module ClAdmin
|
2
|
+
class ResourcesController < ApplicationController
|
3
|
+
def index
|
4
|
+
admin_resource
|
5
|
+
end
|
6
|
+
|
7
|
+
def new
|
8
|
+
@resource = resource_class.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def create
|
12
|
+
@resource = resource_class.create(resource_params)
|
13
|
+
redirect_to @resource, notice: "#{admin_resource.name} was successfully created."
|
14
|
+
end
|
15
|
+
|
16
|
+
def show
|
17
|
+
@resource = resource_class.find(params[:id])
|
18
|
+
end
|
19
|
+
|
20
|
+
def resource_class
|
21
|
+
@resource_class ||= admin_resource.model
|
22
|
+
end
|
23
|
+
helper_method :resource_class
|
24
|
+
|
25
|
+
def resources
|
26
|
+
@resources ||= resource_class.all
|
27
|
+
end
|
28
|
+
helper_method :resources
|
29
|
+
|
30
|
+
def resource
|
31
|
+
@resource ||= resource_class.find(params[:id])
|
32
|
+
end
|
33
|
+
helper_method :resource
|
34
|
+
|
35
|
+
def admin_resource
|
36
|
+
@admin_resource ||= ClAdmin::Resource.all.find{|r| r.path == resource_name_from_url}
|
37
|
+
end
|
38
|
+
helper_method :admin_resource
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def resource_name_from_url
|
43
|
+
@resource_name_from_url ||= request.path.match(/admin\/([^\/]+)/).captures.last
|
44
|
+
end
|
45
|
+
|
46
|
+
def resource_params
|
47
|
+
params.require(admin_resource.name.downcase.to_sym).permit(*admin_resource.form_fields)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<% @dashboard = OpenStruct.new({
|
2
|
+
top_links: ClAdmin::Resource.all.select(&:linked_on_dashboard?),
|
3
|
+
resources: ClAdmin::Resource.all
|
4
|
+
}) %>
|
5
|
+
|
6
|
+
<h1 class="page-header">Dashboard</h1>
|
7
|
+
|
8
|
+
<div class="row placeholders">
|
9
|
+
<% @dashboard.top_links.each do |top_link| %>
|
10
|
+
<div class="col-xs-6 col-sm-3 placeholder">
|
11
|
+
<span class="fa-stack fa-4x">
|
12
|
+
<i class="fa fa-circle fa-stack-2x"></i>
|
13
|
+
<i class="fa fa-<%= top_link.icon %> fa-stack-1x fa-inverse"></i>
|
14
|
+
</span>
|
15
|
+
<h4><%= top_link.plural_name %></h4>
|
16
|
+
<% if top_link.subtitle %>
|
17
|
+
<span class="text-muted"><%= top_link.subtitle %></span>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
20
|
+
<% end -%>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<h2 class="sub-header">Section title</h2>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<h1 class="page-header">
|
2
|
+
<span class="fa-stack">
|
3
|
+
<i class="fa fa-circle fa-stack-2x"></i>
|
4
|
+
<i class="fa fa-<%= @admin_resource.icon %> fa-stack-1x fa-inverse"></i>
|
5
|
+
</span>
|
6
|
+
<%= admin_resource.plural_name %>
|
7
|
+
</h1>
|
8
|
+
|
9
|
+
<%= link_to "Create #{admin_resource.name}", send(admin_resource.paths[:new]), class: 'btn btn-create' %>
|
10
|
+
|
11
|
+
<div class="table-responsive">
|
12
|
+
<table class="table table-striped js-datatables">
|
13
|
+
<thead>
|
14
|
+
<tr>
|
15
|
+
<% admin_resource.index_fields.each do |field| %>
|
16
|
+
<th><%= field.name %></th>
|
17
|
+
<% end -%>
|
18
|
+
</tr>
|
19
|
+
</thead>
|
20
|
+
<tbody>
|
21
|
+
<% resources.each do |resource| %>
|
22
|
+
<tr>
|
23
|
+
<% admin_resource.index_fields.each do |field| %>
|
24
|
+
<td><%= resource.send(field.attribute) %></td>
|
25
|
+
<% end -%>
|
26
|
+
</tr>
|
27
|
+
<% end -%>
|
28
|
+
</tbody>
|
29
|
+
</table>
|
30
|
+
</div>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<h1 class="page-header">
|
2
|
+
<span class="fa-stack">
|
3
|
+
<i class="fa fa-circle fa-stack-2x"></i>
|
4
|
+
<i class="fa fa-<%= admin_resource.icon %> fa-stack-1x fa-inverse"></i>
|
5
|
+
</span>
|
6
|
+
<%= admin_resource.name %>
|
7
|
+
</h1>
|
8
|
+
|
9
|
+
<div class="table-responsive">
|
10
|
+
<table class="table table-striped table-bordered">
|
11
|
+
<tbody>
|
12
|
+
<% admin_resource.show_fields.each do |field| %>
|
13
|
+
<tr>
|
14
|
+
<td><%= field.name %></td>
|
15
|
+
<td><%= resource.send(field.attribute) %></td>
|
16
|
+
</tr>
|
17
|
+
<% end -%>
|
18
|
+
</tbody>
|
19
|
+
</table>
|
20
|
+
</div>
|
@@ -0,0 +1,74 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>ClAdmin</title>
|
5
|
+
<%= stylesheet_link_tag "cl_admin/application", media: "all" %>
|
6
|
+
<%= javascript_include_tag "cl_admin/application" %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<nav class="navbar navbar-inverse navbar-fixed-top">
|
12
|
+
<% @dashboard = OpenStruct.new({
|
13
|
+
top_links: ClAdmin::Resource.all.select(&:linked_on_dashboard?),
|
14
|
+
resources: ClAdmin::Resource.all
|
15
|
+
}) %>
|
16
|
+
<div class="container-fluid">
|
17
|
+
<div class="navbar-header">
|
18
|
+
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
|
19
|
+
<span class="sr-only">Toggle navigation</span>
|
20
|
+
<span class="icon-bar"></span>
|
21
|
+
<span class="icon-bar"></span>
|
22
|
+
<span class="icon-bar"></span>
|
23
|
+
</button>
|
24
|
+
<%= link_to ClAdmin.configuration.application_name, root_path, class: 'navbar-brand' %>
|
25
|
+
</div>
|
26
|
+
<div id="navbar" class="navbar-collapse collapse">
|
27
|
+
<ul class="nav navbar-nav navbar-right">
|
28
|
+
<li><a href="#">Dashboard</a></li>
|
29
|
+
<li><a href="#">Settings</a></li>
|
30
|
+
<li><a href="#">Profile</a></li>
|
31
|
+
<li><a href="#">Help</a></li>
|
32
|
+
</ul>
|
33
|
+
<form class="navbar-form navbar-right">
|
34
|
+
<input type="text" class="form-control" placeholder="Search...">
|
35
|
+
</form>
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
</nav>
|
39
|
+
|
40
|
+
<div class="container-fluid">
|
41
|
+
<div class="row">
|
42
|
+
<div class="col-sm-3 col-md-2 sidebar">
|
43
|
+
<ul class="nav nav-sidebar">
|
44
|
+
<li class="<%= 'active' if controller_name == 'dashboard' %>">
|
45
|
+
<%= link_to root_path do %>
|
46
|
+
<i class="fa fa-lg fa-fw fa-dashboard"></i> Overview
|
47
|
+
<% end -%>
|
48
|
+
</li>
|
49
|
+
<!-- <li><a href="#">Reports</a></li>
|
50
|
+
<li><a href="#">Analytics</a></li>
|
51
|
+
<li><a href="#">Export</a></li>
|
52
|
+
--> </ul>
|
53
|
+
<ul class="nav nav-sidebar">
|
54
|
+
<% @dashboard.resources.each do |resource| %>
|
55
|
+
<li class="<%= 'active' if request.path.match(resource.path) %>">
|
56
|
+
<%= link_to send("#{resource.name.pluralize.underscore}_path") do %>
|
57
|
+
<i class="fa fa-lg fa-fw fa-<%= resource.icon %>"></i> <%= resource.plural_name %>
|
58
|
+
<% end -%>
|
59
|
+
</li>
|
60
|
+
<% end -%>
|
61
|
+
</ul>
|
62
|
+
<ul class="nav nav-sidebar">
|
63
|
+
<li><a href="">Nav item again</a></li>
|
64
|
+
</ul>
|
65
|
+
</div>
|
66
|
+
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
|
67
|
+
<%= yield %>
|
68
|
+
</div>
|
69
|
+
</div>
|
70
|
+
</div>
|
71
|
+
|
72
|
+
|
73
|
+
</body>
|
74
|
+
</html>
|
data/config/routes.rb
ADDED
data/lib/cl_admin.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require "cl_admin/engine"
|
2
|
+
require "cl_admin/resource"
|
3
|
+
require "cl_admin/configuration"
|
4
|
+
require "cl_admin/simple_form"
|
5
|
+
|
6
|
+
require "bootstrap-sass"
|
7
|
+
require "jquery-rails"
|
8
|
+
|
9
|
+
module ClAdmin
|
10
|
+
class << self
|
11
|
+
attr_accessor :configuration
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.configure
|
15
|
+
self.configuration ||= Configuration.new
|
16
|
+
yield(configuration)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module ClAdmin
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :application_name, :user_class, :current_user_method
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@application_name = Rails.application.class.parent_name
|
7
|
+
end
|
8
|
+
|
9
|
+
def register_resource(*args)
|
10
|
+
ClAdmin::Resource.register(*args)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'cl_admin/resource/field'
|
2
|
+
|
3
|
+
module ClAdmin
|
4
|
+
class Resource
|
5
|
+
@@all_resources = []
|
6
|
+
|
7
|
+
attr_reader :name, :icon, :link, :subtitle, :path, :model, :fields, :index_fields, :form_fields, :show_fields
|
8
|
+
|
9
|
+
def initialize(model:, name: nil, icon: nil, linked_on_dashboard: false, generate_routes: true, path: nil)
|
10
|
+
@model = model
|
11
|
+
@name = name || model.try(:model_name).try(:human)
|
12
|
+
@linked_on_dashboard = linked_on_dashboard
|
13
|
+
@icon = icon
|
14
|
+
@link = '#'
|
15
|
+
@subtitle = nil
|
16
|
+
@generate_routes = generate_routes
|
17
|
+
@path = path || plural_name.downcase
|
18
|
+
|
19
|
+
@fields = []
|
20
|
+
model.attribute_names.each do |attr|
|
21
|
+
field = Field.new(
|
22
|
+
attribute: attr,
|
23
|
+
name: model.human_attribute_name(attr),
|
24
|
+
create: default_columns.include?(attr),
|
25
|
+
show: (model.attribute_names - ["id"]).include?(attr),
|
26
|
+
index: (model.attribute_names - ["id"]).include?(attr),
|
27
|
+
edit: default_columns.include?(attr)
|
28
|
+
)
|
29
|
+
@fields.push field
|
30
|
+
end
|
31
|
+
@index_fields ||= default_columns
|
32
|
+
@form_fields ||= default_columns
|
33
|
+
@show_fields ||= model.attribute_names - ["id"]
|
34
|
+
end
|
35
|
+
|
36
|
+
def index_fields
|
37
|
+
fields.select(&:display_on_index?)
|
38
|
+
end
|
39
|
+
|
40
|
+
def show_fields
|
41
|
+
fields.select(&:display_on_show?)
|
42
|
+
end
|
43
|
+
|
44
|
+
def paths
|
45
|
+
@paths ||= {
|
46
|
+
new: "new_#{model.name.underscore}_path",
|
47
|
+
index: "#{plural_name.underscore}_path",
|
48
|
+
edit: "edit_#{model.name.underscore}_path"
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def plural_name
|
53
|
+
@plural_name ||= @name.pluralize
|
54
|
+
end
|
55
|
+
|
56
|
+
def default_columns
|
57
|
+
model.attribute_names - ["id", "created_at", "updated_at"]
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.register(**args)
|
61
|
+
res = Resource.new(args)
|
62
|
+
@@all_resources.push(res)
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.all
|
66
|
+
@@all_resources
|
67
|
+
end
|
68
|
+
|
69
|
+
def linked_on_dashboard?
|
70
|
+
!!@linked_on_dashboard
|
71
|
+
end
|
72
|
+
|
73
|
+
def generate_routes?
|
74
|
+
!!@generate_routes
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|