action_admin 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +43 -0
  4. data/Rakefile +33 -0
  5. data/app/assets/images/admin/logo.svg +41 -0
  6. data/app/assets/javascripts/admin/admin.js +14 -0
  7. data/app/assets/javascripts/admin/application.js +13 -0
  8. data/app/assets/stylesheets/admin/admin.scss +2 -0
  9. data/app/assets/stylesheets/admin/application.scss +1 -0
  10. data/app/controllers/action_admin/base_controller.rb +7 -0
  11. data/app/controllers/action_admin/crud_controller.rb +7 -0
  12. data/app/controllers/action_admin/welcome_controller.rb +6 -0
  13. data/app/helpers/action_admin/admin_helper.rb +26 -0
  14. data/app/helpers/action_admin/form_helper.rb +37 -0
  15. data/app/helpers/action_admin/markup_helper.rb +110 -0
  16. data/app/views/action_admin/welcome/index.html.slim +1 -0
  17. data/app/views/admin/common/_footer.html.slim +0 -0
  18. data/app/views/admin/common/_header.html.slim +4 -0
  19. data/app/views/admin/common/_logobar.html.slim +3 -0
  20. data/app/views/admin/common/_messagebar.html.slim +0 -0
  21. data/app/views/admin/common/_noresults.html.slim +1 -0
  22. data/app/views/admin/common/_sidebar.html.slim +4 -0
  23. data/app/views/admin/common/_topbar.html.slim +6 -0
  24. data/app/views/admin/common/action.html.slim +0 -0
  25. data/app/views/admin/records/_form.html.slim +29 -0
  26. data/app/views/admin/records/edit.html.slim +1 -0
  27. data/app/views/admin/records/index.html.slim +34 -0
  28. data/app/views/admin/records/new.html.slim +1 -0
  29. data/app/views/admin/records/show.html.slim +13 -0
  30. data/app/views/layouts/admin.html.slim +29 -0
  31. data/config/initializers/admin_simple_form.rb +89 -0
  32. data/config/routes.rb +3 -0
  33. data/lib/action_admin.rb +31 -0
  34. data/lib/action_admin/actionable.rb +25 -0
  35. data/lib/action_admin/config.rb +14 -0
  36. data/lib/action_admin/controller.rb +26 -0
  37. data/lib/action_admin/crudable.rb +19 -0
  38. data/lib/action_admin/engine.rb +17 -0
  39. data/lib/action_admin/header.rb +85 -0
  40. data/lib/action_admin/simple_form.rb +9 -0
  41. data/lib/action_admin/simple_form/error_notification.rb +10 -0
  42. data/lib/action_admin/simple_form/form_builder.rb +53 -0
  43. data/lib/action_admin/simple_form/minimal_form_builder.rb +20 -0
  44. data/lib/action_admin/version.rb +3 -0
  45. data/lib/tasks/action_admin_tasks.rake +4 -0
  46. metadata +242 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c44353e5b5e06876da3b17b14b94496deefefe8a
4
+ data.tar.gz: eb1c8aadd4b44d7df9238dead846f7b1879d856d
5
+ SHA512:
6
+ metadata.gz: 2d044084dce29f51d7c387556fce4526918ec7f4a36a2023a98f84ffe5372cde307d85a849e4f1a57384e0832bd214d076d7ec7c29d7ca72b763aceef853ef93
7
+ data.tar.gz: 351f37c12c9feba3d42a329c9a75c4cde3482dccf8682d1a5c80312851840c4bbc648a45c2078f08ef6d598c4c2e8feaf64bf19ac881239c06dec254f7070ff2
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Jonian Guveli
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,43 @@
1
+ # ActionAdmin
2
+
3
+ Ruby on Rails mountable engine to create admin interfaces.
4
+
5
+ [![Gem Version](https://badge.fury.io/rb/action_admin.svg)](https://badge.fury.io/rb/action_admin)
6
+ [![Build Status](https://travis-ci.org/hardpixel/action-admin.svg?branch=master)](https://travis-ci.org/hardpixel/action-admin)
7
+ [![Maintainability](https://api.codeclimate.com/v1/badges/930d42bb2bf6f54a4268/maintainability)](https://codeclimate.com/github/hardpixel/action-admin/maintainability)
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'action_admin'
15
+ ```
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install action_admin
24
+
25
+ ## Usage
26
+
27
+ TODO: Write usage instructions here
28
+
29
+ ## Development
30
+
31
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/hardpixel/action-admin. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
36
+
37
+ ## License
38
+
39
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
40
+
41
+ ## Code of Conduct
42
+
43
+ Everyone interacting in the ActionAdmin project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/hardpixel/action-admin/blob/master/CODE_OF_CONDUCT.md).
@@ -0,0 +1,33 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'ActionAdmin'
12
+
13
+ rdoc.options << '--line-numbers'
14
+
15
+ rdoc.rdoc_files.include('README.md')
16
+ rdoc.rdoc_files.include('lib/**/*.rb')
17
+ end
18
+
19
+ APP_RAKEFILE = File.expand_path('../test/dummy/Rakefile', __FILE__)
20
+ load 'rails/tasks/engine.rake'
21
+ load 'rails/tasks/statistics.rake'
22
+
23
+ require 'bundler/gem_tasks'
24
+ require 'rake/testtask'
25
+
26
+ Rake::TestTask.new(:test) do |t|
27
+ t.libs << 'test'
28
+
29
+ t.pattern = 'test/**/*_test.rb'
30
+ t.verbose = false
31
+ end
32
+
33
+ task default: :test
@@ -0,0 +1,41 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <svg width="361px" height="559px" viewBox="0 0 361 559" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
3
+ <title>Untitled</title>
4
+ <description>Created with Sketch (http://www.bohemiancoding.com/sketch)</description>
5
+ <defs></defs>
6
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
7
+ <g id="yeti-f5" sketch:type="MSLayerGroup" transform="translate(-121.000000, -21.000000)">
8
+ <path d="M481.926,398.179 C476.004,398.179 469.625,395.445 465.068,374.489 C460.511,353.533 453.679,332.12 453.679,332.12 C460.969,332.12 465.068,328.93 465.068,328.93 C460.056,326.651 449.122,318.908 441.834,309.34 C434.545,299.773 415.865,284.282 415.865,284.282 L415.865,253.304 C415.865,232.346 429.306,215.947 429.306,215.947 C420.195,215.947 415.865,224.146 415.865,224.146 L415.865,179.955 C415.865,136.219 437.96,116.631 437.96,116.631 C431.126,116.176 426.571,119.364 426.571,119.364 C429.76,87.019 439.67,77.451 439.67,77.451 C403.224,67.883 382.893,89.296 382.893,89.296 C378.793,69.707 394.824,58.313 394.824,58.313 C376.146,54.213 360.698,59.68 360.698,59.68 C360.698,30.979 372.108,21.406 372.108,21.406 C315.16,21.406 282.826,64.225 282.826,64.225 C280.549,46.001 285.564,30.04 285.564,30.04 C230.44,53.275 215.865,104.729 215.865,104.729 C212.221,96.074 211.766,76.424 211.766,76.424 C211.766,76.424 188.986,114.579 184.886,141.001 C180.786,167.426 188.53,243.28 188.53,243.28 C188.53,243.28 184.887,238.726 177.142,237.815 C177.142,237.815 185.342,246.927 185.342,267.428 C185.342,267.428 182.152,264.694 176.686,266.061 C176.686,266.061 185.341,273.805 186.253,287.017 C186.253,287.017 176.23,293.851 170.763,300.685 C170.763,300.685 162.106,301.14 157.551,302.507 C157.551,302.507 164.841,306.607 166.208,310.252 C166.208,310.252 144.795,332.12 133.861,349.887 C133.861,349.887 143.429,343.965 150.262,345.787 C150.262,345.787 135.227,364.01 130.216,394.078 C130.216,394.078 137.505,390.435 140.694,392.257 C140.694,392.257 131.582,411.39 131.127,431.436 L121.105,437.359 L128.85,442.826 C128.85,442.826 122.927,467.427 121.56,481.55 C121.56,481.55 126.115,476.995 129.76,475.628 C129.76,475.628 134.772,487.472 141.606,496.584 C148.44,505.696 163.931,513.441 173.042,513.441 L190.167,512.773 C188.043,521.938 183.853,529.71 175.021,530.117 L174.041,531.69 C173.856,531.676 173.674,531.668 173.496,531.664 C173.321,534.34 167.92,534.822 166.435,536.676 C161.92,542.309 158.477,550.048 156.184,556.949 C154.504,562.006 155.298,562.005 154.134,567.2 C153.753,568.9 151.989,570.716 151.401,572.438 C156.32,570.786 169.953,569.682 177.134,569.155 L177.255,575.511 C177.255,575.511 178.439,576.612 180.4,577.41 C180.468,577.397 180.533,577.378 180.615,577.385 C181.281,577.439 181.924,577.537 182.553,577.693 C193.329,576.729 200.832,578.547 213.322,577.51 C215.752,577.221 218.031,576.879 220.158,575.668 C220.763,573.861 220.844,573.75 221.129,571.416 C221.19,571 221.19,570.572 221.29,570.065 C221.486,570.032 221.676,570.004 221.867,569.976 C221.94,569.948 222.056,569.924 222.313,569.914 C222.366,569.898 222.411,569.873 222.471,569.868 C222.669,569.85 222.866,569.834 223.064,569.817 C223.2,569.766 223.33,569.752 223.447,569.784 C225.708,569.582 229.337,569.391 231.597,569.268 C238.944,569.256 248.61,570.102 248.61,570.102 C249.208,561.867 249.806,549.089 263.132,511.845 L266.435,509.796 C266.435,509.796 307.364,524.218 345.341,509.213 C348.346,516.61 358.07,541.472 359.599,557.145 C360.906,558.982 360.761,561.313 360.805,563.783 C360.842,565.873 361.018,567.964 361.074,570.048 C362.44,569.862 367.371,569.258 373.596,569.268 C375.856,569.391 379.485,569.582 381.746,569.784 C381.864,569.752 381.993,569.766 382.129,569.817 C382.327,569.834 382.524,569.85 382.722,569.868 C382.782,569.873 382.827,569.898 382.881,569.914 C383.137,569.924 383.253,569.948 383.327,569.976 C383.517,570.004 383.707,570.032 383.903,570.065 C384.003,570.572 384.003,571 384.065,571.416 C384.349,573.75 384.43,573.861 385.035,575.668 C385.23,575.779 385.427,575.875 385.625,575.973 C392.425,575.11 399.316,574.952 406.159,575.276 C411.541,575.531 416.831,576.541 422.128,577.505 C422.129,577.555 422.133,577.606 422.133,577.657 C422.667,577.714 423.189,577.752 423.71,577.786 C426.552,578.294 429.402,578.767 432.27,579.077 C432.325,575.489 432.305,572.352 432.23,569.597 C437.936,569.87 446.195,571.006 449.66,571.511 C451.034,571.84 452.15,572.043 453.321,572.295 C453.48,572.342 453.648,572.39 453.793,572.438 C453.787,572.425 453.781,572.41 453.775,572.397 C454.951,572.661 456.219,572.995 457.893,573.577 C457.638,570.495 457.661,570.559 457.253,566.695 C456.939,563.707 454.796,554.628 450.787,550.883 C450.787,550.883 455.155,552.771 456.489,553.523 C452.183,547.689 450.089,539.348 436.56,533.597 C436.56,533.597 439.031,532.432 441.29,532.138 C438.929,530.683 437.126,530.111 434.736,530.284 C435.548,527.978 439.121,522.161 442.119,521.414 C442.119,521.414 440.279,520.135 437.27,521.124 C436.152,521.71 435.067,522.339 434.011,523.083 C433.612,523.365 433.03,523.073 432.912,522.636 C431.966,519.138 431.351,515.584 430.793,512.015 C458.056,511.027 461.88,497.041 461.88,497.041 C464.158,498.864 464.157,502.963 464.157,502.963 C476.001,487.473 474.635,471.983 474.635,471.983 C477.369,472.438 479.647,474.261 479.647,474.261 C481.014,450.571 473.725,410.024 473.725,410.024 C477.37,411.846 479.647,409.569 479.647,409.569 C475.547,407.747 475.092,403.19 475.092,403.19 C481.015,403.646 481.926,398.179 481.926,398.179" id="Fill-4" fill="#EDF7FA" sketch:type="MSShapeGroup"></path>
9
+ <path d="M221.29,570.065 C221.29,570.065 222.358,558.543 218.601,550.229 C218.601,550.229 225.717,550.712 226.913,569.505 C226.913,569.505 221.929,570.084 221.29,570.065" id="Fill-5" fill="#CDE9EE" sketch:type="MSShapeGroup"></path>
10
+ <path d="M185.569,531.209 L185.613,530.855 C185.639,531.03 185.635,531.165 185.569,531.209" id="Fill-6" fill="#CDE9EE" sketch:type="MSShapeGroup"></path>
11
+ <path d="M192.232,569.172 C192.191,569.161 192.168,569.155 192.168,569.155 C192.168,569.155 192.197,569.076 192.251,568.939 L192.232,569.172" id="Fill-7" fill="#CDE9EE" sketch:type="MSShapeGroup"></path>
12
+ <path d="M282.828,64.225 C280.551,46.001 285.566,30.04 285.566,30.04 C230.441,53.275 215.865,104.729 215.865,104.729 C212.221,96.074 211.766,76.424 211.766,76.424 C211.766,76.424 188.986,114.579 184.886,141.001 C180.786,167.426 188.53,243.28 188.53,243.28 C188.53,243.28 184.887,238.726 177.142,237.815 C177.142,237.815 185.342,246.927 185.342,267.428 C185.342,267.428 182.152,264.694 176.686,266.061 C176.686,266.061 185.341,273.805 186.253,287.017 C186.253,287.017 176.23,293.851 170.763,300.685 C170.763,300.685 162.106,301.14 157.551,302.507 C157.551,302.507 164.841,306.607 166.208,310.252 C166.208,310.252 144.795,332.12 133.861,349.887 C133.861,349.887 143.429,343.965 150.262,345.787 C150.262,345.787 135.227,364.01 130.216,394.078 C130.216,394.078 137.505,390.435 140.694,392.257 C140.694,392.257 131.582,411.39 131.127,431.436 L121.105,437.359 L128.85,442.826 C128.85,442.826 122.927,467.427 121.56,481.55 C121.56,481.55 126.115,476.995 129.76,475.628 C129.76,475.628 134.772,487.472 141.606,496.584 C148.44,505.696 163.931,513.441 173.042,513.441 L174.195,513.283 C173.687,516.424 173.115,519.553 172.281,522.636 C172.163,523.073 171.582,523.365 171.182,523.083 C170.127,522.339 169.042,521.71 167.923,521.124 C164.915,520.135 163.074,521.414 163.074,521.414 C166.072,522.161 169.645,527.978 170.458,530.284 C168.067,530.111 166.264,530.683 163.903,532.138 C166.163,532.432 168.633,533.597 168.633,533.597 C155.105,539.348 153.01,547.689 148.705,553.523 C150.038,552.771 154.406,550.883 154.406,550.883 C150.397,554.628 148.255,563.707 147.94,566.695 C147.533,570.559 147.555,570.495 147.301,573.577 C150.887,572.33 152.63,572.207 155.533,571.511 C160.019,570.858 172.556,569.139 177.161,569.617 L176.435,578.474 C176.435,578.474 176.527,578.474 176.661,578.471 C179.025,577.793 180.951,577.884 183.06,577.657 C183.091,575.216 183.219,572.777 183.419,570.345 C183.278,566.189 183.794,562.404 184.643,558.185 C184.671,558.043 184.706,557.895 184.735,557.753 C186.408,551.993 189.317,548.714 191.207,546.697 C191.834,546.027 192.379,545.234 192.845,544.421 C193.973,542.92 195.145,540.965 196.05,538.497 C197.923,533.386 197.12,522.158 193.356,511.2 C197.325,516.909 200.94,521.919 202.654,523.633 L202.54,509.682 C202.54,509.682 209.829,516.966 216.353,522.469 C219.494,525.212 223.368,528.779 226.119,530.2 C226.318,530.325 226.497,529 226.716,531 L226.714,531 C226.742,531 226.769,530.604 226.797,530.62 C230.492,532.693 234.293,534.339 237.851,536.642 C238.232,536.888 238.621,537.007 238.995,537.265 C240.642,538.399 243.541,539.659 246.146,541.032 L248.61,570.129 C250.831,539.548 268.257,510.265 268.257,510.265 L267.619,510.069 C262.227,508.402 222.774,494.753 199.465,446.017 C197.93,442.807 208.121,449.66 208.121,449.66 C198.553,426.425 194.908,389.067 194.908,389.067 C198.097,391.801 201.287,392.256 201.287,392.256 C194.453,373.121 191.72,349.431 191.72,328.018 C189.898,212.757 232.495,186.334 232.495,186.334 C225.206,183.6 217.461,183.828 217.461,183.828 C225.89,163.555 253.906,135.309 253.906,135.309 C246.389,135.765 217.004,143.736 217.004,143.736 C241.378,80.183 265.98,63.327 265.98,63.327 C264.158,78.588 270.081,94.762 270.081,94.762 C322.928,29.385 365.388,32.435 365.388,32.435 C368.537,25.877 372.114,21.406 372.114,21.406 C315.166,21.406 282.828,64.225 282.828,64.225" id="Fill-8" fill="#CDE9EE" sketch:type="MSShapeGroup"></path>
13
+ <path d="M432.209,569.705 C432.209,569.705 431.695,553.189 427.938,544.875 C427.938,544.875 437.733,550.912 437.677,569.988 C437.677,569.988 432.848,569.724 432.209,569.705" id="Fill-9" fill="#CDE9EE" sketch:type="MSShapeGroup"></path>
14
+ <path d="M177.361,484.763 C183.813,421.571 185.569,297.95 185.569,297.95 C171.56,325.626 160.285,375.854 160.285,375.854 L163.018,386.788 L156.868,384.055 C146.983,418.361 153.671,464.284 155.886,477.221 C162.174,482.199 169.664,483.878 177.361,484.763" id="Fill-10" fill="#ABD8D7" sketch:type="MSShapeGroup"></path>
15
+ <path d="M164.146,483.397 C166.149,493.511 168.227,503.251 170.535,513.297 C172.244,513.554 174.166,513.425 174.166,513.425 C175.734,507.315 175.994,497.859 177.213,486.227 C172.721,485.701 168.314,484.903 164.146,483.397" id="Fill-11" fill="#ABD8D7" sketch:type="MSShapeGroup"></path>
16
+ <path d="M378.252,537.851 C377.885,537.957 377.606,537.793 377.455,537.542 C376.746,537.681 376.204,537.809 375.839,537.903 C375.839,537.901 375.84,537.901 375.84,537.901 C385.239,531.061 386.103,523.828 386.103,523.828 C379.868,526.639 373.249,527.689 370.029,528.059 C391.754,509.228 395.364,474.261 395.364,474.261 C386.466,485.184 373.838,494.415 364.079,500.611 L364.1,500.569 C364.1,500.569 357.561,504.225 351.519,507.072 C351.254,507.032 350.988,507.103 350.789,507.412 C347.685,508.85 344.791,510.023 343.086,510.308 C343.086,510.308 348.118,519.599 350.219,524.609 L349.807,524.943 C349.807,524.943 357.086,542.148 359.736,558.815 C360.016,561.631 360.232,564.099 360.383,565.984 C360.51,568.422 360.683,570.102 360.683,570.102 C370.308,568.678 383.903,570.065 383.903,570.065 C383.838,571.633 384.699,575.397 384.857,576.079 C389.428,575.463 394.039,575.194 398.652,575.154 C398.59,559 397.88,532.159 378.252,537.851" id="Fill-12" fill="#CDE9EE" sketch:type="MSShapeGroup"></path>
17
+ <path d="M176.856,489.637 C161.763,487.084 148.066,469.738 148.066,469.738 C159.071,481.44 172.771,483.007 172.771,483.007 C174.579,469.643 163.533,439.055 163.533,439.055 C171.714,449.243 176.189,461.027 178.636,470.672 L176.856,489.637" id="Fill-13" fill="#83BAC0" sketch:type="MSShapeGroup"></path>
18
+ <path d="M211.11,465.974 C211.11,465.974 222.984,486.902 233.405,495.957 C244.652,505.728 255.102,519.533 259.544,527.904 C259.544,527.904 265.182,514.808 268.257,510.251 C268.257,510.251 234.943,500.484 211.11,465.974" id="Fill-14" fill="#ABD8D7" sketch:type="MSShapeGroup"></path>
19
+ <path d="M366.089,506.792 C367.74,504.469 369.631,502.31 371.433,500.105 C374.388,496.487 377.764,492.975 380.245,489.038 C375.963,492.242 371.195,495.018 366.321,497.951 C352.174,507.537 342.318,510.251 342.318,510.251 C345.393,514.808 351.031,527.904 351.031,527.904 C353.719,522.838 358.616,515.781 364.551,508.831 C365.049,508.14 365.603,507.477 366.089,506.792" id="Fill-15" fill="#ABD8D7" sketch:type="MSShapeGroup"></path>
20
+ <path d="M206.606,154.316 C205.311,154.41 201.165,154.515 201.165,154.515 C163.603,157.137 135.993,128.029 135.993,128.029 C135.993,128.029 133.525,150.75 149.842,170.66 C166.164,190.57 199.238,193.977 199.238,193.977 C200.313,198.633 197.985,209.016 197.985,209.016 C197.985,209.016 207.656,198.318 210.112,178.048 C211.836,163.844 207.408,154.258 206.606,154.316" id="Fill-16" fill="#545352" sketch:type="MSShapeGroup"></path>
21
+ <path d="M206.606,154.316 C205.36,154.387 201.165,154.515 201.165,154.515 C163.603,157.137 135.993,128.029 135.993,128.029 C135.993,128.029 153.153,177.69 210.462,173.766 C210.462,173.766 212.046,164.58 206.606,154.316" id="Fill-17" fill="#6E7979" sketch:type="MSShapeGroup"></path>
22
+ <path d="M394.146,154.316 C395.44,154.41 399.586,154.515 399.586,154.515 C437.149,157.137 464.758,128.029 464.758,128.029 C464.758,128.029 467.226,150.75 450.91,170.66 C434.587,190.57 401.513,193.977 401.513,193.977 C400.439,198.633 402.767,209.016 402.767,209.016 C402.767,209.016 393.095,198.318 390.639,178.048 C388.915,163.844 393.344,154.258 394.146,154.316" id="Fill-18" fill="#545352" sketch:type="MSShapeGroup"></path>
23
+ <path d="M394.146,154.316 C395.391,154.387 399.586,154.515 399.586,154.515 C437.149,157.137 464.758,128.029 464.758,128.029 C464.758,128.029 447.598,177.69 390.29,173.766 C390.29,173.766 388.705,164.58 394.146,154.316" id="Fill-19" fill="#6E7979" sketch:type="MSShapeGroup"></path>
24
+ <path d="M187,322.551 C187,322.551 160,419.59 187,481.777 L187,322.551" id="Fill-20" fill="#CDE9EE" sketch:type="MSShapeGroup"></path>
25
+ <path d="M455.843,476.05 C442.517,486.219 428.652,486.863 428.652,486.863 C428.034,473.578 442.557,444.533 442.557,444.533 C439.252,446.484 436.596,448.844 434.411,451.433 L434.316,441.686 L444.794,433.031 L436.367,426.197 L447.072,383.144 L436.822,389.978 C436.822,389.978 433.634,328.704 435.911,302.28 C435.911,302.28 422.927,289.294 416.549,284.056 C416.549,284.056 417.754,302.922 419.129,333.066 C424.948,357.247 433.985,407.289 422.743,451.3 C422.873,460.221 422.969,469.281 423.021,478.427 C423.021,478.427 428.623,497.892 430.444,511.559 C430.444,511.559 432.266,512.072 435,511.617 L434.794,490.686 C448.87,486.435 455.843,476.05 455.843,476.05" id="Fill-21" fill="#CDE9EE" sketch:type="MSShapeGroup"></path>
26
+ <path d="M329.531,288.15 C329.531,298.5 336.159,306.89 344.338,306.89 C352.516,306.89 359.146,298.5 359.146,288.15 C359.146,277.798 352.516,269.408 344.338,269.408 C336.159,269.408 329.531,277.798 329.531,288.15" id="Fill-22" fill="#CDE9EE" sketch:type="MSShapeGroup"></path>
27
+ <path d="M329.988,283.144 C329.988,293.334 336.514,301.595 344.567,301.595 C352.619,301.595 359.146,293.334 359.146,283.144 C359.146,272.953 352.619,264.693 344.567,264.693 C336.514,264.693 329.988,272.953 329.988,283.144" id="Fill-23" fill="#FFFFFF" sketch:type="MSShapeGroup"></path>
28
+ <path d="M340.696,273.631 C340.58,274.084 340.5,274.556 340.5,275.057 C340.5,277.656 342.194,279.76 344.282,279.76 C346.138,279.76 347.675,278.096 347.995,275.903 C349.186,277.465 349.92,279.568 349.92,281.891 C349.92,286.704 346.784,290.604 342.916,290.604 C339.048,290.604 335.911,286.704 335.911,281.891 C335.911,278.044 337.916,274.787 340.696,273.631" id="Fill-24" fill="#474746" sketch:type="MSShapeGroup"></path>
29
+ <path d="M258.46,288.15 C258.46,298.5 265.089,306.89 273.268,306.89 C281.445,306.89 288.075,298.5 288.075,288.15 C288.075,277.798 281.445,269.408 273.268,269.408 C265.089,269.408 258.46,277.798 258.46,288.15" id="Fill-25" fill="#CDE9EE" sketch:type="MSShapeGroup"></path>
30
+ <path d="M258.917,283.144 C258.917,293.334 265.444,301.595 273.496,301.595 C281.548,301.595 288.075,293.334 288.075,283.144 C288.075,272.953 281.548,264.693 273.496,264.693 C265.444,264.693 258.917,272.953 258.917,283.144" id="Fill-26" fill="#FFFFFF" sketch:type="MSShapeGroup"></path>
31
+ <path d="M272.359,273.631 C272.243,274.084 272.163,274.556 272.163,275.057 C272.163,277.656 273.856,279.76 275.945,279.76 C277.8,279.76 279.338,278.096 279.658,275.903 C280.849,277.465 281.583,279.568 281.583,281.891 C281.583,286.704 278.446,290.604 274.578,290.604 C270.71,290.604 267.574,286.704 267.574,281.891 C267.574,278.044 269.579,274.787 272.359,273.631" id="Fill-27" fill="#474746" sketch:type="MSShapeGroup"></path>
32
+ <path d="M382.882,302.854 C381.953,305.65 378.798,306.393 369.809,308.131 L369.197,308.249 C360.39,309.94 344.644,309.719 336.02,308.459 C335.648,308.406 335.289,308.351 334.947,308.294 C326.954,306.942 326.044,305.907 323.473,301.764 C320.818,297.476 319.186,284.886 318.885,282.403 L318.87,282.278 C318.551,279.654 318.393,278.34 321.764,276.831 C326.298,274.798 346.422,271.958 354.668,271.587 C361.178,271.3 374.978,272.206 381.288,273.128 C382.277,273.274 383.01,273.407 383.463,273.527 C384.189,273.72 386.862,275.02 386.726,277.862 C386.549,281.608 384.138,299.074 382.882,302.854 L382.882,302.854 Z M295.114,282.278 L295.098,282.403 C294.798,284.886 293.166,297.476 290.511,301.764 C287.94,305.907 287.03,306.942 279.036,308.294 C278.695,308.351 278.336,308.406 277.963,308.459 C269.34,309.719 253.594,309.94 244.786,308.249 L244.175,308.131 C235.186,306.393 232.031,305.65 231.102,302.854 C229.846,299.074 227.435,281.608 227.258,277.862 C227.121,275.02 229.795,273.72 230.521,273.527 C230.973,273.407 231.706,273.274 232.695,273.128 C239.006,272.206 252.805,271.3 259.316,271.587 C267.562,271.958 287.685,274.798 292.219,276.831 C295.591,278.34 295.433,279.654 295.114,282.278 L295.114,282.278 Z M394.425,265.647 C387.822,264.682 376.298,263.588 362.465,264.294 C344.464,265.22 329.04,267.719 319.826,269.211 C317.076,269.657 314.915,270.009 313.266,270.227 L311.467,270.471 C309.446,270.749 308.121,270.925 306.992,270.981 C305.863,270.925 304.537,270.749 302.517,270.471 L300.717,270.227 C299.069,270.009 296.908,269.657 294.157,269.211 C284.944,267.719 269.52,265.22 251.519,264.294 C237.686,263.588 226.162,264.682 219.559,265.647 C219.559,265.647 212.513,266.544 206.487,269.093 L207.636,276.752 C207.636,276.752 214.003,275.236 220.222,274.406 C221.378,285.206 223.627,299.084 223.627,299.084 L223.663,299.514 C223.834,300.214 223.993,300.893 224.165,301.634 C225.446,307.091 226.718,310.299 231.836,312.223 C236.862,314.12 248.755,315.878 260.749,316.496 C265.209,316.727 270.271,316.452 275.391,315.707 C282.984,314.598 289.852,312.554 292.476,310.614 C296.294,307.792 298.336,300.691 299.688,295.993 L300.093,294.608 C300.571,293.006 300.986,291.324 301.387,289.692 C301.964,287.35 302.559,284.929 303.068,284.093 C303.16,283.947 303.588,283.442 305.257,283.197 C305.773,283.123 306.354,283.083 306.992,283.075 C307.63,283.083 308.21,283.123 308.727,283.197 C310.395,283.442 310.824,283.947 310.916,284.093 C311.424,284.929 312.02,287.35 312.596,289.692 C312.998,291.324 313.413,293.006 313.891,294.608 L314.295,295.993 C315.647,300.691 317.69,307.792 321.508,310.614 C324.132,312.554 330.999,314.598 338.592,315.707 C343.712,316.452 348.775,316.727 353.234,316.496 C365.229,315.878 377.121,314.12 382.148,312.223 C387.265,310.299 388.537,307.091 389.819,301.634 C389.991,300.893 390.15,300.214 390.32,299.514 L390.356,299.084 C390.356,299.084 392.605,285.206 393.761,274.406 C399.981,275.236 406.348,276.752 406.348,276.752 L407.497,269.093 C401.471,266.544 394.425,265.647 394.425,265.647 L394.425,265.647 Z" id="Fill-28" fill="#545352" sketch:type="MSShapeGroup"></path>
33
+ <path d="M277.838,246.251 C277.838,246.251 261.369,238.397 251.943,252.981 C251.943,252.981 250.97,238.478 264.27,236.858 C277.571,235.235 277.838,246.251 277.838,246.251" id="Fill-29" fill="#A0D1DE" sketch:type="MSShapeGroup"></path>
34
+ <path d="M271.661,224.941 C271.661,224.941 256.394,217.736 249.438,231.583 C249.438,231.583 247.166,219.485 258.061,216.565 C268.957,213.644 271.661,224.941 271.661,224.941" id="Fill-30" fill="#A0D1DE" sketch:type="MSShapeGroup"></path>
35
+ <path d="M336.832,255.143 C336.832,255.143 349.622,249.043 356.943,260.371 C356.943,260.371 357.699,249.108 347.37,247.848 C337.039,246.588 336.832,255.143 336.832,255.143" id="Fill-31" fill="#A0D1DE" sketch:type="MSShapeGroup"></path>
36
+ <path d="M345.927,234.97 C345.927,234.97 358.869,232.875 361.085,244.704 C361.085,244.704 365.381,236.164 357.878,231.643 C350.374,227.12 345.927,234.97 345.927,234.97" id="Fill-32" fill="#A0D1DE" sketch:type="MSShapeGroup"></path>
37
+ <path d="M276.693,361.144 C276.693,361.144 285.729,355.071 291.063,354.235 C291.063,354.235 292.227,365.694 297.527,371.341 C297.527,371.341 308.966,361.03 320.278,360.297 C320.278,360.297 323.198,366.581 327.939,368.911 L327.912,368.984 C329.623,370.052 331.719,371.132 333.749,371.583 C333.749,371.583 340.241,367.654 342.12,360.478 C342.12,360.478 342.745,375.627 333.236,383.884 C333.236,383.884 325.985,380.345 320.761,374.681 C319.192,373.153 317.561,371.376 316.769,369.931 C316.769,369.931 299.993,381.799 299.38,388.567 C299.38,388.567 287.27,376.76 283.141,367.663 C283.141,367.663 275.059,370.214 272.817,371.858 C272.817,371.858 266.321,361.234 265.002,351.647 C265.002,351.647 272.814,359.108 276.693,361.144" id="Fill-33" fill="#B2DCE5" sketch:type="MSShapeGroup"></path>
38
+ <path d="M307.187,331.37 C306.517,331.227 324.203,332.594 341.569,331.977 C341.569,331.977 342.497,328.664 343.829,326.844 C343.829,326.844 343.539,332.42 345.099,333.561 C345.099,333.561 336.409,336.982 327.645,336.957 C327.645,336.957 337.195,335.363 340.398,333.715 C340.398,333.715 322.971,334.685 307.187,331.37" id="Fill-34" fill="#545352" sketch:type="MSShapeGroup"></path>
39
+ </g>
40
+ </g>
41
+ </svg>
@@ -0,0 +1,14 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require rails-ujs
14
+ //= require bedrock
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require admin
@@ -0,0 +1,2 @@
1
+ @import "foundation-components";
2
+ @import "bedrock-components";
@@ -0,0 +1 @@
1
+ @import "admin";
@@ -0,0 +1,7 @@
1
+ module ActionAdmin
2
+ class BaseController < ActionController::Base
3
+ def self.inherited(subclass)
4
+ subclass.send(:include, ActionAdmin::Actionable)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module ActionAdmin
2
+ class CrudController < ActionController::Base
3
+ def self.inherited(subclass)
4
+ subclass.send(:include, ActionAdmin::Crudable)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ module ActionAdmin
2
+ class WelcomeController < ActionController::Base
3
+ def index
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,26 @@
1
+ module ActionAdmin
2
+ module AdminHelper
3
+ def admin_app_name
4
+ ActionAdmin.config.app_name
5
+ end
6
+
7
+ def admin_action_title(action=nil)
8
+ name = action || action_name
9
+ controller.action_header.action_title(name, self)
10
+ end
11
+
12
+ def admin_meta_tags
13
+ tags = {
14
+ site: admin_app_name,
15
+ noindex: true,
16
+ nofollow: true,
17
+ reverse: true,
18
+ title: admin_action_title || "#{action_name}".titleize,
19
+ charset: 'utf-8'
20
+ }
21
+
22
+ set_meta_tags tags
23
+ display_meta_tags
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ module ActionAdmin
2
+ module FormHelper
3
+ # Admin simple form
4
+ def admin_form_for(object, *args, &block)
5
+ options = args.extract_options!
6
+ builder = { builder: ActionAdmin::SimpleForm::FormBuilder }
7
+ options = options.merge(builder) unless options[:builder]
8
+
9
+ simple_form_for(object, *(args << options), &block)
10
+ end
11
+
12
+ # Admin simple form fields
13
+ def admin_fields_for(*args, &block)
14
+ options = args.extract_options!
15
+ builder = { builder: ActionAdmin::SimpleForm::FormBuilder }
16
+ options = options.merge(builder) unless options[:builder]
17
+
18
+ simple_form_for(*(args << options), &block)
19
+ end
20
+
21
+ # Admin simple form with placeholders
22
+ def admin_minimal_form_for(object, *args, &block)
23
+ options = args.extract_options!
24
+ options = options.merge(builder: ActionAdmin::SimpleForm::MinimalFormBuilder)
25
+
26
+ admin_form_for(object, *(args << options), &block)
27
+ end
28
+
29
+ # Admin simple form fields with placeholders
30
+ def admin_minimal_fields_for(*args, &block)
31
+ options = args.extract_options!
32
+ options = options.merge(builder: ActionAdmin::SimpleForm::MinimalFormBuilder)
33
+
34
+ admin_fields_for(*(args << options), &block)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,110 @@
1
+ module ActionAdmin
2
+ module MarkupHelper
3
+ def admin_icon(name, options={})
4
+ opts = options.except(:text, :revert).merge(class: "mdi mdi-#{name}")
5
+ icon = content_tag :i, nil, opts if name.present?
6
+ text = options[:text]
7
+ data = options[:revert].present? ? [text, icon] : [icon, text]
8
+
9
+ data.join(' ').html_safe
10
+ end
11
+
12
+ def admin_pagination(records, options={})
13
+ options = options.merge({
14
+ previous_class: 'pagination-previous',
15
+ next_class: 'pagination-next',
16
+ active_class: 'current'
17
+ })
18
+
19
+ smart_pagination_for(records, options)
20
+ end
21
+
22
+ def admin_table_pagination(records)
23
+ info = content_tag :div, smart_pagination_info_for(records), class: 'shrink cell'
24
+ links = admin_pagination(records, wrapper_class: 'pagination margin-0')
25
+ links = content_tag :div, links, class: 'auto cell text-right'
26
+
27
+ content_tag :div, info + links, class: 'grid-x'
28
+ end
29
+
30
+ def admin_primary_menu
31
+ options = {
32
+ menu_class: 'vertical menu icons icon-left accordion-menu',
33
+ menu_html: { 'data-accordion-menu': '', 'data-submenu-toggle': true },
34
+ separator_class: 'is-separator',
35
+ submenu_parent_class: 'has-children',
36
+ submenu_class: 'vertical menu nested',
37
+ active_class: 'is-current',
38
+ active_submenu_class: 'is-current',
39
+ icon_prefix: 'mdi mdi-'
40
+ }
41
+
42
+ smart_navigation_for ActionAdmin.config.menus.primary, options
43
+ end
44
+
45
+ def admin_secondary_menu
46
+ options = {
47
+ menu_class: 'vertical menu secondary icons icon-right',
48
+ separator_class: 'is-separator',
49
+ submenu_parent_class: 'has-children',
50
+ submenu_class: 'vertical menu nested',
51
+ active_class: 'is-current',
52
+ active_submenu_class: 'is-current',
53
+ icon_prefix: 'mdi mdi-',
54
+ icon_position: 'right'
55
+ }
56
+
57
+ smart_navigation_for ActionAdmin.config.menus.secondary, options
58
+ end
59
+
60
+ def admin_topbar_menu(position)
61
+ items = {
62
+ left: {
63
+ toggle: { icon: 'menu', html: { 'data-toggle': 'sidebar' } }
64
+ },
65
+ right: {
66
+ website: { url: :root_url, icon: 'web', html: { target: :_blank } }
67
+ }
68
+ }
69
+
70
+ options = {
71
+ menu_class: 'menu',
72
+ separator_class: 'is-separator',
73
+ submenu_parent_class: 'has-children',
74
+ submenu_class: 'vertical menu nested',
75
+ active_class: 'is-current',
76
+ active_submenu_class: 'is-current',
77
+ icon_prefix: 'mdi mdi-',
78
+ icon_position: 'right'
79
+ }
80
+
81
+ smart_navigation_for items[position], options
82
+ end
83
+
84
+ def admin_action_links(action=nil)
85
+ name = action || action_name
86
+ links = controller.action_header.action_links(name, self).map do |link|
87
+ opts = Hash(link[:html]).merge(method: link[:method])
88
+ classes = "button small hollow #{opts[:class]}".strip
89
+ label = admin_icon(link[:icon], text: link[:label])
90
+
91
+ link_to label, link[:url], opts.merge(class: classes)
92
+ end
93
+
94
+ links.join(' ').html_safe
95
+ end
96
+
97
+ def admin_table_action_links(record, actions=nil)
98
+ options = {
99
+ show: { label: admin_icon('eye'), title: 'View', class: 'success' },
100
+ edit: { label: admin_icon('pencil'), title: 'Edit' },
101
+ destroy: { label: admin_icon('delete'), title: 'Delete', class: 'alert' }
102
+ }
103
+
104
+ options = options.select { |k, _v| k.in? actions } if actions.present?
105
+ options = options.merge(html: { class: 'button hollow' })
106
+
107
+ record_links_to record, options
108
+ end
109
+ end
110
+ end
@@ -0,0 +1 @@
1
+ = 'Welcome to ActionAdmin'
@@ -0,0 +1,4 @@
1
+ - unless admin_action_title.nil?
2
+ .header
3
+ h1.h3.title = admin_action_title
4
+ .actions = admin_action_links
@@ -0,0 +1,3 @@
1
+ .logo-bar
2
+ .logo-image = image_tag 'admin/logo.svg'
3
+ span = admin_app_name
@@ -0,0 +1 @@
1
+ .callout.warning = 'No results found'
@@ -0,0 +1,4 @@
1
+ = render 'admin/common/logobar'
2
+ = admin_primary_menu
3
+ .margin-vertical-1
4
+ = admin_secondary_menu
@@ -0,0 +1,6 @@
1
+ .top-bar
2
+ .top-bar-left
3
+ = admin_topbar_menu :left
4
+
5
+ .top-bar-right
6
+ = admin_topbar_menu :right
@@ -0,0 +1,29 @@
1
+ = admin_form_for([:admin, current_record]) do |f|
2
+ = f.error_notification
3
+
4
+ .panel
5
+ .panel-header.border = action_name.titleize
6
+ .panel-content.border
7
+ - (permitted_params - current_model.attribute_aliases.values.map(&:to_sym)).each do |parameter|
8
+ - parameter = parameter.first if parameter.is_a? Array
9
+ - parameter = parameter.keys.first if parameter.is_a? Hash
10
+
11
+ - if current_record.respond_to? parameter
12
+ - if parameter.to_s == 'parent_id'
13
+ - exclude = [current_record.id] + current_record.child_ids unless current_record.new_record?
14
+ = f.input parameter, as: :select, collection: current_model.where.not(id: exclude), include_blank: 'No parent'
15
+ - else
16
+ - assoc = parameter.to_s.sub('_ids', '').sub('_id', '')
17
+ - single = current_model.reflect_on_association(assoc)
18
+ - plural = current_model.reflect_on_association(assoc.pluralize)
19
+ - assoc = assoc.pluralize unless plural.nil?
20
+
21
+ - if parameter.to_s.ends_with?('_id')
22
+ = f.input parameter, collection: single.options[:class_name].classify.constantize.all, include_blank: 'None'
23
+ - elsif parameter.to_s.ends_with?('_ids')
24
+ = f.association assoc
25
+ - else
26
+ = f.input parameter, include_blank: 'Default', placeholder: "Enter #{parameter.to_s.humanize.downcase}..."
27
+
28
+ .panel-footer
29
+ = f.button :submit, class: 'margin-0'
@@ -0,0 +1 @@
1
+ = render 'form'
@@ -0,0 +1,34 @@
1
+ - if current_records.empty?
2
+ = render 'admin/common/noresults'
3
+
4
+ - else
5
+ .panel
6
+ .panel-header = action_name.titleize
7
+ .panel-content.padding-0.border-none
8
+ table.unstriped.margin-0 data-table-checkbox=""
9
+ thead
10
+ tr
11
+ - permitted_params.first(1).each do |parameter|
12
+ - if current_record.respond_to? parameter
13
+ - parameter = parameter.first if parameter.is_a? Array
14
+ - parameter = parameter.keys.first if parameter.is_a? Hash
15
+ th.expand = parameter.to_s.titleize
16
+
17
+ th.shrink.actions Actions
18
+
19
+ tbody
20
+ - current_records.each do |record|
21
+ tr
22
+ - permitted_params.first(1).each do |parameter|
23
+ - parameter = parameter.first if parameter.is_a? Array
24
+ - parameter = parameter.keys.first if parameter.is_a? Hash
25
+
26
+ - if record.respond_to? parameter
27
+ td.expand = attribute_for record, parameter
28
+
29
+ td.shrink.actions
30
+ = admin_table_action_links record
31
+
32
+ - if current_records.respond_to? :current_page
33
+ .panel-footer
34
+ = admin_table_pagination current_records
@@ -0,0 +1 @@
1
+ = render 'form'
@@ -0,0 +1,13 @@
1
+ .panel
2
+ .panel-header = action_name.titleize
3
+ .panel-content.padding-0.border-none
4
+ table.margin-0
5
+ tbody
6
+ - (permitted_params - current_model.attribute_aliases.values.map(&:to_sym)).each do |parameter|
7
+ - parameter = parameter.first if parameter.is_a? Array
8
+ - parameter = parameter.keys.first if parameter.is_a? Hash
9
+
10
+ - if current_record.respond_to? parameter
11
+ tr
12
+ td = "#{parameter.to_s.titleize}"
13
+ td = attribute_for current_record, parameter
@@ -0,0 +1,29 @@
1
+ doctype html
2
+
3
+ html
4
+ head
5
+ meta name="viewport" content="width=device-width, initial-scale=1.0"
6
+ meta http-equiv="X-UA-Compatible" content="IE=edge"
7
+ = admin_meta_tags
8
+ = csrf_meta_tags
9
+ = favicon_link_tag 'admin/favicon.png'
10
+ = stylesheet_link_tag 'admin/application', media: 'all'
11
+
12
+ body
13
+ .off-canvas-wrapper
14
+ .off-canvas-menu-wrapper.off-canvas-content data-off-canvas-content=""
15
+ #sidebar.off-canvas-menu.position-left data-off-canvas-menu=""
16
+ = render 'admin/common/sidebar'
17
+
18
+ .off-canvas-menu-content data-off-canvas-content=""
19
+ = render 'admin/common/topbar'
20
+
21
+ main.content
22
+ = render 'admin/common/header'
23
+ = yield
24
+ = render 'admin/common/footer'
25
+
26
+ #offcanvas.off-canvas.position-right data-off-canvas=""
27
+ = render 'admin/common/messagebar'
28
+
29
+ = javascript_include_tag 'admin/application'
@@ -0,0 +1,89 @@
1
+ SimpleForm.setup do |config|
2
+ config.wrappers :admin_vertical_form, class: :input, hint_class: :field_with_hint, error_class: :error do |b|
3
+ b.use :html5
4
+ b.use :placeholder
5
+ b.optional :maxlength
6
+ b.optional :minlength
7
+ b.optional :pattern
8
+ b.optional :min_max
9
+ b.optional :readonly
10
+ b.use :label_input
11
+ b.use :error, wrap_with: { tag: :span, class: 'form-error is-visible' }
12
+ b.use :hint, wrap_with: { tag: :p, class: 'help-text' }
13
+ end
14
+
15
+ config.wrappers :admin_horizontal_form, tag: 'div', class: 'row', hint_class: :field_with_hint, error_class: :error do |b|
16
+ b.use :html5
17
+ b.use :placeholder
18
+ b.optional :maxlength
19
+ b.optional :minlength
20
+ b.optional :pattern
21
+ b.optional :min_max
22
+ b.optional :readonly
23
+
24
+ b.wrapper :label_wrapper, tag: :div, class: 'small-3 columns' do |ba|
25
+ ba.use :label, class: 'right inline'
26
+ end
27
+
28
+ b.wrapper :right_input_wrapper, tag: :div, class: 'small-9 columns' do |ba|
29
+ ba.use :input
30
+ ba.use :error, wrap_with: { tag: :span, class: 'form-error is-visible' }
31
+ ba.use :hint, wrap_with: { tag: :p, class: 'help-text' }
32
+ end
33
+ end
34
+
35
+ config.wrappers :admin_inline_form, tag: 'div', class: 'column small-4', hint_class: :field_with_hint, error_class: :error do |b|
36
+ b.use :html5
37
+ b.use :placeholder
38
+ b.optional :maxlength
39
+ b.optional :minlength
40
+ b.optional :pattern
41
+ b.optional :min_max
42
+ b.optional :readonly
43
+
44
+ b.use :label, class: 'hidden-for-small-up'
45
+ b.use :input
46
+
47
+ b.use :error, wrap_with: { tag: :span, class: 'form-error is-visible' }
48
+ b.use :hint, wrap_with: { tag: :p, class: 'help-text' }
49
+ end
50
+
51
+ config.wrappers :admin_horizontal_radio_and_checkboxes, tag: 'div', class: 'row' do |b|
52
+ b.use :html5
53
+ b.optional :readonly
54
+
55
+ b.wrapper :container_wrapper, tag: 'div', class: 'small-offset-3 small-9 columns' do |ba|
56
+ ba.wrapper tag: 'label', class: 'checkbox' do |bb|
57
+ bb.use :input
58
+ bb.use :label_text
59
+ end
60
+
61
+ ba.use :error, wrap_with: { tag: :span, class: 'form-error is-visible' }
62
+ ba.use :hint, wrap_with: { tag: :p, class: 'help-text' }
63
+ end
64
+ end
65
+
66
+ config.wrappers :admin_horizontal_multi_select, tag: 'div', class: :input, error_class: :error do |b|
67
+ b.use :html5
68
+ b.optional :readonly
69
+ b.use :label, class: 'right inline'
70
+
71
+ b.wrapper tag: 'div', class: 'small-4 columns' do |ba|
72
+ ba.use :input
73
+ ba.use :error, wrap_with: { tag: :span, class: 'form-error is-visible' }
74
+ ba.use :hint, wrap_with: { tag: :p, class: 'help-text' }
75
+ end
76
+ end
77
+
78
+ config.wrappers :admin_customizable_wrapper, tag: 'div', error_class: :error do |b|
79
+ b.use :html5
80
+ b.optional :readonly
81
+
82
+ b.wrapper :custom_wrapper, tag: :div do |ba|
83
+ ba.use :label_input
84
+ end
85
+
86
+ b.use :error, wrap_with: { tag: :span, class: 'form-error is-visible' }
87
+ b.use :hint, wrap_with: { tag: :p, class: 'help-text' }
88
+ end
89
+ end
@@ -0,0 +1,3 @@
1
+ ActionAdmin::Engine.routes.draw do
2
+ root 'action_admin/welcome#index'
3
+ end
@@ -0,0 +1,31 @@
1
+ require 'hashie'
2
+ require 'simple_form'
3
+ require 'bedrock_sass'
4
+ require 'action_crud'
5
+ require 'smart_pagination'
6
+ require 'smart_navigation'
7
+ require 'simple_attribute'
8
+ require 'action_admin/engine'
9
+
10
+ module ActionAdmin
11
+ extend ActiveSupport::Autoload
12
+
13
+ # Autoload modules
14
+ autoload :Config
15
+ autoload :SimpleForm
16
+ autoload :Controller
17
+ autoload :Actionable
18
+ autoload :Crudable
19
+ autoload :Header
20
+
21
+ # Set attr accessors
22
+ mattr_accessor :config
23
+
24
+ # Set config options
25
+ @@config = Config.new
26
+
27
+ # Setup module config
28
+ def self.setup
29
+ yield config
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ module ActionAdmin
2
+ module Actionable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ include Controller
7
+
8
+ class_attribute :action_header
9
+ self.action_header = Header.new
10
+ end
11
+
12
+ class_methods do
13
+ def action_title(action, title)
14
+ self.action_header.action(action)
15
+ self.action_header.title(title)
16
+ end
17
+
18
+ def header(action, &block)
19
+ self.action_header.action(action)
20
+ yield self.action_header
21
+ self.action_header.action(nil)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,14 @@
1
+ module ActionAdmin
2
+ class Config < Hashie::Dash
3
+ property :app_name, default: 'Action Admin'
4
+ property :menus, default: Hashie::Mash.new
5
+
6
+ def menu(name, &block)
7
+ if self.menus.send(:"#{name}").nil?
8
+ self.menus.send(:"#{name}=", Hashie::Mash.new)
9
+ end
10
+
11
+ yield self.menus.send(:"#{name}")
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,26 @@
1
+ module ActionAdmin
2
+ module Controller
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ # Set layout
7
+ layout 'admin'
8
+
9
+ # Use forgery protection
10
+ protect_from_forgery with: :exception
11
+
12
+ # Render default view
13
+ rescue_from ActionController::UnknownFormat, with: :render_default_view
14
+ end
15
+
16
+ private
17
+
18
+ # Render default view template
19
+ def render_default_view
20
+ respond_to do |format|
21
+ format.html { render 'admin/common/action' }
22
+ format.json { render json: { message: 'No content' }, status: :unprocessable_entity }
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ module ActionAdmin
2
+ module Crudable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ include Actionable
7
+ include ActionCrud
8
+
9
+ set_namespace :admin
10
+ permit_params except: [:created_at, :updated_at, :type, :ancestry]
11
+ end
12
+
13
+ class_methods do
14
+ def controller_path
15
+ 'admin/records'
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ module ActionAdmin
2
+ class Engine < ::Rails::Engine
3
+ config.generators do |g|
4
+ g.template_engine :slim
5
+ end
6
+
7
+ initializer 'action_admin.assets.precompile' do |app|
8
+ app.config.assets.precompile += %w(admin/*)
9
+ end
10
+
11
+ initializer 'action_admin', before: :load_config_initializers do
12
+ Rails.application.routes.append do
13
+ mount ActionAdmin::Engine, at: 'admin'
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,85 @@
1
+ module ActionAdmin
2
+ class Header
3
+ class_attribute :actions
4
+ class_attribute :current_actions
5
+
6
+ def initialize
7
+ self.actions = {}
8
+ end
9
+
10
+ def action(names)
11
+ self.current_actions = Array(names)
12
+ end
13
+
14
+ def title(value)
15
+ current_actions.each { |a| add_action_key(a, :title, value) }
16
+ end
17
+
18
+ def link(options)
19
+ current_actions.each { |a| add_action_key(a, :links, options, true) }
20
+ end
21
+
22
+ def action_title(name, context)
23
+ title = Hash(actions[:"#{name}"]).fetch :title, default_title(context)
24
+ evaluate_value(title, context)
25
+ end
26
+
27
+ def action_links(name, context)
28
+ links = Hash(actions[:"#{name}"]).fetch :links, default_action_links(name, context)
29
+
30
+ Array(links).map do |link|
31
+ Hash[link.map { |k, v| [k, evaluate_value(v, context)] }]
32
+ end
33
+ end
34
+
35
+ def default_title(context)
36
+ if context.action_name == 'index'
37
+ context.controller_name.titleize
38
+ else
39
+ context.action_name.titleize
40
+ end
41
+ end
42
+
43
+ def default_action_links(name, context)
44
+ setup = { index: :new, new: :index, show: [:index, :edit, :destroy], edit: [:index, :show, :destroy] }
45
+ links = default_links(context)
46
+
47
+ Array(setup[:"#{name}"]).map { |l| links[l] }.reject(&:nil?)
48
+ end
49
+
50
+ def default_links(context)
51
+ return {} unless context.controller.respond_to? :permitted_params
52
+
53
+ {
54
+ show: { label: 'View', icon: 'eye', url: :record_path },
55
+ index: { label: 'Back', icon: 'arrow-left', url: :records_path, html: { class: 'inactive' } },
56
+ new: { label: 'New', icon: 'plus', url: :new_record_path, html: { class: 'success' } },
57
+ edit: { label: 'Edit', icon: 'pencil', url: :edit_record_path, html: { class: 'warning' } },
58
+ destroy: { label: 'Delete', icon: 'delete', url: :record_path, html: { class: 'alert' }, method: 'delete' }
59
+ }
60
+ end
61
+
62
+ private
63
+
64
+ def add_action_key(action, key, value, append=false)
65
+ self.actions[action] = {} unless self.actions.key?(action)
66
+
67
+ if append.present?
68
+ self.actions[action][key] = Array(self.actions[action][key])
69
+ self.actions[action][key] += [value]
70
+ else
71
+ self.actions[action][key] = value
72
+ end
73
+ end
74
+
75
+ def evaluate_value(value, context)
76
+ if value.is_a?(Proc)
77
+ context.instance_exec(&value)
78
+ elsif value.is_a?(Symbol)
79
+ context.try(value) || value
80
+ else
81
+ value
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,9 @@
1
+ module ActionAdmin
2
+ module SimpleForm
3
+ extend ActiveSupport::Autoload
4
+
5
+ autoload :FormBuilder
6
+ autoload :MinimalFormBuilder
7
+ autoload :ErrorNotification
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module ActionAdmin
2
+ module SimpleForm
3
+ class ErrorNotification < ::SimpleForm::ErrorNotification
4
+ def html_options
5
+ @options[:class] = "callout alert #{@options[:class]}".strip
6
+ @options
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,53 @@
1
+ module ActionAdmin
2
+ module SimpleForm
3
+ class FormBuilder < ::SimpleForm::FormBuilder
4
+ # Initialize form builder
5
+ def initialize(*)
6
+ super
7
+
8
+ @admin = {
9
+ button_class: 'button',
10
+ error_notification_class: 'callout alert',
11
+ default_wrapper: :admin_vertical_form,
12
+ wrapper_mappings: {
13
+ check_boxes: :admin_horizontal_radio_and_checkboxes,
14
+ radio_buttons: :admin_horizontal_radio_and_checkboxes,
15
+ # boolean: :admin_horizontal_radio_and_checkboxes,
16
+ datetime: :admin_horizontal_multi_select,
17
+ date: :admin_horizontal_multi_select,
18
+ time: :admin_horizontal_multi_select,
19
+ # file: :admin_horizontal_file_input
20
+ }
21
+ }
22
+
23
+ @wrapper = ::SimpleForm.wrapper(options[:wrapper] || @admin[:default_wrapper])
24
+ end
25
+
26
+ # Create form button
27
+ def button(type, *args, &block)
28
+ options = args.extract_options!.dup
29
+ options[:class] = [@admin[:button_class], options[:class]].compact
30
+ args << options
31
+ if respond_to?(:"#{type}_button")
32
+ send(:"#{type}_button", *args, &block)
33
+ else
34
+ send(type, *args, &block)
35
+ end
36
+ end
37
+
38
+ # Create error notification
39
+ def error_notification(options={})
40
+ SimpleForm::ErrorNotification.new(self, options).render
41
+ end
42
+
43
+ # Find field wrapper
44
+ def find_wrapper_mapping(input_type)
45
+ if options[:wrapper_mappings] && options[:wrapper_mappings][input_type]
46
+ options[:wrapper_mappings][input_type]
47
+ else
48
+ @admin[:wrapper_mappings] && @admin[:wrapper_mappings][input_type]
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,20 @@
1
+ module ActionAdmin
2
+ module SimpleForm
3
+ class MinimalFormBuilder < FormBuilder
4
+ # Form builder input
5
+ def input(attribute_name, options = {}, &block)
6
+ if options[:placeholder].nil?
7
+ options[:placeholder] ||= if object.class.respond_to?(:human_attribute_name)
8
+ object.class.human_attribute_name(attribute_name.to_s)
9
+ else
10
+ attribute_name.to_s.humanize
11
+ end
12
+
13
+ options[:label] = false if options[:label].nil?
14
+ end
15
+
16
+ super
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module ActionAdmin
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc 'Explaining what the task does'
2
+ # task :action_admin do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,242 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: action_admin
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jonian Guveli
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-12-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: slim
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: hashie
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.5'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bedrock_sass
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: action_crud
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.1'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.1'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simple_form
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.5'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.5'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simple_attribute
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.1'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: smart_navigation
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.1'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.1'
125
+ - !ruby/object:Gem::Dependency
126
+ name: smart_pagination
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.2'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.2'
139
+ - !ruby/object:Gem::Dependency
140
+ name: meta-tags
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '2.6'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '2.6'
153
+ - !ruby/object:Gem::Dependency
154
+ name: sqlite3
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: Ruby on Rails mountable engine to create admin interfaces.
168
+ email:
169
+ - jonian@hardpixel.eu
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - LICENSE.txt
175
+ - README.md
176
+ - Rakefile
177
+ - app/assets/images/admin/logo.svg
178
+ - app/assets/javascripts/admin/admin.js
179
+ - app/assets/javascripts/admin/application.js
180
+ - app/assets/stylesheets/admin/admin.scss
181
+ - app/assets/stylesheets/admin/application.scss
182
+ - app/controllers/action_admin/base_controller.rb
183
+ - app/controllers/action_admin/crud_controller.rb
184
+ - app/controllers/action_admin/welcome_controller.rb
185
+ - app/helpers/action_admin/admin_helper.rb
186
+ - app/helpers/action_admin/form_helper.rb
187
+ - app/helpers/action_admin/markup_helper.rb
188
+ - app/views/action_admin/welcome/index.html.slim
189
+ - app/views/admin/common/_footer.html.slim
190
+ - app/views/admin/common/_header.html.slim
191
+ - app/views/admin/common/_logobar.html.slim
192
+ - app/views/admin/common/_messagebar.html.slim
193
+ - app/views/admin/common/_noresults.html.slim
194
+ - app/views/admin/common/_sidebar.html.slim
195
+ - app/views/admin/common/_topbar.html.slim
196
+ - app/views/admin/common/action.html.slim
197
+ - app/views/admin/records/_form.html.slim
198
+ - app/views/admin/records/edit.html.slim
199
+ - app/views/admin/records/index.html.slim
200
+ - app/views/admin/records/new.html.slim
201
+ - app/views/admin/records/show.html.slim
202
+ - app/views/layouts/admin.html.slim
203
+ - config/initializers/admin_simple_form.rb
204
+ - config/routes.rb
205
+ - lib/action_admin.rb
206
+ - lib/action_admin/actionable.rb
207
+ - lib/action_admin/config.rb
208
+ - lib/action_admin/controller.rb
209
+ - lib/action_admin/crudable.rb
210
+ - lib/action_admin/engine.rb
211
+ - lib/action_admin/header.rb
212
+ - lib/action_admin/simple_form.rb
213
+ - lib/action_admin/simple_form/error_notification.rb
214
+ - lib/action_admin/simple_form/form_builder.rb
215
+ - lib/action_admin/simple_form/minimal_form_builder.rb
216
+ - lib/action_admin/version.rb
217
+ - lib/tasks/action_admin_tasks.rake
218
+ homepage: https://github.com/hardpixel/action-admin
219
+ licenses:
220
+ - MIT
221
+ metadata: {}
222
+ post_install_message:
223
+ rdoc_options: []
224
+ require_paths:
225
+ - lib
226
+ required_ruby_version: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - ">="
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ required_rubygems_version: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ version: '0'
236
+ requirements: []
237
+ rubyforge_project:
238
+ rubygems_version: 2.6.13
239
+ signing_key:
240
+ specification_version: 4
241
+ summary: Ruby on Rails mountable engine to create admin interfaces
242
+ test_files: []