cl-admin 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (204) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/javascripts/cl_admin/application.js +16 -0
  6. data/app/assets/javascripts/cl_admin/datatables.js +3 -0
  7. data/app/assets/javascripts/cl_admin/vendor/jquery.dataTables.js +14839 -0
  8. data/app/assets/stylesheets/cl_admin/application.scss +16 -0
  9. data/app/assets/stylesheets/cl_admin/bootstrap-dashboard.scss +63 -0
  10. data/app/assets/stylesheets/cl_admin/bootstrap_overrides.scss +10 -0
  11. data/app/assets/stylesheets/cl_admin/buttons.scss +14 -0
  12. data/app/assets/stylesheets/cl_admin/dataTables.scss +476 -0
  13. data/app/assets/stylesheets/cl_admin/sidebar.scss +47 -0
  14. data/app/assets/stylesheets/cl_admin/utility.scss +0 -0
  15. data/app/assets/stylesheets/cl_admin/variables.scss +19 -0
  16. data/app/controllers/cl_admin/application_controller.rb +5 -0
  17. data/app/controllers/cl_admin/dashboard_controller.rb +7 -0
  18. data/app/controllers/cl_admin/resources_controller.rb +50 -0
  19. data/app/helpers/cl_admin/application_helper.rb +4 -0
  20. data/app/helpers/cl_admin/resources_helper.rb +4 -0
  21. data/app/views/cl_admin/dashboard/index.html.erb +23 -0
  22. data/app/views/cl_admin/resources/_form.html.erb +6 -0
  23. data/app/views/cl_admin/resources/index.html.erb +30 -0
  24. data/app/views/cl_admin/resources/new.html.erb +9 -0
  25. data/app/views/cl_admin/resources/show.html.erb +20 -0
  26. data/app/views/layouts/cl_admin/application.html.erb +74 -0
  27. data/config/routes.rb +7 -0
  28. data/lib/cl_admin.rb +18 -0
  29. data/lib/cl_admin/configuration.rb +13 -0
  30. data/lib/cl_admin/engine.rb +5 -0
  31. data/lib/cl_admin/resource.rb +77 -0
  32. data/lib/cl_admin/resource/field.rb +32 -0
  33. data/lib/cl_admin/simple_form.rb +168 -0
  34. data/lib/cl_admin/version.rb +3 -0
  35. data/lib/tasks/cl_admin_tasks.rake +4 -0
  36. data/test/cl_admin_test.rb +7 -0
  37. data/test/dummy/README.rdoc +28 -0
  38. data/test/dummy/Rakefile +6 -0
  39. data/test/dummy/app/assets/javascripts/application.js +13 -0
  40. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  41. data/test/dummy/app/assets/stylesheets/scaffold.css +56 -0
  42. data/test/dummy/app/controllers/application_controller.rb +5 -0
  43. data/test/dummy/app/helpers/application_helper.rb +2 -0
  44. data/test/dummy/app/models/thing.rb +2 -0
  45. data/test/dummy/app/models/widget.rb +2 -0
  46. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  47. data/test/dummy/bin/bundle +3 -0
  48. data/test/dummy/bin/rails +4 -0
  49. data/test/dummy/bin/rake +4 -0
  50. data/test/dummy/config.ru +4 -0
  51. data/test/dummy/config/application.rb +23 -0
  52. data/test/dummy/config/boot.rb +5 -0
  53. data/test/dummy/config/database.yml +25 -0
  54. data/test/dummy/config/environment.rb +5 -0
  55. data/test/dummy/config/environments/development.rb +37 -0
  56. data/test/dummy/config/environments/production.rb +78 -0
  57. data/test/dummy/config/environments/test.rb +39 -0
  58. data/test/dummy/config/initializers/assets.rb +8 -0
  59. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  60. data/test/dummy/config/initializers/cl_admin.rb +15 -0
  61. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  62. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  63. data/test/dummy/config/initializers/inflections.rb +16 -0
  64. data/test/dummy/config/initializers/mime_types.rb +4 -0
  65. data/test/dummy/config/initializers/session_store.rb +3 -0
  66. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  67. data/test/dummy/config/locales/en.yml +23 -0
  68. data/test/dummy/config/routes.rb +3 -0
  69. data/test/dummy/config/secrets.yml +22 -0
  70. data/test/dummy/db/development.sqlite3 +0 -0
  71. data/test/dummy/db/migrate/20150128203934_create_widgets.rb +11 -0
  72. data/test/dummy/db/migrate/20150128221526_create_things.rb +10 -0
  73. data/test/dummy/db/schema.rb +31 -0
  74. data/test/dummy/log/development.log +35213 -0
  75. data/test/dummy/public/404.html +67 -0
  76. data/test/dummy/public/422.html +67 -0
  77. data/test/dummy/public/500.html +66 -0
  78. data/test/dummy/public/favicon.ico +0 -0
  79. data/test/dummy/test/fixtures/things.yml +9 -0
  80. data/test/dummy/test/fixtures/widgets.yml +11 -0
  81. data/test/dummy/test/models/thing_test.rb +7 -0
  82. data/test/dummy/test/models/widget_test.rb +7 -0
  83. data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/application.scssc +0 -0
  84. data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/bootstrap-dashboard.scssc +0 -0
  85. data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/bootstrap_overrides.scssc +0 -0
  86. data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/buttons.scssc +0 -0
  87. data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/dataTables.scssc +0 -0
  88. data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/nav-sidebar.scssc +0 -0
  89. data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/sidebar.scssc +0 -0
  90. data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/utility.scssc +0 -0
  91. data/test/dummy/tmp/cache/assets/development/sass/5ca297b84cede238f2f7e1100a9c8a60d82e472c/variables.scssc +0 -0
  92. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_alerts.scssc +0 -0
  93. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_badges.scssc +0 -0
  94. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_breadcrumbs.scssc +0 -0
  95. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_button-groups.scssc +0 -0
  96. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_buttons.scssc +0 -0
  97. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_carousel.scssc +0 -0
  98. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_close.scssc +0 -0
  99. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_code.scssc +0 -0
  100. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_component-animations.scssc +0 -0
  101. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_dropdowns.scssc +0 -0
  102. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_forms.scssc +0 -0
  103. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_glyphicons.scssc +0 -0
  104. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_grid.scssc +0 -0
  105. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_input-groups.scssc +0 -0
  106. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_jumbotron.scssc +0 -0
  107. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_labels.scssc +0 -0
  108. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_list-group.scssc +0 -0
  109. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_media.scssc +0 -0
  110. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_mixins.scssc +0 -0
  111. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_modals.scssc +0 -0
  112. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_navbar.scssc +0 -0
  113. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_navs.scssc +0 -0
  114. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_normalize.scssc +0 -0
  115. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_pager.scssc +0 -0
  116. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_pagination.scssc +0 -0
  117. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_panels.scssc +0 -0
  118. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_popovers.scssc +0 -0
  119. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_print.scssc +0 -0
  120. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_progress-bars.scssc +0 -0
  121. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_responsive-embed.scssc +0 -0
  122. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_responsive-utilities.scssc +0 -0
  123. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_scaffolding.scssc +0 -0
  124. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_tables.scssc +0 -0
  125. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_thumbnails.scssc +0 -0
  126. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_tooltip.scssc +0 -0
  127. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_type.scssc +0 -0
  128. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_utilities.scssc +0 -0
  129. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_variables.scssc +0 -0
  130. data/test/dummy/tmp/cache/assets/development/sass/9ae61fe7594fa207b8c0e792a71b3247f2ecb442/_wells.scssc +0 -0
  131. data/test/dummy/tmp/cache/assets/development/sass/b92dbf189012ed16682faff674922d38a147d711/_bootstrap-sprockets.scssc +0 -0
  132. data/test/dummy/tmp/cache/assets/development/sass/b92dbf189012ed16682faff674922d38a147d711/_bootstrap.scssc +0 -0
  133. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_alerts.scssc +0 -0
  134. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_background-variant.scssc +0 -0
  135. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_border-radius.scssc +0 -0
  136. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_buttons.scssc +0 -0
  137. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_center-block.scssc +0 -0
  138. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_clearfix.scssc +0 -0
  139. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_forms.scssc +0 -0
  140. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_gradients.scssc +0 -0
  141. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_grid-framework.scssc +0 -0
  142. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_grid.scssc +0 -0
  143. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_hide-text.scssc +0 -0
  144. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_image.scssc +0 -0
  145. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_labels.scssc +0 -0
  146. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_list-group.scssc +0 -0
  147. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_nav-divider.scssc +0 -0
  148. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_nav-vertical-align.scssc +0 -0
  149. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_opacity.scssc +0 -0
  150. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_pagination.scssc +0 -0
  151. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_panels.scssc +0 -0
  152. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_progress-bar.scssc +0 -0
  153. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_reset-filter.scssc +0 -0
  154. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_resize.scssc +0 -0
  155. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_responsive-visibility.scssc +0 -0
  156. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_size.scssc +0 -0
  157. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_tab-focus.scssc +0 -0
  158. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_table-row.scssc +0 -0
  159. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_text-emphasis.scssc +0 -0
  160. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_text-overflow.scssc +0 -0
  161. data/test/dummy/tmp/cache/assets/development/sass/d5ae62fa76c715540c1cd376eada878bee98456c/_vendor-prefixes.scssc +0 -0
  162. data/test/dummy/tmp/cache/assets/development/sass/eaf2b3ba15346b0c73619d2ad3ae7fcdaf0aa56a/bootstrap-dashboard.scssc +0 -0
  163. data/test/dummy/tmp/cache/assets/development/sprockets/0682d76393eff7c31b20bbd3eba49fc8 +0 -0
  164. data/test/dummy/tmp/cache/assets/development/sprockets/1fac683c0f668a2a7fd4ea1062b39fbf +0 -0
  165. data/test/dummy/tmp/cache/assets/development/sprockets/20b34331df4be4854889a3c23377f45e +0 -0
  166. data/test/dummy/tmp/cache/assets/development/sprockets/3553ed1f1b382b6b9bcc518b810b271b +0 -0
  167. data/test/dummy/tmp/cache/assets/development/sprockets/36f8ae187aff06bd327a0da82211ee0d +0 -0
  168. data/test/dummy/tmp/cache/assets/development/sprockets/3ddfe27fc34861ca04ca66a0c208c22c +0 -0
  169. data/test/dummy/tmp/cache/assets/development/sprockets/45171cfb63e99073564e0b228ac28041 +0 -0
  170. data/test/dummy/tmp/cache/assets/development/sprockets/50483055a8f88061f7d914fa626c5352 +0 -0
  171. data/test/dummy/tmp/cache/assets/development/sprockets/59d3c4356501b88041da3f30a13e79b6 +0 -0
  172. data/test/dummy/tmp/cache/assets/development/sprockets/5e5f5b6a9fadf420dcf484d703d04112 +0 -0
  173. data/test/dummy/tmp/cache/assets/development/sprockets/5f31826a3e67ae3c19ad896764e142f2 +0 -0
  174. data/test/dummy/tmp/cache/assets/development/sprockets/67ab6ab97c6f1be9661cec5fb1fe1bdc +0 -0
  175. data/test/dummy/tmp/cache/assets/development/sprockets/6b48cbb5b69311776bf647f5441b8261 +0 -0
  176. data/test/dummy/tmp/cache/assets/development/sprockets/73076af09d2cc309d096d788850449d6 +0 -0
  177. data/test/dummy/tmp/cache/assets/development/sprockets/7dcfdb7c49f7e376d6f39367b09fbf5b +0 -0
  178. data/test/dummy/tmp/cache/assets/development/sprockets/855025ccf2d78ca8086c71dbd05ddb80 +0 -0
  179. data/test/dummy/tmp/cache/assets/development/sprockets/860a9b5297964d6c08619dad24f8cad0 +0 -0
  180. data/test/dummy/tmp/cache/assets/development/sprockets/8ac30b42f441d7367b119073c8906c78 +0 -0
  181. data/test/dummy/tmp/cache/assets/development/sprockets/93d5e5770edc2798869f9b91fdf3d4b6 +0 -0
  182. data/test/dummy/tmp/cache/assets/development/sprockets/9a36c88175eb86f93cfc7fc7735e0043 +0 -0
  183. data/test/dummy/tmp/cache/assets/development/sprockets/a1d20140ba285327c174b822dc148de2 +0 -0
  184. data/test/dummy/tmp/cache/assets/development/sprockets/a25f613a8ecc416a21920d5066359695 +0 -0
  185. data/test/dummy/tmp/cache/assets/development/sprockets/ac73d5c7b73b96c8bcaac0821ac18c89 +0 -0
  186. data/test/dummy/tmp/cache/assets/development/sprockets/b28ce637ebd1a320b66c1f8df1c38b96 +0 -0
  187. data/test/dummy/tmp/cache/assets/development/sprockets/b5e5faf9bf347d0e0a85cf07fe8222a3 +0 -0
  188. data/test/dummy/tmp/cache/assets/development/sprockets/bb9a1e25b5312dc605a09b6789849fdf +0 -0
  189. data/test/dummy/tmp/cache/assets/development/sprockets/bbd03989b5854f9ac01c0fe45267492c +0 -0
  190. data/test/dummy/tmp/cache/assets/development/sprockets/c219a250b8b465cb233748d3c4bb7288 +0 -0
  191. data/test/dummy/tmp/cache/assets/development/sprockets/cbe8158164315b4f1d1b81ff224c0ef4 +0 -0
  192. data/test/dummy/tmp/cache/assets/development/sprockets/d5a89fee789601bd5eefc3a114a80745 +0 -0
  193. data/test/dummy/tmp/cache/assets/development/sprockets/d659ac88af9b82c8f1f5d6188aa9e71a +0 -0
  194. data/test/dummy/tmp/cache/assets/development/sprockets/d6c1da9ef1be9fb5132d4dc6a04f95eb +0 -0
  195. data/test/dummy/tmp/cache/assets/development/sprockets/db41ba23a87bb0501594066bbe6306d6 +0 -0
  196. data/test/dummy/tmp/cache/assets/development/sprockets/ead728b75839b122c1534a25c900d55c +0 -0
  197. data/test/dummy/tmp/cache/assets/development/sprockets/ee6cfea76b27b0352119a739b66636ad +0 -0
  198. data/test/dummy/tmp/cache/assets/development/sprockets/eef986a2fcad7c282086103c05fcf9a7 +0 -0
  199. data/test/dummy/tmp/cache/assets/development/sprockets/f32f682108ad3b7c90921211cfedf112 +0 -0
  200. data/test/dummy/tmp/cache/assets/development/sprockets/f403f6c6e97ccddaf5687f4d36860635 +0 -0
  201. data/test/dummy/tmp/cache/assets/development/sprockets/f56098ce403bc1978064a814465248d4 +0 -0
  202. data/test/integration/navigation_test.rb +10 -0
  203. data/test/test_helper.rb +19 -0
  204. 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
+
@@ -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,5 @@
1
+ module ClAdmin
2
+ class ApplicationController < ActionController::Base
3
+ helper ClAdmin::Engine.helpers
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ module ClAdmin
2
+ class DashboardController < ApplicationController
3
+ def index
4
+
5
+ end
6
+ end
7
+ end
@@ -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,4 @@
1
+ module ClAdmin
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module ClAdmin
2
+ module ResourcesHelper
3
+ end
4
+ 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,6 @@
1
+ <%= simple_form_for resource do |f| %>
2
+ <% admin_resource.form_fields.each do |field| %>
3
+ <%= f.input field %>
4
+ <% end -%>
5
+ <%= f.button :submit %>
6
+ <% end -%>
@@ -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,9 @@
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
+ New <%= admin_resource.name %>
7
+ </h1>
8
+
9
+ <%= render 'form' %>
@@ -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>
@@ -0,0 +1,7 @@
1
+ ClAdmin::Engine.routes.draw do
2
+ root to: 'dashboard#index'
3
+
4
+ ClAdmin::Resource.all.select(&:generate_routes?).each do |res|
5
+ resources res.name.pluralize.underscore.to_sym, controller: "resources"
6
+ end
7
+ end
@@ -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,5 @@
1
+ module ClAdmin
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace ClAdmin
4
+ end
5
+ 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