hyper_admin 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3e9475b5186237711fecfe84516e04248294387a
4
- data.tar.gz: 80d813f2e0fd46afcf048359be4fbabe8456fb0e
3
+ metadata.gz: ca64683cb272c25b4eeb5007b084ae000c24eefc
4
+ data.tar.gz: 9c413d53f02d48973e763d79e22e3c17ed41092e
5
5
  SHA512:
6
- metadata.gz: 325d4cc11d35e4fac39906de0f243a2484d6d807b6511a90f7e14ffb3ddc7592dee770d92b9cd6bcc1fe5b7b8a003d4f8d2073afe84e33947cca3b7ecaf49ed6
7
- data.tar.gz: 8823ce1e2af1897966f4aad4fa4ce6c4ec96f2e63bbf4566cf9a3a92c455388411483923a9b63abade68da052714027f01058d3a4d17b006f1951d6b8a259625
6
+ metadata.gz: 5f4762f95187e6c9528cdaddaa7fc3ab92ee08515396aa08c59d818b3994c9cda96423ed5480251f67819904ce3867904732e97c94428be671c1b281ec021b0c
7
+ data.tar.gz: 504312af56071a2148ed7d36c83df58b254592c8ef761e2b9058f284fca5ad7823b647592bfa0210fe79f39e0ea258817aea4c9b58f67325d4d5772e92c93401
@@ -0,0 +1,2 @@
1
+ //= require jquery
2
+ //= require jquery_ujs
@@ -1,4 +1,12 @@
1
1
  module HyperAdmin
2
2
  class ApplicationController < ActionController::Base
3
+ before_action :load_all_resource_classes
4
+
5
+ protected
6
+
7
+ def load_all_resource_classes
8
+ collection = ::HyperAdmin.application.resources
9
+ @resource_classes = collection.resources.values.map(&:resource_class)
10
+ end
3
11
  end
4
12
  end
@@ -0,0 +1,76 @@
1
+ module HyperAdmin
2
+ class ResourceController < ApplicationController
3
+ before_action :set_resource_class
4
+ before_action :permit_params, only: [ :create, :update ]
5
+
6
+ def index
7
+ @resources = resource_class.all
8
+ render 'admin/resources/index', layout: layout
9
+ end
10
+
11
+ def show
12
+ @resource = resource
13
+ render 'admin/resources/show', layout: layout
14
+ end
15
+
16
+ def new
17
+ @resource = resource_class.new
18
+ render 'admin/resources/new', layout: layout
19
+ end
20
+
21
+ def edit
22
+ @resource = resource
23
+ render 'admin/resources/edit', layout: layout
24
+ end
25
+
26
+ def create
27
+ @resource = @resource_class.new params[@resource_class.model_name.param_key]
28
+
29
+ if @resource.save
30
+ redirect_to [ :admin, @resource ]
31
+ else
32
+ render "admin/resources/new", layout: layout
33
+ end
34
+ end
35
+
36
+ def update
37
+ @resource = @resource_class.find params[:id]
38
+
39
+ if @resource.update params[@resource_class.model_name.param_key]
40
+ redirect_to [ :admin, @resource ]
41
+ else
42
+ render "admin/resources/edit", layout: layout
43
+ end
44
+ end
45
+
46
+ def destroy
47
+ @resource = @resource_class.find params[:id]
48
+
49
+ @resource.destroy
50
+
51
+ redirect_to [ :admin, @resource_class ]
52
+ end
53
+
54
+ def resource
55
+ resource_class.find params[:id]
56
+ end
57
+
58
+ def resource_class
59
+ raise "This method must be overridden"
60
+ end
61
+
62
+ protected
63
+
64
+ def set_resource_class
65
+ @resource_class = resource_class
66
+ end
67
+
68
+ def permit_params
69
+ params.permit!
70
+ end
71
+
72
+ def layout
73
+ 'hyper_admin/application'
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,27 @@
1
+ <div class="row">
2
+ <div class="col-xs-12">
3
+ <%= form_for [ :admin, resource ], html: { class: 'form-horizontal' } do |form| %>
4
+ <%
5
+ attributes = resource.attributes.delete_if do |k, v|
6
+ k.to_sym.in? [ :id, :created_at, :updated_at ]
7
+ end
8
+ %>
9
+ <% attributes.each do |key, val| %>
10
+ <div class="form-group">
11
+ <%= form.label key, class: "col-sm-2 control-label" %>
12
+ <div class="col-sm-10">
13
+ <%= form.text_field key, class: "form-control",
14
+ placeholder: resource_class.human_attribute_name(key) %>
15
+ </div>
16
+ </div>
17
+ <% end %>
18
+
19
+ <div class="form-group">
20
+ <div class="col-sm-offset-2 col-sm-10">
21
+ <button type="submit" class="btn btn-primary">Submit</button>
22
+ <%= link_to "Cancel", [ :admin, resource_class ], class: "btn btn-danger" %>
23
+ </div>
24
+ </div>
25
+ <% end %>
26
+ </div>
27
+ </div>
@@ -0,0 +1,9 @@
1
+ <div class="row">
2
+ <div class="col-xs-12">
3
+ <header class="page-header">
4
+ <h1>Edit <%= @resource_class.model_name.singular %></h1>
5
+ </header>
6
+ </div>
7
+ </div>
8
+
9
+ <%= render "admin/resources/form", resource_class: @resource_class, resource: @resource %>
@@ -0,0 +1,39 @@
1
+ <div class="row">
2
+ <div class="col-xs-12">
3
+ <header class="page-header">
4
+ <div class="pull-right">
5
+ <%= link_to "Create new",[ :new, :admin, @resource_class.model_name.singular_route_key ], class: "btn btn-lg btn-success" %>
6
+ </div>
7
+ <h1>All <%= @resource_class.model_name.plural %></h1>
8
+ </header>
9
+ </div>
10
+ </div>
11
+
12
+ <div class="row">
13
+ <div class="col-xs-12">
14
+ <table class="table table-striped">
15
+ <thead>
16
+ <tr>
17
+ <% @resource_class.attribute_names.each do |attr| %>
18
+ <th><%= @resource_class.human_attribute_name attr %></th>
19
+ <% end %>
20
+ <th>&nbsp;</th>
21
+ </tr>
22
+ </thead>
23
+ <tbody>
24
+ <% @resources.each do |resource| %>
25
+ <tr>
26
+ <% resource.attributes.values.each do |attr| %>
27
+ <td><%= attr %></th>
28
+ <% end %>
29
+ <td>
30
+ <%= link_to "Show", [ :admin, resource ] %>
31
+ <%= link_to "Edit", [ :edit, :admin, resource ] %>
32
+ <%= link_to "Destroy", [ :admin, resource ], method: :delete %>
33
+ </td>
34
+ </tr>
35
+ <% end %>
36
+ </tbody>
37
+ </table>
38
+ </div>
39
+ </div>
@@ -0,0 +1,9 @@
1
+ <div class="row">
2
+ <div class="col-xs-12">
3
+ <header class="page-header">
4
+ <h1>New <%= @resource_class.model_name.singular %></h1>
5
+ </header>
6
+ </div>
7
+ </div>
8
+
9
+ <%= render "admin/resources/form", resource_class: @resource_class, resource: @resource %>
@@ -0,0 +1,25 @@
1
+ <div class="row">
2
+ <div class="col-xs-12">
3
+ <header class="page-header">
4
+ <div class="pull-right">
5
+ <%= link_to "Edit", [ :edit, :admin, @resource ], class: "btn btn-lg btn-default" %>
6
+ <%= link_to "Destroy", [ :admin, @resource ], class: "btn btn-lg btn-danger", method: :delete %>
7
+ </div>
8
+
9
+ <h1><%= @resource.to_s %></h1>
10
+ </header>
11
+ </div>
12
+ </div>
13
+
14
+ <div class="row">
15
+ <div class="col-xs-12">
16
+ <div class="well">
17
+ <dl class="dl-horizontal">
18
+ <% @resource.attributes.each do |key, value| %>
19
+ <dt><%= @resource_class.human_attribute_name key %></dt>
20
+ <dd><%= value %></dd>
21
+ <% end %>
22
+ </dl>
23
+ </div>
24
+ </div>
25
+ </div>
@@ -3,6 +3,7 @@
3
3
  <head>
4
4
  <title>HyperAdmin</title>
5
5
 
6
+ <%= stylesheet_link_tag "//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" %>
6
7
  <%= stylesheet_link_tag "hyper_admin/application", media: :all %>
7
8
  <%= javascript_include_tag "hyper_admin/application" %>
8
9
 
@@ -10,7 +11,25 @@
10
11
  </head>
11
12
  <body>
12
13
 
13
- <%= yield %>
14
+ <nav class="navbar navbar-default">
15
+ <div class="container-fluid">
16
+ <div class="navbar-header">
17
+ <a class="navbar-brand" href="/admin">Admin</a>
18
+
19
+ <ul class="nav navbar-nav">
20
+ <% @resource_classes.each do |resource_class| %>
21
+ <li class="<%= "active" if params[:controller] == "admin/#{resource_class.model_name.plural}" %>">
22
+ <%= link_to resource_class.model_name.human(count: 2), [ :admin, resource_class ] %>
23
+ </li>
24
+ <% end %>
25
+ </ul>
26
+ </div>
27
+ </div>
28
+ </nav>
29
+
30
+ <div class="container-fluid">
31
+ <%= yield %>
32
+ </div>
14
33
 
15
34
  </body>
16
35
  </html>
data/lib/hyper_admin.rb CHANGED
@@ -1,4 +1,22 @@
1
+ require 'jquery-rails'
2
+
1
3
  require 'hyper_admin/engine'
4
+ require 'hyper_admin/application'
2
5
 
3
6
  module HyperAdmin
7
+ class << self
8
+
9
+ delegate :register, to: :application
10
+ delegate :routes, to: :application
11
+ delegate :setup, to: :application
12
+
13
+ def application
14
+ @application ||= HyperAdmin::Application.new
15
+ end
16
+
17
+ def config
18
+ application.setup
19
+ end
20
+
21
+ end
4
22
  end
@@ -0,0 +1,62 @@
1
+ require 'hyper_admin/resource_collection'
2
+ require 'hyper_admin/router'
3
+
4
+ module Admin; end
5
+
6
+ module HyperAdmin
7
+ class Application
8
+ attr_reader :resources
9
+
10
+ def setup
11
+ @resources = ResourceCollection.new
12
+
13
+ prevent_rails_autoloading_load_paths
14
+ end
15
+
16
+ def register(resource_class)
17
+ resource = @resources.add resource_class
18
+ create_resource_controller resource
19
+ end
20
+
21
+ def routes(rails_router)
22
+ load_files
23
+
24
+ router.apply rails_router
25
+ end
26
+
27
+ private
28
+
29
+ def load_paths
30
+ [File.expand_path('app/admin', Rails.root)]
31
+ end
32
+
33
+ def router
34
+ @router ||= Router.new(self)
35
+ end
36
+
37
+ def admin_files
38
+ load_paths.map do |path|
39
+ Dir["#{path}/**/*.rb"]
40
+ end.flatten
41
+ end
42
+
43
+ def load_files
44
+ admin_files.each { |file| load file }
45
+ end
46
+
47
+ def prevent_rails_autoloading_load_paths
48
+ ActiveSupport::Dependencies.autoload_paths -= load_paths
49
+ Rails.application.config.eager_load_paths -= load_paths
50
+ end
51
+
52
+ def create_resource_controller(resource)
53
+ ctrl = Class.new HyperAdmin::ResourceController do
54
+ define_method :resource_class do
55
+ resource.resource_class
56
+ end
57
+ end
58
+
59
+ Admin.const_set resource.controller_name, ctrl
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,17 @@
1
+ module HyperAdmin
2
+ class Resource
3
+ attr_reader :resource_class
4
+
5
+ def initialize(resource_class)
6
+ @resource_class = resource_class
7
+ end
8
+
9
+ def resource_name
10
+ @resource_class.model_name
11
+ end
12
+
13
+ def controller_name
14
+ "#{resource_name.plural.camelize}Controller"
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ require 'hyper_admin/resource'
2
+
3
+ module HyperAdmin
4
+ class ResourceCollection
5
+ attr_reader :resources
6
+
7
+ def initialize
8
+ @resources = {}
9
+ end
10
+
11
+ def add(resource_class)
12
+ resource = Resource.new(resource_class)
13
+ @resources[resource_class.model_name] = resource
14
+
15
+ resource
16
+ end
17
+
18
+ def each(&block)
19
+ @resources.values.each(&block)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ module HyperAdmin
2
+ class Router
3
+ def initialize(application)
4
+ @application = application
5
+ end
6
+
7
+ def apply(rails_router)
8
+ define_resource_routes rails_router
9
+ end
10
+
11
+ private
12
+
13
+ def define_resource_routes(router)
14
+ router.instance_exec @application.resources do |_resources|
15
+ self.namespace 'admin' do
16
+ _resources.each do |resource|
17
+ self.resources resource.resource_name.route_key
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,3 +1,3 @@
1
1
  module HyperAdmin
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -0,0 +1 @@
1
+ HyperAdmin.register Article
@@ -0,0 +1 @@
1
+ HyperAdmin.register Person
@@ -0,0 +1,9 @@
1
+ class Article < ActiveRecord::Base
2
+
3
+ validates :title, presence: true
4
+
5
+ def to_s
6
+ title
7
+ end
8
+
9
+ end
@@ -0,0 +1,2 @@
1
+ class Person < ActiveRecord::Base
2
+ end
@@ -0,0 +1 @@
1
+ HyperAdmin.config # TODO :: more to come
@@ -21,3 +21,29 @@
21
21
 
22
22
  en:
23
23
  hello: "Hello world"
24
+
25
+ activerecord:
26
+ models:
27
+ article:
28
+ one: Blog post
29
+ other: Blog posts
30
+
31
+ person:
32
+ one: Person
33
+ other: People
34
+
35
+ attributes:
36
+ common: &common
37
+ id: ID
38
+ created_at: Creation date
39
+ updated_at: Last updated
40
+
41
+ article:
42
+ <<: *common
43
+ title: Title
44
+ body: Body text
45
+
46
+ person:
47
+ <<: *common
48
+ first_name: First name
49
+ last_name: Last name
@@ -1,3 +1,3 @@
1
1
  Rails.application.routes.draw do
2
- mount HyperAdmin::Engine, at: '/admin'
2
+ HyperAdmin.routes self
3
3
  end
@@ -0,0 +1,10 @@
1
+ class CreateArticles < ActiveRecord::Migration
2
+ def change
3
+ create_table :articles do |t|
4
+ t.string :title
5
+ t.text :body
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ class CreatePeople < ActiveRecord::Migration
2
+ def change
3
+ create_table :people do |t|
4
+ t.string :first_name
5
+ t.string :last_name
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -11,6 +11,20 @@
11
11
  #
12
12
  # It's strongly recommended that you check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(version: 0) do
14
+ ActiveRecord::Schema.define(version: 20140826220715) do
15
+
16
+ create_table "articles", force: true do |t|
17
+ t.string "title"
18
+ t.text "body"
19
+ t.datetime "created_at"
20
+ t.datetime "updated_at"
21
+ end
22
+
23
+ create_table "people", force: true do |t|
24
+ t.string "first_name"
25
+ t.string "last_name"
26
+ t.datetime "created_at"
27
+ t.datetime "updated_at"
28
+ end
15
29
 
16
30
  end
@@ -0,0 +1,8 @@
1
+ FactoryGirl.define do
2
+
3
+ factory :article do
4
+ title 'Lorem ipsum'
5
+ body 'Lorem ipsum dolor sit amet. Consectetur adipiscing elit.'
6
+ end
7
+
8
+ end
@@ -0,0 +1,8 @@
1
+ FactoryGirl.define do
2
+
3
+ factory :person do
4
+ first_name "Ronnie"
5
+ last_name "Coleman"
6
+ end
7
+
8
+ end
@@ -0,0 +1,4 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Article, type: :model do
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Person, type: :model do
4
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyper_admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sindre Moen
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: jquery-rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.1'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: coveralls
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -135,19 +149,33 @@ files:
135
149
  - app/assets/javascripts/hyper_admin/application.js
136
150
  - app/assets/stylesheets/hyper_admin/application.css
137
151
  - app/controllers/hyper_admin/application_controller.rb
152
+ - app/controllers/hyper_admin/resource_controller.rb
138
153
  - app/helpers/hyper_admin/application_helper.rb
154
+ - app/views/admin/resources/_form.html.erb
155
+ - app/views/admin/resources/edit.html.erb
156
+ - app/views/admin/resources/index.html.erb
157
+ - app/views/admin/resources/new.html.erb
158
+ - app/views/admin/resources/show.html.erb
139
159
  - app/views/layouts/hyper_admin/application.html.erb
140
160
  - config/routes.rb
141
161
  - config/spring.rb
142
162
  - lib/hyper_admin.rb
163
+ - lib/hyper_admin/application.rb
143
164
  - lib/hyper_admin/engine.rb
165
+ - lib/hyper_admin/resource.rb
166
+ - lib/hyper_admin/resource_collection.rb
167
+ - lib/hyper_admin/router.rb
144
168
  - lib/hyper_admin/version.rb
145
169
  - spec/controllers/hyper_admin/application_controller_spec.rb
146
170
  - spec/dummy/Rakefile
171
+ - spec/dummy/app/admin/article.rb
172
+ - spec/dummy/app/admin/person.rb
147
173
  - spec/dummy/app/assets/javascripts/application.js
148
174
  - spec/dummy/app/assets/stylesheets/application.css
149
175
  - spec/dummy/app/controllers/application_controller.rb
150
176
  - spec/dummy/app/helpers/application_helper.rb
177
+ - spec/dummy/app/models/article.rb
178
+ - spec/dummy/app/models/person.rb
151
179
  - spec/dummy/app/views/layouts/application.html.erb
152
180
  - spec/dummy/bin/bundle
153
181
  - spec/dummy/bin/rails
@@ -164,6 +192,7 @@ files:
164
192
  - spec/dummy/config/initializers/backtrace_silencers.rb
165
193
  - spec/dummy/config/initializers/cookies_serializer.rb
166
194
  - spec/dummy/config/initializers/filter_parameter_logging.rb
195
+ - spec/dummy/config/initializers/hyper_admin.rb
167
196
  - spec/dummy/config/initializers/inflections.rb
168
197
  - spec/dummy/config/initializers/mime_types.rb
169
198
  - spec/dummy/config/initializers/session_store.rb
@@ -172,6 +201,8 @@ files:
172
201
  - spec/dummy/config/routes.rb
173
202
  - spec/dummy/config/secrets.yml
174
203
  - spec/dummy/db/development.sqlite3
204
+ - spec/dummy/db/migrate/20140825171947_create_articles.rb
205
+ - spec/dummy/db/migrate/20140826220715_create_people.rb
175
206
  - spec/dummy/db/schema.rb
176
207
  - spec/dummy/db/test.sqlite3
177
208
  - spec/dummy/log/development.log
@@ -180,6 +211,10 @@ files:
180
211
  - spec/dummy/public/422.html
181
212
  - spec/dummy/public/500.html
182
213
  - spec/dummy/public/favicon.ico
214
+ - spec/dummy/spec/factories/articles.rb
215
+ - spec/dummy/spec/factories/people.rb
216
+ - spec/dummy/spec/models/article_spec.rb
217
+ - spec/dummy/spec/models/person_spec.rb
183
218
  - spec/dummy/tmp/cache/assets/development/sass/9e456cee4bd5ae2c5d0cc761be2251d8df6c08d6/application.css.sassc
184
219
  - spec/dummy/tmp/cache/assets/development/sass/9e456cee4bd5ae2c5d0cc761be2251d8df6c08d6/forms.css.sassc
185
220
  - spec/dummy/tmp/cache/assets/development/sprockets/01924c706dd1b7de217f342099dcfa3f
@@ -317,6 +352,8 @@ summary: An awesome admin solution for Rails
317
352
  test_files:
318
353
  - spec/dummy/db/schema.rb
319
354
  - spec/dummy/db/development.sqlite3
355
+ - spec/dummy/db/migrate/20140825171947_create_articles.rb
356
+ - spec/dummy/db/migrate/20140826220715_create_people.rb
320
357
  - spec/dummy/db/test.sqlite3
321
358
  - spec/dummy/bin/rake
322
359
  - spec/dummy/bin/bundle
@@ -432,17 +469,26 @@ test_files:
432
469
  - spec/dummy/Rakefile
433
470
  - spec/dummy/log/development.log
434
471
  - spec/dummy/log/test.log
472
+ - spec/dummy/app/admin/person.rb
473
+ - spec/dummy/app/admin/article.rb
435
474
  - spec/dummy/app/assets/stylesheets/application.css
436
475
  - spec/dummy/app/assets/javascripts/application.js
437
476
  - spec/dummy/app/controllers/application_controller.rb
438
477
  - spec/dummy/app/views/layouts/application.html.erb
439
478
  - spec/dummy/app/helpers/application_helper.rb
479
+ - spec/dummy/app/models/person.rb
480
+ - spec/dummy/app/models/article.rb
481
+ - spec/dummy/spec/factories/articles.rb
482
+ - spec/dummy/spec/factories/people.rb
483
+ - spec/dummy/spec/models/article_spec.rb
484
+ - spec/dummy/spec/models/person_spec.rb
440
485
  - spec/dummy/public/favicon.ico
441
486
  - spec/dummy/public/422.html
442
487
  - spec/dummy/public/404.html
443
488
  - spec/dummy/public/500.html
444
489
  - spec/dummy/config/initializers/mime_types.rb
445
490
  - spec/dummy/config/initializers/assets.rb
491
+ - spec/dummy/config/initializers/hyper_admin.rb
446
492
  - spec/dummy/config/initializers/wrap_parameters.rb
447
493
  - spec/dummy/config/initializers/cookies_serializer.rb
448
494
  - spec/dummy/config/initializers/session_store.rb